一、模型偏差
模型偏差可能会影响模型训练。若模型过于简单,就会使得让损失变低的函数不在模型可以描述的范围内。
这就需要设计一个新的模型,给模型更大的灵活性。可以增加输入的特征,来提高模型的灵活性;也可以用深度学习,增加更多的灵活性。所以如果模型的灵活性不够大,可以增加更多特征,可以设一个更大的模型、可以用深度学习来增加模型的灵活性。但并不是训练的时候,损失大就代表一定是模型偏差,可能会遇到另外一个问题:优化做得不好。
二、优化问题
常用的梯度下降优化会带来许多问题,比如可能会卡在局部最小值的地方,无法找到一个真的可以让损失很低的参数。梯度下降这一个算法无法找出损失低的函数,梯度下降是解一个优化的问题,找到 θ∗ 就结束了。但 θ∗ 的损失不够低。这个模型里面存在着某一个函数的损失是够低的,梯度下降没有给这一个函数。
可以先跑一些比较小的、比较浅的网络,或甚至用一些非深度学习的方法,比如线性模型、支持向量机(Support Vector Machine,SVM),SVM 可能是比较容易做优化的,它们比较不会有优化失败的问题,这样可以先知道这些简单的模型,到底可以得到什么样的损失。
三、过拟合
训练集可以想像成从这条曲线上面,随机采样出来的几个点。模型的能力非常的强,其灵活性很大,只给它这 3 个点。在这 3 个点上面,要让损失低,所以模型的这个曲线会通过这 3 个点,但是其它没有训练集做为限制的地方,因为它的灵活性很大,它灵活性很大,所以模型可以变成各式各样的函数,没有给它数据做为训练,可以产生各式各样奇怪的结果。但是测试数据和训练数据不同,如果模型它的自由度很大的话,它可以产生非常奇怪的曲线,导致训练集上的结果好,但是测试集上的损失很大。
解决过拟合问题的方法:
1.增加训练集
如果训练集,蓝色的点变多了,虽然模型它的灵活性可能很大,但是因为点非常多,它就可以限制住,它看起来的形状还是会很像。即可以做数据增强(data augmentation),数据增强就是根据问题的理解创造出新的数据。
2.给模型一些限制,让模型不要有过大的灵活性
要用多限制的模型才会好取决于对这个问题的理解。因为这种模型是自己设计的,设计出不同的模型,结果不同。假设模型是 2 次曲线,在选择函数的时候有很大的限制,因为 2 次曲线要就是这样子,来来去去就是几个形状而已。所以当训练集有限的时候,来来去去只能够选几个函数。所以虽然说只给了 3 个点,但是因为能选择的函数有限,可能就会正好选到跟真正的分布比较接近的函数,在测试集上得到比较好的结果。
四、交叉验证
比较合理选择模型的方法是把训练的数据分成两半,一部分称为训练集(training set),一部分是验证集(validation set)。比如 90% 的数据作为训练集,有 10% 的数据作为验证集。在训练集上训练出来的模型会使用验证集来衡量它们的分数,根据验证集上面的分数去挑选结果,再把这个结果上传到 Kaggle 上面得到的公开分数。在挑分数的时候,是用验证集来挑模型,所以公开测试集分数就可以反映私人测试集的分数。
五、不匹配
不匹配跟过拟合不同,一般的过拟合可以用搜集更多的数据来克服,但是不匹配是指训练集和测试集的分布不同,训练集再增加也没帮助。增加数据也不能让模型做的更好,所以解决这种问题需要我们对训练集和测试集的产生方式有一定的理解,才能判断是否遇到了不匹配的情况。