李宏毅深度学习笔记
优化问题
训练数据的损失不够低的时候,到底是模型偏差,还是优化的问题?
判断方法是通过比较不同的模型来判断模型现在到底够不够大
看到一个从来没有做过的问题,可以先跑一些比较小的、比较浅的网络,或甚至用一些非深度学习的方法,比如线性模型、支持向量机(Support Vector Machine,SVM),SVM 可能是比较容易做优化的,它们比较不会有优化失败的问题。也就是这些模型它会竭尽全力的,在它们的能力范围之内,找出一组最好的参数,它们比较不会有失败的问题。因此可以先训练一些比较浅的模型,或者是一些比较简单的模型,先知道这些简单的模型,到底可以得到什么样的损失。
如果深的模型跟浅的模型比起来,深的模型明明灵活性比较大,但损失却没有办法比浅的模型压得更低代表说优化有问题,梯度下降不给力,因此要有一些其它的方法来更好地进行优化。(不可能是因为过拟合)
如果 56 层的网络要做到 20 层的网络可以做到的事情,对它来说是轻而易举的。它只要前 20 层的参数,跟这个 20 层的网络一样,剩下 36 层就什么事都不做,复制前一层的输出就好了。如果优化成功,56 层的网络应该要比 20 层的网络可以得到更低的损失。但结果在训练集上面没有,这个不是过拟合,这个也不是模型偏差,因为 56 层网络灵活性是够的,这个问题是优化不给力,优化做得不够好。
在测试上的结果不好,不一定是过拟合。要把训练数据损失记下来,先确定优化没有问题,模型够大了。接下来才看看是不是测试的问题,如果是训练损失小,测试损失大,这个有可能是过拟合。
过拟合
x 和 y之间的关系是 2 次的曲线。我们真正可以观察到的是训练集,训练集可以想像成从这条曲线上面,随机采样出来的几个点。模型的能力非常的强,其灵活性很大,只给它这 3 个点。在这 3 个点上面,要让损失低,所以模型的这个曲线会通过这 3 个点,但是其它没有训练集做为限制的地方,因为它的灵活性很大,它灵活性很大,所以模型可以变成各式各样的函数,没有给它数据做为训练,可以产生各式各样奇怪的结果。
过拟合解决方案:
- 1、增加训练集;或者数据增强,这个方法并不算是使用了额外的数据(如图片左右翻转,放大某个区域等。但是数据增强不能够随便乱做,在图像识别里
面,很少看到有人把图像上下颠倒当作增强) - 2、给模型一些限制,让模型不要有过大的灵活性
限制模型灵活性方法:
- 1、给模型比较少的参数。如果是深度学习的话,就给它比较少的神经元的数量或者让模型共用参数,可以让一些参数有一样的数值。全连接网络(fully-connected network)其实是一个比较有灵活性的架构,而卷积神经网络(Convolutional Neural Network,CNN)是一个比较有限制的架构。CNN 是一种比较没有灵活性的模型,其是针对图像的特性来限制模型的灵活性。
- 2、用比较少的特征,本来给 3 天的数据,改成用给两天的数据,其实结果就好了一些。(这个点是为啥)
- 3、其他方法,如早停(early stopping)、正则化(regularization)和丢弃法(dropout method)
但也不能给模型过大的限制,可能会有模型偏差的问题。
随着模型越来越复杂,训练损失可以越来越低,但测试时,当模型越来越复杂
的时候,刚开始,测试损失会跟著下降,但是当复杂的程度,超过某一个程度以后,测试损失就会突然暴增了。这就是因为当模型越来越复杂的时候,复杂到某一个程度,过拟合的情况就会出现,所以在训练损失上面可以得到比较好的结果。在测试损失上面,会得到比较大的损失,可以选一个中庸的模型,不是太复杂的,也不是太简单的,刚刚好可以在训练集上损失最低,测试损失最低。
交叉验证
比较合理选择模型的方法是把训练的数据分成两半,一部分称为训练集(training set),一部分是验证集(validation set)。比如 90% 的数据作为训练集,有 10% 的数据作为验证集。
k 折交叉验证就是先把训练集切成 k 等份。如训练集被切成 3 等份,切完以后,拿其中一份当作验证集,另外两份当训练集,这件事情要重复 3 次。即第一份第 2 份当训练,第 3 份当验证;第一份第 3 份当训练,第 2 份当验证;第一份当验证,第 2 份第 3 份当训练