为什么AdamOptimizer似乎没有应用正确的渐变?

时间:2019-01-11 18:16:35

标签: python tensorflow machine-learning optimization deep-learning

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

in_list = input("Enter your list :- ").split()
print(in_list)
print(type(in_list[0]))
print(type(in_list[1]))

由于x = tf.Variable([0.0, 0.0]) # variable y = tf.constant([5.0, 1.0]) # target cost = tf.abs(x-y)**2 的第一个维度大于第二个维度,因此第一个维度的梯度大于第二个维度(应该是),并且y的每个维度都接近其目标值自己的价格:

x

即使梯度具有完全不同的值,为什么我们使用Adam时速率也基本相等?

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]

1 个答案:

答案 0 :(得分:4)

  

ADAM或自适应动量的工作原理如下:

Adam algorithm

速度v累积了渐变元素。

当您观看此paper中的Adam方程时,您会看到,步长在学习率上具有上限。在论文中,他们称其为亚当的特征:“谨慎选择步长”(在论文第2.1节中讨论)。 这正是您在前5个步骤中观察到的“基本相等速率”,Adam中的速率在多个先前的梯度上累积(累积),而步长仅受学习速率本身的限制。

有关在Tensorflow中如何计算和更新变量的更多信息(请参见方程here)。

关于亚当的其他评论:

α相对于学习率越大,以前的梯度对当前方向的影响越大。

在sgd中,步长只是梯度的范数乘以学习率。

在亚当中,步长的大小取决于步长和步长 对齐一系列的渐变。连续许多步时步长最大 梯度指向完全相同的方向。如果动量算法总是 观察到梯度g,然后最终将朝−g的方向加速。

这摘自Ian Goodfellow的《深度学习书》,您可以详细了解亚当here