我知道Tensorflow中的优化程序将minimize
分为compute_gradients
和apply_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
语句中导致不同的结果
答案 0 :(得分:1)
下面是深度学习书中介绍的Adam算法。至于您的问题,这里要注意的重要一点是倒数第二步的 theta梯度(写为theta的拉普拉斯算子)。
关于TensorFlow的计算方式,这是two step process in the optimization(即 minimization )
第一步,计算最终梯度所需的所有必要成分。因此,第二步只是基于第一步中计算出的梯度和学习率(lr
)将更新应用于参数。
答案 1 :(得分:0)