147 lines
6.1 KiB
Markdown
147 lines
6.1 KiB
Markdown
### **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 用于追求更快的收敛或稳定性。
|