这篇文章主要是介绍一下神经网络中的过拟合问题,并总结一下目前都有哪些有效的方法来缓解过拟合问题。
过拟合表现
在深度学习任务中,过拟合最直观的表现就是,模型在测试集的表现远远差于训练集,也就是模型的泛化性能太差。
直观分析
- 为什么在测试集上的表现差于训练集?最简单的回答,因为模型就是在训练集上训练出来的,它对训练集接触的比较多,好!那为什么测试集和训练集是同一类数据(训练集和测试集同一分布),表现就这么差了呢?难道模型从训练集学错东西了?没有去学习数据内在真实的规律(分布)?
我们都知道设计模型是为了让模型自己归纳出数据的内在规律,那么我们现在有理由怀疑网络自己“学坏了”,没有按照我们的期望去学习。
那更正式的解释呢?我们所有的训练集都是对真实样本的抽样,不管是图片数据,还是语音等,获得的样本是 $X = x(真实值)+u(随机误差)$ ,而我们的神经网络优化的损失函数是模型的输出与 $X$ 之间的误差,所以模型拟合的是 $X$ 的分布,而我们期望的是网络尽可能的找到 $ x(真实值)$ 的分布,所以当网络错误的过分拟合 $X$ 时(即也强行拟合了$u(随机误差)$),当使用测试集时,就算对于同一类图片,当随机误差不一样时,模型也认为它们是不同类的。
- 其次,我们还可以想到,也有可能是训练数据太少了,不具有代表性,为什么呢?
周所周知,机器学习或者深度学习任务中,一个前提是训练集在待解决问题上必须有足够的代表性,当数据太少时,网络往往只学习到了一部分,大数定理也告诉我们,当样本足够多时,我们可以近似认为样本分布就是真实分布。
神经网络中导致过拟合的操作
训练集大小相对于网络规模偏小。
怎么定义这个小?目前我是不清楚有什么公式或者量化的方式在训练前知道是否会过拟合,通常我的做法就是设计网络结构时根据经验,先从小网络开始,毕竟小网络训练快,一步一步增加网络规模,直到发现训练集误差比上个模型小,但是测试集误差却变大,这里就可以初步知道对于该问题,神经网络的大致规模。
缓解过拟合的方法
- 获取更多、质量更高的数据。
- 直接采集新的数据,对于图片数据,上网爬,自己去拍等。
- 数据增强(要根据实际问题选取其中的一部分操作,不能无脑用):标准化、随机旋转、随机裁剪、随机亮度、随机噪声、随机平移,随机缩放,mixup等。
- 生成式数据:利用 GAN来根据已有的数据生成新的数据,没用过,听说效果不太好。
- 减小模型的规模,上面也说了,模型规模太大,导致模型完美地拟合了训练集,包括噪声。
- 正则化
- L1、L2范数,对权重施加惩罚项,一般使用L2范数,求导容易,方便优化
- dropout
- BN
- early stopping
- 集成学习方法
- bagging:每次有放回的从训练集抽取一个子集训练模型,经过N次抽取,会训练出N个模型,测试时分别使用N个模型,最后再综合决策出结果。
- boosting:同样也是训练N个分类器,不过是根据样本的权重,依次递进的训练,它训练出的分类器成为弱分类器,最后将弱分类器按照各自的”性能得分“组合成一个强分类器。