(二)General Guidance(一般性指南)

General Guidance(一般性指南)

如果模型的训练效果并不好,首先,检查你的 training dataloss
也就是要先检查你的 training data,查看 model 在 training data 上的训练效果,再去看 testing 的结果。如果你发现你的 training data 的 loss 很大,显然它在训练集上面也没有训练好。接下来你要分析一下,在训练集上面没有学好是什么原因。
这边有两个可能,第一个可能是 Model Bias(模型偏差),第二个是 Optimization Issue(优化问题)

Model Bias(模型偏差)

  • The model is too simple.(模型过于简单)
  • Solution:redesign your model to make it more flexible.

在含有未知参数的函数,代入不同的参数,得到一个函数集。但这个函数集太小了,没有一个 Function 可以让 Loss 变低。

Optimization Lssue(优化问题)

存在较小的 Loss,但无法找到。
gradient descent(梯度下降法)中,可能会卡在 local minima(局部最小值),即局部最优解。
一个 model 里面,存在着某一个 function,它的 loss 是够低的,但 gradient descent 没有找到这一个 function。这就好像是说 我们想
大海捞针,针确实在海里,但是我们却没有办法把针捞起来

Model Bias vs Optimization Lssue

  • Gaining the insights from comparison(从比较中获得见解)
  • Start from shallower networks(or other models),which are easier to optimize.(从较浅的网络(或其他模型)开始,这更容易训练)
  • If deeper networks do not obtain smaller loss on training data,then there is optimization issue.(如果更深的网络不能获得较小的训练数据损失,那么就存在优化问题。)

并不是所有的结果不好,都叫做 overfitting。在训练集上20层的loss比较低,56层的 loss 比较高,这代表56层的 network ,它的 optimization 没有做好
如果现在56层的network要做到20层的 network 可以做到的事情,对它来说是轻而易举的。它只要前 20 层的参数,跟这个 20 层的 network 一样,剩下 36 层什么事都不做,identity copy(特征复制)前一层的输出即可。56 层的 network 一定可以做到 20 层的 network 可以做到的事情。所以 20 层的 network 有足够低的 Loss,但 56 层的 Loss 反而更高是没道理的。
所以对于 56 层的 network,如果你 optimization 成功的话,它的 Loss 应该要比20层的要更低。但在训练集上面并不是,这个不是 overfitting,也不是 model bias。因为 56 层 network 弹性是够的,这是因为你的 optimization 不给力,optimization做得不够好

可以通过比较不同的模型来判断 Model 是否足够大。一般情况下较深的神经网络的弹性比较大,但如果其 Loss 却比浅的神经网络的 Loss 更大,就说明出现了 Optimization Issue,即梯度下降做的不好。此时需要采取其他方法。

small loss on testing data

假设你现在经过一番努力,你已经可以让你的 training data 的loss变小了。那接下来你就可以来看 testing data loss,如果 testing data loss 也小,比 strong baseline 还要小,那训练就结束了。

large loss on testing data

Overfitting(过拟合)

Small loss on training data,large loss on testing data.
注:只有 training 的 loss 小(训练集的 Loss 小),testing 的 loss 大(测试集的 Loss 大)才有可能是 overfitting。

产生过拟合的原因

  1. 使用了一个很差的 machine learning 方法,训练出一个无用的 Function。

这个无用的 Function,如果把 xx 当做输入,这个 Function 就去比对这个 xx 有没有出现在训练集里面。如果 xx 出现在训练集里面了,就把它对应的 y^ŷ 当做输出;如果 xx 没有出现在训练集里面,就输出一个随机的值。也就是说这个无用的 Function 只能对应输出训练集里面的数据,当输入数据不属于训练集时就输出随机数。即这个 Function 什么都没学到,但是它在训练集上的 Loss 时0。可是在 testing data 上面,它的 loss 会变得很大,因为它其实什么都没有预测。

  1. 模型弹性过大。

今天的模型,它的能力非常的强,它的 flexibility(灵活性)、弹性很大。你只给它图中这三个点,它会知道在这三个点上面要让 loss 变低,所以今天的 model 形成的曲线会通过这三个点,但是其它没有训练集作为数据限制的地方,就会有 freestyle(自由度)。因为它的 flexibility、弹性很大,所以 model 可以变成各式各样的 function。你没有给它资料做训练,它就会有 freestyle,可以产生各式各样奇怪的结果。

