L1和L2正则化原理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yimingsilence/article/details/82027474

正则化是指在优化目标函数或代价函数是,在目标函数后面加上一个正则项。正则项通常有L1正则项和L2正则项。

1. L1正则 
L1正则是基于L1范数和项,即参数的绝对值和参数的积项,即: 

C=C0+λn∑w|w|C=C0+λn∑w|w|


其中C0代表原始的代价函数,n是样本的个数,λ就是正则项系数,权衡正则项与C0项的比重。后面那一项即为L1正则项。 
在计算梯度时,w的梯度变为: 

∂C∂w=∂C0∂w+λnsgn(w)∂C∂w=∂C0∂w+λnsgn(w)


其中,sgn是符号函数,那么便使用下式对参数进行更新: 

w:=w+α∂C0∂w+βλnsgn(w)w:=w+α∂C0∂w+βλnsgn(w)


对于有些模型,如线性回归中(L1正则线性回归即为Lasso回归),常数项b的更新方程不包括正则项,即: 

b:=b+α∂C0∂bb:=b+α∂C0∂b


其中,梯度下降算法中,α<0,β<0,而在梯度上升算法中则相反。

从上式可以看出,当w为正时,更新后w会变小;当w为负时,更新后w会变大;因此L1正则项是为了使得那些原先处于零(即|w|≈0)附近的参数w往零移动,使得部分参数为零,从而降低模型的复杂度(模型的复杂度由参数决定),从而防止过拟合,提高模型的泛化能力。 
其中,L1正则中有个问题,便是L1范数在0处不可导,即|w|在0处不可导,因此在w为0时,使用原来的未经正则化的更新方程来对w进行更新,即令sgn(0)=0,这样即: 

sgn(w)|w>0=1,sgn(w)|w<0=−1,sgn(w)|w=0=0sgn(w)|w>0=1,sgn(w)|w<0=−1,sgn(w)|w=0=0

2. L2正则项 
L2正则是基于L2范数,即在目标函数后面加上参数的L2范数和项,即参数的平方和与参数的积项,即: 

C=C0+λ2n∑ww2C=C0+λ2n∑ww2


其中C0代表原始的代价函数,n是样本的个数,与L1正则化项前面的参数不同的是,L2项的参数乘了12,是为了便于计算以及公式的美感性,因为平方项求导有个2,λ就是正则项系数,权衡正则项与C0项的比重。后面那一项即为L2正则项。 
L2正则化中则使用下式对模型参数进行更新: 

w:=w+α∂C0∂w+βλnww:=w+α∂C0∂w+βλnw


对于有些模型,如线性回归中(L2正则线性回归即为Ridge回归,岭回归),常数项b的更新方程不包括正则项,即: 

b:=b+α∂C0∂bb:=b+α∂C0∂b


其中,梯度下降算法中,α<0,β<0,而在梯度上升算法中则相反。 
从上式可以看出,L2正则项起到使得参数w变小加剧的效果,但是为什么可以防止过拟合呢?一个通俗的理解便是:更小的参数值w意味着模型的复杂度更低,对训练数据的拟合刚刚好(奥卡姆剃刀),不会过分拟合训练数据,从而使得不会过拟合,以提高模型的泛化能力。 
在这里需要提到的是,在对模型参数进行更新学习的时候,有两种更新方式,mini-batch (部分增量更新)与 full-batch(全增量更新),即在每一次更新学习的过程中(一次迭代,即一次epoch),在mini-batch中进行分批处理,先使用一部分样本进行更新,然后再使用一部分样本进行更新。直到所有样本都使用了,这次epoch的损失函数值则为所有mini batch的平均损失值。设每次mini batch中样本个数为m,那么参数的更新方程中的正则项要改成: 

λm∑w|w|λm∑w|w|

λ2m∑ww2λ2m∑ww2


而full-batch即每一次epoch中,使用全部的训练样本进行更新,那么每次的损失函数值即为全部样本的误差之和。更新方程不变。

猜你喜欢

转载自blog.csdn.net/yimingsilence/article/details/82027474