博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
过拟合、欠拟合、正则化
阅读量:4222 次
发布时间:2019-05-26

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

过拟合和欠拟合

  1. 产生原因
    • 欠拟合:模型学习能力不足(太简单),无法学习到数据的真实分布,即模型的期望输出和真实输出之间有很大的差异,高偏差。
    • 过拟合:模型学习能力过分(太复杂),因噪声干扰等因素导致数据的分布有轻微的波动,但是模型也学习到了,导致模型的训练结果得到的数据分布过分依赖于所输入的数据,高方差。
    • 从模型泛化程度上理解,欠拟合的模型在训练集和测试集上表现不足,而过拟合的模型尽管在训练集上有良好的表现,模型泛化程度较差导致在测试集上差强人意。
    • 过拟合的原因是算法的学习能力过强,对数据分布而言,一些假设条件(如样本独立同分布)可能是不成立的;训练样本过少不能对整个空间进行分布估计。
  2. 缓解方法

    合适的数据分布+合理的模型复杂性
    合理的组合应该是:复杂的数据分布+简单的模型 或者 简单的数据分布+复杂的模型
    这里写图片描述

  3. 神经网络中的过拟合

    • 早停策略。本质上是交叉验证策略,选择合适的训练次数,避免训练的网络过度拟合训练数据。
    • 集成学习策略。而DNN可以用Bagging的思路来正则化。首先我们要对原始的m个训练样本进行有放回随机采样,构建N组m个样本的数据集,然后分别用这N组数据集去训练我们的DNN。即采用我们的前向传播算法和反向传播算法得到N个DNN模型的W,b参数组合,最后对N个DNN模型的输出用加权平均法或者投票法决定最终输出。不过用集成学习Bagging的方法有一个问题,就是我们的DNN模型本来就比较复杂,参数很多。现在又变成了N个DNN模型,这样参数又增加了N倍,从而导致训练这样的网络要花更加多的时间和空间。因此一般N的个数不能太多,比如5-10个就可以了。
    • DropOut策略。所谓的Dropout指的是在用前向传播算法和反向传播算法训练DNN模型时,一批数据迭代时,随机的从全连接DNN网络中去掉一部分隐藏层的神经元。 在对训练集中的一批数据进行训练时,我们随机去掉一部分隐藏层的神经元,并用去掉隐藏层的神经元的网络来拟合我们的一批训练数据。使用基于dropout的正则化比基于bagging的正则化简单,这显而易见,当然天下没有免费的午餐,由于dropout会将原始数据分批迭代,因此原始数据集最好较大,否则模型可能会欠拟合。
    • Batch Normalization。在神经网络中存在covariate internal shift现象(就是输入x服从一定的分布,通过神经网络层映射之后,对应的输出的分布发生了改变,产生了偏移)。后面的网络总要调整参数去补偿这种改变,致使整个网络复杂化,也容易过拟合。为了解决这个问题,Batch Normalization方法,总的来说就是对层间的数据做均值和方差的修正,把输出重新映射为一个高斯分布,最终它让一些饱和非线性的激活函数可以被使用。

正则化

  1. 原理(或者说思考):
    从贝叶斯的角度来说,代价函数可以表示为P(y|w,x)的形式,而正则项则是对参数w做了一个先验分布的假设,使得代价函数变成P(y|w,x)P(w)
    考虑两个分布:0均值的高斯分布和0均值的拉普拉斯分布

Laplace:12bexp|w|b L a p l a c e : 1 2 b e x p − | w | b

Gaussian:12παexpw22α G a u s s i a n : 1 2 π α e x p − w 2 2 α

代价函数的对数形式可以写成

logP(y|w,x)P(w)=logP(y|w,x)+logP(w) l o g P ( y | w , x ) P ( w ) = l o g P ( y | w , x ) + l o g P ( w )
右边第一项是原来的对数似然,第二项则可以化成

Laplace:1b|w|+=λ||w||1+ L a p l a c e : − 1 b | w | + 一 个 常 数 = − λ | | w | | 1 + 一 个 常 数

Gaussian:12αw2+=λ||w||2+ G a u s s i a n : − 1 2 α w 2 + 一 个 常 数 = − λ | | w | | 2 + 一 个 常 数

