【Datawhale X 李宏毅苹果书 AI夏令营】[深度学习 入门] Task3 《深度学习详解》- 第2章 实践方法论
内容来自李宏毅老师的机器学习/深度学习:
github:李宏毅深度学习教程LeeDL-Tutorial(苹果书)
bilibili课程视频:李宏毅《机器学习/深度学习》2021课程(P4)
Datawhale:Datawhale AI 夏令营(第五期)
第 2 章 实践方法论
引言
- Kaggle:一个主要为开发商和数据科学家提供举办机器学习竞赛、托管数据库、编写和分享代码的平台。公司和研究者在上面发布一些数据,提出一个实际需要解决的问题,参赛者们组队参与项目,针对其中一个问题提出解决方案,选出的最佳方案可以获得奖金。
在应用机器学习算法时,实践方法论能帮助我们更好地训练模型。虽说我们的目标是让模型在 测试集 (testing set, 测试数据) 上表现良好,但我们在实践中应当先保证模型是训练良好的——模型是否在 训练集 (training set, 训练数据) 上妥善学习了,是否在训练数据上的损失较小,其次再是测试集的结果。如果训练损失小,且测试损失也小,达到需求的 基线 (baseline),那么任务则算是圆满完成了。
如果模型在训练集上都损失很大,那么说明它甚至在训练集上都没有学好 / 训练好。接下来我们会分析其原因。
2.1 模型偏差 Model Bias
大海捞针,但是针不在这片海里
模型偏差可能会影响模型训练。例如,含有一个参数
θ
\theta
θ 和一个特征
x
x
x 的模型
f
θ
(
x
)
f_{\theta}(x)
fθ(x),它的所有可能的
θ
\theta
θ 取值构成一个函数集合 (图2.1蓝色区域),从这个集合中我们能够找到参数的最优值
θ
∗
\theta^*
θ∗。然而由于这个模型太简单 / 太浅 / 太小了,即使是
f
θ
∗
(
x
)
f_{\theta^*}(x)
fθ∗(x) 的训练损失也太大,使得我们无法找到损失更小的函数
f
∗
(
x
)
f^*(\textbf{\textit{x}})
f∗(x) (图2.1橙色点) ——
f
∗
(
x
)
f^*(\textbf{\textit{x}})
f∗(x) 和
f
θ
(
x
)
f_{\theta}(x)
fθ(x) 根本就不是一个模型。
这是我们需要重新设计模型,给予其更大的灵活性。如:增加输入的特征 (以第一章案例为例,用前1天的信息不够多,于是改为用前56天的信息)、适用更复杂的模型 (线性 → 分段线性曲线)、深度学习等等。
- 欠拟合 (Underfitting) —— 与模型偏差类似…吗?
- 定义:欠拟合字面理解便是缺少拟合度。欠拟合是指模型在训练数据上表现不佳,无法捕捉到训练数据中的主要趋势或模式。换句话说,欠拟合是模型在训练集和验证集 (后面会讲) 上的预测准确度都很低的情况。
- 原因:模型过于简单 (例如,线性模型处理复杂非线性数据)、过少的训练数据、特征选择不当。
- 解决方法:除去上述模型偏差的结局方案,还有调整超参数、减少正则化、增加训练数据等。
然而,并非训练时的损失大就一定是模型偏差,还有可能是优化做的不好,于是我们看到下一节。
2.2 优化问题
大海捞针,但是打捞工具太差了,捞不起来
我们往往采用梯度下降进行优化,然而它会遇到许多问题。比如,正如第一章所提到的,它只能让训练损失降到某个局部最小值,而无法降到更低。此时,模型的灵活性足够大,但损失的“某个局部最小值”对我们来说仍然太大了。
那么,当模型损失太大的时候,如何判断到底是模型偏差,还是优化问题呢?一个判断方法就是,通过比较不同模型的效果,来判断当前模型是否够大。是否更大、更深的模型,表现比更小、更浅的模型要更好?否则,就是优化问题。
试验模型由小及大、由浅及深,其训练损失理应下降
遇到一个新问题时,可以先跑非深度学习方法,或者较小、较浅的深度学习网络。如线性模型、支持向量机 (Support Vector Machine, SVM)。它们容易优化、较少优化失败,即它们会在能力范围内尽量找出一组最优参数。我们可以先训练这些简单模型,并观察记录它们的损失。
随后,再训练较大、较深的模型,较多层数的深度学习网络。它们在具备更高灵活性的同时,如果无法达到比简单模型更低的损失,则说明优化有问题,梯度下降不给力,因此需要其他方法来更好地进行优化。
- 注意,这里并没有明确给出优化问题的解决方案,也还没有深入进行优化算法的介绍!
-
例1:
- 还是回到第一章的案例,2017-2020年的数据作为训练集,随着深度学习的网络层数增加,训练损失本该下降,但反而上升了。
层数 : | 1层 | 2层 | 3层 | 4层 | 5层 |
---|---|---|---|---|---|
损失 : | 280 | 180 | 140 | 100 | 340 |
-
例2:
- 以2015年的一篇残差网络的论文“Deep Residual Learning for Image Recognition 1”中的一个实验为例,其训练和测试了两个网络,一个有20层,另一个56层——后者的灵活性与预测能力理论上必然强于前者,哪怕后者仅仅是前20层复制前者的参数、后36层无脑复制前一层的输出,也可以拥有前者的全部能力、达到不弱于前者的效果。诡异的是,不论是在测试集还是训练集 (图2.4),后者比前者的损失还高。这便是优化出现了问题。
-
有人看到测试集上 56层的损失
>
>
> 20层的损失 (图2.4(a)),就认为这是过拟合,说56层的深度学习太深了、不奏效,不用这么深。但此处并非过拟合。那么,什么是过拟合?接下来将介绍。
2.3 过拟合
照箭画靶,死记硬背,举一不能反三
过拟合描述的是模型在训练集上的表现很优秀,而在测试集上的表现挺差劲的情况。这是因为模型过度拟合了训练集的数据,导致无法捕捉该类数据的一般特征——在位置数据上没有好的 泛化能力 (generalization ability),从而实际应用到测试集上时损失很大。
可见,过拟合的前提是训练损失小。对于上图的例子,它甚至因为优化问题,还没有训练好,谈何过拟合?因此并非测试损失大就一定是过拟合。
举一个极端的例子,假设我们得到了一个函数,它几乎只是在训练集上把输入的特征
x
x
x 与输出的
y
y
y 像查字典一样对应在了一起。但如果你向它输入训练集以外的数据,它输出的就是随机的或者不知道什么鬼东西。即使这个函数的训练损失为0,它也不会是一个好函数,它的测试损失往往也是很大,它缺乏真正的预测能力 (图2.6)。
出现过拟合的原因是什么?可能是模型的自由度过大,此时他可以产生很奇怪的曲线,导致训练损失很小而测试损失很大。
过拟合主要有以下两类解决方法:
- 增加训练集
- 给模型制造限制,防止其灵活性过大
2.4 交叉验证
比较合理选择模型的方法是把训练的数据分成两部分,一部分为 训练集 (training set),另一部分为 验证集 (validation set)。
2.5 不匹配 Mismatch
模型:不是我的错!
不匹配是指模型在训练过程中所使用的数据分布与实际应用中遇到的数据分布不一致。这是无法通过增加训练集的方式来解决的问题。比如图像识别,训练集都是狗,让你识别狗的品种,结果测试集都是猫。
HE K, ZHANG X, REN S, et al. Deep residual learning for image recognition[C]. Proceedings of the IEEE conference on computer vision and pattern recognition. 2016:770-778. ↩︎