本文共 1428 字,大约阅读时间需要 4 分钟。
注:下文的所以图片均来自李宏毅老师的PPT。
提到了机器学习的大致流程就是先选择一个合适模型,然后定义一个损失函数和选择一个优化算法,然后用训练数据进行训练。当训练结束后,我们就可以把这个优化好的模型应用于真实的数据中。
事情似乎很简单,好像根本不需要人为的干预,我们只需要把数据交给计算机,然后就等机器训练好就完了。
但是在实际训练模型的过程中,我们往往会遇到各种各样的问题,比如模型的损失值一直不下降、训练损失很小但测试损失却很大等等。这些问题都需要我们人为来进行识别然后去想办法解决。
李老师为我们总结了一些常见的问题,并且告诉了我们在什么情况下会遇到什么问题,如上图所示。
当训练数据的loss较大时:
当训练数据的loss较小时:
当测试数据的loss较大时
overfitting:这应该最常见的问题。当我们选择的模型过于复杂并且训练数据不足时,就可能出现这个问题。 如下图所示,假设有三个训练样本,模型通过训练捕捉到了这三个点,但是对于模型的其它点却并没有做出限制,就可能出现各个情况,如下图的右上角的情况。此时用该模型去预测测试数据,就会导致很大的loss。
下面介绍可以缓解过拟合的两种方式:
mismatch:当训练数据集与测试数据集的分布不同时,就会遇到这个问题,如下图所示。这个问题在后面的课程中会提到。
当测试数据的loss较小时
在以前我刚刚接触深度学习时,一直没搞懂为什么训练数据要分为训练集和测试集。数据全拿来训练不是更好吗?
后来当我接触到 “泛化” 这个词后,我明白了原因。所谓泛化,就是一般化的意思。简单来说,我们希望训练得到的模型可以从训练集中归纳出一般化的特征,这些特征可以帮助模型对于没有见过的新数据也能有不差的预测能力。
上图描述了模型训练时会出现的普遍情况。当我们的模型足够复杂时,假设优化器给力,随着训练次数的增加,它的训练loss必然会越来越小。
但训练loss越小是否表示模型的效果就越好呢?当然不是。因为我们训练模型的目的是希望它可以预测那些全新的数据,即我们希望它的测试loss越小越好。但是训练loss越小,并不代表测试loss就会越小。
训练loss和测试loss的关系如上图所示,可以发现,当训练次数过多,测试loss反而会上升。那么我们应该什么时候停止训练呢?这就是我们把训练数据部分用于验证的原因,就是希望可以通过验证loss找到测试loss最小的那个模型。
转载地址:http://ysuqf.baihongyu.com/