二.实践方法论
模型在训练集上没有学习好的原因,可能有两个。
模型偏差
第一个可能是模型的偏差。举个例子,假设模型过于简单,一个有未知参数的函数代
θ
1
\theta_1
θ1 得到一个函数
f
θ
1
(
x
)
f_{\theta_1}(x)
fθ1(x),同理可得到另一个函数
f
θ
2
(
x
)
f_{\theta_2}(x)
fθ2(x),把所有的函数集合起来得到一个函数的集合. 但是这个函数的集合太小了,可以让损失变低的函数不在模型可以描述的范围内。在这个情况下,就算找出了一个
θ
∗
\theta^*
θ∗,虽然它是这些蓝色的函数里面最 好的一个,但损失还是不够低。
这个时候重新设计一个模型,给模型更大的灵活性。举个例子,可以增加输入的特征,本 来输入的特征只有前一天的信息,假设要预测接下来的观看人数,用前一天的信息不够多,用 56 天前的信息,模型的灵活性就比较大了。也可以用深度学习,增加更多的灵活性。所以如果模型的灵活性不够大,可以增加更多特征,可以设一个更大的模型,可以用深度学习来增加模型的灵活性,这是第一个可以的解法。但是并不是训练的时候,损失大就代表一定是模型偏差,可能会遇到另外一个问题:优化做得不好。
优化问题
一般只会用到梯度下降进行优化,这种优化的方法很多的问题。比如可能会卡在局部最小值的地方,无法找到一个真的可以让损失很低的参数。
- 如何判断是模型偏差问题还是优化问题呢?
一个建议判断的方法,通过比较不同的模型来判断模型现在到底够不够大。举个例子, 这一个实验是从残差网络(residual network)的论文“Deep Residual Learning for Image Recognition”里面节录出来的。这篇论文在测试集上测试两个网络,一个网络有 20 层,一 个网络有 56 层。图 2.4a 横轴指的是训练的过程,就是参数更新的过程,随着参数的更新,损 失会越来越低,但是结果 20 层的损失比较低,56 层的损失还比较高。残差网络是比较早期的论文,2015 年的论文。很多人看到这张图认为这个代表过拟合,深度学习不奏效,56 层太深了不奏效,根本就不需要这么深。但这个不是过拟合,并不是所有的结果不好,都叫做过拟合。在训练集上,20 层的网络损失其实是比较低的,56 层的网络损失是比较高的,如图 2.4b, 这代表 56 层的网络的优化没有做好,它的优化不给力。
如果训练损失大,可以先判断是模型偏差还是优化。如果是模型偏差,就把模型变大。假设经过努力 可以让训练数据的损失变小,接下来可以来看测试数据损失;如果测试数据损失也小,比这个 较强的基线模型还要小,就结束了。
但如果训练数据上面的损失小,测试数据上的损失大,可能是真的过拟合。在测试上的结果不好,不一定是过拟合。要把训练数据损失记下来,先确定优化没有问题,模型够大了。接下来才看看是不是测试的问题,如果是训练损失小,测试损失大,这个有可能是过拟合。
过拟合
为什么会有过拟合这样的情况呢?举一个极端的例子,这是训练集。假设根据这些训练 集,某一个很废的机器学习的方法找出了一个一无是处的函数。这个一无是处的函数,只要输入 x 有出现在训练集里面,就把它对应的 y 当做输出。如果 x 没有出现在训练集里面,就输出一个随机的值。这个函数啥事也没有干,是一个一无是处的函数,但它在训练数据上的损失是 0。把训练数据通通丢进这个函数里面,它的输出跟训练集的标签是一模一样的,所以在训练数据上面,这个函数的损失可是 0 呢,可是在测试数据上面,它的损失会变得很大, 因为它其实什么都没有预测,这是一个比较极端的例子,在一般的情况下,也有可能发生类似的事情。
如图 2.6 所示,举例来说,假设输入的特征为 x,输出为 y,x 和 y 都是一维的。x 和 y 之间的关系是 2 次的曲线,曲线用虚线来表示,因为通常没有办法,直接观察到这条曲线。我们真正可以观察到的是训练集,训练集可以想像成从这条曲线上面,随机采样出来的几个点。 模型的能力非常的强,其灵活性很大,只给它这 3 个点。在这 3 个点上面,要让损失低,所以模型的这个曲线会通过这 3 个点,但是其它没有训练集做为限制的地方,因为它的灵活性很大,它灵活性很大,所以模型可以变成各式各样的函数,没有给它数据做为训练,可以产生各式各样奇怪的结果。
-
怎么解决过拟合?
- 第一个方向是往往是最有效的方向,即增加训练集。因此如果训练集,蓝色的点变多了,虽然模型它的灵活性可能很大,但是因为点非常多,它就可以限制住,它看起来的形状还是会很像,产生这些数据背后的 2 次曲线,如图 2.7 所示。
可以做数据增强(data augmentation),这个方法并不算是使用了额外的数据。数据增强就是根据问题的理解创造出新的数据。举个例子,在做图像识别的时候,常做的一个招式是,假设训练集里面有某一张图片,把它左右翻转,或者是把它其中一块截出来放大等等。对图片进行左右翻转,数据就变成两倍。但是数据增强不能够随便乱做。在图像识别里面,很少看到有人把图像上下颠倒当作增强。因为这些图片都是合理的图片,左右翻转图片,并不会影响到里面的内容。但把图像上下颠倒,可能不是一个训练集或真实世界里面会出现的图像。如果给机器根据奇怪的图像学习,它可能就会学到奇怪的东西。所以数据增强,要根据对数据的特性以及要处理的问题的理解,来选择合适的数据增强的方式。
- 另外一个解法是给模型一些限制,让模型不要有过大的灵活性。假设 x 跟 y 背后的关系 其实就是一条 2 次曲线,只是该 2 次曲线里面的参数是未知的。如图 2.8 所示,要用多限制的模型才会好取决于对这个问题的理解。因为这种模型是自己设计的,设计出不同的模型,结果不同。假设模型是 2 次曲线,在选择函数的时候有很大的限制,因为 2 次曲线要就是这样子,来来去去就是几个形状而已。所以当训练集有限的时候,来来去去只能够选几个函数。所以虽然说只给了 3 个点,但是因为能选择的函数有限,可能就会正好选到跟真正的分布比较接近的函数,在测试集上得到比较好的结果。
解决过拟合的问题,要给模型一些限制,最好模型正好跟背后产生数据的过程是一样的就有机会得到好的结果。给模型制造限制可以有如下方法:
- 给模型比较少的参数。如果是深度学习的话,就给它比较少 的神经元的数量,本来每层一千个神经元,改成一百个神经元之类的,或者让模型共用参数,可以让一些参数有一样的数值。全连接神经网络(fully-connected network),全连接神经网络其实是一个比较有灵活性的架构,而卷积神经网络(Convolutional Neural Network,CNN)是一个比较有限制的架构。CNN 是一种比较没有灵活性的模型,其是针对图像的特性来限制模型的灵活性。所以全连接神经网络,可以找出来的函数所形成的集合其实是比较大的,CNN 所找出来的函数,它形成的集合其实是比较小的,其实包含在全连接网络里面的,但是 就是因为 CNN 给了比较大的限制,所以 CNN 在图像上,反而会做得比较好。
- 用比较少的特征,本来给 3 天的数据,改成用给两天的数据,其实结果就好了一些。
- 还有一个招数叫做早停(early stopping),正则化(regularization)跟丢弃法(Dropout Method)。
- 但也不要给太多的限制。给模型太大的限制,可能会大到有了模型偏差的问题。
- 第一个方向是往往是最有效的方向,即增加训练集。因此如果训练集,蓝色的点变多了,虽然模型它的灵活性可能很大,但是因为点非常多,它就可以限制住,它看起来的形状还是会很像,产生这些数据背后的 2 次曲线,如图 2.7 所示。
交叉验证
比较合理选择模型的方法是把训练的数据分成两半,一部分叫作训练集(training set), 一部分是验证集(validation set)。比如 90% 的数据放在训练集里面,有 10% 的数据,会被 拿来做验证集,在训练集上训练出来的模型会使用验证集来衡量它们的分数,根据验证集上面的分数去挑选结果。
k折交叉验证(k-fold cross validation):如图 2.11 所示。k 折交叉验证就是先把训练集切成 k 等份。在这个例子,训练集被切成 3 等份,切完以后,拿其中一份当作验证集,另外两份当训练集,这件事情要重复 3 次。即第 1 份第 2 份当训练,第 3 份当验证;第 1 份第 3 份当训练,第 2 份当验证;第 1 份当验证,第 2 份第 3 份当训练。
接下来有 3 个模型,不知道哪一个是好的。把这 3 个模型,在这 3 个设置下,在这 3 个 训练跟验证的数据集上面,通通跑过一次,把这 3 个模型,在这 3 种情况的结果都平均起来, 把每一个模型在这 3 种情况的结果,都平均起来,再看看谁的结果最好假设现在模型 1 的结 果最好,3 折交叉验证得出来的结果是,模型 1 最好。再把模型 1 用在全部的训练集上,训练出来的模型再用在测试集上面。
不匹配
图 2.13 中横轴就是从 2021 年的 1 月 1 号开始一直往下,红色的线是真实的数字,蓝色的线是预测的结果。2 月 26 日是 2021 年观看人数最高的一天了,机器的预测差距非常的大, 差距有 2.58k,所以这一天是 2021 年观看人数最多的一天。跑了一层两层跟四层的看看,所有的模型的结果都不好,两层跟三层的错误率都是 2 点多 k,其实四层跟一层比较好,都是 1.8k 左右,但是这四个模型不约而同的,觉得 2 月 26 日应该是个低点,但实际上 2 月 26 日 是一个峰值,模型其实会觉得它是一个低点,也不能怪它,因为根据过去的数据,周五晚上大 家都出去玩了。但是 2 月 26 日出现了反常的情况。这种情况应该算是另外一种错误的形式, 这种错误的形式称为不匹配(mismatch)。
不匹配跟过拟合其实不同,一般的过拟合可以用搜集更多的数据来克服,但是不匹配是指训练集跟测试集的分布不同,训练集再增加其实也没有帮助了。
配跟过拟合其实不同,一般的过拟合可以用搜集更多的数据来克服,但是不匹配是指训练集跟测试集的分布不同,训练集再增加其实也没有帮助了。