机器学习中的过拟合与解决方法
过拟合
过拟合举例
上学考试的时候,有的人采取题海战术,把每个题目都背下来。但是题目稍微一变,他就不会做了。因为他非常复杂的记住了每道题的做法,而没有抽象出通用的规则。
所以过拟合的原因有:
- 训练集和测试集特征分布不一致
- 模型太过复杂(记住了每一道题)而样本量不足
正则化
简化模型的一种方法。一般而言,参数“越大”,模型越复杂。例如 $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正则化更为常用
直观理解正则化
$w^{[L]}\approx 0$,神经网络变简单了(相当于去掉了某些神经元)
若用tanh激活函数,$w^{[l]}$变小,$Z^{[l]}=W^{[l]}a^{[l-1]}+b^{l}$变小
激活函数集中在0附近的区域,可近似理解为线性函数,显然不会过拟合
droupout正则化
一种专门使用在神经网络中的正则化方法,为每一层神经元设置keep_prob
,表示在当前训练样本训练时以一定概率舍弃该层的某些神经元,如此一来,每个训练样本都使用一个精简版的网络进行训练。
Inverted dropout
1 | d3 = np.random.rand(a3.shape[0], a3.shape[1]) < keep_prob |
原理解释
- 组合解释
- 每次dropout都相当于训练了一个子网络
- 最后的结果相当于很多子网络的组合
- 动机解释
- 消除了神经元之间的依赖,增强泛化能力
- 数据解释
- 对于dropout后的结果,总能找到一个样本与其对应
- 相当于数据增强
注意点
- 训练阶段使用,测试阶段不用
- 若担心某些层更容易发生过拟合(神经元数量过多),可设置keep_prob小一些
- 多用于计算机视觉领域(极容易过拟合),其他领域仅在出现过拟合时使用
数据扩展
对数据集进行扩充,若为图像数据,可对图像进行翻转、放大后裁剪、旋转……
提前终止训练
在箭头处提前终止训练
输入归一化
- 零均值化
- 归一化方差
注意:需将测试集与训练集一起归一化,使用同一个均值与方差进行调整
总结
解决过拟合的方法有:
- 获取更多的数据
- 从源头获取数据
- 根据当前数据集生成
- 使用合适的模型
- 网络结构(减小网络层数,减小神经元数量)
- 训练时间(early stopping)
- 限制权值(正则化)
- 增加噪声
- 结合多种模型
- Bagging(采样出T个含有m个训练样本的采样集,分别训练学习器,决策时投票决定,如随机森林)
- Boosting(使基学习器做错的样本后续受到更多关注,将所有学习器加权输出,如AdaBoost)
- Dropout
- 贝叶斯方法