您的位置:首页 > 其它

深度学习中的常见正则化问题

2017-10-13 15:28 330 查看

引言

机器学习算法不仅仅要在训练集上表现效果好,同样的,也要在测试集上表现良好。通常的,在训练集上的误差称为训练误差,而机器学习算法在测试集上的误差就是泛化误差。通常训练误差和泛化误差有这样一张图:



当训练误差非常小时,通常泛化误差会变很大,这就是所谓的“过拟合”现象。为了解决这种问题,就需要我们设计一些策略来减少泛化误差,当然可能会相应的增加训练误差,不过这些代价是值得的。下面我们就来深入讨论一下这些策略的实施和原理。(本章主要参考Goodfellow的《Deep Learning》一书第七章)

正文

深度学习网络中的正则化有不同的策略,首先我们先从机器学习中用的最多的参数范数惩罚策略开始说起:

一、参数范数惩罚

 L0、L1、L2范数是机器学习正则化方法中所见到的最多的范数了。它们的下标数字可是有玄机的呀!

范数表示形式含义
L0||ω||0向量中非0元素的个数
L1||ω||1向量中各个元素绝对值之和
L212||ω||2向量中各个元素的平方和的平方根
看到没有?这样一列出来是不是不同范数的含义和名称就能对应起来啦?

1.1 L2范数

 我们先来说说这L2范数,L2范数是可以是权重更加接近于原点的正则化项,这种惩罚通常被叫做权重衰减(weight decay),L2也被称为岭回归或者Tikhonov正则。为什么L2范数会对权值进行

衰减呢?我们通过研究正则化后的目标函数的梯度得出为何衰减以及怎样进行衰减?

 我们设目标函数为:

J~(w;X,y)=α2w⊤w+J(w;X,y)

那么很容易得出它的梯度:

∇wJ~(w;X,y)=αw+∇wJ(w;X,y)

那么我们利用梯度下降算法进行优化时,梯度按照以下的式子进行迭代:

