Datawhale X 李宏毅苹果书 AI夏令营 深度学习入门Task_3笔记

实践方法论

在应用机器学习算法时,实践方法论能够帮助我们更好地训练模型。如果在 Kaggle 上的
结果不太好,虽然 Kaggle 上呈现的是测试数据的结果,但要先检查训练数据的损失。看看模
型在训练数据上面,有没有学起来,再去看测试的结果,如果训练数据的损失很大,显然它在
训练集上面也没有训练好。接下来再分析一下在训练集上面没有训练好的原因

1.模型偏差

模型偏差可能会影响模型训练。举个例子,假设模型过于简单,一个有未知参数的函数代
θ 1 得到一个函数 f θ 1(x ) ,同理可得到另一个函数 f θ 2(x ) ,把所有的函数集合起来得到一个函
数的集合。但是该函数的集合太小了,没有包含任何一个函数,可以让损失变低的函数不在模
型可以描述的范围内。
在这种情况下,就算找出了一个 θ ,虽然它是这些蓝色的函数里面最好的一个,但损失还是不够低。这种情况就是想要在大海里面捞针(一个损失低的函数),结果针根本就不在海里。
这个时候重新设计一个模型,给模型更大的灵活性。
如果模型的灵活性不够大,可以增加更多特征,可以设一个更大的模型,可以用深度学习来增加模型的灵活性,这是第一个可以的解法。但是并不是训练的时候,损失大就代表一定是模型偏差,
可能会遇到另外一个问题:优化做得不好

2.优化问题

一般只会用到梯度下降进行优化,这种优化的方法很多的问题。比如可能会卡在局部最
小值的地方,无法找到一个真的可以让损失很低的参数
如图 2.3(a) 所示。如图 2.3(b) 所示蓝色部分是模型可以表示的函数所形成的集合
一个函数的损失是够低的,梯度下降没有给这一个函数。训练数据的损失不够低的时候,到底是模型偏差,还是优化的问题?
找不到一个损失低的函数,到底是因为模型的灵活性不够,还是模型的灵活性已经够了,只是优化梯度下降不给力?
到底模型已经够大了,还是它不够大,怎么判断这件事呢?

(1)通过比较不同的模型来判断模型现在到底够不够大:

如果优化成功, 56 层的网络应该要比 20 层的网络可以得到更低的损失。但结果在训练集上面没有这个不是过拟合,这个也不是模型偏差,因为 56 层网络灵活性是够的,这个问题是优化不给力,优化做得不够好。

(2)做未遇到的问题的建议:

看到一个从来没有做过的问题,可以先跑一些比较小的、比较浅的网络,或甚至用一些非深度学习的方法,比如线性模型支持向量机( Support Vector Machine SVM SVM 可能是比较容易做优化的,它们比较不会有优化失败的问题。在它们的能力范围之内,找出一组最好的参数,先知道这些简单的模型,到底可以得到什么样的损失。
接下来还缺一个深的模型,如果深的模型跟浅的模型比起来,深的模型明明灵活性比较大,但损失却没有办法比浅的模型压得更低代表说优化有问题,梯度下降不给力,因此要有一些其它的方法来更好地进行优化。
但如果训练数据上面的损失小,测试数据上的损失大,可能是真的过拟合
在测试上的结果不好,不一定是过拟合。要把训练数据损失记下来,先确定优化没有问题,模型够大了。接下来才看看是不是测试的问题。
如果是训练损失小,测试损失大,这个有可能是过拟合。

 

3.过拟合

loss在训练数据上小,在测试数据上大
解决方法

(1)数据增强:

【1】增加训练资料

【2】根据资料的特性和自己对要处理的问题的理解,自己去创造data 

(2)限制模型:

【1】把几个参数值设置成一样的

【2】降低model的层数(降低model的复杂度,采用简单的模型比如二次多项式等)

【3】Early stopping(早停)

【4】Regularization(正则化)

【5】Dropout(丢弃法)

Q :为什么要把测试集分成公开和私人
A :假设所有的数据都是公开,就算是一个一无是处的模型,它也有可能在公开的数据上面得到好的结果。如果只有公开的测试集,没有私人测试集,写一个程序不断随机产生输出就好,不断把随机的输出上传到 Kaggle ,可以随机出一个好的结果。这个显然没有意义。
而且如果公开的测试数据是公开的,公开的测试数据的结果是已知的,一个很废的模型也可能得到非常好的结果。不要用公开的测试集调模型,因为可能会在私人测试集上面得到很差的结果,不过因为在公开测试集上面的好的结果也有算分数。

4.交叉验证

比较合理选择模型的方法是把训练的数据分成两半,一部分称为 训练集( training set , 一部分是验证集( validation set
比如 90% 的数据作为训练集,有 10% 的数据作为验证集。在训练集上训练出来的模型会使用验证集来衡量它们的分数,根据验证集上面的分数去挑选结果,再把这个结果上传到 Kaggle 上面得到的公开分数。
在挑分数的时候,是用验证集来挑模型,所以公开测试集分数就可以反映私人测试集的分数。但假设这个循环做太多次,根据公开测试集上的结果调整模型太多次,就又有可能在公开测试集上面过拟合,在私人测试集上面得到差的结果。
可以用 k 折交叉验证(k-foldcross validation)
k 折交叉验证就是先把训练集切成 k 等份。
在这个例子中,训练集被切成 3 等份,切完以后,拿其中一份当作验证集,另外两份当训练集,这件事情要重复 3 次。即第一份第 2 份当训练,第 3 份当验证;第一份第 3 份当训练,第 2 份当验证;第一份当验证,第 2 份第 3 份当训练。
接下来有 3 个模型,不知道哪一个是好的。把这 3 个模型,在这 3 个设置下,在这 3 个训练跟验证的数据集上面,通通跑过一次,把这 3 个模型,在这 3 种情况的结果都平均起来, 把每一个模型在这 3 种情况的结果,都平均起来,再看看谁的结果最好。

5.不匹配

中横轴就是从 2021 年的 1 1 号开始一直往下,红色的线是真实的数字,蓝色的线是预测的结果。
2 26 日是 2021 年观看人数最高的一天了,机器的预测差距非常的大,差距有 2580 ,所以这一天是 2021 年观看人数最多的一天。跑了一层 2 层跟四层的看看,所有的模型的结果都不好,两层跟 3 层的错误率都是 2 千多,其实四层跟一层比较好,都是 1800左右,但是这四个模型不约而同的,觉得 2 26 日应该是个低点,但实际上 2 26 日是一个峰值,模型其实会觉得它是一个低点,也不能怪它,因为根据过去的数据,周五晚上大家都出去玩了。
但是 2 26 日出现了反常的情况。这种情况应该算是另外一种错误的形式,这种错误的形式称为不匹配(mismatch

 

不匹配跟过拟合其实不同,一般的过拟合可以用搜集更多的数据来克服,但是不匹配是指训练集跟测试集的分布不同,训练集再增加其实也没有帮助了。
假设数据在分训练集跟测试集的时候,使用 2020 年的数据作为训练集,使用 2021 年的数据作为测试集,不匹配的问题可能就很严重。
如果今天用 2020 年当训练集,2021 年当测试集,根本预测不准。因为 2020 年的数据跟 2021 年的数据背后的分布不同。
下图 图像分类中的不匹配问题。增加数据也不能让模型做得更好
所以这种问题要怎么解决,匹不匹配要看对数据本身的理解了,我们可能要对训练集跟测试集的产生方式有一些理解,才能判断它是不是遇到了不匹配的情况。
  • 12
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值