2019-12-02 13:48:53 ly18846826264 阅读数 22

Optimizer in Deep Learning

0-关于优化的基础

神经网络可以简单地看成是找一个很好的非线性函数来进行端到端的映射,开始时先给了一个初始化(权重以及偏置),通过不断最小化损失函数,对神经网络这个函数来进行更新。由于激励函数的存在(sigmoid、 tanh、relu),这个函数是一个非线性的,于是优化问题就是非线性优化问题,目前还没有通用的解法来求解。

  • 梯度下降
    目前对于无约束优化问题最简单有效的当属梯度下降法,设输入x=(x1,x2,x3,,xn)Tx = (x_1,x_2, x_3, \cdots, x_n)^T,对函数f(x)f(x),定义函数的梯度为
    xf(x)=(f(x)x1,f(x)x2,,f(x)x3,,f(x)xn,)T\nabla _x f(x) = ( \frac{\partial f(x)}{\partial x_1}, \frac{\partial f(x)}{\partial x_2},, \frac{\partial f(x)}{\partial x_3}, \cdots, \frac{\partial f(x)}{\partial x_n},)^T

f(x)f(x)沿方向uu的方向导数定义为αf(x+αu)\frac{\partial }{\partial \alpha} f(x+\alpha u),通过链式法则,可以写成uTxf(x)u^T\nabla _xf(x)

为了最优化f(x)f(x),我们的目标是找一个方向使得函数减小的最快,即
minuuTxf(x)s.t.   u2=1\min \limits _u u^T\nabla _xf(x) \\ s.t. \ \ \ ||u||_2=1最小的值是一个向量内积形式,于是假设二者夹角为θ\theta,则上述问题等价于u2xf(x)2cosθ||u||_2||\nabla _xf(x)||_2 \cos\theta,
考虑到u2=1||u||_2=1,且梯度的大小与夹角无关,于是问题就成了
minθcosθ\min \limits _\theta\cos \theta答案肯定是θ=π\theta = \pi,也即是说uu的方向是沿着与梯度相反的方向。
得出结论:梯度的方向是函数值增加最快的方向,梯度值的反方向是函数值减小最快的方向。

梯度下降法就是不断迭代,每次沿着梯度方向前进一点,直到梯度的值等于0或在某个允许的范围内。

方向有了,但前进多少呢?这就是关于学习率(或者称为步长)的选择问题。

  1. 固定长度的η\eta
  2. 线性搜索:给定多个η\eta,选择使得更新后的函数值最小的那个
  3. 最速下降法:这个学习率的选取直接影响了学习的快慢与效果,它满足η=argminηf(xηxf(x))\eta = \arg \min \limits _\eta f(x-\eta \nabla_xf(x))于是就继续求解子优化问题

在这里插入图片描述

  • 海森矩阵
    一阶导数反映斜率,二阶导数反映曲率。
    在这里插入图片描述
    上图说明,同样在梯度是1的情况下,步长选择η\eta,二阶导为负时,实际走得更多,二阶导为正时,实际走的更少。所以,好的优化是需要考虑二阶导数的。

当输入是多维时,就有了海森矩阵Hi,j=2xixjf(x)H_{i,j} = \frac{\partial^2}{\partial x_i \partial x_j}f(x)

考虑二阶导之后,就有牛顿法、拟牛顿法等有效算法,但在深度学习中用得不多,这里留待以后补充。

1-梯度下降法

主要有三种常用算法:随机梯度下降(SGD, Stochastic Gradient Descent)、Mini-批处理梯度下降(Mini-Batch Gradient Descent)和批处理梯度下降(BGD, Batch Gradient Descent),三者的区别在于神经网络前向计算时使用了多少样本,分别对应单个样本、部分样本和全部样本。

梯度下降算法:

输入:学习率η\eta,初始参数θ\theta
迭代,直到满足条件
1、从训练集随机抽取m个(m对应一个、一部分或所有),对应标签为{y1,y2,,ym}\{ y_1, y_2, \cdots,y_m\}
2、计算梯度g1mi=1mθL(f(xi;θ),yi)g \leftarrow \frac{1}{m}\sum\limits _{i=1}^m \nabla _\theta L(f(x_i;\theta), y_i)3、更新参数:θθηg\theta \leftarrow \theta - \eta g

  • 使用随机梯度下降会引入噪声,即单个样本的梯度不一定是整个训练集的梯度方向,所以它的更新曲线更加曲折,但已经证明,只要噪声不是特别大也能很好的收敛;且对于大型数据集,速度更快
  • 使用Mini-Batch是的Batch大小很重要,太大和太小都不好,需要调到比较合适;它每次更新用到了多个样本,所以能有效降低参数更新时的方差,且用到了矩阵操作,Mini-Batch用到的最多
  • 批处理抗噪能力最好,但训练速度慢,容易陷入局部最优解

2-动量(Momentum)方法

