【深度学习技巧】模型压缩(参数修剪、神经元修剪、知识蒸馏、参数量化、结构设计、动态计算)

文章目录

  • 1. 模型压缩的意义
  • 2. 模型压缩的几种方法
    • 2.1 参数修剪(剪掉无用的参数)
    • 2.2 神经元修剪
    • 2.3 知识蒸馏
    • 2.4 参数量化
    • 2.5 结构设计
    • 2.6 动态计算
  • 3. 参考

1. 模型压缩的意义

复杂网络更加简化,仍保持较好的性能,实现部署

2. 模型压缩的几种方法

2.1 参数修剪(剪掉无用的参数)

参数修剪的方法:

  1. 训练一个大的模型
  2. 评估参数是否重要?
    1) 权重的绝对值(绝对值大的有用,绝对值接近0的无用)
    2) 参数的bi值
    3) 评估神经元(计算神经元不为0的个数)
  3. 修剪(精度会下降)
  4. 重新微调
  5. 前面三步重复进行(一次修剪大量参数,会导致微调失败)

权重参数的修剪存在的问题:
修剪之后,可能会存在不规则的形状,pytorch搭建就会很困难,往往对权重参数的修剪不能起到加速的作用。
以下这种不规则的结构,通常很难进行构建,而且加速效果不明显。
【深度学习技巧】模型压缩(参数修剪、神经元修剪、知识蒸馏、参数量化、结构设计、动态计算)_第1张图片
通常可以采取将权重参数置为0
【深度学习技巧】模型压缩(参数修剪、神经元修剪、知识蒸馏、参数量化、结构设计、动态计算)_第2张图片

2.2 神经元修剪

修剪之后仍然是规则的
【深度学习技巧】模型压缩(参数修剪、神经元修剪、知识蒸馏、参数量化、结构设计、动态计算)_第3张图片
利用大的网络的初始化参数,用于小网络会有好的结果,直接复制裁剪后的网络,重新训练,效果不会很好。
【深度学习技巧】模型压缩(参数修剪、神经元修剪、知识蒸馏、参数量化、结构设计、动态计算)_第4张图片

2.3 知识蒸馏

优点:将网络从大网络转化成一个小网络,并保留接近于大网络的性能;也可以将多个网络学到的知识转移到一个网络中,使得单个网络的性能接近整体的效果。

学生网络学习教师网络的结果,不管结果对错。
先训练大的网络,是因为训练一个大的网络产生的结果要比小型网络好。
【深度学习技巧】模型压缩(参数修剪、神经元修剪、知识蒸馏、参数量化、结构设计、动态计算)_第5张图片
将多个模型的评均效果作为教师网络的输出
【深度学习技巧】模型压缩(参数修剪、神经元修剪、知识蒸馏、参数量化、结构设计、动态计算)_第6张图片
【深度学习技巧】模型压缩(参数修剪、神经元修剪、知识蒸馏、参数量化、结构设计、动态计算)_第7张图片
知识蒸馏示例:
【深度学习技巧】模型压缩(参数修剪、神经元修剪、知识蒸馏、参数量化、结构设计、动态计算)_第8张图片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 参数量化

使用某一类别的平均参数来表示
【深度学习技巧】模型压缩(参数修剪、神经元修剪、知识蒸馏、参数量化、结构设计、动态计算)_第9张图片

2.5 结构设计

常规CNN
【深度学习技巧】模型压缩(参数修剪、神经元修剪、知识蒸馏、参数量化、结构设计、动态计算)_第10张图片
深度可分离卷积
【深度学习技巧】模型压缩(参数修剪、神经元修剪、知识蒸馏、参数量化、结构设计、动态计算)_第11张图片

2.6 动态计算

将每个额外层输出来的结果与标签计算误差,然后将所有误差求平均,然后最小化这个平均误差。使得每个额外层的输出都尽可能的接近标签。

【深度学习技巧】模型压缩(参数修剪、神经元修剪、知识蒸馏、参数量化、结构设计、动态计算)_第12张图片
【深度学习技巧】模型压缩(参数修剪、神经元修剪、知识蒸馏、参数量化、结构设计、动态计算)_第13张图片

3. 参考

https://www.bilibili.com/video/BV1Wv411h7kN?p=122
https://www.bilibili.com/video/BV1Wv411h7kN?p=123

你可能感兴趣的:(pytorch)