Optimizor

定义:

  • fθf_\theta表示模型
  • θt\theta_t 表示模型在更新t次后的参数
  • y^=fθ(x)\hat{y} = f_\theta(x) 表示模型预测值
  • J(y^,y)J(\hat{y},y^*) 表示真值 yy^* 与预测值 y^\hat{y} 的损失函数
  • J(θt)\nabla J\left(\theta_{t}\right) 是损失函数 JJ 对于 $\theta_t $ 的梯度 Jθt\frac{\partial{J}}{\partial \theta_{t}}, 也就是参数 $\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)

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

优点:

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

缺点:

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

momentum

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

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

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

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

优点:

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

缺点:

  • 没有致命的缺点

nesterov

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

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

在实现上, nesterov需要计算两次导数, 经过恒等变化以下形式, 可以重复利用当前梯度, 获取最终更新的方向.[3]
vt+1=μvt+J(θt)n=μvt+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

优点:

  • 使得momentum可以更快的收敛

缺点:

  • 没有致命的缺点

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

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

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

L2正则化

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

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

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

ASGD

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

Rprop

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

优点:

  • 会比原始SGD快一点

缺点:

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

Adagrad

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

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

wt+1=wt+2J(θt)θt+1=θtγwt+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})

优点:

  • 自适应步长

缺点:

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

L2正则化

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

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

wt+1=wt+(J(θt)+λθt)2θt+1=θtγ(1+(t1)λ)wt+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)

RMSprop

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

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

wt+1=ρwt+(1ρ)2J(θt)θt+1=θtγwt+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})

优点:

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

缺点:

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

L2正则化

同Adagrad, 但是实现上没有修正学习率
wt+1=ρwt+(1ρ)(J(θt)+λθt)2θt+1=θtγwt+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)

Adadelta

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

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

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

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

wt+1=ρvt+(1ρ)2J(θt)Δθ^=Δθt+ϵwt+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

优点:

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

缺点:

  • 没有致命的缺点

L2正则化

wt+1=ρvt+(1ρ)(J(θt)+λθt)2Δθ^=Δθt+ϵwt+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

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

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

SGD陷入鞍点无法跳出.

【Optimizor】Pytorch 实现汇总

Adam

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

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

vt+1=μvt+(1μ)J(θt)wt+1=ρwt+(1ρ)2J(θt)v^=vt+11μt+1w^=wt+11ρ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

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

优点:

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

缺点:

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

amsgrad

AdamW

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

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

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

θt=(1γλ)θtvt+1=μvt+(1μ)J(θt)wt+1=ρwt+(1ρ)2J(θt)v^=vt+11μt+1w^=wt+11ρ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

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

Adamax

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

将Adam中累计权重2范式累加修改为无穷范式累加.
vt+1=μvt+(1μ)J(θt)wt+1=max(ρwt,J(θt))v^=vt+11μ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

衰减项等价地为 ρp\rho^p, J(θt)\nabla J(\theta_{t}) 定义为 gig_i.
wt=limp(vt)1/p w_{t}=\lim _{p \rightarrow \infty}\left(v_{t}\right)^{1 / p}

wt=limp(vt)1/p=limp((1ρp)i=1tρp(ti)gip)1/p=limp(1ρp)1/p(i=1tρp(ti)gip)1/p=limp(i=1t(ρ(ti)gi)p)1/p=max(ρt1g1,ρt2g2,,ρgt1,gt) \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}

优点:

缺点:

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

SparseAdam

针对稀疏变量的adam

LBFGS

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

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-06-06
  • 2021-10-08
  • 2021-05-02
  • 2021-12-26
  • 2021-05-09
猜你喜欢
  • 2022-12-23
  • 2022-01-01
  • 2022-12-23
  • 2021-09-19
  • 2021-10-27
  • 2021-11-27
  • 2021-12-22
相关资源
相似解决方案