Странное поведение с оптимизатором Адама, когда тренируешься слишком долго

11

Я пытаюсь обучить один персептрон (1000 входных единиц, 1 выходной, без скрытых слоев) на 64 случайно сгенерированных точках данных. Я использую Pytorch с помощью оптимизатора Adam:

import torch
from torch.autograd import Variable

torch.manual_seed(545345)
N, D_in, D_out = 64, 1000, 1

x = Variable(torch.randn(N, D_in))
y = Variable(torch.randn(N, D_out))

model = torch.nn.Linear(D_in, D_out)
loss_fn = torch.nn.MSELoss(size_average=False)

optimizer = torch.optim.Adam(model.parameters())
for t in xrange(5000):
  y_pred = model(x)
  loss = loss_fn(y_pred, y)

  print(t, loss.data[0])

  optimizer.zero_grad()
  loss.backward()
  optimizer.step()

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

(0, 91.74887084960938)
(1, 76.85824584960938)
(2, 63.434078216552734)
(3, 51.46927261352539)
(4, 40.942893981933594)
(5, 31.819372177124023)

Около 300 итераций ошибка достигает нуля:

(300, 2.1734419819452455e-12)
(301, 1.90354676465887e-12)
(302, 2.3347573874232808e-12)

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

(4997, 0.002102422062307596)
(4998, 0.0020302983466535807)
(4999, 0.0017039275262504816)

Почему это происходит?

Бай Ли
источник
Я не думаю, что переоснащение объясняет это - потеря обучения увеличивается, а не потеря проверки. Например, это не происходит при использовании SGD, только с Адамом.
Бай Ли
Модель имеет 1000 параметров и имеется только 1 точка данных, поэтому модель должна точно соответствовать данным, и потери должны быть равны нулю.
Бай Ли
Ой извини, ты прав. Есть 64 точки данных.
Бай Ли
Существует 64 точки данных (т. Е. Ограничения) и 1000 параметров, поэтому можно найти варианты для параметров, чтобы ошибка была равна нулю (и это легко сделать аналитически). Мой вопрос: почему Адам не находит это?
Бай Ли

Ответы:

19

Эта небольшая нестабильность в конце конвергенции является особенностью Адама (и RMSProp) из-за того, как она оценивает средние величины градиента за последние шаги и делит их.

10-1010-5

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

На практике по проблемам глубокого обучения вы не подходите так близко к конвергенции (а для некоторых методов регуляризации, таких как ранняя остановка, вы все равно не хотите), поэтому обычно это не имеет практического значения для типов проблем, которые Адам был разработан для.

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

введите описание изображения здесь

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

optimizer = torch.optim.Adam(model.parameters(), lr=1e-5)

lr=1e-510-7

Нил Слэйтер
источник
Это захватывающая визуализация, Нил. Каковы фактические размеры? Что представляют собой x и y? Являются ли кадры дельта т или n эпох на кадр? Я предполагаю, что звезда является глобальным оптимумом в топографическом представлении несоответствия (ошибки) по отношению к двум выбранным параметрам. Правильно ли мое предположение?
Дуглас Дасеко
Это не моя визуализация, вы найдете это во многих местах. Размеры - это произвольные единицы входных параметров для тестовой функции, и на графике показаны контурные линии для этой функции (опять же в произвольных единицах, предположительно масштабированных так, чтобы NN работал нормально). Каждый кадр является шагом обновления веса. Это, вероятно, эквивалентно мини-пакетному обновлению, и из-за поведения SGD, я ожидаю, что оно на самом деле решается точно с использованием истинного градиента тестовой функции - т.е. нет набора данных или выборки.
Нил Слэйтер,
1

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

Я могу придумать пару подходов:

  1. Вы можете обрезать градиенты с верхней / нижней границей, но это не гарантирует сходимости и может привести к остановке тренировки, если вы пойманы в ловушку в некоторых локальных минимумах и никогда не выберетесь из них.

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

Я уверен, что есть другие методы (например, циклическая скорость обучения и т. Д.), Которые пытаются найти оптимальную скорость обучения на основе статистики.

Санджай Кришна
источник