使用梯度下降算法的缺点时,虽然每次的方向找对了(梯度方向),但是不知道该迈多大的步子(学习率η\eta),比如在曲率很小的时候可以大胆向前走,而在曲率很复杂时需要慢点走,这样即使在接近最优值时,也不会学习率固定导致收敛变慢。

在这里插入图片描述

于是动量方法就通过类比物理中位移、速度、加速度关系,将算出的梯度视为加速度,然后更新速度v,最后由v来更新参数,多了一步v的缓存过程。这里简单推导(本身就是种类比,不需要太计较物理意义):

θ\theta为位移,LL是损失函数,也是势能,于是力F=ηθL(f(x;θ),y)F = -\eta \nabla _\theta L(f(x;\theta),y),根据动量定理
FΔt=Δ(m×v)F\Delta t = \Delta(m \times v)设作用时间和质量均为单位值,于是有F=ΔvF = \Delta v,即ηθL=vtv0- \eta \nabla _\theta L = v_t-v_0,对速度加一个衰减系数α\alpha,则有vαvηθLv \leftarrow \alpha v - \eta \nabla _\theta L这段时间的位移增量vΔt=vv\Delta t = v,这里考虑段时间内的速度变化不大,所以使用了初始速率,当然也可以用更新后的速率,因此有位移公式θ=θ+v\theta = \theta + v使用动量的SGD算法:

输入:学习率η\eta,初始参数θ\theta,初始速度vv,速度衰减参数α\alpha
迭代,直到算法停止
1、从训练集中随机采样m个样本(一个、一部分或全部),对应标签为{y1,y2,,ym}\{ y_1, y_2, \cdots,y_m\}
2、计算梯度g1mi=1mθL(f(xi;θ),yi)g \leftarrow \frac{1}{m}\sum\limits _{i=1}^m \nabla _\theta L(f(x_i;\theta), y_i)3、更新速度:vαv+ηgv \leftarrow \alpha v + \eta g
4、更新参数:θ=θ+v\theta = \theta + v

为什么有效:

  • 在曲率变化较小的地方,应该大胆更新使劲走,SGD会走固定的步长,而加入Momentum之后,前一时刻的梯度存在v中,因为曲率变化不大,所以v的新加的值与上个时刻的v的方向基本相同,因此不怎么抵消,所以能使劲走;
  • 而在曲率变化大的地方,上个时刻v与现在的梯度方向可能不太一样,所以对θ\theta的更新就会通过二者的垂直分量不断抵销使得走的步子小了(当然方向也会有所折中)。

在这里插入图片描述

3-牛顿动量

也称作Nesterov Accelerated Gradient(NGA)Nesterov\ Accelerated\ Gradient(NGA),是Momentum的变种,区别在于计算梯度时使用不是上一时刻的θ\theta,而是更新后的θ+αv\theta+\alpha v
vαvηθJ(θ+αv)θθ+vv \leftarrow \alpha v- \eta \nabla _\theta J(\theta+\alpha v)\\ \theta \leftarrow \theta+v关键之处就在于计算的梯度,相当于加了矫正因子,也就是作用力超前一步知道作用的方向,这样可以防止走得过快,刹不住,同时也减小了震荡。

在这里插入图片描述

4-AdaGrad

我们希望在学习过程中,梯度长大了,要学会自适应步长。该方法的思想是:参数空间每个方向的学习率反比于该方向上梯度分量所有历史平方值之和的平方根。

  • 学习率是个正的,用平方和的平均值而不是平均是怕算出来某个分量为负
  • 用历史之和是因为要看平时表现,不能看一次半次的

AdaGrad算法:

输入学习率η\eta,初始参数θ\theta,足够小的常数δ\delta(防止0做除数时无法计算)
初始化梯度累计变量rr
迭代,直到停止条件
1、从训练集中随机采样m个样,对应标签为{y1,y2,,ym}\{ y_1, y_2, \cdots,y_m\}
2、计算梯度g1mi=1mθL(f(xi;θ),yi)g \leftarrow \frac{1}{m}\sum\limits _{i=1}^m \nabla _\theta L(f(x_i;\theta), y_i)3、计算累计平方梯度:rr+ggr \leftarrow r+ g \odot g
4、更新参数:θθηδ+rg\theta \leftarrow \theta - \frac{\eta}{\delta+\sqrt{r}}\odot g

用这个算法的一个问题就是学习率早期降的太快,到了后期,可能还没到最优值,学习率已经没了。

5-RMSProp

看来用梯度历史的平方和有点问题,老了学不动了,所以将求和改成了指数加权的移动平均。

RMSProp算法:

输入学习率η\eta,初始参数θ\theta,衰减速率ρ\rho,足够小的常数δ\delta(防止0做除数时无法计算)
初始化梯度累计变量rr
迭代,直到停止条件
1、从训练集中随机采样m个样,对应标签为{y1,y2,,ym}\{ y_1, y_2, \cdots,y_m\}
2、计算梯度g1mi=1mθL(f(xi;θ),yi)g \leftarrow \frac{1}{m}\sum\limits _{i=1}^m \nabla _\theta L(f(x_i;\theta), y_i)3、计算平方梯度:rρr+(1ρ)ggr \leftarrow \rho r+ (1-\rho)g \odot g
4、更新参数:θθηδ+rg\theta \leftarrow \theta - \frac{\eta}{\delta+\sqrt{r}}\odot g

