【关于 优化算法】那些你不知道的事

DayNightStudy

共 5983字,需浏览 12分钟

 ·

2021-04-14 06:57


作者:杨夕、芙蕖、李玲、陈海顺、twilight、LeoLRH、JimmyDU、艾春辉、张永泰、金金金

面筋地址:https://github.com/km1994/NLP-Interview-Notes

个人笔记:https://github.com/km1994/nlp_paper_study

一、动机篇

1.1 为什么需要 优化函数?

在机器学习算法中,通常存在很多问题并没有最优的解,或是要计算出最优的解要花费很大的计算量,面对这类问题一般的做法是利用迭代的思想尽可能的逼近问题的最优解。将解决此类优化问题的方法叫做优化算法,优化算法本质上是一种数学方法。

1.2 优化函数的基本框架是什么?

  • 基本框架:定义当前时刻待优化参数为θtRd,损失函数为J(θ),学习率为η,参数更新框架为:
  1. 计算损失函数关于当前参数的梯度:gt=J(θt)
  2. 根据历史梯度计算一阶动量(一次项)和二阶动量(二次项):mt=ϕ(g1,g2,...,gt),Vt=ψ(g1,g2,...,gt)
  3. 计算当前时刻的下降梯度:Δθt=ηmtVt
  4. 根据下降梯度更新参数:θt+1=θt+Δθt

二、优化函数介绍篇

2.1 梯度下降法是什么?

每次使用一批数据进行梯度的计算,而非计算全部数据的梯度,因为如果每次计算全部数据的梯度,会导致运算量加大,运算时间变长,容易陷入局部最优解,而随机梯度下降可能每次不是朝着真正最小的方向,这样反而可以跳出局部的最优解。

2.2 随机梯度下降法是什么?

  • 介绍:由于SGD没有动量的概念,也即没有考虑历史梯度,所以当前时刻的动量即为当前时刻的梯度mt=gt,且二阶动量Vt=E,所以SGD的参数更新公式为

    Δθt=ηgtθt+1=θtηgt
  • 优点:每次使用一批数据进行梯度的计算,而非计算全部数据的梯度,因为如果每次计算全部数据的梯度,会导致运算量加大,运算时间变长,容易陷入局部最优解,而随机梯度下降可能每次不是朝着真正最小的方向,这样反而可以跳出局部的最优解。

  • 缺点:下降速度慢,而且可能会在沟壑(还有鞍点)的两边持续震荡,停留在一个局部最优点。

2.3 Momentum 是什么?

  • 介绍:为了抑制SGD的震荡,SGDM认为梯度下降过程可以加入惯性。下坡的时候,如果发现是陡坡,那就利用惯性跑的快一些。SGDM全称是SGD with momentum,在SGD基础上引入了一阶动量。而所谓的一阶动量就是该时刻梯度的指数加权移动平均值:ηmt:=βmt1+ηgt(其中当前时刻的梯度gt并不严格按照指数加权移动平均值的定义采用权重1β,而是使用我们自定义的学习率η),那么为什么要用移动平均而不用历史所有梯度的平均?因为移动平均存储量小,且能近似表示历史所有梯度的平均。由于此时仍然没有二阶动量,所以Vt=E,那么SGDM的参数更新公式为

    Δθt=ηmt=(βmt1+ηgt)θt+1=θt(βmt1+ηgt)
  • 所以,当前时刻参数更新的方向不光取决于当前时刻的梯度,还取决于之前时刻的梯度,特别地,当β=0.9时,mt近似表示的是前10个时刻梯度的指数加权移动平均值,而且离得越近的时刻的梯度权重也越大。

  • 优点:在随机梯度下降法的基础上,增加了动量(Momentum)的技术。其核心是通过优化相关方向的训练和弱化无关方向的振荡,来加速SGD训练。Momentum的方法能够在一定程度上缓解随机梯度下降法收敛不稳定的问题,并且有一定的摆脱陷入局部最优解的能力。

  • 缺点:对于比较深的沟壑有时用Momentum也没法跳出

    其中0β<1,v0=0。显然,由上式可知,t时刻的指数加权移动平均值其实可以看做前t时刻所有观测值的加权平均值,除了第t时刻的观测值权重为1β外,其他时刻的观测值权重为(1β)βi。由于通常对于那些权重小于1e的观测值可以忽略不计,所以忽略掉那些观测值以后,上式就可以看做在求加权移动平均值。那么哪些项的权重会小于1e呢?由于

    limn+(11n)n=1e0.3679

    若令n=11β,则

    limn+(11n)n=limβ1(β)11β=1e0.3679

    所以,当β1时,那些i11βθti的权重(1β)βi一定小于1e。代入计算可知,那些权重小于1e的观测值就是近11β个时刻之前的观测值。例如当t=20,β=0.9时,θ1,θ2,..,θ9,θ10的权重都是小于1e的,因此可以忽略不计,那么此时就相当于在求θ11,θ12,..,θ19,θ20这最近10个时刻的加权移动平均值。所以指数移动平均值可以近似看做在求最近11β个时刻的加权移动平均值,β常取0.9。由于当t较小时,指数加权移动平均值的偏差较大,所以通常会加上一个修正因子1βt,加了修正因子后的公式为

    vt=βvt1+(1β)θt1βt

    显然,当t很小时,修正因子1βt会起作用,当t足够大时(1βt)1,修正因子会自动退场。

    • 指数加权移动平均值(exponentially weighted moving average,EWMA):假设vt1t1时刻的指数加权移动平均值,θtt时刻的观测值,那么t时刻的指数加权移动平均值为

      vt=βvt1+(1β)θt=(1β)θt+i=1t1(1β)βiθti

