模型偏差
假设模型过于简单,一个有未知参数的函数代θ1得到一个函数fθ1 (x),把所有的函数集合起来得到一个函数的集合。但是该函数的集合太小了,没有包含任何一个函数,可以让损失变低的函数不在模型可以描述的范围内。这个时候重新设计一个模型,给模型更大的灵活性。也可以用深度学习,增加更多的灵活性。
优化问题
一般只会用到梯度下降进行优化,这种优化的方法很多的问题。如图,蓝色部分是模型可以表示的函数所形成的集合,可以把θ代入不同的数值,形成不同的函数,把所有的函数通通集合在一起,得到这个蓝色的集合。
训练数据的损失不够低的时候,到底是模型偏差,还是优化的问题呢。找不到一个损失低的函数,到底是因为模型的灵活性不够,还是模型的灵活性已经够了,只是优化梯度下降不给力。一个建议判断的方法,通过比较不同的模型来判断模型现在到底够不够大。举个例子,这一个实验是从残差网络的论文“DeepResidual Learning for Image Recognition”里面节录出来的。这篇论文在测试集上测试两个网络,一个网络有20层,一个网络有56层。图2.4(a) 横轴指的是训练的过程,就是参数更新的过程,随着参数的更新,损失会越来越低,但是结果 20 层的损失比较低,56层的损失还比较高。残差网络是比较早期的论文,2015年的论文。很多人看到这张图认为这个代表过拟合,深度学习不奏效,56层太深了不奏效,根本就不需要 这么深。但这个不是过拟合,并不是所有的结果不好,都叫做过拟合。在训练集上,20层的网络损失其实是比较低的,56层的网络损失是比较高的,如图2.4(b)所示,这代表56层的网络的优化没有做好,它的优化不给力。
如:
可以先跑一些比较小的、比较浅的网 络,或甚至用一些非深度学习的方法,比如线性模型、支持向量机(SupportVectorMachine,SVM),SVM可能是比较容易做优化的,它们比较不会有优化失败的问题。
如果深的模型跟浅的模型比起来,深的模型明明灵活性比较大,但损失却没有办法比浅的模型压得更低代表说优化有问题,梯度下降不给力,因此要有一些其它的方法来更好地进行优化:如果训练损失大,可以先判断是模型偏差还是优化。如果是模型偏差,就把模型变大。假设经 过努力可以让训练数据的损失变小,接下来可以来看测试数据损失;如果测试数据损失也小, 比这个较强的基线模型还要小,就结束了。
过拟合
如图所示,假设输入的特征为x,输出为y,x和y都是一维的。x和y 之间的关系是2次的曲线,曲线用虚线来表示。可以观察到训练集,训练集可以想像成从这条曲线上面,随机采样出来的几个点。模型的能力非常的强,其灵活性很大,只给它这3个点。在这3个点上面,要让损失低,所以模型的这个曲线会通过这3个点,但是其它没有训练集做为限制的地方,因为它的灵活性很大,模型可以变成各式各样的函数,没有给它数据做为训练,可以产生 各式各样奇怪的结果。
怎么解决过拟合的问题呢,有两个可能的方向:第一个方向是往往是最有效的方向,即增加训练集。因此如果训练集,蓝色的点变多了, 虽然模型它的灵活性可能很大,但是因为点非常多,它就可以限制住。可以做数据增强(dataaugmentation)
另外一个解法是给模型一些限制,让模型不要有过大的灵活性。
交叉验证
比较合理选择模型的方法是把训练的数据分成两半,一部分称为训练集(training set), 一部分是验证集(validation set)。比如 90% 的数据作为训练集,有 10% 的数据作为验证 集。在训练集上训练出来的模型会使用验证集来衡量它们的分数,根据验证集上面的分数去 挑选结果,再把这个结果上传到Kaggle上面得到的公开分数。
最好的做法,就是用验证损失,最小的直接挑就好了,不要管公开测试集的结果。理想上就用验证集挑就好,有过比较好的基线(baseline)算法以后,就不要再去动它了,就可以避免在测试集上面过拟合。或者可以用k折交叉验证(k-fold cross validation),如图 2.11 所示。k 折交叉验证就是先把训练集切成 k 等份。在这个例子, 训练集被切成3等份,切完以后,拿其中一份当作验证集,另外两份当训练集,这件事情要 重复3次。即第一份第2份当训练,第3份当验证;第一份第3份当训练,第2份当验证; 第一份当验证,第2份第3份当训练。
把这3个模型,在这3个设置下,在这3个 训练跟验证的数据集上面,通通跑过一次,把这3个模型,在这3种情况的结果都平均起来,把每一个模型在这3种情况的结果,都平均起来,再看看谁的结果最好假设现在模型1的结 果最好,3折交叉验证得出来的结果是,模型1最好。再把模型1用在全部的训练集上,训 练出来的模型再用在测试集上面。
不匹配
横轴就是从2021年的 1 月1号开始一直往下,红色的线是真实的数字,蓝色的线是预测的结果。2月26日是2021年观看人数最高的一天了,机器的预测差距非常的大,差距有2580,所以这一天是2021年观看人数最多的一天。这四个模型不约而同的,觉得2月26日应该是个低点,但实际上2月26日是一 个峰值,模型其实会觉得它是一个低点,也不能怪它,因为根据过去的数据,周五晚上大家都 出去玩了。但是2月26日出现了反常的情况。这种情况应该算是另外一种错误的形式,这种错误的形式称为不匹配(mismatch)
不匹配跟过拟合其实不同,一般的过拟合可以用搜集更多的数据来克服,但是不匹配是 指训练集跟测试集的分布不同,训练集再增加其实也没有帮助了。
(文中多处引用李宏毅老师文章《机器学习基础》 Datawhale )