在调整模型的过程中可能会遇到许多问题,这里为了处理这些问题(前期初学情况),从而给出了一个章节用于学习相关的技巧。
1.模型偏差
模型偏差可能会影响模型训练,我们在训练的时候,将所有的函数集合在一起得到一个函数的集合,但是这个函数的集合大小是我们不确定的,可能会因为太小,其中的所有函数都没有包含到一个能让损失变低的函数,这种情况下虽然可能找到一个θ*,可能这个函数确实是集合区域中最好的一个,但是损失还是不够低,因为集合区域找不到拥有较小损失的函数。
解决这个问题,我们就需要重新设计一个模型,给该模型更大的灵活性。
2.2优化问题
相比起上个模型问题,优化问题的情况下一般模型的灵活度是没有问题的,足够找到较小的损失函数了,但是优化方向不一定是朝着那个真正的最小的θ*,可能在其他地方就停止了。
距离,使用梯度下降的方法找,就有可能会卡在局部最小值,而无法找到一个真的让损失很低的函数。
一个可以用来判断到底是模型灵活度的问题还是优化问题的方法:这一个实验是从残差网络的论文“Deep Residual Learning for Image Recognition”里面节录出来的。这篇论文在测试集上测试两个网络,一个网络有20层,一个网络有56 层。
随着参数的更新,损失会越来越低,但是结果20层的损失比较低,56层的损失还比较高。看测试误差我们并不能得出结果到底如何,还需要看训练误差如何:
训练误差中我们会发现20层的 网络损失其实是比较低的,56层的网络损失是比较高的,因此我们能推断出56层的优化不够给力。
因为20层的损失都已经可以做到这样了,56层的灵活性一定比20层更大,它只要前20层的参数,跟这个20层的网络一样,剩下的36层应该只能更加优化,56层就应该比20层得到更低的损失才对。结果训练集上56层居然比20层的损失更高,肯定是优化的问题。
这里给出一种方法,可以先跑一些比较小的、比较浅的网络,或甚至用一些非深度学习的方法,比如线性模型、支持向量机SVM,这些模型因为相对来说比较简单,所以一般不会因为优化出现问题。
随后我们训练一个比较深的模型,如果相对于刚刚比较浅的模型来说,深度模型的灵活度更高,但是损失却比浅的模型高,就说明优化有问题。
比如:
这里是训练损失,从1层道4层损失一直在变小,结果到了5层损失就变大了,按照常理来说层数越高,损失就应该可以变的更低才对,显然这里就应该是优化的问题。
如果这是测试数据的损失,如果测试数据损失也小,比这个较强的基线模型还要小,就结束了。但如果训练数据上面的损失小,测试数据上的损失大,可能是真的过拟合。在测试上的结果不好,不一定是过拟合。要把训练数据损失记下来,先确定优化没有问题,模型够大了。接下来才看看是不是测试的问题,如果是训练损失小,测试损失大,这个有可能是过拟合。
2.3过拟合
过拟合是指训练误差和测试误差之间的差距太大。换句换说,就是模型复杂度高于实际问题,模型在训练集上表现很好,但在测试集上却表现很差,泛化能力差。
如下:
得到的函数可能确实在训练数据中表现得很好,但是一旦到了测试数据就会出现各种各样的错误,跟我们想象的虚线(真实数据)有着很大的出入,函数的弹性太大了。
解决过拟合的方法主要有两种,第一种:增加训练集
虽然模型它的灵活性可能很大,但是因为点非常多,它就可以限制住,它看起来的形状还是会很像,产生这些数据背后的二次曲线。
可以将这种方法扩展到数据增强,就是根据问题的理解创造出新的数据。举个例子,在做图像识别的时候,常做的一个招式是,假设训练集里面有某一张图片,把它左右翻转,或者是把它其中一块截出来放大等等。对图片进行左右翻转,数据就变成两倍。但是数据增强不能够随便乱做。在图像识别里面,很少看到有人把图像上下颠倒当作增强。因为这些图片都是合理的图片,左右翻转图片,并不会影响到里面的内容。但把图像上下颠倒,可能不是一个训练集或真实世界里面会出现的图像。如果给机器根据奇怪的图像学习,它可能就会学到奇怪的东西。所以数据增强,要根据对数据的特性以及要处理的问题的理解,来选择合适的数据增强的方式。
第二种方法是:限制模型,给模型一些限制,帮模型有过大的灵活性。
我们可以直接限制模型是什么样子的函数,也可以给模型比较少的参数,或者用比较少的特征,又或者是早停,正则化,丢弃法等。
但也不要给太多的限制。假设模型是线性的模型,要通过上面的三个点,显然不可能,这个时候限制太多了,不可能能找到好的结果。
这边产生了一个矛盾的情况,模型的复杂程度,或这样让模型的灵活性越来越大。但复杂的程度和灵活性都没有给明确的定义。比较复杂的模型包含的函数比较多,参数比较多。随着模型越来越复杂,训练损失可以越来越低,但测试时,当模型越来越复杂的时候,刚开始,测试损失会跟著下降,但是当复杂的程度,超过某一个程度以后,测试损失就会突然暴增了。这就是因为当模型越来越复杂的时候,复杂到某一个程度,过拟合的情况就会出现,所以在训练损失上面可以得到比较好的结果。在测试损失上面,会得到比较大的损失,可以选一个中庸的模型,不是太复杂的,也不是太简单的,刚刚好可以在训练集上损失最低,测试损失最低。
2.4交叉验证
考虑到我们在做深度学习的时候用训练集得到出来的模型可能在验证集上无法得到好的结果,我们可以考虑将训练集拆分开来,将其中的一部分作为验证集。
但是随机分验证集也会容易分的不好,这里我们使用一种方法:k折交叉验证,k折交叉验证就是先把训练集切成k等份。举一个例子,训练集被切成3等份,切完以后,拿其中一份当作验证集,另外两份当训练集,这件事情要重复 3 次。即第1份第2份当训练,第3份当验证;第1份第3份当训练,第2份当验证;第1份当验证,第2份第3份当训练。
随后我们会得到三个模型,将这三个训练的模型在验证的数据集上跑一变,将这三种情况的结果都平均起来,比如这里模型1的情况最好,就将模型1用在全部的训练集桑,训练出来的模型再用在测试集上面。
2.5不匹配
这里我们用一个已经跑过的结果来说明:
这里2.26日出现了反常的情况,觉得这一天应该是一个低点,因为根据过去的数据周五是都是低点,这里出现的反常不能怪AI,这种错误就被称作为不匹配。
不匹配跟过拟合其实不同,一般的过拟合可以用搜集更多的数据来克服,但是不匹配是指训练集跟测试集的分布不同,训练集再增加其实也没有帮助了。假设数据在分训练集跟测试集的时候,使用2020年的数据作为训练集,使用2021年的数据作为测试集,不匹配的问题可能就很严重
标签:20,训练,AI,李宏毅,模型,损失,DataWhale,测试,拟合 From: https://blog.csdn.net/MEIKONG1314/article/details/141528280