精华内容
下载资源
问答
  • 深度学习模型压缩技术的落地实践与创新度报告.pdf ,是非常全非常深度的报告,干货满满,非常值得学习与研究,推荐相关人员深入学习。
  • 百度“深度学习”训练营——《PaddleSlim模型压缩实践》课程的讲解文档。 百度“深度学习”训练营——《PaddleSlim模型压缩实践》课程的讲解文档。 百度“深度学习”训练营——《PaddleSlim模型压缩实践》课程的讲解...
  • 自己整理的模型压缩综述类论文合集自己整理的模型压缩综述类论文合集自己整理的模型压缩综述类论文合集自己整理的模型压缩综述类论文合集自己整理的模型压缩综述类论文合集自己整理的模型压缩综述类论文合集自己整理...
  • 所以,卷积神经网络日益增长的深度和尺寸为深度学习在移动端的部署带来了巨大的挑战,深度学习模型压缩与加速成为了学术界和工业界都重点关注的研究领域之一。分组卷积即将输入的featuremaps分成不同的组(沿channel...
  • 在这篇文章中,我们将探索从零开始训练小模型所涉及的障碍。我们将讨论为什么模型压缩有效,以及两种提高内存效率的训练方法:超参数化界限和一种能够减少或消除对事后模型压缩的需求的优化算法。
  • 很棒的深度模型压缩 深度模型压缩相关研究论文,文章,教程,库,工具等的有用列表。 当前,回购协议是附加的给定标签,即[Pytorch / TF]。 要在您常用的框架中快速找到动手的Repos,请按Ctrl + F开始 :grinning_...
  • 模型压缩方法与bert压缩的论文 ,具体讲解: [8.1 模型压缩的方法](https://blog.csdn.net/qq_43940950/article/details/116901300?spm=1001.2014.3001.5502) [8.2 知识蒸馏 讲解 意境级]...
  • 智慧物流是“互联网+”高效物流的重要内容,以智能化技术使物流具有学习、感知、思考、决策等能力,深度学习被大量用于智慧物流。本课程主要分为3个模块:
  • 所以,深度神经网络日益增长的规模为深度学习在移动端的部署带来了巨大的挑战,深度学习模型压缩与部署成为了学术界和工业界都重点关注的研究领域之一" 项目简介 micronet, a model compression and deploy lib. ...
  • DRACO模型压缩已编译

    2019-05-27 16:34:51
    编译好的draco,大家可以下载直接cmd使用,用于压缩大的模型
  • 一种基于Lasso回归与SVD融合的深度学习模型压缩方法.pdf
  • 模型压缩一-知识蒸馏

    千次阅读 2020-10-11 20:35:28
    知识蒸馏是模型压缩方法中的一个大类,是一种基于“教师-学生网络(teacher-student-network)思想”的训练方法, 其主要思想是拟合教师模型(teacher-model)的泛化性等(如输出概率、中间层特征、激活边界等),而...

    一、知识蒸馏简介

            知识蒸馏是模型压缩方法中的一个大类,是一种基于“教师-学生网络(teacher-student-network)思想”的训练方法, 其主要思想是拟合教师模型(teacher-model)的泛化性等(如输出概率、中间层特征、激活边界等),而不是一个简简单单的0-1类别标签。

           这一技术的理论来自于2015年Hinton发表的一篇论文: Distilling the Knowledge in a Neural Network。知识蒸馏,英文名为Knowledge Distillation, 简称KD,顾名思义,就是将已经训练好的模型包含的知识(“Knowledge”),蒸馏(“Distill”)提取到另一个模型里面去(通常是简单的模型、学生模型)。

            知识蒸馏也可以看成是迁移学习的特例,工业界应用得比较广泛的是将BERT模型蒸馏到较少层的transformer, 或者LSTM、CNN等普通模型。BERT模型由于其强大的特征抽取能力,在很多NLP任务上能够达到soft-state-art的效果。 尽管如此,BERT还是有着超参数量大、占用空间大、占用计算资源大、推理时间长等缺点,即便是大公司等也不能随心所欲地使用。 因此,一个简单的想法便是通过BERT等获取一个简单、但性能更好地轻量级算法模型,知识蒸馏无疑是一种有效的方法。 巨大的BERT在很多业务场景下的线上inference都存在很大的性能瓶颈,于是就有了知识蒸馏的用武之地。

            常见的使用方式是离线fintune BERT模型,训练一个离线指标明显优于小模型的模型, 然后用fintue好的BERT模型作为指导蒸馏一个小的模型,也可以看做是一个muti-task的训练任务。 最后上线用小模型即可,从而获得性能和效果双赢的局面。

     

     

    二、知识蒸馏开山之作

            知识蒸馏的开山之作是Hinton于2015年提出的论文: Distilling the Knowledge in a Neural Network,旨在把一个大模型或者多个模型ensemble学到的知识迁移到另一个轻量级单模型上,方便部署。简单的说就是用新的小模型去学习大模型的预测结果,改变一下目标函数。

            为什么蒸馏可以work?好模型的目标不是拟合训练数据,而是学习如何泛化到新的数据。所以蒸馏的目标是让student学习到teacher的泛化能力,理论上得到的结果会比单纯拟合训练数据的student要好。另外,对于分类任务,如果soft targets的熵比hard targets高,那显然student会学习到更多的信息。

            其soft targets学习(重点是温度)的主要公式(即softmax前除以一个整数T【一般在1-100间】)是:

                               

                              

                              

            注意:      

                    1. 很简单的方法,即预测标签概率 除以 T,真实标签概率 除以 T,最终loss结果需要 乘以 T的平方。

                    2. 自己实验中,更适用于半监督学习,以及均衡的、简单的分类问题等。

     

    三、知识蒸馏思维导图

            模型蒸馏的开山之作,其基本思路是让student-model学习teacher-model的输出概率分布,其主要是对输出目标的学习(如分类类别的概率分布)。

           之后,陆续出现从teacher-model的中间层学习其特征feature的论文,主要是图像吧,这样可以学习到更加丰富的信息。

           接着,出现了从teachea-model的激活边界进行学习的论文。

           再然后,出现了student-model自学的论文,主要还是对数据集的操作,batch-size内数据的综合,数据增强等。

           最后一个,是利用对抗神经网络的经验,将student模型看成生成模型,teachea-model看成判断模型......

           借用别人的一张思维导图说明:

     

    四、BERT模型蒸馏到简单网络、Tranformers

            BERT蒸馏一般有两种方式,一种是BERT蒸馏到较少网络层的transformers,另外一种是BERT蒸馏到TextCNN、TextRNN等简单网络。

            这里我们介绍一篇BERT蒸馏到BILSTM的论文:

                    Distilling Task-Specific Knowledge from BERT into Simple Neural Networks

                    论文的关键点在于:

                           1. 适用于少量标注、大批量无标签的数据集,也就是冷启动问题;

                           2. 同知识蒸馏的开山之作,该论文还是两阶段蒸馏;

                           3. 损失函数使用的是常规loss + 均方误差loss;

                           4. 使用[MASK]、N-GRAM等数据增强技术等。

              再介绍一篇BERT蒸馏到少层的Transformer的论文:

                     TINYBERT: DISTILLING BERT FOR NATURAL LANGUAGE UNDERSTANDING

                     论文的关键点在于:

                             1、还是两阶段模型蒸馏,teacher-model到student-model层数有一个映射;

                             2、基于注意力的蒸馏和基于隐状态的蒸馏、基于Embedding的蒸馏;

                             3、MSE-loss损失函数,3个loss相加

                自己实验效果:

                        1. 某任务二分类(有提升):

                                最终 (21 epoch) : mean-P    R       F

                                原始text-cnn    0.961     0.960   0.96

                                蒸馏text-cnn    0.97      0.97    0.97

                                原始Bert-base   0.98      0.98    0.98

                          2. 某任务11分类(长尾问题,效果不好)

                               最终 (21 epoch) :mean-P    R       F

                               原始text-cnn   0.901     0.872    0.879

                               蒸馏text-cnn   0.713     0.766    0.738

                          3. 某任务90分类(长尾问题,效果不好)

                               最终(21 epoch) mean-P    R       F

                               原始text-cnn   0.819     0.8      0.809

                               蒸馏text-cnn   0.696     0.593    0.64  (样本最多的类别不能拟合)

                               原生Bert-base 0.85      0.842    0.846

                         总结:BERT蒸馏到Text-CNN,Bi-LSTM等简单模型,并不适合完全有监督分类的任务,

                                    最好还是BERT蒸馏到较少层数的transforerm比较好。

     

    五、TextBrewer

    5.1 概述:

            TextBrewer科大讯飞开源的一个基于PyTorch的、为实现NLP中的**知识蒸馏**任务而设计的工具包,融合并改进了NLP和CV中的多种知识蒸馏技术,提供便捷快速的知识蒸馏框架,用于以较低的性能损失压缩神经网络模型的大小,提升模型的推理速度,减少内存占用。

    5.2 主要特点:

    **TextBrewer** 为NLP中的知识蒸馏任务设计,融合了多种知识蒸馏技术,提供方便快捷的知识蒸馏框架,主要特点有:

    * 模型无关:适用于多种模型结构(主要面向**Transfomer**结构)

    * 方便灵活:可自由组合多种蒸馏方法;可方便增加自定义损失等模块

    * 非侵入式:无需对教师与学生模型本身结构进行修改

    * 支持典型的NLP任务:文本分类、阅读理解、序列标注等

    5.3 支持的知识蒸馏技术:

    * 软标签与硬标签混合训练

    * 动态损失权重调整与蒸馏温度调整

    * 多种蒸馏损失函数: hidden states MSE, attention-based loss, neuron selectivity transfer

    * 任意构建中间层特征匹配方案

    * 多教师知识蒸馏

     

    5.4 自己实验:

    某任务90分类数据集,ERNIE【一次推理0.1s】蒸馏到3层transofrmers【一次推理0.02s】

    Ernie转Transformer(T3) 蒸馏实验(teacher-epochs-21, student-epochs-48)

    lr    batch_size     loss     T    dropout  Mean-P    R       F

    ernie:

    5e-5    16         bce     1      0.1    0.856    0.871   0.863

    蒸馏:

    5e-5    16        0.9-kl    1     0.1     0.818    0.818    0.818  (3 - layer)

    原生transformers-3:

    5e-5    16         bce     1      0.1    0.741    0.768    0.754   (3 - layer)

    原始text-cnn  

    1e-3     16         bce                      0.819     0.8      0.809

     

    总结:TextBrewer还可以,BERT蒸馏到较少层数的transforerm对于简单的全监督分类还是有一定效果的。

     

     

    希望对你有所帮助!

     

     

     

     

     

     

     

     

    展开全文
  • 机器学习9 -- 模型压缩和加速

    万次阅读 2020-09-09 19:32:06
    近年来深度学习模型在计算机视觉、自然语言处理、搜索推荐广告等各种领域,不断刷新传统模型性能,并得到了广泛应用。随着移动端设备计算能力的不断提升,移动端AI落地也成为了可能。相比于服务端,移动端模型的优势...

    1 背景

    近年来深度学习模型在计算机视觉、自然语言处理、搜索推荐广告等各种领域,不断刷新传统模型性能,并得到了广泛应用。随着移动端设备计算能力的不断提升,移动端AI落地也成为了可能。相比于服务端,移动端模型的优势有:

    1. 减轻服务端计算压力,并利用云端一体化实现负载均衡。特别是在双11等大促场景,服务端需要部署很多高性能机器,才能应对用户流量洪峰。平时用户访问又没那么集中,存在巨大的流量不均衡问题。直接将模型部署到移动端,并在置信度较高情况下直接返回结果,而不需要请求服务端,可以大大节省服务端计算资源。同时在大促期间降低置信度阈值,平时又调高,可以充分实现云端一体负载均衡。
    2. 实时性好,响应速度快。在feed流推荐和物体实时检测等场景,需要根据用户数据的变化,进行实时计算推理。如果是采用服务端方案,则响应速度得不到保障,且易造成请求过于密集的问题。利用端计算能力,则可以实现实时计算。
    3. 稳定性高,可靠性好。在断网或者弱网情况下,请求服务端会出现失败。而采用端计算,则不会出现这种情况。在无人车和自动驾驶等可靠性要求很高的场景下,这一点尤为关键,可以保证在隧道、山区等场景下仍能稳定运行。
    4. 安全性高,用户隐私保护好。由于直接在端上做推理,不需要将用户数据传输到服务端,免去了网络通信中用户隐私泄露风险,也规避了服务端隐私泄露问题

    移动端部署深度学习模型也有很大的挑战。主要表现在,移动端等嵌入式设备,在计算能力、存储资源、电池电量等方面均是受限的。故移动端模型必须满足模型尺寸小计算复杂度低电池耗电量低下发更新部署灵活等条件。因此模型压缩和加速就成为了目前移动端AI的一个热门话题。

    模型压缩和加速不仅仅可以提升移动端模型性能,在服务端也可以大大加快推理响应速度,并减少服务器资源消耗,大大降低成本。结合移动端AI模型和服务端模型,实现云端一体化,是目前越来越广泛采用的方案。

    模型压缩和加速是两个不同的话题,有时候压缩并不一定能带来加速的效果,有时候又是相辅相成的。压缩重点在于减少网络参数量,加速则侧重在降低计算复杂度、提升并行能力等。模型压缩和加速是一个很大的命题,可以从多个角度优化。总体来看,个人认为主要分为三个层次:

    1. 算法应用层压缩加速。这个维度主要在算法应用层,也是大多数算法工程师的工作范畴。主要包括结构优化(如矩阵分解、分组卷积、小卷积核等)、量化与定点化、模型剪枝、模型蒸馏等。
    2. 框架层加速。这个维度主要在算法框架层,比如tf-lite、NCNN、MNN等。主要包括编译优化、缓存优化、稀疏存储和计算、NEON指令应用、算子优化等
    3. 硬件层加速。这个维度主要在AI硬件芯片层,目前有GPU、FPGA、ASIC等多种方案,各种TPU、NPU就是ASIC这种方案,通过专门为深度学习进行芯片定制,大大加速模型运行速度。

     

    2 算法层压缩加速

    2.1 结构优化

    2.1.1 矩阵分解

    将M x N的矩阵分解为M x K + K x N,只要让K<<M 且 K << N,就可以大大降低模型体积。比如在ALBERT的embedding层,就做了矩阵分解的优化。如下图
     

    矩阵分解示例



    其中M为词表长度,也就是vocab_size,典型值为21128。N为隐层大小,典型值为1024,也就是hidden_size。K为我们设置的低维词嵌入空间,可以设置为128。

    1. 分解前:矩阵参数量为 (M * N)
    2. 分解后:参数量为 (MK + KN)
    3. 压缩量:(M * N) / (MK + KN), 由于M远大于N,故可近似为 N / k, 当N=2014,k=128时,可以压缩8倍

     

    2.1.2 权值共享

    相对于DNN全连接参数量过大的问题,CNN提出了局部感受野和权值共享的概念。在NLP中同样也有类似应用的场景。比如ALBert中,12层共用同一套参数,包括multi-head self attention和feed-forward,从而使得参数量降低到原来的1/12。这个方案对于模型压缩作用很大,但对于推理加速则收效甚微。因为共享权值并没有带来计算量的减少。

     

    2.1.3 分组卷积

    在视觉模型中应用较为广泛,比如shuffleNet,mobileNet等。我们以mobileNet为例。对于常规的M输入通道,N输出通道,dk x dk的kernel size的卷积,需要参数量为 M x N x dk x dk。这是因为每个输入通道,都会抽取N种特征(对应输出通道数),不同的输入通道需要不同的kernel来做抽取,然后叠加起来。故M个输入通道,N个输出通道,就需要M x N个kernel了。

    mobileNet对常规卷积做了优化,每个输入通道,仅需要一个kernel做特征提取,这叫做depth wise。如此M个通道可得到M个feature map。但我们想要的是N通道输出,怎么办呢?mobileNet采用一个常规1 x 1卷积来处理这个连接,从而转化到N个输出通道上。总结下来,mobileNet利用一个dk x dk的depth wise卷积和一个1 x 1的point wise卷积来实现一个常规卷积。

    1. 分组前:参数量 (M x N x dk x dk)
    2. 分组后:参数量 (M x dk x dk + M x N x 1 x 1)
    3. 压缩量:(M x dk x dk + M x N x 1 x 1) / (M x N x dk x dk), 近似为 1/(dk x dk)。dk的常见值为3,也就是3*3卷积,故可缩小约9倍

    如下图所示

    在这里插入图片描述

    2.1.4 分解卷积

    1. 使用两个串联小卷积核来代替一个大卷积核。inceptionV2中创造性的提出了两个3x3的卷积核代替一个5x5的卷积核。在效果相同的情况下,参数量仅为原先的3x3x2 / 5x5 = 18/25
    2. 使用两个并联的非对称卷积核来代替一个正常卷积核。inceptionV3中将一个7x7的卷积拆分成了一个1x7和一个7x1, 卷积效果相同的情况下,大大减少了参数量,同时还提高了卷积的多样性。

     

    2.1.5 其他

    1. 全局平均池化代替全连接层。这个才是大杀器!AlexNet和VGGNet中,全连接层几乎占据了90%的参数量。inceptionV1创造性的使用全局平均池化来代替最后的全连接层,使得其在网络结构更深的情况下(22层,AlexNet仅8层),参数量只有500万,仅为AlexNet的1/12
    2. 1x1卷积核的使用。1x1的卷积核可以说是性价比最高的卷积了,没有之一。它在参数量为1的情况下,同样能够提供线性变换,relu激活,输入输出channel变换等功能。VGGNet创造性的提出了1x1的卷积核
    3. 使用小卷积核来代替大卷积核。VGGNet全部使用3x3的小卷积核,来代替AlexNet中11x11和5x5等大卷积核。小卷积核虽然参数量较少,但也会带来特征面积捕获过小的问题。inception net认为越往后的卷积层,应该捕获更多更高阶的抽象特征。因此它在靠后的卷积层中使用的5x5等大面积的卷积核的比率较高,而在前面几层卷积中,更多使用的是1x1和3x3的卷积核。

     

    2.2 量化

    2.2.1 伪量化

    深度学习模型参数通常是32bit浮点型,我们能否使用16bit,8bit,甚至1bit来存储呢?答案是肯定的。常见的做法是保存模型每一层时,利用低精度来保存每一个网络参数,同时保存拉伸比例scale和零值对应的浮点数zero_point。推理阶段,利用如下公式来网络参数还原为32bit浮点:

    在这里插入图片描述

    这个过程被称为伪量化

    伪量化之所以得名,是因为存储时使用了低精度进行量化,但推理时会还原为正常高精度。为什么推理时不仍然使用低精度呢?这是因为一方面框架层有些算子只支持浮点运算,需要专门实现算子定点化才行。另一方面,高精度推理准确率相对高一些。伪量化可以实现模型压缩,但对模型加速没有多大效果。

     

    2.2.2 聚类与伪量化

    一种实现伪量化的方案是,利用k-means等聚类算法,步骤如下:

    1. 将大小相近的参数聚在一起,分为一类。
    2. 每一类计算参数的平均值,作为它们量化后对应的值。
    3. 每一类参数存储时,只存储它们的聚类索引。索引和真实值(也就是类内平均值)保存在另外一张表中
    4. 推理时,利用索引和映射表,恢复为真实值。

    过程如下图

    在这里插入图片描述


    从上可见,当只需要4个类时,我们仅需要2bit就可以实现每个参数的存储了,压缩量达到16倍。推理时通过查找表恢复为浮点值,精度损失可控。结合霍夫曼编码,可进一步优化存储空间。一般来说,当聚类数为N时,我们压缩量为 log(N))] / 32

     

    2.2.3 定点化

    与伪量化不同的是,定点化在推理时,不需要还原为浮点数。这需要框架实现算子的定点化运算支持。目前MNN、XNN等移动端AI框架中,均加入了定点化支持。

     

    2.3 剪枝

    2.3.1 剪枝流程

    剪枝归纳起来就是取其精华去其糟粕。按照剪枝粒度可分为突触剪枝神经元剪枝权重矩阵剪枝等。总体思想是,将权重矩阵中不重要的参数设置为0,结合稀疏矩阵来进行存储和计算。通常为了保证performance,需要一小步一小步地进行迭代剪枝。步子大了,容易那个啥的,大家都懂的哈。

    常见迭代剪枝流程如下图所示

    在这里插入图片描述

    1. 训练一个performance较好的大模型
    2. 评估模型中参数的重要性。常用的评估方法是,越接近0的参数越不重要。当然还有其他一些评估方法,这一块也是目前剪枝研究的热点
    3. 将不重要的参数去掉,或者说是设置为0。之后可以通过稀疏矩阵进行存储。比如只存储非零元素的index和value
    4. 训练集上微调,从而使得由于去掉了部分参数导致的performance下降能够尽量调整回来
    5. 验证模型大小和performance是否达到了预期,如果没有,则继续迭代进行。

     

    2.3.2 突触剪枝

    在这里插入图片描述

    突触剪枝剪掉神经元之间的不重要的连接。对应到权重矩阵中,相当于将某个参数设置为0。常见的做法是,按照数值大小对参数进行排序,将大小排名最后的k%置零即可,k%为压缩率。如下图

    在这里插入图片描述

     

    2.3.3 神经元剪枝

    在这里插入图片描述

    神经元剪枝则直接将某个节点直接去掉。对应到权重矩阵中,相当于某一行和某一列置零。常见做法是,计算神经元对应的一行和一列参数的平方和的根,对神经元进行重要性排序,将大小排名最后的k%置零。如下图

    在这里插入图片描述

    2.3.4 权重矩阵剪枝

    除了将权重矩阵中某些零散的参数,或者整行整列去掉外,我们能否将整个权重矩阵去掉呢?答案是肯定的,目前也有很多这方面的研究。NeurIPS 2019有篇文章,Are Sixteen Heads Really Better than One?, 深入分析了BERT多头机制中每个头到底有多大用,结果发现很多头其实没啥卵用。他在要去掉的head上,加入mask,来做每个头的重要性分析。

    作者先分析了单独去掉每层每个头,WMT任务上bleu的改变。发现,大多数head去掉后,对整体影响不大。如下图所示

    在这里插入图片描述

    然后作者分析了,每层只保留一个最重要的head后,ACC的变化。可见很多层只保留一个head,performance影响不大。如下图所示

    在这里插入图片描述

    由此可见,直接进行权重矩阵剪枝,也是可行的方案。相比突触剪枝和神经元剪枝,压缩率要大很多。

     

    2.4 蒸馏

    2.4.1 蒸馏流程

    蒸馏本质是student对teacher的拟合,从teacher中汲取养分,学到知识,不仅仅可以用到模型压缩和加速中。蒸馏常见流程如下图所示
    在这里插入图片描述

    1. 老师和学生可以是不同的网络结构,比如BERT蒸馏到BiLSTM网络。但一般相似网络结构,蒸馏效果会更好。
    2. 总体loss为 soft_label_loss + hard_label_loss。soft_label_loss可以用KL散度或MSE拟合
    3. soft label为teacher模型的要拟合的对象。可以是predic输出,也可以是embeddings, 或者hidden layer和attention分布。

    针对软标签的定义,蒸馏的方案也是百花齐放,下面分享两篇个人认为非常经典的文章。

     

    2.4.2 distillBERT

    DistilBERT, a distilled version of BERT: smaller, faster, cheaper and lighter

    distillBERT由大名鼎鼎的HuggingFace出品。主要创新点为:

    1. Teacher 12层,student 6层,每两层去掉一层。比如student第二层对应teacher第三层
    2. Loss= 5.0 x Lce + 2.0 x Lmlm + 1.0 x Lcos,
      Lce: soft_label的KL散度
      Lmlm: mask LM hard_label的交叉熵
      Lcos:hidden state的余弦相似度

    DistilBERT 比 BERT 快 60%,体积比 BERT 小 60%。在glue任务上,保留了 95% 以上的性能。在performance损失很小的情况下,带来了较大的模型压缩和加速效果。
    在这里插入图片描述

     

    2.4.3 tinyBERT

    TinyBERT: Distilling BERT for Natural Language Understanding

    总体结构

    重点来看下tinyBERT,它是由华为出品,非常值得深入研究。tinyBERT对embedding层,transformer层(包括hidden layer和attention),prediction层均进行了拟合。如下图

    在这里插入图片描述

    其中Embeddings采用MSE, Prediction采用KL散度, Transformer层的hidden layer和attention,均采用MSE。loss如下
    在这里插入图片描述
    其中m为层数。

     

    效果分析

    在这里插入图片描述

    表2: glue任务上的performance。在glue任务上,可达到bert-base的96%,几乎无损失。
    表3: tinyBERT模型大小和推理速度。缩小7.5倍加速9.4倍。压缩和加速效果十分明显。

     

    消融分析

    在这里插入图片描述

    表6:分析embedding、prediction、attention、hidden layer软标签作用,其中attention和hidden layer作用最大。这个也很好理解,transformer层本来就是整个BERT中最关键的部分。

     

    在这里插入图片描述

    表7:分析老师学生不同层对应方法的效果,uniform为隔层对应,top为全部对应老师顶部几层,bottom为全部对应老师底部几层。Uniform效果明显好很多。这个也很好理解,浅层可以捕捉低阶特征,深层可以捕捉高阶特征。全是低阶或者高阶显然不合适,我们要尽量荤素搭配。

     

    3 框架层加速

    3.1 手机端AI能力

    目前移动端AI框架也比较多,包括谷歌的tf-lite,腾讯的NCNN,阿里的MNN,百度的PaddleLite, 小米的MACE等。他们都不同程度的进行了模型压缩和加速的支持。特别是端上推理的加速。 手机端AI性能排名
    在这里插入图片描述

    3.2 端侧AI框架加速优化方法

    个人总结的主要方法如下,可能有遗漏哈,各位看官请轻拍

    1. 基于基本的C++编译器优化
      a. 打开编译器的优化选项,选择O2等加速选项
      b. 小函数内联,概率大分支优先,避免除法,查表空间换时间,函数参数不超过4个等
    2. 利用C,而不是C++,C++有不少冗余的东西
    3. 缓存优化
      a. 小块内存反复使用,提升cache命中率,尽量减少内存申请。比如上一层计算完后,接着用作下一层计算
      b. 连续访问,内存连续访问有利于一次同时取数,相近位置cache命中概率更高。比如纵向访问数组时,可以考虑转置后变为横向访问
      c. 对齐访问,比如224224的尺寸,补齐为256224,从而提高缓存命中率
      d. 缓存预取,CPU计算的时候,preload后面的数据到cache中
    4. 多线程
      a. 为循环分配线程
      b. 动态调度,某个子循环过慢的时候,调度一部分循环到其他线程中
    5. 稀疏化
      a. 稀疏索引和存储方案,采用eigen的sparseMatrix方案
    6. 内存复用和提前申请
      a. 扫描整个网络,计算每层网络内存复用的情况下,最低的内存消耗。推理刚开始的时候就提前申请好。避免推理过程中反复申请和释放内存,避免推理过程中因为内存不足而失败,复用提升内存访问效率和cache命中率。
    7. ARM NEON指令的使用,和ARM的深度融合。NEON可以单指令多取值(SIMD),感兴趣可针对学习,这一块水也很深。
    8. 手工汇编,毕竟机器编译出来的代码还是有不少冗余的。可以针对运行频次特别高的代码进行手工汇编优化。当然如果你汇编功底惊天地泣鬼神的强,也可以全方位手工汇编。
    9. 算子支持:比如支持GPU加速,支持定点化等。有时候需要重新开发端侧的算子。

     

    4 硬件层加速

    硬件层加速小编就连半瓢水都达不到了,为了保证整个方案的全面性,还是硬着头皮东施效颦下。目前AI芯片厂家也是百花齐放,谁都想插一脚,不少互联网公司也来赶集。如下图所示
    在这里插入图片描述

    AI 芯片目前三种方案。GPU目前被英伟达和AMD牢牢把控。ASIC目前最火,TPU、NPU等属于ASIC范畴。

    在这里插入图片描述

    展开全文
  • 很棒的AutoML和轻量级模型:高质量(最新)的AutoML作品和轻量级模型的列表,包括1.)神经体系结构搜索,2。)轻量级结构,3。)模型压缩,量化和加速,4。 )超参数优化,5.)自动化特征工程
  • 深度网络近年来在计算机视觉任务上不断刷新传统模型的性能,已逐渐成为研究热点.深度模型尽管性能强大,然而由于参数数量庞大、存储和计算代价高,依然难以部署在受限的硬件平台上(如移动设备).模型的参数在一定程度上...
  • 模型压缩与加速相关文献汇总
  • 自己整理的剪枝和模型压缩论文合集自己整理的剪枝和模型压缩论文合集自己整理的剪枝和模型压缩论文合集自己整理的剪枝和模型压缩论文合集自己整理的剪枝和模型压缩论文合集自己整理的剪枝和模型压缩论文合集自己整理...
  • 深度学习模型压缩方法

    千次阅读 2019-10-30 07:10:00
    向AI转型的程序员都关注了这个号????????????机器学习AI算法工程 公众号:datayx目前在深度学习领域分类两个派别,一派为学院派,研究强大、复杂的模型网络和实验方法,为了...

    640?wx_fmt=gif

    向AI转型的程序员都关注了这个号👇👇👇

    机器学习AI算法工程   公众号:datayx

    目前在深度学习领域分类两个派别,一派为学院派,研究强大、复杂的模型网络和实验方法,为了追求更高的性能;另一派为工程派,旨在将算法更稳定、高效的落地在硬件平台上,效率是其追求的目标。复杂的模型固然具有更好的性能,但是高额的存储空间、计算资源消耗是使其难以有效的应用在各硬件平台上的重要原因。

    最近正好在关注有关深度学习模型压缩的方法,发现目前已有越来越多关于模型压缩方法的研究,从理论研究到平台实现,取得了非常大的进展。

    2015年,Han发表的Deep Compression  

    (https://arxiv.org/abs/1510.00149)

    是一篇对于模型压缩方法的综述型文章,将裁剪、权值共享和量化、编码等方式运用在模型压缩上,取得了非常好的效果,作为ICLR2016的best paper,也引起了模型压缩方法研究的热潮。其实模型压缩最早可以追溯到1989年,Lecun老爷子的那篇Optimal Brain Damage(OBD)

    http://papers.nips.cc/paper/250-optimal-brain-damage.pdf

    就提出来,可以将网络中不重要的参数剔除,达到压缩尺寸的作用,想想就可怕,那时候连个深度网络都训练不出来,更没有现在这么发达的技术,Lecun就已经想好怎么做裁剪了,真是有先见之明,目前很多裁剪方案,都是基于老爷子的OBD方法。

    目前深度学习模型压缩方法的研究主要可以分为以下几个方向:

    更精细模型的设计,目前的很多网络都具有模块化的设计,在深度和宽度上都很大,这也造成了参数的冗余很多,因此有很多关于模型设计的研究,如SqueezeNet、MobileNet等,使用更加细致、高效的模型设计,能够很大程度的减少模型尺寸,并且也具有不错的性能。

    模型裁剪,结构复杂的网络具有非常好的性能,其参数也存在冗余,因此对于已训练好的模型网络,可以寻找一种有效的评判手段,将不重要的connection或者filter进行裁剪来减少模型的冗余。

    核的稀疏化,在训练过程中,对权重的更新进行诱导,使其更加稀疏,对于稀疏矩阵,可以使用更加紧致的存储方式,如CSC,但是使用稀疏矩阵操作在硬件平台上运算效率不高,容易受到带宽的影响,因此加速并不明显。

    除此之外,量化、Low-rank分解、迁移学习等方法也有很多研究,并在模型压缩中起到了非常好的效果。

    基于核的稀疏化方法

    核的稀疏化,是在训练过程中,对权重的更新加以正则项进行诱导,使其更加稀疏,使大部分的权值都为0。核的稀疏化方法分为regular和irregular,regular的稀疏化后,裁剪起来更加容易,尤其是对im2col的矩阵操作,效率更高;而irregular的稀疏化后,参数需要特定的存储方式,或者需要平台上稀疏矩阵操作库的支持,可以参考的论文有:

    Learning Structured Sparsity in Deep Neural Networks 

    论文地址

    http://papers.nips.cc/paper/6504-learning-structured-sparsity-in-deep-neural-networks.pdf

    本文作者提出了一种Structured Sparsity Learning的学习方式,能够学习一个稀疏的结构来降低计算消耗,所学到的结构性稀疏化能够有效的在硬件上进行加速。传统非结构化的随机稀疏化会带来不规则的内存访问,因此在GPU等硬件平台上无法有效的进行加速。作者在网络的目标函数上增加了group lasso的限制项,可以实现filter级与channel级以及shape级稀疏化。所有稀疏化的操作都是基于下面的loss func进行的,其中Rg为group lasso:

    640?wx_fmt=png

    由于在GEMM中将weight tensor拉成matrix的结构,因此可以通过将filter级与shape级的稀疏化进行结合来将2D矩阵的行和列稀疏化,再分别在矩阵的行和列上裁剪掉剔除全为0的值可以来降低矩阵的维度从而提升模型的运算效率。该方法是regular的方法,压缩粒度较粗,可以适用于各种现成的算法库,但是训练的收敛性和优化难度不确定。作者的源码为:https://github.com/wenwei202/caffe/tree/scnn

    Dynamic Network Surgery for Efficient DNNs 论文地址

    http://arxiv.org/abs/1608.04493

    作者提出了一种动态的模型裁剪方法,包括以下两个过程:pruning和splicing,其中pruning就是将认为不中要的weight裁掉,但是往往无法直观的判断哪些weight是否重要,因此在这里增加了一个splicing的过程,将哪些重要的被裁掉的weight再恢复回来,类似于一种外科手术的过程,将重要的结构修补回来,它的算法如下:

    640?wx_fmt=png

    作者通过在W上增加一个T来实现,T为一个2值矩阵,起到的相当于一个mask的功能,当某个位置为1时,将该位置的weight保留,为0时,裁剪。在训练过程中通过一个可学习mask将weight中真正不重要的值剔除,从而使得weight变稀疏。由于在删除一些网络的连接,会导致网络其他连接的重要性发生改变,所以通过优化最小损失函数来训练删除后的网络比较合适。

    优化问题表达如下:

    640?wx_fmt=png

    该算法采取了剪枝与嫁接相结合、训练与压缩相同步的策略完成网络压缩任务。通过网络嫁接操作的引入,避免了错误剪枝所造成的性能损失,从而在实际操作中更好地逼近网络压缩的理论极限。属于irregular的方式,但是ak和bk的值在不同的模型以及不同的层中无法确定,并且容易受到稀疏矩阵算法库以及带宽的限制。论文源码:https://github.com/yiwenguo/Dynamic-Network-Surgery

    Training Skinny Deep Neural Networks with Iterative Hard Thresholding Methods 

    论文地址

    https://arxiv.org/abs/1607.05423

    作者想通过训练一个稀疏度高的网络来降低模型的运算量,通过在网络的损失函数中增加一个关于W的L0范式可以降低W的稀疏度,但是L0范式就导致这是一个N-P难题,是一个难优化求解问题,因此作者从另一个思路来训练这个稀疏化的网络。算法的流程如下:

    640?wx_fmt=png

    先正常训练网络s1轮,然后Ok(W)表示选出W中数值最大的k个数,而将剩下的值置为0,supp(W,k)表示W中最大的k个值的序号,继续训练s2轮,仅更新非0的W,然后再将之前置为0的W放开进行更新,继续训练s1轮,这样反复直至训练完毕。同样也是对参数进行诱导的方式,边训练边裁剪,先将认为不重要的值裁掉,再通过一个restore的过程将重要却被误裁的参数恢复回来。也是属于irregular的方式,边训边裁,性能不错,压缩的力度难以保证。

    总结

    以上三篇文章都是基于核稀疏化的方法,都是在训练过程中,对参数的更新进行限制,使其趋向于稀疏,或者在训练的过程中将不重要的连接截断掉,其中第一篇文章提供了结构化的稀疏化,可以利用GEMM的矩阵操作来实现加速。第二篇文章同样是在权重更新的时候增加限制,虽然通过对权重的更新进行限制可以很好的达到稀疏化的目的,但是给训练的优化增加了难度,降低了模型的收敛性。此外第二篇和第三篇文章都是非结构化的稀疏化,容易受到稀疏矩阵算法库以及带宽的限制,这两篇文章在截断连接后还使用了一个surgery的过程,能够降低重要参数被裁剪的风险。

    基于模型裁剪的方法

    对以训练好的模型进行裁剪的方法,是目前模型压缩中使用最多的方法,通常是寻找一种有效的评判手段,来判断参数的重要性,将不重要的connection或者filter进行裁剪来减少模型的冗余。同样也分为regular和irregular的方式。这类方法最多,下面列举几篇典型的方案。

    Pruning Filters for Efficient Convnets 论文地址

    https://arxiv.org/pdf/1608.08710.pdf

    作者提出了基于量级的裁剪方式,用weight值的大小来评判其重要性,对于一个filter,其中所有weight的绝对值求和,来作为该filter的评价指标,将一层中值低的filter裁掉,可以有效的降低模型的复杂度并且不会给模型的性能带来很大的损失,算法流程如下:

    640?wx_fmt=png

    裁剪方式如下:

    640?wx_fmt=png

    作者在裁剪的时候同样会考虑每一层对裁剪的敏感程度,作者会单独裁剪每一层来看裁剪后的准确率。对于裁剪较敏感的层,作者使用更小的裁剪力度,或者跳过这些层不进行裁剪。目前这种方法是实现起来较为简单的,并且也是非常有效的,它的思路非常简单,就是认为参数越小则越不重要。

    Network Trimming: A Data-Driven Neuron Pruning Approach towards Efficient Deep Architectures

    论文地址

    https://arxiv.org/abs/1607.03250

    作者认为,在大型的深度学习网络中,大部分的神经元的激活都是趋向于零的,而这些激活为0的神经元是冗余的,将它们剔除可以大大降低模型的大小和运算量,而不会对模型的性能造成影响,于是作者定义了一个量APoZ(Average Percentage of Zeros)来衡量每一个filter中激活为0的值的数量,来作为评价一个filter是否重要的标准。APoZ定义如下:

    640?wx_fmt=png

    作者发现在VGG-16中,有631个filter的APoZ超过了90%,也就说明了网络中存在大量的冗余。作者的裁剪方式如下:

    640?wx_fmt=png

    但是作者仅在最后一个卷积层和全连接层上进行了实验,因此该方法在实际中的效果很难保证。

    An Entropy-based Pruning Method for CNN Compression 

    论文地址

    https://arxiv.org/pdf/1706.05791.pdf

    作者认为通过weight值的大小很难判定filter的重要性,通过这个来裁剪的话有可能裁掉一些有用的filter。因此作者提出了一种基于熵值的裁剪方式,利用熵值来判定filter的重要性。作者将每一层的输出通过一个Global average Pooling将feature map转换为一个长度为c(filter数量)的向量,对于n张图像可以得到一个n*c的矩阵,对于每一个filter,将它分为m个bin,统计每个bin的概率,然后计算它的熵值 利用熵值来判定filter的重要性,再对不重要的filter进行裁剪。第j个feature map熵值的计算方式如下:

    640?wx_fmt=png

    在retrain中,作者使用了这样的策略,即每裁剪完一层,通过少数几个迭代来恢复部分的性能,当所有层都裁剪完之后,再通过较多的迭代来恢复整体的性能,作者提出,在每一层裁剪过后只使用很少的训练步骤来恢复性能,能够有效的避免模型进入到局部最优。作者将自己的retrain方式与传统的finetuning方式进行比较,发现作者的方法能够有效的减少retrain的步骤,并也能达到不错的效果。

    在VGG16上作者的裁剪方式和结果如下,由于作者考虑VGG-16全连接层所占的参数量太大,因此使用GAP的方式来降低计算量:

    640?wx_fmt=png

    Designing Energy-Efficient Convolutional Neural Networks using Energy-Aware Pruning

    论文地址

    https://arxiv.org/pdf/1611.05128.pdf

    这篇文章也是今天的CVPR,作者认为以往的裁剪方法,都没有考虑到模型的带宽以及能量的消耗,因此无法从能量利用率上最大限度的裁剪模型,因此提出了一种基于能量效率的裁剪方式。作者指出一个模型中的能量消耗包含两个部分,一部分是计算的能耗,一部分是数据转移的能耗,在作者之前的一片论文中(与NVIDIA合作,Eyeriss),提出了一种估计硬件能耗的工具,能够对模型的每一层计算它们的能量消耗。然后将每一层的能量消耗从大到小排序,对能耗大的层优先进行裁剪,这样能够最大限度的降低模型的能耗,对于需要裁剪的层,根据weight的大小来选择不重要的进行裁剪,同样的作者也考虑到不正确的裁剪,因此将裁剪后模型损失最大的weight保留下来。

    640?wx_fmt=png

    每裁剪完一层后,对于该层进行locally的fine-tune,locally的fine-tune,是在每一层的filter上,使用最小二乘优化的方法来使裁剪后的filter调整到使得输出与原始输出尽可能的接近。在所有层都裁剪完毕后,再通过一个global的finetuning来恢复整体的性能。整个流程如下:

    640?wx_fmt=png

    作者从能耗的角度对层的裁剪程度进行分析,经过裁剪后,模型的能耗压缩较大:

    640?wx_fmt=png

    总结

    可以看出来,基于模型裁剪的方法很多,其思路源头都是来自于Oracle pruning 的方法,即挑选出模型中不重要的参数,将其剔除而不会对模型的效果造成太大的影响,而如何找到一个有效的对参数重要性的评价手段,在这个方法中就尤为重要,我们也可以看到,这种评价标准花样百出,各有不同,也很难判定那种方法更好。在剔除不重要的参数之后,通过一个retrain的过程来恢复模型的性能,这样就可以在保证模型性能的情况下,最大程度的压缩模型参数及运算量。目前,基于模型裁剪的方法是最为简单有效的模型压缩方式。

    我们介绍了一些在已有的深度学习模型的基础上,直接对其进行压缩的方法,包括核的稀疏化,和模型的裁剪两个方面的内容,其中核的稀疏化可能需要一些稀疏计算库的支持,其加速的效果可能受到带宽、稀疏度等很多因素的制约;而模型的裁剪方法则比较简单明了,直接在原有的模型上剔除掉不重要的filter,虽然这种压缩方式比较粗糙,但是神经网络的自适应能力很强,加上大的模型往往冗余比较多,将一些参数剔除之后,通过一些retraining的手段可以将由剔除参数而降低的性能恢复回来,因此只需要挑选一种合适的裁剪手段以及retraining方式,就能够有效的在已有模型的基础上对其进行很大程度的压缩,是目前使用最普遍的方法。然而除了这两种方法以外,本文还将为大家介绍另外两种方法:基于教师——学生网络、以及精细模型设计的方法。

    基于教师——学生网络的方法

    基于教师——学生网络的方法,属于迁移学习的一种。迁移学习也就是将一个模型的性能迁移到另一个模型上,而对于教师——学生网络,教师网络往往是一个更加复杂的网络,具有非常好的性能和泛化能力,可以用这个网络来作为一个soft target来指导另外一个更加简单的学生网络来学习,使得更加简单、参数运算量更少的学生模型也能够具有和教师网络相近的性能,也算是一种模型压缩的方式。

    Distilling the Knowledge in a Neural Network 

    论文地址

    https://arxiv.org/pdf/1503.02531.pdf

    较大、较复杂的网络虽然通常具有很好的性能,但是也存在很多的冗余信息,因此运算量以及资源的消耗都非常多。而所谓的Distilling就是将复杂网络中的有用信息提取出来迁移到一个更小的网络上,这样学习来的小网络可以具备和大的复杂网络想接近的性能效果,并且也大大的节省了计算资源。这个复杂的网络可以看成一个教师,而小的网络则可以看成是一个学生。

    640?wx_fmt=png

    这个复杂的网络是提前训练好具有很好性能的网络,学生网络的训练含有两个目标:一个是hard target,即原始的目标函数,为小模型的类别概率输出与label真值的交叉熵;另一个为soft target,为小模型的类别概率输出与大模型的类别概率输出的交叉熵,在soft target中,概率输出的公式调整如下,这样当T值很大时,可以产生一个类别概率分布较缓和的输出:

    640?wx_fmt=png

    作者认为,由于soft target具有更高的熵,它能比hard target提供更加多的信息,因此可以使用较少的数据以及较大的学习率。将hard和soft的target通过加权平均来作为学生网络的目标函数,soft target所占的权重更大一些。作者同时还指出,T值取一个中间值时,效果更好,而soft target所分配的权重应该为T^2,hard target的权重为1。这样训练得到的小模型也就具有与复杂模型近似的性能效果,但是复杂度和计算量却要小很多。

    对于distilling而言,复杂模型的作用事实上是为了提高label包含的信息量。通过这种方法,可以把模型压缩到一个非常小的规模。模型压缩对模型的准确率没有造成太大影响,而且还可以应付部分信息缺失的情况。

    Paying More Attention to Attention: Improving the Performance of Convolutional Neural Networks via Attention Transfer 

    论文地址

    https://arxiv.org/abs/1612.03928

    作者借鉴Distilling的思想,使用复杂网络中能够提供视觉相关位置信息的Attention map来监督小网络的学习,并且结合了低、中、高三个层次的特征,示意图如下:

    640?wx_fmt=png

    教师网络从三个层次的Attention Transfer对学生网络进行监督。其中三个层次对应了ResNet中三组Residual Block的输出。在其他网络中可以借鉴。这三个层次的Attention Transfer基于Activation,Activation Attention为feature map在各个通道上的值求和,基于Activation的Attention Transfer的损失函数如下:

    640?wx_fmt=png

    但是就需要两次反向传播的过程,实现起来较困难并且效果提升不明显。基于Activation的Attention Transfer效果较好,而且可以和Hinton的Distilling结合。

    目前已有基于Activation的实现源码:https://github.com/szagoruyko/attention-transfer

    基于精细模型设计的方法

    上述几种方法都是在已有的性能较好模型的基础上,在保证模型性能的前提下尽可能的降低模型的复杂度以及运算量。除此之外,还有很多工作将注意力放在更小、更高效、更精细的网络模块设计上,如SqueezeNet的fire module,ResNet的Residual module,GoogLenet的Inception Module,它们基本都是由很小的卷积(1*1和3*3)组成,不仅参数运算量小,同时还具备了很好的性能效果。

    MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications 

    论文地址

    https://arxiv.org/abs/1704.04861

    这篇论文是Google针对手机等嵌入式设备提出的一种轻量级的深层神经网络,取名为MobileNets。核心思想就是卷积核的巧妙分解,可以有效减少网络参数。所谓的卷积核分解,实际上就是将a × a × c分解成一个a × a × 1的卷积和一个1 ×1 × c的卷积,,其中a是卷积核大小,c是卷积核的通道数。其中第一个a × a × 1的卷积称为Depthwise Separable Convolutions,它对前一层输出的feature map的每一个channel单独进行a × a 的卷积来提取空间特征,然后再使用1 ×1 的卷积将多个通道的信息线性组合起来,称为Pointwise Convolutions,如下图:

    640?wx_fmt=png

    640?wx_fmt=png

    其中DK为原始卷积核的大小,DF为输入feature map的尺寸, 这样相当于将运算量降低DK^2倍左右。

    MobileNet中Depthwise实际上是通过卷积中的group来实现的,其实在后面也会发现,这些精细模型的设计都是和group有关。本文的源码:https://github.com/shicai/MobileNet-Caffe

    Aggregated Residual Transformations for Deep Neural Networks 

    论文地址

    https://arxiv.org/pdf/1611.05431.pdf

    作者提出,在传统的ResNet的基础上,以往的方法只往两个方向进行研究,一个深度,一个宽度,但是深度加深,模型训练难度更大,宽度加宽,模型复杂度更高,计算量更大,都在不同的程度上增加了资源的损耗,因此作者从一个新的维度:Cardinality(本文中应该为path的数量)来对模型进行考量,作者在ResNet的基础上提出了一种新的结构,ResNeXt:

    640?wx_fmt=png

    以上三种结构等价,因此可以通过group的形式来实现ResNeXt。其实ResNeXt和mobilenet等结构性质很相近,都是通过group的操作,在维度相同时降低复杂度,或者在复杂度相同时增加维度,然后再通过1*1的卷积将所有通道的信息再融合起来。因此全文看下来,作者的核心创新点就在于提出了 aggregrated transformations,用一种平行堆叠相同拓扑结构的blocks代替原来 ResNet 的三层卷积的block,在不明显增加参数量级的情况下提升了模型的准确率,同时由于拓扑结构相同,超参数也减少了,便于模型移植。本文的源码:https://github.com/facebookresearch/ResNeXt

    ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices 

    论文地址

    https://arxiv.org/abs/1707.01083?context=cs.CV

    作者提出,虽然MobileNet、ResNeXt等网络能够大大的降低模型的复杂度,并且也能保持不错的性能,但是1 ×1卷积的计算消耗还是比较大的,比如在ResNeXt中,一个模块中1 ×1卷积就占据了93%的运算量,而在MobileNet中更是占到了94.86%,因此作者希望在这个上面进一步降低计算量:即在1 ×1的卷积上也采用group的操作,但是本来1 ×1本来是为了整合所有通道的信息,如果使用group的操作就无法达到这个效果,因此作者就想出了一种channel shuffle的方法,如下图:

    640?wx_fmt=png

    如上图b和c,虽然对1 ×1的卷积使用了group的操作,但是在中间的feature map增加了一个channel shuffle的操作,这样每个group都可以接受到上一层不同group的feature,这样就可以很好的解决之前提到的问题,同时还降低了模型的计算量,ShuffleNet的模块如下:

    640?wx_fmt=png

    作者使用了不同的group数进行实验,发现越小的模型,group数量越多性能越好。这是因为在模型大小一样的情况下,group数量越多,feature map的channel数越多,对于小的模型,channel数量对于性能提升更加重要。

    最后作者将shufflenet的方法和mobilenet的方法进行了比较,性能似乎更胜一筹:

    640?wx_fmt=png

    小结

    本节的三篇论文都是对精细模型的设计方法,直接搭建出参数运算量小的模型,适用于嵌入式平台,基本上都是通过group的方式来实现,确实能够很大程度的将模型的计算量降到最低,尤其是最后一篇shufflenet,实际上利用了一个特征融合的思路,在一个下模型中,分为更细的模型(group),再将这些更细的模型有效的融合起来,能够充分的利用参数,而达到更好的压缩效果。

    结论

    目前关于深度学习模型压缩的方法有很多,本文从四个角度来对模型压缩的方法进行了介绍,总的来说,所列出的文章和方法都具有非常强的借鉴性,值得我们去学习,效果也较明显。其中基于核稀疏化的方法,主要是在参数更新时增加额外的惩罚项,来诱导核的稀疏化,然后就可以利用裁剪或者稀疏矩阵的相关操作来实现模型的压缩;基于模型裁剪的方法,主要是对已训练好的网络进行压缩,往往就是寻找一种更加有效的评价方式,将不重要的参数剔除,以达到模型压缩的目的,这种压缩方法实现简单,尤其是regular的方式,裁剪效率最高,但是如何寻找一个最有效的评价方式是最重要的。基于迁移学习的方法,利用一个性能好的教师网络来监督学生网络进行学习,大大降低了简单网络学习到不重要信息的比例,提高了参数的利用效率,也是目前用的较多的方法。基于精细模型设计的方法,模型本身体积小,运行速度快,性能也不错,目前小的高效模型也开始广泛运用在各种嵌入式平台中。

    总的来说,以上几种方法可以结合使用,比如说先对参数进行结构化的限制,使得参数裁剪起来更加容易,然后再选择合适的裁剪方法,考虑不同的评价标准以及裁剪策略,并在裁剪过程中充分考虑参数量、计算量、带宽等需求,以及不同硬件平台特性,在模型的性能、压缩、以及平台上的加速很好的进行权衡,才能够达到更好的效果。

    原文地址 https://blog.csdn.net/wspba/article/details/75671573

    阿里云双11大促  服务器ECS  数据库 全场1折

    活动地址

    640?wx_fmt=png

    1核2G1M,86一年,¥229三年

    2核4G3M,¥799三年

    2核8G5M,¥1399三年

    ......


    阅读过本文的人还看了以下文章:

    不断更新资源

    深度学习、机器学习、数据分析、python

     搜索公众号添加: datayx  

    640?wx_fmt=jpeg

    长按图片,识别二维码,点关注

    AI项目体验

    https://loveai.tech

    640?wx_fmt=png

    展开全文
  • 之前陆陆续续看了许多模型压缩相关的文章,自己业务中也接触过一些相关的客户,今天周末没事做,把模型压缩相关的内容整理一下做个分享。可能更多地从科普的角度去介绍,因为我也不是专业做这方面技术的研究。 首先...

    之前陆陆续续看了许多模型压缩相关的文章,自己业务中也接触过一些相关的客户,今天周末没事做,把模型压缩相关的内容整理一下做个分享。可能更多地从科普的角度去介绍,因为我也不是专业做这方面技术的研究。

    首先明确下模型压缩的概念,就是在尽可能不改变模型效果的情况下,减少模型的体积,使得模型在使用的时候有更快的速度。

    业务视角去看模型压缩的意义

     

    模型压缩这个概念貌似是最近两年突然火了起来,究其原因,是因为整个机器学习领域正在逐渐从理论派向工程派延伸。什么是理论派呢?从业务的角度看,理论派就是做一些理论验证工作,通过建模证明机器学习在哪个业务能落地。而工程派指的是如何能让机器学习应用的更高效,模型压缩就是工程派的一个重要落地方向。

    模型压缩更多地是应用到复杂的深度模型上,并且越来越受到重视,因为当模型的准确度达到一定程度后,如何用更少的硬件成本去做模型服务变的有意义。

     

    举个例子,比如用深度学习变脸这样的业务。

    假设在模型优化前,原始模型处理每个视频要30秒,那么一张GPU卡一分钟只能处理2个视频。假设APP的使用峰值是1000人同时使用,那么这家公司至少要有500张GPU卡才能满足需求,不然就会出现服务排队现象,500张卡的成本大约在3000万每年。

    如果模型压缩技术能让模型变小许多,使得每个视频处理只需要10秒,那么这个客户可能只需要150张卡就能满足业务需求,每年成本也能控制在1000万左右。省下的2000万,就是模型压缩技术的价值。

     

    模型压缩技术有哪些

     

    目前我自己了解到的的模型剪枝技术包含以下几个方向,

     

    (模型构成)

    1. 剪枝:深度学习模型可以看作是一个复杂树状结构,如果能减去一些对结果没什么影响的旁枝,就可以实现模型的减小

    2. 量化:模型由大量的浮点型权重组成,如果能用float32替代原有的float64表示,模型就近乎减小一倍的体积,量化也是最容易实现的一种压缩方式

    3. 共享权重:有点像提取公因数,假设模型的每一层都有公用的公因数,是否可以提取出来在结果处做一次运算,而不是每一层都算一次

    接下来会针对以上三点逐个介绍。

    模型剪枝

    模型的构成是由许多浮点型的神经元相连接,每一层根据神经元的权重将信息向下传递。但是有一些神经元的权重非常小,这类神经元对整个模型的加载的信息的影响也就微乎其微。如果可以把这些权重较小的神经元删减掉,既减少了模型大小,也不会对模型的效果带来大的影响。

    简单理解的话如下图所示:

    每一层把数值小的神经元去掉,但是究竟剪枝粒度维持到多大是很有讲究的,比如可以把每层最小的5个减掉,也可能只剪3个,或者每层有每层不同的策略,也可以用L1/L2正则的方式去做。

    剪多了,模型精度影响会比较大,剪少了没有效果。所以这里面需要大量的尝试和迭代,在实践中,剪枝是一个迭代的过程,这通常叫做「迭代式剪枝」(Iterative Pruning):修剪-训练-重复(Prune / Train / Repeat)。

    既然有大量的迭代验证工作,是否可以引入AutoML机制,可以通过NAS(神经网络搜索)的方式探索出剪枝候选集,然后自动的剪枝-》验证-》迭代。从NAS的角度去实现还是有许多工作可以去做,也是一个热点话题。

    模型量化

    模型的精度量化并不是简单的将高精度的权重用低精度权重表示就好了,这里面涉及到许多适配硬件的因素。先来看下神经元权重是如何在计算机里表示的。目前DL中大部分都是用32bit float类型进行计算的,bit位数的多少直接限制了数据类型能够表达的数据范围,比如float 32的数据是由1bit表示符号,8bit表示整数部,23位表示分数部组成(计算机课都学过的)。

     

    用更低位的数值类型意味着更小的数据表示范围和更稀疏的数值,量化的时候就会造成数值精度损失。比如要把float数值量化到int类型,那么首先小数部分会损失,而那些超过int类型能够表达的范围的值也会被压缩到int能够表达的最大或最小值。

     

    所以,如果要压缩模型,从float32压缩到多少变的关键,目前主流的方式是压缩到int8。压缩到int8意味着内存的节省,节约了3/4,同时也提升了计算效率,因为在GPU这样的硬件上,低位的浮点计算速度会远远高于高位浮点计算速度。

     

    So,why int 8?有相关的人士分析过,从概率分布角度去看,int8的字符长度可以较完整的覆盖大部分的模型权重值。float 32到int8的转变,只需要一个系数乘积将原有的小数部分变为整数。int 8量化效果在许多论文上可以看到,是目前最主流的模型压缩方式。

    模型共享权重

    共享权重的概念指的是模型在构建的过程中是否有些局部的信息在全局是多次出现并重复使用的,举一个卷积神经网络的例子。当CNN模型在识别以下这个图像的时候,

     

    需要卷积核去全图扫描这个图像,找出每个边缘的特点,但是这种对称图像一定存在一些形状的重复性,比如下图我框出的这些结构。

    这些重复结构意味着卷积核在计算权重的时候会有部分权重的相似性,这些相似性是全局可共享的。那么如果可以通过聚类的方式挖掘出这些可以共享的权重系数,并且以类别的方式让它们共享一些权重,就可以实现模型的压缩。

    下图表示的就是卷积核中的部分权重是有共享关系的,可以将他们分为4个种类,然后针对类别去更新权值即可。

     

    总结

    因为业务需要,最近学习和总结了这篇文章,写的很简单,有不清晰或者不正确的地方请指正。另外,从根客户接触的情况看,目前模型优化还没有特别好的自动化工具,很多方法应用到业务中都会造成大规模的模型精度损失,所以目前很多模型压缩工作需要大量人力介入和反复调试,希望日后有真正工业级别的压缩工具诞生。

     

    参考:

    1. https://blog.csdn.net/malvas/article/details/8664778

    2. https://www.cnblogs.com/arkenstone/p/10856466.html

    3. https://blog.csdn.net/weixin_38740463/article/details/90181264

    4. https://zhuanlan.zhihu.com/p/97198052

    5. https://www.zhihu.com/search?type=content&q=%E6%A8%A1%E5%9E%8B%E5%8E%8B%E7%BC%A9

    6. https://baijiahao.baidu.com/s?id=1641186698550736256&wfr=spider&for=pc

    感谢以上文章的作者们

     

    展开全文
  • 模型压缩ppt的总结,可以作为粗略的一个概述,很精炼。
  • 浅谈模型压缩

    千次阅读 2020-03-13 13:16:24
    有一个做深度学习模型部署的同学曾经提到过他目前的方向主要是模型压缩,就是对于部署在app上的模型在不影响性能的前提下如何减小模型的体量,我也会经常用Bert等transformer架构的模型,体量过大也是缺点,所以才有...
  • pytorch-模型压缩与剪枝

    万次阅读 2021-02-18 09:27:31
    PyTorch框架提供了一个方便好用的trick:开启半精度。直接可以加快运行速度、减少GPU占用,并且只有不明显的accuracy损失。 之前做硬件加速的时候,尝试过多种...注意1:这一步要放在模型载入GPU之前,即放到model..
  • 深度神经网络模型压缩

    千次阅读 2018-07-31 15:55:25
    “本文介绍的论文全面概述了深度神经网络的压缩方法,主要可分为参数修剪与共享、低秩分解、迁移/压缩卷积滤波器和知识精炼,本论文对每一类方法的性能、相关应用、优势和缺陷等进行独到的分析。”     大型...
  • 模型压缩整理2020.5.6

    千次阅读 2020-05-06 10:29:30
    AI领域最有趣的老师李宏毅:模型压缩系列讲解 模型压缩 1、剪枝的理由 不用小的network直接训练是因为小网络难以训练,泛化性不好,提取特征不好,容易卡在局部特征,有论文表明只要模型够大,就能提取全局有效的...
  • 深度学习模型压缩。这是一篇论文主要是对深度学习模型的各种压缩算法进行总结。
  • 了解用于深入学习的不同模型压缩技术的需求和特点 不管你是计算机视觉新手还是专家,你可能听说过 AlexNet 于2012年赢得了ImageNet挑战赛。这是计算机视觉发展史上的转折点,因为它表明,深度学习模型能够以...
  • 模型转换、模型压缩、模型加速工具汇总

    千次阅读 多人点赞 2019-08-18 11:20:06
    目录一、场景需求解读二、模型转化工具汇总1、模型转换工具的作用2、模型转换工具简介三、模型压缩和加速工具汇总1、模型压缩加速工具的作用2、模型压缩加速工具简介参考资料注意事项 一、场景需求解读   在现实...
  • 模型压缩概述

    千次阅读 2018-02-26 08:35:52
    CNN模型火速替代了传统人工设计(hand-crafted)特征和分类器,不仅提供了一种端到端的处理方法,还大幅度地刷新了各个图像竞赛任务的精度,更甚者超越了人眼的精度(LFW人脸识别任务)。CNN模型在不断逼近计算机...
  • 一文看懂深度学习模型压缩和加速

    千次阅读 2020-06-12 23:24:26
    模型压缩和加速不仅仅可以提升移动端模型性能,在服务端也可以大大加快推理响应速度,并减少服务器资源消耗,大大降低成本。结合移动端AI模型和服务端模型,实现云端一体化,是目前越来越广泛采用的方案。 模型压缩...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 231,795
精华内容 92,718
关键字:

模型压缩