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

Смещение и отклонение

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

Как справиться с высоким предвзятым отношением?

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

Как справиться с высокой дисперсией (или переобучением)?

  1. Добавить больше данных
  2. Регуляризация
  3. Поиск лучшей архитектуры NN

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

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

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

  1. L2 / L1 Регуляризация
  2. Регуляризация отсева
  3. Другой

Регуляризация второго уровня для логистической регрессии

Чтобы добавить регуляризацию к логистической регрессии, мы используем лямбда, которая является параметром регуляризации. Итак, мы добавляем лямбда / 2m, умноженную на норму квадрата w (также известная как L2-регуляризация).

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

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

В нейронной сети функция стоимости является функцией всех параметров, от w [1], b [1] до w [L], b [L], где заглавная L - количество слоев в нейронной сети. Таким образом, функция стоимости представляет собой сумму потерь, суммированную по m обучающим примерам.

Для регуляризации мы добавляем лямбду к сумме более 2 м по всем параметрам W, квадрату нормы. Где норма матрицы определяется как сумма от i = 1 до n [l-1]. Суммируйте от j = 1 до n [l], потому что w - это матрица размерности n [l-1] на n [l].

Итак, как с этим реализовать градиентный спуск? Раньше мы завершали dw, используя backprop, где backprop давал бы нам частную производную J по w. Затем мы обновляем w [l], как w [l] - скорость обучения, умноженную на d w [l]. Теперь, когда мы добавили к цели член регуляризации, мы берем dw и добавляем к нему лямбда / m, умноженное на w.

Почему регуляризация L2 помогает при переобучении?

Вспомните, как выглядит высокая систематическая ошибка и высокая дисперсия.

Что мы сделали для регуляризации, так это добавили дополнительный член к функции стоимости, который наказывает весовые матрицы из-за слишком большого размера. Так почему же сокращение нормы L2 или параметров может привести к меньшему переобучению? Одна часть интуиции заключается в том, что если мы сделаем лямбда-регуляризацию действительно очень большой, тогда, чтобы снизить стоимость, сеть установит весовые матрицы W, которые будут достаточно близкими к нулю для множества скрытых единиц. По сути, это сводит на нет большую часть воздействия скрытых юнитов. И если это так, то значительно упрощенная нейронная сеть становится нейронной сетью гораздо меньшего размера. Фактически, это почти как единица логистической регрессии, но, скорее всего, она сложена так же глубоко. И это уведет нас от случая переобучения гораздо ближе к левому краю к другому случаю с высоким смещением. Но, выбрав промежуточное значение лямбды, мы можем настроить сеть / параметры на правильный случай посередине.

Регуляризация исключения

При отключении мы проходим каждый из слоев сети и устанавливаем некоторую вероятность исключения узла в нейронной сети. Итак, после подбрасывания монеты мы решаем удалить некоторые узлы, а также удалить все исходящие ссылки с этого узла. Таким образом, мы получаем гораздо меньшую сеть. А затем мы проводим обучение обратному распространению. И поэтому для каждого прохода сети (и, возможно, для каждого примера) мы будем тренироваться с другим набором узлов в сети.

Давайте посмотрим, как мы реализуем отсев.

Наиболее распространенный метод отсева называется обратным отсеиванием. Допустим, мы хотим проиллюстрировать это на третьем уровне сети l = 3.

Итак, что мы собираемся сделать, так это установить матрицу d, а d³ будет матрицей исключения для слоя 3, в которой хранится вероятность того, будет ли сохранена скрытая единица в этом слое или нет. Затем мы берем наши активации из третьего слоя и производим поэлементное умножение на d3.

Если мы сделаем это в python, технически d3 будет логическим массивом, в котором значение true и false, а не единица и ноль. Но операция умножения работает и интерпретирует истинное и ложное значения как единицу и ноль.

Затем, наконец, мы возьмем a3 и увеличим его, разделив на наш параметр keep.prob. Это так называемая техника перевернутого отсева. И его эффект заключается в том, что независимо от того, что мы установили для keep.prob, будь то 0,8, 0,9 или даже единицу, путем деления на keep.prob он гарантирует, что ожидаемое значение a3 останется неизменным.

Во время тестирования, когда мы оцениваем нейронную сеть, мы не применяем отсев и масштабирование.

Почему Dropout хорошо сочетается с регуляризатором?

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

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

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

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

Следует помнить, что выпадение - это метод регуляризации, и поэтому, если алгоритм не переоснащен, не беспокойтесь об использовании выпадения.

Другие методы регуляризации

  • Увеличение объема данных

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

  • Раннее прекращение

При ранней остановке мы наносим на график ошибку обучения или классификации или функцию стоимости на обучающем наборе и на наборе разработчика. Мы найдем итерацию там, где dev set работал лучше всего, и возьмем параметры из этой итерации. Это работает, потому что мы изначально начинаем с параметров w, близких к нулю, и по мере увеличения количества итераций значение w обычно увеличивается. При ранней остановке мы получаем меньшее значение w, как при регуляризации L2.

У ранней остановки есть обратная сторона. Машинное обучение состоит из нескольких этапов.

  1. Алгоритм оптимизации функции стоимости j (например, градиентный спуск, адам и т. Д.)
  2. Предотвратить переоснащение (т.е. получить больше данных, регуляризацию).

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

Основным недостатком ранней остановки является то, что она объединяет эти две задачи. потому что, останавливая приличный градиент на ранней стадии, мы как бы нарушаем все, что делаем для оптимизации функции стоимости J, и одновременно пытаемся не переборщить. Вместо того, чтобы использовать раннюю остановку, одна альтернатива - просто использовать регуляризацию L2, тогда мы можем просто обучать нейронную сеть как можно дольше (обратная сторона здесь заключается в том, что мы должны пробовать много значений параметра регуляризации лямбда, и, следовательно, это становится дорогостоящим в вычислительном отношении) . Преимущество ранней остановки заключается в том, что, запустив процесс градиентного спуска только один раз, вы можете опробовать значения малого w, среднего размера w и большого w, без необходимости пробовать множество значений лямбда гиперпараметра регуляризации L2.