在Tensorflow中的Adam:在哪里进行矩估计?

时间:2019-01-18 03:30:41

标签: tensorflow deep-learning mathematical-optimization tensor

我知道Tensorflow中的优化程序将minimize分为compute_gradientsapply_gradients。但是,诸如Adam之类的优化算法通常使用动量和其他一些技术处理梯度,如下图所示(感谢@ kmario23提供该图)。 enter image description here 我想知道这些技术何时应用于渐变?是将它们应用于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语句中导致不同的结果

2 个答案:

答案 0 :(得分:1)

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

adam

关于TensorFlow的计算方式,这是two step process in the optimization(即 minimization

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

答案 1 :(得分:0)

compute_gradients仅计算梯度,与特定优化算法相对应的所有其他附加操作均在apply_gradients中完成。更新中的代码是一个证据,另一个证据是从张量板上裁剪出来的下图,其中Adam对应于compute_gradient操作。 enter image description here