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}} ∂θt∂J, 也就是参数 $\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(θt−1)−∇J(θt−2))
与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=θt−wt+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+(t−1)λ)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=θt−wt+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=θt−wt+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=xt−f′′(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=θt−w^γ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+1wt+1vt+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=θt−w^γv^
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=θt−w^γ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=p→∞lim(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=p→∞lim(vt)1/p=p→∞lim((1−ρp)i=1∑tρp(t−i)⋅∣gi∣p)1/p=p→∞lim(1−ρp)1/p(i=1∑tρp(t−i)⋅∣gi∣p)1/p=p→∞lim(i=1∑t(ρ(t−i)⋅∣gi∣)p)1/p=max(ρt−1∣g1∣,ρt−2∣g2∣,…,ρ∣gt−1∣,∣gt∣)
优点:
缺点:
https://zhuanlan.zhihu.com/p/22252270
SparseAdam
针对稀疏变量的adam
LBFGS
L-BFGS 属于拟牛顿算法. L-BFGS 是对 BFGS 的改进, 特点就是节省内存