Tensorflow 中的 Adam:矩估计发生在哪里?

Adam in Tensorflow: where does moment estimates happen?

我知道 Tensorflow 中的优化器将 minimize 分为 compute_gradientsapply_gradients。然而,像 Adam 这样的优化算法通常使用动量和其他一些技术来处理梯度,如下图所示(感谢 @kmario23 提供该图)。 我想知道这些技术何时应用于渐变?它们应用于 compute_gradients 还是 apply_gradients

更新

sess = tf.Session()
x = tf.placeholder(tf.float32, [None, 1])
y = tf.layers.dense(x, 1)
loss = tf.losses.mean_squared_error(tf.ones_like(y), y)
opt = tf.train.AdamOptimizer()
grads = opt.compute_gradients(loss)
sess.run(tf.global_variables_initializer())
print(sess.run(grads, feed_dict={x: [[1]]}))
print(sess.run(grads, feed_dict={x: [[1]]}))

上面的代码输出了两次相同的结果,是不是说明在apply_gradients中计算了矩估计?因为,恕我直言,如果在 apply_gradients 中计算矩估计,那么在第一个 print 语句之后,将更新第一个和第二个矩,这将导致第二个 print 语句中的不同结果.

下面是深度学习书中介绍的 Adam 算法。至于你的问题,这里要注意的重要一点是倒数第二步中的 theta 的梯度(写为 theta 的拉普拉斯算子)。

至于 TensorFlow 的计算方式,这是 two step process in the optimization(即 最小化

在第一步中,计算最终梯度的所有必要成分。因此,第二步只是根据第一步计算的梯度和学习率 (lr) 对参数应用更新。

compute_gradients只计算梯度,所有其他对应于特定优化算法的额外操作都在apply_gradients中完成。 update中的代码是一个证据,另一个证据是下图裁剪自tensorboard,其中Adam对应的是compute_gradient操作。