今天要介绍的是一篇 model compression 的论文,来自 ICLR 2016 的《Diversity Network》[1]。论文要做的事情就是过去几年开始逐渐被关注起来的,model compression,尤其是neural networks compression。为了保证 neural networks 足够的 representation capacity,人们会更愿意选择 architecture 比较大(model size 大,parameter 多)的 neural networks 进行 training。然而,人们肯定希望尽可能减少不必要的 memory consumption,存储和后续使用——甚至未来能在移动设备这种 limited storage 的场景下使用。于是,model compression 就开始引起了研究者们的兴趣。
neural networks compression 的基础还是在于确实有可能进行 compression——压缩后不会显著影响 neural networks 的 performance。这件事已经在 2013年被相关研究[2]证实,[2]指出 neural networks 中的很多 parameter 是 significant redundant 的。既然可以做,怎么做的想法就自然浮了上来——既然冗余,就把冗余的部分给扔掉吧。于是,怎么判断冗余,怎么扔,就成了研究者们各显神通的地方。今天介绍的这篇工作[1] 就在如何判断冗余和如何“扔”两件事上都有一定的创新。
判断冗余的直观思想可以是我们把某一层中 activation 高度相似的 neuron 去掉就可以了——看似可以用 linear independence 来判断。然而,因为很多时候我们的 training set 还是比一层中的 neuron 多多了,导致 neuron activation 之间的独立性还是挺高的。所以,我们需要更好的选择 diverse subsets of activations 的方法。这篇文章[1] 便是由此出发,提出可以用 Determinantal Point Process (DPP) 来进行这种 diverse subsets 的选择。因为我们一次要选择的是一个 subsets,多个 outputs,一种经典的方法当然可以是使用多次每次 sample 一个 output 的方法。然而这样就很难保证每次的 output 之间保持特定的 property——而我们是希望一次选择出一个互相之间 diverse 度很高(尽量不相似)且对于 network performance 有贡献的 subsets of activations。这篇文章[1] 中的使用 DPP 就可以实现这件事。
DPP 的数学也非常优美简洁,它利用的是 kernel matrix 建模 diversity,同时具备线性代数求解的快速和高效性。这些都使得这篇工作[1]提出的 model compression 的效率很高,compression time 相比于 model training time 几乎可以不计。具体来说,DPP 使用的是 kernel matrix 的 determinant 来表示这些变量之间的 negative associations,而 subsets 的概率质量是正比于 determinant 的——概率质量越高的 subsets 也就因此越 diverse。于是数学上就是公式(1),其中 submatrice L_Y 就是选出来的 subsets,而 L 就是 DPP kernel。
DPP kernel 的选择上这篇工作[1]使用的是比较常用的 Gaussian RBF,并且表示其他更多的 kernel 可以留待以后去探索。至此,第一步 select diverse subsets 其实还有一点事情没有做完。那就是我们需要希望能控制每次的 sample size——于是就用了一个改进版本的 k-DPP。关于 DPP 的详细介绍推荐大家参考 CVPR 2013 workshop 上的一个 tutorial[3](另外这个 tutorial 还是才貌双全无敌巨帅的教授 Ben Taskar 的“最后一个” tutorial,诶……)。
现在如何更好地选出 redundant information 已经完成了,只要是 diverse subsets 之外的都算 redundant。那么怎么办,就直接删掉这些 redundant neurons 么?过去的很多工作确实是这样的,删 neurons 或者删 connections。这篇工作[1] 在这个方面上,做出了第二个创新。他们提出(并在实验中验证)虽然是 redundant,但是直接删掉还是会影响一部分 performance 的。所以有啥办法让我们能不这样无情又心痛地抛弃这些多余的家伙呢?他们就提出了我们可以把他们身上携带的信息给融合过来,再把它们抛弃(好像也很无情)。类似 merge node,这篇工作把这第二步过程叫做 fusion。利用 reweight procedure,把即将被扔掉的信息通过更新被保留 neurons 的 weights 给 fuse 过来。于是,fuse 的思想概括一下就是,我们要把损失降到最低——最小化删掉这些被第一步 DPP 排除在外的 redundant neurons 带来的 impact。这篇工作[1] 于是将其建模为最小化被删 layer 和其后的下一个 layer 之间删前删后的差异。也就是公式(3):
在实验部分,这篇论文主要就是分为两个思路,证实自己第一步的 redundant 选择是更优的,和证实自己的第二部 fusion 是有用的。关于这两个思路,有四个主要实验结论。第一就是 Figure 1 中,用它们的方法选择出来的 neurons 之间的 activations 更 diverse(heatmap 图)。
第二个结论是单纯去 prune 而不做 fuse 是对 performance 有损害的,见 Figure 2。附属结论是 DPP prune 比 random prune 还是损害小一点——如果是和其他相关工作中的 prune method 去对比,它们使用 DPP 的理由会更 convincing。
第三个结论是关于不同 layer 的。因为大家都知道,neural networks 中不同 layer 学到的 feature 不太一样,properties 可能也不同。这篇工作[1] 发现,在 neural networks 的不同位置的 layer 上,都能看到它们的 DPP prune 效果更好。并且,尤其是在 output layer 效果最好。作者将其归因为 output 本来角色就已经比较 specified,已经比较 diverse,更适合用 DPP。
第四个结论是从另一个角度了证明它们的 fusion step 是有用的。因为之前有人的 prune method 是基于 node importance 做的,而 importance 是通过对于 networks 的贡献(calculation impact)来决定的。这类方法的弊端就是随着 prune amount 的增加,会严重影响 performance 性能——会删掉那些非常重要的 neurons。而如果如果是 prune 之前先把这些 fuse,就不会有这个问题。
所以通过上面四个结论,也可以凸显出它们这种 DPP select-reweight fuse 两步的方法的另一个隐形优点。就是它们的两步都是可以独立进行的,也可以和其他方法搭配。可以使用别人的 prune method,使用它们的 fuse;也可以反过来。这篇工作[1]大概就是这样。
[1] Zelda Mariet and Suvrit Sra. "Diversity Networks". ICLR 2016.
[2] M. Denil, B. Shakibi, L. Dinh, M. Ranzato, and N. de Freitas. "Predicting parameters in deep learning". CoRR, abs/1306.0543, 2013.
[3] Alex Kulesza with Ben Taskar and Jennifer Gillenwater. "Determinantal Point Processes". Tutorial at CVPR 2013 on weakly-supervised structured learning workshop.