В этой статье мы узнаем, как заставить нашу нейронную сеть работать лучше. При обучении нейронной сети нам приходится принимать много разных решений. Некоторые из них:

  • Сколько слоев будет у нашей нейронной сети?
  • Каковы будут наши показатели обучения?
  • Сколько скрытых единиц будет содержать каждый слой
  • Какими будут наши функции активации?
  • Каким будет номер нашей эпохи?

При обучении нейронной сети практически невозможно правильно угадать эти вопросы с первой попытки. На практике обучение нейронной сети — это процесс, в котором мы сначала начинаем с идеи, на втором этапе мы кодируем эту нейронную сеть, а на последнем этапе мы видим, какой результат мы получаем в результате этих выборов. Увидев результаты, мы хотим вернуться к первому этапу и изменить значения, чтобы получить лучшие результаты. Наша цель состоит в том, чтобы итерировать таким образом, чтобы достичь наилучшего возможного результата.

Вы выделяете большую часть данных, которые у вас есть, в качестве обучающего набора. Мы должны выделить часть ваших оставшихся данных в качестве набора для разработки и тестирования.

  • Учебный набор: это часть, которую мы используем для обучения нашего алгоритма.
  • Набор для разработки: мы используем его, чтобы увидеть, какая из обученных моделей более успешна.
  • Набор тестов: мы можем оценить, насколько хорошо работает самая успешная из имеющихся у нас моделей.

Раньше в этих областях использовались данные в виде набора для обучения и тестирования 70%/30% или набора для обучения, разработки и тестирования 60%/20%/20%. Если бы у нас было 100, 1000 или 10000 образцов, такие соотношения были бы вполне разумными. В последнее время количество данных, которые у нас есть, намного выше, чем раньше, и мы получаем все больше и больше данных каждый день. В современную эпоху больших данных имеет смысл иметь гораздо меньше возможностей для разработки и агрегации наборов тестов. Потому что цель набора для разработки — попробовать разные алгоритмы и посмотреть, какой из них хорош. Так что нам не нужен огромный набор для разработки. Например, если у нас есть 1 000 000 данных, 10 000 наборов для разработки данных будет вполне достаточно. 10 000 данных будет достаточно, чтобы оценить, насколько хороша выбранная нами модель. В результате, если у нас есть 1 000 000 данных, мы выделим 98% для обучающего набора, 1% для набора для разработки и 1% для тестового набора. Мы также можем разделить наши данные на 99%/0,5%/0,5%.

Одна из ошибок, которую мы можем совершить при разделении наших данных на кластеры, заключается в том, что распределения обучающего и тестового наборов не совпадают. Например, вы разрабатываете приложение, в которое пользователи загружают множество изображений. Цель этого приложения — показать пользователям изображения собак. Ваш тренировочный набор — это изображения собак, загруженные из Интернета, а ваш набор для разработки и тестирования — это изображения, загруженные пользователями. Изображения, которые вы загружаете из Интернета, будут состоять из более четких изображений, а изображения, загруженные пользователями, будут более размытыми. При этом распределения данных могут быть разными. Чтобы избежать ошибок, мы должны убедиться, что наборы для разработки и тестирования происходят из одного и того же дистрибутива. Потому что мы хотим увидеть производительность разных моделей из набора для разработки, в то время как мы хотим увидеть производительность модели, которую мы выбрали в тестовом наборе, поэтому, если они взяты из разных дистрибутивов, модель, которая хорошо работает в наборе для разработки может дать нам совсем другой результат на этапе тестирования. Поэтому для нас будет выгоднее, если оба будут из одного дистрибутива.

СМЕЩЕНИЕ И ДИСПЕРСИЯ

Предвзятость и дисперсия — это понятия, которые нам нужно хорошо понимать. Если мы говорим о высоком смещении, это означает, что наша модель недостаточно приспособлена. Наоборот, если мы говорим о высокой дисперсии, то это означает переподгонку.

