Datawhale X 李宏毅苹果书AI夏令营 | 阅读笔记——实践方法论

136 阅读4分钟

更新历史

  • 2024.09.03 初稿

《深度学习详解》/王棋等/中国工信出版社/新书

〇 如果在 Kaggle 上的结果不太好,要先检查训练数据的损失。看看模型在训练数据上面,有没有学起来,再去看测试的结果,如果训练数据的损失很大,显然它在训练集上面也没有训练好。接下来再分析一下在训练集上面没有学好的原因。 (P29)


★ 模型在训练集上损失值大,或没有学好,可能的原因

  • 模型偏差:要找的针(一个损失低的函数)不在大海里面。
  • 优化做的不好:要找的针在海里面,但是找针的方法不行,无法把针捞起来。

〇 模型偏差:这个时候重新设计一个模型,给模型更大的灵活性。所以如果模型的灵活性不够大,可以增加更多特征,可以设一个更大的模型,可以用深度学习来增加模型的灵活性,这是第一个可以的解法。

〇 训练数据的损失不够低的时候,到底是模型偏差,还是优化的问题?

  1. 一个建议判断的方法,通过比较不同的模型来判断模型现在到底够不够大。这边给大家的建议是看到一个从来没有做过的问题,可以先训练一些比较浅的模型,或者是一些比较简单的模型,先知道这些简单的模型,到底可以得到什么样的损失。
  2. 接下来还缺一个深的模型,如果深的模型跟浅的模型比起来,深的模型明明灵活性比较大,但损失却没有办法比浅的模型压得更低代表说优化有问题,梯度下降不给力,因此要有一些其它的方法来更好地进行优化。
  3. 如果是模型偏差,就把模型变大。假设经过努力可以让训练数据的损失变小,接下来可以来看测试数据损失;如果测试数据损失也小, 比这个较强的基线模型还要小,就结束了。
  4. 接下来才看看是不是测试的问题,如果是训练损失小,测试损失大,这个有可能是过拟合。

〇 过拟合

怎么解决过拟合的问题呢,有两个可能的方向:

  • 第一个方向是往往是最有效的方向,即增加训练集。
  • 另外一个解法是给模型一些限制,让模型不要有过大的灵活性。给模型制造限制可以有如下方法:
    • 给模型比较少的参数。如果是深度学习的话,就给它比较少的神经元的数量,本来每层一千个神经元,改成一百个神经元之类的,或者让模型共用参数,可以让一些参数有一样的数值。全连接网络(fully-connected network)其实是一个比较有灵活性的架构,而卷积神经网络(Convolutional Neural Network,CNN)是一个比较有限制的架构。
    • 用比较少的特征,本来给 3 天的数据,改成用给两天的数据,其实结果就好了一些。
    • 还有别的方法,比如早停(early stopping)、正则化(regularization)和丢弃法(dropout method)。

〇 交叉验证

  1. k 折交叉验证就是先把训练集切成 k 等份。在这个例子,训练集被切成 3 等份,切完以后,拿其中一份当作验证集,另外两份当训练集,这件事情要重复 3 次。即第 1 份和第 2 份当训练,第 3 份当验证;第 1 份和第 3 份当训练,第 2 份当验证; 第 1 份当验证,第 2 份第 3 份当训练。
  2. 接下来有 3 个模型,不知道哪一个是好的。把这 3 个模型,在这 3 个设置下,在这 3 个训练跟验证的数据集上面,通通跑过一次,把这 3 个模型,在这 3 种情况的结果都平均起来,把每一个模型在这 3 种情况的结果,都平均起来。
  3. 再看看谁的结果最好,假设现在模型 1 的结果最好,3 折交叉验证得出来的结果是模型 1 最好。再把模型 1 用在全部的训练集上,训练出来的模型再用在测试集上面。

〇 不匹配(mismatch)

不匹配跟过拟合其实不同,一般的过拟合可以用搜集更多的数据来克服,但是不匹配是指训练集跟测试集的分布不同,训练集再增加其实也没有帮助了。

上图是图像分类中的不匹配问题。增加数据也不能让模型做得更好,所以这种问题要怎么解决,匹不匹配要看对数据本身的理解了,我们可能要对训练集跟测试集的产生方式有一些理解,才能判断它是不是遇到了不匹配的情况。