5.1 为何这样改动有效

为什么改动这么点效果就好了呢?我们假设更新过程中梯度是个固定值c=ggc=g\odot g

  • RMSProp算法:
    其经过τ\tau次计算后,平方梯度的系数为r=c(1ρτ)r=c(1-\rho^\tau),参数的更新大小为ηδ+1ρτ\frac{\eta}{\delta + \sqrt{1-\rho^\tau}}
  • AdaGrad算法:
    经过τ\tau次计算后,平方梯度的系数为r=τcr = \tau c,参数的更新大小为etaδ+τ\frac{eta}{\delta + \sqrt{\tau}}

二者都与迭代次数有关,初始时刻二者更新均较大,经过一定次数迭代后,不管此时梯度值大小,RMSProp算法的更新依然能保持较大(η\eta),而AdaGrad已经接近0。

5.2 RMSProp动量算法

RMSPRP目的是自适应学习率,而动量是为了更新参数,二者不冲突,因此可以结合。

RMSProp-Momentum算法:

输入学习率η\eta,初始参数θ\theta,衰减速率ρ\rho,动量系数α\alpha,初始速度vv
初始化梯度累计变量rr
迭代,直到停止条件
1、从训练集中随机采样m个样,对应标签为{y1,y2,,ym}\{ y_1, y_2, \cdots,y_m\}
2、向前一步走:θ=θ+αv\theta = \theta + \alpha v
3、计算梯度g1mi=1mθL(f(xi;θ),yi)g \leftarrow \frac{1}{m}\sum\limits _{i=1}^m \nabla _\theta L(f(x_i;\theta), y_i)3、计算平方梯度:rρr+(1ρ)ggr \leftarrow \rho r+ (1-\rho)g \odot g
4、更新速度:vαvηrgv \leftarrow \alpha v - \frac{\eta}{\sqrt{r}}\odot g
5、更新参数:θθ+v\theta \leftarrow \theta +v

6-Adam

adam除了引入自适应学习率,还引入了自适应动量,是目前最常用的优化算法。

Adam算法:

输入学习率η\eta,初始参数θ\theta,矩估计的指数衰减速率ρ1\rho_1ρ2\rho_2,默认值为0.9和0.999,小常数δ\delta
初始化一阶矩和二阶矩srs、r
初始化时间步t=0t=0
迭代,直到停止条件
1、从训练集中随机采样m个样,对应标签为{y1,y2,,ym}\{ y_1, y_2, \cdots,y_m\}
2、计算梯度g1mi=1mθL(f(xi;θ),yi)g \leftarrow \frac{1}{m}\sum\limits _{i=1}^m \nabla _\theta L(f(x_i;\theta), y_i)3、更新时间:tt+1t \leftarrow t+1
4、更新一阶矩估计(梯度指数加权平均,更新梯度):sρ1s+(1ρ1)gs \leftarrow \rho_1 s+ (1-\rho_1)g
5、更新二阶矩估计(梯度平方指数加权平均,更新学习率):rρ2r+(1ρ2)ggr \leftarrow \rho_2 r+ (1-\rho_2)g \odot g
6、修正一阶矩的偏差(剔除时间的影响):ss1ρ1ts \leftarrow \frac{s}{1-\rho_1^t}
7、修正二阶矩的偏差(剔除时间的影响):rr1ρ2tr \leftarrow \frac{r}{1-\rho_2^t}
8、更新参数:θθηr+δs\theta \leftarrow \theta -\frac{\eta}{\sqrt{r}+\delta}s

7-RAdam

使用Adam算法,在训练初期,学习率的方差很大,因此有必要针对自适应的学习率,显式修正其方差,使得训练初期也能够使方差稳定。(没细看,不要问,问就王富贵)

RAdam算法:

