### **1. 基础优化器** #### **(1) SGD(随机梯度下降)** • **原理**: 沿梯度的反方向以固定步长(学习率)更新参数。 **公式**: $$\theta_{t+1} = \theta_t - \eta \cdot \nabla_\theta J(\theta_t)$$ •$\eta$: 学习率 •$\nabla_\theta J(\theta_t)$: 参数$\theta$在损失函数$J$处的梯度 • **特点**: • **优点**:简单、稳定,适合凸优化问题。 • **缺点**:对学习率敏感,可能陷入局部最优或震荡。 • **适用场景**:小型网络或需要精细调参的任务。 • **代码示例**: ```python 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) • **特点**: • **优点**:加速收敛,减少梯度震荡。 • **适用场景**:训练深层网络或复杂非凸问题。 • **代码示例**: ```python 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)。 • **缺点**:学习率可能过早衰减。 • **代码示例**: ```python 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)。 • **代码示例**: ```python 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)。 • **代码示例**: ```python 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)。 • **代码示例**: ```python 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 更快的收敛速度。 • **适用场景**:需要快速训练的场景。 • **代码示例**: ```python optimizer = tf.keras.optimizers.Nadam(learning_rate=0.001) ``` --- #### **(2) AMSGrad(Adam 的改进版)** • **原理**: 修正 Adam 中二阶矩估计的偏差,使用历史最大值替代当前方差。 **公式**: $$v_t^{corrected} = \max(v_t, v_{t-1}^{corrected})$$ • **特点**: • **优点**:提升训练稳定性,尤其在动态损失函数场景下。 • **适用场景**:动态梯度或噪声较大的环境。 • **代码示例**: ```python 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 用于追求更快的收敛或稳定性。