![bdf2dd314c81b4b647242898e969f809.png](https://i-blog.csdnimg.cn/blog_migrate/3995f52aeb180cff23213e9710d6d3ee.jpeg)
大家好, 宣传一下最近做的发表在ICML2020和NeurIPS2020上关于神经网络剪枝的工作。
Good Subnetworks Provably Exist: Pruning via Greedy Forward Selectionarxiv.org Greedy Optimization Provably Wins the Lottery: Logarithmic Number of Winning Tickets is Enougharxiv.org众所周知,深度学习模型往往很大,而网络太大的坏处之一便是在使用模型进行推理时候会有更大的能源消耗以及更慢的速度。神经网络剪枝是一个古老但是仍然很有用的方法用来压缩网络的大小同时保留网络的精确性。
虽然剪枝技术发展至今已经有了许多有效的算法,但是关于剪枝的许多关键性的问题其实仍然没有得到一个很好的理论上的回答:
- 在大的网络中,是否真的存在一个高效,精确但是无法直接用梯度下降学习到的小网络?
- 是否有一个简单有效的剪枝算法能够学习那个大模型中的高效的小网络?
- 在剪枝完成之后,我们是应该微调(fine-tune)这个剪枝过的模型还是应该重新随机化权重重新训练(re-train from scratch)?
- 剪枝产生的误差(error)是如何随着小模型尺寸(size of the pruned model)的增大而减少的?
我们最近的工作回答了上面的问题。在我们ICML的paper中,我们发现一个简单的基于贪心法的剪枝策略就已经能够保证发现一个很好的小网络。
简单起见,我们不妨考虑一个简单的一层神经网络
![fce6c6a321e2f01313753a9e14b3d4e4.png](https://i-blog.csdnimg.cn/blog_migrate/7231342a84b2d91510d75d3b84b31728.jpeg)
为了压缩这个神经网络,我们的目标是找到从这个N个神经元(neuron)中选择一部分,而这一部分的神经元其实就组成了大网络内部的一个小网络。假设我们的小网络由最多n个神经元组成,网络剪枝其实就等价于下面这个约束优化问题:
![4589457054bfc29bf926102d8f3e1354.png](https://i-blog.csdnimg.cn/blog_migrate/1b590f9faa1050cba3576bc607ad92d1.jpeg)
其中
![97c1193c4b79635ee5075e3cc927724a.png](https://i-blog.csdnimg.cn/blog_migrate/f771016f0ecb0d0a1e9568912c082d2c.png)
便是由选出的神经元(组成了一个集合S)得到的小网络。
上述的问题其实是一个典型的NP问题所以无法用穷举的方法得到结果。那么如何找到一个好的解呢?我们提出的策略非常简单,我们从S=空集开始,一步一步的从大网络中选择neuron加入S,直到S中有n个神经元。而在每一步加神经元中,我们从大网络中选择那个使得loss减少的最多的神经元加入S。也就是,令
![equation?tex=S_0%3D%5Cemptyset](https://i-blog.csdnimg.cn/blog_migrate/85d024110f1818447527c7e6cadc0e73.png)
![5393e3bfcffdaedccd005096893c885f.png](https://i-blog.csdnimg.cn/blog_migrate/e2c615ca0cb03d062a95dcba38f210e5.png)
得到了上述的算法,我们需要了解的一个问题是,通过这个方式得到的小网络会优于直接通过梯度下降得到的小网络吗?答案是yes。我们考虑使用mean-field theory作为理论背景来估计这些小网络的“好坏”。根据[1]的理论,我们知道如果使用梯度下降直接训练一个n个神经元的小网络,那么这个网络的误差大约会在
![equation?tex=%5Cmathcal%7BO%7D%28n%5E%7B-1%7D%29](https://i-blog.csdnimg.cn/blog_migrate/e75f5b5c2810323da255a60bd92d85e3.png)
![equation?tex=%5Cmathcal%7BO%7D%28n%5E%7B-2%7D%29](https://i-blog.csdnimg.cn/blog_migrate/306e414ad48419eae5af87267fbe46d7.png)
为了验证我们的理论,我们通过剪枝和直接梯度下降的方法学习了各个尺寸的网络然后比较了他们的error。
![83d7f19145f146b004a53e45bbb509bd.png](https://i-blog.csdnimg.cn/blog_migrate/4d41d5d48869f91a22fda6101ddc40e3.jpeg)
在我们ICML的论文中,我们的理论结果只能应用于一层的神经网络。在之后的NeurIPS的论文中,我们进一步的改进了上述的贪心算法,主要的区别是在每一步的贪心中,我们不光选择最好的神经元,我们还不断的调整每个神经元在最后的小网络中的权重。
![cd890df822fb1c10f67b8821dc636fb8.png](https://i-blog.csdnimg.cn/blog_migrate/da485376d5666ed4eac70f1f08ecef63.png)
改进之后的剪枝算法更是能够学习到误差是
![equation?tex=%5Cmathcal%7BO%7D%28%5Cexp%28-cn%29%29](https://i-blog.csdnimg.cn/blog_migrate/fb3b57f49b1453ef18cf6f7d7c7d9c21.png)
我们在ImageNet上使用我们的算法剪枝了ResNet34, MobileNetV2 和 MobileNetV3-small,均取得了不错的效果,具体请在论文中查收。注意到为了压缩深层网络,我们采用逐层剪枝的方法:从最靠近输入的一层开始剪,一直剪到输出层。
我们的理论也有一些“副产品”。我们的理论暗示着我们应该微调(fine-tune)剪枝得到的小网络而不是采用[2]中推崇的随机化参数重新训练(retrain from scratch)的方法。因为一旦这么做,我们将不再拥有剪枝网络更快递减的误差(error rate)。我们也在ImageNet上验证了这一观点。虽然没有进一步做分析,我们认为到底是使用微调还是重新训练应该是和使用的剪枝算法有关的而[2]中的结论可能不是对剪枝这个问题通用的。如果剪枝算法大量利用了大网络中参数的信息,那么可能微调才是更好的方法。
我们也注意到我们的算法和一些传统的剪枝不同,我们采用的是逐渐增加新的神经元(forward selection)而传统的方法往往是逐渐从大网络中删除神经元(backward elimination)。我们在论文中也讨论了这两种方案的理论和实验中的差异。
[1] Song, M., Montanari, A., and Nguyen, P. A mean field view of the landscape of two-layers neural networks. Proceedings of the National Academy of Sciences.
[2] Liu, Z., Sun, M., Zhou, T., Huang, G., and Darrell, T. Rethinking the value of network pruning. The International Conference on Learning Representations, 2019.