深度学习中的正则化(超详细分析)

回顾过拟合

上一篇博客《浅谈机器学习中的过拟合》对过拟合进行了比较详细的分析。过拟合是指学习时选择的模型所包含的参数过多,以至于出现这一模型对已知数据预测的很好,但对未知数据预测的很差的现象。过拟合的是由数据和模型两方面原因共同造成的,最直接防止过拟合的方法是无限增大训练集的大小,让训练集样本与真实数据分布尽可能接近,但这么做实在是不太现实,一是我们根本无从知晓数据真实分布是什么样,二来增加数据集是一个很花费人力物力的而且不能保证效果的方法。所以比较常用的办法是正则化。

什么是正则化

在《Deep Learning》书中定义正则化为“对学习算法的修改——旨在减少泛化误差而不是训练误差”,《统计学习方法》中认为正则化是选择模型的一种方法。我个人比较倾向于后一种解释。在上一篇博客也提到了,模型可以看成是一个高维函数,当模型参数确定了,这个函数也就确定了。对于不同的模型参数,能得到千千万万个不同的模型,我们将这所有的可能得到的模型称之为假设空间。理想情况下,我们希望真实数据的生成过程也包括在这个假设空间中,然后我们只需要通过训练将代表该生成过程的一组模型参数找出来即可。然而,真实数据的生成过程几乎肯定在假设空间之外,我们做的事无非是从已有的假设空间中通过训练找到一个泛化能力优秀的拟合模型(即尽量匹配真实数据生成过程)。正则化可以帮助我们从假设空间中找到这样一个模型:训练误差较低,而且模型复杂度也较小。所以正则化是一种选择模型的方法。

正则化的作用是选择经验风险与模型复杂度同时较小的模型。在实际深度学习场景中我们几乎总是会发现,最好的拟合模型(从最小化泛化误差的意义上)是一个适当正则化的大型模型。

几种常见的正则化策略

1. 参数范数惩罚

参数范数惩罚通过对目标函数 J 添加一个参数范数惩罚Ω(θ) ,限制模型的学习能力,我们常说的L1,L2正则化就是属于这种方法。我们将正则化欧的目标函数记为


其中 α ≥ 0 是权衡范数惩罚项 Ω 和标准目标函数 J( X ; θ ) 相对贡献的超参数,通过调整 α 的大小,可以获得不同的参数选择偏好。

需要注意的一点是,参数包括模型中每一层仿射变换的权重和偏置,我们通常只对权重做惩罚,而不对偏置做正则惩罚。因为精确拟合偏置所需的数据通常比权重少的多,正则化偏置参数可能会导致明显的欠拟合。
  
L2正则化

L2正则化也被称为权重衰减或岭回归,通过向目标函数添加一个 L2 范数平方项,使权重更加接近原点(《Deep Learning》中提到使权重接近任意特定点也有正则化效果,不过接正则化为0的情况更为常见)。

L2正则化形式如下:


下面来分析一下L2正则化能给优化过程带来什么样的效果。

为了简化公式,我们假设没有偏置参数,因此 θ 就是 w,模型的总目标函数为:


与之对应的梯度为


使用单步梯度下降更新权重,ϵ ≥ 0 为学习率:


换种写法就是


和没有L2正则化项的权重更新方式对比


不难发现,在加入L2正则项之后,每次更新梯度之前,都会先对权重向量进行收缩(乘一个小于1的常数因子),这也是为什么吧L2正则化成为权重衰减的原因了。

接下面我们在进一步分析这种单步权重衰减的方式会给整个训练过程带来什么样的影响。我们假设没有L2正则化的情况下使目标函数取得最小训练误差时的权重向量为 w∗ ,即w∗=argminwJ(w) 。利用泰勒级数对原始目标函数在 w = w∗ 邻域内做二次近似,有:


其中H为 w = w∗ 处计算的Hessian矩阵,因为 w∗ 为最优解,所以目标函数在该点的梯度为 0,所以该二次近似中没有一阶项。J(θ) 的梯度为:


根据式(3),加入正则化项的总的目标函数的梯度为


现在我们记加入L2正则项之后的最优解为,有:


解得:


