避免过拟合

欠拟合和过拟合

欠拟合是指在训练集和测试集(或验证集)上模型效果都不好,一般由于模型能力不足导致;过拟合是指模型在训练集上表现好,而在测试集上表现不好,一般由于模型过度拟合了训练集中的噪声导致。本文主要讨论解决过拟合问题的方法。

L2 正则化

无论机器学习还是深度学习,L2 正则化项都用于限制参数 W 过大,它被累加在代价函数之中。

代价函数J除了计算每个实例的误差L,还加入网络中每层参数W的 2 范数的平方,并用λ作为参数,当λ较大时,就需要W接近0,才能得到较小的代价函数,这样一些无关紧要的参数就变成了0,从而减少了模型的复杂度,以及压缩后模型的规模。另外,较小的W也使层之间传递的数据变小,这样在使用 sigmoid 和 tanh 激活函数时,数据刚好集中在中间类似线性变换的一段,使非线性变换的结果类似线性变换。由于多个线性组合叠加相当于单个线性层,因此也倾向于简化模型。

如果使用 L1 正则化,参数矩阵将变得稀疏,根据经验,一般 L2 效果更好。L2 正则化方法可用于简化决策,但不适用于需要复杂决策的问题。使用该方法时,需要尝试多个λ值。

Dropout 方法

Dropout 方法是扔掉网络中的一些连接, 使结果不依赖于某个特定结点,从而构成更健壮的网络。

具体方法是将层中一定比例的参数置为 0,反向传播时也不调节这些参数。需要注意的是,在调试和预测阶段一般不使用 Dropout。如果在调试时也随机去掉连接,则不能保证每次实验结果一致,导致无法比较模型修改前后的效果,预测时则需要尽可能地使用网络功能,因此也不能去掉连接。

另外,如果手工实现 Dropout 功能还需要考虑补偿系数,例如在某层将 20% 的参数置 0,导致训练时该层的输出与预测时的分布不一致,则需要在训练时将该层输出除以 0.8。

归一化层

归一化层,也能在一定程度上缓解过拟合,它的原理与 Dropout 类似,都是引入噪声。比如 Batch-Norm 针对每个 mini-batch 计算均值和方差,而非对全体数据计算,相当于在训练集中加入了一些噪声,使得后面的层不过于依赖前层的某一单元。需要注意的是 batch size 越大,引入的噪声越小,正则效果也越差。

其它方法

还有一些方法也能缓解过拟合问题,如:

  • 增加训练数据,在数据不足时,加入变形后的数据(旋转、裁剪、水平翻转)。
  • Early stopping:当模型在验证集上不再下降时,停止迭代。
  • 修改模型结构:训练样本过小,模型参数过多也是造成过拟合的原因,可尝试修改模型结构。