Допустим, мы создаем классификатор собак. Давайте поговорим о человеческих ошибках, не скупясь на ситуации. Когда люди видят перед собой картинку, они, скорее всего, правильно угадают, собака это или нет. Вот почему мы считаем, что человеческая ошибка составляет около 0 процентов.

  • В первом случае, хотя мы получаем очень хорошие результаты на тренировочном наборе, мы получаем относительно худшие результаты на наборе для разработки. Это указывает на переобучение в тренировочном наборе. Мы называем это высокой дисперсией.
  • Во втором случае обучающая выборка недостаточна для соответствия данным. Мы называем эту ситуацию недообучением. Производительность набора для разработки всего на 1 процент ниже, чем у обучающего набора. Таким образом, набор для разработки показал хорошую производительность.
  • В третьем случае и тренировочный набор имеет высокую ошибку, и набор для разработки имеет высокую ошибку. Это выглядит как комбинация двух предыдущих ситуаций.
  • В четвертом случае наблюдаются очень низкие ошибки как в обучающей, так и в развивающей выборке. Это сделает нас счастливыми.

Как мы справляемся с предвзятостью и дисперсией?

Если у нас высокое смещение:

  • Большая сеть, т.е. больше скрытых слоев или больше скрытых блоков.
  • Тренируйтесь дольше.
  • Попробуйте более продвинутые алгоритмы оптимизации/лучшую архитектуру NN.

Если у нас высокая дисперсия:

  • Добавьте больше данных.
  • Регуляризация.
  • Найдите лучшую архитектуру NN.

В современную эпоху глубокого обучения/больших данных мы можем продолжать обучать более крупную сеть, чтобы уменьшить смещение, не влияя на дисперсию, и мы можем продолжать добавлять больше данных, чтобы уменьшить дисперсию, не влияя на смещение. И если у нас есть и то, и другое, мы можем уменьшить как предвзятость, так и дисперсию.

РЕГУЛИРОВАНИЕ

Если наша нейронная сеть перенастроена, первое, что мы должны попробовать, — это регуляризация.

Регуляризация L2

Лассо-регрессия добавляет «Абсолютное значение величины» коэффициента в качестве штрафного члена к функции потерь. Лассо уменьшает коэффициент менее важного признака до нуля; таким образом, полностью удаляя некоторые функции. Таким образом, это хорошо работает для выбора функций, если у нас их огромное количество.

Регуляризация L1

Регуляризация добавляет штраф по мере увеличения сложности модели. Параметр регуляризации (лямбда) ограничивает все параметры, кроме перехвата, чтобы модель обобщала данные и не подгоняла их. Регрессия хребта добавляет «квадрат величины коэффициента» в качестве штрафного члена к функции потерь. Здесь часть прямоугольника на изображении выше представляет элемент/термин регуляризации L2.

Почему регуляризация предотвращает переоснащение?

Если мы выберем лямбду очень большой, матрица W, естественно, будет близка к 0. Поскольку это уменьшит влияние многих скрытых единиц, мы можем думать, что у нас будет гораздо меньшая нейронная сеть. Это приведет нас от переобучения к недообучению. Если мы выберем лучшее значение лямбда, это приведет нас к лучшему, вместо того, чтобы переходить от переоснащения к недообучению. Таким образом, мы можем предотвратить переоснащение.

Регуляризация отсева

Это процесс случайного игнорирования некоторых узлов во время обучения. Перед выполнением этой операции мы должны определить вероятность. Например, если мы выберем эту вероятность 0,5, вероятность устранения узла будет равна половине. После того, как устраненные узлы идентифицированы, нам нужно уничтожить входные и выходные соединения этих узлов. Так почему же это выпадение имеет регулирующий эффект? Сначала мы работаем с меньшей нейронной сетью. Во-вторых, нам не имеет смысла полагаться на узел, так как влияние любого узла может исчезнуть. Поэтому вместо того, чтобы придавать весь вес одному узлу, мы должны распределить вес на все узлы. Это предотвратит переоснащение для нас.

