Почему AdamOptimizer не применяет правильный градиент? - PullRequest
0 голосов
/ 11 января 2019

Возможно, я просто неправильно понял, как работает Адам, но почему это происходит:

x = tf.Variable([0.0, 0.0]) # variable
y = tf.constant([5.0, 1.0]) # target
cost = tf.abs(x-y)**2

Поскольку первое измерение y больше второго, градиент в первом измерении больше второго (как и должно быть), и каждое измерение x приближается к своему целевому значению со своей собственной скоростью:

sgd = tf.train.GradientDescentOptimizer(0.001)
train = sgd.minimize(cost)

with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for _ in range(5):
    sess.run(train)
    grad,variable = sess.run(opt.compute_gradients(cost))[0]
    print(grad,variable)

#[-9.98  -1.996] [0.01  0.002]
#[-9.96004  -1.992008] [0.01998  0.003996]
#[-9.94012  -1.988024] [0.02994004 0.00598801]
#[-9.920239  -1.9840479] [0.03988016 0.00797603]
#[-9.900399  -1.9800799] [0.0498004  0.00996008]

Почему ставки по существу равны, если мы используем Адама, хотя градиенты имеют совершенно разные значения?

adam = tf.train.AdamOptimizer(0.001)
train = adam.minimize(cost)

with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for _ in range(5):
    sess.run(train)
    grad,variable = sess.run(opt.compute_gradients(cost))[0]
    print(grad,variable)

#[-9.998 -1.998] [0.001 0.001]
#[-9.996 -1.996] [0.00199999 0.00199997]
#[-9.994     -1.9940002] [0.00299997 0.00299989]
#[-9.992001  -1.9920005] [0.00399994 0.00399976]
#[-9.99     -1.990001] [0.0049999  0.00499955]

1 Ответ

0 голосов
/ 11 января 2019

ADAM или адаптивный импульс работает следующим образом:

Adam algorithm

Скорость v накапливает градиентные элементы.

Когда вы посмотрите уравнения Адама в этой статье , вы увидите, что размер шага имеет верхнюю границу скорости обучения. В статье они называют эту характеристику Адама: «его тщательный выбор размера шага» (обсуждается в разделе 2.1 статьи). Это именно то, что вы наблюдаете здесь как «существенные равные показатели» в течение первых 5 шагов, показатели в Адаме накапливаются (накапливаются) по нескольким предыдущим градиентам, в то время как размер шага ограничивается самой скоростью обучения.

Подробнее о том, как переменная рассчитывается и обновляется в Tensorflow (см. Уравнения здесь ).

Дополнительные замечания по Адаму:

Чем больше α относительно скорости обучения, тем больше предыдущих градиентов влияют на текущее направление.

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

В Адаме размер шага зависит от того, насколько велик и как выровнены последовательности градиентов. Размер шага является наибольшим, когда много последовательных градиенты указывают точно в одном направлении. Если алгоритм импульса всегда наблюдает градиент g, затем он в конечном итоге будет ускоряться в направлении −g.

Это из Книги Глубокого Обучения Иана Гудфеллоу, более подробно вы можете прочитать об Адаме здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...