深层神经网络——过拟合问题

时间:2022-03-10 09:14:04

损失函数是用于优化训练数据。然而真实的应用中想要的并不是让模型尽量模拟训练数据的行为,而是希望通过训练出来的模型对未知的数据给予判断。模型在训练数据上的表现并不一定代表了它在未知数据上的表现。
过拟合就是导致这个差距的重要因素,所谓过拟合就是当一个模型郭伟复杂之后,它可以很好的“记忆”每一个训练数据中随机噪音的部分而忘记了要去“学习”训练数据中的通用趋势。
比较极端的例子就是,当模型中的参数比训练数据总和还要多的时候,那么只要训练数据不冲突,这个模型完全可以记住所有训练数据的结果从而使损失函数为0.直观的说就是包含n个变量的n个等式方程组,当方程组不冲突的时候,这个方程组可以通过数学的方法求解。然而过拟合训练数据中的随机噪音虽然可以得到非常小的损失函数,但是对于未知数据可能无法做出可靠的判断。
深层神经网络——过拟合问题
在第一种情况下,由于模型过于简单,无法很好的刻画问题的趋势、
第二种模型是比较合理的,它既不会过于关注训练数据中的噪音又能比较好的刻画问题的整体趋势。
第三个模型就是过拟合了,虽然第三个模型完美地划分了训练数据的形状,但是这样的划分并不能很好的对未知数据做出判断,因为它过度拟合了训练数据中的噪音而忽视了问题的整体规律。

为了避免过拟合,一个非常常用的方法就是正则化(regularization)。正则化的思想就是在损失函数中加入刻画模型复杂程度的指标。假设用于刻画模型在训练数据上表现的损失函数为J(θ),那么在优化时不是直接优化J(θ),而是优化J(θ)+λR(w)。其中R(w)刻画的是模型的复杂程度,而λ表示模型复杂损失在总损失中的比例。注意这里的θ表示的是一个神经网络中所有的参数,它包括边上的权重w和偏置项b。一般来说模型复杂度只由权重w决定。常用刻画模型复杂度的函数R(w)有两种,一种是L1正则化,计算公式为:
深层神经网络——过拟合问题
另一种是L2正则化,计算公式为:
深层神经网络——过拟合问题
噪声:一个测量变量中的随机错误或偏差,可以理解为误差,实验中总会出意外,产生的错误数据。

无论是哪一种正则啊方式,基本思想都是希望通过限制权重大小,使得模型不能任意拟合训练数据中的随机噪音。但是这两种正则化方式也有很大区别。首先,L1正则化会让参数变得更稀疏,而L2正则化不会。所谓参数变得更稀疏是指会有更多的参数变为0,这样可以达到类似特征选取的功能。之所以L2正则化不会让参数变得稀疏的原因是当参数很小时,比如0.001,这个参数的平方基本上就可以忽略了,于是模型不会进一步将这个参数调为0,。其次,L1正则化的计算公式不可导,而L2正则化的公式可导。因为在优化时需要计算损失函数的偏导数,所以对含有L2正则化损失函数的优化要更加简洁。优化L1正则化的损失函数要更加复杂。而且优化方法有很多种,在实践中,可以把L1正则化和;L2正则化同时使用:
深层神经网络——过拟合问题
Tensorflow是可以自定义损失函数的,所以Tensorflow自然也可以优化带正则化的损失函数。以下是一个带L2正则化的损失函数:
深层神经网络——过拟合问题
loss定义为损失函数,它由两个部分组成,第一部分是均方误差损失函数,它刻画了模型在训练数据上的表现。第二个部分是正则化,它防止模型过度模拟训练数据中的随机噪音。lamba参数表示正则化项的权重,也就是公式J(θ)+λR(w)中的λ。w为需要计算正则化损失的参数,这个函数可以计算一个给定参数的L2正则化项的值。类似的,tf.contrib.layers.l1_regularizer了可以计算L1正则化的值。
以下为L1正则化样例:
深层神经网络——过拟合问题
注意:Tensorflow会将L2正则化损失值除以2使得求导结果更加简洁!
在简单的神经网络中,这样的方式就可以很好计算带正则化的损失函数。但当神经网络的参数增多之后,这样的方式首先可能导致损失函数loss的定义很长,可读性差且容易出错。更主要的是,当网络结构复杂之后定义网络结构的部分和计算损失函数的部分可能不在同一个函数中,这样通过变量这种方式计算损失函数就不方便了。
为了解决这个问题,可以使用tensorflow中提供的集合(collection)。集合可以在一个计算图(tf.Graph)中保存一组实体(如张量)。
以下是通过集合计算一个五层神经网络带L2正则化的损失函数的计算方法:
深层神经网络——过拟合问题
深层神经网络——过拟合问题
深层神经网络——过拟合问题
以上代码给出的是一个只有五层的全连接网络,在更加复杂的网络结构中,使用这样的方式计算损失函数可以大大增强代码可读性。

tf.add_to_collection:把变量放入一个集合,把很多变量变成一个列表
tf.get_collection:从一个结合中取出全部变量,是一个列表
tf.add_n:把一个列表的东西都依次加起来
向collection中存数据
tf.Graph.add_to_collection(name, value)
Stores value in the collection with the given name.
Note that collections are not sets, so it is possible to add a value to a collection
several times.
注意,一个‘name’下,可以存很多值; add_to_collection(“haha”, [a,b]),这种情况下
tf.get_collection(“haha”)获得的是 [[a,b]], 并不是[a,b]
tf.add_to_collection(name, value)
这个和上面函数功能上没有区别,区别是,这个函数是给默认图使用的

以下来自知乎

