「最优化算法」Adam

Adam(Adaptive Moment Estimation)

Adam是常见的优化深度神经网络的最优化方法,普通的最优化方法(比如BGD,SGD)面对更为复杂的代价函数往往会陷入局部震荡或者陷入鞍点,难以收敛。于是便引入了 动量(Momentum) 这种物理学概念,让优化方向不只沿着梯度方向进行,还需要参考参数之前一步的运动方向。

SGD with Momentum

对于一个代价函数 L(wi)L(w_i) 来说,普通的 SGD 算法的某一步只需要沿着某一个方向前进一步:

wi:=wiηLwiw_i := w_i – \eta\frac{\partial L}{\partial w_i}

带有动量的 SGD 算法则引入了速度的变化。令 wtw_t 为 第 tt 次后迭代的参数的值,Δwt\Delta w_t 是算上学习率 η\etaww 在本次迭代中沿着负梯度方向应该前进的方向与大小,即:

Δwt=ηL(w)\Delta w_t =- \eta\nabla L(w)

则带有动量的 SGD 算法的迭代公式为:

vt+1=γvt+Δwtwt+1=wt+vt+1v_{t+1} = \gamma v_t +\Delta w_t\\ w_{t+1} = w_t + v_{t+1}

其中 γ\gamma 为速度的衰减系数,一般为 0.9。

可以将这种方法比作一个斜坡上的小球,斜坡越陡,他的加速度越大,他的下降也就越快。所以带有动量的 SGD 算法会加速收敛,同时也可以有效的减少参数陷入鞍点的问题,但在优化过程中还有一些震荡的现象。

image.png

NAG(Nesterov Accelerated Gradient)

带有动量的 SGD 算法似乎是先计算梯度,再累积速度,这样很有可能会导致下降过头而导致震荡,NAG 算法则与 SGD 算法相反,先预见性的看见了自己之后的位置 wtw_t’,再进行梯度计算,这样相当于走了两步:

wt=wt+γvtΔwt=ηL(wt)vt+1=γvt+Δwtwt+1=wt+vt+1w_t’ = w_t + \gamma v_t\\ \Delta w_t =- \eta\nabla L(w_t’)\\ v_{t+1} = \gamma v_t +\Delta w_t\\ w_{t+1} = w_t + v_{t+1}

根据这篇 博文 的结论,这种走了两步这种方法更像牛顿法的前瞻性,因此比带有动量的 SGD 算法的震荡更小,但 ηL(wt)\eta\nabla L(w_t’) 计算会出现问题,需要更多的数学技巧来解决。

Adagrad

通常在深度网络训练到一定程度时,当前的学习率相对与代价函数来说太大以至于不能继续收敛,于是需要手动减小学习率 η\eta,而 Adagrad 则是一种可以自动调节学习率大小的优化算法。

假设有一组待优化的参数 w={w1,w2,...,wn}w=\{w_1, w_2,…,w_n\},则参数 wiw_i 的梯度方向为:

Δwi=wiL(w)\Delta w_i =\nabla_{w_i} L(w)

那么迭代方程如下:

wi:=wiηgi+ϵΔwiw_i:=w_i-\frac{\eta}{\sqrt{g_{i}+\epsilon} }\Delta w_i

其中 gig_i 储存着历史梯度 wiL(w)\nabla_{w_i}L(w) 平方和,即:

gi=twiL(w(t))2g_i = \sum^t \nabla_{ w_i} L(w^{(t)})^2

可以看出 gig_i 随着训练逐渐递增,则其学习率会逐渐变小,实现了自适应调节学习率。同时,学习率的变化也会与参数直接挂钩,在同一问题中出现次数少的特征优化速率会比出现次数多的特征快得多。

但是这种方法会导致在学习一定时间后学习率会变得无限小,在数据过多或者 batch 较小时,累积的梯度平方和会将优化将陷入停滞。

RMSProp

比起累计历史梯度平方和 gig_i,RMSProp 算法将其替换为历史梯度平方和的期望。与动量的累积相似,在 tt 时刻的梯度期望(或者说指数衰减的平均)的更新公式为:

E(wiL(w(t))2)=γE(wiL(w(t1))2)+(1γ)wiL(w(t))2\mathbb E(\nabla_{ w_i} L(w^{(t)})^2) = \gamma \mathbb E(\nabla_{ w_i} L(w^{(t-1)})^2) + (1-\gamma)\nabla_{ w_i} L(w^{(t)})^2

可以看到经过一段时间的衰减,离现在时间距离远的梯度信息会慢慢减小,越靠近当前时间,梯度信息占比越大。

上式的期望与动量有什么区别呢?我觉得除了换了一种赋权方式和从梯度转变为了梯度和之外没什么区别。

那么与 Adagrad 算法相似,最终的迭代方程为:

wi:=wiηE(wiL(w)2)+ϵΔwiw_i:=w_i-\frac{ \eta}{ \sqrt{ \mathbb E(\nabla_{ w_i } L(w)^2)+\epsilon } }\Delta w_i

通常 γ=0.9\gamma = 0.9

AdaDelta

AdaDelta 算法与上面的 RMSProp 算法同时被提出。AdaDelta 算法不再拥有学习率,而是将他替换成为