输入学习率η\eta,初始参数θ\theta,矩估计的指数衰减速率ρ1\rho_1ρ2\rho_2,近似指数ρ\rho_\infty
初始化一阶矩和二阶矩srs、r,初始化加权平均长度ρ21ρ21\rho \leftarrow \frac{2}{1-\rho_2}-1
初始化时间步t=0t=0
迭代,直到停止条件
1、从训练集中随机采样m个样,对应标签为{y1,y2,,ym}\{ y_1, y_2, \cdots,y_m\}
2、计算梯度g1mi=1mθL(f(xi;θ),yi)g \leftarrow \frac{1}{m}\sum\limits _{i=1}^m \nabla _\theta L(f(x_i;\theta), y_i)3、更新时间:tt+1t \leftarrow t+1
4、更新一阶矩估计(梯度指数加权平均,更新梯度):sρ1s+(1ρ1)gs \leftarrow \rho_1 s+ (1-\rho_1)g
5、更新二阶矩估计(梯度平方指数加权平均,更新学习率):rρ2r+(1ρ2)ggr \leftarrow \rho_2 r+ (1-\rho_2)g \odot g
6、修正一阶矩的偏差(剔除时间的影响):ss1ρ1ts \leftarrow \frac{s}{1-\rho_1^t}
7、计算t时刻近似指数加权平均长度:ρρ2tρ2t1ρ2t\rho \leftarrow \rho_\infty - \frac{2t\rho_2^t}{1-\rho_2^t}
8、if ρ<4\rho<4θθηs\theta \leftarrow \theta -\eta s
elserr1ρ2tp(ρ4)(ρ2)ρ(ρ4)(ρ2)ρθθηr+δsr\leftarrow \sqrt{\frac{r}{1-\rho_2^t}}\\ p \leftarrow \sqrt{\frac{(\rho-4)(\rho -2)\rho_\infty}{(\rho_\infty-4)(\rho_\infty-2)\rho}}\\ \theta \leftarrow \theta -\frac{\eta}{\sqrt{r}+\delta}s

8-Lookahead

lookahead不同于已有的优化算法,它使用了两组权重,与其说其是一种优化算法,我觉得更像是交叉应用。基本思想就是下象棋时候的“走一步看k步”,求出了一次梯度不也是更新一点吗?那我就先不更新,看看你再求几步是什么情况。

但是看似每次没用梯度值,那还是没少算呀?这叫“磨刀不误砍柴工”,就是说虽然这k次没少算,但最后到的点与k次计算的点是不一样的,虽然没有避免计算这k次,但避免了因为使用k次结果所在点继续往下走可能的徘徊(步履蹒跚走一些于整体无用的路);其次,使用k次计算点作为更新方向,最终到的点可能是使用梯度下降一辈子都不会探索的区域,就很有可能越过局部极值点。

官方名称里称这k步计算的权值为快权重,最终使用的是慢权重,计算快权重使用的优化器A可以是SGD、Adam任何一种。

在这里插入图片描述

lookahead算法:

输入初始化参数θ\thetaϕ\phi,同步周期数kk,学习率η\eta,优化器A(任何一个之前介绍的优化器)
迭代,直到停止条件
1、同步参数:θϕ\theta \leftarrow \phi
2、k次循环:θθ+A\theta \leftarrow \theta + A
3、用第k次结果更新:ϕϕ+η(θϕ)\phi \leftarrow \phi + \eta (\theta-\phi)

参考

[1] 数值计算
[2] 优化器
[3] 机器学习:各种优化器的总结与比较
[4] 深度学习最全优化方法总结比较
[5] 代码仿真

2018-04-15 19:53:25 shwan_ma 阅读数 654

在开玩笑的时候,我们自称研究深度学习的人为炼丹师。所谓炼丹,就是拿到同一种丹药的配方,可能炼出来的丹药的效果也是不一样的。深度学习也是如此,同一种模型,采取不同的优化策略,所得到的结果往往不同。在探究深度学习算法的优化策略过程中,人们大概经历过以下几个阶段:
SGD-> Momentum -> Nesterov -> Adagrad -> RMSProp -> Adam ->Nadam

由于最近在准备实习面试中,特开一篇博客对上述几种优化算法进行回顾,也方便自己总结。

一、随机梯度下降(SGD)

SGD算法是一种非常经典的优化算法,其衍生于批梯度下降(BGD)算法。由于 BGD算法需要对整个训练集进行计算梯度,然后再进行更新梯度,其带来的开销是非常大的。因此 用一个mini-batch去更新梯度可以有效减少计算开销,加速收敛,还不容易陷入鞍点。
这里写图片描述

值得注意的是在真实采用SGD进行训练的时候,有必要随着时间进行逐渐降低学习率,这是因为SGD中在梯度估计引入的噪声源(由于只用了m个样本)并不会在极小点消失。

二、动量(Momentum)
从SGD上受到的启发,由于SGD只用了m个样本,容易在梯度估计的时候引入噪声,因此带来一个结果便是梯度更新的时候会在高曲率的方向震荡,这在一定程度上降低了收敛速度。因此momentum算法采用移动平均减缓梯度在高区率方向上的更新,从而加速整体的收敛。


这里写图片描述

其中红色的梯度更新线是采用momentum算法后的优化路径。
这里写图片描述

这里稍微简单介绍一下动量的概念:当梯度更新进行震荡时,我们方向其方向是不停的变化的,动量便会像摩擦力一样试图保持原来的方向,从而降低震荡方向梯度的更新。
当梯度的更新都指向同一方向时,动量便会使得梯度更新的速度越来越快。

三、Nesterov动量
Nesterov动量 认为,竟然梯度方向是当年mini-batch样本更新的方向说了不算,那为什么不按照原来动量的方向去更新看看,然后在计算更新后的梯度,从而进行校正呢?

这里写图片描述
值得注意的是:在凸批量梯度的情况下,Nesterov 动量将额外误差收敛率从O(1/k)改进到O(1/k^2),然而在随机梯度的情况下,Nesterov并没有改进收敛率。