2.4 SGD with Nesterov Acceleration 是什么?

  • 介绍:除了利用惯性跳出局部沟壑以外,我们还可以尝试往前看一步。想象一下你走到一个盆地,四周都是略高的小山,你觉得没有下坡的方向,那就只能待在这里了。可是如果你爬上高地,就会发现外面的世界还很广阔。因此,我们不能停留在当前位置去观察未来的方向,而要向前一步、多看一步、看远一些。NAG全称Nesterov Accelerated Gradient,是在SGD、SGD-M的基础上的进一步改进,改进点在于当前时刻梯度的计算,我们知道在时刻t的主要下降方向是由累积动量决定的,自己的梯度方向说了也不算,那与其看当前梯度方向,不如先看看如果跟着累积动量走了一步,那个时候再怎么走。也即在Momentum的基础上将当前时刻的梯度gt换成下一时刻的梯度J(θtβmt1),由于此时也没有考虑二阶动量,所以Vt=E,NAG的参数更新公式为

    Δθt=ηmt=(βmt1+ηJ(θtβmt1))θt+1=θt(βmt1+ηJ(θtβmt1))
  • 优点:在Momentum的基础上进行了改进,比Momentum更具有前瞻性,除了利用历史梯度作为惯性来跳出局部最优的沟壑以外,还提前走一步看看能否直接跨过沟壑。

