深度学习中优化算法

深度学习常用的优化算法包括:梯度下降,随机梯度下降,小批量随机梯度下降,动量法,AdaGrad,RMSProp,Adam。这些优化算法又涉及到指数加权移动平均。下面先介绍什么是指数加权移动平均。

1. 指数加权移动平均

指数加权移动平均是几个概念拼到一起的,包括加权平均与移动平均。

加权平均:平均分为算术平均和加权平均,算术平均指各项的权重都相等。加权平均各项权重不等。

移动平均:移动平均常用于时间序列的平均计算。例如,取前n个时刻的值取平均。相当于有一个窗口在不断向前滑动。

指数加权平均:每一项的权重不等,并且是指数函数的形式。尝试用的形式如下:
v t = γ v t − 1 + ( 1 − γ ) g t (1) v_t=\gamma v_{t-1}+(1-\gamma)g_t\tag1 vt=γvt1+(1γ)gt(1)
v t v_t vt是当前时刻的指数加权移动平均值。 g t g_t gt是当前时刻的值。一般令 v 0 = 0 v_0=0 v0=0。则 v 1 , v 2 , v 3 v_1,v_2,v_3 v1,v2,v3分别为:
v 1 = ( 1 − γ ) g 1 v 2 = γ v 1 + ( 1 − γ ) g 2 = γ ( 1 − γ ) g 1 + ( 1 − γ ) g 2 v 3 = γ v 2 + ( 1 − γ ) g 3 = γ 2 ( 1 − γ ) g 1 + γ ( 1 − γ ) g 2 + ( 1 − γ ) g 3 (2) v_1=(1-\gamma)g_1\\ v_2=\gamma v_1+(1-\gamma)g_2=\gamma(1-\gamma)g_1+(1-\gamma)g_2\\ v_3=\gamma v_2+(1-\gamma)g_3=\gamma^2(1-\gamma)g_1+\gamma(1-\gamma)g_2+(1-\gamma)g_3\tag2 v1=(1γ)g1v2=γv1+(1γ)g2=γ(1γ)g1+(1γ)g2v3=γv2+(1γ)g3=γ2(1γ)g1+γ(1γ)g2+(1γ)g3(2)
可以看到每一个时刻的滑动平均都是观察到当前值的加权平均,并且权重呈指数衰减。距离当前时刻越远权重越小。

2. 梯度下降/随机梯度下降/小批量随机梯度下降

梯度下降:使用所有训练样本,完成一次梯度更新。每次更新的时间复杂度o(N)。

随机梯度下降:每次使用一条样本完成一次梯度更新。每次更新的时间复杂度o(1)。

小批量随机梯度下降:每次使用batch(n个)个样本完成一次梯度更新。每次更新的时间复杂度o(n)。

更新公式:
x t = x t − 1 − η g t (3) x_t=x_{t-1}-\eta g_t\tag3 xt=xt1ηgt(3)

3. 动量法

动量法结合物理学动量的思想,让参数更新的方向不仅取决于当前梯度,还取决于历史梯度方向。更新公式:
v t = γ v t − 1 + η g t x t = x t − 1 − v t (4) v_t=\gamma v_{t-1}+\eta g_t\\ x_t=x_{t-1}-v_t\tag4 vt=γvt1+ηgtxt=xt1vt(4)

动量法的优势:

  • 普通的梯度下降由于学习率固定,收敛速度会慢,有时甚至陷入局部最优。如果考虑历史梯度,会引导参数朝最优值更快收敛。并且减小陷入局部最优的风险。
  • 当某一参数在一段时间内梯度方向不一样(来回振荡),使用动量法,其真实参数更新幅度会变小。反之,最近一段时间的梯度方向一致时,其真实更新幅度会变大,起到加速作用。
  • 一般来说,迭代初期,梯度方向比较一致,动量法会起到加速作用;迭代后期,梯度方向会趋于不一致,在收敛值附件振荡,动量法会起到减速作用,增加稳定性。
    在这里插入图片描述

4. AdaGrad

问题:当x1和x2(不同维度的参数)的梯度值差别较大时,使用相同的学习率更新参数会存在问题:参数在梯度较大的维度上需要使用足够小的学习率来保证不发散,但参数在梯度较小的维度上又需要足够大的学习率避免收敛过慢。

AdaGrad的主要思想是特征每个维度的权重更新时,使用不同的学习率。根据参数在每个维度梯度值的大小来调整各个维度学习率的大小。AdaGrad引入梯度平方累积变量 s t s_t st
s t = s t − 1 + g t ⊙ g t x t = x t − 1 − η s t + ϵ ⊙ g t (5) s_t=s_{t-1}+g_t\odot g_t\\ x_t=x_{t-1}-\frac{\eta}{\sqrt{s_t+\epsilon}}\odot g_t\tag5 st=st1+gtgtxt=xt1st+ϵ ηgt(5)

