Optimizor
定义:
-
fθ表示模型
-
θt 表示模型在更新t次后的参数
-
y^=fθ(x) 表示模型预测值
-
J(y^,y∗) 表示真值 y∗ 与预测值 y^ 的损失函数
-
∇J(θt) 是损失函数 J 对于 $\theta_t $ 的梯度 ∂θt∂J, 也就是参数 $\theta_t $ 要更新的方向
-
γ 表示学习率(learning rate)
公式中除了 γ 是常数, 其他都为向量.
运算过程除非特别指出, 都为逐元素运算(element-wise).
γ 进行广播运算(broadcast).
SGD
随机梯度下降(Stochastic Gradient Descent, SSG), 但是一般在实践时, 实际指的是小批量梯度下降(Mini-Batch Gradient Descent, MBGD).
也就是使用Batch下平均 loss 所求的导数 ∇J(θt)
θt+1=θt−γ∇J(θt)
优点:
- 更新稳定, 在长时间更新后, 会收敛到全局最优点附近
缺点:
- 使用一阶导数更新, 收敛速度慢 → Adagrad, Adadelta, Adam
- 使用固定的 γ , 可能会在沟壑的两边持续震荡,无法收敛到最优→ momentum, lr_scheduler
- 收敛到鞍点附近时, 梯度几乎为0, 会导致收敛缓慢 →momentum
momentum
带动量的梯度下降, 其实是指数加权平均对于参数更新的应用, 使得SGD的更新更加平滑.
在SGD基础上引入了一阶动量, 当前时刻的梯度与历史时刻梯度方向相似, 这种趋势在当前时刻则会加强; 要是不同, 则当前时刻的梯度方式减弱.[1]
-
v 定义为历史累计动量, 累计到本次梯度就是参数更新的方向
-
μ 定义为动量参数
vt+1=μvt+∇J(θt)θt+1=θt−γvt+1
优点:
- 当陷入鞍点, 梯度为0, 但是由于历史累计动量的存在, 会迅速跳出鞍点
- 缓解SGD更新loss的震荡, 加快模型收敛
缺点:
nesterov
在momentum-SGD中, θt 会沿着动量和当前梯度求和后的方向更新 γ 步长. 可以把更新步骤分成两部分, 第一次沿着动量方向更新, 第二次沿着梯度方向更新. 如果在第一次更新后, 重新计算新的梯度方向, 第二次沿着新的梯度方向更新, 再沿着动量方向更新就是nesterov.
vt+1=μvt+∇J(θt−γμvt)θt+1=θt−γvt+1
可以看到在nesterov中, 共使用了两次动量, 更新的方向更侧重与动量的方向.对第一个式子恒等变化:
vt+1=μvt+∇J(θt)+μ(∇J(θt−1)−∇J(θt−2))
与momentum相比, 更新的方向同时要参考历史梯度变化的方向, 也就是梯度的一阶导数, 损失函数的二阶导数.
如果这次的梯度比上次的梯度变大了,那么有理由相信它会继续变大下去,那我就把预计要增大的部分提前加进来;如果相比上次变小了,也是类似的情况。这样的解释听起来好像和原本的解释一样玄,但是读者可能已经发现了,这个多加上去的项不就是在近似目标函数的二阶导嘛!所以NAG本质上是多考虑了目标函数的二阶导信息,怪不得可以加速收敛了!其实所谓“往前看”的说法,在牛顿法这样的二阶方法中也是经常提到的,比喻起来是说“往前看”,数学本质上则是利用了目标函数的二阶导信息。由于利用了二阶导的信息,NAG算法才会比Momentum具有更快的收敛速度。[2]
在实现上, nesterov需要计算两次导数, 经过恒等变化以下形式, 可以重复利用当前梯度, 获取最终更新的方向.[3]
vt+1=μvt+∇J(θt)n=μvt+1+∇J(θt)θt+1=θt−γn
优点:
缺点:
一个框架看懂优化算法之异同 SGD/AdaGrad/Adam
比Momentum更快:揭开Nesterov Accelerated Gradient的真面目
深度学习中优化方法——momentum、Nesterov Momentum、AdaGrad、Adadelta、RMSprop、Adam
L2正则化
如果需要L2正则化, 并且使用momentum, 需要修改动量累计公式
vt+1=μvt+∇J(θt)+λθt
ASGD
平均随机梯度下降(Averaged Stochastic Gradient Descent, ASGD)用空间换时间的一种 SGD
Rprop
为了使SGD更新稍微快一点, 如果在同一个维度, 梯度符号相同, 则增大 γ , 反之减小.
优点:
缺点:
- 同SGD
- 增大减小的倍数是超参, 需要调参
- 只适用于full-batch
Adagrad
自适应步长, 随着更新次数的增加, 逐渐缩小 γ .对梯度取平方, 确保分母是不断变大的. 在N维空间中, 参数的每个维度更新快慢, 都取决于这个维度的梯度大小. 如果这一维累计梯度较大, 则步长较小, 累计梯度较小, 则步长较大, 使得参数更新, 使得不同的参数使用不同的学习率.
-
w 定义为历史累计梯度
-
ϵ 表示特别小的数, 确保分母不为0
wt+1=wt+∇2J(θt)θt+1=θt−wt+1+ϵγ∇J(θt)
优点:
缺点:
- 从训练开始时累积梯度平方会导致学习率过早过量的减少, 最终某些模型无法有效收敛.
L2正则化
如果需要L2正则化, 需要把衰减项添加到历史累计梯度中, 并且修正学习率
wt+1=wt+(∇J(θt)+λθt)2θt+1=θt−(1+(t−1)λ)wt+1+ϵγ(∇J(θt)+λθt)
RMSprop
是对Adagrad的优化, 梯度累计使用指数加权平均的方式.
-
w 定义为历史累计梯度
-
ρ 定义为梯度指数加权平均参数
-
ϵ 表示特别小的数, 确保分母不为0
wt+1=ρwt+(1−ρ)∇2J(θt)θt+1=θt−wt+1+ϵγ∇J(θt)
优点:
缺点:
- 因为梯度累计使用指数加权平均的方式, 窗口内梯度的变化会导致vt 忽大忽小, 在鞍点附近, 学习率较大可以跳出鞍点, 但是如果在最优点附近, 学习率变大会远离最优点.
L2正则化
同Adagrad, 但是实现上没有修正学习率
wt+1=ρwt+(1−ρ)(∇J(θt)+λθt)2θt+1=θt−wt+1+ϵγ(∇J(θt)+λθt)
Adadelta
是对Adagrad的优化, 除了梯度累计使用指数加权平均的方式以外, 同时依据二阶牛顿法, 学习率也会动态调整.
在二阶牛顿法中, xt+1=xt−f′′(xt)f′(xt), 对比SGD, 学习率可以设为f′′(xt)1
大概就是用累计梯度比累计梯度变化量近似二阶导数
-
w 定义为历史累计梯度
-
Δθ 定义为梯度变化累计量
-
ρ 定义为梯度指数加权平均参数
-
ϵ 表示特别小的数, 确保分母不为0
wt+1=ρvt+(1−ρ)∇2J(θt)Δθ^=wt+1+ϵΔθt+ϵ∇J(θt);Δθt+1=ρΔθt+(1−ρ)Δθ^2θt+1=θt−Δθ^
优点:
缺点:
L2正则化
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 定义为历史累计动量, 累计到本次梯度就是参数更新的方向
-
w 定义为历史累计梯度
-
μ 定义为动量参数, 设为0.99
-
ρ 定义为梯度指数加权平均参数,设为0.999
-
ϵ 表示特别小的数, 确保分母不为0
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+11−ρt+1wt+1vt+1 学习率 存在一个隐形的warm-up, 初始值会从0.05倍增长到0.5倍. 当然实际上会由于累计梯度的存在不会增长到0.5倍, 但是w^γ的曲线必然是先增后降.
缺点:
- 同RMSprop, 模型存在无法收敛到最优的情况.
- 可能不收敛
amsgrad
AdamW
如果按照之前的正则化规则, 则只需要直接在梯度上增加正则项 (∇J(θt)+λθt), 并参与其他运算.
但是根据相关论文, 直接对参数进行梯度衰减, 效果更好.
θ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^
一文告诉你Adam、AdamW、Amsgrad区别和联系
Adamax
Adamax 是对 Adam 增加了一个学习率上限的概念.
将Adam中累计权重2范式累加修改为无穷范式累加.
vt+1=μvt+(1−μ)∇J(θt)wt+1=max(ρwt,∣∇J(θt)∣)v^=1−μt+1vt+1θt+1=θt−w^γv^
衰减项等价地为 ρp, ∇J(θt) 定义为 gi.
wt=p→∞lim(vt)1/p
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 的改进, 特点就是节省内存