Объяснение Пиков в потере обучения против итераций с Adam Optimizer

16

Я тренирую нейронную сеть, используя i) SGD и ii) Adam Optimizer. При использовании обычного SGD я получаю плавную кривую потери обучения и итерации, как показано ниже (красная). Тем не менее, когда я использовал Adam Optimizer, кривая тренировочных потерь имела некоторые всплески. Чем объясняются эти спайки?

Детали модели:

14 узлов ввода -> 2 скрытых слоя (100 -> 40 единиц) -> 4 единицы вывода

Я использую параметры по умолчанию для Адама beta_1 = 0.9, beta_2 = 0.999, epsilon = 1e-8и batch_size = 32.

я) с SGD II) с АдамомС SGD С Адамом

Абдул Фатир
источник
Для дальнейшего уведомления, снижение вашей начальной скорости обучения может помочь устранить всплески в Адаме
полужирный

Ответы:

12

Шипы являются неизбежным следствием мини-градиентного спуска в Адаме ( batch_size=32). Некоторые мини-пакеты «случайно» содержат неудачные данные для оптимизации, которые вызывают те всплески, которые вы видите в своей функции затрат с помощью Адама. Если вы попробуете стохастический градиентный спуск (так же, как и при использовании batch_size=1), вы увидите, что в функции стоимости еще больше всплесков. То же самое не происходит в (полной) пакетной GD, потому что она использует все данные обучения (т. Е. Размер партии равен количеству элементов вашего обучающего набора) каждую эпоху оптимизации. Поскольку на вашем первом графике стоимость монотонно плавно снижается, кажется, что название ( i) с SGD ) неверно, и вы используете (полный) пакетный градиентный спуск вместо SGD.

На своем отличном курсе глубокого обучения в Coursera Эндрю Нг подробно объясняет это, используя изображение ниже:

Функции стоимости

Xboard
источник
2
«SGD ... использует все данные обучения» - вы уверены в этом? Это означает, что весовые коэффициенты обновляются после того, как все данные переданы вперед, но это называется gd полной группы, а не sgd. Стохастик подразумевает миниатюру
Алекс
Спасибо @Alex за указание на мою ошибку, я уже исправил ее и улучшил ответ со ссылкой для получения дополнительной информации.
Xboard
@xboard - Нет, я использую мини-спуск по градиенту для первого.
Абдул Фатир,
7

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

  • Потеря иждивенца. Потери логарифмического правдоподобия должны быть отсечены, в противном случае он может оценить почти log(0)плохие прогнозы / выбросы в наборе данных, что приведет к взрывным градиентам. Большинство пакетов (torch, tenorflow и т. Д.) По умолчанию реализуют отсечение для своих потерь.
  • Выбросы в наборе данных.
  • εYзнак равно(Икс-U)/(s+ε)sεY
  • Конечная партия в эпоху может быть небольшой, если набор данных неделим по размеру партии. В загрузчике факелов есть флаг drop_last. Малый размер партии = высокая дисперсия

Теперь, почему вы видите это с Адамом, а не с SGD? Очевидно, вы достигли меньших потерь с Адамом. Как отмечалось ранее, если 99,9% набора данных имеют оптимумы в одной точке, за исключением некоторого наблюдения, это может быть то наблюдение, которое кричит «НЕТ» и выпрыгивает из локальных минимумов при случайном выборе партии. Если вы видите это каждые dataset_size//batch_size+1шаги, это, вероятно, из-за того, что конечный размер пакета мал. Могу поспорить, что вы также увидите всплеск SGD, если дадите ему понизиться.

Бонус: Ваше действительно быстрое уменьшение с помощью оптимизатора импульса (Адам) может означать, что некоторый слой (входной слой? Выходной слой?) Инициализируется вне масштаба (до больших / малых весов).

ragulpr
источник