解决过拟合的方法

  1. More training data. 增大训练集。
    • Data augmentation(数据增强)

如果你额外的数据不够多,你可以进行 data augmentation(数据增强),这个方法并不使用额外资料。所谓的 Data augmentation 就是你用一些你对于这个问题的理解,自己创造出新的资料。
举例来说在做影像辨识的时候,经常做的一个步骤是,假设你的训练集里面有某一张图片,把它左右翻转,或者是把它其中一块截出来放大等等。你做左右翻转,你的资料就变成两倍,这个就是 data augmentation。
但是要注意 data augmentation 不能够随便乱做,这个 augment 要 augment 得有道理。举例来说在影像辨识裡面,你就很少看到有人把影像上下颠倒当作 augmentation。因为这些图片都是合理的图片,你把一张照片左右翻转,并不会影响里面是什么样的东西。但如果你把它颠倒了,那就很奇怪了,这可能不是真实世界会出现的影像。如果你给机器看这种奇怪的影像的话,它可能就会学到奇怪的东西。
所以 data augmentation 要根据你对资料的特性,对你现在要处理的问题的理解来选择合适的 data augmentation 的方式

  1. constrained model. 限制模型的弹性。

那如何才能知道是否要对model采取限制?**要用多 constrain 的 model 才会好呢?**这就取决与你对要解决的问题的理解。因为 model 是你自己设计的,到底 model 要多 constrain、多 flexible,结果才会好,那这个要问你自己。

限制Model的方法

  • Less parameter,sharing parameters.

如果是 deep learning 的话,就给它比较少的神经元的数目。本来每层一千个神经元,改成一百个神经元之类的;或者是你可以让 model 共用参数,让一些参数有一样的数值。我们之前讲的 network 的架构,叫做 fully-connected network(全连接网络),这是一个比较有弹性的架构;而 **CNN(卷积神经网络)**是一个比较有限制的架构,它是针对影像的特性,来限制模型的弹性。所以 fully-connected 的 network,可以找出来的 function 所形成的集合,其实是比较大的;CNN 这个 model 所找出来的 function,它形成的集合其实是比较小的,实际上都包含在 fully-connected 的 network 里面。但是就是因为 CNN 有比较大的限制,所以 CNN 在影像上反而会做得比较好。

  • Less features
  • Early stopping(早停法)
  • Regularization(正则化)
  • Dropout(丢弃)

不要给模型太多限制

矛盾:Model 限制太低会产生 Overfitting,限制太高会产生 Model Bias。

Cross Validation(交叉验证)

如何选择 Model 才是比较合理的?
把 Training 的资料分成两半,一部分叫作 Training Set(训练集),一部分是 Validation Set(验证集)。将 Training Set 上训练出来的模型拿到 Validation Set 上去衡量它们的分数,你根据 Validation Set 上面的分数去挑选结果。

N-fold Cross Validation(N-重交叉验证)

N-fold Cross Validation 就是先把你的训练集切成 N 等份,在上图例子里我们切成三等份。切完以后,你拿其中一份当作 Validation Set,另外两份当 Training Set,然后这件事情你要重复三次
也就是说,你先第一份第二份当 Train,第三份当 Validation;然后第一份第三份当 Train,第二份当 Validation;之后第一份当 Validation,第二份第三份当 Train。
然后接下来你会有三个模型,你不知道哪一个是好的,你就把这三个 model 在这三个 setting(环境)下,在这三个 Training 跟 Validation 的 data set 上面通通跑一次。然后把这三个模型,在这三种状况的结果都平均起来,即把每一个模型在这三种状况的结果都平均起来,再看看谁的结果最好
如果你用这三个 fold(层)得出来的结果是这个 model 1 最好,然后你再把 model 1 用在全部的 Training Set 上,然后训练出来的模型再用在 Testing Set 上面。
以上的步骤就是所谓的 N-fold Cross Validation。

Mismatch(不匹配)

Your training and testing data have different distributions. Be aware of how data is generated.
在训练模型的过程,也可能会出现另一种形式的问题,称为 mismatch
也有人认为 mismatch 也算是一种 Overfitting。这样也可以,这都只是名词定义的问题。但是要注意,mismatch产生的原因与 overfitting 其实不一样。一般的 overfitting 你可以用搜集更多的资料来克服,但是 mismatch 意思是说你今天的训练集跟测试集它们的分布是不一样的