6.1 KiB
1. 基础优化器
(1) SGD(随机梯度下降)
• 原理:
沿梯度的反方向以固定步长(学习率)更新参数。
公式:
\theta_{t+1} = \theta_t - \eta \cdot \nabla_\theta J(\theta_t)
•\eta
: 学习率
•\nabla_\theta J(\theta_t)
: 参数$\theta$在损失函数$J$处的梯度
• 特点:
• 优点:简单、稳定,适合凸优化问题。
• 缺点:对学习率敏感,可能陷入局部最优或震荡。
• 适用场景:小型网络或需要精细调参的任务。
• 代码示例:
optimizer = tf.keras.optimizers.SGD(learning_rate=0.01)
(2) Momentum(动量)
• 原理:
在 SGD 基础上引入动量项,加速收敛并减少震荡。动量模拟物理中的惯性。
公式:
$$v_t = \gamma v_{t-1} + \eta \cdot \nabla_\theta J(\theta_t) \
\theta_{t+1} = \theta_t - v_t$$
•\gamma
: 动量系数(通常取 0.9)
• 特点:
• 优点:加速收敛,减少梯度震荡。
• 适用场景:训练深层网络或复杂非凸问题。
• 代码示例:
optimizer = tf.keras.optimizers.SGD(learning_rate=0.01, momentum=0.9)
2. 自适应学习率优化器
(1) Adagrad(自适应梯度算法)
• 原理:
根据参数自适应调整学习率,频繁更新的参数使用更小的学习率。
公式:
$$ r_t = r_{t-1} + \eta \cdot (\nabla_\theta J(\theta_t))^2 \
\theta_{t+1} = \theta_t - \frac{\eta \cdot \nabla_\theta J(\theta_t)}{\sqrt{r_t} + \epsilon}$$
•r_t
: 累计梯度平方和
•\epsilon
: 防止除零的小常数
• 特点:
• 优点:自动调整学习率,适合稀疏数据(如 NLP)。
• 缺点:学习率可能过早衰减。
• 代码示例:
optimizer = tf.keras.optimizers.Adagrad(learning_rate=0.01)
(2) RMSProp(均方根传播)
• 原理:
对梯度平方取指数移动平均,调整学习率以平衡不同参数的更新。
公式:
$$r_t = \gamma r_{t-1} + (1-\gamma) (\nabla_\theta J(\theta_t))^2 \
\theta_{t+1} = \theta_t - \frac{\eta \cdot \nabla_\theta J(\theta_t)}{\sqrt{r_t} + \epsilon}$$
•\gamma
: 冷却系数(通常取 0.9)
• 特点:
• 优点:缓解 Adagrad 学习率衰减过快的问题。
• 适用场景:训练循环神经网络(RNN)。
• 代码示例:
optimizer = tf.keras.optimizers.RMSProp(learning_rate=0.001, rho=0.9)
(3) Adam(自适应矩估计)
• 原理:
结合 Momentum 和 RMSProp,同时维护一阶矩(均值)和二阶矩(方差)。
公式:
$$ m_t = \beta_1 m_{t-1} + (1-\beta_1) \cdot \nabla_\theta J(\theta_t) \
v_t = \beta_2 v_{t-1} + (1-\beta_2) \cdot (\nabla_\theta 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 \cdot \hat{m}_t}{\sqrt{\hat{v}_t} + \epsilon}$$
•$\beta_1$、\beta_2
: 衰减率(通常取 0.9 和 0.999)
• 特点:
• 优点:快速收敛,内存效率高,适用于大规模数据和复杂网络。
• 缺点:可能对初始学习率敏感。
• 适用场景:大多数深度学习任务(如 CNN、RNN)。
• 代码示例:
optimizer = tf.keras.optimizers.Adam(learning_rate=0.001)
(4) AdamW(Adam 的改进版)
• 原理:
解决 Adam 的权重衰减(Weight Decay)与梯度裁剪的冲突,通过分离参数更新和权重衰减。
改进点:
\theta_{t+1} = \theta_t - \frac{\eta \cdot \hat{m}_t}{\sqrt{\hat{v}_t} + \epsilon} - \eta \cdot \lambda \cdot \theta_t
•\lambda
: 权重衰减系数
• 特点:
• 优点:提升训练稳定性,减少过拟合,效果优于标准 Adam。
• 适用场景:大规模图像分类(如 ImageNet)。
• 代码示例:
optimizer = tf.keras.optimizers.AdamW(learning_rate=0.001, weight_decay=0.01)
3. 高级优化器
(1) Nadam(Nesterov 加速 Adam)
• 原理:
在 Adam 基础上引入 Nesterov 动量,提前修正梯度方向。
公式:
$$\hat{g}t = \nabla\theta J(\theta_t - \gamma \cdot m_{t-1}) \
m_t = \beta_1 m_{t-1} + (1-\beta_1) \cdot \hat{g}t \
\theta{t+1} = \theta_t - \frac{\eta \cdot m_t}{\sqrt{v_t} + \epsilon} $$
•\gamma
: Nesterov 动量系数(通常取 0.9)
• 特点:
• 优点:比 Adam 更快的收敛速度。
• 适用场景:需要快速训练的场景。
• 代码示例:
optimizer = tf.keras.optimizers.Nadam(learning_rate=0.001)
(2) AMSGrad(Adam 的改进版)
• 原理:
修正 Adam 中二阶矩估计的偏差,使用历史最大值替代当前方差。
公式:
v_t^{corrected} = \max(v_t, v_{t-1}^{corrected})
• 特点:
• 优点:提升训练稳定性,尤其在动态损失函数场景下。
• 适用场景:动态梯度或噪声较大的环境。
• 代码示例:
optimizer = tf.keras.optimizers.Adam(learning_rate=0.001, amsgrad=True)
4. 选择优化器的建议
场景 | 推荐优化器 |
---|---|
简单模型/小数据集 | SGD with Momentum |
复杂模型/大规模数据 | Adam / AdamW |
RNN 或序列任务 | RMSProp |
需要快速收敛 | Nadam |
权重衰减敏感问题 | AdamW |
5. 总结
- SGD 和 Momentum 是基础,适合理解优化原理。
- Adam 和 AdamW 是工业级默认选择,适用于大多数场景。
- RMSProp 和 Adagrad 适合特定任务(如 RNN 或稀疏数据)。
- Nadam 和 AMSGrad 用于追求更快的收敛或稳定性。