凸优化、正则化解释:
深层神经网络——过拟合问题
f(x)为什么用多项式的方式去模拟?
看看高等数学当中的泰勒展开式就行了,任何函数都可以用多项式的方式去趋近,e^{x} ,log x,lnx, 1/x等等都可以去趋近,而不同的函数曲线其实就是这些基础函数的组合,理所当然也可以用多项式去趋近,好了,这个就先解释到这里了。
接下来咱们看一下拟合的基础概念。
首先,用一个例子来理解什么是过拟合,假设我们要根据特征分类{男人X,女人O}。
请看下面三幅图,x1、x2、x3;
深层神经网络——过拟合问题
这三幅图很容易理解:
1、 图x1明显分类的有点欠缺,有很多的“男人”被分类成了“女人”。
2、 图x2虽然有两个点分类错误,但是能够理解,毕竟现实世界有噪音干扰,比如有些人男人留长发、化妆、人妖等等。
3、 图x3分类全部是正确的,但是看着这副图片,明显觉得过了,连人妖都区分的出来,可想而知,学习的时候需要更多的参数项,甚至将生殖器官的形状、喉结的大小、有没有胡须特征等都作为特征取用了,总而言之f(x)多项式的N特别的大,因为需要提供的特征多,或者提供的测试用例中我们使用到的特征非常多(一般而言,机器学习的过程中,很多特征是可以被丢弃掉的)。
好了,总结一下三幅图:x1我们称之为【欠拟合】x2我们称之为【分类正拟合】,随便取的名字,反正就是容错情况下刚好的意思。x3我们称之为【过拟合】,这种情况是我们不希望出现的状况,为什么呢?很简单,它的分类只是适合于自己这个测试用例,对需要分类的真实样本而言,实用性可想而知的低。
知道了过拟合是怎么回事之后,我们来看一下如何去规避这种风险。先不管什么书上说的、老师讲的、经验之说之类的文言文。咱们就站在第一次去接触这种分类模型的角度去看待这个问题,发散一下思维,我们应该如何去防止过拟合?
显而易见,我们应该从【过拟合】出现的特征去判别,才能规避吧?
显而易见,我们应该、而且只能去看【过拟合】的f(x)形式吧?
显而易见,我们从【过拟合】的图形可以看出f(x)的涉及到的特征项一定很多吧,即x_{0},x_{1},x_{2},x_{3}….x_{N} 等等很多吧?
显而易见,N很大的时候,w_{0} ,w_{1} ,w_{2} ,w_{3} ,…w_{N} 是等数量增长的吧?
显而易见,w系数都是学习来的吧?
So,现在知道这些信息之后,如何去防止过拟合,我们首先想到的就是控制N的数量吧,即让N最小化吧,而让N最小化,其实就是让W向量中项的个数最小化吧?
其中,W=(w_{0} ,w_{1} ,w_{2} ,w_{3} ,…w_{N} )
可能有人会问,为什么是考虑W,而不是考虑X?很简单,你不知道下一个样本想x输入的是什么,所以你怎么知道如何去考虑x呢?相对而言,在下一次输入x^{(k)} ,即第k个样本之前,我们已经根据x^{(1)} ,x^{(2)} ,….x^{(k-1)} 次测试样本的输入,计算(学习)出了W.就是这么个道理,很简单。
ok,any way.回到上面的思维导图的位置,我们再来思考,如何求解“让W向量中项的个数最小化”这个问题,学过数学的人是不是看到这个问题有点感觉?对,没错,这就是0范数的概念!什么是范数,我在这里只是给出个0-2范数定义:
0范数,向量中非零元素的个数。
1范数,为绝对值之和。
2范数,就是通常意义上的模。
貌似有人又会问,上面不是说求解“让W向量中项的个数最小化”吗?怎么与0范数的定义有点不一样,一句话,向量中0元素,对应的x样本中的项我们是不需要考虑的,可以砍掉。因为0 x_{i} 没有啥意义,说明x_{i} 项没有任何权重。so,一个意思啦。
“让W向量中项的个数最小化” = |W|
所以为了防止过拟合,咱们除了需要公式中f(x)的相加项最小,我们还要让正则化r(d)=|W|最小,所以,为了同时满足两项都最小化,我们可以让f(x)和r(d)都最小。
深层神经网络——过拟合问题
深层神经网络——过拟合问题

正则化就是对最小化经验误差函数上加约束,这样的约束可以解释为先验知识(正则化参数等价于对参数引入先验分布)。约束有引导作用,在优化误差函数的时候倾向于选择满足约束的梯度减少的方向,使最终的解倾向于符合先验知识(如一般的l-norm先验,表示原问题更可能是比较简单的,这样的优化倾向于产生参数值量级小的解,一般对应于稀疏参数的平滑解)。同时正则化,解决了逆问题的不适定性,产生的解是存在,唯一同时也依赖于数据的,噪声对不适定的影响就弱,解就不会过拟合,而且如果先验(正则化)合适,则解就倾向于是符合真解(更不会过拟合了),即使训练集中彼此间不相关的样本数很少。
正则化项即罚函数,该项对模型向量进行“惩罚”,从而避免单纯最小二乘问题的过拟合问题。正则化项本质上是一种先验信息,整个最优化问题从贝叶斯观点来看是一种贝叶斯最大后验估计,其中正则化项对应后验估计中的先验信息,损失函数对应后验估计中的似然函数,两者的乘积即对应贝叶斯最大后验估计的形式,如果你将这个贝叶斯最大后验估计的形式取对数,即进行极大似然估计,你就会发现问题立马变成了损失函数+正则化项的最优化问题形式。

#