TeamClass_MD/Tensorflow的优化器.md
2025-03-15 20:08:09 +08:00

6.1 KiB
Raw Blame History

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) AdamWAdam 的改进版)

原理
解决 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) NadamNesterov 加速 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) AMSGradAdam 的改进版)

原理
修正 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 用于追求更快的收敛或稳定性。