深度学习优化器详解
深度学习优化器详解
第一阶段:基础优化器
1.1 动量优化器
动量优化器 - Momentum Optimizer - 无标准缩写 - /moʊˈmɛntəm ˈɒptɪmaɪzər/
直观理解:下坡的保龄球
想象一个保龄球从山坡滚下:
- 普通梯度下降:像一个人小心翼翼下山
- 动量法:像保龄球,有惯性,越滚越快
数学本质
核心思想:累积历史梯度信息
vt=γvt−1+η∇J(θt)θt+1=θt−vt \begin{aligned} v_t &= \gamma v_{t-1} + \eta \nabla J(\theta_t) \\ \theta_{t+1} &= \theta_t - v_t \end{aligned} vtθt+1=γvt−1+η∇J(θt)=θt−vt
其中:
- vtv_tvt:当前速度(动量项)
- γ\gammaγ:动量系数,通常 γ=0.9\gamma = 0.9γ=0.9
- η\etaη:学习率
- ∇J(θt)\nabla J(\theta_t)∇J(θt):当前梯度
优劣对比
优点:
- 加速收敛
- 减少震荡
- 有助于跳出局部最优
缺点:
- 可能越过全局最优
- 需要调节动量系数
1.2 Nesterov加速梯度
Nesterov加速梯度 - Nesterov Accelerated Gradient - NAG - /ˈnɛstərɒv ækˈsɛləreɪtɪd ˈɡreɪdiənt/
直观理解:有预见的保龄球
球在滚动时会"向前看",根据前方地形调整方向
数学本质
前瞻性更新:
vt=γvt−1+η∇J(θt−γvt−1)θt+1=θt−vt \begin{aligned} v_t &= \gamma v_{t-1} + \eta \nabla J(\theta_t - \gamma v_{t-1}) \\ \theta_{t+1} &= \theta_t - v_t \end{aligned} vtθt+1=γvt−1+η∇J(θt−γvt−1)=θt−vt
关键区别:梯度计算在 θt−γvt−1\theta_t - \gamma v_{t-1}θt−γvt−1(向前看的位置)
优劣对比
优点:
- 比标准动量收敛更快
- 对凸函数有更好的理论保证
- 减少震荡
缺点:
- 实现稍复杂
- 计算成本略高
第二阶段:自适应学习率优化器
2.1 Adagrad
Adagrad - Adaptive Gradient Algorithm - 无缩写 - /ˈædəɡræd/
直观理解:个性化学习
为每个参数定制学习率:
- 频繁更新的参数:小学习率(精细调整)
- 不频繁更新的参数:大学习率(快速跟进)
数学本质
累积梯度平方:
Gt=Gt−1+(∇J(θt))2θt+1=θt−ηGt+ϵ⋅∇J(θt) \begin{aligned} G_t &= G_{t-1} + (\nabla J(\theta_t))^2 \\ \theta_{t+1} &= \theta_t - \frac{\eta}{\sqrt{G_t} + \epsilon} \cdot \nabla J(\theta_t) \end{aligned} Gtθt+1=Gt−1+(∇J(θt))2=θt−Gt+ϵη⋅∇J(θt)
其中:
- GtG_tGt:梯度平方累积
- ϵ\epsilonϵ:小常数(通常 10−810^{-8}10−8)防止除零
优劣对比
优点:
- 适合稀疏数据
- 自动调整学习率
- 对特征频率敏感
缺点:
- 学习率单调递减 → 最终停止学习
- 对深度网络效果不佳
2.2 Adadelta
Adadelta - Adaptive Delta - 无缩写 - /ə’dædeltə/
直观理解:自我调节的Adagrad
解决Adagrad学习率消失问题,不需要手动设置学习率
数学本质
滑动平均 + 自适应步长:
E[g2]t=ρE[g2]t−1+(1−ρ)(∇J(θt))2Δθt=−E[Δθ2]t−1+ϵE[g2]t+ϵ∇J(θt)θt+1=θt+ΔθtE[Δθ2]t=ρE[Δθ2]t−1+(1−ρ)(Δθt)2 \begin{aligned} E[g^2]_t &= \rho E[g^2]_{t-1} + (1-\rho) (\nabla J(\theta_t))^2 \\ \Delta\theta_t &= - \frac{\sqrt{E[\Delta\theta^2]_{t-1} + \epsilon}}{\sqrt{E[g^2]_t + \epsilon}} \nabla J(\theta_t) \\ \theta_{t+1} &= \theta_t + \Delta\theta_t \\ E[\Delta\theta^2]_t &= \rho E[\Delta\theta^2]_{t-1} + (1-\rho) (\Delta\theta_t)^2 \end{aligned} E[g2]tΔθtθt+1E[Δθ2]t=ρE[g2]t−1+(1−ρ)(∇J(θt))2=−E[g2]t+ϵE[Δθ2]t−1+ϵ∇J(θt)=θt+Δθt=ρE[Δθ2]t−1+(1−ρ)(Δθt)2
优劣对比
优点:
- 无需设置学习率
- 解决Adagrad学习率消失问题
- 对初始学习率不敏感
缺点:
- 早期训练可能不稳定
- 超参数 ρ\rhoρ 需要调节
2.3 RMSProp
RMSProp - Root Mean Square Propagation - 无缩写 - /ɑːr em es prɒp/
直观理解:Adagrad的改进版
使用指数移动平均代替累积求和。通过引入一个衰减系数,让每回合都衰减一定的比例。
数学本质
梯度平方的指数平均:
E[g2]t=γE[g2]t−1+(1−γ)(∇J(θt))2θt+1=θt−ηE[g2]t+ϵ∇J(θt) \begin{aligned} E[g^2]_t &= \gamma E[g^2]_{t-1} + (1-\gamma) (\nabla J(\theta_t))^2 \\ \theta_{t+1} &= \theta_t - \frac{\eta}{\sqrt{E[g^2]_t} + \epsilon} \nabla J(\theta_t) \end{aligned} E[g2]tθt+1=γE[g2]t−1+(1−γ)(∇J(θt))2=θt−E[g2]t+ϵη∇J(θt)
优劣对比
优点:
- 解决Adagrad学习率衰减问题
- 在非平稳目标上表现良好
- 适合RNN训练
缺点:
- 仍然需要设置学习率
- 学习率可能仍然衰减过快
第三阶段:组合优化器
3.1 Adam
Adam - Adaptive Moment Estimation - 无缩写 - /ˈædəm/
直观理解:动量 + RMSProp
结合了一阶矩估计(动量)和二阶矩估计(自适应学习率)
数学本质
动量 + 自适应学习率:
mt=β1mt−1+(1−β1)∇J(θt)vt=β2vt−1+(1−β2)(∇J(θt))2m^t=mt1−β1tv^t=vt1−β2tθt+1=θt−ηv^t+ϵm^t \begin{aligned} m_t &= \beta_1 m_{t-1} + (1-\beta_1) \nabla J(\theta_t) \\ v_t &= \beta_2 v_{t-1} + (1-\beta_2) (\nabla J(\theta_t))^2 \\ \hat{m}_t &= \frac{m_t}{1-\beta_1^t} \\ \hat{v}_t &= \frac{v_t}{1-\beta_2^t} \\ \theta_{t+1} &= \theta_t - \frac{\eta}{\sqrt{\hat{v}_t} + \epsilon} \hat{m}_t \end{aligned} mtvtm^tv^tθt+1=β1mt−1+(1−β1)∇J(θt)=β2vt−1+(1−β2)(∇J(θt))2=1−β1tmt=1−β2tvt=θt−v^t+ϵηm^t
默认参数:β1=0.9\beta_1=0.9β1=0.9, β2=0.999\beta_2=0.999β2=0.999, ϵ=10−8\epsilon=10^{-8}ϵ=10−8
优劣对比
优点:
- 收敛快速稳定
- 对超参数相对鲁棒
- 适合大多数深度学习任务
缺点:
- 可能在某些任务上泛化不如SGD
- 内存占用较大
3.2 AdaMax
AdaMax - Adaptive Moment Estimation with Infinity Norm - 无缩写 - /ˈeɪdəmæks/
直观理解:Adam的无穷范数版本
使用 L∞L_\inftyL∞ 范数代替 L2L_2L2 范数
数学本质
基于无穷范数的自适应:
mt=β1mt−1+(1−β1)∇J(θt)ut=max(β2ut−1,∣∇J(θt)∣)m^t=mt1−β1tθt+1=θt−ηutm^t \begin{aligned} m_t &= \beta_1 m_{t-1} + (1-\beta_1) \nabla J(\theta_t) \\ u_t &= \max(\beta_2 u_{t-1}, |\nabla J(\theta_t)|) \\ \hat{m}_t &= \frac{m_t}{1-\beta_1^t} \\ \theta_{t+1} &= \theta_t - \frac{\eta}{u_t} \hat{m}_t \end{aligned} mtutm^tθt+1=β1mt−1+(1−β1)∇J(θt)=max(β2ut−1,∣∇J(θt)∣)=1−β1tmt=θt−utηm^t
优劣对比
优点:
- 数值稳定性更好
- 在某些任务上比Adam更稳定
- 理论性质更优雅
缺点:
- 实践中不一定优于Adam
- 较少被采用
3.3 Nadam
Nadam - Nesterov-accelerated Adaptive Moment Estimation - 无缩写 - /ˈnædəm/
直观理解:Adam + Nesterov动量
结合了Adam的自适应学习率和Nesterov的前瞻性
数学本质
Nesterov动量的Adam:
mt=β1mt−1+(1−β1)∇J(θt)vt=β2vt−1+(1−β2)(∇J(θt))2m^t=mt1−β1t+(1−β1)∇J(θt)1−β1tv^t=vt1−β2tθt+1=θt−ηv^t+ϵm^t \begin{aligned} m_t &= \beta_1 m_{t-1} + (1-\beta_1) \nabla J(\theta_t) \\ v_t &= \beta_2 v_{t-1} + (1-\beta_2) (\nabla J(\theta_t))^2 \\ \hat{m}_t &= \frac{m_t}{1-\beta_1^t} + \frac{(1-\beta_1) \nabla J(\theta_t)}{1-\beta_1^t} \\ \hat{v}_t &= \frac{v_t}{1-\beta_2^t} \\ \theta_{t+1} &= \theta_t - \frac{\eta}{\sqrt{\hat{v}_t} + \epsilon} \hat{m}_t \end{aligned} mtvtm^tv^tθt+1=β1mt−1+(1−β1)∇J(θt)=β2vt−1+(1−β2)(∇J(θt))2=1−β1tmt+1−β1t(1−β1)∇J(θt)=1−β2tvt=θt−v^t+ϵηm^t
优劣对比
优点:
- 结合Nesterov和Adam的优点
- 通常比Adam收敛更快
- 对某些问题有更好的理论保证
缺点:
- 实现更复杂
- 超参数调节更敏感
第四阶段:总结对比与实战应用
4.1 优化器对比总结
| 优化器 | 中文名 | 核心思想 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|---|
| Momentum | 动量优化器 | 惯性加速 | 减少震荡,加速收敛 | 可能越过最优 | 一般优化问题 |
| NAG | Nesterov加速梯度 | 前瞻性动量 | 收敛更快,更稳定 | 实现复杂 | 理论要求高的问题 |
| Adagrad | 自适应梯度 | 个性化学习率 | 适合稀疏数据 | 学习率消失 | 稀疏特征学习 |
| Adadelta | Adadelta | 自适应步长 | 无需学习率 | 早期不稳定 | 自动调节需求 |
| RMSProp | RMSProp | 指数平均梯度 | 解决学习率消失 | 仍需学习率 | RNN,非平稳目标 |
| Adam | Adam | 动量+自适应 | 快速稳定,鲁棒 | 泛化可能稍差 | 深度学习默认 |
| AdaMax | AdaMax | 无穷范数Adam | 数值稳定 | 不常用 | 特定理论需求 |
| Nadam | Nadam | Nesterov+Adam | 收敛最快 | 超参数敏感 | 追求极致性能 |
4.2 实战应用指南
超参数默认值
# 常用优化器配置
optimizers = {'SGD': {'lr': 0.01, 'momentum': 0.9},'Adam': {'lr': 0.001, 'betas': (0.9, 0.999)},'RMSprop': {'lr': 0.001, 'alpha': 0.9},'Adagrad': {'lr': 0.01},'Adadelta': {'rho': 0.95}
}
选择策略
- 默认选择:Adam(大多数深度学习任务)
- 计算机视觉:SGD + Momentum(可能获得更好泛化)
- 自然语言处理:Adam或AdamW(带权重衰减)
- 强化学习:RMSProp或Adam
- 稀疏数据:Adagrad或FTRL
学习率调度配合
# 结合学习率调度器
scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=30, gamma=0.1)
4.3 现代最佳实践
- AdamW:Adam + 正确的权重衰减
- Lookahead:包装任何优化器提升稳定性
- RAdam:Rectified Adam,解决早期方差问题
- LAMB:Layer-wise Adaptive Moments,适合大batch训练
总结
通过从直观理解到数学本质的递进讲解,我们掌握了:
- 基础优化器:Momentum、NAG - 解决梯度下降的震荡问题
- 自适应优化器:Adagrad、Adadelta、RMSProp - 自动调整学习率
- 组合优化器:Adam、AdaMax、Nadam - 结合动量和自适应学习率
实践建议:
- 从Adam开始,它适合大多数深度学习任务
- 如果需要更好泛化,尝试SGD + Momentum
- 始终配合适当的学习率调度
- 监控训练过程,根据任务特性调整优化器
理解这些优化器的原理和特性,能够帮助我们在实际项目中做出更明智的选择和调优。
