梯度下降及其变体
包含梯度下降、随机梯度下降、小批量梯度下降
- 梯度下降GD
w k + 1 = w k − γ k ∇ f ( w k ) (1) w_{k+1}=w_k-\gamma_k\nabla f(w_k) \tag{1} wk+1=wk−γk∇f(wk)(1)
每次更新参数需要计算整个数据集
优点:对凸问题可以保证取得全局最小,非凸问题局部极小
缺点:计算量大,可能造成内存不足,无法在线更新模型 - 随机梯度下降SGD
w k + 1 = w k − γ k ∇ f i ( w k ) (2) w_{k+1}=w_k-\gamma_k\nabla f_i(w_k) \tag{2} wk+1=wk−γk∇fi(wk)(2)
每次随机选择1个训练样本计算梯度
优点:计算速度快,可用于在线模型更新;由于随机单个样本带来的噪声可以避免陷入浅的局部极小值,找到更好的最小值(退火),能获得比GD更好的效果
缺点:噪声带来的收敛过程波动较大 - 小批量梯度下降SGD
w k + 1 = w k − γ k 1 B i ∑ j ∈ B i ∇ f j ( w k ) (3) w_{k+1}=w_k-\gamma_k\frac{1}{B_i}\sum_{j\in B_i}\nabla f_j(w_k) \tag{3} wk+1=wk−γkBi1j∈Bi∑∇fj(wk)(3)
每次随机选择一组训练样本计算梯度
优点:是随机梯度的改进,可以减少更新中的噪声
- 以上3种方法中小批量梯度下降的效果最好,因此SGD一般指的就是小批量
- 但SGD学习率 γ \gamma γ的选择比较困难,另外SGD容易收敛到局部最优,并且可能被困在鞍点
- 鞍点:一阶导为0,从该点出发一个方向是极大值点,另一个方向是极小值点(非极值的驻点)。其充要条件是,函数在该点的Hessian矩阵为不定的
- 由于鞍点处会有一个平稳段,导致函数的导数长时间接近0,使得训练变缓慢
基于梯度下降的优化方法
动量
{ p k + 1 = β k p k + ∇ f i ( w k ) w k + 1 = w k − γ k p k + 1 (4) \begin{cases}p_{k+1}=\beta_kp_k+\nabla f_i(w_k)\\w_{k+1}=w_k-\gamma_kp_{k+1}\end{cases} \tag{4} {pk+1=βkpk+∇fi(wk)wk+1=wk−γkpk+1(4)
- ∇ f i ( w k ) \nabla f_i(w_k) ∇fi(wk)表示第 i i i个样本的损失函数在第 k k k次迭代的权重下的梯度
- 上式中 p p p称为SGD的动量,其实质就是梯度的平均值,起到噪声平滑的作用
- 动量可以减轻SGD的震荡,起到加速的作用,其中 β \beta β称为阻尼因子,一般取0.9或0.99
Nesterov
{ p k + 1 = β k p k + ∇ f i ( w k − β k p k ) w k + 1 = w k − γ k p k + 1 (5) \begin{cases}p_{k+1}=\beta_kp_k+\nabla f_i(w_k-\beta_kp_k)\\w_{k+1}=w_k-\gamma_kp_{k+1}\end{cases} \tag{5} {pk+1=βkpk+∇fi(wk−βkpk)wk+1=wk−γkpk+1(5)
- Nesterov是动量方法的改进,比后者收敛速度更快
- Nesterov与动量的不同是,梯度计算不是根据当前位置,而是根据本来计划要走的一步到达的位置计算
Adagrad
{ p k + 1 = γ ∑ j = 1 k + 1 ∇ f i 2 ( w j ) ∇ f i ( w k ) w k + 1 = w k − p k + 1 (6) \begin{cases}p_{k+1}=\frac{\gamma}{\sqrt{\sum_{j=1}^{k+1}{\nabla f_i^2(w_j)}}}\nabla f_i(w_k)\\w_{k+1}=w_k-p_{k+1}\end{cases} \tag{6} ⎩⎨⎧pk+1=∑j=1k+1∇fi2(wj)γ∇fi(wk)wk+1=wk−pk+1(6)
- Adagrad将每个参数的每次迭代的梯度取平方做累加后再开方,用全局学习率 γ \gamma γ除以这个数,作为学习率的动态更新
- 由于训练过程中累加的和会持续增长,会导致学习率不断变小,最终趋向于0,使得训练提前结束
- 适合处理稀疏数据
Adadelta
- Adadelta是Adagrad的扩展算法,改进Adagrad学习率单调递减的问题
- Adadelta无需设置默认的学习率,训练初期、中期速度较快,后期会在局部最小值周围抖动
{ p k + 1 = R M S [ p ] k R M S [ ∇ f i ( w k ) ] ∇ f i ( w k ) w k + 1 = w k − p k + 1 (7) \begin{cases}p_{k+1}=\frac{RMS[p]_k}{RMS[\nabla f_i(w_k)]}\nabla f_i(w_k)\\w_{k+1}=w_k-p_{k+1}\end{cases} \tag{7} {pk+1=RMS[∇fi(wk)]RMS[p]k∇fi(wk)wk+1=wk−pk+1(7)
其中 R M S [ p ] k RMS[p]_k RMS[p]k是参数更新的均方根误差
{ R M S [ p ] k = E [ p 2 ] k + ϵ E [ p 2 ] k = γ E [ p 2 ] k − 1 + ( 1 − γ ) p k 2 \begin{cases}RMS[p]_k=\sqrt{E[p^2]_k+\epsilon}\\E[p^2]_k=\gamma E[p^2]_{k-1}+(1-\gamma)p^2_k\end{cases} {RMS[p]k=E[p2]k+ϵE[p2]k=γE[p2]k−1+(1−γ)pk2
R M S [ ∇ f i ( w k ) ] RMS[\nabla f_i(w_k)] RMS[∇fi(wk)]是梯度的均方根误差
{ R M S [ ∇ f i ( w k ) ] = E [ ∇ 2 f i ( w k ) ] + ϵ E [ ∇ 2 f i ( w k ) ] = λ E [ ∇ 2 f i ( w k − 1 ) ] + ( 1 − λ ) ∇ 2 f i ( w k ) \begin{cases}RMS[\nabla f_i(w_k)]=\sqrt{E[\nabla ^2f_i(w_k)]+\epsilon}\\E[\nabla ^2f_i(w_k)]=\lambda E[\nabla ^2f_i(w_{k-1})]+(1-\lambda)\nabla ^2f_i(w_k)\end{cases} {RMS[∇fi(wk)]=E[∇2fi(wk)]+ϵE[∇2fi(wk)]=λE[∇2fi(wk−1)]+(1−λ)∇2fi(wk)
RMSprop
- RMSprop也是针对Adagrad学习率单调递减问题的改进
- RMSprop是Adadelta的一个特例,但仍需要一个全局学习率
- RMSprop适合处理非平稳目标,对RNN效果较好
{ p k + 1 = γ R M S [ ∇ f i ( w k ) ] ∇ f i ( w k ) w k + 1 = w k − p k + 1 (8) \begin{cases}p_{k+1}=\frac{\gamma}{RMS[\nabla f_i(w_k)]}\nabla f_i(w_k)\\w_{k+1}=w_k-p_{k+1}\end{cases} \tag{8} {pk+1=RMS[∇fi(wk)]γ∇fi(wk)wk+1=wk−pk+1(8)
与Adadelta一样, R M S [ ∇ f i ( w k ) ] RMS[\nabla f_i(w_k)] RMS[∇fi(wk)]是梯度的均方根误差,RMSprop建议 λ = 0.9 \lambda=0.9 λ=0.9, γ = 0.001 \gamma=0.001 γ=0.001
Adam
- Adam(自适应矩估计)本质上是带了动量项的RMSprop
- Adam同时估计了梯度的动量(一阶矩估计)和方差的动量(二阶矩估计)
- Adam使用了偏置校正,对每次迭代的学习率有动态约束,参数比较平稳
w k + 1 = w k − γ v ^ k + ϵ m ^ k (9) w_{k+1}=w_k-\frac{\gamma}{\sqrt{\hat{v}_k}+\epsilon}\hat{m}_k\tag{9} wk+1=wk−v^k+ϵγm^k(9)
其中
{ m k = μ ∗ m k − 1 + ( 1 − μ ) ∇ f i ( w k ) m ^ k = m k 1 − μ k \begin{cases}m_k=\mu*m_{k-1}+(1-\mu)\nabla f_i(w_k)\\\hat{m}_k=\frac{m_k}{1-\mu^k}\end{cases} {mk=μ∗mk−1+(1−μ)∇fi(wk)m^k=1−μkmk
{ v k = ν ∗ v k − 1 + ( 1 − ν ) ∇ f i 2 ( w k ) v ^ k = v k 1 − ν k \begin{cases}v_k=\nu*v_{k-1}+(1-\nu)\nabla f_i^2(w_k)\\\hat{v}_k=\frac{v_k}{1-\nu^k}\end{cases} {vk=ν∗vk−1+(1−ν)∇fi2(wk)v^k=1−νkvk - 一般取 μ = 0.9 \mu=0.9 μ=0.9, ν = 0.999 \nu=0.999 ν=0.999,初始化 m k = v k = 0 m_k=v_k=0 mk=vk=0
- 以上的 m ^ k \hat{m}_k m^k和 v ^ k \hat{v}_k v^k分别是对 m k m_k mk和 v k v_k vk的校正,因为更新过程尤其是初始阶段 m k m_k mk和 v k v_k vk倾向于0
经验
- 对于稀疏数据,尽量使用学习率可自适应的优化方法,并且最好采用默认值
- Adadelta,RMSprop和Adam可以视为一类算法,都是Adagrad的改进,它们在相似场景下表现也相似
- 综合看来Adam因为校正的步骤是可以优先考虑的方法
参考
[1] https://www.cnblogs.com/hejunlin1992/p/13027288.html
[2] https://zhuanlan.zhihu.com/p/64113429
[3] https://zhuanlan.zhihu.com/p/22252270