四、AdaGrad
我们发现SGD需要我们设置对学习率进行衰减,从而降低随机样本带来的梯度噪声。而AdaGrad算法的提出独立适应所有模型参数的学习率,缩放每个参数反比于其所有历史平方值总和的平方根。这样带来的好处是,更新快的给他慢下来,更新慢的给他快上去。原因很简单,更新快的往往是震荡部分,更新慢的往往是趋优部分。也就从AdaGrad开始,优化算法开始趋向选择自适应学习速率。
这里写图片描述
Adagrad的缺点也很明显:对于训练深度神经网络模型而言:从训练开始时积累梯度平方会导致有效学习率过早和过量的减少。

五、RMSProp
由于AdaGrad根据平方梯度的整个历史收缩学习率,可能 RMSprop观测到Adagrad优化算法中的缺点,并也对此进行了改进。选择移动平均来对梯度的平方进行累积,可能使得学习率在达到这样的凸结构就变得太小了。RMSProp使用指数衰减平均以丢弃遥远过去的历史,使其能够在凸碗状结构后快速收敛。
这里写图片描述

六、Adam
Adam在RMSProp的基础又增加了梯度的动量,融合了一阶,二阶的动量得到的优化算法。
这里写图片描述

七、Nadam
这个算法就不多介绍了,就是前面算法的集大成者。在Adam的基础上了增加了Nesterov。

================================================================================

关于指数平均:

V <= beta * V + (1-beta) * theta
V可以近似看作为 1/(1-beta) 个数据的平均值, 如beta=0.1,则近似为10个数据的平均值

关于Adam里的偏差修正:
这是由于在初始的更新时,并没有 1/(1-beta) 的数据,举个例子来看:


这里写图片描述

原先应该是绿色的曲线,变成了紫色曲线。由图中可以看到,紫色曲线的起点较低,但随之数据增大,其实影响也不大。为了更好的修正,往往对指数平均进行如下偏差修正:

这里写图片描述

参考自:
http://mooc.study.163.com/learn/2001281003?tid=2001391036#/learn/content?type=detail&id=2001702122
https://zhuanlan.zhihu.com/p/32230623

其他的一些经验:

1。实际上我们看到自从RMSProp和Adam引入二阶动量后,对整个梯度更新速度加快了。然而很可能导致不收敛的状态。原因其实也很简单,因为AdaGrad 是累积二阶矩,随着训练的加深,二阶矩的累加会导致学习速率很降低。而Adam和RMSProp则容易出现不收敛的状态。
2。 由于Adam的收敛速度确实很快,所以一般初学者还是推荐使用Adam。对于一些进阶者,依旧推荐SGD的调参方式。要相信:精调的参数一定比自适应的要好。

2018-03-15 17:24:29 u013498583 阅读数 278

深度学习最全优化方法总结比较(SGD,Adagrad,Adadelta,Adam,Adamax,Nadam)

转载自:https://zhuanlan.zhihu.com/p/22252270

SGD
此处的SGD指mini-batch gradient descent,关于batch gradient descent, stochastic gradient descent, 以及 mini-batch gradient descent的具体区别就不细说了。现在的SGD一般都指mini-batch gradient descent。

SGD就是每一次迭代计算mini-batch的梯度,然后对参数进行更新,是最常见的优化方法了。即:

gt=θt1f(θt1)

Δθt=ηgt

其中,η是学习率,gt是梯度

SGD完全依赖于当前batch的梯度,所以\eta可理解为允许当前batch的梯度多大程度影响参数更新

缺点:(正因为有这些缺点才让这么多大神发展出了后续的各种算法)

选择合适的learning rate比较困难
- 对所有的参数更新使用同样的learning rate。对于稀疏数据或者特征,有时我们可能想更新快一些对于不经常出现的特征,对于常出现的特征更新慢一些,这时候SGD就不太能满足要求了

SGD容易收敛到局部最优,并且在某些情况下可能被困在鞍点【原来写的是“容易困于鞍点”,经查阅论文发现,其实在合适的初始化和step size的情况下,鞍点的影响并没这么大。感谢@冰橙的指正】

Momentum
momentum是模拟物理里动量的概念,积累之前的动量来替代真正的梯度。公式如下:

mt=μmt1+gt

Δθt=ηmt

其中,μ是动量因子

特点:

下降初期时,使用上一次参数更新,下降方向一致,乘上较大的μ能够进行很好的加速
下降中后期时,在局部最小值来回震荡的时候,gradient0μ使得更新幅度增大,跳出陷阱
在梯度改变方向的时候,μ能够减少更新

总而言之,momentum项能够在相关方向加速SGD,抑制振荡,从而加快收敛

Nesterov
nesterov项在梯度更新时做一个校正,避免前进太快,同时提高灵敏度。
将上一节中的公式展开可得:

Δθt=ημmt1ηgt

