博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何防止过拟合
阅读量:4072 次
发布时间:2019-05-25

本文共 2284 字,大约阅读时间需要 7 分钟。

原文:https://blog.csdn.net/weixin_37933986/article/details/69681671

通常过拟合由以下三种原因产生:1. 假设过于复杂;2. 数据存在很多噪音;3. 数据规模太小

过拟合的解决方法通常有:1. early stopping;2. 数据集扩增;3. 正则化;4. Dropout

Early stopping:

对模型的训练过程就是对模型参数的进行学习更新的过程。参数学习的过程中往往会用到一些迭代算法,比如梯度下降法。Early stopping的目的就是在迭代次数还未到设定最大迭代次数时停止迭代防止过拟合的产生。

Early stopping的具体方法是在每一轮的迭代过程进行交叉验证,如果验证集的精度相较上一次没有得到提升,那么就停止迭代。这种方法的思想非常直接,因为当精度都不再提高了,那么训练就没有意义了。但是也存在这样一种情况,当前代的交叉验证精度下降了,但是下一代又提升了,所以不能根据一两次的精度下降就判定不会再提高。一般的做法是,在迭代过程中,记录到目前为止最好的验证精度,如果连续十代没有提升精度,那么就认为精度不会再提高,此时便可以停止迭代。

数据集扩增

数据挖掘领域流传着这样一句话,更多的数据往往胜过一个更好的模型,因为我们的模型是通过大量的数据训练得来的,然后通过这个模型对将来的数据进行拟合。因此我们可以假设这些数据是独立同分布的,通常获取数据有以下方法:

  • 从数据源头采集更多数据
  • 复制原有的数据并加上随机噪声
  • 重采样
  • 根据当前估计数据分布参数,使用该分布产生更多数据

正则化方法

正则化是指在优化目标函数或代价函数是,在目标函数后面加上一个正则项。正则项通常有L1正则项和L2正则项。

1. L1正则

L1正则是基于L1范数和项,即参数的绝对值和参数的积项,即:

C=C0+λnw|w|
其中C0代表原始的代价函数,n是样本的个数,λ就是正则项系数,权衡正则项与C0项的比重。后面那一项即为L1正则项。
在计算梯度时,w的梯度变为:
Cw=C0w+λnsgn(w)
其中,sgn是符号函数,那么便使用下式对参数进行更新:
w:=w+αC0w+βλnsgn(w)
对于有些模型,如线性回归中(L1正则线性回归即为Lasso回归),常数项b的更新方程不包括正则项,即:
b:=b+αC0b
其中,梯度下降算法中,α<0,β<0,而在梯度上升算法中则相反。

从上式可以看出,当w为正时,更新后w会变小;当w为负时,更新后w会变大;因此L1正则项是为了使得那些原先处于零(即|w|≈0)附近的参数w往零移动,使得部分参数为零,从而降低模型的复杂度(模型的复杂度由参数决定),从而防止过拟合,提高模型的泛化能力。

其中,L1正则中有个问题,便是L1范数在0处不可导,即|w|在0处不可导,因此在w为0时,使用原来的未经正则化的更新方程来对w进行更新,即令sgn(0)=0,这样即:

sgn(w)|w>0=1,sgn(w)|w<0=1,sgn(w)|w=0=0

2. L2正则项

L2正则是基于L2范数,即在目标函数后面加上参数的L2范数和项,即参数的平方和与参数的积项,即:

C=C0+λ2nww2
其中C0代表原始的代价函数,n是样本的个数,与L1正则化项前面的参数不同的是,L2项的参数乘了12,是为了便于计算以及公式的美感性,因为平方项求导有个2,λ就是正则项系数,权衡正则项与C0项的比重。后面那一项即为L2正则项。
L2正则化中则使用下式对模型参数进行更新:
w:=w+αC0w+βλnw
对于有些模型,如线性回归中(L2正则线性回归即为Ridge回归,岭回归),常数项b的更新方程不包括正则项,即:
b:=b+αC0b
其中,梯度下降算法中,α<0,β<0,而在梯度上升算法中则相反。
从上式可以看出,L2正则项起到使得参数w变小加剧的效果,但是为什么可以防止过拟合呢?一个通俗的理解便是:更小的参数值w意味着模型的复杂度更低,对训练数据的拟合刚刚好(奥卡姆剃刀),不会过分拟合训练数据,从而使得不会过拟合,以提高模型的泛化能力。
在这里需要提到的是,在对模型参数进行更新学习的时候,有两种更新方式,mini-batch (部分增量更新)与 full-batch(全增量更新),即在每一次更新学习的过程中(一次迭代,即一次epoch),在mini-batch中进行分批处理,先使用一部分样本进行更新,然后再使用一部分样本进行更新。直到所有样本都使用了,这次epoch的损失函数值则为所有mini batch的平均损失值。设每次mini batch中样本个数为m,那么参数的更新方程中的正则项要改成:
λmw|w|
λ2mww2
而full-batch即每一次epoch中,使用全部的训练样本进行更新,那么每次的损失函数值即为全部样本的误差之和。更新方程不变。

Dropout

正则是通过在代价函数后面加上正则项来防止模型过拟合。在神经网络中,有一种方法是通过修改自身结构来实现的,叫做Dropout。这是对网络训练的一种技巧。

如下图所示:
三层神经网络
对于上图的神经网络,在训练过程中随机删除一些隐藏层的神经元,同时保证输入层和输出层的神经元不变。这便得到了如下的结构:
ANN
这样一次迭代的过程中应用反向传播更新权重时,不用更新已经被删除的神经元的权重,在下一轮迭代过程中可以随机删除另外一些神经元。这样可以保证一直进行有瑕疵的训练,直至训练结束。

你可能感兴趣的文章
UIButton添加block点击事件
查看>>
利用runtime给类别添加属性
查看>>
本地推送
查看>>
FMDB的使用
查看>>
UIImage存为本地文件与UIImage转换为NSData
查看>>
[转]打印质数的各种算法
查看>>
[转]javascript with延伸的作用域是只读的吗?
查看>>
php的autoload与global
查看>>
IE不支持option的display:none属性
查看>>
[分享]mysql内置用于字符串型ip地址和整数型ip地址转换函数
查看>>
TableDnd(JQuery表格拖拽控件)应用进阶
查看>>
[转]开源中最好的Web开发的资源
查看>>
Docker上部署SpringBoot项目并推送镜像到Docker Hub上---以MacOS为例
查看>>
bibtex I was expecting a `,‘ or a `}‘ 问题解决
查看>>
sql server中各类范式的理解
查看>>
进程同步
查看>>
Python中列表元素删除
查看>>
二分查找与递归式二分查找
查看>>
在Navicat for MySQL中修改表的编码格式
查看>>
【RPC】一步一步实现基于netty+zookeeper的RPC框架(四)
查看>>