基础不牢,地动山摇。
正则化(Regularization)在深度学习出现之前就已经应用了数十年,它的主要目的是限制模型(如神经网络、线性回归)的学习能力,以防止模型出现过拟合现象。那什么是模型的过拟合,为什么要防止过拟合?正则化又是怎么实现的呢?本文将会循序渐进地回答这些问题,希望能对大家有所帮助。
1.1 训练模型的目的(本节参考《机器学习》西瓜书)
首先介绍几个术语:
① 错误率:分类错误的样本数 / 总样本数;
② 准确率:分类正确的样本数 / 总样本数;显然:准确率 = 1 - 错误率;
③ 误差:分类结果与真实结果之间的差异;
④ 训练误差(或者叫经验误差):模型在训练集上的误差;
⑤ 泛化误差:模型在新样本的误差;
很显然,我们训练模型的目的是:希望得到泛化误差尽可能小的模型。然而我们事先并不知道新样本是什么样,我们实际能做的只有努力地最小化经验误差(训练误差)。换句话说,我们希望模型能够从训练样本中尽可能学到适用于所有潜在样本的“普遍规律”,这样才能在遇到新样本时做出正确的判别。
1.2 模型过拟合
然而很多时候,模型无法满足我们的期望,过拟合就是其中一种情况。所谓过拟合,是指模型把训练样本学得“太好了”,很可能已经把训练样本自身的一些特点当做了所有潜在样本都具有的一般性质,这样就会导致泛化能力的下降,在训练样本上效果非常好,但是在新样本上效果不佳。我们可以根据过拟合的定义猜测一下过拟合发生的原因,总结出以下两个原因:
① 训练数据过少;
② 模型复杂度太大,学习能力过强
针对第一个原因,我们可以通过增加训练数据来解决;针对第二个原因,我们可以通过限制模型学习能力的方法来解决,常用的方法有:Dropout、批规范化、正则化。本文主要讨论正则化方法。
2.1 正则化和
正则化(本节参考《深度学习一起玩转TensorLayer》)
所谓正则化,就是在损失函数的基础上再添加一个参数惩罚项
,以限制模型的学习能力。正则化后的损失函数为:
其中,是为了控制参数惩罚项对损失函数所起的作用。网络的任务变为最小化正则化后的损失函数。
让我们用一个简单的例子来理解正则化,假设真实模型是一个最简单的多项式函数:
;
它可以表示数据对应的真实输出。现在我们人为地构造一个模型:
;
则可以表示模型的输出值,
和
是模型的参数,其中
代表权重,
代表偏置。
假设训练模型时使用的损失函数为:
模型的训练过程其实是一个通过修改参数和
来减小损失函数
的过程。在减小损失函数的迭代过程中,非线性越强的参数会被修改得越多(比如在
旁边的
)。这是因为使用非线性强的参数可以使模型变得更加复杂,更加曲折,也就能更好地拟合上训练集中的每个点。但我们刚刚也说过了,我们并不希望模型完美地拟合上所有的训练样本,因为这样容易产生过拟合。换句话说,我们希望模型不要过多地“青睐”那些非线性强的参数。顺理成章地,我们想到了在损失函数中添加一个含有参数的惩罚项来控制参数的影响力,这就引出了正则化。常用
正则化和
正则化。这两种正则化后的损失函数分别如下:
正则化后的损失函数(
为参数惩罚项的系数):
由上式可知,正则化在原损失函数的基础上加上了模型权重的绝对值之和,
正则化在原损失函数的基础上加上了模型权重的平方和。细心的小伙伴可能已经发现了,附加的参数惩罚项中是不含有偏置
的,只对权重
进行计算!书上的解释是:不对偏置进行正则化并不会带来大的影响,但是如果对偏置进行正则化,反而可能会引起显著的欠拟合。
2.2 正则化和
正则化的区别
两种正则化分别在原始损失函数的基础上加上了权重绝对值之和和权重的平方和,那么除了这个显而易见的区别,正则化和
正则化还有没有更深刻的区别呢?让我们回归到网络的训练,无论如何构造损失函数,我们都是要对其求偏导,将梯度反向传回,更新参数。下面我们对两种正则化后的损失函数求偏导,计算更新后的参数。为了叙述的方便,我们沿用2.1中的例子,假设模型只含有3个权重,
那么正则化后的损失函数为:
在每次更新参数时,计算过程为:
其中是模型的学习率,上式的最后一项是一个常数,绝对值为
,
是符号函数,不知道它作用的小伙伴可以自行百度哦。当
时,参数更新时减去
;当
时,参数更新时加上
。这就带来了一个问题,有可能迭代若干次,如此这般加加减减之后,这个参数变成0了。这就代表,这个参数对应的变量(或者说特征)不会对结果有任何影响。由此可见,
正则化可以使输入变量(特征)变得稀疏,能起到特征选择的作用(Lasso特征选择)。
正则化后的损失函数为:
在每次更新参数时,计算过程为:
其中是模型的学习率,由上式可以看出,更新参数时,会对特征系数进行一个缩放,而非减去一个固定值,这样做会让参数趋向于变小而不会变成0。所以
正则化能防止过拟合,但是不会起到特征选择的作用。
参考:
https://www.jianshu.com/p/569efedf6985