【计算机视觉(17)】语义理解-训练神经网络2_优化器_正则化_超参数

文章目录

    • [📚 学习路线图](#📚 学习路线图)
    • 本文内容一览(快速理解)
    • 一、优化器(Optimizers):改进梯度下降
      • [1.1 SGD的问题(Problems with SGD):条件数、局部最小值、鞍点、噪声](#1.1 SGD的问题(Problems with SGD):条件数、局部最小值、鞍点、噪声)
      • [1.2 SGD + Momentum(SGD with Momentum):累积速度](#1.2 SGD + Momentum(SGD with Momentum):累积速度)
      • [1.3 Nesterov Momentum(Nesterov Accelerated Gradient):向前看](#1.3 Nesterov Momentum(Nesterov Accelerated Gradient):向前看)
      • [1.4 AdaGrad(Adaptive Gradient):自适应学习率](#1.4 AdaGrad(Adaptive Gradient):自适应学习率)
      • [1.5 RMSProp(Root Mean Square Propagation):泄漏AdaGrad](#1.5 RMSProp(Root Mean Square Propagation):泄漏AdaGrad)
      • [1.6 Adam(Adaptive Moment Estimation):结合Momentum和RMSProp](#1.6 Adam(Adaptive Moment Estimation):结合Momentum和RMSProp)
    • [二、学习率调度(Learning Rate Schedules):动态调整学习率](#二、学习率调度(Learning Rate Schedules):动态调整学习率)
      • [2.1 学习率调度的必要性(Need for Learning Rate Scheduling):初期大后期小](#2.1 学习率调度的必要性(Need for Learning Rate Scheduling):初期大后期小)
      • [2.2 Step Decay(Step Decay):阶梯式衰减](#2.2 Step Decay(Step Decay):阶梯式衰减)
      • [2.4 其他调度策略(Other Scheduling Strategies):Linear和Inverse sqrt](#2.4 其他调度策略(Other Scheduling Strategies):Linear和Inverse sqrt)
    • 三、正则化(Regularization):防止过拟合
      • [3.1 L2正则化(L2 Regularization):权重衰减](#3.1 L2正则化(L2 Regularization):权重衰减)
      • [3.2 Dropout(Dropout):随机失活](#3.2 Dropout(Dropout):随机失活)
      • [3.3 数据增强(Data Augmentation):增加数据多样性](#3.3 数据增强(Data Augmentation):增加数据多样性)
      • [3.4 其他正则化方法(Other Regularization Methods):Cutout、Mixup等](#3.4 其他正则化方法(Other Regularization Methods):Cutout、Mixup等)
    • [四、超参数选择(Hyperparameter Selection):系统化方法](#四、超参数选择(Hyperparameter Selection):系统化方法)
      • [4.1 超参数选择步骤(Hyperparameter Selection Steps):系统化流程](#4.1 超参数选择步骤(Hyperparameter Selection Steps):系统化流程)
      • [4.2 观察损失曲线(Observing Loss Curves):诊断问题](#4.2 观察损失曲线(Observing Loss Curves):诊断问题)
      • [4.3 随机搜索vs网格搜索(Random Search vs Grid Search):更高效的搜索](#4.3 随机搜索vs网格搜索(Random Search vs Grid Search):更高效的搜索)
    • [📝 本章总结](#📝 本章总结)
    • [📚 延伸阅读](#📚 延伸阅读)

📌 适合对象 :计算机视觉初学者、深度学习入门者

⏱️ 预计阅读时间 :60-70分钟

🎯 学习目标:理解不同优化器的特点,掌握学习率调度策略,了解正则化方法,学会选择和调整超参数


📚 学习路线图

优化器选择
SGD/Adam 学习率调度
Step/Cosine 正则化
Dropout/Data Aug 超参数选择
系统化方法 模型训练
稳定收敛


本文内容一览(快速理解)

  1. 优化器(Optimizers):SGD、Momentum、AdaGrad、RMSProp、Adam的特点和选择
  2. 学习率调度(Learning Rate Schedules):Step decay、Cosine、Linear等调度策略
  3. 正则化(Regularization):L2正则化、Dropout、数据增强等方法
  4. 超参数选择(Hyperparameter Selection):系统化的超参数调优方法

一、优化器(Optimizers):改进梯度下降

这一章要建立的基础:理解SGD的问题,掌握Momentum、AdaGrad、RMSProp、Adam等优化器

核心问题:SGD有什么问题?如何改进?


!NOTE

📝 关键点总结:SGD在条件数高、局部最小值、鞍点、噪声梯度等情况下表现不佳。Momentum通过累积梯度速度改善这些问题,AdaGrad和RMSProp通过自适应学习率改善条件数问题,Adam结合了Momentum和自适应学习率的优点。

1.1 SGD的问题(Problems with SGD):条件数、局部最小值、鞍点、噪声

概念的本质

SGD(随机梯度下降)在以下情况下表现不佳:

  1. 高条件数:损失函数在不同方向变化速度差异很大
  2. 局部最小值:梯度为0,无法继续优化
  3. 鞍点:梯度为0,但在高维空间中更常见
  4. 噪声梯度:小批量梯度有噪声,导致优化不稳定

图解说明
SGD问题 高条件数
不同方向变化差异大 局部最小值
梯度为0 鞍点
高维常见 噪声梯度
小批量噪声

💡 说明

  • 高条件数:损失函数在某个方向变化很快,在另一个方向变化很慢
  • 局部最小值:梯度为0,但可能不是全局最优
  • 鞍点:在高维空间中,鞍点比局部最小值更常见
  • 噪声梯度:小批量梯度是真实梯度的估计,有噪声

类比理解

想象你在下山。SGD的问题就像:

  • 高条件数:一个方向很陡,另一个方向很平,容易在陡的方向"震荡"
  • 局部最小值:掉进一个小坑,以为到底了,其实还有更深的坑
  • 鞍点:在鞍点上,所有方向都是平的,不知道往哪走
  • 噪声梯度:每次看的方向都有误差,导致路径不稳定

实际例子

复制代码
SGD的问题:

高条件数:
- 损失函数在W1方向变化很快
- 在W2方向变化很慢
- SGD在W1方向"震荡",在W2方向"爬行"
- 结果:优化很慢

局部最小值:
- 梯度为0
- SGD停止更新
- 可能不是全局最优

鞍点(高维更常见):
- 梯度为0
- 但在某些方向是局部最小值,某些方向是局部最大值
- 高维空间中鞍点比局部最小值多得多

噪声梯度:
- 小批量梯度:g = ∇L_batch
- 真实梯度:G = ∇L_all
- g ≈ G + 噪声
- 噪声导致优化路径不稳定

1.2 SGD + Momentum(SGD with Momentum):累积速度

概念的本质

SGD + Momentum通过累积历史梯度来构建"速度"(velocity),公式为: v t + 1 = ρ v t + ∇ L v_{t+1} = \rho v_t + \nabla L vt+1=ρvt+∇L, x t + 1 = x t − α v t + 1 x_{t+1} = x_t - \alpha v_{t+1} xt+1=xt−αvt+1,其中 ρ \rho ρ是动量系数(通常0.9或0.99), α \alpha α是学习率。Momentum可以帮助优化器:

  1. 在平坦方向加速(累积速度)
  2. 在陡峭方向稳定(速度平滑)
  3. 逃离局部最小值和鞍点(速度惯性)

图解说明
当前梯度 累积速度
v = ρv + grad 更新参数
x = x - αv 优势
加速/稳定/逃离

💡 说明

  • 速度累积:历史梯度被累积成"速度"
  • 动量系数 : ρ \rho ρ控制历史梯度的权重(通常0.9或0.99)
  • 效果:在平坦方向加速,在陡峭方向稳定,可以逃离局部最小值

类比理解

想象你在推一个球下山。Momentum就像:

  • 速度累积:球有惯性,会保持之前的速度
  • 平坦方向:球会加速(累积速度)
  • 陡峭方向:球会稳定(速度平滑)
  • 局部最小值:球有足够的速度,可以"冲过"小坑

实际例子

复制代码
SGD + Momentum的例子:

参数更新:
- 速度:v = 0.9 * v + grad
- 参数:x = x - 0.01 * v

效果:
- 平坦方向:速度累积,加速前进
- 陡峭方向:速度平滑,减少震荡
- 局部最小值:速度惯性,可以"冲过"

对比SGD:
- SGD:每次只看当前梯度,容易震荡
- Momentum:考虑历史梯度,路径更平滑

动量系数ρ:
- ρ = 0.9:常用,平衡速度和稳定性
- ρ = 0.99:更平滑,但可能反应慢

1.3 Nesterov Momentum(Nesterov Accelerated Gradient):向前看

概念的本质

Nesterov Momentum是Momentum的改进版本。它先"向前看"到速度会带我们去的位置,然后在那里计算梯度,再与速度混合得到实际更新方向。这样可以更准确地预测下一步,通常比普通Momentum收敛更快。

图解说明
当前位置 向前看
x + ρv 计算梯度
在预测位置 混合速度和梯度
更新

💡 说明

  • 向前看:先预测速度会带我们去的位置
  • 计算梯度:在预测位置计算梯度
  • 优势:更准确地预测,通常收敛更快

类比理解

想象你在开车。Nesterov Momentum就像:

  • 普通Momentum:看当前路况,然后加速
  • Nesterov:先预测会到哪里,看那里的路况,然后加速
  • 优势:更准确地预测,避免"急转弯"

实际例子

复制代码
Nesterov Momentum的例子:

普通Momentum:
1. 计算当前梯度
2. 更新速度:v = ρv + grad
3. 更新参数:x = x - αv

Nesterov Momentum:
1. 向前看:x_lookahead = x + ρv
2. 在预测位置计算梯度
3. 更新速度:v = ρv + grad_lookahead
4. 更新参数:x = x - αv

优势:
- 更准确地预测下一步
- 通常收敛更快
- 在凸优化中有理论保证

1.4 AdaGrad(Adaptive Gradient):自适应学习率

概念的本质

AdaGrad根据历史梯度的平方和,为每个参数自适应地调整学习率。公式为: r t + 1 = r t + ( ∇ L ) 2 r_{t+1} = r_t + (\nabla L)^2 rt+1=rt+(∇L)2, x t + 1 = x t − α r t + 1 + ϵ ∇ L x_{t+1} = x_t - \frac{\alpha}{\sqrt{r_{t+1} + \epsilon}} \nabla L xt+1=xt−rt+1+ϵ α∇L。AdaGrad在陡峭方向(梯度大)减小学习率,在平坦方向(梯度小)增大学习率,从而改善高条件数问题。

图解说明
历史梯度平方和
r = r + grad² 自适应学习率
α/sqrt(r+ε) 陡峭方向
学习率减小 平坦方向
学习率增大

💡 说明

  • 自适应学习率:每个参数有自己的学习率
  • 陡峭方向:梯度大,学习率自动减小
  • 平坦方向:梯度小,学习率自动增大
  • 问题:学习率会一直减小,可能过早停止

类比理解

想象你在下山。AdaGrad就像:

  • 陡峭方向:坡度大,自动减小步长(学习率),避免"冲过头"
  • 平坦方向:坡度小,自动增大步长(学习率),加快前进
  • 问题:步长会一直减小,可能过早停止

实际例子

复制代码
AdaGrad的例子:

参数更新:
- 累积梯度平方:r = r + grad²
- 自适应学习率:lr = α / sqrt(r + ε)
- 参数更新:x = x - lr * grad

效果:
- 陡峭方向(梯度大):r增大,学习率减小
- 平坦方向(梯度小):r增大慢,学习率相对较大
- 结果:改善高条件数问题

问题:
- 学习率会一直减小(r一直增大)
- 可能过早停止学习
- 需要改进:RMSProp

1.5 RMSProp(Root Mean Square Propagation):泄漏AdaGrad

概念的本质

RMSProp是AdaGrad的改进版本,使用指数移动平均(EMA)来累积梯度平方,而不是简单累加。公式为: r t + 1 = ρ r t + ( 1 − ρ ) ( ∇ L ) 2 r_{t+1} = \rho r_t + (1-\rho)(\nabla L)^2 rt+1=ρrt+(1−ρ)(∇L)2, x t + 1 = x t − α r t + 1 + ϵ ∇ L x_{t+1} = x_t - \frac{\alpha}{\sqrt{r_{t+1} + \epsilon}} \nabla L xt+1=xt−rt+1+ϵ α∇L。这样可以让历史梯度的影响逐渐衰减,避免学习率过早减小。

图解说明
指数移动平均
r = ρr + (1-ρ)grad² 自适应学习率
α/sqrt(r+ε) 历史衰减
避免过早停止

💡 说明

  • 指数移动平均:历史梯度的影响逐渐衰减
  • 避免过早停止:学习率不会一直减小
  • 效果:结合了AdaGrad的自适应性和稳定性

类比理解

想象你在下山。RMSProp就像:

  • AdaGrad:记住所有历史,步长会一直减小
  • RMSProp:逐渐"忘记"历史,步长可以保持
  • 优势:既有自适应性,又不会过早停止

实际例子

复制代码
RMSProp的例子:

参数更新:
- 指数移动平均:r = 0.9 * r + 0.1 * grad²
- 自适应学习率:lr = α / sqrt(r + ε)
- 参数更新:x = x - lr * grad

对比AdaGrad:
- AdaGrad:r一直累加,学习率一直减小
- RMSProp:r使用EMA,历史影响衰减
- 结果:学习率可以保持,不会过早停止

效果:
- 陡峭方向:学习率减小(但不会一直减小)
- 平坦方向:学习率相对较大
- 改善高条件数问题,同时保持学习能力

1.6 Adam(Adaptive Moment Estimation):结合Momentum和RMSProp

概念的本质

Adam结合了Momentum和RMSProp的优点。它同时维护梯度的一阶矩(类似Momentum的速度)和二阶矩(类似RMSProp的梯度平方),并使用偏差修正。Adam的更新公式为:

  • m t + 1 = β 1 m t + ( 1 − β 1 ) ∇ L m_{t+1} = \beta_1 m_t + (1-\beta_1)\nabla L mt+1=β1mt+(1−β1)∇L(一阶矩)
  • v t + 1 = β 2 v t + ( 1 − β 2 ) ( ∇ L ) 2 v_{t+1} = \beta_2 v_t + (1-\beta_2)(\nabla L)^2 vt+1=β2vt+(1−β2)(∇L)2(二阶矩)
  • m ^ t + 1 = m t + 1 1 − β 1 t \hat{m}{t+1} = \frac{m{t+1}}{1-\beta_1^t} m^t+1=1−β1tmt+1(偏差修正)
  • v ^ t + 1 = v t + 1 1 − β 2 t \hat{v}{t+1} = \frac{v{t+1}}{1-\beta_2^t} v^t+1=1−β2tvt+1(偏差修正)
  • x t + 1 = x t − α v ^ t + 1 + ϵ m ^ t + 1 x_{t+1} = x_t - \frac{\alpha}{\sqrt{\hat{v}{t+1}} + \epsilon} \hat{m}{t+1} xt+1=xt−v^t+1 +ϵαm^t+1

图解说明
Adam Momentum
一阶矩 RMSProp
二阶矩 偏差修正
修正初始偏差 结合优势

💡 说明

  • 一阶矩:类似Momentum的速度,累积梯度
  • 二阶矩:类似RMSProp的梯度平方,自适应学习率
  • 偏差修正:修正初始估计的偏差(因为初始值为0)
  • 默认参数 : β 1 = 0.9 \beta_1=0.9 β1=0.9, β 2 = 0.999 \beta_2=0.999 β2=0.999,学习率 1 e − 3 1e-3 1e−3或 5 e − 4 5e-4 5e−4

类比理解

想象你在下山。Adam就像:

  • Momentum:有速度,可以加速和稳定
  • RMSProp:自适应步长,陡峭方向减小,平坦方向增大
  • Adam:既有速度,又有自适应步长,结合两者优势

实际例子

复制代码
Adam的例子:

参数更新:
- 一阶矩:m = 0.9 * m + 0.1 * grad
- 二阶矩:v = 0.999 * v + 0.001 * grad²
- 偏差修正:m̂ = m / (1 - 0.9^t),v̂ = v / (1 - 0.999^t)
- 参数更新:x = x - α * m̂ / (sqrt(v̂) + ε)

优势:
- 结合Momentum和RMSProp的优点
- 自适应学习率
- 偏差修正,更准确

默认参数:
- β1 = 0.9(一阶矩衰减率)
- β2 = 0.999(二阶矩衰减率)
- 学习率 = 1e-3 或 5e-4

实践建议:
- Adam是很好的默认选择
- 通常工作良好,即使使用固定学习率
- SGD+Momentum可能更好,但需要更多调优

二、学习率调度(Learning Rate Schedules):动态调整学习率

这一章要建立的基础:理解学习率调度的重要性,掌握不同的调度策略

核心问题:为什么需要调整学习率?如何调整学习率?


!NOTE

📝 关键点总结:学习率调度通过动态调整学习率,可以在训练初期使用较大学习率快速收敛,在训练后期使用较小学习率精细调整。常见的调度策略包括Step decay、Cosine、Linear、Inverse sqrt等。

2.1 学习率调度的必要性(Need for Learning Rate Scheduling):初期大后期小

概念的本质

学习率调度(Learning Rate Scheduling)通过动态调整学习率来改善训练效果。在训练初期,使用较大的学习率可以快速收敛;在训练后期,使用较小的学习率可以精细调整,避免在最优解附近震荡。

图解说明
训练初期
大学习率 快速收敛 训练后期
小学习率 精细调整

💡 说明

  • 初期大学习率:快速接近最优解
  • 后期小学习率:精细调整,避免震荡
  • 效果:更快收敛,更好性能

类比理解

想象你在找宝藏。学习率调度就像:

  • 初期:大步走,快速接近宝藏位置
  • 后期:小步走,精细搜索,找到精确位置
  • 效果:既快又准

实际例子

复制代码
学习率调度的例子:

固定学习率(0.01):
- 初期:可能收敛慢
- 后期:可能在最优解附近震荡

学习率调度:
- 初期:0.01(快速收敛)
- 中期:0.001(开始精细调整)
- 后期:0.0001(精细调整)

效果:
- 更快收敛
- 更好性能
- 更稳定

2.2 Step Decay(Step Decay):阶梯式衰减

概念的本质

Step Decay在固定的epoch将学习率乘以衰减因子(如0.1)。例如,对于ResNet,在第30、60、90个epoch将学习率乘以0.1。这是最常用的学习率调度策略。

图解说明
初始学习率
0.1 Epoch 30
×0.1 Epoch 60
×0.1 Epoch 90
×0.1

💡 说明

  • 固定点衰减:在特定epoch衰减学习率
  • 衰减因子:通常0.1或0.5
  • 常用设置:ResNet在第30、60、90个epoch衰减

实际例子

复制代码
Step Decay的例子:

ResNet训练:
- 初始学习率:0.1
- Epoch 30:学习率 = 0.1 × 0.1 = 0.01
- Epoch 60:学习率 = 0.01 × 0.1 = 0.001
- Epoch 90:学习率 = 0.001 × 0.1 = 0.0001

效果:
- 初期快速收敛
- 中期开始精细调整
- 后期精细调整

实现:
```python
if epoch == 30:
    lr *= 0.1
elif epoch == 60:
    lr *= 0.1
elif epoch == 90:
    lr *= 0.1


 

---

### 2.3 Cosine Decay(Cosine Decay):余弦衰减

**概念的本质**:

Cosine Decay使用余弦函数来平滑地衰减学习率。公式为:$\alpha_t = \alpha_0 \cdot \frac{1 + \cos(\pi t / T)}{2}$,其中$\alpha_0$是初始学习率,$t$是当前epoch,$T$是总epoch数。Cosine decay在训练后期学习率衰减很慢,可以更好地精细调整。

**图解说明**:

```mermaid
flowchart TD
    A["初始学习率<br/>α0"] --> B["余弦函数<br/>平滑衰减"]
    B --> C["最终学习率<br/>接近0"]
    
    style A fill:#E8F4F8
    style B fill:#90EE90
    style C fill:#FFD700

💡 说明

  • 平滑衰减:学习率平滑地减小
  • 后期慢衰减:训练后期学习率衰减很慢
  • 效果:更好地精细调整

实际例子

复制代码
Cosine Decay的例子:

公式:
α_t = α_0 * (1 + cos(πt/T)) / 2

例子(T=100):
- Epoch 0:α = α_0 * 1 = α_0
- Epoch 25:α = α_0 * 0.853
- Epoch 50:α = α_0 * 0.5
- Epoch 75:α = α_0 * 0.147
- Epoch 100:α = α_0 * 0

优势:
- 平滑衰减
- 后期慢衰减,更好地精细调整
- 超参数少(只需要初始学习率和总epoch数)

实践:
- 常用于Transformer等模型
- 通常效果很好

2.4 其他调度策略(Other Scheduling Strategies):Linear和Inverse sqrt

概念的本质

除了Step和Cosine,还有其他学习率调度策略:

  • Linear :线性衰减, α t = α 0 ( 1 − t / T ) \alpha_t = \alpha_0 (1 - t/T) αt=α0(1−t/T)
  • Inverse sqrt :逆平方根衰减, α t = α 0 / t \alpha_t = \alpha_0 / \sqrt{t} αt=α0/t (常用于Transformer)

实际例子

复制代码
其他调度策略的例子:

Linear Decay:
- 公式:α_t = α_0 * (1 - t/T)
- 例子:T=100,α_0=0.1
  - Epoch 0:α = 0.1
  - Epoch 50:α = 0.05
  - Epoch 100:α = 0

Inverse sqrt:
- 公式:α_t = α_0 / sqrt(t)
- 例子:α_0=0.1
  - Step 1:α = 0.1 / 1 = 0.1
  - Step 100:α = 0.1 / 10 = 0.01
  - Step 10000:α = 0.1 / 100 = 0.001

实践建议:
- Step:最常用,简单有效
- Cosine:平滑衰减,效果通常很好
- Linear:简单,但可能不如Cosine
- Inverse sqrt:常用于Transformer

三、正则化(Regularization):防止过拟合

这一章要建立的基础:理解正则化的作用,掌握不同的正则化方法

核心问题:什么是过拟合?如何防止过拟合?


!NOTE

📝 关键点总结:正则化通过约束模型复杂度来防止过拟合。常见方法包括L2正则化(权重衰减)、Dropout(随机失活)、数据增强(增加训练数据多样性)等。正则化在训练时添加随机性,在测试时平均掉随机性。

3.1 L2正则化(L2 Regularization):权重衰减

概念的本质

L2正则化(也称为权重衰减,Weight Decay)在损失函数中添加权重的平方和项: L = L data + λ ∑ i w i 2 L = L_{\text{data}} + \lambda \sum_i w_i^2 L=Ldata+λ∑iwi2,其中 λ \lambda λ是正则化强度。L2正则化鼓励权重接近0,防止模型过度拟合。

图解说明
原始损失
L_data 添加L2项
L = L_data + λΣw² 效果
权重接近0

💡 说明

  • 权重衰减:鼓励权重接近0
  • 正则化强度 : λ \lambda λ控制正则化的强度
  • 效果:防止过拟合,提高泛化能力

实际例子

复制代码
L2正则化的例子:

原始损失:
L = L_data

添加L2正则化:
L = L_data + λ * Σw²

梯度更新:
∂L/∂w = ∂L_data/∂w + 2λw

效果:
- 权重被"拉向"0
- 防止权重过大
- 提高泛化能力

常见设置:
- λ = 1e-4 或 1e-5
- 在优化器中通常作为weight_decay参数

3.2 Dropout(Dropout):随机失活

概念的本质

Dropout在训练时随机将一些神经元设置为0(失活),概率 p p p是超参数(通常0.5)。Dropout可以理解为训练一个大型模型集合(共享参数),每个二进制掩码是一个模型。在测试时,所有神经元都激活,但需要缩放激活值以匹配训练时的期望输出。

图解说明
训练时
随机失活p=0.5 测试时
所有激活,缩放 效果
模型集合

💡 说明

  • 训练时:随机将神经元设置为0
  • 测试时:所有神经元激活,但缩放激活值
  • 效果:训练模型集合,提高泛化能力

实际例子

复制代码
Dropout的例子:

训练时:
- 每个神经元以概率p=0.5被失活
- 激活值:h = dropout(x, p=0.5)

测试时:
- 所有神经元激活
- 缩放:h = x * p(或使用inverted dropout:h = x)

Inverted Dropout(推荐):
训练时:
h = dropout(x, p) / p  # 缩放,使期望值不变

测试时:
h = x  # 不需要缩放

效果:
- 训练时:每个样本使用不同的子网络
- 测试时:平均所有子网络的预测
- 提高泛化能力

常见设置:
- 全连接层:p = 0.5
- 卷积层:通常不使用dropout(或p很小)

3.3 数据增强(Data Augmentation):增加数据多样性

概念的本质

数据增强(Data Augmentation)通过对训练图像进行随机变换(如翻转、裁剪、颜色抖动等)来增加训练数据的多样性。数据增强是一种正则化方法,因为它增加了数据的多样性,使模型更难过拟合。

图解说明
原始图像 随机变换 水平翻转 随机裁剪 颜色抖动 其他变换

💡 说明

  • 随机变换:对训练图像进行随机变换
  • 增加多样性:增加训练数据的多样性
  • 效果:防止过拟合,提高泛化能力

实际例子

复制代码
数据增强的例子:

常见变换:
1. 水平翻转:随机水平翻转图像
2. 随机裁剪和缩放:
   - 训练:随机裁剪224×224
   - 测试:多个固定裁剪(10个)
3. 颜色抖动:
   - 简单:随机调整对比度和亮度
   - 复杂:PCA颜色抖动

训练时:
- 每个epoch都随机变换图像
- 增加数据多样性

测试时:
- 使用原始图像或固定变换
- 有时使用多个裁剪的平均(test-time augmentation)

效果:
- 几乎总是有效
- 提高泛化能力
- 对小数据集特别重要

实践建议:
- 几乎总是使用数据增强
- 根据任务选择合适的变换
- 小数据集:使用更多变换

3.4 其他正则化方法(Other Regularization Methods):Cutout、Mixup等

概念的本质

除了Dropout和数据增强,还有其他正则化方法:

  • Cutout:随机将图像区域设置为0
  • Mixup:混合两个图像和标签
  • DropConnect:随机失活连接(权重)
  • Stochastic Depth:随机跳过某些层

实际例子

复制代码
其他正则化方法的例子:

Cutout:
- 训练:随机将图像区域设置为0
- 测试:使用完整图像
- 效果:对小数据集(如CIFAR)很有效

Mixup:
- 训练:混合两个图像和标签
- 公式:x = λx1 + (1-λ)x2, y = λy1 + (1-λ)y2
- 效果:提高泛化能力

DropConnect:
- 训练:随机将连接(权重)设置为0
- 测试:使用所有连接
- 效果:类似Dropout,但作用于连接

Stochastic Depth:
- 训练:随机跳过某些层
- 测试:使用所有层
- 效果:类似Dropout,但作用于层

实践建议:
- Dropout:用于大的全连接层
- 数据增强:几乎总是使用
- Cutout和Mixup:特别适合小数据集

四、超参数选择(Hyperparameter Selection):系统化方法

这一章要建立的基础:理解如何系统化地选择和调整超参数

核心问题:如何选择超参数?有哪些系统化的方法?


!NOTE

📝 关键点总结:超参数选择需要系统化的方法。步骤包括:检查初始损失、在小样本上过拟合、找到使损失下降的学习率、粗网格搜索、细化网格、观察损失曲线、迭代优化。随机搜索通常比网格搜索更有效。

4.1 超参数选择步骤(Hyperparameter Selection Steps):系统化流程

概念的本质

超参数选择需要系统化的流程:

  1. 检查初始损失:确保初始损失符合预期
  2. 在小样本上过拟合:确保模型可以学习
  3. 找到使损失下降的学习率:找到合适的学习率范围
  4. 粗网格搜索:在几个值上训练1-5个epoch
  5. 细化网格:选择最好的模型,训练更长时间
  6. 观察损失曲线:根据曲线调整
  7. 迭代优化:重复步骤5-6

图解说明
步骤1
检查初始损失 步骤2
小样本过拟合 步骤3
找到学习率 步骤4
粗网格搜索 步骤5
细化网格 步骤6
观察曲线 步骤7
迭代优化

💡 说明

  • 系统化流程:按照步骤逐步优化
  • 先小后大:先在小数据集上测试,再在全数据集上训练
  • 迭代优化:根据结果不断调整

实际例子

复制代码
超参数选择步骤的例子:

步骤1:检查初始损失
- 关闭权重衰减
- 检查初始损失是否符合预期
- 例如:CIFAR-10,Softmax,期望初始损失≈2.302

步骤2:在小样本上过拟合
- 使用20个样本
- 尝试达到100%训练准确率
- 关闭正则化
- 调整架构、学习率、初始化

步骤3:找到使损失下降的学习率
- 使用所有训练数据
- 开启小的权重衰减
- 找到使损失在100次迭代内显著下降的学习率
- 尝试:1e-1, 1e-2, 1e-3, 1e-4

步骤4:粗网格搜索
- 选择几个学习率和权重衰减值
- 训练1-5个epoch
- 尝试权重衰减:1e-4, 1e-5, 0

步骤5:细化网格
- 选择步骤4中最好的模型
- 训练更长时间(10-20个epoch)
- 不使用学习率衰减

步骤6:观察损失曲线
- 绘制训练/验证损失和准确率
- 根据曲线判断问题

步骤7:迭代优化
- 根据步骤6的结果调整
- 重复步骤5-6

4.2 观察损失曲线(Observing Loss Curves):诊断问题

概念的本质

观察损失曲线可以帮助诊断训练问题:

  • 损失不下降:学习率太小或初始化不好
  • 损失爆炸:学习率太大或初始化不好
  • 损失平台:尝试学习率衰减
  • 训练/验证差距大:过拟合,增加正则化
  • 训练/验证差距小:欠拟合,训练更长时间或使用更大模型

图解说明
损失曲线 不下降
LR太小/初始化差 爆炸
LR太大/初始化差 平台
需要LR衰减 差距大
过拟合 差距小
欠拟合

💡 说明

  • 诊断工具:损失曲线是诊断训练问题的重要工具
  • 常见问题:根据曲线特征判断问题
  • 解决方案:根据问题调整超参数

实际例子

复制代码
损失曲线诊断的例子:

问题1:损失不下降
- 特征:损失一直很高,不下降
- 可能原因:学习率太小、初始化不好
- 解决方案:增大学习率、检查初始化

问题2:损失爆炸
- 特征:损失变成Inf或NaN
- 可能原因:学习率太大、初始化不好
- 解决方案:减小学习率、检查初始化

问题3:损失平台
- 特征:损失不再下降
- 可能原因:需要学习率衰减
- 解决方案:使用学习率衰减

问题4:训练/验证差距大
- 特征:训练准确率高,验证准确率低
- 可能原因:过拟合
- 解决方案:增加正则化、获取更多数据

问题5:训练/验证差距小
- 特征:训练和验证准确率都低
- 可能原因:欠拟合
- 解决方案:训练更长时间、使用更大模型

概念的本质

随机搜索(Random Search)通常比网格搜索(Grid Search)更高效,特别是在超参数重要性不同时。随机搜索可以在相同计算预算下探索更大的超参数空间。

图解说明
网格搜索
固定网格 可能浪费
不重要参数 随机搜索
随机采样 更高效
探索更大空间

💡 说明

  • 网格搜索:在固定网格上搜索,可能浪费在不重要的参数上
  • 随机搜索:随机采样,可以探索更大的空间
  • 效率:随机搜索通常更高效

实际例子

复制代码
随机搜索vs网格搜索的例子:

网格搜索:
- 学习率:[1e-3, 1e-4, 1e-5]
- 权重衰减:[1e-4, 1e-5, 0]
- 总共:3×3=9个组合
- 问题:如果学习率不重要,浪费在3个学习率上

随机搜索:
- 学习率:随机从[1e-5, 1e-1]采样
- 权重衰减:随机从[0, 1e-3]采样
- 总共:9个随机组合
- 优势:可以探索更大的空间

实践建议:
- 使用随机搜索
- 对重要参数使用更细的网格
- 对不重要参数使用粗网格或随机采样

📝 本章总结

核心要点回顾

  1. 优化器

    • SGD+Momentum:累积速度,改善高条件数和鞍点问题
    • AdaGrad/RMSProp:自适应学习率,改善高条件数问题
    • Adam:结合Momentum和自适应学习率,很好的默认选择
  2. 学习率调度

    • Step decay:最常用,在固定点衰减
    • Cosine decay:平滑衰减,效果通常很好
    • 根据任务选择合适的调度策略
  3. 正则化

    • L2正则化:权重衰减,防止过拟合
    • Dropout:随机失活,训练模型集合
    • 数据增强:几乎总是使用,增加数据多样性
  4. 超参数选择

    • 系统化流程:按照步骤逐步优化
    • 观察损失曲线:诊断训练问题
    • 随机搜索:通常比网格搜索更高效

知识地图
训练神经网络 优化器
SGD/Adam 学习率调度
Step/Cosine 正则化
Dropout/Data Aug 超参数选择
系统化方法 稳定训练

关键决策点

  • 优化器:默认使用Adam,需要更好性能时尝试SGD+Momentum
  • 学习率调度:默认使用Step decay,效果不好时尝试Cosine
  • 正则化:几乎总是使用数据增强,大模型使用Dropout
  • 超参数选择:按照系统化流程,使用随机搜索

📚 延伸阅读

推荐资源

  1. 优化器

    • Momentum论文:Sutskever et al., "On the importance of initialization and momentum in deep learning", 2013
    • Adam论文:Kingma and Ba, "Adam: A method for stochastic optimization", 2015
  2. 学习率调度

    • Cosine decay论文:Loshchilov and Hutter, "SGDR: Stochastic Gradient Descent with Warm Restarts", 2017
  3. 正则化

    • Dropout论文:Srivastava et al., "Dropout: A simple way to prevent neural networks from overfitting", 2014
  4. 实践项目

    • 比较不同优化器的效果
    • 比较不同学习率调度的效果
    • 实现Dropout和数据增强
    • 系统化地选择和调整超参数
相关推荐
小鸡吃米…4 分钟前
机器学习 - K - 中心聚类
人工智能·机器学习·聚类
好奇龙猫41 分钟前
【AI学习-comfyUI学习-第三十节-第三十一节-FLUX-SD放大工作流+FLUX图生图工作流-各个部分学习】
人工智能·学习
沈浩(种子思维作者)1 小时前
真的能精准医疗吗?癌症能提前发现吗?
人工智能·python·网络安全·健康医疗·量子计算
minhuan1 小时前
大模型应用:大模型越大越好?模型参数量与效果的边际效益分析.51
人工智能·大模型参数评估·边际效益分析·大模型参数选择
Cherry的跨界思维1 小时前
28、AI测试环境搭建与全栈工具实战:从本地到云平台的完整指南
java·人工智能·vue3·ai测试·ai全栈·测试全栈·ai测试全栈
MM_MS1 小时前
Halcon变量控制类型、数据类型转换、字符串格式化、元组操作
开发语言·人工智能·深度学习·算法·目标检测·计算机视觉·视觉检测
ASF1231415sd1 小时前
【基于YOLOv10n-CSP-PTB的大豆花朵检测与识别系统详解】
人工智能·yolo·目标跟踪
水如烟2 小时前
孤能子视角:“意识“的阶段性回顾,“感质“假说
人工智能
Carl_奕然2 小时前
【数据挖掘】数据挖掘必会技能之:A/B测试
人工智能·python·数据挖掘·数据分析
旅途中的宽~2 小时前
《European Radiology》:2024血管瘤分割—基于MRI T1序列的分割算法
人工智能·计算机视觉·mri·sci一区top·血管瘤·t1