机器学习中的过拟合与解决方法

过拟合

过拟合举例

上学考试的时候,有的人采取题海战术,把每个题目都背下来。但是题目稍微一变,他就不会做了。因为他非常复杂的记住了每道题的做法,而没有抽象出通用的规则。

所以过拟合的原因有:

  • 训练集和测试集特征分布不一致
  • 模型太过复杂(记住了每一道题)而样本量不足

正则化

简化模型的一种方法。一般而言,参数“越大”,模型越复杂。例如 $y = 0.01x^3 + 0.01x^2 + x + 5$ 中,起主要作用的是 $x + 5$ 这两项,近似于线性函数;而可 $y = 5x^3 +7x^2 + x + 5$ 却不能忽略任意一项,这使得函数更加复杂了。而正则化的目的正是使得训练参数变得不“那么大”。

L1正则化

L2正则化

其中 $\lambda > 0$ 为正则化参数(regularization parameter)

为什么不对b进行正则化?

  • b只是众多参数中的一个,相对于w来说可忽略不计

一般来说,L2正则化更为常用

直观理解正则化

  1. $w^{[L]}\approx 0$,神经网络变简单了(相当于去掉了某些神经元)

  2. 若用tanh激活函数,$w^{[l]}$变小,$Z^{[l]}=W^{[l]}a^{[l-1]}+b^{l}$变小

    激活函数集中在0附近的区域,可近似理解为线性函数,显然不会过拟合

droupout正则化

一种专门使用在神经网络中的正则化方法,为每一层神经元设置keep_prob,表示在当前训练样本训练时以一定概率舍弃该层的某些神经元,如此一来,每个训练样本都使用一个精简版的网络进行训练。

Inverted dropout

1
2
3
d3 = np.random.rand(a3.shape[0], a3.shape[1]) < keep_prob
a3 = a3 * d3 # 将某些位置置0
a3 = a3 / keep_prob # 确保a3的期望值不变

原理解释

  • 组合解释
    • 每次dropout都相当于训练了一个子网络
    • 最后的结果相当于很多子网络的组合
  • 动机解释
    • 消除了神经元之间的依赖,增强泛化能力
  • 数据解释
    • 对于dropout后的结果,总能找到一个样本与其对应
    • 相当于数据增强

注意点

  • 训练阶段使用,测试阶段不用
  • 若担心某些层更容易发生过拟合(神经元数量过多),可设置keep_prob小一些
  • 多用于计算机视觉领域(极容易过拟合),其他领域仅在出现过拟合时使用

数据扩展

对数据集进行扩充,若为图像数据,可对图像进行翻转、放大后裁剪、旋转……

提前终止训练

在箭头处提前终止训练

输入归一化

  • 零均值化
  • 归一化方差

注意:需将测试集与训练集一起归一化,使用同一个均值与方差进行调整

总结

解决过拟合的方法有:

  • 获取更多的数据
    • 从源头获取数据
    • 根据当前数据集生成
  • 使用合适的模型
    • 网络结构(减小网络层数,减小神经元数量)
    • 训练时间(early stopping)
    • 限制权值(正则化)
    • 增加噪声
  • 结合多种模型
    • Bagging(采样出T个含有m个训练样本的采样集,分别训练学习器,决策时投票决定,如随机森林)
    • Boosting(使基学习器做错的样本后续受到更多关注,将所有学习器加权输出,如AdaBoost)
    • Dropout
  • 贝叶斯方法