本文共 1269 字,大约阅读时间需要 4 分钟。
参考代码:
导读:在模型进行部署的时候一般会希望模型的尽可能小,减少infer时候资源的消耗,其中比较常用的方式就是模型剪枝,其中一般常用的方式是结构化剪枝,这样会硬件也比较友好,非结构化剪枝也是可以的。其采取的步骤是首先训练一个较大的模型,之后使用剪枝算法检出那些不重要的参数,之后再在重要参数的基础上进行finetune,以期望恢复网络性能。这篇文章对剪枝的后半段进行思考, 是否真的需要在重要权重的基础上进行finetune?剪枝之后的网络使用随机初始化对于结构化与非结构化都有效?剪枝之后初始化方式与学习率的影响? 文章中一个重要的发现是直接从剪枝之后的结构使用随机初始化(而非在重要权重上finetune)能得到持平甚至更好的网络性能。这样的结论是基于文章的如下观察得到的:
1)剪裁之后得到的重要权重对于剪裁之后的网络结构来说并不是那么重要,从其随机初始化上重新训练得到的结果在性能上持平甚至更好(finetune的模型可能会陷入局部最小值从而影响性能); 2)网络的剪枝其意义并不在于去寻找原有网络中的重要权重,而是去寻找最为适合的网络结构本身; 3)网络的剪枝可以看作是今后设计网络时候的指导思想,从而设计更加高效的网络;
传统上对于网络的剪枝压缩主要分为3个过程,见下图1所示:
在原始的剪枝过程中是使用原网络中重要的权重作为初始化,之后进行finetune以期望恢复网络的精度,这篇文章中将这样的方法称之为Scratch-E。剪枝之后的网络直接使用随机初始化进行训练,文章中将这样的方法称之为Scratch-B(网络缩小了多少倍,那么在训练的时候网络的epoch和lr_scheduler也需要对应成比例的放大)。对此文章得到的实验结果为(结构化剪枝的结果,非结构化剪枝得到的结果也是类似的):
Uniform Pruning与否含义就是是否将网络压缩作为统一的比例缩放,下图2就是两者之间最为显著的区别,左边的是使用统一的剪裁比例进行剪枝,右边就是使用适应的方式进行剪枝。这里能给后续设计网络结构提供指引,而不是盲目加大网络。
在文章中分析了使用Winning Ticket与Random初始化对网络性能带来的影响,并且比较了不同学习率对于网络性能的影响,其结果见下图所示:
转载地址:http://bwkhj.baihongyu.com/