无约束优化
2022-08-27

 

符号定义

  1. n:训练样本数目

  2. x:训练样本

  3. y:label

  4. w:参数向量

  5. L:损失函数,以平方损失为例,L=1ni=1n(wxiyi)2

  6. Li:第i个训练样本的损失函数,以平方损失为例,Li=(wxiyi)2

  7. t:时间步

  8. gtt个时间步的参数的梯度,以平方损失函数为例

    (1)gt=g(wt)=Lwt=1ni=1n2xi(wtxiyi)
  9. f:函数f的梯度

 

方向导数

方向导数定义

z=f(x,y)(x0,y0)的某邻域内有定义,l=(cosα,cosβ)是平面上一个单位向量,若limt0f(x0+tcosα,y0+tcosβ)f(x0,y0)t存在,则该极限值就是f(x,y)(x0,y0)点沿l方向的方向导数,记作fl|(x0,y0)

f(x,y)可微,则fl|(x0,y0)=fx(x0,y0)cosα+fy(x0,y0)cosβ

陷阱:上述公式仅限于可微前提下,若不可微,必须回归方向导数的定义。

 

方向导数与偏导数的关系

方向导数定义:

(2)limt0f(x0+tcosα,y0+tcosβ)f(x0,y0)t

偏导数定义:

(3)fx=limΔx0f(x0+Δx,y0)f(x0,y0)Δxfy=limΔy0f(x0,y0+Δy)f(x0,y0)Δy

所以:

(4)l=(1,0)=limt0f(x0+t,y0)f(x0,y0)t=fxl=(0,1)=limt0f(x0,y0+t)f(x0,y0)t=fy

结论:

(5)fx沿(1,0)fy沿(0,1)

 

梯度

z=f(x,y)(x0,y0)处可微,梯度定义如下:

(6)f=gradf=(fx,fy)=fxi+fyj

梯度与方向导数的关系

f(x,y)可微的前提下:

(7)fl|(x0,y0)=fx(x0,y0)cosα+fy(x0,y0)cosβ=gradfl=|gradf||l|cosθθgradfl

结论:沿梯度方向的方向导数最大,由于导数为正,函数递增,因此在(x0,y0)的邻域内沿梯度方向函数增加最快,沿负梯度方向函数减小最快。

 

梯度与等高线的关系

结论:梯度垂直于等高线的切线。

 

梯度下降法

设损失函数为L(w),优化目标为:

(8)minL(w)

则使用梯度下降法求解的步骤为:

(9)wt=wt1lrLwt1=wt1lrg(wt1)=wt1lrgt1

假设有n个样本点,特征值为x,真实值为y,预测值为wx,定义损失函数为L(w)=i=0n(wxy)2,那么,参数的更新公式为:

(10)wt=wt1lrLwt1=wt1lr(i=0n2x(wt1xy))

因此,梯度下降的时间复杂度是O(n)

随机梯度下降法

相比于梯度下降使用全量数据更新梯度,随机梯度下降法基于均匀分布每次选择一个样本更新梯度,时间复杂度由O(n)降为O(1)

 

小批量梯度下降法

介于梯度下降法和随机梯度下降法之间,每次使用均匀分布选择B个训练样本组成小批量,其时间复杂度为O(B)

 

梯度下降算法的缺点

  1. 下降速度慢
  2. 可能会在沟壑两边持续震荡,停留在一个局部最优点

 

动量法

(11)vt=γvt1+ηg(wt1)wt=wt1vtvγgη

动量

假设起始点为A,起始点的动量初始化为0:

  1. A -> B:方向为 点A的负梯度方向
  2. B -> C:方向为 点B的负梯度方向+点A的梯度方向

 

NAG(Nesterov Accelerated Gradient)

(12)gt1=g(wt1γvt1)vt=γvt1+ηgt1wt=wt1vtvγgη

 

牛顿法

零点求解

零点

求解目标: f(x)=0

迭代步骤:

(13)1.(x0,y0)2.(x0,y0)f(x)线 yf(x0)xx0=f(x0)y=f(x0)+f(x0)(xx0)3.线xx1=x0f(x0)f(x0)4.xn+1=xnf(xn)f(xn)5.

牛顿迭代法执行步骤示例:

牛顿法

牛顿法

设损失函数为L(w),优化目标为:

(14)minL(w)

假设L(w)的极小值点存在,则求L(w)的最小值等价于求L(w)=0的点。

g(x)=L(w),根据牛顿迭代法,如果要求g(x)=0的点,则迭代公式为:

(15)xn+1=xng(xn)g(xn)=xnf(xn)f(xn)

AdaGrad

在时间步t=0,AdaGrad将s0中的每个元素都初始化为0

在时间步t,首先将小批量随机梯度g(wt1)按元素平方和累加到变量st

(16)st=st1+g(wt1)g(wt1)

将目标函数自变量中每个元素的学习率通过按元素运算重新调整:

(17)wt=wt1ηst+ϵg(wt1)ηϵ106