可以看出,mt1
并没有直接改变当前梯度gt,所以Nesterov的改进就是让之前的动量直接影响当前的动量。即:

gt=θt1f(θt1ημmt1)

mt=μmt1+gt

Δθt=ηmt

所以,加上nesterov项后,梯度在大的跳跃后,进行计算对当前梯度进行校正。如下图:

这里写图片描述

momentum首先计算一个梯度(短的蓝色向量),然后在加速更新梯度的方向进行一个大的跳跃(长的蓝色向量),nesterov项首先在之前加速的梯度方向进行一个大的跳跃(棕色向量),计算梯度然后进行校正(绿色梯向量)

其实,momentum项和nesterov项都是为了使梯度更新更加灵活,对不同情况有针对性。但是,人工设置一些学习率总还是有些生硬,接下来介绍几种自适应学习率的方法

Adagrad
Adagrad其实是对学习率进行了一个约束。即:

nt=nt1+gt2

Δθt=ηnt+ϵgt

此处,对gt从1到t进行一个递推形成一个约束项regularizer1r=1t(gr)2+ϵϵ用来保证分母非0

特点:

前期gt较小的时候, regularizer较大,能够放大梯度
后期gt较大的时候,regularizer较小,能够约束梯度
适合处理稀疏梯度

缺点:
由公式可以看出,仍依赖于人工设置一个全局学习率
η设置过大的话,会使regularizer过于敏感,对梯度的调节太大
中后期,分母上梯度平方的累加将会越来越大,使gradient\to0,使得训练提前结束

Adadelta
Adadelta是对Adagrad的扩展,最初方案依然是对学习率进行自适应约束,但是进行了计算上的简化。
Adagrad会累加之前所有的梯度平方,而Adadelta只累加固定大小的项,并且也不直接存储这些项,仅仅是近似计算对应的平均值。即:

nt=νnt1+(1ν)gt2

Δθt=ηnt+ϵgt

在此处Adadelta其实还是依赖于全局学习率的,但是作者做了一定处理,经过近似牛顿迭代法之后:

E|g2|t=ρE|g2|t1+(1ρ)gt2

Δxt=r=1t1ΔxrE|g2|t+ϵ

其中,E代表求期望。

此时,可以看出Adadelta已经不用依赖于全局学习率了。

特点:

训练初中期,加速效果不错,很快
训练后期,反复在局部最小值附近抖动

RMSprop
RMSprop可以算作Adadelta的一个特例:

ρ=0.5时,E|g2|t=ρE|g2|t1+(1ρ)gt2就变为了求梯度平方和的平均数。

如果再求根的话,就变成了RMS(均方根):

RMS|g|t=E|g2|t+ϵ
此时,这个RMS就可以作为学习率\eta的一个约束:

Δxt=ηRMS|g|tgt
特点:

其实RMSprop依然依赖于全局学习率
RMSprop算是Adagrad的一种发展,和Adadelta的变体,效果趋于二者之间
适合处理非平稳目标
- 对于RNN效果很好

Adam
Adam(Adaptive Moment Estimation)本质上是带有动量项的RMSprop,它利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。Adam的优点主要在于经过偏置校正后,每一次迭代学习率都有个确定范围,使得参数比较平稳。公式如下:

mt=μmt1+(1μ)gt

nt=νnt1+(1ν)gt2

mt^=mt1μt

nt^=nt1νt

Δθt=mt^nt^+ϵη

其中,mtnt分别是对梯度的一阶矩估计和二阶矩估计,可以看作对期望E|gt|E|gt2|的估计;mt^nt^是对mtnt的校正,这样可以近似为对期望的无偏估计。
可以看出,直接对梯度的矩估计对内存没有额外的要求,而且可以根据梯度进行动态调整,而mt^nt^+ϵ对学习率形成一个动态约束,而且有明确的范围。

特点:

结合了Adagrad善于处理稀疏梯度和RMSprop善于处理非平稳目标的优点
对内存需求较小
为不同的参数计算不同的自适应学习率
也适用于大多非凸优化
- 适用于大数据集和高维空间

Adamax
Adamax是Adam的一种变体,此方法对学习率的上限提供了一个更简单的范围。公式上的变化如下:

nt=max(νnt1,|gt|)

Δx=mt^nt+ϵη

可以看出,Adamax学习率的边界范围更简单

Nadam
Nadam类似于带有Nesterov动量项的Adam。公式如下:

gt^=gt1Πi=1tμi

mt=μtmt1+(1μt)gt

mt^=mt1Πi=1t+1μi

nt=νnt1+(1ν)gt2

nt^=nt1νtmt¯=(1μt)gt^+μt+1mt^

Δθt=ηmt¯nt^+ϵ

可以看出,Nadam对学习率有了更强的约束,同时对梯度的更新也有更直接的影响。一般而言,在想使用带动量的RMSprop,或者Adam的地方,大多可以使用Nadam取得更好的效果。

