Різниця між GradientDescentOptimizer та AdamOptimizer (TensorFlow)?


45

Я написав простий MLP в TensorFlow, який моделює XOR-ворота .

Отже для:

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зменшувалася набагато повільніше, ніж an AdamOptimizer.

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

Чому це так? Здається AdamOptimizer, завжди кращий вибір ?!


2
Оптимізатор Адама є більш складним, ніж градієнтний спуск (він заснований на цій роботі ).
Marc Claesen

Відповіді:


77

В tf.train.AdamOptimizerвикористовує Kingma і Ба Адам алгоритм , щоб контролювати швидкість навчання. Адам пропонує кілька переваг перед простими tf.train.GradientDescentOptimizer. Найголовніше - це те, що він використовує ковзаючі середні параметри (імпульс); Бенджо обговорює причини, чому це вигідно у розділі 3.1.1 цього документу . Простіше кажучи, це дає змогу Адаму використовувати більший ефективний розмір кроків, і алгоритм буде конвергуватися до цього розміру кроку без тонкої настройки.

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


5
Дякую за цю відповідь! Чи можете ви додати, що саме ви маєте на увазі, коли ви говорите про " настройку гіперпараметрів "?
daniel451

12
Вибачте за жаргон! Приблизно кажучи, я мав на увазі "варіювати learning_rateаргумент до tf.train.GradientDescentOptimizerконструктора, поки він швидше не конвергується". :)
mrry
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.