有可能我只是误解了亚当的工作原理,但为什么会这样:

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,为什么速率基本上是相等的,即使梯度有非常不同的值?
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]

最佳答案

adam或adaptive momentum的工作原理如下:
python - 为什么AdamOptimizer似乎没有应用正确的渐变?-LMLPHP
速度v累加梯度元素。
当你看到这个paper中的adam方程时,你会发现,步长在学习速率上有一个上限。在论文中,他们称亚当的这一特点为:“它对步长的谨慎选择”(在论文第2.1节中讨论)。
这正是你在这里观察到的在前5个步骤中的“基本相等速率”,adam中的速率是在多个先前的梯度上累积起来的,而步长则被限制在学习速率本身。
关于如何在tensorflow中计算和更新变量的更多信息(请参见方程式here)。
关于亚当的补充说明:
相对于学习率,α越大,先前的梯度对当前方向的影响就越大。
在sgd中,步长只是梯度的范数乘以学习率。
在亚当身上,台阶的大小取决于台阶的大小
一系列的梯度是对齐的。当许多连续的
梯度指向完全相同的方向。如果动量算法总是
观察梯度g,然后它最终会向−g方向加速。
这是伊恩·古德费罗的《深入学习》一书中的一部分,你可以更详细地了解亚当。

关于python - 为什么AdamOptimizer似乎没有应用正确的渐变?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54151981/

10-09 02:58