SuperZLW's Blog

我很笨,但是我不懒

0%

深度学习中的正则化

引入

与其它机器学习方法类似,DNN在训练过程中也会遇到过拟合的现象,尤其是当参数数量多于输入数据量时。为了防止过拟合现象,除了增加训练样本外,最常见的就是各种正则化方法,比如:数据增强、$L1$ 正则化、$L2$ 正则化、Dropout、DropConnect 和早停法(Early stopping)等。
下面对这些方法进行逐一介绍。

正则化方法

1. 数据增强

以图像处理为例,我们可以预先将图像做翻转拉伸,亮度调节,随机平移等操作,从而增大模型的训练数据集,增加模型的泛化能力。一般来说,现在在进行深度学习时数据增强已经成为一个必要的操作了。
但要注意的是,这种方法也不能用得太过分,一般来说用这种方法将数据集拓展到两倍已经很够了,如果再继续拓展,意义不大而且会浪费很多时间。
对于图像的数据增强方法可参见另一篇博文【图像的各种预处理方式】。

2. $L1 / L2$正则

L1 / L2正则原理相似,是在损失函数后面加个正则化项,以此对损失函数进行约束,感觉就是用拉格朗日解带约束的优化问题。现假设我们的损失函数为$L(y_i,\hat{y}_i)$。
这里先写三个概念:

  1. $L0$正则:向量中非零元素的个数,记作:$||W||_0$;\
  2. $L1$正则:向量中元素绝对值之和,记作:$||W||_1$;\
  3. $L2$正则:也就是模,记作:$||W||_2$

对于单个数据,假设其特征项$X$为:$x_0,x_1,…,x_N$,对应的权重项$W$为:$w_0,w_1,…,w_N$,为了防止过拟合,即是要减少数据的特征项数$N$,这里选择通过控制权重项$W$来控制特征项数$N$,为什么不通过特征项$X$呢?因为我们不确定下一个输入数据的特征项有多少,没法控制。也就是说,现在我们要做的就是控制权重项$W$的项数,使其数目最少。

2.1 $L1$正则

最开始用的其实是$L0$正则,也就是说我们要同时让损失函数$L(y_i,\hat{y}_i)$以及$||W||_0$正则项最小,即是求它们之和最小。

补充一点点东西

  1. 这里我们也就是要实现参数矩阵$W$稀疏,现在实现稀疏基本都是用$L1$正则,不用$L0$正则;\
  2. 参数矩阵稀疏通常是为了特征选择和易于解释方面的考虑

但由于$L0$正则不好计算,所以我们转而求$L1$正则,通过上面两概念可以知道,这两者在这里的计算意义是类似的,也就是最优凸近似(具体推导看不下去,有兴趣的参看Emmanuel Candes的paper)。
加上$L1$正则项后新的损失函数如下:有些地方会写得更具体,如下:反正意思都一样。这里的$\lambda$属于超参数,也就是我们要自己调的,越大正则化越明显。
由于损失函数变化了,梯度也会跟着变化,也就是会带来梯度更新方向的不同,之后的计算跟以前一样。

2.2 $L2$正则

$L2$是求模,也就是矩阵各元素求平方和再开方,采用$L2$正则的目的是让各参数趋近于$0$,也就是让他们最小化。($L1$则是让它们等于$0$,也就是稀疏)
那为什么让参数最小化可以有效防止过拟合呢?通过$L2$正则可以构造出一个参数都比较小的模型,一方面,对于那些实在不重要的特征,其权重会非常接近于0,但没有等于,影响已经很小了;另一方面,当参数很小时,既使数据变化比较大,其对结果的影响也不会很大,即模型的抗干扰能力会比较强。
其形式和$L1$基本一样,只要把后面的项改成$L2$正则即可。

2.3 $L1$与$L2$的总结比较

$L1$,$L2$在一些地方也写作LASSO和岭回归(在之前的【线性回归】也有提到一些)。
在各种防止过拟合的正则化中,$L2$防过拟合效果都要优于$L1$正则,所以与$L1$相比,正则化一般都是用$L2$,但当$L1$正则中的系数$\alpha$比较大时,也会得到系数极小的最优解,这时的$L1$也具有防止过拟合的作用。
$L1$正则由于可以实现稀疏矩阵,所以可以用来当作特征的选择。
有一点或许是需要注意的,在进行$L2$正则化中,我们把权重变得很小,所以在进入激活函数的时候值是在$0$附近的,以Sigmoid函数为例,当值在$0$附近时,其激活函数可看作线性,也就是说整个深度神经网络进行线性化近似了(不确定能不能用这种说法),这即是优点也是缺点,优点是我们把神经网络简化了,这也是实现这种正则化方法的基础;但,由于我们计算的是这种近似线性的东西,当我们要做非常复杂的决策时,这种正则化方法是不适用的。

3. Dropout

这个就简单写了,因为基本思路不难。Dropout的基本思路是随机去掉神经元,也就是在进行一批数据训练时,我们随机去掉一些神经元,既可以是隐藏层的,也可以是输入层的,然后进行训练,更新参数;然后在下一批数据进来的时候我们要先恢复回最原来的网络结构,再随机去掉一些神经元,更新参数,继续。。。。
需要注意的是,Dropout方法每次更新的都是同一套参数,也就是不会产生新的参数(这点跟Bagging不同,Bagging是每次训练都有自己单独的一套)。
因为Dropout将原始数据分批迭代,用这种正则化方法前提是训练样本足够大,否则会产生欠拟合现象。

4. DropConnect

DropConnect跟Dropout其实很像,Dropout是通过去掉一些神经元来防止过拟合的,而DropConnect则是通过随机选择权重的子集设为$0$,两种方法都能增强模型的泛化能力,都在模型中引入了稀疏性,但不同的是DropConnect是在权重中引入稀疏性而不是在层的输出向量中引入。

5. 早停法(Early stopping)

训练过神经网络的都知道,当训练次数过多时,模型容易发生过拟合现象,那么我们只要在过拟合之前停止训练就可以了。这就是早停法,也是深度学习中非常常用的一种方法,因为简单又有效。用这种方法我们就要时刻检测验证集的损失,当其开始持续上升时,就该停止训练了。

END\
先写到这,另外写到后面总觉得这篇有点问题,我好像把正则化和防止过拟合这两个概念混为一谈了?

参考网站来源

网站1:https://developer.aliyun.com/article/632944

网站2:https://cloud.tencent.com/developer/article/1486732

网站3:http://imgtec.eetrend.com/blog/2019/100045162.html

------ 本文结束------