### **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 或序列任务  | RMS Prop          |
| 需要快速收敛     | Nadam             |
| 权重衰减敏感问题         | AdamW                     |
---
### **5. 总结**
- SGD 和 ​Momentum 是基础，适合理解优化原理。
- ​Adam 和 ​AdamW 是工业级默认选择，适用于大多数场景。
- ​RMSProp 和 ​Adagrad 适合特定任务（如 RNN 或稀疏数据）。
- ​Nadam 和 ​AMSGrad 用于追求更快的收敛或稳定性。
