Distiller:正则化

20 篇文章 0 订阅
5 篇文章 0 订阅

Regularization

正则化

在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)+λRW22

其中 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 W22 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) W22=l=1Li=1nwl,i2wheren=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 W1

∥ W ∥ 1 = l 1 ( W ) = ∑ i = 1 ∣ W ∣ ∣ w i ∣ \lVert W \rVert_1 = l_1(W) = \sum_{i=1}^{|W|} |w_i| W1=l1(W)=i=1Wwi

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)+λRW1
如果同时使用两个正则化,则有:
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)+λR2W22+λR1W1

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)+λgl=1LRg(Wl(G))
让我们表示组中 g g g的所有权重元素为 w ( g ) w^{(g)} w(g)

R g ( w ( g ) ) = ∑ g = 1 G ∥ w ( g ) ∥ g = ∑ g = 1 G ∑ i = 1 ∣ w ( g ) ∣ ( w i ( g ) ) 2 R_g(w^{(g)}) = \sum_{g=1}^{G} \lVert w^{(g)} \rVert_g = \sum_{g=1}^{G} \sum_{i=1}^{|w^{(g)}|} {(w_i^{(g)})}^2 Rg(w(g))=g=1Gw(g)g=g=1Gi=1w(g)(wi(g))2
其中 w ( g ) ∈ w ( l ) w^{(g)} \in w^{(l)} w(g)w(l)并且 ∣ w ( g ) ∣ |w^{(g)}| w(g) w ( g ) w^{(g)} w(g)中的元素数。

λ g ∑ l = 1 L R g ( W l ( G ) ) \lambda_g \sum_{l=1}^{L} R_g(W_l^{(G)}) λgl=1LRg(Wl(G))被称为组正规则。就像在 l 1 l_1 l1-范数正则化中我们总和所有张量元素的大小一样,在Group Lasso中,我们总结了元素结构(即组)的大小。

组正则化也称为块正则化,结构化正则化或粗粒度稀疏性(元素稀疏性有时被称为细粒度稀疏性)。 组稀疏性表现出规律性(即其形状是规则的),因此对提高推理速度可能是有益的。

Huizi-et-al-20173 提供了一些不同组的概述:卷积核,通道,过滤器,层等。 也可以使用诸如矩阵列和行的结构,以及各种形状结构(块稀疏性),甚至intra kernel strided sparsity4

distiller.GroupLassoRegularizer目前实现了大多数这些组,也可以轻松添加新组。

参考


  1. Ian Goodfellow and Yoshua Bengio and Aaron Courville.
    Deep Learning,
    arXiv:1607.04381v2,
    2017. ↩︎

  2. Song Han, Jeff Pool, Sharan Narang, Huizi Mao, Enhao Gong, Shijian Tang, Erich Elsen, Peter Vajda, Manohar Paluri, John Tran, Bryan Catanzaro, William J. Dally.
    DSD: Dense-Sparse-Dense Training for Deep Neural Networks,
    arXiv:1607.04381v2,
    2017. ↩︎

  3. Huizi Mao, Song Han, Jeff Pool, Wenshuo Li, Xingyu Liu, Yu Wang, William J. Dally.
    Exploring the Regularity of Sparse Structure in Convolutional Neural Networks,
    arXiv:1705.08922v3,
    2017. ↩︎

  4. Sajid Anwar, Kyuyeon Hwang, and Wonyong Sung.
    Structured pruning of deep convolutional neural networks,
    arXiv:1512.08571,
    2015 ↩︎

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值