我希望在使用TensorFlow构建分类器时,能够使用带动量的梯度下降(跟踪以前的梯度)。
因此,我不想使用tensorflow.train.GradientDescentOptimizer
,而是想使用tensorflow.gradients
计算梯度,并跟踪以前的梯度并根据所有梯度更新权重。
在TensorFlow中如何实现这一点?
我希望在使用TensorFlow构建分类器时,能够使用带动量的梯度下降(跟踪以前的梯度)。
因此,我不想使用tensorflow.train.GradientDescentOptimizer
,而是想使用tensorflow.gradients
计算梯度,并跟踪以前的梯度并根据所有梯度更新权重。
在TensorFlow中如何实现这一点?
TensorFlow实现了带有动量的梯度下降算法。
回答您关于实现自己的优化算法的一般问题,TensorFlow为您提供了计算梯度和使用计算梯度更新变量的原语。在您的模型中,假设loss
指定损失函数,var_list
是模型中TensorFlow变量的python列表(您可以通过调用tf.all_variables
或tf.trainable_variables
来获取),那么您可以按如下方式计算相对于变量的梯度:
grads = tf.gradients(loss, var_list)
对于简单梯度下降法,您只需从变量中减去梯度和学习速率的乘积。对应的代码如下:
var_updates = []
for grad, var in zip(grads, var_list):
var_updates.append(var.assign_sub(learning_rate * grad))
train_op = tf.group(*var_updates)
sess.run(train_op)
来训练您的模型。在实际更新变量之前,您可以做各种事情。例如,您可以在不同的变量集中跟踪梯度,并将其用于动量算法。或者,在更新变量之前可以裁剪梯度。所有这些都是简单的TensorFlow操作,因为梯度张量与您在TensorFlow中计算的其他张量没有区别。请查看一些更高级优化算法的实现(Momentum, RMSProp, Adam),以了解如何实现自己的算法。
AdamOptimizer
或RMSPropOptimizer
吗? - titus