Скорость обучения Keras снижается в pytorch - PullRequest
0 голосов
/ 13 апреля 2019

У меня вопрос по поводу снижения скорости обучения в Керасе. Мне нужно понять, как работает параметр decay внутри оптимизаторов, чтобы перевести его в эквивалентную формулировку PyTorch.

Из исходного кода SGD я вижу, что обновление выполняется таким образом после каждого пакетного обновления:

lr = self.lr * (1. / (1. + self.decay * self.iterations))

Означает ли это, что после каждого пакетного обновления lr обновляется, начиная с его значения из предыдущего обновления или с его начального значения? Я имею в виду, какая из двух следующих интерпретаций является правильной?

lr = lr_0 * (1. / (1. + self.decay * self.iterations))

или

lr = lr * (1. / (1. + self.decay * self.iterations))

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

Если правильный ответ будет первым, это будет означать, что в моем случае скорость обучения снизится с 0,001 до 0,0002 после 100 эпох, тогда как во втором случае она снизится с 0,001 в районе 1e-230 после 70 эпох.

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

Заранее спасибо за помощь!

1 Ответ

1 голос
/ 13 апреля 2019

На основе реализации в Керас Я думаю, что ваша первая формулировка правильная, та, которая содержит начальную скорость обучения (обратите внимание, что self.lr не обновляется).

Однако я думаю, что ваш расчет, вероятно, не верен: поскольку знаменатель один и тот же, а lr_0> = lr, так как вы делаете затухание, первая формулировка должна привести к большему числу.

Я не уверен, что этот распад доступен в PyTorch, но вы можете легко создать нечто подобное с torch.optim.lr_scheduler.LambdaLR.

decay = .001
fcn = lambda step: 1./(1. + decay*step)
scheduler = LambdaLR(optimizer, lr_lambda=fcn)

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

...