经验之谈
对于稀疏数据,尽量使用学习率可自适应的优化方法,不用手动调节,而且最好采用默认值
SGD通常训练时间更长,但是在好的初始化和学习率调度方案的情况下,结果更可靠
如果在意更快的收敛,并且需要训练较深较复杂的网络时,推荐使用学习率自适应的优化方法。
Adadelta,RMSprop,Adam是比较相近的算法,在相似的情况下表现差不多。
在想使用带动量的RMSprop,或者Adam的地方,大多可以使用Nadam取得更好的效果

2019-03-01 20:59:51 m0_37180911 阅读数 99

挑战:局部最优、鞍点、梯度悬崖和梯度消失

局部最优

详解机器学习中的梯度消失、爆炸原因及其解决方法
并不是找到全局最优点。局部最优点也可以,泛化性能也通常比最优解好。

鞍点

梯度悬崖

这是由于几个较大的权重相乘导致的

梯度消失

解决:ReLU

梯度爆炸

如果上层的权重过大,当经过传递后,本层的梯度就会变得异常巨大,造成梯度非常不稳定。

梯度不精确

导致训练的稳定性较差,但梯度不精确又是也可以看作是防止过拟合以及逃离局部最优或鞍点的方法。

优化算法

批量梯度下降

Batch Gradient Descent,BGD
整个训练数据集的数据计算梯度。更新权重。
优点:准确,下降快。
缺点:计算慢,不能投入新数据,若存在相似样本出现冗余。
对于凸函数可以收敛到全局极小值,对于非凸函数可以收敛到局部极小值。

随机梯度下降

Stochastic Gradient Descnet,SGD
选择一条数据,就训练一条数据,然后修改一次权重。
缺点:可能选择错误标记的数据/与正常数据差异很大的数据。导致此数据求得的梯度有很大的偏差。有很强的随机性。cost function有严重的震荡。
优点:没有冗余,比较快,可以新增样本,
学习率(学习率衰减)、选择多条数据

最小批量梯度下降

Mini-Batch Gradient Descent,MBGD
每一次利用一小批样本
可以降低参数更新时的方差,收敛更稳定。可以充分利用深度学习库中高度优化的矩阵操作来进行更有效地梯度计算。

learning rate选择太小收敛速度慢,如果太大,loss function就会在极小值处不停地震荡甚至偏离。在鞍点,BGD会停止不动,如果是MBGD或SGD,会发生震荡。如果是mini-batch或者SGD,每次找到的梯度都是不同的,就会发生震荡,来回跳动。

指数加权平均
减少噪音,刻画了原数据地趋势。
加权系数是随着时间以指数形式递减的,时间越靠近,权重越大,越靠前,权重越小。

动量学习法

加速SGD,抑制震荡
加速学习过程,可以在鞍点处继续前行,也可以逃离一些较小的局部最优区域
0.9

AdaGrad

adaptive gradient algorithm
将每一维各自的历史梯度的平方叠加起来,然后在更新的时候除以该历史梯度值即可。
缺点:容易收到‘过去’的影响,梯度很容易就累积到很大的值,此时学习率就会被降低的非常厉害。

Adadelta

没有学习率超参数
Adadelta
2
Adadelta 是 Adagrad 的一个具有更强鲁棒性的的扩展版本,它不是累积所有过去的梯度,而是根据渐变更新的移动窗口调整学习速率

RMSProp

Root Mean Square Prop
在AdaGrad的版本上引入衰减因子
在‘过去’和‘现在’做一个权衡。

Adam

Momentum+RMSProp的微调版本

参数初始化策略

初始点不好:学习算法可能根本无法收敛,也可能造成学习算法不稳定。
不同的参数也决定着学习的收敛速度以及能否降低到足够低的损失值区域。
尽量避免神经元参数出现对称情况。
随机初始化方式:均匀分布/高斯分布
较大的初始值权重范围:
有点:有效的避免参数对称线性、减少神经元冗余现象,帮助减轻训练网络时的梯度消失问题。
缺点:梯度爆炸问题,Sigmoid出现过饱和现象。

批量归一化

归一化:将数据的输入值减去其均值然后处以数据的标准差。
批量归一化:在网络的每一层都进行数据归一化处理。批量归一化中的‘批量‘其实就是采样一小批数据,然后对该批数据在网络各层的输出进行归一化处理。
目的:把神经网络每一层的输入数据都调整到均值为零,方差为1的标准正态分布。
BN就是把输入值尽可能地归一化在激活函数这一狭窄区域。:减低网络地性能。
另一个步骤:再将归一化地数据放大,平移回非线性区域。

2018-03-28 16:49:57 tonydandelion2014 阅读数 594

介绍一些深度学习的优化器 参考覃秉丰教程

梯度下降法则

  • 标准梯度下降法:计算所有样本汇总误差,根据总误差来更新权值
  • 随机梯度下降法:先随机抽取一个样本来计算误差,再根据这个误差来更新权值
  • 批量梯度下降法:从总样本中选取一个批次(batch)(例如10000个样本,随机选取1中的100个样本作为batch),然后计算这个batch的总误差,再根据这个误差来更新权值

