优化方法-梯度下降
梯度下降的方法与区别
梯度下降包括:批量式梯度下降,随机梯度下降,小批量梯度下降,此分类是根据每次训练所需的数据量大小分类。
批量式梯度下降(BGD)在每次计算梯度时,将所有的样本带入计算中,通过计算所有样本的误差来更新梯度。
优点:每次迭代是对所有的样本进行计算,此时利用矩阵进行操作,实现了并行。另外,利用全体数据集的梯度方向能够更好的表达总体信息,从而更准确的朝着极值所在的方向更新。当目标函数为凸函数,一定能够找到全局最优解。
缺点:由于每一步都需要花费大量的时间和空间,因此无法应用于大规模的场景。
随机梯度下降法(SGD)则反其道行之,通过放弃一部分梯度的精度,每次迭代通过随机挑选一个样本计算其梯度方向来训练权值。
优点:每次迭代仅仅使用一个样本计算梯度,因此大大节约了内存和时间消耗,因此迭代速度较快。
缺点:准确度下降,即使在目标函数为强凸函数的情况下仍然很难做到线性收敛。 由于单个样本的梯度往往无法代表全体样本的趋势,因此容易陷入局部最优。更甚情况会陷入鞍点和山谷。并且很难实现并行。
小批量梯度下降(MIni-batch GD)是 SGD 和 BGD 的一种折中,其思想是每次迭代使用一个 Mini-batch-size 的样本进行训练更新参数。
优点:能通过矩阵运算实现并行,从而每次在一个 batch 上优化神经网络参数并不会比单个数据慢太多。同时可以加快收敛速度,减少收敛的迭代次数,精度也不会比 BGD 差很多。
缺点:选择的 batch-size 的大小会影响训练效果。如:较小的 batch-size 同样会引起震荡。
SGD 方法的改进与比较
由于随机梯度下降每次选择一个样本进行训练,因此不同的样本带来的不同的梯度大小导致其在训练过程中会出现震荡的结果,无法稳定的逼近最优点,反而容易陷入局部最优。另外还容易陷入山谷或者鞍点。当进入山谷时,准确的下降方向应该是沿山道向下,但是 SGD 会在山谷两侧的山壁上来回震荡,降低精度和收敛速度。而在鞍点处,随机梯度下降法会进入一片平坦之地,此时距离最低点很远,但是由于当前位置的梯度几乎为 0 导致无法继续搜索。
随机梯度下降的公式为 $\theta_{t+1} = \theta_{t}-\eta g_{t}$,其中 $g_{t}$ 为 $t$ 时刻的梯度
从而有一系列的改进:两个方向:解决高方差震荡问题;特征稀疏性问题与学习率衰减问题。
动量方法(Momentum)
相当于增加小球的重量,使得在山谷中时因为重力能够快速下降,在鞍点处则可以由于惯性的增加冲出鞍点的平缓地带。其考虑到了历史的前进步伐对当前前进步伐的影响
其迭代公式为:
$v_{t+1}=\gamma v_{t}-\eta g_{t}$
$\theta_{t+1} = \theta_{t}-v_{t+1}$
通过增加动量的方式来更新。即前进步伐 $-v_{t+1}$ 由当前的梯度 $g_{t}$ 和上一步的前进步伐 $v_{t}$ 决定,这里的惯性体现在对前面的信息的重利用。即当前速度相当于前一步的速度与加速度共同作用得到的。这里的 $\gamma$ 代表了阻力的作用。当其梯度指向实际移动方向时,动量项 $\gamma v_{t}$ 增大;当梯度与实际移动方向相反时,$\gamma v_{t}$ 减小。即动量项只对相关样本进行参数更新,减少了不必要的参数更新。
相比较 SGD,Momentum 的方法收敛速度更快,收敛曲线更加稳定。
NAG
此方法是动量方法的一种扩展,由于小球在到达最低点时的动量相当高,如果不知道在哪一点进行减速,将会导致优化算法错过极小值,由于动量的原因反而继续向上运动。因此,希望小球知道在哪一点减速。即能够预见未来的运动趋势。
NAG 方法首先基于先前的动量进行一次大跳跃,然后计算梯度,并根据此梯度修正更新参数,预更新能够防止优化算法走的过快导致错过极小值,使其对变动的反应更灵敏。
由于在更新参数的时候会用到动量项 $\gamma v_{t}$,因此计算 $\theta_{t}-\gamma v_{t}$ 能提供参数下一位置的近似值,从而实现通过计算参数未来未知的近似值上的梯度来预见未来。
更新公式为:
$v_{t+1} = \gamma v_{t}-\eta g(\theta_{t}-\gamma v_{t})$
$\theta_{t+1} = \theta_{t}-v_{t+1}$
AdaGrad
考虑周围环境的变化对运动的影响。AdaGrad 方法采用“历史梯度平方和”来衡量不同参数的梯度的稀疏性,取值越小表示越稀疏,具体的更新公式为:
$\theta_{t+1,i} = \theta_{t,i}-\frac{\eta}{\sqrt{\sum_{k=0}^{t} g_{k,i}^{2}+\epsilon}}g_{t,i}$
其在更新计算时考虑到了所有的历史信息,根据不同参数的历史梯度,定义不同的学习率来对对应的参数进行更新,分母中的求和形式实现了退火的过程,即随着时间的推移学习率越来越小,从而实现动态自适应的收敛过程。适合处理稀疏数据,因为稀疏数据下容易产生稀疏的特征,导致参数梯度的稀疏性,如:在词嵌入模型中,不频繁出现的词或者词组的参数的梯度在大多数情况下为 0,从而参数被更新的频率很低。AdaGrad 的思想是希望更新频率低的参数可以拥有较大的更新步幅,而更新频率高的参数的步幅可以减小。
AdaDelta
AdaDelta 试图解决 AdaGrad 的学习衰减问题,其认为 AdaGrad 的学习率设置随时间衰减的速度过于激进。不像 Adagrad 累加所有过往平方梯度,Adadelta 对累加的范围作了限制,只累计固定大小 w 的窗口内的过往梯度。
为了提升效率,Adadelta 也没有存储 w 个平方梯度,而是过往平方梯度的均值。这样,时步t的动态均值就只取决于先前的均值和当前梯度。
$E[g^2]_{t} = \gamma E[g^2]_{t-1}+(1-\gamma )g_{t}^{2}$
$\theta_{t+1,i} = \theta_{t,i}-\frac{\eta }{\sqrt{E[g^2]_{t} + \epsilon}} \cdot g_{t,i}$
Adam
Adam 方法将惯性思维和环境感知思维集于一身。一方面,Adam 通过记录梯度的一阶矩,即过往梯度与当前梯度的均值,来保持惯性。另一方面,Adam 记录梯度的二阶矩,即过往梯度与当前梯度平方的均值,类似于 AdaGrad 方法体现对环境的感知。一阶矩和二阶矩采用指数衰退平均的技术:
$m_t = \beta_{1} m_{t-1} + (1 - \beta_{1}) g_{t} $
$v_t = \beta_{2} v_{t-1} + (1 - \beta_{2}) g_{t}^{2} $
其中是衰减系数,$m_t$ 是一阶矩,$v_t$ 是二阶矩。
其物理意义为:
$||m_{t}||$ 大 $v_t$ 且大时,梯度大且稳定,表明遇到一个大坡,前进方向明确
$||m_{t}||$ 大且 $v_t \rightarrow 0$ 时,不可能出现。
$||m_{t}||\rightarrow 0$ 且 $v_t$ 大时,梯度不稳定,表明可能遇到一个峡谷,容易引起反弹震荡。
$||m_{t}||\rightarrow 0$ 且 $v_t \rightarrow 0$ 时,梯度趋于 0,可能到达局部最低点,也可能走到一片坡度极缓的平地,此时要避免陷入平原。
另外,Adam 方法考虑了 $m_t$ 和 $v_t$ 在零初始值情况下的偏置矫正。更新公式为:
$\theta_{t+1,i} = \theta_{t,i}- \frac{\eta \cdot \hat{m}_{t}}{\sqrt{\hat{v}_{t} + \epsilon}}$
其中,$\hat{m}_{t} = \frac{m_{t}}{1-\beta_{1}^{t}}$,$\hat{v}_{t} = \frac{v_{t}}{1-\beta_{2}^{t}}$,
实际应用中,Adam 方法效果良好。与其他自适应学习率算法相比,其收敛速度更快,学习效果更为有效,而且可以纠正其他优化技术中存在的问题,如学习率消失、收敛过慢或是高方差的参数更新导致损失函数波动较大等问题。
参考文献

浙公网安备 33010602011771号