w←w−ϵ(αw+∇wJ(w;X,y)

上式也就等同于

w←(1−ϵα)w−ϵ∇wJ(w;X,y)

可以看出,在每步执行梯度下降更新之前会将权重向量乘以一个常数因子。不过上述分析只是单步的分析,那么对于整个过程来说呢?

我们将未加正则化的目标函数进行Taylor展开:

J^(θ)=J(w∗)+12(w−w∗)H(w−w∗)

其中w∗=argminwJ(w)。

当J^(θ)求得梯度为∇wJ^(w)=H(w−w∗)

加上正则项后,我们来观察一下表达式会如何变化,我们使用w~来表示加上正则项的目标函数的最优点。

∇wJ~=H(w−w∗)+αw~=0→w~=(H+αI)−1Hw∗

当α趋近于0时,即正则化的惩罚系数越来越小时,w~当然是越来越接近于w∗。但是如果α增大了呢?我们就需要把上式利用特征值分解(EVD)来分析分析咯。将分解之后的H=QΛQ⊤代入到上式中,可以得到

w~=Q(Λ+αI)−1ΛQ⊤w∗

那么从上式我们就很容易的能看出来权重衰减是沿着Hessian矩阵的特征向量所定义的轴进行缩放w∗的,且缩放因子大小为λiλi+α。根据缩放因子的表达形式我们也可以看出当特征值较大时,正则化的影响较小;当特征值较小时,正则化的影响较大,分量几乎缩减到0。在这里特征值大说明该方向非常有助于减小目标函数的值,而特征值小说明该方向对减小目标函数值并没有起多大的作用。所以这个衰减因子的衰减效果就跟我们的认知一样啦!对减小目标函数越明显的方向正则化作用越小,对减小目标函数越不明显的方向利用正则化将其衰减掉!下面我们用一张图来更加明显的感受一下权重衰减因子的影响:



在这张图中,彩色线表示的是没有经过正则化的目标函数的等值线,黑色圆圈表示是L2正则化项的等值线(想想圆的公式)。其中w∗为未加正则化项的目标函数最优点,加了之后最优点就变成两个等值线第一次相交的那点w~啦!(原谅在图里打不出来那个小波浪线~)。我们再来看一下等值线的疏密,发现第一维(水平方向)的下降速度是比第二维(竖直方向)慢的,也就表示第一维的特征值比第二维小,那么正则化对第一维的限制会更大,将第一维特征更快的拉向0。

所以呢,L2正则化会缩减权重,并且对越不重要的特征权重衰减的越厉害哦,这样对一些在特征工程中提出来的没啥意义的特征就会进行正则化的限制,防止过拟合啦~。

1.2 L1范数

在上文中,我们已经知道L1正则化的含义即各个参数的绝对值之和。L1正则化有一个特点就是可以产生更加稀疏的解,而L2则不行。那么稀疏性是什么?有什么好处呢?

稀疏性指得是最优值中的一些参数为0。而在最优权重参数为0的分量就表明训练时该特征对模型的输出提供不了任何信息,是冗余的;在泛化时,反而会干扰正确输出。L1正则化可以用于特征选择。我们不能知其然不知其所以然,公式呈上:

设目标函数为:

J~(w;X,y)=α∥w∥1+J(w;X,y)

那么自然,得到它的梯度:

∇wJ~(w;X,y)=αsign(w)+∇wJ(w;X,y)

与L2范数类似,未加正则化项的目标函数梯度:

∇wJ^(w)=H(w−w∗)

在加L1正则化时我们进行简单的处理,因为与L2惩罚项不同,L1惩罚项的Hessian矩阵是一般的,对后续的处理相当不方便。将正则化项加入之后的二次近似分解式为:

J^(w;X,y)=J(w∗;X,y)+∑i[12Hi,i(wi−w∗i)2+α|wi|]

Hessian矩阵简化为这样是因为我们可以采用主成分分析(PCA)等数据预处理方法,将Hessian矩阵变为对角阵,这样表达式是不是方便很多呀?

可以求得每一维数据上最小化代价函数的值为:

wi=sign(w∗i)max{|w∗i|−αHi,i,0}(说实话,这个结果我没有亲自推过,哈哈)

那么一目了然,当权值较小时,直接会被强制等于0,;权值较大时,也会在那个方向上将wi减小αHi,i。

所以呢,L1正则化会使产生0解,而我们反观L2正则化,缩减因子只会减小wi的值,并不会将其变为0,因为w∗不为0。这就是L1具有稀疏性而L2不具有稀疏性的原因。

1.3 啰嗦一句

写到这里突然想起了之前在看陈天奇博士介绍关于XGBoost的Slides中,稍微提了一下Linear model中两个模型:Lasso regression 和 Ridge regression。Lasso 和Ridge regression利用的代价函数都是squre loss,不同的是Lasso regression采用的是L1正则,Ridge采用的是L2正则。下表更直观:

modelloss functionregularization
RidgesquareL2
LassosquareL1
Logisticlogistic lossL2
所以呢,Lasso Regression具有特征选择的功能,而Ridge Regression 和 Logistic Regression则没有。

现在看起来,L1和L2都有防止过拟合的效果,为何L2正则也如此popular呢?奥秘就在于(X⊤X+αI)−1上。在机器学习中很多的线性模型中,都很依赖于对矩阵X⊤X进行求逆运算。就拿以square loss为代价函数的线性模型为例,未加正则化的loss function为(Xw−y)⊤(Xw−y),很容易解得最小化目标函数的解w=(X⊤X)−1X⊤y。但是直接这样计算的话就会出现一个问题:如果(X⊤X)是奇异的怎么办?(奇异矩阵是指不满秩的矩阵,该矩阵没有逆矩阵,只有“广义逆矩阵”。产生原因是数据生成分布在一些方向上确实没有差异时或者因为相对于输入特征维数来说例子较少。)那么这种方法就game over了。得想办法呀!我们将L2正则化代入原loss function,可以求得更新之后的最优解w=(X⊤X+αI)−1X⊤y。我们看到了什么?(X⊤X)的求逆变成了(X⊤X+αI)的求逆,加上了这个αI就可以保证这个矩阵可以求逆了,是不是方便很多呀?

二、Dropout

Dropout是深层神经网络的实用Bagging方法。依然顾名思义,dropout就是“扔掉”一些神经元呗,怎么“扔”?我们将一些单元的输出乘以0,是不是就相当于删除了一个单元呢?当然我们不能把输出单元给“扔了”是不是,不能太不按规矩办事啊。从基础网络中去除非输出单元后形成的所有子网络构成了Dropout训练的集成。注意是所有!我们就先来看一张简单的图吧:



左图为原始网络,右图就是经过dropout之后所有子网络的集合。看来这里,可能有的同学会有这几个疑问:1.这张图右边子网络图中有些单元与输出单元都不直连了,这该咋办?2.如果原始网络的神经单元多一点,深度深一点,这岂不是要训练指数级个模型吗?还是内存有限的情况下?

先来回答第一个问题:我们现在看到的这张图单元太少啦,层太窄,所以得到的大部分网络没有输入单元或者没有从输入连接到输出的路径。当层较宽时,丢弃所有从输入到输出的可能路径的概率就变小了,对结果不是很影响啦。那么第二个问题呢,因为我们在实际中训练网络都是通过小批量样本进行训练的,并不是整个样本集一起训练,这样数据量太大很难跑的啊!这个为什么每次用小批量样本跑呢,这个问题是在深度模型中的优化这个范畴中,在这里先不展开讨论啦!而且在Dropout中,所有模型是共享参数的呀!每个模型是继承父神经网络参数的不同子集,所以计算量就大大减少啦!(参数共享也是一种正则化方法,只有参数的子集需要被存储在内存中,对于某些模型例如卷积神经网络来说,可以显著减少训练时占用的内存)

前面我们说过Dropout是给被删除的单元乘以0,那么Dropout的网络结构脑补一下,应该是这样的:



在原有单元的基础上,加上了掩码向量μ,μk的值为0说明该单元被删除,为1表示该单元保留。那么我们的模型代价就变为了J(θ,μ)。通常情况下一个输入单元被包括的概率为0.8,一个隐藏单元被包括的概率为0.5。确定了网络结构之后,我们用之前的训练方法进行学习更新就好啦。

一个关于Dropout的重要见解是:通过随机行为训练网络并平均多个随机决定进行预测,实现了一种参数共享的Bagging形式。

而Dropout训练和Bagging训练的不同之处呢,是在于Bagging训练所有模型都是独立的,而Dropout的模型都是共享参数的。

由于对Dropout理解不是很深,暂时只能说到这里啦,如有啥错误或者理解不到的地方,敬请指教。

PS:

深度学习中还有其它的正则化方法,暂时还没有接触,等以后有机会接触到了再来补充吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: