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

147 lines
6.1 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

### **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) 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
• **代码示例**
```python
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 更快的收敛速度。
• **适用场景**:需要快速训练的场景。
• **代码示例**
```python
optimizer = tf.keras.optimizers.Nadam(learning_rate=0.001)
```
---
#### **(2) AMSGradAdam 的改进版)**
• **原理**
修正 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 用于追求更快的收敛或稳定性。