5. RMSProp

AdaGrad算法存在问题,梯度平方累计变量 s t s_t st时不断增大的,学习率一致降低的。如果学习率在迭代过程中下降的过快,且当前解依然不佳时,AdaGrad算法在迭代后期由于学习率过小,很难在继续收敛。RMSProp在AdaGrad算法基础上做了一些调整。使用指数加权移动平均对之前的t梯度平方进行衰减,避免 s t s_t st一直增大。
s t = γ s t − 1 + ( 1 − γ ) g t ⊙ g t x t = x t − 1 − η s t + ϵ ⊙ g t (6) s_t=\gamma s_{t-1}+(1-\gamma)g_t\odot g_t\\ x_t=x_{t-1}-\frac{\eta}{\sqrt{s_t+\epsilon}}\odot g_t\tag6 st=γst1+(1γ)gtgtxt=xt1st+ϵ ηgt(6)

6. Adam

Adam算法是平时使用最多的优化算法,结合了动量法的思想和RMSProp的思想。

动量法的思想:结合历史梯度信息,调整当前参数的优化方向。维护动量变量 v t v_t vt
v t = β 1 v t − 1 + ( 1 − β 1 ) g t (7) v_t=\beta_1 v_{t-1}+(1-\beta_1)g_t\tag7 vt=β1vt1+(1β1)gt(7)
RMSProp的思想:为每一维特征的参数配置不同的学习率。维护梯度平方累计变量 s t s_t st
s t = β 2 s t − 1 + ( 1 − β 2 ) g t ⊙ g t (8) s_t=\beta_2s_{t-1}+(1-\beta_2)g_t\odot g_t\tag8 st=β2st1+(1β2)gtgt(8)
v t , s t v_t,s_t vt,st使用偏差修正

当时间步较小时,各时间步的权重之和也会较小,为了消除这种影响,对于每个时间步的 v t v_t vt再除以 1 − β 1 t 1-\beta_1^t 1β1t。从而使每个时间步的梯度权重之和为1。

除以 1 − β 1 t 1-\beta_1^t 1β1t的原因:

  1. 在时间步t可以得到 v t = ( 1 − β 1 ) ∑ i = 1 t β i t − i g i v_t=(1-\beta_1)\sum_{i=1}^t\beta_i^{t-i}g_i vt=(1β1)i=1tβitigi
  2. 所有时间步的权重和为 ( 1 − β 1 ) ∑ i = 1 t β i t − i (1-\beta_1)\sum_{i=1}^t\beta_i^{t-i} (1β1)i=1tβiti

( 1 − β 1 ) ∑ i = 1 t β i t − i = ( 1 − β 1 ) ( 1 + β i 1 + β 1 2 + . . . + β 1 t − 1 ) (9) (1-\beta_1)\sum_{i=1}^t\beta_i^{t-i}=(1-\beta_1)(1+\beta_i^1+\beta_1^2+...+\beta_1^{t-1})\tag9 (1β1)i=1tβiti=(1β1)(1+βi1+β12+...+β1t1)(9)

上式第二项是等比数列的前n项和公式。等比数列递推公式和前n项和公式分别为:
a n = a 1 × q n − 1 s n = a 1 × ( 1 − q n ) 1 − q (10) a_n=a_1\times q^{n-1}\\ s_n=\frac{a_1\times(1-q^n)}{1-q}\tag{10} an=a1×qn1sn=1qa1×(1qn)(10)
可得:
( 1 + β i 1 + β 1 2 + . . . + β 1 t − 1 ) = 1 − β 1 t 1 − β 1 (11) (1+\beta_i^1+\beta_1^2+...+\beta_1^{t-1})=\frac{1-\beta_1^t}{1-\beta_1}\tag{11} (1+βi1+β12+...+β1t1)=1β11β1t(11)
带入(9)式可得:
( 1 − β 1 ) ∑ i = 1 t β i t − i = 1 − β 1 t (12) (1-\beta_1)\sum_{i=1}^t\beta_i^{t-i}=1-\beta_1^t\tag{12} (1β1)i=1tβiti=1β1t(12)
可得到偏差修正的 v ^ t , s ^ t \hat v_t,\hat s_t v^t,s^t为:
v ^ t = v t 1 − β 1 t s ^ t = s t 1 − β 2 t (13) \hat v_t=\frac{v_t}{1-\beta_1^t}\\ \hat s_t=\frac{s_t}{1-\beta_2^t}\tag{13} v^t=1β1tvts^t=1β2tst(13)
使用偏差修正的 v ^ t , s ^ t \hat v_t,\hat s_t v^t,s^t进行参数更新:
x t = x t − 1 − η s ^ t + ϵ v ^ t (14) x_t=x_{t-1}-\frac{\eta}{\sqrt{\hat s_t}+\epsilon}\hat v_t\tag{14} xt=xt1s^t +ϵηv^t(14)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值