文章目录
- 前置知识
- 指数移动平均EMA
- L2正则(L2 Regularization)
- 权重衰减(Weight Decay)
- 优化器
- SDG
- Momentum
- NAG
- Adagrad
- RMSProp
- AdaDelta
- Adam
- AdamW
- 综上
- 学习率
- StepLR
- MultiStepLR
- Exponential
- CosineAnealing
- RLROP(ReduceLRonPlateau)
- lambda
- 总结
前置知识
指数移动平均EMA
- 给予近期数据更高权重的平均方法
V t = α ⋅ x t + ( 1 − α ) ⋅ V t − 1 V_t = \alpha \cdot x_t + (1 - \alpha) \cdot V_{t-1} Vt=α⋅xt+(1−α)⋅Vt−1
L2正则(L2 Regularization)
- 约束 weights 不要太大
L ′ = L + 1 2 λ ⋅ ∑ i = 1 n w t 2 L' = L+\frac{1}{2}\lambda \cdot \sum_{i=1}^{n} w_t^2 L′=L+21λ⋅i=1∑nwt2
权重衰减(Weight Decay)
w t = ( 1 − λ ) ⋅ w t − 1 − μ ⋅ g w_t = (1 - \lambda) \cdot w_{t-1} - \mu \cdot g wt=(1−λ)⋅wt−1−μ⋅g
优化器
SDG
- mini-batch gradient descent:随机选一批量
- 亲戚1:batch gradient descent:全部
- 亲戚2:stochatic gradient descent:随机选一个
w t + 1 = w t − η ⋅ ∇ J ( w t ) w_{t+1} = w_t - \eta \cdot \nabla J(w_t) wt+1=wt−η⋅∇J(wt)
Momentum
- 动量
- 利用EMA融入历史的梯度
- 原理:将历史梯度和当前梯度做合并
v t = γ ⋅ v t − 1 + ( 1 − γ ) ∗ J ( w t ) v_{t} = \gamma \cdot v_{t-1} + (1-\gamma)* J(w_t) vt=γ⋅vt−1+(1−γ)∗J(wt)
w t = w t − 1 − μ ∗ v t w_{t} = w_{t-1} -\mu* v_{t} wt=wt−1−μ∗vt
NAG
- 改进(Nesterov accelerated gradient)
- 原理:先按照历史梯度走一小步,然后再进行合并
v t + 1 = γ ⋅ v t + ∇ J ( w t − α ⋅ γ ⋅ v t ) v_{t+1} = \gamma \cdot v_t + \nabla J(w_t - \alpha·\gamma \cdot v_t) vt+1=γ⋅vt+∇J(wt−α⋅γ⋅vt)
w t + 1 = w t − α v t + 1 w_{t+1} = w_t - \alpha v_{t+1} wt+1=wt−αvt+1
Adagrad
- 历史梯度+当前梯度的平方
- 对学习率进行约束
- 前期较小的时候,r较大,能放大梯度
- 后期较大的时候,r较小,能约束梯度
g
t
+
1
=
g
t
+
(
∇
J
(
w
t
)
)
2
g_{t+1} = g_t + (\nabla J(w_t))^2
gt+1=gt+(∇J(wt))2
w
t
+
1
=
w
t
−
η
g
t
+
1
+
ϵ
⋅
∇
J
(
w
t
)
w_{t+1} = w_t - \frac{\eta}{\sqrt{g_{t+1} + \epsilon}} \cdot \nabla J(w_t)
wt+1=wt−gt+1+ϵη⋅∇J(wt)
RMSProp
- 在Adagrad上加上EMA思想
g t + 1 = ρ g t + ( 1 − ρ ) ( ∇ J ( w t ) ) 2 g_{t+1} = \rho g_t + (1 - \rho)(\nabla J(w_t))^2 gt+1=ρgt+(1−ρ)(∇J(wt))2
w t + 1 = w t − η g t + 1 + ϵ ⋅ ∇ J ( w t ) w_{t+1} = w_t - \frac{\eta}{\sqrt{g_{t+1} + \epsilon}} \cdot \nabla J(w_t) wt+1=wt−gt+1+ϵη⋅∇J(wt)
AdaDelta
- 也是在Adagrad上进行改进,不需要提前设置学习率
- 原理尽可能听,听不懂也没关系
Δ w t = − Δ w t − 1 + ϵ g t + 1 + ϵ ⋅ ∇ J ( w t ) \Delta w_t = -\frac{\sqrt{\Delta w_{t-1} + \epsilon}}{\sqrt{g_{t+1} + \epsilon}} \cdot \nabla J(w_t) Δwt=−gt+1+ϵΔwt−1+ϵ⋅∇J(wt)
Adam
- 用EMA更新梯度,用RMSProp更新学习率,然后进行修正,来避免冷启动,避免训练开始时梯度很小,参数更新很慢
m
t
+
1
=
β
1
m
t
+
(
1
−
β
1
)
∇
J
(
w
t
)
m_{t+1} = \beta_1 m_t + (1 - \beta_1) \nabla J(w_t)
mt+1=β1mt+(1−β1)∇J(wt)
v
t
+
1
=
β
2
v
t
+
(
1
−
β
2
)
(
∇
J
(
w
t
)
)
2
v_{t+1} = \beta_2 v_t + (1 - \beta_2)(\nabla J(w_t))^2
vt+1=β2vt+(1−β2)(∇J(wt))2
m
^
t
+
1
=
m
t
+
1
1
−
β
1
t
+
1
\hat{m}_{t+1} = \frac{m{t+1}}{1 - \beta_1^{t+1}}
m^t+1=1−β1t+1mt+1
v
^
t
+
1
=
v
t
+
1
1
−
β
2
t
+
1
\hat{v}_{t+1} = \frac{v{t+1}}{1 - \beta_2^{t+1}}
v^t+1=1−β2t+1vt+1
w
t
+
1
=
w
t
−
η
v
^
t
+
1
+
ϵ
⋅
m
^
t
+
1
w_{t+1} = w_t - \frac{\eta}{\sqrt{\hat{v}_{t+1}} + \epsilon} \cdot \hat{m}_{t+1}
wt+1=wt−v^t+1+ϵη⋅m^t+1
AdamW
- 数学推导比AdaDelta还难,改进好Adam几乎一样
综上
- 如果追求优化器效果,直接使用AdamW
学习率
StepLR
- 等间隔调整学习率
MultiStepLR
- 给定间隔调整学习率
Exponential
- 调整策略上带上指数项
CosineAnealing
- 余弦周期调整学习率
- 比较有助于跳出局部极小值
RLROP(ReduceLRonPlateau)
- 非常实用
- 监控Loss和acc如果不再变化就进行学习率调整
lambda
- 自定义调整策略
总结
- 有序调整:前4个
- 自适应调整:RLROP
- 自定义调整
随机梯度下降去优化你的人生-李沐