在给出如何防止/减弱过拟合之前,让我们先从一个实际的例子看看到底怎么才是过拟合!
以MNIST数据集为例,shuffle出1000个sample作为train set,采用交叉熵损失和mini-batch随机梯度下降,迭代400epoch,将训练集合验证集的损失和准确率进行可视化,分别如下:
如如所示,随着训练的迭代,损失在训练集上越来越小,准去率趋于100%;反观验证集的效果,在15epoch左右,损失突然增大。这就是出现了过拟合的问题啦!
过拟合?怎么解决/弱化呢?本文将给出多种trick,同时也欢迎大家留言区补充。
1. 获取更多数据,这是最直观也是最有效的方式之一,有了足够的数据网络也不太容易过拟合了;
2. 数据增强,复制现有数据并加随机噪声(数据占比不能太高)、重采样等,在图像领域我们可以进行不同角度旋转、平移变换、随机裁剪、中心裁剪、模糊等;
3. 参数正则化(权值衰减)在损失和模型复杂度间进行折中,可以使用L1或L2,其中L1正则采用的是拉普拉斯先验,倾向于聚集网络的权值在相对少量的高重要连接上,而其他权重就会被趋向于0;而L2正则采用的是高斯先验;
4. Dropout,一种相当激进的技术,和正则化不同的是它不改变网络本身,而是会随机地删除网络中的一般隐藏的神经元,并且让输入层和输出层的神经元保持不变。每次使用梯度下降时,只使用随机的一般神经元进行更新权值和偏置,因此我们的神经网络时再一半隐藏神经元被丢弃的情况下学习的。这种技术的直观理解为:当Dropout不同的神经元集合时,有点像在训练不同的神经网络。而不同的神经网络会以不同的方式过拟合,所以Dropout就类似于不同的神经网络以投票的方式降低过拟合;
5. 选择合适的网络结构,这个比较好理解,就是通过减少网络层数、神经元个数、全连接层数等降低网络容量;
6. Early stopping,因为在初始化网络的时候一般都是初始为较小的权值,训练时间越长,部分网络权值可能越大。如果我们在合适时间停止训练,就可以将网络的能力限制在一定范围内;
7. 模型组合,Baggging &Boosting,将弱分类器融合之后形成一个强分类器,而且融合之后的效果会比最好的弱分类器更好;
8. BatchNormalization,一种非常有用的正则化方法,可以让大型的卷积网络训练速度加快很多倍,同时收敛后分类的准确率也可以大幅度的提高。BN在训练某层时,会对每一个mini-batch数据进行标准化(normalization)处理,使输出规范到N(0,1)的正太分布,减少了Internalconvariate shift(内部神经元分布的改变),传统的深度神经网络在训练是,每一层的输入的分布都在改变,因此训练困难,只能选择用一个很小的学习速率,但是每一层用了BN后,可以有效的解决这个问题,学习速率可以增大很多倍。
本文分享自 机器学习算法与Python学习 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!