2.5 Adagrad 是什么?

  • 介绍:此前我们都没有用到二阶动量。二阶动量的出现,才意味着“自适应学习率”优化算法时代的到来。SGD及其变种以同样的学习率更新每个维度的参数(因为θt通常是向量),但深度神经网络往往包含大量的参数,这些参数并不是总会用得到(想想大规模的embedding)。对于经常更新的参数,我们已经积累了大量关于它的知识,不希望被单个样本影响太大,希望学习速率慢一些;对于偶尔更新的参数,我们了解的信息太少,希望能从每个偶然出现的样本身上多学一些,即学习速率大一些。因此,AdaGrad则考虑对于不同维度的参数采用不同的学习率,具体的,对于那些更新幅度很大的参数,通常历史累计梯度的平方和会很大,相反的,对于那些更新幅度很小的参数,通常其累计历史梯度的平方和会很小(具体图示参见:https://zhuanlan.zhihu.com/p/29920135 )。所以在一个固定学习率的基础上除以历史累计梯度的平方和就能使得那些更新幅度很大的参数的学习率变小,同样也能使得那些更新幅度很小的参数学习率变大,所以AdaGrad的参数更新公式为

    vt,i=t=1tgt,i2Δθt,i=ηvt,i+ϵgt,iθt+1,i=θt,iηvt,i+ϵgt,i

其中gt,i2表示第t时刻第i维度参数的梯度值,ϵ是防止分母等于0的平滑项(常取一个很小的值1e8)。显然,此时上式中的ηvt,i+ϵ这个整体可以看做是学习率,分母中的历史累计梯度值vt,i越大的参数学习率越小。上式仅仅是第t时刻第i维度参数的更新公式,对于第t时刻的所有维度参数的整体更新公式为

Vt=diag(vt,1,vt,2,...,vt,d)Rd×dΔθt=ηVt+ϵgtθt+1=θtηVt+ϵgt

注意,由于Vt是对角矩阵,所以上式中的ϵ只用来平滑Vt对角线上的元素。

  • 优点:Adagrad即adaptive gradient,是一种自适应学习率的梯度法。它通过记录并调整每次迭代过程中的前进方向和距离,使得针对不同问题都有一套自适应学习率的方法。Adagrad最大的优势是不需要手动来调整学习率,但与此同时会降低学习率。
  • 缺点:随着时间步的拉长,历史累计梯度平方和vt,i会越来越大,这样会使得所有维度参数的学习率都不断减小(单调递减),无论更新幅度如何。而且,计算历史累计梯度平方和时需要存储所有历史梯度,而通常神经网络的参数不仅多维度还高,因此存储量巨大。

2.6 RMSProp/AdaDelta 是什么?

  • 介绍a:由于AdaGrad单调递减的学习率变化过于激进,我们考虑一个改变二阶动量计算方法的策略:不累积全部历史梯度,而只关注过去一段时间窗口的下降梯度,采用Momentum中的指数加权移动平均值的思路。这也就是AdaDelta名称中Delta的来历。首先看最简单直接版的RMSProp,RMSProp就是在AdaGrad的基础上将普通的历史累计梯度平方和换成历史累计梯度平方和的指数加权移动平均值,所以只需将AdaGrad中的vt,i的公式改成指数加权移动平均值的形式即可,也即

    vt,i=βvt1,i+(1β)gt,i2Vt=diag(vt,1,vt,2,...,vt,d)Rd×dΔθt=ηVt+ϵgtθt+1=θtηVt+ϵgt

    而AdaDelta除了对二阶动量计算指数加权移动平均以外,还对当前时刻的下降梯度Δθt也计算一个指数加权移动平均,具体地

    E[Δθ2]t,i=γE[Δθ2]t1,i+(1γ)Δθt,i2

    由于Δθt,i2目前是未知的,所以只能用t1时刻的指数加权移动平均来近似替换,也即

    E[Δθ2]t1,i=γE[Δθ2]t2,i+(1γ)Δθt1,i2

    除了计算出t1时刻的指数加权移动平均以外,AdaDelta还用此值替换我们预先设置的学习率η,因此,AdaDelta的参数更新公式为

    vt,i=βvt1,i+(1β)gt,i2Vt=diag(vt,1,vt,2,...,vt,d)Rd×dE[Δθ2]t1,i=γE[Δθ2]t2,i+(1γ)Δθt1,i2Θt=diag(E[Δθ2]t1,1,E[Δθ2]t1,2,...,E[Δθ2]t1,d)Rd×dΔθt=Θt+ϵVt+ϵgtθt+1=θtΘt+ϵVt+ϵgt

显然,对于AdaDelta算法来说,已经不需要我们自己预设学习率η了,只需要预设βγ这两个指数加权移动平均值的衰减率即可。

  • 优点:和AdamGrad一样对不同维度的参数采用不同的学习率,同时还改进了AdamGrad的梯度不断累积和需要存储所有历史梯度的缺点(因为移动平均不需要存储所有历史梯度)。特别地,对于AdaDelta还废除了预设的学习率,当然效果好不好还是需要看实际场景。

2.7 Adam 是什么?

  • 介绍:Adam即Adaptive Moment Estimation,是能够自适应时刻的估计方法,能够针对每个参数,计算自适应学习率。这是一种综合性的优化方法,在机器学习实际训练中,往往能够取得不错的效果。

Adam=adagrad(用于处理稀疏的梯度)+RMSPro(处理非常态数据)

  • 流程:
  1. 首先计算一阶动量
mt=β1mt1+(1β1)gt
  1. 类似AdaDelta和RMSProp计算二阶动量
vt,i=β2vt1,i+(1β2)gt,i2Vt=diag(vt,1,vt,2,...,vt,d)Rd×d
  1. 分别加上指数加权移动平均值的修正因子
m^t=mt1β1tv^t,i=vt,i1β2tV^t=diag(v^t,1,v^t,2,...,v^t,d)Rd×d

所以,Adam的参数更新公式为

Δθt=ηV^t+ϵm^tθt+1=θtηV^t+ϵm^t
  • 问题:
    • 问题一、某些情况不收敛:由于Adam中的二阶动量非单调变化,导致Adam在训练后期容易出现学习率震荡,使得模型收敛不了【这也是为什么现在 SGD还被使用的原因】;
    • 问题二、有可能错过全局最优解。由于后期Adam学习率太低,影响其收敛;

2.8 Nadam 是什么?

  • 介绍:Adam只是将Momentum和Adaptive集成了,但是没有将Nesterov集成进来,而Nadam则是在Adam的基础上将Nesterov集成了进来,也即Nadam = Nesterov + Adam。具体思想如下:由于NAG 的核心在于,计算当前时刻的梯度gt时使用了「未来梯度」J(θtβmt1)。NAdam 提出了一种公式变形的思路,大意可以这样理解:只要能在梯度计算中考虑到「未来因素」,就算是达到了 Nesterov 的效果。既然如此,我们就不一定非要在计算gt时使用「未来因素」,可以考虑在其他地方使用「未来因素」。具体地,首先NAdam在Adam的基础上将m^t展开
θt+1=θtηV^t+ϵm^t=θtηV^t+ϵ(β1mt11β1t+(1β1)gt1β1t)

此时,如果我们将第t1时刻的动量mt1用第t时刻的动量mt近似代替的话,那么我们就引入了「未来因素」,所以将mt1替换成mt即可得到Nadam的表达式

θt+1=θtηV^t+ϵ(β1mt1β1t+(1β1)gt1β1t)=θtηV^t+ϵ(β1m^t+(1β1)gt1β1t)

三、优化函数学霸笔记篇

作者:言溪

参考资料

  1. 一个框架看懂优化算法之异同 SGD/AdaGrad/Adam
  2. https://blog.csdn.net/u010089444/article/details/76725843
  3. 优化算法之指数移动加权平均




浏览 8
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报