因为H是实对称的,可以通过特征分解将 H 分解为一个对角矩阵 Λ 和一组特征向量的标准正交基 Q 。至此大功告成,从式(7)可以看出,权重衰减的效果是沿着由 H 的特征向量所对应的轴缩放 w∗ ,会根据缩放因子缩放与 H 第 i 个特征向量对齐的 w∗ 分量。

当 α = 0 时,γ = 1 ,即不加入L2正则项时,不会进行缩放;
当 α ≫ λ 时,γ ≈ 0 ,即 α 越大缩放的幅度越大,最后得到的权重 w 越接近 0 ;
当 α 确定,λi ≪ α 时,γ ≈ 0 ,对应的分量将会收缩到几乎为 0;
当 λi ≫ α 时,γ ≈ 1,对应的分量将会基本保持原来的大小。

从上面可以看出,每个分量的缩放程度是和特征值相关的。那么Hessian矩阵的特征值的意义是什么呢?Hessian矩阵的特征值就是形容其在该点附近特征向量方向的凹凸性,特征值越大,凸性越强。你可以把函数想想成一个小山坡,陡的那面是特征值大的方向,平缓的是特征值小的方向。而凸性和优化方法的收敛速度有关,比如梯度下降。如果正定Hessian矩阵的特征值都差不多,那么梯度下降的收敛速度越快,反之如果其特征值相差很大,那么收敛速度越慢。用大白话说就是,在能够显著减小目标函数方向上的参数会保留的相对完好,在无助于目标函数减小的方向上的参数会在训练中逐渐衰减掉。

关于这一点我是这么理解的,不知道对不对。目标函数下降快的方向对应于训练样本的通用的特征方向,而下降慢的方向对应于那些少数样本特有的特征方向。在上一篇博客中讲到,机器学习算法想要获得好的泛化性能,需要找到训练样本的“普遍规律”,即适用于大多数样本的特征。如果对该特征的响应进行调整,因为涉及到很多样本,所以目标函数的值变化会比较大。对于极少数样本特有的特征,即使改变其响应,对总的代价函数影响也是很微小的。所以反过来思考,如果我们改变某一特征的响应(响应大小由对应的权重分量大小控制),目标函数变化很大,那么我们就可以认为该特征是适用于大多数样本的“普遍规律”,所以倾向于保留它;反之是一些可能造成过拟合的无用特征,就倾向于减弱它对总体的影响。所以《Deep Learning》书中也提到:L2正则化能让学习算法“感知”到具有较高方差的输入 x ,因此与输出目标的协方差较小的特征的权重将会收缩。这里高方差的输入就是与其他样本差异性大的意思。


最后再来借助一张图更形象的看一下L2正则化的效果。坐标轴右上方是原始目标函数 J( w ) 的等高线,中心 w∗ 是没有正则化的原始最优解。图中虚线的同心圆是L2正则化项的等高线。回顾式(2),最小化 ( w ; X , y ) 需要让第一项和第二项都尽可能小。在 点,这两个竞争目标达到平衡。当正则化系数 α 越大, 越接近原点,α 越小, 越接近 w∗ 点。当 w∗ 沿水平方向移动时,目标函数值不会增加的太多,对应于特征值小的方向;当 w∗ 沿竖直方向移动时,目标函数值变化比较剧烈,对应于特征值大的方向。然后对比图中 和 w∗ 的位置,发现 在水平方向上移动距离比较大,竖直方向上比较小,这也印证了之前权重衰减的规律。

那么为什么说L2正则能过很好的防止过拟合呢?我觉得可以从两个角度来解释。

第一,通过引入L2正则,使模型参数偏好比较小的值,这其实也限制的函数空间的大小,有针对的减小了模型容量。为什么说是有针对性的呢?一般来说,大的参数值对应于波动剧烈的函数,小的参数值对应于比较平缓的参数,因为小参数对于输入的改变不会那么敏感。发生过拟合往往是因为顾及到了所有样本点,所以此时的函数波动会比较大,如下面右图所示。过拟合的模型往往具有比较大的参数,如果将这部分模型族从假设空间中剔除掉,那么是不是发生过拟合的可能就变小了?


第二,从推导权重衰减的过程中我们得到这样一个结论:L2正则化能让学习算法“感知”到具有较高方差的输入xx,因此与输出目标的协方差较小的特征的权重将会收缩。因此L2正则化总是倾向于对那些训练集样本共用的特征产生较大的响应,而减小对个别样本独有的特征产生的响应。因此L2正则有抑制那些“独有特征”的作用,这在一定程度上也减小了过拟合的风险。

