Разница между GradientDescentOptimizer и AdamOptimizer (TensorFlow)?

45

Я написал простой MLP в TensorFlow, который моделирует XOR-Gate .

Таким образом, для:

input_data = [[0., 0.], [0., 1.], [1., 0.], [1., 1.]]

он должен произвести следующее:

output_data = [[0.], [1.], [1.], [0.]]

Сеть имеет входной слой, скрытый слой и выходной слой с 2, 5 и 1 нейроном каждый.

В настоящее время у меня есть следующая перекрестная энтропия:

cross_entropy = -(n_output * tf.log(output) + (1 - n_output) * tf.log(1 - output))

Я также попробовал эту более простую альтернативу:

cross_entropy = tf.square(n_output - output)

наряду с некоторыми другими попытками.


Однако, независимо от того, какой была моя установка, ошибка с a GradientDescentOptimizerуменьшалась намного медленнее, чем a AdamOptimizer.

На самом tf.train.AdamOptimizer(0.01)деле результаты были действительно хорошими после 400-800 шагов обучения (в зависимости от скорости обучения, где 0.01были наилучшие результаты), в то время как tf.train.GradientDescentOptimizerвсегда требовалось более 2000 шагов обучения, независимо от того, какой расчет кросс-энтропии или скорости обучения использовался.

Почему это так? Кажется, AdamOptimizerвсегда лучший выбор ?!

daniel451
источник
2
Оптимизатор Адама более сложен, чем градиентный спуск (он основан на этой статье ).
Марк Клазен

Ответы:

77

В tf.train.AdamOptimizerиспользует Kingma и Ба Адам алгоритм , чтобы контролировать скорость обучения. Адам предлагает несколько преимуществ по сравнению с простым tf.train.GradientDescentOptimizer. Прежде всего, он использует скользящие средние параметров (импульс); Bengio обсуждает причины, почему это выгодно в Разделе 3.1.1 этого документа . Проще говоря, это позволяет Адаму использовать больший эффективный размер шага, и алгоритм будет сходиться к этому размеру шага без тонкой настройки.

Основным недостатком алгоритма является то, что Адаму требуется больше вычислений для каждого параметра на каждом этапе обучения (для поддержания скользящих средних и дисперсии и вычисления масштабированного градиента); и больше состояния, которое будет сохраняться для каждого параметра (приблизительно в три раза размер модели для хранения среднего значения и дисперсии для каждого параметра). Простое tf.train.GradientDescentOptimizerможет в равной степени использоваться в вашем MLP, но потребует дополнительной настройки гиперпараметра, прежде чем оно будет сходиться так быстро.

mrry
источник
5
Спасибо за этот ответ! Не могли бы вы добавить, что именно вы имеете в виду, когда говорите о « настройке гиперпараметров »?
daniel451
12
Простите за жаргон! Приблизительно говоря, я имел в виду «изменение learning_rateаргумента для tf.train.GradientDescentOptimizerконструктора, пока он не сходится быстрее». :)
mrry