深度学习中的常见正则化方法(Regularization)以及优化器中的WeightDecay参数详解

什么是正则化

“正则化"这个词听起来十分的高大上,但是我们可以简单的理解成为"约束”。

正则化是对参数的一种约束,在训练的过程中,特别是深度神经网络,本身网络层中的参数很多了、,如果每个参数的取值域也很大,那么会对训练造成一些麻烦(训练久之后,可能进入过拟合的状态),所以我们通过对参数的约束来显式的控制模型的复杂度,从而在一定程度上避免过拟合现象的产生。

所以正则化就是通过对网络层的参数加以限制,从而减少过拟合现象的产生。

一些常用的正则化方法

权重衰减

在每次更新参数的时候,设定一个

L1正则化

加入我们训练的网络的参数为w.则

深度学习中的常见正则化方法(Regularization)以及优化器中的WeightDecay参数详解
如果我们有一个分类问题,则根据分类产生的误差有一个classfication_loss.我们正则化有一个l1_loss.最后有一个loss_total.其中loss_total=classfication_loss+l1_loss.
当我们进行参数更新的时候,是使用w=w-lr*偏导数,是朝着loss减小的方向进行的。如果我们的w太大,会导致loss很大,所以相当于限定了w的范围,从而避免过拟合。

L2正则化

L2正则化,在深度学习中又称为权重衰减(weight decay)
表示为深度学习中的常见正则化方法(Regularization)以及优化器中的WeightDecay参数详解
注意

  • 现在的正则化一般均使用L2正则化,因为求导简单,方便优化
  • ||w||p 表示p-范数。 L2正则化这里表示2-范数的平方深度学习中的常见正则化方法(Regularization)以及优化器中的WeightDecay参数详解
    在pytorch中,我们使用torch.norm()来生成一个向量范数,我们也可以通过这个自定义我们的正则化项。
    pytorch求范数函数——torch.norm

Elastic网络正则化

Elastic网络正则化=L1正则化+L2正则化。

随机失活(dropout)

注意:

  • 只针对全连接层进行操作
  • 训练阶段和测试阶段的操作不同,每轮的训练部分神经元失活,测试的时候神经元是全部处于**态。

nn.Dropout( p):
按照概率p随机将神经元失活.目的是缓解神经元之间的隐形的协同适应(个人认为是多个神经元对某个特定特征起作用,会导致过拟合),从而降低模型复杂度
深度学习中的常见正则化方法(Regularization)以及优化器中的WeightDecay参数详解
dropout之后的网络是原网络的子网络,复杂度不比原网络,但由于每次的dropout的存在,每轮可以认为是训练了一个新的网络,最终的模型就是无数个自网络共同训练的结果,效果会好一些。

正则化方法的使用

pytorch使用权重衰减(Wight Decay)

须知:
标准SGD的情况下,通过对衰减系数做变换,可以将L2正则和Weight Decay看做一样。即weight_decay参数就是我们L2正则化的λ值。但是在Adam这种自适应学习率算法中两者并不等价,即L2正则!=Weight Decay

pytorch中的优化器是Weight Decay方法的,以Adam举例,我们查看Adam类源码
深度学习中的常见正则化方法(Regularization)以及优化器中的WeightDecay参数详解

pytorch中的L2正则(Weight Decay)有一些问题:

  • 一般的正则化是只正则化权重参数w的,但是L2会正则化偏置参数b。即pytorch中对self.weight和self.bias参数都进行了L2正则化,weight_decay是衰减系数。
  • 在标准SGD中,使用L2正则的时候,据正则化的公式,加入正则化后,loss会变原来大,比如weight_decay=1的loss为10,那么weight_decay=100时,loss输出应该也提高100倍左右。而采用torch.optim的优化器的方法,如果你依然采用loss_fun= nn.CrossEntropyLoss()进行计算loss,你会发现,不管你怎么改变weight_decay的大小,loss会跟之前没有加正则化的大小差不多。这是因为你的loss_fun损失函数没有把权重W的损失加上(这个正则化的过程本身是没有错的,参数更新的时候会带上l2_loss的参数一起求偏导进行更新,只是输出的loss函数没有带上权重w的损失而已)。

为了解决这两个问题,有位大神特定自定义了一个正则化的方法,(是L2正则,不是Weight Decay)。

pytorch自定义实现L2正则化
使用自定义的话,我们可以较为清楚的看到原本的损失和权重W的损失,从而计算总损失,利用总损失来进行反向传播,我们一般令原本损失:权重W的损失=3:1到5:1.之间。
正则化损失比例

下图: 在Adam中引入L2正则和Weight Decay的不同
深度学习中的常见正则化方法(Regularization)以及优化器中的WeightDecay参数详解

附录

[1] 深度学习: Regularization (正则化)
[2]L2正则=Weight Decay?