文章目录
📌 适合对象:计算机视觉初学者、深度学习入门者
⏱️ 预计阅读时间:60-70分钟
🎯 学习目标:理解不同优化器的特点,掌握学习率调度策略,了解正则化方法,学会选择和调整超参数
📚 学习路线图
本文内容一览(快速理解)
- 优化器(Optimizers):SGD、Momentum、AdaGrad、RMSProp、Adam的特点和选择
- 学习率调度(Learning Rate Schedules):Step decay、Cosine、Linear等调度策略
- 正则化(Regularization):L2正则化、Dropout、数据增强等方法
- 超参数选择(Hyperparameter Selection):系统化的超参数调优方法
一、优化器(Optimizers):改进梯度下降
这一章要建立的基础:理解SGD的问题,掌握Momentum、AdaGrad、RMSProp、Adam等优化器
核心问题:SGD有什么问题?如何改进?
[!NOTE]
📝 关键点总结:SGD在条件数高、局部最小值、鞍点、噪声梯度等情况下表现不佳。Momentum通过累积梯度速度改善这些问题,AdaGrad和RMSProp通过自适应学习率改善条件数问题,Adam结合了Momentum和自适应学习率的优点。
1.1 SGD的问题(Problems with SGD):条件数、局部最小值、鞍点、噪声
概念的本质:
SGD(随机梯度下降)在以下情况下表现不佳:
- 高条件数:损失函数在不同方向变化速度差异很大
- 局部最小值:梯度为0,无法继续优化
- 鞍点:梯度为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可以帮助优化器:
- 在平坦方向加速(累积速度)
- 在陡峭方向稳定(速度平滑)
- 逃离局部最小值和鞍点(速度惯性)
图解说明:
💡 说明:
- 速度累积:历史梯度被累积成"速度"
- 动量系数: ρ \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收敛更快。
图解说明:
💡 说明:
- 向前看:先预测速度会带我们去的位置
- 计算梯度:在预测位置计算梯度
- 优势:更准确地预测,通常收敛更快
类比理解:
想象你在开车。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在陡峭方向(梯度大)减小学习率,在平坦方向(梯度小)增大学习率,从而改善高条件数问题。
图解说明:
💡 说明:
- 自适应学习率:每个参数有自己的学习率
- 陡峭方向:梯度大,学习率自动减小
- 平坦方向:梯度小,学习率自动增大
- 问题:学习率会一直减小,可能过早停止
类比理解:
想象你在下山。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。这样可以让历史梯度的影响逐渐衰减,避免学习率过早减小。
图解说明:
💡 说明:
- 指数移动平均:历史梯度的影响逐渐衰减
- 避免过早停止:学习率不会一直减小
- 效果:结合了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
图解说明:
💡 说明:
- 一阶矩:类似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。这是最常用的学习率调度策略。
图解说明:
💡 说明:
- 固定点衰减:在特定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,防止模型过度拟合。
图解说明:
💡 说明:
- 权重衰减:鼓励权重接近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可以理解为训练一个大型模型集合(共享参数),每个二进制掩码是一个模型。在测试时,所有神经元都激活,但需要缩放激活值以匹配训练时的期望输出。
图解说明:
💡 说明:
- 训练时:随机将神经元设置为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-5个epoch
- 细化网格:选择最好的模型,训练更长时间
- 观察损失曲线:根据曲线调整
- 迭代优化:重复步骤5-6
图解说明:
💡 说明:
- 系统化流程:按照步骤逐步优化
- 先小后大:先在小数据集上测试,再在全数据集上训练
- 迭代优化:根据结果不断调整
实际例子:
超参数选择步骤的例子:
步骤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):诊断问题
概念的本质:
观察损失曲线可以帮助诊断训练问题:
- 损失不下降:学习率太小或初始化不好
- 损失爆炸:学习率太大或初始化不好
- 损失平台:尝试学习率衰减
- 训练/验证差距大:过拟合,增加正则化
- 训练/验证差距小:欠拟合,训练更长时间或使用更大模型
图解说明:
💡 说明:
- 诊断工具:损失曲线是诊断训练问题的重要工具
- 常见问题:根据曲线特征判断问题
- 解决方案:根据问题调整超参数
实际例子:
损失曲线诊断的例子:
问题1:损失不下降
- 特征:损失一直很高,不下降
- 可能原因:学习率太小、初始化不好
- 解决方案:增大学习率、检查初始化
问题2:损失爆炸
- 特征:损失变成Inf或NaN
- 可能原因:学习率太大、初始化不好
- 解决方案:减小学习率、检查初始化
问题3:损失平台
- 特征:损失不再下降
- 可能原因:需要学习率衰减
- 解决方案:使用学习率衰减
问题4:训练/验证差距大
- 特征:训练准确率高,验证准确率低
- 可能原因:过拟合
- 解决方案:增加正则化、获取更多数据
问题5:训练/验证差距小
- 特征:训练和验证准确率都低
- 可能原因:欠拟合
- 解决方案:训练更长时间、使用更大模型
4.3 随机搜索vs网格搜索(Random Search vs Grid Search):更高效的搜索
概念的本质:
随机搜索(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个随机组合
- 优势:可以探索更大的空间
实践建议:
- 使用随机搜索
- 对重要参数使用更细的网格
- 对不重要参数使用粗网格或随机采样
📝 本章总结
核心要点回顾:
-
优化器:
- SGD+Momentum:累积速度,改善高条件数和鞍点问题
- AdaGrad/RMSProp:自适应学习率,改善高条件数问题
- Adam:结合Momentum和自适应学习率,很好的默认选择
-
学习率调度:
- Step decay:最常用,在固定点衰减
- Cosine decay:平滑衰减,效果通常很好
- 根据任务选择合适的调度策略
-
正则化:
- L2正则化:权重衰减,防止过拟合
- Dropout:随机失活,训练模型集合
- 数据增强:几乎总是使用,增加数据多样性
-
超参数选择:
- 系统化流程:按照步骤逐步优化
- 观察损失曲线:诊断训练问题
- 随机搜索:通常比网格搜索更高效
知识地图:
关键决策点:
- 优化器:默认使用Adam,需要更好性能时尝试SGD+Momentum
- 学习率调度:默认使用Step decay,效果不好时尝试Cosine
- 正则化:几乎总是使用数据增强,大模型使用Dropout
- 超参数选择:按照系统化流程,使用随机搜索
📚 延伸阅读
推荐资源
-
优化器:
- 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
-
学习率调度:
- Cosine decay论文:Loshchilov and Hutter, “SGDR: Stochastic Gradient Descent with Warm Restarts”, 2017
-
正则化:
- Dropout论文:Srivastava et al., “Dropout: A simple way to prevent neural networks from overfitting”, 2014
-
实践项目:
- 比较不同优化器的效果
- 比较不同学习率调度的效果
- 实现Dropout和数据增强
- 系统化地选择和调整超参数
11万+

被折叠的 条评论
为什么被折叠?



