文章目录
目标:理解更多神经网络优化方法,了解不同优化器,并书写优化器代码
神经网络的学习过程中需要利用优化算法去更新参数,训练模型。优化器的种类有多个,比较常见的是随机梯度下降算法,接下来系统梳理一下各种优化算法的原理、实现方法和优劣之处。
梯度下降法(Gradient Descent)
梯度下降算法的优化思想是每次沿着当前位置梯度的反方向为搜索方向。梯度的几何含义是:函数增长最快的方向,那么为了使损失函数达到最小,就得取负方向,即沿着反向梯度方向更新参数,使损失函数沿着下降最快的方向走。
计算损失函数梯度就是相对于各参数求偏导的矢量和,即
w i = w i − learning rate ∗ ∂ L o s s ∂ w i w_i = w_i - \text{learning rate} * \dfrac{\partial Loss }{\partial w_i} wi=wi−learning rate∗∂wi∂Loss
注:
当损失函数是凸函数时,可求得全局最优解,否则不能保证
梯度下降法的速度也未必是最快的
梯度下降算法的学习效果取决于初始值、学习率
其越接近目标值、步长越小,前进越慢
- 梯度下降算法的优缺点:
缺点:
1、靠近极小值时收敛速度减慢,如下图所示;
2、直线搜索时可能会产生一些问题;
3、可能会“之字形”地下降。
从上图可以看出,梯度下降法在接近最优解的区域收敛速度明显变慢,利用梯度下降法求解需要很多次的迭代。
GD算法的实现方式
按每次训练过程中投入数据量的大小可将GD优化算法的实现分为以下三类:
BGD(Batch Gradient Descent)
在每次计算中,采用整个训练集的数据来计算Loss function 对参数的梯度:
W = W − l r ⋅ ∇ W J ( W ) W= W - lr\cdot \nabla _WJ(W) W=W−lr⋅∇WJ(W)
- BGD 缺点:计算量大,计算缓慢,对于大规模数据比较棘手;对于很大的数据集来说可能会有相似样本,这样在计算梯度过程中就容易出现冗余;不能新增样本
- BGD 优点:可以收敛到局部最优
SGD(Stochastic Gradient Descent)
SGD在每次更新过程中,只对每个样本进行梯度更新。
W = W − l r ⋅ ∇ W J ( W ; x ( i ) ; y ( i ) ) W= W - lr\cdot \nabla _WJ(W;x^{(i)};y^{(i)}) W=W−lr⋅∇WJ(W;x(i);y(i))
- SGD 优点:一次只更新一个样本,计算速度很快,而且可以新增样本;SGD虽然包含了随机性,但从期望来看是等于正确导数的;稍微减小lr时,SGD与BGD收敛性一样;
- SGD 缺点:更新频繁,容易造成Loss震荡;SGD的噪音较多,使得SGD不是每次迭代都朝整体最优化方向前进;SGD收敛到局部最小存在随机性;
MBGD (Mini-Batch Gradient Descent)
在每次训练过程中,从总体m个样本中随机取n个样本计算Loss的梯度。
W = W − l r ⋅ ∇ W J ( W ; x ( i : i + n ) ; y ( i : i + n ) ) W= W - lr\cdot \nabla _WJ(W;x^{(i:i+n)};y^{(i:i+n)}) W=W−lr⋅∇WJ(W;x(i:i+n);y(i:i+n))
- MBGD 优点:降低更新参数的方差,即克服SGD噪音多不稳定的缺点,收敛更加稳定;充分利用dl学习框架中高度优化的矩阵操作进行更有效的梯度计算。
梯度下降算法的不足
1、不能很好保证收敛性,lr取太小的话收敛速度会过慢、lr取太大的话loss就会在极小值处不同震荡直至偏离。(措施:lr预先设置大一点,前后两次迭代的loss变化小于某个阈值后,就减小lr,但阈值的设定需要数据集本身的特点)
2、对于非凸函数,GD容易被困在局部极小值或者鞍点处(鞍点附近的loss都一样,所有维度的梯度接近0);若是用BGD,则优化停止不动;若是MBGD或SGD,那么每次找到的梯度是不同的,会发生震荡,来回跳动
3、SGD对所有参数更新采用的lr是相同的,若数据稀疏,我们更希望对出现频率低的特征进行大一点的更新,即学习率lr是一个可变量,根据特征出现频率以及更新次数发生变化
GD算法的改进
Momentum
momentum是模拟物理里动量的概念,积累之前的动量来替代真正的梯度。它通过加入 γ v t −