123
SGD 学习率的确定
由于批量梯度下降法在更新每一个参数时,都需要所有的训练样本,所以训练过程会随着样本数量的加大而变得异常的缓慢。随机梯度下降法(Stochastic Gradient Descent,简称SGD)可以解决批量梯度下降法这一弊端。SGD 的伪代码:
\[ w := w - a \frac{ \partial L(w)}{\partial w}\]
这里损失函数 $L(w)$ 是关于单个样本的损失,这种做法虽然不能导致选择一个全局最优的方向,但是总体损失函数值随着训练是在不断下降的,SGD 不像批量梯度下降一样,可以使用一个固定的学习率,SGD 学习率的选择方法有以下几种,因为搜索方向的不稳定,SGD 的学习率 a 值会比批量梯度下降中的学习率小很多,因为 SGD 更新过程中的方差更大,这是因为 SGD并非是在整个训练集上计算参数更新值,少量的训练样本带来的参数更新并不稳定。选择合适的学习率和学习率变更策略是相当困难的。接下来给出选择学习速率的几种方法:
1)在迭代开始时就使用一个足够小的固定学习率 a ,这样固定且小的学习率在首次迭代(在训练集上的一次 epoch )提供了稳定的收敛性,经过 n 个 epoch 可以将学习速率降低为原来的一半,一般常见的做法取 n = 5 。
2) 在每次迭代后使用一组固定的学习率,并且当紧邻的两次迭代,目标函数变化值小于某个较小的阈值时,就降低学习率。这往往会很好地收敛于一个局部最优。
3)有一个比较常用的学习率变化策略,学习率 $\frac{a}{b+t}$ 随着迭代次数 t 变化而变化,其中变量 a 和 b 决定了初始时的学习率,并且学习率的开始减少的过程是独立的。
momentum 加速收敛
如果把要优化的目标函数看成山谷的话,可以把要优化的参数看成滚下山的石头,参数随机初始化可以看做在山谷的某个位置以 0 速度开始往下滚。目标函数的梯度可以看做给石头施加的力,由力学定律知:$F=m \times a$ ,所以梯度与石头下滚的加速度成正比, 因此会导致石头在山谷两侧的峭壁上滚来滚去,如下图左:
为了解决这个问题,引入一个称作动量(momentum) 的概念。momentum 的作用就是在更新下降方向的时候不仅要考虑到当前的方向,也要考虑到上一次的更新方向,两者加权,可以这种避免震荡。如上图右所示加入 momentum (0.7)后梯度的方向的变化,这种变化使得收敛速度大幅提升,下面给出动量的更新过程:
\begin{align} v &:= \gamma v+ a \frac{\partial L(w)}{\partial w}\\ w &:= w - v \end{align}
上述方程中, v 是当前的速度矢量,它和参数向量 w 有相同的维度,$\gamma$ 即为动量值,学习率 a 如上一节所述来确定,在使用 momentum 的时候导致梯度值比较大,所以 a 应尽可能的小, $\gamma \in (0,1]$ 为将之前的梯度纳入本次梯度计算的比例,一般初始 $\gamma$ 的值设定为为 0.5,直到经过一定的 epoch 后,梯度开始稳定下降,这时将 $\gamma$ 增加到更高即可,给出一组参考 [0.5, 0.9, 0.95, 0.99]。
总结,一般情况下 SGD + momentum 能极大的提升收敛的速率。
参考:
http://ufldl.stanford.edu/tutorial/supervised/OptimizationStochasticGradientDescent/

浙公网安备 33010602011771号