1、什么是过拟合
为了使训练数据与训练标签一致,而对模型过度训练,从而使得模型出现过拟合(over-fitting)现象。具体表现为,训练后的模型在训练集中正确率很高,但是在测试集中的变现与训练集相差悬殊,也可以叫做模型的泛化能力差。下图展示了分类模型中过拟合的现象。
(a) (b) (c)
![794b8b46907ed5e3eed1d2a2cd84d537.png](https://i-blog.csdnimg.cn/blog_migrate/64a27210a3dbe583b39d61b903bfa279.jpeg)
红色×为已知的训练数据(横坐标看做样本维度,纵坐标看做样本标签),蓝色线表示拟合的曲线。尽管更高阶的函数能够更好地描述当前的训练数据,但是当同分布的数据增加时,很有可能不会落到图1(c)的高阶函数曲线上。
2、过拟合出现的原因
(1)建模样本选取有误,如样本数量太少,选样方法错误,样本标签错误等,导致选取的样本数据不足以代表预定的分类规则;
(2)样本噪音干扰过大,使得机器将部分噪音认为是特征从而扰乱了预设的分类规则;
(3)假设的模型无法合理存在,或者说是假设成立的条件实际并不成立;
(4)参数太多,模型复杂度过高;
3、为什么说神经网络容易存在过拟合
如这篇文章所提到的(https://blog.csdn.net/shuzfan/article/details/78535758),使用BP神经网络(感知机)进行手写字符体分类。其输入为将一张28*28的图片reshape成784维的列向量,输出为一个10维的列向量(该向量中只有对应分类的坐标位置为1,其余9个为0)。向量中的每一个值当做一个输入神经元,因此一共有784个权重值,输出看做10个神经元,这样一个双层网络需要784*10个权重值w和10个偏执量b。
其中,i对应输入数据维度(网络的第一层),j对应输出数据的维度(网络的第二层),这里没有隐藏层。如图2所示:
![a47ae4f51c68337a4fe560cf1cf1209a.png](https://i-blog.csdnimg.cn/blog_migrate/472ba1b8a74f42a08f9c633b681335e4.jpeg)
可以发现在这个二层神经网络中,将图片的每个元素当作一个独立的变量,各自权重是相互独立变化的。首先,实际上图片中每个像素点与它周围的像素点是相互关联的(如果真的相互独立,我们见到的是一幅白噪声图像),这样一来参数过多必然导致计算复杂。但其关联函数我们没办法求得。回想一下人类如何识别数字的,‘1’就是一竖,‘7’就是横折竖,‘8’就是连着的两个圈…,人类其实是在做特征识别(feature recognition),具体哪个像素点的值并不重要。
虽然图片中像素点之间的内在联系,从目前的来机器无法识别。直观而简单的例子就是图一中红色×的点在拟合过程中,人可以根据其走势,给定特定的函数进行拟合,而在更高维,更复杂的数据点分布中,人类也无法直接指定特定的函数模型进行拟合,这往往也就是神经网络所能完成的事。尽管所给的每个数据存在偏差,但是大量的训练数据集往往可以抚平这个采样误差,从而拟合出一条较为准确的函数模型。
4、通过使用神经网络拟合函数来解释过拟合现象
这里举个简单的例子,使用如下的函数在[0,2]的定义域内生成了11个数据点。
在数据点不含噪声时,即使是单个数据,通过少量的训练次数和较高的学习率,我们可以很好的拟合出该函数,如图3(a)所示
![e458c68ca2c63bc429af7981843996d5.png](https://i-blog.csdnimg.cn/blog_migrate/78b5dea76f2e2413fc5e9efbfc874c35.jpeg)
此时,若加上随机噪声,即生成数据点的函数变为:
仍是1个训练数据,其拟合结果如图4
![b43a280e8a0be0e75dd4e56907137136.png](https://i-blog.csdnimg.cn/blog_migrate/cf6acd063453d7e5de96e54cfd09f16a.jpeg)
可以看出此时神经网络出现了严重的过拟合现象,参照上述过拟合出现的原因。现在,我们将训练数据增加到10个,其拟合结果如图5所示.
![da2b40b8e29801b35d831f22614b65ed.png](https://i-blog.csdnimg.cn/blog_migrate/7f0e5ac4c4c2806b84d4369c9835bbf9.jpeg)
由于我们的函数简单,尽管还能看到有些过拟合现象,但相对于只有1个训练数据的时候好很多了。
现在这里出现了两个问题:首先,还记得我们生产训练数据的函数是什么吗?它其实只有3个参数。但是由于我们设定的步长和定义域的关系,在神经网络中,拟合得到的直线参数数量变为了11*11(就双层神经网络来说)个。第二,如果我将定义域换成[2,4],那么训练出来模型是否还能适应新的定义域呢?这也被称为模型的泛化性。
![1e4ae6b5aa7e2c55e4cd6a1e4c4d175d.png](https://i-blog.csdnimg.cn/blog_migrate/4da49574db048bd20f52e4c6dbaf45b8.jpeg)
若定义域切换到[-2,0],其结果更加奇怪。
![e3d36f5c6c8937394fb4e9fa73493bda.png](https://i-blog.csdnimg.cn/blog_migrate/2821b358e7ead7748e358fa8f2341c93.jpeg)
在真实事件中,尽管我们的训练集合测试集不想这个例子中是完全不同的两个区间,但测试集出现在某些未知空间的时候,极有可能出现差错,这也是在神经网络模型中训练集和测试集之间准确率差距较大的原因。