最近计划看一些pruning的论文,写博客记录一下,同时也督促一下自己。
这两天看的是一篇NeuIPS 2019的论文——Network Pruning via Transformable Architecture Search,用NAS对网络进行剪枝。传统的剪枝方法会受到宽度和深度的限制,引入NAS以后,使得通道和层不受这种限制。
从图片可以看到传统的方法和文章的方法的对比。传统方法一般是在原网络的基础上对修剪的网络进行微调,而本文的方法先训练一个未剪枝的大规模CNN(命名T),同时通过TAS搜索小规模CNN (命名S)的宽度和深度,再用简单的KD方法将T的知识迁移到S。
(唔…看起来很简单易懂的样子…接下来看看到底是怎么work的)
论文给出了一对未修剪的三层CNN进行宽度修剪的示例。
···Transformable Architecture Search
网络通道修剪旨在减少网络各层通道的数量。给定一个输入图像,网络将其作为输入,并生成每个目标类的概率。
假设X和O是第l个卷积层的输入和输出feature tensors(以3*3卷积为例):
··①Search for width
通道数量的第 j 个候选者概率为:
其中 α 表示一层中可能的通道数分布,但是这样算会影响反向传播。
因此引入 Gumbel-Softmax ,软化采样过程:
另外,根据被选择size的概率对权重进行重新归一化:
··②Search for depth
··③Searching objectives
最终的架构 A 是通过选择最大概率的候选项得到的。TAS的目标是通过训练损失将 L train最小化,找到对应的最小验证损失的 L val ,得到对应的架构 A 。
验证损失L val 还考虑了计算成本的损失
成本损失将使得网络逼近网络的计算成本(如FLOP)收敛到 R , R 可以动态做调整。
然后用了一个简单的 KD 方法做知识迁移。
(还没有对论文进行复现,论文代码作者已经开源,用的是pytorch。作者在GitHub附有TAS网络剪枝过程的可视化动态图。)
先看一下实验结果: