【Optimizor】Pytorch 实现汇总

Optimizor

定义:

  • f θ f_\theta fθ表示模型
  • θ t \theta_t θt 表示模型在更新t次后的参数
  • y ^ = f θ ( x ) \hat{y} = f_\theta(x) y^=fθ(x) 表示模型预测值
  • J ( y ^ , y ∗ ) J(\hat{y},y^*) J(y^,y) 表示真值 y ∗ y^* y 与预测值 y ^ \hat{y} y^ 的损失函数
  • ∇ J ( θ t ) \nabla J\left(\theta_{t}\right) J(θt) 是损失函数 J J J 对于 $\theta_t $ 的梯度 ∂ J ∂ θ t \frac{\partial{J}}{\partial \theta_{t}} θtJ, 也就是参数 $\theta_t $ 要更新的方向
  • γ \gamma γ 表示学习率(learning rate)

公式中除了 γ \gamma γ 是常数, 其他都为向量.

运算过程除非特别指出, 都为逐元素运算(element-wise).

γ \gamma γ 进行广播运算(broadcast).

SGD

随机梯度下降(Stochastic Gradient Descent, SSG), 但是一般在实践时, 实际指的是小批量梯度下降(Mini-Batch Gradient Descent, MBGD).

也就是使用Batch下平均 loss 所求的导数 ∇ J ( θ t ) \nabla J\left(\theta_{t}\right) J(θt)

θ t + 1 = θ t − γ ∇ J ( θ t ) \theta_{t+1} = \theta_t - \gamma\nabla J\left(\theta_{t}\right) θt+1=θtγJ(θt)

优点:

  • 更新稳定, 在长时间更新后, 会收敛到全局最优点附近

缺点:

  • 使用一阶导数更新, 收敛速度慢 → \rightarrow Adagrad, Adadelta, Adam
  • 使用固定的 γ \gamma γ , 可能会在沟壑的两边持续震荡,无法收敛到最优 → \rightarrow momentum, lr_scheduler
  • 收敛到鞍点附近时, 梯度几乎为0, 会导致收敛缓慢 → \rightarrow momentum

momentum

带动量的梯度下降, 其实是指数加权平均对于参数更新的应用, 使得SGD的更新更加平滑.

在SGD基础上引入了一阶动量, 当前时刻的梯度与历史时刻梯度方向相似, 这种趋势在当前时刻则会加强; 要是不同, 则当前时刻的梯度方式减弱.[1]

  • v v v 定义为历史累计动量, 累计到本次梯度就是参数更新的方向
  • μ \mu μ 定义为动量参数

v t + 1 = μ v t + ∇ J ( θ t ) θ t + 1 = θ t − γ v t + 1 {v}_{t+1}={\mu}{v}_{t}+\nabla J(\theta_{t})\\\theta_{t+1} = \theta_t - \gamma{v}_{t+1} vt+1=μvt+J(θt)θt+1=θtγvt+1

优点:

  • 当陷入鞍点, 梯度为0, 但是由于历史累计动量的存在, 会迅速跳出鞍点
  • 缓解SGD更新loss的震荡, 加快模型收敛

缺点:

  • 没有致命的缺点

nesterov

在momentum-SGD中, θ t \theta_{t} θt 会沿着动量和当前梯度求和后的方向更新 γ \gamma γ 步长. 可以把更新步骤分成两部分, 第一次沿着动量方向更新, 第二次沿着梯度方向更新. 如果在第一次更新后, 重新计算新的梯度方向, 第二次沿着新的梯度方向更新, 再沿着动量方向更新就是nesterov.
v t + 1 = μ v t + ∇ J ( θ t − γ μ v t ) θ t + 1 = θ t − γ v t + 1 {v}_{t+1}={\mu}{v}_{t}+\nabla J\left(\theta_{t}- \gamma \mu v_t\right) \\ \theta_{t+1} = \theta_t - \gamma{v}_{t+1} vt+1=μvt+J(θtγμvt)θt+1=θtγvt+1
可以看到在nesterov中, 共使用了两次动量, 更新的方向更侧重与动量的方向.对第一个式子恒等变化:
v t + 1 = μ v t + ∇ J ( θ t ) + μ ( ∇ J ( θ t − 1 ) − ∇ J ( θ t − 2 ) ) {v}_{t+1}={\mu}{v}_{t}+\nabla J(\theta_{t}) + \mu(\nabla J(\theta_{t-1}) - \nabla J(\theta_{t-2})) vt+1=μvt+J(θt)+μ(J(θt1)J(θt2))
与momentum相比, 更新的方向同时要参考历史梯度变化的方向, 也就是梯度的一阶导数, 损失函数的二阶导数.

