如何缓解过拟合

一.过拟合原因

什么是过拟合:模型可以完美的预测训练集,但对新数据的测试集预测结果差。 过度的拟合了训练数据,而没有考虑到泛化能力。

二.缓解过拟合方法

减少过拟合总结:过拟合主要是有两个原因造成的:数据太少+模型太复杂
  (1)获取更多数据 :从数据源头获取更多数据;数据增强(Data Augmentation)
  (2)early stopping
  (3)dropout ;
  (4)正则化,在训练的时候限制权值变大;
  (5)LRN(局部响应归一化层(Local Response Normalization)
  (6)残差网络(特征融合):将两种模型训练产生的特征进行融合
  
1.数据增强
  使用数据增强技术(data augmentation),主要是在训练数据上增加微小的扰动或者变化,一方面可以增加训练数据,从而提升模型的泛化能力,另一方面可以增加噪声数据,从而增强模型的鲁棒性。主要的数据增强方法有:翻转变换、随机修剪、色彩抖动、平移变换、尺度变换、对比度变换、噪声扰动、旋转变换 / 反射变换 等,可以参考 Keras 的官方文档 [2] 。获取一个 batch 的训练数据,进行数据增强步骤之后再送入网络进行训练。

但是不必做的太过,将原始数据量通过数据增加增加到2倍可以,但增加十倍百倍就只是增加了训练所需的时间,不会继续增加模型的泛化能力了。
数据增强代码详解
2.early stopping
  Early stopping方法的具体做法是,在每一个Epoch结束时(一个Epoch集为对所有的训练数据的一轮遍历)计算验证集(validation data)的精确率(accuracy),当accuracy不再提高时,就停止训练,及早的停止训练也可以在一定程度上避免训练模型对于训练数据的过拟合。
一般做法是,在训练的过程中,记录到目前为止最好的验证正确率(validation accuracy),当连续10次Epoch,validation accuracy没有达到最最佳Accuracy,则认为accuracy不再有所提升,此时就可以停止迭代了。

3.Dropout
深度学习中最常用的正则化技术是dropout,随机的丢掉一些神经元。Dropout可以实例化的表示为下图:
在这里插入图片描述
两个方面去直观地理解Dropout的正则化效果:
1、在Dropout每一轮训练过程中随机丢失神经元的操作相当于多个DNNs进行取平均,因此用于预测时具有vote的效果。
2、减少神经元之间复杂的共适应性。当隐藏层神经元被随机删除之后,使得全连接网络具有了一定的稀疏化,从而有效地减轻了不同特征的协同效应。也就是说,有些特征可能会依赖于固定关系的隐含节点的共同作用,而通过Dropout的话,就有效地组织了某些特征在其他特征存在下才有效果的情况,增加了神经网络的鲁棒性。

函数模型:
def dropout(x, keep_prob, noise_shape=None, seed=None, name=None):

x为浮点类型的tensor,keep_prob为浮点类型的scalar,范围在(0,1]之间,表示x中的元素被保留下来的概率,noise_shape为一维的tensor(int32类型),表示标记张量的形状(representing the shape for randomly generated keep/drop flags),并且noise_shape指定的形状必须对x的形状是可广播的。如果x的形状是[k, l, m, n],并且noise_shape为[k, l, m, n],那么x中的每一个元素是否保留都是独立,但如果x的形状是[k, l, m, n],并且noise_shape为[k, 1, 1, n],则x中的元素沿着第0个维度第3个维度以相互独立的概率保留或者丢弃,而元素沿着第1个维度和第2个维度要么同时保留,要么同时丢弃。

大部分情况下,一些简单的模型,我们在写代码时,主要写x和keep_prob即可
dropout代码详解

4.权重衰减(L2正则化)
  (1) 对于目标函数加入正则化项,限制权重参数的个数,这是一种防止过拟合的方法,这个方法其实就是机器学习中的 l2 正则化方法,只不过在神经网络中旧瓶装新酒改名为 weight decay
  (2).公式详解:
在这里插入图片描述
 L2正则化就是在损失函数后面再加上一个正则化项:
其中 C0 是原来并没有使用L2正则化时的损失函数,比如交叉熵函数等;

后一项是正则化项,即计算权重矩阵w的所有项的平方和÷2n,然后× λ(也叫正则化系数),作为最终Loss函数的一项参与梯度下降;这样的话我们在训练的反向传播过程中,得到的权重w就会尽可能小,从而一定程度上减小了模型的复杂度,从而一定程度上解决了过拟合问题。

权重衰减是如何起作用的,原理是什么?
(1)从模型的复杂度上解释:使权值 w的值尽可能的小,将w约束在一定的范围内,从某种意义上说,表示网络的复杂度更低,对数据的拟合更好,而在实际应用中,也验证了这一点,L2正则化的效果往往好于未经正则化的效果。
(2)从数学方面的解释:过拟合的时候,拟合函数的系数往往非常大,为什么?如下图所示,过拟合,就是拟合函数需要顾忌每一个点,最终形成的拟合函数波动很大。在某些很小的区间里,函数值的变化很剧烈。这就意味着函数在某些小区间里的导数值(绝对值)非常大,由于自变量值可大可小,所以只有系数足够大,才能保证导数值很大。而正则化是通过约束参数的范数使其不要太大,所以可以在一定程度上减少过拟合情况。
在这里插入图片描述
5.局部响应归一化层(Local Response Normalization)

LRN全称为Local Response Normalization,即局部响应归一化层,LRN函数类似Dropout和数据增强作为relu激活函数之后防止数据过拟合而提出的一种处理方法。这个函数很少使用,基本上被类似Dropout这样的方法取代.

为什么要引入LRN层?
首先要引入一个神经生物学的概念:侧抑制(lateral inhibitio),即指被激活的神经元抑制相邻的神经元。归一化(normaliazation)的目的就是“抑制”,LRN就是借鉴这种侧抑制来实现局部抑制,尤其是我们使用RELU的时候,这种“侧抑制”很有效 ,因而在alexnet里使用有较好的效果。

归一化有什么好处?
1.归一化有助于快速收敛;
2.对局部神经元的活动创建竞争机制,使得其中响应比较大的值变得相对更大,并抑制其他反馈较小的神经元,增强了模型的泛化能力。
补充:神经网络学习过程本质就是为了学习数据分布,一旦训练数据与测试数据的分布不同,那么网络的泛化能力也大大降低;另外一方面,一旦每批训练数据的分布各不相同(batch 梯度下降),那么网络就要在每次迭代都去学习适应不同的分布,这样将会大大降低网络的训练速度,这也正是为什么我们需要对数据都要做一个归一化预处理的原因。
LRN代码详解

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值