L2正则化可通过假设权重ww的先验分布为高斯分布,由最大后验概率估计导出。

L1正则化

L1正则也被称为Lasso回归,形式如下:


现在按照分析L2正则的步骤分析一下L1正则的效果。(8)对应的梯度为:


我们立刻可以发现,L1的正则化效果与L2大不一样。具体来说,L1正则化对梯度的影响不再是线性地缩放每个 wi ,而是添加了一项与 sign( wi ) 同号的常数。这种形式的梯度不一定能得到直接算术解。

由于L1惩罚项在完全一般化的Hessian情况下,无法得到清晰的代数表达式。如果我们假设问题中的数据已被预处理(比如PCA),去除了输入特征之间的相关性,那么Hessian矩阵是对角的,即 H = diag( [ H1,1,…,Hn, n ] ) ,其中每个 Hi, i ≥ 0 。同式(5)一样对 J( θ ) 进行二次泰勒展开近似,并将L1正则化目标函数的二次近似分解成关于参数的求和:


下面形式的解析解可以最小化这近似代价函数:



相比L2正则化,L1正则化会产生更稀疏的解。此处的稀疏性是指最优值中的一些参数为 0。回顾式(7),在L2正则化中,如果 不为零,那么 也不为 0,这表明L2正则化不会使参数变得稀疏,而L1正则化有可能通过足够大的αα实现稀疏。L2是对那些与多数特征不同的分量进行衰减,而L1则是舍弃那些低于某个标准的特征。这种稀疏性广泛用于特征选择机制,可以从可用的特征子集中选择出有意义的特征,化简机器学习问题。

L1正则化可通过假设权重ww的先验分布为拉普拉斯分布,由最大后验概率估计导出.

除了L1,L2正则化,还有很多其他的正则化策略,因为相比L1和L2正则更容易理解,所以就不详细展开了。

2. 噪声注入

模型容易过拟合的原因之一就是没有太好的抗噪能力,如果输入数据稍微改变一点点,就可能得到完全不一样的结果。正所谓“你害怕什么,就应该勇敢去面对什么”。最简单提高网络抗噪能力的方法,就是在训练中加入随机噪声一起训练。我们可以在网络的不同位置加入噪声:输入层,隐藏层,输出层。

数据集增强在某种意义上也能看做是在输入层加入噪声,通过随机旋转、翻转,色彩变换,裁剪等操作人工扩充训练集大小。这样可以使得网络对于输入更加鲁棒。

大名鼎鼎的Dropout方法属于在隐藏层中加入噪声的一种方式。这个因为比较重要,待会儿单独提出来讲。

对于输出层有人可能会有疑问,要知道我们手中数据集并不可能100%保证标记正确,多多少少总会有一点错误率的。当然如果你能保证数据集没错误,不向输出层加入噪声也没关系。解决这个问题常见的办法是标签平滑,通过把确切的分类目标从0和1替换成 ϵ/k−1 和1−ϵ,正则化具有kk个输出的softmax函数的模型。标签平滑的优势是能够防止模型追求确切的概率而不能学习正确分类。

从优化过程的角度来看,对权重叠加方差极小噪声等价于对权重是假范数惩罚,可以被解释为关于权重的贝叶斯推断的随即实现(这一点我不是很理解)。换个角度就很结论就很明朗了,因为我们在权重中添加了一些随机扰动,这鼓励优化过程找到一个参数空间,该空间对微小参数变化引起的输出变化影像很小。将模型送入了一个对于微小变化不敏感的区域,不仅找到了最小值,还找到了一个宽扁的最小值区域。

3. 多任务学习

多任务学习通过合并几个任务中的样例(可以视为对参数是假的软约束)来提高泛化的一种方式。正如为的训练样本能够将模型参数推向具有更好泛化能力的值一样,当模型的一部分被多个额外的任务共享时,这部分将被约束为良好的值(如果共享合理),通常会带来更好的泛化能力。


从深度学习的观点看,底层的先验知识如下:能解释数据变化(在与之相关的不同任务中观察到)的因素中,某些因素是跨两个或更多任务共享的。