如果这次的梯度比上次的梯度变大了,那么有理由相信它会继续变大下去,那我就把预计要增大的部分提前加进来;如果相比上次变小了,也是类似的情况。这样的解释听起来好像和原本的解释一样玄,但是读者可能已经发现了,这个多加上去的项不就是在近似目标函数的二阶导嘛!所以NAG本质上是多考虑了目标函数的二阶导信息,怪不得可以加速收敛了!其实所谓“往前看”的说法,在牛顿法这样的二阶方法中也是经常提到的,比喻起来是说“往前看”,数学本质上则是利用了目标函数的二阶导信息。由于利用了二阶导的信息,NAG算法才会比Momentum具有更快的收敛速度。[2]

在实现上, nesterov需要计算两次导数, 经过恒等变化以下形式, 可以重复利用当前梯度, 获取最终更新的方向.[3]
v t + 1 = μ v t + ∇ J ( θ t ) n = μ v t + 1 + ∇ J ( θ t ) θ t + 1 = θ t − γ n {v}_{t+1}=\mu{v}_{t}+\nabla J\left(\theta_{t}\right) \\ n= \mu{v}_{t+1} + \nabla J\left(\theta_{t}\right) \\ \theta_{t+1} = \theta_t - \gamma n vt+1=μvt+J(θt)n=μvt+1+J(θt)θt+1=θtγn

优点:

  • 使得momentum可以更快的收敛

缺点:

  • 没有致命的缺点

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

比Momentum更快:揭开Nesterov Accelerated Gradient的真面目

深度学习中优化方法——momentum、Nesterov Momentum、AdaGrad、Adadelta、RMSprop、Adam

L2正则化

如果需要L2正则化, 并且使用momentum, 需要修改动量累计公式

  • λ \lambda λ 表示L2正则化参数

v t + 1 = μ v t + ∇ J ( θ t ) + λ θ t {v}_{t+1}={\mu}{v}_{t}+\nabla J(\theta_{t})+\lambda\theta_t vt+1=μvt+J(θt)+λθt

ASGD

平均随机梯度下降(Averaged Stochastic Gradient Descent, ASGD)用空间换时间的一种 SGD

Rprop

为了使SGD更新稍微快一点, 如果在同一个维度, 梯度符号相同, 则增大 γ \gamma γ , 反之减小.

优点:

  • 会比原始SGD快一点

缺点:

  • 同SGD
  • 增大减小的倍数是超参, 需要调参
  • 只适用于full-batch

Adagrad

自适应步长, 随着更新次数的增加, 逐渐缩小 γ \gamma γ .对梯度取平方, 确保分母是不断变大的. 在N维空间中, 参数的每个维度更新快慢, 都取决于这个维度的梯度大小. 如果这一维累计梯度较大, 则步长较小, 累计梯度较小, 则步长较大, 使得参数更新, 使得不同的参数使用不同的学习率.

  • w w w 定义为历史累计梯度
  • ϵ \epsilon ϵ 表示特别小的数, 确保分母不为0

w t + 1 = w t + ∇ 2 J ( θ t ) θ t + 1 = θ t − γ w t + 1 + ϵ ∇ J ( θ t ) {w}_{t+1}={w}_{t}+\nabla^2 J(\theta_{t})\\\theta_{t+1} = \theta_t - \frac{\gamma}{\sqrt{{w}_{t+1}}+\epsilon}\nabla J(\theta_{t}) wt+1=wt+2J(θt)θt+1=θtwt+1 +ϵγJ(θt)

优点:

  • 自适应步长

缺点:

  • 从训练开始时累积梯度平方会导致学习率过早过量的减少, 最终某些模型无法有效收敛.

L2正则化

如果需要L2正则化, 需要把衰减项添加到历史累计梯度中, 并且修正学习率

  • λ \lambda λ 表示L2正则化参数

w t + 1 = w t + ( ∇ J ( θ t ) + λ θ t ) 2 θ t + 1 = θ t − γ ( 1 + ( t − 1 ) λ ) w t + 1 + ϵ ( ∇ J ( θ t ) + λ θ t ) {w}_{t+1}={w}_{t}+(\nabla J(\theta_{t})+\lambda\theta_t)^2\\\theta_{t+1} = \theta_t - \frac{\gamma}{(1+(t-1)\lambda)\sqrt{{w}_{t+1}}+\epsilon}(\nabla J(\theta_{t})+\lambda\theta_t) wt+1=wt+(J(θt)+λθt)2θt+1=θt(1+(t1)λ)wt+1 +ϵγ(J(θt)+λθt)

