欠拟合和过拟合分析

1 基本概念

training, validition, testing set:一般将数据分为训练集、验证集和测试集。小数据6:3:1,大数据98:1:1。验证集的意义是指导炼丹方向。测试集用来评价模型。不应该根据测试集来指导模型优化。

泛化误差包括偏差和方差

  • 偏差:所有训练数据集训练出的模型输出的结果和真实结果的差异。可以用loss的均值衡量
  • 方差:不同训练数据集训练出的模型输出的结果之间的差异。用loss的方差衡量

2 欠拟合

欠拟合时,没有学习充分,所以训练及验证集的loss都比较高,此时会出现高偏差high bias,低方差low variance,因为没充分所以不同训练集带来的结果不会有太大不同。根据可能的原因就可以得出可能的改进方法:

  • 数据的特征不够明显,学不到什么东西:增加数据的特征,尤其是优质特征。这属于特征工程的工作
  • 模型不够复杂:增加模型复杂度,以及减小正则化项的系数
  • 梯度更新速度太慢,还没收敛到合适程度就跑完了:
    • 增加训练次数。除了粗暴增大epoch之外,也可以用mini-batch,这样所有样本跑过一个epoch之后参数已经更新了很多次(这个几乎已经是默认设置了)
    • 遇到了局部最小、鞍点等:换优化方法,如RMSProp,Adam,动量梯度下降等
    • 学习率太大导致在最低点附近震荡:降低学习率或使用自适应学习率
    • 遇到了梯度消失/爆炸,低层没学到,高层瞎学。不过梯度问题和震荡一样,很容易就会表现出来,一般不会在找欠拟合原因的时候才看到。
      • 换激活函数,如ReLU,Maxout
      • BN(然而BN还有一点点正则化作用)

3 过拟合

对训练集的loss很低,但是对验证集的loss高,说明学习过度,降低了泛化能力

此时会出现高偏差high bias和高方差high variance

  • 最朴素的思想——训练到一定程度其实就可以了,但继续迭代优化导致过度训练:Early stopping。可是什么时候停才合适呢?可以监测验证集的loss,设置多少代以内不再降低时就停止
  • 模型比较复杂,而数据量不够:简化模型、扩充数据。搜集更多数据或者使用数据增强,能的话这个方法是首选的
  • 还是模型复杂,不换结构的话:
    • 表现在神经网络上,就是神经元、连接太多:使用dropout。此方法可以构造多种稀疏连接最后再组合(其实相当于换结构)
    • 更通用的方法:正则化。通过给损失函数增加正则化项抑制参数的取值。L1正则会造成稀疏,L2更平滑