4. 提前终止

这个想必不需要多提,有过训练网络经历的朋友们都知道,模型过拟合一般是发生在训练次数过多的情况下,那么只要我们在过拟合之前停止训练即可。这也是深度学习中最常用的正则化形式,主要是因为它的有效性和简单性。提前终止需要验证集损失作为观测指标,当验证集损失开始持续上升时,这时就该停止训练过程了。

但提前终止为什么具有正则化效果呢?太简单的方法可能反而没有那么好解释。

我们看下面这张图:


可以认为提前终止可以将优化过程的参数空间限制在初始参数θ0θ0的小邻域内。我们还可以认为,在目标函数大曲率方向的参数比较小曲率方向的参数更早地学习到,这个是不是和L2正则的概念比较类似?实际上通过推导也可以证明,提前终止的轨迹结束于L2正则化目标的绩效点,在一定条件下,提前终止和L2正则化等价。相比L2正则化,提前终止还可以监控验证集误差,以便在空间特别好的点处停止训练。因此提前终止比权重衰减更有优势,提前终止能自动确定正则化的正确量,而权重衰减需要进行多个不同超参数值的训练实验。

5. 稀疏表示

前面提到的都是对参数直接进行惩罚,达到正则化的目的,另一种策略是惩罚网络中的激活单元,稀疏化激活单元,从而间接地对模型参数施加了复杂惩罚。


上面第一个表达式是对参数进行惩罚的例子,第二个是对激活函数进行惩罚的例子。含有隐藏单元的模型在本质上都能变得稀疏。

6. Dropout

在介绍Dropout之前,先提一下集成学习Bagging的概念,即通过结合几个模型降低泛化误差的技术。分别训练几个不同的模型,然后让所有模型表决测试样例的输出,也被称为模型平均。模型平均奏效的原因是不同的模型通常不会再测试集上产生完全相同的误差。

假设我们有 k 个回归模型,每个模型在每个例子上的误差为 ϵi ,这个误差服从均值为 0,方差且协方差 E [ ϵi ϵj ] = c 的多维正态分布。通过所有集成模型的平均预测所得误差是则该集成预测期的平方误差的期望为:


在误差完全相关即 c = v 的情况下,,模型平均对提升结果没有任何帮助;在误差完全不想关即 c = 0 的情况下,集成模型的误差期望减少到。用一句话说,平均上,集成至少与它任何成员表现的一样好,并且如果成员误差是独立的,集成将显著地比其成员表现的更好。神经网络中随机初始化的差异、小批量的随机选择、超参数的差异或不同输出的非确定性实现往往足以使得集成中的不同成员具有部分独立的误差。

弄明白模型平均的优点后,我们再来看看Dropout。表面上看,Dropout是每次训练过程中随机舍弃一些神经元之间的连接,如下图所示。


Dropout提供了一种廉价的Bagging集成近似,能够训练和评估指数级数量的神经网络。Dropout和Bagging训练不太一样,Bagging所有模型都是独立的,而Dropout是所有模型共享参数,每个模型集成父神经网络参数的不同子集,这中参数共享的方式使得在有限可用内存下表示指数级数量的模型变得可能。

隐藏单元经过Dropout训练后,它必须学习与不同采样神经元的合作,使得神经元具有更强的健壮性,并驱使神经元通过自身获取到有用的特征,而不是依赖其他神经元去纠正自身的错误。这可以看错对输入内容的信息高度智能化,自适应破坏的一种形式,而不是对输入原始值的破坏。

Dropout的另一个重要方面是噪声是乘性的。如果是固定规模的加性噪声,那么加了噪声 ϵ 的ReLU可以简单的学会使 hi 变得很大(使增加的噪声 ϵ 变得不显著)。乘性噪声就不允许这样病态的去解决噪声鲁棒问题。(这么说的话开始说到的噪声注入不都会遇到这个问题?不是很懂,mark一下)

总结

除了上面提到的额正则化策略,其实还有挺多,比如CNN中的参数共享,对抗训练等。不过从本质上看,正则化策略要做的事情其实是一样的,就是将先验信息以不同方式加入到网络中去,达到限制模型有效容量的效果,从而减小过拟合的风险。

版权声明:本文为CSDN博主「Maples丶丶」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_16137569/article/details/81584165

推荐阅读