wi:=wiE(x)+ϵE(wiL(w)2)+ϵΔwiw_i:=w_i-\sqrt\frac{ {\mathbb E(x)+\epsilon} }{\mathbb E(\nabla_{ w_i} L(w)^2)+\epsilon}\Delta w_i

其中

E(x(t+1))=γE(x(t))+(1γ)(E(x(t))+ϵE(wiL(w)2)+ϵΔwi2)\mathbb E(x^{(t+1)}) = \gamma \mathbb E(x^{(t)})+(1-\gamma)\left(\frac{ {\mathbb E(x^{(t)})+\epsilon} }{ {\mathbb E(\nabla_{ w_i} L(w)^2)+\epsilon} }\Delta w_i^2\right)

这样 AdaDelta 算法就不需要依赖全局学习率而做到真正的自适应啦!

Adam

Adam 采用了一阶梯度矩估计与二阶梯度矩估计的指数衰减均值 mi(t)vi(t)m_i^{(t)},v_i^{(t)} 作为计算梯度均值于方差的手段,其中

mi(t)=β1mi(t1)+(1β1)L(wi)vi(t)=β2vi(t1)+(1β2)2L(wi)m_i^{(t)} = \beta_1m_i^{(t-1)} + (1-\beta_1)\nabla L(w_i)\\ v_i^{(t)} = \beta_2v_i^{(t-1)} + (1-\beta_2)\nabla^2 L(w_i)

mi(t)m_i^{(t)} 可以理解为带有动量的梯度方向,而 vi(t)v_i^{(t)} 来自于 RMSProp 算法,用来调节自适应优化的大小。

在算法的启动阶段,会另 mi(0)vi(0)=0m_i^{(0)},v_i^{(0)}=0,这会导致在开始优化时 mi(0)vi(0)m_i^{(0)},v_i^{(0)} 值过小,难以启动。则引入偏差修正:

m^i(t)=mi(t)1β1tv^i(t)=vi(t)1β2t\hat m^{(t)}_i= \frac{m_i^{(t)} }{1-\beta^t_1}\\ \hat v^{(t)}_i= \frac{v_i^{(t)} }{1-\beta^t_2}

最终的迭代过程为:

wi(t+1)=wi(t)ηv^i(t)+ϵmi(t)w_i^{(t+1)} = w_i^{(t)}-\frac{\eta}{\sqrt{\hat v_i^{(t)} }+\epsilon}m_i^{(t)}

为什么需要偏差修正呢?当优化刚刚开始时,假设我们得到初始下降梯度 L(wi)\nabla L(w_i) ,由于 mi(0)=0m_i^{(0)} = 0mi(1)=0.1×L(wi)m_i^{(1)} = 0.1 \times \nabla L(w_i),则会使初始优化步长缩小很多,可能会导致优化效果出现偏差,于是需要乘以一个系数来修正这种算法来修正在开始优化时出现的偏差。

image.png

如图,黄色的曲线就是没有偏差修正的结果,在前期会与蓝色曲线(E(L(w))\mathbb E(\nabla L(w)))产生较大偏差。

我们分解 m(t)m^{(t)},可以得到:

m(t)=(1β1)i=1tβ1tiL(w(i))m^{(t)} = (1-\beta_1)\sum_{i=1}^t\beta_1^{t-i}\nabla L(w^{(i)})

m(t)m^{(t)} 期望 E(m(t))\mathbb E(m^{(t)})

E(m(t))=E((1β1)i=1tβ1tiL(w(i)))=(1β1)(β1t1E(L(w(1))+β1t2E(L(w(2))++E(L(w(t)))=(1β1)(β1t1E(L(w)+β1t2E(L(w))++E(L(w))=(1β1)(1+β1+β12++β1t1)E(L(w))=(1β1t)E(L(w))\begin{align} \mathbb E(m^{(t)}) &= \mathbb E\left((1-\beta_1)\sum_{i=1}^t\beta_1^{t-i}\nabla L(w^{(i)})\right)\\ &=(1-\beta_1)\left(\beta_1^{t-1} \mathbb E\left(\nabla L(w^{(1)}\right)+ \beta_1^{t-2} \mathbb E\left(\nabla L(w^{(2)}\right) + \dots+\mathbb E\left(\nabla L(w^{(t)}\right)\right)\\ &=(1-\beta_1)\left(\beta_1^{t-1} \mathbb E\left(\nabla L(w\right)+ \beta_1^{t-2} \mathbb E\left(\nabla L(w)\right) + \dots+\mathbb E\left(\nabla L(w\right)\right)\\ &= (1-\beta_1)(1+\beta_1+ \beta_1^2 +\dots+\beta_1^{t-1})\mathbb E(\nabla L(w))\\ &= (1-\beta_1^t)\mathbb E(\nabla L(w)) \end{align}

所以,mm 是一阶梯度的有偏估计,同理,vv 是二阶梯度的有偏估计,而随着迭代步数的增加,两者的偏差会越来越小,采用偏差修正会减小因为偏差在优化开始时对迭代方向的干扰。

reference:

123

© 版权声明
THE END
喜欢就支持一下吧
点赞0

Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MYLeKKEd' (Errcode: 28 - No space left on device) in /www/wwwroot/583.cn/wp-includes/class-wpdb.php on line 2345
admin的头像-五八三
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

图形验证码
取消
昵称代码图片