RMSprop

是对Adagrad的优化, 梯度累计使用指数加权平均的方式.

  • w w w 定义为历史累计梯度
  • ρ \rho ρ 定义为梯度指数加权平均参数
  • ϵ \epsilon ϵ 表示特别小的数, 确保分母不为0

w t + 1 = ρ w t + ( 1 − ρ ) ∇ 2 J ( θ t ) θ t + 1 = θ t − γ w t + 1 + ϵ ∇ J ( θ t ) {w}_{t+1}=\rho{w}_{t}+(1-\rho)\nabla^2 J(\theta_{t})\\\theta_{t+1} = \theta_t - \frac{\gamma}{\sqrt{{w}_{t+1}}+\epsilon}\nabla J(\theta_{t}) wt+1=ρwt+(1ρ)2J(θt)θt+1=θtwt+1 +ϵγJ(θt)

优点:

  • 自适应步长
  • 避免学习率不断衰减为0

缺点:

  • 因为梯度累计使用指数加权平均的方式, 窗口内梯度的变化会导致 v t v_t vt 忽大忽小, 在鞍点附近, 学习率较大可以跳出鞍点, 但是如果在最优点附近, 学习率变大会远离最优点.

L2正则化

同Adagrad, 但是实现上没有修正学习率
w t + 1 = ρ w t + ( 1 − ρ ) ( ∇ J ( θ t ) + λ θ t ) 2 θ t + 1 = θ t − γ w t + 1 + ϵ ( ∇ J ( θ t ) + λ θ t ) {w}_{t+1}=\rho{w}_{t}+(1-\rho)(\nabla J(\theta_{t})+\lambda\theta_t)^2\\\theta_{t+1} = \theta_t - \frac{\gamma}{\sqrt{{w}_{t+1}}+\epsilon}(\nabla J(\theta_{t})+\lambda\theta_t) wt+1=ρwt+(1ρ)(J(θt)+λθt)2θt+1=θtwt+1 +ϵγ(J(θt)+λθt)

Adadelta

是对Adagrad的优化, 除了梯度累计使用指数加权平均的方式以外, 同时依据二阶牛顿法, 学习率也会动态调整.

