论文解读《ResRep: Lossless CNN Pruning via Decoupling Remembering and Forgetting》

《ResRep: Lossless CNN Pruning via Decoupling Remembering and Forgetting》

论文地址:https://arxiv.org/pdf/2007.03260.pdf
code地址:https://link.zhihu.com/?target=https%3A//github.com/DingXiaoH/ResRep

一、论文主要思路:

  1. 在模型的conv层之后(若没bn层,有bn层则将conv-bn层合并形成一个卷积操作之后再加入compactor layer)加入修剪层(compactor layer论文最后说明为何要单独加入修剪层),是1*1的卷积核,也就是只对conv输出做线性变换
  2. 在1加入的修剪层上施加惩罚项,使之趋于0,增加稀疏性。(在本文中,并没有这种做,在更新修剪层参数时直接加上惩罚项的梯度,这样等价于在目标损失函数上加上惩罚项)对于施加惩罚项进行稀疏训练可以参考这个论文:https://blog.csdn.net/janezjlj/article/details/127508566?spm=1001.2014.3001.5501
  3. 对于2训练之后,将接近0的通道进行删除
  4. 将conv-compactor layer 进行等价合并,形成修剪后的模型
    思路对应原文如下:

二、接下来对思路当中几个点作一下说明:

  1. 思路第一步的在conv后紧跟bn层,如何将conv-bn合并成一个conv
    公式1:conv层的输出
    公式2:conv-bn的输出
    论文解读《ResRep: Lossless CNN Pruning via Decoupling Remembering and Forgetting》_第1张图片
    公式4:将公式2拆解即可得到以下
    论文解读《ResRep: Lossless CNN Pruning via Decoupling Remembering and Forgetting》_第2张图片

  2. 施加惩罚项与不施加直接更新梯度的对比
    公式10 是直接在损失函数之后加入惩罚项
    在这里插入图片描述
    在本文当中惩罚项如下公式11和12,是通道的参数平方和
    论文解读《ResRep: Lossless CNN Pruning via Decoupling Remembering and Forgetting》_第3张图片
    那么,更新则使用公式14,故我们可以省略在损失函数之后加入惩罚项,直接在梯度更新时加上惩罚项的梯度。
    观察公式14还会发现在第一项损失的梯度乘上了m,这个m是{0,1},代表是否希望将F参数进行置为0。当m=0时,那么前一项为0,F就可以在后一项的作用下稳步趋于0,达到高修剪性。
    在这里插入图片描述

  3. 那么第三步来说下修剪,在下图公式3中,S(i)是保留的通道index,那么左边是该层修剪之后的参数。由于修剪该层的输出通道,下一层的输入通道数也会随之改变,故公式3右边的是下一层修剪之后的参数,可以看到输入通道也是S(i)。
    论文解读《ResRep: Lossless CNN Pruning via Decoupling Remembering and Forgetting》_第4张图片

  4. 再来聊一聊,修剪之后如何将conv-compactor合并成一个conv,进而形成修剪后的模型:
    下图是conv-compactor的输出
    在这里插入图片描述
    那么下图是上图由于卷积可加性,展开之后:
    在这里插入图片描述 在这里插入图片描述
    想要将上图中公式7左边转换为等号右边部分,则K`如公式8,b的如公式9在这里插入图片描述

三、最后说一下文章标题:ResRep

其实就是将训练与修剪进行解耦,使得修剪不会影响训练的准确率。解耦即是通过在conv之后加入单独的修剪层实现的。只在修剪层进行惩罚项,不会影响其他层参数的梯度更新结果。那么就不会使训练性能下降。

你可能感兴趣的:(cnn,剪枝,深度学习,python)