1. 模型压缩的意义
复杂网络更加简化,仍保持较好的性能,实现部署
2. 模型压缩的几种方法
2.1 参数修剪(剪掉无用的参数)
参数修剪的方法:
- 训练一个大的模型
- 评估参数是否重要?
1) 权重的绝对值(绝对值大的有用,绝对值接近0的无用)
2) 参数的bi值
3) 评估神经元(计算神经元不为0的个数) - 修剪(精度会下降)
- 重新微调
- 前面三步重复进行(一次修剪大量参数,会导致微调失败)
权重参数的修剪存在的问题:
修剪之后,可能会存在不规则的形状,pytorch搭建就会很困难,往往对权重参数的修剪不能起到加速的作用。
以下这种不规则的结构,通常很难进行构建,而且加速效果不明显。
通常可以采取将权重参数置为0
2.2 神经元修剪
修剪之后仍然是规则的
利用大的网络的初始化参数,用于小网络会有好的结果,直接复制裁剪后的网络,重新训练,效果不会很好。
2.3 知识蒸馏
优点:将网络从大网络转化成一个小网络,并保留接近于大网络的性能;也可以将多个网络学到的知识转移到一个网络中,使得单个网络的性能接近整体的效果。
学生网络学习教师网络的结果,不管结果对错。
先训练大的网络,是因为训练一个大的网络产生的结果要比小型网络好。
将多个模型的评均效果作为教师网络的输出
知识蒸馏示例:
T的取法一般可以有2,10,20几种,alpha一般取0.5,0.9,0.95几种。
代码:
https://zhuanlan.zhihu.com/p/478334890
https://blog.csdn.net/zhenyu_an/article/details/103225509
2.4 参数量化
使用某一类别的平均参数来表示
2.5 结构设计
常规CNN
深度可分离卷积
2.6 动态计算
将每个额外层输出来的结果与标签计算误差,然后将所有误差求平均,然后最小化这个平均误差。使得每个额外层的输出都尽可能的接近标签。
3. 参考
https://www.bilibili.com/video/BV1Wv411h7kN?p=122
https://www.bilibili.com/video/BV1Wv411h7kN?p=123