在二阶牛顿法中, x t + 1 = x t − f ′ ( x t ) f ′ ′ ( x t ) x_{t+1} = x_t -\frac{f'(x_t)}{f''(x_t)} xt+1=xtf(xt)f(xt), 对比SGD, 学习率可以设为 1 f ′ ′ ( x t ) \frac{1}{f''(x_t)} f(xt)1

大概就是用累计梯度比累计梯度变化量近似二阶导数

  • w w w 定义为历史累计梯度
  • Δ θ \Delta\theta Δθ 定义为梯度变化累计量
  • ρ \rho ρ 定义为梯度指数加权平均参数
  • ϵ \epsilon ϵ 表示特别小的数, 确保分母不为0

w t + 1 = ρ v t + ( 1 − ρ ) ∇ 2 J ( θ t ) Δ θ ^ = Δ θ t + ϵ w t + 1 + ϵ ∇ J ( θ t ) ; Δ θ t + 1 = ρ Δ θ t + ( 1 − ρ ) Δ θ ^ 2 θ t + 1 = θ t − Δ θ ^ {w}_{t+1}=\rho{v}_{t}+(1-\rho)\nabla^2 J(\theta_{t})\\\Delta\hat\theta = \frac{\sqrt{\Delta\theta_{t}+\epsilon}}{\sqrt{{w}_{t+1}+\epsilon}}\nabla J(\theta_{t});\Delta\theta_{t+1} = \rho\Delta\theta_{t}+(1-\rho)\Delta\hat\theta^2\\\theta_{t+1} = \theta_t - \Delta\hat\theta wt+1=ρvt+(1ρ)2J(θt)Δθ^=wt+1+ϵ Δθt+ϵ J(θt);Δθt+1=ρΔθt+(1ρ)Δθ^2θt+1=θtΔθ^

优点:

  • 自适应步长
  • 避免学习率不断衰减为0
  • 二阶收敛

缺点:

  • 没有致命的缺点

L2正则化

w t + 1 = ρ v t + ( 1 − ρ ) ( ∇ J ( θ t ) + λ θ t ) 2 Δ θ ^ = Δ θ t + ϵ w t + 1 + ϵ ( ∇ J ( θ t ) + λ θ t ) ; Δ θ t + 1 = ρ Δ θ t + ( 1 − ρ ) Δ θ ^ 2 θ t + 1 = θ t − Δ θ ^ {w}_{t+1}=\rho{v}_{t}+(1-\rho)(\nabla J(\theta_{t})+\lambda\theta_t)^2\\\Delta\hat\theta = \frac{\sqrt{\Delta\theta_{t}+\epsilon}}{\sqrt{{w}_{t+1}+\epsilon}}(\nabla J(\theta_{t})+\lambda\theta_t);\Delta\theta_{t+1} = \rho\Delta\theta_{t}+(1-\rho)\Delta\hat\theta^2\\\theta_{t+1} = \theta_t - \Delta\hat\theta wt+1=ρvt+(1ρ)(J(θt)+λθt)2Δθ^=wt+1+ϵ Δθt+ϵ (J(θt)+λθt);Δθt+1=ρΔθt+(1ρ)Δθ^2θt+1=θtΔθ^

可以看到adadelta速度最快, 其次是nesterov (二阶优化)

Adagrad 和 RMSprop 衰减learning rate 之后 后期更新缓慢.

SGD陷入鞍点无法跳出.

这里写图片描述

Adam

Adagrad 与 momentum 的结合. 并且为了避免初始值为零, 进行误差修正.

  • v v v 定义为历史累计动量, 累计到本次梯度就是参数更新的方向
  • w w w 定义为历史累计梯度
  • μ \mu μ 定义为动量参数, 设为0.99
  • ρ \rho ρ 定义为梯度指数加权平均参数,设为0.999
  • ϵ \epsilon ϵ 表示特别小的数, 确保分母不为0

v t + 1 = μ v t + ( 1 − μ ) ∇ J ( θ t ) w t + 1 = ρ w t + ( 1 − ρ ) ∇ 2 J ( θ t ) v ^ = v t + 1 1 − μ t + 1 w ^ = w t + 1 1 − ρ t + 1 + ϵ θ t + 1 = θ t − γ w ^ v ^ {v}_{t+1}={\mu}{v}_{t}+(1-\mu)\nabla J(\theta_{t})\\{w}_{t+1}=\rho{w}_{t}+(1-\rho)\nabla^2 J(\theta_{t})\\\hat v = \frac{v^{t+1}}{1-\mu^{t+1}}\\\hat w = \frac{{w}_{t+1}}{{1-\rho^{t+1}}+\epsilon}\\\theta_{t+1} = \theta_t - \frac{\gamma}{\sqrt{\hat w}} \hat v vt+1=μvt+(1μ)J(θt)wt+1=ρwt+(1ρ)2J(θt)v^=1μt+1vt+1w^=1ρt+1+ϵwt+1θt+1=θtw^ γv^

Adam通常需要比SGD更多的regularization,因此在从SGD切换到Adam时,请务必调整正则化超参数

优点:

  • 当陷入鞍点, 梯度为0, 但是由于历史累计动量的存在, 会迅速跳出鞍点(momentum)
  • 缓解SGD更新loss的震荡, 加快模型收敛(momentum)
  • 自适应步长
  • 避免学习率不断衰减为0
  • 通过恒等变化 θ t + 1 = θ t − γ 1 − ρ t + 1 1 − μ t + 1 v t + 1 w t + 1 \theta_{t+1} = \theta_t - \gamma\frac{\sqrt{1-\rho^{t+1}}}{1-\mu^{t+1}}\frac{v_{t+1}}{\sqrt{w^{t+1}}} θt+1=θtγ1μt+11ρt+1 wt+1 vt+1 学习率 存在一个隐形的warm-up, 初始值会从0.05倍增长到0.5倍. 当然实际上会由于累计梯度的存在不会增长到0.5倍, 但是 γ w ^ \frac{\gamma}{\sqrt{\hat w}} w^ γ的曲线必然是先增后降.

缺点:

  • 同RMSprop, 模型存在无法收敛到最优的情况.
  • 可能不收敛

amsgrad

AdamW

如果按照之前的正则化规则, 则只需要直接在梯度上增加正则项 ( ∇ J ( θ t ) + λ θ t ) (\nabla J(\theta_{t})+\lambda\theta_t) (J(θt)+λθt), 并参与其他运算.

但是根据相关论文, 直接对参数进行梯度衰减, 效果更好.

  • λ \lambda λ 表示L2正则化参数

θ t = ( 1 − γ λ ) θ t v t + 1 = μ v t + ( 1 − μ ) ∇ J ( θ t ) w t + 1 = ρ w t + ( 1 − ρ ) ∇ 2 J ( θ t ) v ^ = v t + 1 1 − μ t + 1 w ^ = w t + 1 1 − ρ t + 1 + ϵ θ t + 1 = θ t − γ w ^ v ^ \theta_t = (1-\gamma \lambda)\theta_t\\{v}_{t+1}={\mu}{v}_{t}+(1-\mu)\nabla J(\theta_{t})\\{w}_{t+1}=\rho{w}_{t}+(1-\rho)\nabla^2 J(\theta_{t})\\\hat v = \frac{v^{t+1}}{1-\mu^{t+1}}\\\hat w = \frac{{w}_{t+1}}{{1-\rho^{t+1}}+\epsilon}\\\theta_{t+1} = \theta_t - \frac{\gamma}{\sqrt{\hat w}} \hat v θt=(1γλ)θtvt+1=μvt+(1μ)J(θt)wt+1=ρwt+(1ρ)2J(θt)v^=1μt+1vt+1w^=1ρt+1+ϵwt+1θt+1=θtw^ γv^

一文告诉你Adam、AdamW、Amsgrad区别和联系

Adamax

Adamax 是对 Adam 增加了一个学习率上限的概念.

将Adam中累计权重2范式累加修改为无穷范式累加.
v t + 1 = μ v t + ( 1 − μ ) ∇ J ( θ t ) w t + 1 = m a x ( ρ w t , ∣ ∇ J ( θ t ) ∣ ) v ^ = v t + 1 1 − μ t + 1 θ t + 1 = θ t − γ w ^ v ^ {v}_{t+1}={\mu}{v}_{t}+(1-\mu)\nabla J(\theta_{t})\\{w}_{t+1}=max(\rho{w}_{t},|\nabla J(\theta_{t})|)\\\hat v = \frac{v^{t+1}}{1-\mu^{t+1}}\\\theta_{t+1} = \theta_t - \frac{\gamma}{\hat w} \hat v vt+1=μvt+(1μ)J(θt)wt+1=max(ρwt,J(θt))v^=1μt+1vt+1θt+1=θtw^γv^

衰减项等价地为 ρ p \rho^p ρp, ∇ J ( θ t ) \nabla J(\theta_{t}) J(θt) 定义为 g i g_i gi.
w t = lim ⁡ p → ∞ ( v t ) 1 / p w_{t}=\lim _{p \rightarrow \infty}\left(v_{t}\right)^{1 / p} wt=plim(vt)1/p

w t = lim ⁡ p → ∞ ( v t ) 1 / p = lim ⁡ p → ∞ ( ( 1 − ρ p ) ∑ i = 1 t ρ p ( t − i ) ⋅ ∣ g i ∣ p ) 1 / p = lim ⁡ p → ∞ ( 1 − ρ p ) 1 / p ( ∑ i = 1 t ρ p ( t − i ) ⋅ ∣ g i ∣ p ) 1 / p = lim ⁡ p → ∞ ( ∑ i = 1 t ( ρ ( t − i ) ⋅ ∣ g i ∣ ) p ) 1 / p = max ⁡ ( ρ t − 1 ∣ g 1 ∣ , ρ t − 2 ∣ g 2 ∣ , … , ρ ∣ g t − 1 ∣ , ∣ g t ∣ ) \begin{aligned}w_{t}=\lim _{p \rightarrow \infty}\left(v_{t}\right)^{1 / p} &=\lim _{p \rightarrow \infty}\left(\left(1-\rho^{p}\right) \sum_{i=1}^{t} \rho^{p(t-i)} \cdot\left|g_{i}\right|^{p}\right)^{1 / p} \\&=\lim _{p \rightarrow \infty}\left(1-\rho^{p}\right)^{1 / p}\left(\sum_{i=1}^{t} \rho^{p(t-i)} \cdot\left|g_{i}\right|^{p}\right)^{1 / p} \\&=\lim _{p \rightarrow \infty}\left(\sum_{i=1}^{t}\left(\rho^{(t-i)} \cdot\left|g_{i}\right|\right)^{p}\right)^{1 / p} \\&=\max \left(\rho^{t-1}\left|g_{1}\right|, \rho^{t-2}\left|g_{2}\right|, \ldots, \rho\left|g_{t-1}\right|,\left|g_{t}\right|\right)\end{aligned} wt=plim(vt)1/p=plim((1ρp)i=1tρp(ti)gip)1/p=plim(1ρp)1/p(i=1tρp(ti)gip)1/p=plim(i=1t(ρ(ti)gi)p)1/p=max(ρt1g1,ρt2g2,,ρgt1,gt)

优点:

缺点:

https://zhuanlan.zhihu.com/p/22252270

SparseAdam

针对稀疏变量的adam

LBFGS

L-BFGS 属于拟牛顿算法. L-BFGS 是对 BFGS 的改进, 特点就是节省内存

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值