可能我只是误解了 Adam 的工作原理,但为什么会这样:
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 or adaptive momentum works as follows:
速度v
累积梯度元素。
当您观看此 paper 中的 Adam 方程时你会看到,步长在学习率上有一个上限。在论文中,他们将 Adam 的这一特征称为:“它对步长的谨慎选择”(在论文的 2.1 节中进行了讨论)。 这正是您在这里观察到的前 5 个步骤中的“基本相等速率”,Adam 中的速率在多个先前的梯度上建立(累积),而步长被限制为学习速率本身。
关于如何在 Tensorflow 中计算和更新变量的更多信息(参见等式 here)。
对 Adam 的补充说明:
α
相对于学习率越大,之前的梯度对当前方向的影响越大。
在 sgd 中,步长只是梯度范数乘以学习率。
在 Adam 中,步长的大小取决于大小和方式
对齐一系列梯度。连续多次时步长最大
梯度指向完全相同的方向。如果动量算法总是
观察到梯度g
,那么它最终会朝着−g
的方向加速。
这是来自 Ian Goodfellow 的深度学习书籍,您可以阅读更多关于 Adam 的详细信息 here .
关于python - 为什么 AdamOptimizer 似乎没有应用正确的梯度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54151981/