神经网络的正则化(理论篇)|机器学习你会遇到的“坑”
数学准备
- 两个独立的随便变量会有:
并可以推导出协方差为零,而协方差是线性相关性的度量。
- 期望值是线性函数,满足齐次可加性:
- 一个高斯分布
- 期望值就是其均值,即一阶原点矩为均值。这一点不需要推公式,我们可以理解为,期望是随机变量的“中心”,而高斯分布是对称的,中心就是均值。
在统计学习的课程中,我们已经熟知过拟合的概念以及两种基本的正则化手段,其中
正则化相较于
正则化,不仅具备权重衰减的优势,而且还可以将权重稀疏化。正则化的出发点在于,一个模型内部参数的数量和大小与模型容量(模型复杂度)密切相关,在《过拟合问题》中,我曾经用线性回归的图像和解析解举例来说明:权重系数大的模型可能对应着过拟合。
但在深度学习中,模型容量的问题更好理解,我们把整个神经网络看作一个巨大的机器,内部是个黑盒,我们只知道机器上有若干旋钮,通过这些旋钮可以实现不同的输出,参数就是旋钮,参数的大小表示旋钮的最大取值,显然旋钮越多,旋钮的可调节范围越大,这个机器就越复杂。
因为过拟合的存在,我们自然会想到,要为任务挑选携带正确参数个数的模型,但这样简单的想法在实践上并不可行,我们不可能对参数的数量进行尝试去适应相应的任务(当然,调参侠可能会选择此做法,但我并不建议这样),相反,在实践中我们会发现性能最好的模型是大容量加上一定程度的正则化。
基于改变参数的数量和大小为基础,我们在此文中主要探讨深度学习中的几种正则化手段,并证明其中一些方法与传统正则化方法的等价性,我们将不会对大家喜闻乐见的
和
正则化做详细讲解,并非是他们不重要,而是太过常见。首先需要明确的是,在深度学习中,参数包括权重系数和偏置,我们进行操作的参数往往指的是权重系数,类比于线性回归的斜率和截距,优化函数添加的惩罚项也不包括截距。
添加噪声
提高模型的泛化能力,我们首先会想到对数据进行增强,对输入添加噪声是数据增强的方式之一,噪声如何提高泛化能力的呢?我们以简单线性回归模型为例,在输入添加噪声,整个模型就会变成:
假设噪声项服从一个正态分布
,那么我们的均方误差的期望值就会变为:
因为噪声独立于其他项,所以中间可以拆为两项期望值的乘积,又因为线性回归假设了以target(目标)作为均值,所以中间一项为零,最后一项可以看作对正态分布的线性变换,最后的结果如下:
我们得到了一个
正则化的形式,向模型的输入添加噪声本质上是和
正则化等价的。
提前终止
准确的说,提前终止的技术来源于寻找超参数办法。一般的,无论是统计学习还是深度学习中,我们在设置超参数的最佳值,最简单(最粗暴)都是通过先设定超参数的范围,然后依次训练模型,选取能使得模型泛化能力的超参数的之作为最佳值。
我们往往会在训练模型的过程中发现,在迭代时,训练误差一般都会减小,而测试误差则是先减小后增大,形成一个U形曲线,我们称之为”过度训练“。
如图,红线表示测试误差,蓝线表示训练误差,测试误差表现为一个U形曲线。
如果我们在测试误差不再下降的时候,就停止训练,就会得到泛化误差最小的模型。事实上,提前终止也可以理解为一种正则化手段。因为训练的过程可以看作是在参数空间逐步靠近最佳参数点,而提前终止在路径选取了一个点就中断了训练。
如图,图为L2正则化的二维参数空间示意,我们最终选择的点并不是使得Loss最小的点,而是选取了惩罚项与Loss函数的交点,而这个交点很可能就在迭代的路径上,提前终止就有可能到达了类似的点,就中断了训练。
参数共享
当我们想从一个任务迁移到另一个类似的任务当中去,模型在前一个任务中表现的很不错,而我们也假设了任务之间存在相关性,我们就可以自然的认为模型的参数应该也大致接近,我们就可以将惩罚项变为:
其中
分别表示两个任务中模型的参数,其中一个是已知的,我们将其叫做”参数绑定“。这样的形式实际上与我们的
正则化是等价的,
正则化是将参数推向零,强烈的惩罚距离原点过远的参数,而参数绑定则是强烈惩罚远离另一个任务中训练得到的参数。
参数绑定的更为灵活的方式是参数共享,强迫使得某一些参数具备相同的值,而其他的参数不做要求,是对部分参数进行正则化的极端版本。比如在卷积神经网络用于图片分类的任务中,同一个卷积核作用在图像的不同区域,而卷积核的参数却在不同区域上是相同的。
如图,中间的kernel matrix就是我们的卷积核,它在图像上进行滑动时,只用了一组参数,我们就可以说在图像的不同区域,卷积的参数是相同的。
Dropout
我们曾在《常见输出单元》中介绍ReLU”单侧抑制“的好处,就是指当输入小于零神经元的输出为零,神经元关闭使得参数的数量减少。Dropout也是一种”关闭神经元“的办法,使得某些神经元输出为零,与之相连的权重边也就不再重要,以达到减小模型复杂度的目的。
如图,左图的神经网络经过一次dropout就会变为右图的子网络,我们并不是通过直接删除神经元的办法来减小规模,而是让其输出为零,间接的达到删除的目的。
除此之外,它在训练中采用了Bagging的方法,进一步的降低模型的方差,达到减弱过拟合的目的。它的具体训练过程如下:
- 与Bagging学习类似,从训练集有放回的采样出不同的子集。
- 将每个隐藏单元的输出分别乘以伯努利分布
- ,即变为:
- 。
- 此时我们得到了一个子网络,正常训练该网络。
- 重复以上过程,并且将上次参加训练,但这次并未参加训练的参数值”冻结“,将上次参加训练,这次也参加训练的参数正常使用。
我们可以分别从两个角度去理解Dropout:
- 它与Bagging集成类似,将弱学习器的学习结果进行处理来得到最后的结果。我们选择采用伯努利分布去控制隐藏单元的参与,实际上就是在构建弱学习器。但是不同点在于,Bagging集成的弱学习器是相互独立的,而Dropout的第四步告诉我们,在进行重复的过程中,所有的模型都是参数共享的。
- 它与权值加噪声类似,我们对于每一个参数乘以伯努利分布
- ,一般的我们会将隐藏单元的概率设为0.5,因为此时伯努利分布的信息熵最大,子网络的可能状态数也就最多。
我们将这两种理解结合在一起,就可以发现,子网络的可能状态数是指数级的,但我们根本不可能将所有的子网络都训练完成,我们可能只会训练一部分,而因为第四步的参数共享,可以使得大部分的神经元拥有很不错的参数。
读芯君开扒
课堂TIPS
• 添加噪声的方法,不一定要在加在输入上,还可以加在权重和输出上。
• 提前终止需要观察泛化误差,就意味着不能拿全部的数据来训练。为了更好的利用数据,工程上我们需要训练两遍,先使用部分数据进行提前终止确定步数,然后再利用所有的数据进行训练。
• 我们训练完成添加dropout办法的神经网络之后,在测试阶段不同于普通的bagging集成,而是会采用一种叫做权重比例近似推断的方法去获得测试中的输出。
作者:唐僧不用海飞丝
如需转载,请后台留言,遵守转载规范