在TensorFlow中实现梯度下降,而不是使用随附的梯度下降

时间:2016-08-26 13:06:29

标签: tensorflow gradient-descent

我想在TensorFlow中构建分类器时使用具有动量的梯度下降(跟踪先前的渐变)。

所以我不想使用tensorflow.train.GradientDescentOptimizer,但我想使用tensorflow.gradients计算渐变并跟踪以前的渐变并根据所有渐变更新权重。

如何在TensorFlow中执行此操作?

1 个答案:

答案 0 :(得分:5)

TensorFlow具有动态的implementation梯度下降。

为了回答关于实现自己的优化算法的一般问题,TensorFlow为您提供了计算渐变的基元,并使用计算的梯度更新变量。在您的模型中,假设loss指定了损失函数,var_list是模型中TensorFlow变量的python列表(可以通过调用tf.all_variablestf.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中计算的其他张量没有区别。请查看一些更高级的优化算法的实现(MomentumRMSPropAdam),以了解如何实现自己的优化算法。