Distiller:正则化
Posted Yan_Joy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Distiller:正则化相关的知识,希望对你有一定的参考价值。
正则化
在Deep Learning1书中,是这么定义正则化的:
“any modification we make to a learning algorithm that is intended to reduce its generalization error, but not its training error.”
PyTorch的 优化器使用 l 2 l_2 l2参数正则化去限制模型大小(即减小参数方差)。
总的来说,我们可以把它写为:
l
o
s
s
(
W
;
x
;
y
)
=
l
o
s
s
D
(
W
;
x
;
y
)
+
λ
R
R
(
W
)
loss(W;x;y) = loss_D(W;x;y) + \\lambda_R R(W)
loss(W;x;y)=lossD(W;x;y)+λRR(W)
特别的:
l
o
s
s
(
W
;
x
;
y
)
=
l
o
s
s
D
(
W
;
x
;
y
)
+
λ
R
∥
W
∥
2
2
loss(W;x;y) = loss_D(W;x;y) + \\lambda_R \\lVert W \\rVert_2^2
loss(W;x;y)=lossD(W;x;y)+λR∥W∥22
其中
W
W
W是网络中所有权重元素的集合(即这是model.parameters()
),
l
o
s
s
(
W
;
x
;
y
)
loss(W;x;y)
loss(W;x;y)是总训练损失,并且
l
o
s
s
D
(
W
)
loss_D(W)
lossD(W)是数据损失(即目标函数的误差,也称为损失函数,或者在Distiller样本图像分类器压缩中的criterion
)。
optimizer = optim.SGD(model.parameters(), lr = 0.01, momentum=0.9, weight_decay=0.0001)
criterion = nn.CrossEntropyLoss()
...
for input, target in dataset:
optimizer.zero_grad()
output = model(input)
loss = criterion(output, target)
loss.backward()
optimizer.step()
λ
R
\\lambda_R
λR是一个被称为正则强度的标量,它平衡了数据误差和正则误差。在PyTorch中是 weight_decay
参数。
∥
W
∥
2
2
\\lVert W \\rVert_2^2
∥W∥22是
W
W
W的
l
2
l_2
l2范数平方,被称为幅度 (magnitude),表示张量大小。
∥
W
∥
2
2
=
∑
l
=
1
L
∑
i
=
1
n
∣
w
l
,
i
∣
2
    
w
h
e
r
e
  
n
=
t
o
r
c
h
.
n
u
m
e
l
(
w
l
)
\\lVert W \\rVert_2^2 = \\sum_l=1^L \\sum_i=1^n |w_l,i|^2 \\;\\;where \\;n = torch.numel(w_l)
∥W∥22=l=1∑Li=1∑n∣wl,i∣2wheren=torch.numel(wl)
L L L是网络中的层数。
在深度学习中解释了 l 2 l_2 l2 范数和平方 l 2 l_2 l2范数之间的定性差异。
稀疏与正则
我们提到正则化,因为正则化和一些DNN稀疏诱导方法之间存在有趣的相互作用。
在Dense-Sparse-Dense (DSD)2中使用剪枝作为正则化来提升模型准确率:
“Sparsity is a powerful form of regularization. Our intuition is that, once the network arrives at a local minimum given the sparsity constraint, relaxing the constraint gives the network more freedom to escape the saddle point and arrive at a higher-accuracy local minimum.”
正规化也可用于诱导稀疏性。 为了诱导元素稀疏性,我们可以使用 l 1 l_1 l1范数, ∥ W ∥ 1 \\lVert W \\rVert_1 ∥W∥1。
∥ W ∥ 1 = l 1 ( W ) = ∑ i = 1 ∣ W ∣ ∣ w i ∣ \\lVert W \\rVert_1 = l_1(W) = \\sum_i=1^|W| |w_i| ∥W∥1=l1(W)=i=1∑∣W∣∣wi∣
l 2 l_2 l2范数正则化通过减小大的参数来避免过度拟合并提高模型的精度,但它不会强制这些参数为绝对零。 l 1 l_1 l1-范数正则化将一些参数元素设置为零,因此在使模型更简单的同时限制了模型的容量。 这有时被称为特征选择,并为我们提供了修剪的另一种解释。
Distiller的一个Jupyter文件解释了 l 1 l_1 l1-范数正则化器如何引起稀疏性,以及它如何与 l 2 l_2 l2-范数正则化相互作用。
如果我们将weight_decay
配置为零并使用
l
1
l_1
l1-范数正则化,那么我们有:
l
o
s
s
(
W
;
x
;
y
)
=
l
o
s
s
D
(
W
;
x
;
y
)
+
λ
R
∥
W
∥
1
loss(W;x;y) = loss_D(W;x;y) + \\lambda_R \\lVert W \\rVert_1
loss(W;x;y)=lossD(W;x;y)+λR∥W∥1
如果同时使用两个正则化,则有:
l
o
s
s
(
W
;
x
;
y
)
=
l
o
s
s
D
(
W
;
x
;
y
)
+
λ
R
2
∥
W
∥
2
2
+
λ
R
1
∥
W
∥
1
loss(W;x;y) = loss_D(W;x;y) + \\lambda_R_2 \\lVert W \\rVert_2^2 + \\lambda_R_1 \\lVert W \\rVert_1
loss(W;x;y)=lossD(W;x;y)+λR2∥W∥22+λR1∥W∥1
类 distiller.L1Regularize
实现
l
1
l_1
l1-范数正则化,当然也可以通过schedule
使用。
l1_regularizer = distiller.s(model.parameters())
...
loss = criterion(output, target) + lambda * l1_regularizer()
组正则化
在Group Regularization中,我们惩罚整组参数元素,而不是单个元素。 因此,整个组要么是稀疏化的(即所有组元素都具有零值),要么不是。 必须预先定义组结构。
l o s s ( W ; x ; y ) = l o s s D ( W ; x ; y ) + λ R R ( W ) + λ g ∑ l = 1 L R g ( W l ( G ) ) loss(W;x;y) = loss_D(W;x;y) + \\lambda_R R(W) + \\lambda_g \\sum_l=1^L R_g(W_l^(G)) loss(W;x;y)=lossD(W;x;y)+λRR(W)+基于Distiller的模型压缩工具简介