在机器学习中,当准备好数据集并设计好模型后,下一步工作就是训练。训练过程就是把模型中的参数调至最优。训练过程的核心就是数值优化算法。常用的方法为梯度下降与牛顿法,拟牛顿法是在牛顿法上面的改进。
梯度下降
梯度下降算法只需要一阶导数信息就能找到目标函数的极值点。它基于以下认识:
- 方向导数取得最大值的方向为梯度。(沿着这个方向下降速度最快)
- 沿着梯度的反方向迭代取得极小值;沿着正向迭代取得极大值。
将f(x)一阶泰勒展开:
$$ f(x)=f(x_0)+(x−x_0)f’(x0)$$
令$Δx=x-x_0=−δf′(x)$
则:
$$ f(x)-f(x_0)=−δf’^2(x_0)$$
因此每次迭代的结果使得f(x)逐渐变小,直至取得极小值。它的优点是简单有效,缺点是在远离极小值的地方下降很快,而在靠近极小值的地方下降很慢。
几种变形的比较:
| 算法 | 概述 | 优点 | 缺点|
|–|–|-|-|
| SGD | 在深度学习中指的是小批量梯度下降,是按照数据分布将总体数据划分为多个小批量数据,然后利用小批量数据对参数进行更新。 | 每一步更新的计算时间不依赖于训练样本数目的多寡,即使训练样本数目非常大时,他们也能收敛。对于足够大的数据集,SGD可能会在处理整个训练集之前就收敛到最终测试机误差的某个容错范围内。 | 选择合适的learning rate比较困难,若设置过大,学习曲线将会剧烈震荡,代价函数值通常会明显增加;太小则学习过程会很缓慢,如果初始学习率太低,那么学习可能会卡在一个相当高的代价值。|
| Momentum动量 | 动量方法旨在加速学习,特别是处理高曲率、小但一致的梯度,或是带噪声的梯度。动量算法积累了之前梯度指数级衰减的移动平均,并且继续沿该方向移动。它模拟的是物体运动时的惯性,即在更新时在一定程度上会考虑之前更新的方向,同时利用当前batch的梯度微调最终的结果,这样可以在一定程度上增加稳定性,从而更快的学习。 | 对方向一致的参数能够加速学习,对梯度改变方向的参数能够减少其更新,因此就是momentum能够在相关方向上加速学习,抑制振荡,从而加速收敛。 | 比较难学习一个较好的学习率。|
| Nesterov动量 | 是momentum动量的一个变种。Nesterov的改进就是让之前的动量直接影响当前的动量,因此Nesterov动量往往可以解释为往标准动量方法中添加了一个校正因子,加快收敛。 | - | -|
| Adagrad | 在更新参数的时候,缩放每个参数反比于其所有梯度历史平均值总和的平方根。
特点:1.这样在训练初期,分母较小,学习率较大,学习比较快,2.后期时,学习会逐渐减慢,3.而且它适合于处理稀疏梯度,具有损失最大偏导的参数相应地有一个快速下降的学习率,而具有小偏导的参数在学习率上有相对较小的下降。 | 适合于处理稀疏梯度 | 1.从训练开始就积累梯度方差会导致有效学习率过早和过量的减小。2.只能解决凸问题,当应用于非凸函数训练神经网络时,学习可能会到达一个局部是凸碗的区域。3.需要一个全局的学习率。|
| RMSProp | RMSProp修改Adagrad以在非凸设定下效果更好(这也是为什么神经网络中多用RMSprop的原因,神经网络的损失函数大多都是非凸的),改变梯度累积为指数加权的移动平均。相比于Adagrad,RMSProp使用指数衰减平均以丢弃遥远过去的历史。
很常用的一个优化算法。 | 1.改进了Adagrad在深度学习中过早结束的问题;2.适用于处理非平稳。 | 依然依赖一个全局学习率。|
| Adam | 结合了动量和RMSProp,利用了梯度的一阶矩估计和二阶矩估计动态调节每个参数的学习率,并且加上了偏置修正。 | - | -|