优化方法浅析

思路参考一个框架看懂优化算法之异同 SGD/AdaGrad/Adam

SGD

随机梯度下降方法
g t = ∇ f ( w t ) g_t = \nabla f(w_t) gt=f(wt)
w t + 1 = w t − α g t w_{t+1} = w_t - \alpha g_t wt+1=wtαgt

动量法

为了解决梯度下降收敛过慢的问题,因为存在病态曲率。

梯度下降沿着山沟的山脊反弹,向极小的方向移动较慢。这是因为脊的表面在W1方向上弯曲得更陡峭。

具体介绍病态曲率
在这里插入图片描述
动量法可以解决病态曲率的问题,动量法是指利用历史的梯度信息来平滑求和获得新的梯度,避免梯度走偏。
m t = β m t − 1 + ( 1 − β ) g t m_t = \beta m_{t-1} + (1-\beta)g_t mt=βmt1+(1β)gt
w t + 1 = w t − α m t w_{t+1} = w_t - \alpha m_t wt+1=wtαmt
这里的 β \beta β是动量参数。
如下图所示,利用动量分解,在错误方向上的历史动量会相互抵消,最终推动梯度向正确方向迭代。
在这里插入图片描述

AdaGrad

自适应学习率,面对神经网络众多参数,特别是embedding,我们希望对于经常更新的参数,学习率慢一点,不会被一个异常数据带跑偏,对于罕更新参数,学习率可快一点,加速更新。所以需要历史梯度的二阶动量作为更新梯度的权重。
V t = ∑ j t g j 2 V_t = \sum_j^t g_j^2 Vt=jtgj2
所以,梯度更新为:
w t + 1 = w t − α g t V t w_{t+1} = w_t - \alpha \frac{g_t}{V_t} wt+1=wtαVtgt
为了避免分母为0,会加平滑项,而且参数更新越频繁,二阶动量越大,学习率就越小

RMSProp

AdaGrad衰减速度太快,改进方法是利用指数平滑来改进二阶动量
V t = β V t − 1 + ( 1 − β ) ∑ j t g j 2 V_t = \beta V_{t-1} + (1-\beta) \sum_j^t g_j^2 Vt=βVt1+(1β)jtgj2
w t + 1 = w t − α g t V t w_{t+1} = w_t - \alpha \frac{g_t}{V_t} wt+1=wtαVtgt
再切回到上面病态曲率的例子,实际上 w 1 w_1 w1方向就是错误方向,也是高频方向,而正确方向 w 2 w_2 w2是低频方向,所以RMSProp会降低错误方向迭代速度。
综上,动量法会提升正确方向迭代步长,而RMSProp(二阶动量法)会降低错误方向的步长。

Adam

Adam = Momentum + RMSProp
m t = β m t − 1 + ( 1 − β ) g t m_t = \beta m_{t-1} + (1-\beta)g_t mt=βmt1+(1β)gt
V t = β V t − 1 + ( 1 − β ) ∑ j t g j 2 V_t = \beta V_{t-1} + (1-\beta) \sum_j^t g_j^2 Vt=βVt1+(1β)jtgj2
w t + 1 = w t − α m t V t w_{t+1} = w_t - \alpha \frac{m_t}{V_t} wt+1=wtαVtmt

Nadam

即Nesterov adam
Nesterov方法是为了解决优化陷入局部最优,于是将梯度计算时提前想一步,直接计算在预先设计算法下下一步的梯度,这样有可能会跳出局部最优的情况
g t = ∇ f ( w t − α m t V t ) g_t = \nabla f(w_t - \alpha \frac{m_t}{V_t}) gt=f(wtαVtmt)
m t = β m t − 1 + ( 1 − β ) g t m_t = \beta m_{t-1} + (1-\beta)g_t mt=βmt1+(1β)gt
V t = β V t − 1 + ( 1 − β ) ∑ j t g j 2 V_t = \beta V_{t-1} + (1-\beta) \sum_j^t g_j^2 Vt=βVt1+(1β)jtgj2
w t + 1 = w t − α m t V t w_{t+1} = w_t - \alpha \frac{m_t}{V_t} wt+1=wtαVtmt

AdamW

引入自身参数解决参数过拟合
m t = β m t − 1 + ( 1 − β ) g t m_t = \beta m_{t-1} + (1-\beta)g_t mt=βmt1+(1β)gt
V t = β V t − 1 + ( 1 − β ) ∑ j t g j 2 V_t = \beta V_{t-1} + (1-\beta) \sum_j^t g_j^2 Vt=βVt1+(1β)jtgj2
w t + 1 = w t − α ( m t V t + λ w t ) w_{t+1} = w_t - \alpha(\frac{m_t}{V_t} + \lambda w_t) wt+1=wtα(Vtmt+λwt)

LAMB

Layer-wise Adaptive Moments optimizer for Batching training
提升训练速度的方法是提升batch size,但是batch size有隐形上限。

一旦突破这个上限,梯度更新极端的取值会导致自适应学习率调整后极为困难的收敛。

m t = β m t − 1 + ( 1 − β ) g t m_t = \beta m_{t-1} + (1-\beta)g_t mt=βmt1+(1β)gt
V t = β V t − 1 + ( 1 − β ) ∑ j t g j 2 V_t = \beta V_{t-1} + (1-\beta) \sum_j^t g_j^2 Vt=βVt1+(1β)jtgj2
r t = m t V t r_t = \frac{m_t}{V_t} rt=Vtmt
w t + 1 = w t − α ∗ ϕ ( ∣ ∣ w t ∣ ∣ ) ∣ ∣ r t + λ w t ∣ ∣ ( r t + λ w t ) w_{t+1} = w_t - \alpha *\frac{ \phi(||w_t||)}{||r_t+\lambda w_t||}(r_t+\lambda w_t) wt+1=wtαrt+λwtϕ(wt)(rt+λwt)

这里的 ϕ \phi ϕ是可选择的映射函数。用来保证梯度和参数原来的值在同一个量级
LAMB只有在batch size>512才有效果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值