Я пытаюсь обучить один персептрон (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)
Почему это происходит?
perceptron
pytorch
Бай Ли
источник
источник
Ответы:
Эта небольшая нестабильность в конце конвергенции является особенностью Адама (и RMSProp) из-за того, как она оценивает средние величины градиента за последние шаги и делит их.
Это фактически делает Адама менее стабильным и хуже для вашей проблемы, чем более простой градиентный спуск, при условии, что вы хотите получить численно близкий к нулю убыток, насколько позволяют вычисления для вашей проблемы.
На практике по проблемам глубокого обучения вы не подходите так близко к конвергенции (а для некоторых методов регуляризации, таких как ранняя остановка, вы все равно не хотите), поэтому обычно это не имеет практического значения для типов проблем, которые Адам был разработан для.
На самом деле вы можете увидеть, что это происходит для RMSProp при сравнении различных оптимизаторов (RMSProp - черная линия - наблюдайте за последними шагами, как только он достигнет цели):
Вы можете сделать Адама более стабильным и приблизиться к истинной конвергенции, уменьшив скорость обучения. Например
lr=1e-5
источник
Причина именно такая, как упомянуто в другом ответе с отличным предложением использовать меньшую скорость обучения, чтобы избежать этой проблемы при небольших градиентах.
Я могу придумать пару подходов:
Вы можете обрезать градиенты с верхней / нижней границей, но это не гарантирует сходимости и может привести к остановке тренировки, если вы пойманы в ловушку в некоторых локальных минимумах и никогда не выберетесь из них.
Тренируйтесь с большим количеством партий, большим количеством эпох и с пониженной скоростью обучения. Сейчас у меня нет никаких практических доказательств того, что увеличение размера партии приводит к лучшим градиентам, но из того, что я наблюдал, сталкиваясь с проблемами, похожими на ваши, это почти всегда помогало.
Я уверен, что есть другие методы (например, циклическая скорость обучения и т. Д.), Которые пытаются найти оптимальную скорость обучения на основе статистики.
источник