6 Training Tips¶
这一节中主要阐述训练神经网络时的各种诀窍。由于具体内容在 CS231n 中都有提及,这一节基本只做一个罗列,指明是在那一步影响了神经网络。
选择合适的方法是很重要的
比如说在左图中,deep learning 按道理来说肯定会在训练集中取得比 linear model 更低的 loss,但结果却比后者还高,那么就说明 optimization 这一步做的不好,要采取会更合适的优化方法
后者则是在验证集上 train loss 非常高,这就是 overfitting 的现象,这就需要更好的泛化能力了
梯度下降的技巧
- 综合前面梯度计算的结果,来定每个方向的学习率,称为 Adagrad
- 只关注最近一段时间的梯度平方。旧的梯度影响会随时间衰减,因此学习率不会无限减小,能持续有效地更新参数。称为 RMSProp
- 考虑动量,Momentum
- 结合 RMSProp 和 Momentum,即 Adam
| 方法名 | 改了哪一个步骤 | 带来什么好处 |
|---|---|---|
| Adagrad, RMSProp, Momentum, Adam, etc. | 找最好的函式 | Better Generalization (not for Generalization) |
Dropout,即在训练的时候随机丢掉一些神经元,验证和测试的时候全部都使用。本质上是在改变我们搜索函数的空间,不再是一个固定的庞大网络,而是多个稀疏子网络的集成。训练损失(Training Loss)通常比不用 Dropout 时更高、收敛更慢。
| 方法名 | 改了哪一个步骤 | 带来什么好处 |
|---|---|---|
| Dropout | 找最好的函式 | Better Generalization (Worse Optimization) |
选择合适的 Dropout 时机
只有当你的模型已经能在训练集上取得良好结果(即没有欠拟合),但在测试集上表现不佳(即存在过拟合)时,才应该考虑加入 Dropout!
一上来就加 Dropout → 可能导致训练困难、收敛慢,甚至无法学好基本规律(欠拟合)。
在训练集都没拟合好的时候用 Dropout → 雪上加霜。
Initialization,不同的起始位置,可能会导致非常不同的训练效果。
| 方法名 | 改了哪一个步骤 | 带来什么好处 |
|---|---|---|
| Initialization | 找最好的函式 | Better Generalization & Better Optimization |
选择合适的架构,即找到合适的函数范围。
- 在图像处理领域,CNN 相比于全连接层往往是一个很更好的架构
| 方法名 | 改了哪一个步骤 | 带来什么好处 |
|---|---|---|
| CNN for Image | 找最好的函式 | Better Generalization |
- 残差网络,增加一个梯度传递的高速公路
之前我们的理解是残差网络为了解决梯度太小的情况,即 gradient vanishing 的问题,但实际如果只是梯度过小的话,那么增加学习率不就好了吗?但是实际上 gradient vanishing 在有些时候梯度会变得非常大,这不是只改变学习率可以解决的了
| 方法名 | 改了哪一个步骤 | 带来什么好处 |
|---|---|---|
| Skip Connection | 改变函数的搜寻范围 | Better Optimization |
各种 Normalization,如 Batch Renormalization,Layer Normalization。这在 CS231n 上都有提及
| 方法名 | 改了哪一个步骤 | 带来什么好处 |
|---|---|---|
| Normalization | 改变函数的搜寻范围 | Better Optimization(Sometimes Better Generalization |
选择合适的 Loss,在分类问题中会使用 Cross-entropy,如果只采用准确率作为 Loss function的话,Loss 函数无法下坡,优化比较困难。当然还有其他的 Loss function 的选择,这里不再赘述。
| 方法名 | 改了哪一个步骤 | 带来什么好处 |
|---|---|---|
| Do not use accuracy as loss | 我要找什么 | Better Optimization |
Need More Training Data …,使用更大的训练集,可以获得更好的泛化能力,不容易过拟合
| 方法名 | 改了哪一个步骤 | 带来什么好处 |
|---|---|---|
| More training data | 我要找什么 | Better Generalization |
Data Augmentation,数据增强,将原先的数据做一些处理,就好像获得了更多的数据。
但也要注意的是你处理原始数据的时候,注意与标签的吻合性,不要处理之后与原先的标签不一致了
| 方法名 | 改了哪一个步骤 | 带来什么好处 |
|---|---|---|
| Data Augmentation | 我要找什么 | Better Generalization |
Semi-supervised Learning,利用大量未标记数据 (Unlabeled Data) 来辅助训练,从而在标记数据有限的情况下获得更好的性能。 $$ L_{\text{total}} = \underbrace{\sum_{x \sim \text{Train}} l(f(x), \hat{y})}{\text{标记数据损失}} + \lambda \underbrace{\sum $$}} l'(f(x))}_{\text{未标记数据损失}
其中 \(λ\) 是控制未标记数据影响力的超参数。下面介绍两种构建 \(l'\) 的思路:
“非黑即白”的世界 (Low Density Separation / Entropy Minimization)
-
假设:决策边界应该位于数据低密度区域,模型对未标记数据的预测应该是非常确定的(要么是全黑,要么是全白,不应模棱两可)。
-
做法:最小化未标记数据预测结果的 熵 (Entropy)。
直观理解:
如果模型对某个未标记图片的输出概率分布很均匀(如 [0.5, 0.5]),熵很大,惩罚就大。
如果输出很尖锐(如 [0.99, 0.01]),熵很小,惩罚就小。
目的:强迫模型在未标记数据上也做出“自信”的预测,从而推挤决策边界远离数据密集区。
“物以类聚”的世界 (Smoothness Assumption / Graph-based)
- 假设:如果两个未标记数据点在特征空间中非常“相近” (Similar/Connected),那么它们的预测结果也应该相近。
- 做法:定义一个相似度函数 \(g(x,x')\) ,如果两点相近则为1,否则为0。损失函数要求相近点的输出距离 \(l'(f(x),f(x'))\) 越小越好。
| 方法名 | 改了哪一个步骤 | 带来什么好处 |
|---|---|---|
| Semi-supervised (e.g. Entropy, Graph) | 我要找什么 | Better Generalization |
Parameter Regularization,参数正则化,防止过拟合
| 方法名 | 改了哪一个步骤 | 带来什么好处 |
|---|---|---|
| Parameter Regularization | 我要找什么 | Better Generalization |
总结一下,大致有下面这张表格的方法



