使用TensorFlow实现梯度下降,而不是使用TensorFlow提供的梯度下降函数

5

我希望在使用TensorFlow构建分类器时,能够使用带动量的梯度下降(跟踪以前的梯度)。

因此,我不想使用tensorflow.train.GradientDescentOptimizer,而是想使用tensorflow.gradients计算梯度,并跟踪以前的梯度并根据所有梯度更新权重。

在TensorFlow中如何实现这一点?


你考虑过使用 AdamOptimizerRMSPropOptimizer 吗? - titus
1个回答

6

TensorFlow实现了带有动量的梯度下降算法

回答您关于实现自己的优化算法的一般问题,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中计算的其他张量没有区别。请查看一些更高级优化算法的实现(Momentum, RMSProp, Adam),以了解如何实现自己的算法。

它可以工作,但我对某些事情感到困惑。 我正在对mnist数据进行softmax回归拟合。因此,我期望tf.all_variables生成一个包含两个张量的列表,分别为10乘1的偏差和10乘784的权重。 但它生成了一个包含120个张量的列表(每次运行脚本时这个数字都会增加),其中60个为1乘10的张量,另外60个为784乘10的张量。你能帮我理解tf.all_variables发生了什么吗? - prepmath

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接