随机梯度下降法:

带Momentum的随机梯度下降法:

涅斯捷罗夫加速梯度下降法 NAG(Nesterov accelerated gradient)

在Momentun中小球会盲目地跟从下坡的梯度,容易发生错误,所以我们需要一个更聪明的小球,这个小球提前知道它要去哪里,它还要知道走到坡底的时候速度慢下来而不是又冲上另一个坡。γvt−1会用来修改W的值,计算W−γvt−1可以表示小球下一个位置大概在哪里。从而我们可以提前计算下一个位置的梯度,然后使用到当前位置。

Adagrad

上面提到的方法对于所有参数都使用了同一个更新速率。但是同一个更新速率不一定适合所有参数。比如有的参数可能已经到了仅需要微调的阶段,但又有些参数由于对应样本少等原因,还需要较大幅度的调动。于是提出了Adagrad算法,为不同分类设置了不同的学习率。简单的说,就是这类数据出现的越多,这类数据的学习率越小,这类数据出现的越少,这类数据学习率越大。

  • η为学习率,一般为0.01
  • gti为第i个分类的代价函数的导数(第i个分类的代价函数的梯度)
  • Wt+1等于Wt减去学习率η除以(从1到t’的共计t’次第i个分类的代价函数的梯度的平方加ε的和的平方根)的商点乘gt的积

它是基于SGD的一种算法,它的核心思想是对比较常见的数据给予它比较小的学习率去调整参数,对于比较罕见的数据给予它比较大的学习率去调整参数
它很适合应用于数据稀疏的数据集(比如一个图片数据集,有10000张狗的照片,10000张猫的照片,只有100张大象的照片)。比较稀疏的数据集是指猫和狗的照片很多,而大象的照片很少,即照片分布不均匀。

举例说明:
设置狗是第一个分类(i=1),猫是第二个分类(i=2),大象是第三个分类(i=3)。
第一次抽到狗,即i=1,t=1(第1次抽到狗这个分类),计算g11(第一分类的代价函数的导数(梯度))的平方,此时狗分类学习率η=η/(g11的平方+ε)。
第二次又抽到狗,即i=1,t=2(第2次抽到狗这个分类),计算g21(第一分类的代价函数的导数(梯度))的平方,此时狗分类学习率η=η/(g11的平方+g21的平方+ε)。
第三次还抽到狗,即i=1,t=3(第3次抽到狗这个分类),计算g31(第一分类的代价函数的导数(梯度))的平方,此时狗分类学习率η=η/(g11的平方+g21的平方+g31的平方+ε)。
第四次抽到的是猫,即i=2,t=1(第1次抽到猫这个分类),计算g12(第二分类的代价函数的导数(梯度))的平方,此时猫分类学习率η=η/(g12的平方+ε)。
第五次抽到的是象,即i=3,t=1(第1次抽到象这个分类),计算g13(第三分类的代价函数的导数(梯度))的平方,此时象分类学习率η=η/(g13的平方+ε)。
第六次抽到的还是猫,即i=2,t=2(第2次抽到猫这个分类),计算g22(第二分类的代价函数的导数(梯度))的平方,此时猫分类学习率η=η/(g12的平方+g22的平方+ε)。
以此类推

优点:从举例中可以看出,Adagrad确实可以达到对比较常见的数据给予它比较小的学习率去调整参数,对于比较罕见的数据给予它比较大的学习率去调整参数这个目的。

缺点:Adagrad主要的优势在于不需要人为的调节学习率,它可以自动调节。它的缺点在于,随着迭代次数的增多,学习率也会越来越低,最终会趋向于0。

RMSprop

RMS(Root Mean Square)均方根

RMSprop借鉴了一些Adagrad的思想,不过这里RMSprop只用到了前t-1次梯度平方的平均值加上当前梯度的平方的和的开平方作为学习率的分母。这样RMSprop**不会出现学习率越来越低的问题,而且也能自己调节学习率,并且可以有一个比较好的效果**。

Adadelta

ΔWt等于负的学习率除以前t次的梯度平方的平均值加上ε的和的平方根点乘当前这次(也就是第t次)的梯度

分子对上一次(t-1)的ΔW求均方根,分母对这一次(t)的梯度求均方根。

使用Adadelta我们甚至不需要设置一个默认学习率,在Adadelta不需要使用学习率也可以达到一个非常好的效
果。

Adam

就像Adadelta和RMSprop一样Adam会存储之前衰减的平方梯度,同时它也会保存之前衰减的梯度。经过一些
处理之后再使用类似Adadelta和RMSprop的方式更新参数。

效果演示

这里的速度是指模型收敛的速度,也就是得到正确模型的速度。虽然SDG的收敛速度可能会比其他优化器慢,但是模型识别的准确率不一定是最差的。


五角星位置为全局最小值,Adadelta最快,SGD最慢。


马鞍问题,除了SGD以外其他方法均能够逃离马鞍,找到最正确的位置。

没有更多推荐了,返回首页