实践方法论
在应用机器学习算法时,实践方法论能够帮助我们更好地训练模型。如果在 Kaggle 上的结果不太好,虽然 Kaggle 上呈现的是测试数据的结果,但要先检查训练数据的损失。看看模型在训练数据上面,有没有学起来,再去看测试的结果,如果训练数据的损失很大,显然它在训练集上面也没有训练好。接下来再分析一下在训练集上面没有学好的原因。
1.模型的偏差
模型偏差可能会影响模型训练。举个例子,假设模型过于简单,一个有未知参数的函数代θ1 得到一个函数,同理可得到另一个函数
,把所有的函数集合起来得到一个函数的集合。但是该函数的集合太小了,没有包含任何一个函数,可以让损失变低的函数不在模型可以描述的范围内。在这种情况下,就算找出了一个
,虽然它是这些蓝色的函数里面最好的一个,但损失还是不够低。这种情况就是想要在大海里面捞针(一个损失低的函数),结果针根本就不在海里。
这时我们就需要训练一个新的模型,更好的解决模型没有得到损失很小的问题。
除了模型偏差会影响模型训练外,优化问题也会影响损失的降低
2.优化
一般只会用到梯度下降进行优化,这种优化的方法很多的问题。比如可能会卡在局部最小值的地方,无法找到一个真的可以让损失很低的参数
但是我们有时可能并不能判断出具体是因为模型偏差还是优化方法出了问题,还是说模型太小了不够训练出最好的参数
残差网络的论文中给出了一个建议,通过比较不同的模型来判断
下面这个图,就生动的展示了一个20层的神经网络和56层神经网络在同一个测试集和训练集的表现
但是56层的模型却不如20层的表现好,56层的网络还没有20层的误差小。多余的36层网络相当于做了无用功
如果训练数据上面的损失小,测试数据上的损失大,可能是真的过拟合。在测试上的结果不好,不一定是过拟合。要把训练数据损失记下来,先确定优化没有问题,模型够大了。接下来才看看是不是测试的问题,如果是训练损失小,测试损失大,这个有可能是过拟合。
3.过拟合
过拟合是由于模型使用了太多的特征使得模型将部分数据的“特性”也学习到,使得模型的泛化能力较弱
那么怎么解决过拟合问题呢?下面一起来讨论一下
3.1增加数据
根据问题的理解创造出新的数据,举个例子,在做图像识别的时候,常做的一个招式是,假设训练集里面有某一张图片,把它左右翻转,或者是把它其中一块截出来放大等等。对图片进行左右翻转,数据就变成两倍。但是注意不能把图片进行上下翻转,因为他不是我们想要的一个合理的图片,可能会使机器学习到奇怪的特征
3.2限制模型
3.2.1使用较少的特征,增强模型的泛化能力
3.2.2使用较少的参数
如果是深度学习,我们可以给他较少的神经元本来每层一千个神经元,改成一百个神经元之类的,或者让模型共享参数。
卷积神经网络(Convolutional Neural Network,CNN)是一个比较有限制的架构。CNN 是一种比较没有灵活性的模型,其是针对图像的特性来限制模型的灵活性。所以全连接神经网络,可以找出来的函数所形成的集合其实是比较大的,CNN 所找出来的函数,它形成的集合其实是比较小的,其实包含在全连接网络里面的,但是就是因为CNN 给了比较大的限制,所以 CNN 在图像上,反而会做得比较好
3.2.3正则化
3.2.4Dropout
但是也不能给出太多的限制,限制太多可能会使模型根本拟合不了,如下图所示
4交叉验证
比较合理选择模型的方法是把训练的数据分成两半,一部分称为训练集(training set),一部分是验证集(validation set)。比如 90% 的数据作为训练集,有 10% 的数据作为验证集。在训练集上训练出来的模型会使用验证集来衡量它们的分数,根据验证集上面的分数去挑选结果。
把数据分为3个,每次有两个训练集一个验证集,循环跑三次,可以得出哪些数据得出的结果更好
数据分为k类就叫做k-折交叉验证
5.不匹配
李老师获取到正式的视频观看次数,与使用模型预测出来的结果做了对比,得出了下面这个折线图。很明显发现2.26这天的数据预测值和真实值之间的差距很大,导致了不匹配的现象
但是匹不匹配要看对数据本身的理解了,我们可能要对训练集跟测试集的产生方式有一些理解,才能判断它是不是遇到了不匹配的情况。