高中数学学过,函数在一阶导数为零的地方达到其最大值和最小值。梯度下降算法基于相同的原理,即调整系数(权重和偏置)使损失函数的梯度下降。在回归中,使用梯度下降来优化损失函数并获得系数。本节将介绍如何使用 TensorFlow 的若干种梯度下降优化器及其变体,以及tf.train.exponential_decay()实现逐步衰减的学习率(还有不是基于梯度下降的优化器嘛?)。
按照损失函数的负梯度成比例地对系数(W 和 b)进行更新。根据训练样本的大小,有三种梯度下降的变体:(这里只是指,向优化器中输入训练样本的三种模式,并不是说这三种变体是三种优化器,优化器种类繁多,后面有介绍)
首先确定想用的优化器。TensorFlow 为你提供了各种各样的优化器:
(1)从最流行、最简单的梯度下降优化器开始:
tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)
GradientDescentOptimizer 中的 learning_rate 参数可以是一个常数或张量。它的值介于 0 和 1 之间。必须为优化器给定要优化的函数。使用它的方法实现最小化。该方法计算梯度并将梯度应用于系数的学习。该函数在 TensorFlow 文档中的定义如下:
minimize(
loss,
global_step=None,
var_list=None,
gate_gradients=GATE_OP,
aggregation_method=None,
colocate_gradients_with_ops=False,
name=None,
grad_loss=None
)
这里给出定义计算图的例子:
馈送给 feed_dict 的 X 和 Y 数据可以是 X 和 Y 个点(随机梯度)、整个训练集(Vanilla)或成批次的。GradientDescentOptimizer()是默认支持三种梯度下降变体的。
(2)另一种 TensorFlow 支持的常用优化器是Adam 优化器。该方法利用梯度的一阶和二阶矩对不同的系数计算不同的自适应学习率:
optimizer=tf.train.AdamOptimizer().minimize(loss)
(3)若梯度下降中另外增加了动量项,可使用tf.train.MomentumOptimizer()优化器,输入 learning_rate 和 momentum 初始化参数:(不理解动量项是什么?)
optimizer=tf.train.MomentumOptimizer(learning_rate=0.01,momentum=0.5).minimize(loss)
(4)使用tf.train.AdadeltaOptimizer()来实现一个自适应的、单调递减的学习率,输入初始化参数 learning_rate 和衰减因子 rho:
optimizer=tf.train.AdadeltaOptimizer(learning_rate=0.8,rho=0.95).minimize(loss)
(5)TensorFlow 也支持 Hinton 的RMSprop,其工作方式类似于 Adadelta 的 tf.train.RMSpropOptimizer():(不懂所谓的RMSprop)
optimizer=tf.train.RMSpropOptimizer(learning_rate=0.01,decay=0.8,momentum=0.1).minimize(loss)
Adadelta 和 RMSprop 之间的细微不同可参考http://www.cs.toronto.edu/~tijmen/csc321/slides/lecture_slides_lec6.pdf和https://arxiv.org/pdf/1212.5701.pdf
(6)除此之外,TensorFlow 还提供了以下优化器:
通常建议你从较大学习率开始,并在学习过程中将其降低。这有助于对训练进行微调。可以使用 TensorFlow 中的 tf.train.exponential_decay 方法来实现这一点。根据 TensorFlow 文档,在训练模型时,通常建议在训练过程中降低学习率。该函数利用指数衰减函数初始化学习率。需要一个 global_step 值来计算衰减的学习率。可以传递一个在每个训练步骤中递增的 TensorFlow 变量。函数返回衰减的学习率。
global_step和decay_steps有什么区别,没搞懂呀?
输入参数与返回值
下面是讲解不同优化器的链接: