↑↑↑关注后"星标"Datawhale

每日干货 & 每月组队学习,不错过

Datawhale干货

作者:Pikachu5808,编辑:极市平台

来源丨https://zhuanlan.zhihu.com/p/301162618

导读

本文详细介绍了4种主流的压缩与加速技术:结构优化、剪枝、量化、知识蒸馏,作者分别从每个技术结构与性能表现进行陈述。

近年来,深度学习模型在CV、NLP等领域实现了广泛应用。然而,庞大的参数规模带来的计算开销、内存需求,使得其在计算能力受限平台的部署中遇到了巨大的困难与挑战。因此,如何在不影响深度学习模型性能的情况下进行模型压缩与加速,成为了学术界和工业界的研究热点。

1、简介

深度学习模型压缩与加速是指利用神经网络参数和结构的冗余性精简模型,在不影响任务完成度的情况下,得到参数量更少、结构更精简的模型。被压缩后的模型对计算资源和内存的需求更小,相比原始模型能满足更广泛的应用需求。(事实上,压缩和加速是有区别的,压缩侧重于减少网络参数量,加速侧重于降低计算复杂度、提升并行能力等,压缩未必一定能加速,本文中我们把二者等同看待)

  • 必要性:主流的模型,如VGG-16,参数量1亿3千多万,占用500多MB空间,需要进行300多亿次浮点运算才能完成一次图像识别任务。

  • 可行性:并非所有的参数都在模型中发挥作用,部分参数作用有限、表达冗余,甚至会降低模型的性能,因此,只需训练一小部分的权值参数就有可能达到和原来网络相近的性能甚至超过原来网络的性能(可以看做一种正则化)。

压缩与加速,大体可以从三个层面来做:算法层、框架层、硬件层,本文仅讨论算法层的压缩与加速技术。

2、主流技术

主流的压缩与加速技术有4种:结构优化、剪枝(Pruning)、量化(Quantization)、知识蒸馏(Knowledge Distillation)。

2.1、结构优化

通过优化网络结构的设计去减少模型的冗余和计算量。常见方式如下:

  • 矩阵分解:如ALBERT的embedding layer

  • 参数共享:如CNN和ALBERT(只能压缩参数不能加速推理)

  • 分组卷积:主要应用于CV领域,如shuffleNet,mobileNet等

  • 分解卷积:使用两个串联小卷积核来代替一个大卷积核(Inception V2)、使用两个并联的非对称卷积核来代替一个正常卷积核(Inception V3)

  • 全局平均池化代替全连接层

  • 使用1*1卷积核

2.2、剪枝

剪枝是指在预训练好的大型模型的基础上,设计对网络参数的评价准则,以此为根据删除“冗余”参数。根据剪枝粒度粗细,参数剪枝可分为非结构化剪枝和结构化剪枝。非结构化剪枝的粒度比较细,可以无限制去掉网络中期望比例的任何“冗余”参数,但会带来裁剪后网络结构不规整难以有效加速的问题。结构化剪枝的粒度比较粗,剪枝的最小单位是filter内参数的组合,通过对filter或者feature map设置评价因子,甚至可以删除整个filter或者某几个channel,使网络“变窄”,可以直接在现有软硬件上获得有效加速,但可能带来预测精度的下降,需要通过对模型微调恢复性能。

2.3、量化

量化是指用较低位宽表示典型的32bit浮点型网络参数。网络参数包括权重、激活值、梯度和误差等等, 可以使用统一的位宽(如16bit,8bit,2bit和1bit等),也可以根据经验或一定策略自由组合不同的位宽。量化的优点在于:1).能够显著减少参数存储空间与内存占用空间,如,将参数从32bit浮点型量化到8bit整型能够减少75%的存储空间,这对于计算资源有限的边缘设备和嵌入式设备进行深度学习模型的部署和使用都有很大帮助;2).能够加快运算速度,减少设备能耗,读取32bit浮点数所需的带宽可以同时读入4个8bit整数,并且整型运算相比浮点型运算更快,自然能降低设备功耗。但其仍存在一定的局限性,网络参数的位宽减少损失一部分信息量,造成推理精度下降,虽然能通过微调恢复部分精确度,但带来时间成本;量化到特殊位宽时,很多现有的训练方法和硬件平台不再适用,需要设计专用的系统架构,灵活性不高。

2.4、知识蒸馏

知识蒸馏在Hinton于2015年发表的《Distilling the Knowledge in a Neural Network》(https://arxiv.org/pdf/1503.02531.pdf)中被提出。

同其它压缩与加速技术不同,知识蒸馏需要两种类型的网络:Teacher Model和Student Model。前者参数量大、结构复杂,后者参数量较小、结构相对简单。二者可以是不同的网络结构,但是采用相似的网络结构,蒸馏效果会更好。训练流程如下图所示:

首先训练Teacher Model,然后用其指导Student Model的训练(训练集可以保持一致)。具体指导方案,将Teacher Model在Softmax层的输出作为数据的soft label(熵更高,信息量更大),Student Model的loss function将是对soft label预测和hard label预测的loss的线性加权和(具体可以参考https://zhuanlan.zhihu.com/p/102038521)。Student Model训练好后,按照常规模型使用即可。

对soft label预测的loss,可以计算两个Model在Softmax层的输出的Cross Entropy,也可以计算两个Model在Softmax层的输入的MSE。

知识蒸馏通过将Teacher Model的知识迁移到Student Model中,使Student Model达到与Teacher Model相当的性能,同时又能起到模型压缩的目的。其局限性在于,由于使用Softmax层的输出作为知识,所以一般多用于具有Softmax层面的分类任务,在其它任务上的表现不好。

3、应用实例

以下列举几个知识蒸馏的应用实例。

3.1、DistillBERT

DistillBERT在Hugging Face于2019年发表的《DistilBERT, a distilled version of BERT: smaller, faster, cheaper and lighter》(https://arxiv.org/pdf/1910.01108.pdf)中被提出。

DistillBERT的细节如下:

  • Student架构:总体和BERT一致,移除了token-type embeddings和pooler,层数减半(每两层去掉一层,由12层减到6层)

  • Student初始化:直接采用Teacher(BERT-base)中对应的参数进行初始化

  • Training loss:  ,其中,  是soft label之间的KL散度(非交叉熵),  同BERT,  是隐层向量之间的cosine值

  • Student训练:采用了RoBERTa的方式,如,更大的batch_size、dynamic masking、去NSP

  • 数据集:Student采用了和原始BERT一致的数据集

DistillBERT在GLUE数据集上的性能表现:

DistillBERT在参数量和推理速度上的表现:

3.2、TinyBERT

TinyBERT在华科+华为于2019年发表的《TinyBERT: Distilling BERT for Natural Language Understanding》(https://arxiv.org/pdf/1909.10351.pdf)中被提出。

TinyBERT的训练流程如下:

整体是个两阶段的蒸馏过程:

  • General Distillation:以未经fine-tuning的BERT作为Teacher,蒸馏得到General TinyBERT

  • Task-specific Distillation:以fine-tuning后的BERT作为Teacher,General TinyBERT作为Student的初始化,在经过数据增强后的Task Dataset上继续蒸馏,得到Fine-tuned TinyBERT

TinyBERT的结构如下:

TinyBERT的loss如下:

其中,  表示embedding layer,  表示prediction layer,  有三种形式,代表三种不同的loss:


 都是MSE loss,  是Cross Entropy loss,具体计算公式可参考论文。

TinyBERT的性能表现如下:

3.3、FastBERT

FastBERT在北大+腾讯于2020年发表的《FastBERT: a Self-distilling BERT with Adaptive Inference Time》(https://arxiv.org/pdf/2004.02178.pdf)中被提出。

FastBERT的结构如下:

它的创新点在于self-distillation mechanism和sample-wise adaptive mechanism:

  • self-distillation mechanism:Teacher(backbone)和Student(branch)统一在一个模型中,在原始BERT的每层Transformer后接Student Classifier,拟合原始BERT的Teacher Classifier;backbone和branch的参数训练是独立的,其中一个模块参数在训练时,另一个模块参数会frozen

  • sample-wise adaptive mechanism:基于LUHA(the Lower the Uncertainty,the Higher the Accuracy)假设,在底层Transformer对应的Student Classifier中,如果已经做出了置信的分类决策,则不再继续顶层的预测

FastBERT的训练流程如下:

  • Pre-training:对除Teacher Classifier外的backbone进行预训练,这部分和BERT系列模型没有区别(甚至可以直接使用开源的训练好的模型)

  • Fine-tuning forbackbone:根据下游任务,采用对应的数据集,训练含Teacher Classifier在内的backbone

  • Self-distillation for branch:可以采用无标签的数据(因为不需要label,只需要Teacher Classifier的输出),Teacher Classifier的输出  作为soft label,计算Student Classifier的输出  和  之间的KL散度,将所有层的KL散度之和作为total loss:

为了实现Adaptive inference,FastBERT采用了归一化的熵作为Student Classifier决策结果的置信度指标:


其中,  是Student Classifier输出的概率分布,  是类目数量。论文中,给Uncertainty设定的阈值是Speed,二者取值均介于0、1之间。

FastBERT的性能表现如下(当前仅应用于分类任务):


参考文献

[1] SIGAI:深度学习模型压缩与加速综述(https://zhuanlan.zhihu.com/p/67871864)

[2] 简枫:一文看懂深度学习模型压缩和加速(https://zhuanlan.zhihu.com/p/138059904)

[3] 深度学习模型压缩方法的特点总结和对比_deephub-CSDN博客(https://blog.csdn.net/deephub/article/details/107424974)

[4] 深度学习网络模型压缩剪枝详细分析 - 吴建明wujianming - 博客园(https://www.cnblogs.com/wujianming-110117/p/12702802.html)

[5] http://www.jos.org.cn/ch/reader/download_pdf_file.aspx?journal_id=jos&file_name=88D0BB702E5C1707DA216DE97314F1CF19E0198366EB5D137A9BF999F723A888FEB366E50279546F&open_type=self&file_no=6096

[6] https://github.com/scutan90/DeepLearning-500-questions/blob/master/ch17_%E6%A8%A1%E5%9E%8B%E5%8E%8B%E7%BC%A9%E3%80%81%E5%8A%A0%E9%80%9F%E5%8F%8A%E7%A7%BB%E5%8A%A8%E7%AB%AF%E9%83%A8%E7%BD%B2/%E7%AC%AC%E5%8D%81%E4%B8%83%E7%AB%A0_%E6%A8%A1%E5%9E%8B%E5%8E%8B%E7%BC%A9%E3%80%81%E5%8A%A0%E9%80%9F%E5%8F%8A%E7%A7%BB%E5%8A%A8%E7%AB%AF%E9%83%A8%E7%BD%B2.md

[7] 潘小小:【经典简读】知识蒸馏(Knowledge Distillation) 经典之作(https://zhuanlan.zhihu.com/p/102038521)

[8] 船长:知识蒸馏Knowledge Distillation(https://zhuanlan.zhihu.com/p/83456418)

[9] https://arxiv.org/pdf/1503.02531.pdf

[10] 【Knowledge Distillation】知识蒸馏总结https://www.jianshu.com/p/afed593a4088

[11] 章鱼小丸子:语义表示模型新方向《DistillBert》https://zhuanlan.zhihu.com/p/89522799

[12] NLP中的预训练语言模型(四)-- 小型化bert(DistillBert, ALBERT, TINYBERT)https://www.icode9.com/content-4-513644.html

[13] https://arxiv.org/pdf/1910.01108.pdf

[14] 腾讯技术工程:比 Bert 体积更小速度更快的 TinyBERT(https://zhuanlan.zhihu.com/p/94359189)

[15] TinyBERT:模型小7倍,速度快8倍,华中科大、华为出品(https://www.jiqizhixin.com/articles/2019-09-30-5)

[16] BERT 模型蒸馏 TinyBERT(https://www.jianshu.com/p/015d23216ab3)

[17] https://arxiv.org/pdf/1909.10351.pdf

[18] https://arxiv.org/pdf/2004.02178.pdf

[19] rumor:FastBERT:又快又稳的推理提速方法(https://zhuanlan.zhihu.com/p/127869267)

[20] 推理怎么又快又稳?且看我FastBERT(https://www.jiqizhixin.com/articles/2020-07-23-7)

[21] 解读FastBERT《a Self-distilling BERT with Adaptive Inference Time》(https://www.codenong.com/cs105364183/)

以上为本文的全部参考文献,对原作者表示感谢。

“干货学习,三连

深度学习模型压缩与加速综述!相关推荐

  1. 深度学习模型压缩与加速综述

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 导读 本文详细介绍了4种主流的压缩与加速技术:结构优化.剪枝.量化 ...

  2. 深度学习模型压缩与加速技术(三):低秩分解

    目录 总结 低秩分解 定义 特点 1.二元分解 2.多元分解 参考文献 深度学习模型的压缩和加速是指利用神经网络参数的冗余性和网络结构的冗余性精简模型,在不影响任务完成度的情况下,得到参数量更少.结构 ...

  3. 深度学习模型压缩与加速技术(二):参数量化

    目录 总结 参数量化 参数量化定义 参数量化特点 1.二值化 二值化权重 二值化权重与激活函数 2.三值化 3.聚类量化 4.混合位宽 手工固定 自主确定 训练技巧 参考文献 深度学习模型的压缩和加速 ...

  4. 深度学习模型压缩与加速

    深度神经网络在人工智能的应用中,包括语音识别.计算机视觉.自然语言处理等各方面,在取得巨大成功的同时,这些深度神经网络需要巨大的计算开销和内存开销,严重阻碍了资源受限下的使用.模型压缩是对已经训练好的 ...

  5. 深度学习模型压缩与加速技术(七):混合方式

    目录 总结 混合方式 定义 特点 1.组合参数剪枝和参数量化 2.组合参数剪枝和参数共享 3.组合参数量化和知识蒸馏 参考文献 深度学习模型的压缩和加速是指利用神经网络参数的冗余性和网络结构的冗余性精 ...

  6. 一文看懂深度学习模型压缩和加速

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:opencv学堂 1 前言 近年来深度学习模型在计算机视 ...

  7. 腾讯 AI Lab 正式开源PocketFlow自动化深度学习模型压缩与加速框架

    11月1日,腾讯AI Lab在南京举办的腾讯全球合作伙伴论坛上宣布正式开源"PocketFlow"项目, 该项目是一个自动化深度学习模型压缩与加速框架,整合多种模型压缩与加速算法并 ...

  8. 端上智能——深度学习模型压缩与加速

    摘要:随着深度学习网络规模的增大,计算复杂度随之增高,严重限制了其在手机等智能设备上的应用.如何使用深度学习来对模型进行压缩和加速,并且保持几乎一样的精度?本文将为大家详细介绍两种模型压缩算法,并展示 ...

  9. PyTorch 深度学习模型压缩开源库(含量化、剪枝、轻量化结构、BN融合)

    点击我爱计算机视觉标星,更快获取CVML新技术 本文为52CV群友666dzy666投稿,介绍了他最近开源的PyTorch模型压缩库,该库开源不到20天已经收获 219 颗星,是最近值得关注的模型压缩 ...

最新文章

  1. Nature Microbiology: 微生物数据的系统发育分析方法
  2. oracle创建过程带有编译错误,警告:创建的函数带有编译错误
  3. 初学者自学python要看什么书-学习Python可以看书籍学习吗?老男孩Python入门课程...
  4. 笔记-信息系统开发基础-软件测试-灰度测试
  5. 基于物化视图优化_CVPR2017|基于构造多视图子空间中的潜在表示解决聚类问题
  6. [QTP] 描述性编程
  7. p7zip的解压和压缩
  8. 接入amazon avs_每日新闻综述:亚马逊将互联网接入推向全球的宏伟计划
  9. 拆除指令怎么设置_快捷指令(16)朗读屏幕内容
  10. ubuntu 11.10 安装RTX 腾讯通
  11. ooffice为保护计算机,office已检测到此文件存在问题编辑此文件可能会损害您的计算机!...
  12. 梅科尔工作室苏慎臻,Django使用ORM增删改
  13. c语言(1%3c%3cn),JavaScript教程 一段鬼畜风格的JavaScript解密
  14. 解决tomcat运行报错java.lang.UnsatisfiedLinkError: apache-tomcat-7.0.37\bin\tcnative-1.dll:Can load AMD 64
  15. springboot之Actuator
  16. Stream 学习
  17. 【机器学习】R语言进行机器学习方法及实例
  18. 【直播预约】数据库OBCP认证全面升级公开课
  19. PPT个人学习笔记(二)——展示的规则
  20. HarmonyOS应用开发JSAPI—js获取相册权限调用相册图片

热门文章

  1. Spring Boot启动过程(二)
  2. HDU 5729 Rigid Frameworks(连通性DP)
  3. SPOJ375(树链剖分)
  4. J2EE的13种核心技术规范
  5. 你知道这些 985、211 院校的隶属吗?
  6. linux卸载欧朋浏览器,如何在Centos下安装opera浏览器
  7. 会唱歌、会弹琴,清华大学 AI 学生华智冰火了
  8. @2021高考生,用 Python 分析专业“钱景”
  9. 全栈AI工程师指南,DIY一个识别手写数字的web应用
  10. ICLR 2019高分论文抢先看,谁是第一?