Datawhale X 李宏毅苹果书 AI夏令营 Task3笔记:机器学习实践方法论
1. 模型偏差
模型偏差可能会影响模型训练,因为模型太简单,所以损失低的函数不在模型可以描述的范围内。
这个时候要解决这个问题就要提高模型的灵活性,如果模型的灵活性不够大,可以增加更多特征,可以设一个更大的模型,可以用深度学习来增加模型的灵活性,所以,如果是模型偏差的解决办法,就是把模型变大(模型的灵活性)。但是并不是训练的时候,损失大就代表一定是模型偏差,可能会遇到另外一个问题:优化做得不好。
2. 优化问题
1)抛出问题
训练数据的损失不够低的时候,到底是模型偏差,还是优化的问题呢。找不到一个损失低的函数,到底是因为模型的灵活性不够,海里面没有针。还是模型的灵活性已经够了,只是优化梯度下降不给力,它没办法把针捞出来 到底是哪一个。到底模型已经够大了,还是它不够大,怎么判断这件事呢?
所以,通过比较不同的模型来判断模型现在到底够不够大。
2)用梯度下降方法优化的不足:
一般只会用到梯度下降进行优化,将θ 代入不同的数值,形成不同的函数,把所有的函数通通集合在一起,得到一个集合,这个函数里确实包含了损失最低的函数,但问题是梯度下降这一个算法无法找出损失低的函数,梯度下降是解一个优化的问题,找到 θ∗ 就结束了,但 θ∗ 的损失不够低。
3)有关优化问题的例子:
如图 2.5 所示,在训练集上面,2017 年到 2020 年的数据是训练集,1 层的网络的损失是 280,2 层就降到 180,3 层就降到 140,4 层就降到 100。但是测 5 层的时候结果变成 340。损失很大显然不是模型偏差的问题,因为 4 层都可以做到 100了,5 层应该可以做得更低。这个是优化的问题,优化做得不好才会导致造成这样子的问题。
4)怎样说明优化有问题:
拿出浅模型和深模型看这些模型到底可以得到什么样的损失。如果深的模型跟浅的模型比起来,深的模型明明灵活性比较大,但损失却没有办法比浅的模型压得更低代表说优化有问题,梯度下降不给力,因此要有一些其它的方法来更好地进行优化。
5)解决优化问题:
看到一个从来没有做过的问题,可以先跑一些比较小的、比较浅的网络,或甚至用一些非深度学习的方法,比如线性模型、支持向量机(Support Vector Machine,SVM),SVM 可能是比较容易做优化的,也就是这些模型它会竭尽全力的,在它们的能力范围之内,找出一组最好的参数,因此可以先训练一些比较浅的模型,或者是一些比较简单的模型,先知道这些简单的模型,到底可以得到什么样的损失。
3. 过拟合
1)识别过拟合:
把训练数据损失记下来,先确定优化没有问题,模型够大了(模型偏差)。接下来才看看是不是测试的问题,如果是训练损失小,测试损失大,这个有可能是过拟合。总的来说,过拟合:训练数据上面的损失小,测试数据上的损失大,就是过拟合。
2)解决过拟合问题:
方法一:增加训练集,也就是可以做数据增强(data augmentation,),数据增强就是根据问题的理解创造出新的数据
方法二:给模型一些限制,让模型不要有过大的灵活性,因为能选择的函数有限,可能就会正好选到跟真正的分布比较接近的函数,在测试集上得到比较好的结果。
给模型制造限制可以有如下方法:
- 给模型比较少的参数
如果是深度学习的话,就给它比较少的神经元的数量,全连接网络(fully-connected network)其实是一个比较有灵活性的架构,而卷积神经网络(Convolutional Neural Network,CNN)是一个比较有限制的架构。CNN 是一种比较没有灵活性的模型,其是针对图像的特性来限制模型的灵活性。全连接神经网络,可以找出来的函数所形成的集合其实是比较大的,CNN 所找出来的函数,它形成的集合其实是比较小的 - 用比较少的特征,本来给 3 天的数据,改成用给两天的数据,其实结果就好了一些。
- 还有别的方法,比如早停(early stopping)、正则化(regularization)和丢弃法(dropoutmethod)。
但也不要给太多的限制,模型的限制就太大了,在测试集上就不会得到好的结果。这种情况下的结果不好,并不是因为过拟合了,而是因为给模型太大的限制,大到有了模型偏差的问题。
3)过拟合出现的情况
当模型越来越复杂的时候,复杂到某一个程度,过拟合的情况就会出现。
4. 交叉验证
比较合理选择模型的方法是把训练的数据分成两半,一部分称为训练集(training set),一部分是验证集(validation set),比如 90% 的数据作为训练集,有 10% 的数据作为验证集。在训练集上训练出来的模型会使用验证集来衡量它们的分数,根据验证集上面的分数去挑选结果,在挑分数的时候,是用验证集来挑模型。但是会有一个问题,如果随机分验证集,可能会分得不好,所以可以用 k 折交叉验证
5. 不匹配
在某个点上预测值和真实值不同(或是出现反常),这种情况是另外一种错误的形式,这种错误的形式称为不匹配(mismatch),不匹配是指训练集和测试集的分布不同,如果今天用2020年的数据当训练集,2021年的当测试集,根本预测不准,因为2020年的数据跟 2021 年的数据背后的分布不同。