Увеличение данных

Как мы упоминали ранее, один из способов предотвратить переобучение — собрать больше данных. Иногда у нас может не хватить бюджета для сбора дополнительных данных. Если мы столкнулись с такой ситуацией, этот метод нам поможет. Мы можем увеличить наш набор данных, применив операции, описанные выше, к нашему исходному изображению. Например, у нас есть изображение тигра, если мы применим вышеперечисленные операции, наша модель продолжит правильно обучаться, так как у нас по-прежнему будет изображение тигра.

Ранняя остановка

Метод редактирования, который включает завершение обучения модели до того, как потери при обучении уменьшатся. При ранней остановке вы прекращаете обучение модели, когда потери в наборе данных проверки начинают увеличиваться, т. Е. Производительность обобщения ухудшается.

ЗАДАЧА ОПТИМИЗАЦИИ

Нормализация входных данных

Одним из методов ускорения процесса обучения нейронной сети является нормализация входных данных. Нормализация ввода нормализует ввод сети таким образом, чтобы каждое измерение/канал ввода имело среднее значение 0 и дисперсию 1. Эта операция помещает записи в одинаковую шкалу.

Исчезающие градиенты

Исчезающий градиент возникает, когда производная или наклон становятся все меньше и меньше по мере того, как мы возвращаемся назад с каждым слоем во время обратного распространения.

Когда обновление весов очень мало или экспоненциально мало, время обучения занимает слишком много времени, и в худшем случае это может полностью остановить обучение нейронной сети.

Проблема исчезающего градиента возникает с сигмовидной и тангенсной функциями активации, поскольку производные сигмовидной и тангенсной функций активации находятся в диапазоне от 0 до 0,25 и 0–1. Поэтому обновленные значения веса малы, а новые значения веса очень похожи на старые значения веса. Это приводит к проблеме исчезающего градиента. Мы можем избежать этой проблемы, используя функцию активации ReLU, потому что градиент равен 0 для отрицательных значений и нулевого ввода и 1 для положительного ввода.

Взрывающиеся градиенты

Взрыв градиента происходит, когда производные или наклон становятся все больше и больше по мере того, как мы возвращаемся назад с каждым слоем во время обратного распространения. Эта ситуация прямо противоположна исчезающим градиентам.

Эта проблема возникает из-за весов, а не из-за функции активации. Из-за высоких значений веса производные также будут выше, так что новый вес сильно отличается от старого веса, и градиент никогда не сойдется. Таким образом, это может привести к колебаниям вокруг минимумов и никогда не достичь точки глобального минимума.

Зачем нам нужна проверка градиента?

Бэк-проп как алгоритм имеет много деталей и может быть немного сложным в реализации. И одно досадное свойство заключается в том, что есть много способов иметь тонкие ошибки в задней опоре. Так что, если вы запустите его с градиентным спуском или каким-либо другим алгоритмом оптимизации, он действительно может выглядеть так, как будто он работает. И ваша функция стоимости, J тета, может в конечном итоге уменьшаться на каждой итерации градиентного спуска. Но это может оказаться правдой, даже если в вашей реализации back prop может быть какая-то ошибка. Так что кажется, что J тета уменьшается, но вы можете просто получить нейронную сеть с более высоким уровнем ошибок, чем в реализации без ошибок. И вы могли просто не знать, что была эта тонкая ошибка, которая ухудшала вашу производительность. Итак, что мы можем с этим сделать? Есть идея, называемая проверкой градиента, которая устраняет почти все эти проблемы.

Что такое проверка градиента?

Мы описываем метод численной проверки производных, вычисляемых вашим кодом, чтобы убедиться, что ваша реализация верна. Проведение процедуры проверки производных существенно повышает вашу уверенность в правильности вашего кода.