st一直在累加按元素平方的小批量随机梯度,所以目标函数自变量每个元素的学习率在迭代过程中一直在降低(或不变)。因此,当学习率在迭代早期降得较快且当前解依然不佳时,AdaGrad算法在迭代后期由于学习率过小,可能较难找到一个有用的解。

 

RMSProp

在时间步t>0时,

(18)st=γst1+(1γ)gt1gt1wt=wt1ηst+ϵg(wt1)γ0γ<1ηϵ106

因为RMSProp算法的状态变量st是对平方项g(wt1)g(wt1)的指数加权移动平均,因此可以看作是最近1/(1γ)个时间步的小批量随机梯度平方项的加权平均。因此,自变量每个元素的学习率在迭代过程中就不再一直降低(或不变)。

 

AdaDelta

在时间步t=0时,st所有元素被初始化为0,状态变量Δwt所有元素被初始化为0

在时间步t>0时:

(19)st=ρst1+(1ρ)g(wt1)g(wt1)

计算自变量的变化量:

(20)gt=Δwt1+ϵst+ϵg(wt1)ϵ105

更新自变量:

(21)wt=wt1gt

使用Δwt来记录自变量变化量gt按元素平方的指数加权移动平均:

(22)Δwt=ρΔwt1+(1ρ)gtgt

可以看到,如不考虑ϵ的影响,AdaDelta算法跟RMSProp算法的不同之处在于使用Δwt1来代替学习率η

 

Adam

Adam = Adaptive+Momentum

在时间步t=0,将vtst初始化为0

在时间步t>0

(23)vt=β1vt1+(1β1)g(wt1)st=β2st1+(1β2)g(wt1)g(wt1)β1β20β1<10.90β2<10.999

无偏修正:

(24)v^t=vt1β1ts^t=st1β2t

更新参数:

(25)wt=wt1ηv^ts^t+ϵ

NAdam

NAG回顾与改写

回顾NAG的公式:

(26)gt1=g(wt1γvt1)vt1=γvt2+ηgt1wt=wt1vt1vγgη

NAG的核心在于,计算梯度时使用了wt1γvt1 。NAdam中提出了一种公式变形的思路,可以理解为:只要能在梯度计算中考虑到,即能达到 Nesterov 的效果。既然如此,那么在计算梯度时,可以仍然使用原始公式gt1=g(wt1)进行计算,但在计算wt时,使用未来时刻的动量,即wt=wt1vt,那么理论上所达到的效果是类似的。

理论上,下一刻的动量为:

(27)vt=γvt1+ηgt

在假定连续两次的梯度变化不大的情况下,那么:

(28)gtgt1vt=γvt1+ηgtγvt1+ηgt1=v¯t

此时,可使用v¯t近似表示未来动量,加入到w的迭代公式中。

因此,原始NAG的公式可以修改为:

(29)gt1=g(wt1)vt1=γvt2+ηgt1v¯t=γvt1+ηgt1wt=wt1v¯tvγgη

NAdam

类似的,在Adam可以加入v^tv¯t的变换,将Adam中的v^t展开有:

(30)v^t=vt1β1t=β1vt11β1t+(1β1)g(wt1)1β1t

引入v¯t替换v^t(与Adam的不同之处):

(31)v¯t=β1vt1β1t+1+(1β1)g(wt1)1β1t

再进行更新:

(32)wt=wt1ηv¯ts^t+ϵ

常见问题

  1. 为什么深度学习不使用牛顿法或者拟牛顿法?

    • 牛顿法需要用到梯度和Hessian矩阵,这两个都难以求解。因为很难写出深度神经网络拟合函数的表达式,遑论直接得到其梯度表达式,更不要说得到基于梯度的Hessian矩阵了。
    • 即使可以得到梯度和Hessian矩阵,当输入向量的维度N较大时,Hessian矩阵的大小是N×N,所需要的内存非常大。
    • 在高维非凸优化问题中,鞍点相对于局部最小值的数量非常多,而且鞍点处的损失值相对于局部最小值处也比较大。而二阶优化算法是寻找梯度为0的点,所以很容易陷入鞍点。
  2. 如何选择合适的优化算法?

参考文档

  1. 通俗理解 Adam 优化器 - 知乎 (zhihu.com)

  2. Adam那么棒,为什么还对SGD念念不忘?一个框架看懂深度学习优化算法 (qq.com)

  3. https://www.zhihu.com/question/36301367

  4. https://www.cnblogs.com/yanghh/p/13739024.html

  5. SGD optimizer with momentum (dejanbatanjac.github.io)

  6. Nesterov加速和Momentum动量方法 - 知乎 (zhihu.com)

  7. (133条消息) Adam优化器偏差矫正的理解飞奔的帅帅的博客-CSDN博客adam偏差修正

  8. (2 条消息) 深度学习中的优化算法 NAdam 和 Nesterov + Adam 有区别么、区别在哪? - 知乎 (zhihu.com)

  9. 深度学习优化算法(牛顿法-->梯度下降法-->Nadam) - liujy1 - 博客园 (cnblogs.com)

  10. 路遥知马力——Momentum - 知乎 (zhihu.com)

  11. 比Momentum更快:揭开Nesterov Accelerated Gradient的真面目 - 知乎 (zhihu.com)