我想在TensorFlow中构建分类器时使用具有动量的梯度下降(跟踪先前的渐变)。
所以我不想使用tensorflow.train.GradientDescentOptimizer
,但我想使用tensorflow.gradients
计算渐变并跟踪以前的渐变并根据所有渐变更新权重。
如何在TensorFlow中执行此操作?
答案 0 :(得分:5)
TensorFlow具有动态的implementation梯度下降。
为了回答关于实现自己的优化算法的一般问题,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),以了解如何实现自己的优化算法。