因为最大化 logP(y|w,x)P(w) l o g P ( y | w , x ) P ( w ) 最后都会转成最小化形式,所以代价函数最后会变成 J=+λ||w||p J = ⋆ + λ | | w | | p 的形式。

2. 对于L1而言,假设参数服从拉普拉斯分布;而对于L2而言,假设参数服从高斯分布,两个都是0均值
3. 正则效果和原因
效果:L1范数可以使权值稀疏,方便特征提取。
L2范数可以防止过拟合,提升模型的泛化能力,使w趋于0(或者说约束在一个很小的范围内)
为什么正则会达到这个效果呢?过拟合可以说明用了复杂的模型。复杂模型在参数上的表现可以分为:参数w全不为0,说明所有特征都用到了即数据处于一个复杂的特征空间中;参数的波动范围大,考虑极端一点的例子,某个模型把异常点也拟合进来,使得数据样本在较小的区间值发生了很大的波动,即该区间内的导数非常大(w非常大),所以一个好的模型的参数波动范围不会很大。
从参数的角度来说,解决过拟合有两种思路:参数存在部分0值(稀疏权值,L1),参数约束在很小的范围内(接近于0,L2)
然后在实际中,w不一定服从高斯分布或者拉普拉斯分布(也有种说法是不加正则项的化w服从的是均匀分布),而正则项的引入就是要我们强行让我们预想的w去服从高斯分布或者拉普拉斯分布。
对于高斯分布来说,其均值为0,那么随着惩罚项 λ λ 而言, λ λ 是和方差 α α 成反比
随着 λ λ 变大,w都接近于0,这就是L2范数可以防止过拟合,提升模型的泛化能力,使w趋于0的原因
而对于L1而言,有个结论:任何的规则化算子,如果他在w_i=0的地方不可微,并且可以分解为一个“求和”的形式,那么这个规则化算子就可以实现稀疏。
然后Lasso的稀疏性解释在于,我们求解w的过程实际上是计算 min(L+...lambda||w||p) m i n ( L + . . . l a m b d a | | w | | p ) 的形式
也就是每步迭代中计算对w求偏导,
两种 regularization 能不能把最优的 w 变成 0,取决于原先的L在 0 点处的导数。如果本来导数不为 0,那么施加 L2 regularization 后导数依然不为 0,最优的 x 也不会变成 0。而施加 L1 regularization 时,只要 regularization 项的系数 lambda 大于原先费用函数在 0 点处的导数的绝对值,w = 0 就会变成一个极小值点。
w<0 时 L+λ|w| L + λ | w | 的导数要小于0(函数减),同理w>0时导数>0 (函数增)
w从左边趋近于0 时, λ|w| λ | w | 的导数是 λ − λ ,假设此时 L 的导数为 La ,必须有 Laλ<0 L a − λ < 0 λ>La λ > L a ,同理w从右边趋近于0时,必须有 Lb+λ>0 L b + λ > 0 ,即 λ>Lb λ > − L b ,即当 λ λ 大于L在0点附近的绝对值,那么对应的w就必须为0,起到一个稀疏的作用。

你可能感兴趣的文章
Python 多线程技巧 用threading.Event代替time.sleep()
查看>>
工具】Cmake与gcc的关系
查看>>
struct中长度为0的数组用途与原理
查看>>
svm笔记
查看>>
C++ 继承&多态
查看>>
C++多继承的观察和7点体会(都是实用派的观点) good
查看>>
python socket编程详细介绍
查看>>
高人对libsvm的经典总结(全面至极)
查看>>
Linux下c语言多线程编程
查看>>
火狐下easyui1.3.*弹出window框定位不到中间解决把办法
查看>>
Hadoop启动报错NoClassDefFoundError: javax/activation/DataSource解决方案
查看>>
Python爬虫来啦,抓取数据导出到excel,简单明了,强大,直接贴代码
查看>>
Docker拉取镜像失败报错Error response from daemon: Get https://registry-1.docker.io解决办法
查看>>
IO操作的工具类总结
查看>>
对指定文件或目录进行压缩和解压缩的工具类总结
查看>>
Java中如何遍历Map对象的4种方法
查看>>
图片延时加载例子详解
查看>>
js获取url参数值的两种方式详解
查看>>
java中System.getProperty()方法详解
查看>>
MyEclipse设置默认注释的格式
查看>>