【深度学习理论】炼丹术——聊聊Optimization
1. 前言
机器学习
的本质是在一个function set
中选择最优的function:
f^*(又被称为model
)。其中,挑选最优function
的过程被转换为求损失函数的最小值
问题,损失函数可能的图像如下图所示(在实际问题中损失函数的图像会复杂的多的多的多的多)。
寻找最优 function 的过程如下图所示,其中黑线表示可能存在的寻找路径。
2. 问题
假设当前问题的损失函数(loss function)
图像如下图所示,因loss function
是通过梯度
进行参数更新,故当损失函数在更新过程中遇到梯度
为0
的点的时候会停止更新。
在一个函数中,有三类点的梯度可能为0
:
Global Minima:
全局最小值点;Local Minima:
局部最小值点;Saddle Point
:鞍点;
其中Global Minima
是我们要找的最优解,Local Minima
是次优解,Saddle Point
是错误解。
备注:
在实际应用中遇到Saddle Point
的概率要远远大于遇到Local Minima
的概率;
3. Optimizer
3.1 SGD
Stochastic Gradient Descent,又被称为随机梯度下降
,运算过程如下图所示:
假设当前点为\theta^0,其中\eta为学习率,则参数更新过程如下:
- 计算\theta^0处的梯度\nabla L(\theta^0);
- 沿\theta^0梯度相反的方向更新参数到\theta^1,\theta^1=\theta^0-\eta \nabla L(\theta^0);
- 重复步骤
1
和步骤2
,直到\nabla L(\theta^t)\approx0;
SGD 的缺点:
- 会“卡”在
local minima
和saddle point
; - 在实践中当梯度很小的时候(如:0.0000001)时会停止更新参数(如下图中的点
A
),如果此时停止更新参数,则模型的效果会很差(欠拟合状态)。此外,在A
点附近(梯度比较平缓的区域)参数更新速度很慢; - 不稳定,容易受到噪音点的影响;
3.2 Momentum
又称为动量法
,该算法是将物理学中的“动量”概念引入到算法中。常用的算法是:SGDM(Stochastic Gradient Descent with Momentum)
,其运算过程如下:
假设当前点为:\theta^0,动量v^0=0,则参数更新过程如下;
- 计算\theta^0当前的梯度为\nabla L(\theta^0);
- 动量v^1=\lambda v^0-\eta \nabla L(\theta^0),\lambda是动量超参数 0 ≤ \lambda < 1,如果\lambda=0则算法为
SGD
; - 更新参数到\theta^1,\theta^1=\theta ^0 + v^1;
- 重复步骤
1~3
;
备注:
v^i其实是所有历史梯度的加权和:
- v^0=0;
- v^1=-\eta \nabla L(\theta^0);
- v^2=-\lambda \eta \nabla L(\theta^0)-\eta \nabla L(\theta^1);
SGDM
的效果图如下所示:
SGDM 相较于 SGD 的优点:
- 可以解决
saddle point
问题; - 有一定几率可以跨过
local minima
; - 在梯度平缓的区域更新速度相较于
SGD
速度更快,可以帮助参数快速朝着极小值方向探索; - 在一定程度上使参数的更新方向更加一致,避免了发散;
3.3 AdaGrad
在以上算法中,所有的参数更新都使用相同的学习率。但是不同的参数在各个维度上的“平缓”程度是有差异的。如下图所示,梯度在w_1方向上比较平缓(变化比较慢)
,在w_2方向上比较陡峭(变化比较快)
。如果使用相同的学习率:
- 当学习率比较大时,因w_2方向上的变化比较大,故很容易跳过该方向上的最优解;
- 当学习率比较小时,因w_1方向上的变化比较平缓,故该方向上的更新速度比较慢,需要比较多的次数才能找到最优解;
AdaGrad 算法是根据自变量在每个维度的梯度值的大小来自动调整各个维度上的学习率,从而避免使用同一学习率所带来的问题。计算公式如下:
其中:
- \eta:学习率;
- g_i:i 时刻的梯度;
- \theta_i:i 时刻的参数值;
- \epsilon:一个很小的值,防止分母为 0;
- \frac{\eta}{\sqrt{\sum_{i=0}^{i=t-1}(g_{i})^2+\epsilon}}是一个只会递增的衰减系数;
由上个式子可知,历史所有梯度的元素的算术平方根作为学习率的分母,则:
- 如果参数在某个方向上的偏导数一直很大,则学习率会下降的快;
- 如果参数在某个方向上的偏导数一直很小,则学习率会下降的慢;
这就达到了各个维度方向上自动调整学习率的目的。
Adagrad 的问题:
- 学习率一直下降(或者不变,因为衰减系数一直递增),如果在早期学习率比较大的情况下未找到最优解或者到达最优解附近的区域,则后续很难找到最优解;
- 无法适应学习率需要时大时小(因为学习率一直在下降,不会动态调整)的情况;
3.4 RMSProp
Adagrad
算法的问题在于:衰减系数是历史梯度平方和的暴力累加,导致越训练模型的更新速度越慢。而RMSProp
算法和Adagrad
的不同就在于衰减系数的计算方式,RMSProp
使用指数加权平均
的方式计算衰减系数。对于参数w^j,其更新过程的数学公式如下:
- v_t=\rho v_{t-1}+(1-\rho)*g_{t}^2;
- \Delta w_t=-\frac{\eta}{\sqrt{v_t+\epsilon}}*g_t;
- w_{t+1}=w_t+\Delta w_t;
其中:
- \eta:初始学习率;
- v_t:t 时刻梯度的指数加权平均值;
- g_t:t 时刻w^j的梯度;
使用指数加权平均
的方式计算衰减系数的精髓在于:
- 越靠近当前时刻的历史梯度对当前时刻参数更新的影响越大;
- 越远离当前时刻的历史梯度对当前时刻参数更新的影响越小;
RMSProp 的优点:可以根据历史梯度动态的为每个参数设置不同的学习率;
3.5 Adam
Adam
全称Adaptive Moment Optimization
,是将SGDM
和RMSPROP
两种算法结合起来。其对于任意一个参数w^j,其更新过程的数学公式如下:
- v_t=\beta _1*v_{t-1}-(1-\beta _1)*g_t;
- s_t=\beta _2 * s_{t-1}-(1-\beta _2)*g_t^2;
- \Delta w_t=-\eta \frac{v_t}{\sqrt{s_t+\epsilon}}*g_t;
- w_{t+1}=w_t + \Delta w_t;
其中:
- \eta:初始学习率 ;
- v_t:t 时刻的动量;
- s_t:t 时刻的指数加权平均衰减系数;
- g_t:t 时刻w^j的梯度;
- \beta _1,\beta _2:超参数;
Adam 的优点:
- 有
SGDM
算法的优点; - 有
RMSProp
算法的优点;
4. 总结
目前在实践中常用的是Adam
和SGDM
,有实践表明:Adam
算法收敛速度更快、但是有较大的泛化误差且不稳定;SGDM
算法有比较小的泛化误差、更稳定,但是需要较长的训练时间。此外,SGDM
和Adam
算法有不同的适用领域,具体如下图所示:
最后,下面是其他的一些建议,haha…