查看原文
其他

【AIDL专栏】纪荣嵘:深度神经网络压缩及应用

纪荣嵘 人工智能前沿讲习 2022-04-16

AIDL简介

“人工智能前沿讲习班”(AIDL)由中国人工智能学会主办,旨在短时间内集中学习某一领域的基础理论、最新进展和落地方向,并促进产、学、研相关从业人员的相互交流。对于硕士、博士、青年教师、企事业单位相关从业者,预期转行AI领域的爱好者均具有重要的意义。

2018年AIDL活动正在筹备,敬请关注获取最新消息。

导读

2016年12月,中国人工智能学会举办了第一届《人工智能前沿讲习班》,厦门大学纪荣嵘老师做了题为《深度神经网络压缩及应用》的报告。报告介绍了如何提高深度神经模型本身的效率,分析了深度神经网络压缩和加速的现实需求,着重讲了压缩和加速的方法及应用。本文根据纪荣嵘老师当日报告内容整理发布。

讲师简介

纪荣嵘,福建省“闽江学者”特聘教授,厦门大学教授,万人计划青年拔尖人才,致力于视觉内容检索与分析的研究。2014年获批国家优秀青年科学基金支持;主持中央军委科技委前沿创新重大项目,总参谋部十三五预研项目,国家自然科学基金面上项目、科技部行业专项、十三五科技部重点研发计划子课题、总装备部十二五预研子课题等。相关工作发表于SCI源期刊论文93篇,包括国际计算机视觉期刊(IJCV)、ACM 汇刊与IEEE汇刊43篇、其中JCR一区期刊11篇,中国计算机学会推荐A类国际期刊12篇,A类国际会议长文40篇,SCI他引合计近1200次,9篇论文入选ESI高被引/热点论文。


一、深度神经网络压缩领域的研究现状

深度神经网络(DNN)起源于人工神经网络(ANN),传统的ANN虽然有很多科研成果,但是距离实际应用很远。DNN是ANN的扩展,基本想法是把ANN做的更深,使模型具有更强的表现力。由于数据集成指数级别增长,并且有越来越多类似GPU的设备应用,使DNN的运算能力爆发式增长,得以广泛应用。

为了挖掘模型潜力,模型被做得更深(如从VGGNet的16层到ResNet的19层),网络的深度和每层节点的个数也必须增加以提高性能(如GoogleNet)。在某种意义上,DNN并不是越深越好,有些深度模型在两三千次迭代训练之后会出现梯度消失、不收敛等问题。

DNN在许多问题上取得了突破,但是有一些应用问题并未得到有效解决:

1、小样本集训练(Small training set)。DNN有上千万的参数,需要大量的样本训练,但却难以在少量样本的情况下训练模型。而小样本训练问题在现实生活中很常见。

2、非均衡样本集训练(Biased training distribution)。大多数的模型都假设训练样本是均衡的,面对少量的、非均匀的样本,现有的训练方式就会失效。

3、在线/增量学习(Online/incremental Learning)。训练模型对于解决固定格式的数据问题是有效的,但是如果数据类别发生变化,以至于改变了整个模型结构,如何灵活应对增量的、在线的数据?

4、弱监督、非监督学习(Un/weak supervised Learning)。

5、降低深度网络复杂度(Complexity)。

随着模型深度的增加,模型参数量以及对每张图像做的计算,都会成倍增长。如果要在一个板上或者一个小小的芯片上实现应用,必须压缩模型。

二、深度神经网络压缩(DNN Compression)

主要是把大的深度模型变小,可以从三个方面入手:

1、参数并不是独特的或者惟一的,有一些参数之间可以做交换。

2、去除不必要的参数。

3、压缩两层网络之间的参数矩阵。

(一)参数量化 

2015年ICML的工作,Compressing Neura Networks With the hashing trick。把现在的参数做一次索引,之后不再保存原始参数,通过哈希码找到参数。上图可以看到,对于输入层到输出层之间的参数矩阵,不直接存储矩阵中的16个元素,而是对矩阵进行量化,例如图中量化成三个值,只存储这些值的index,把32位数字压缩成2位编码。同理,在其他层也可以进行相同的压缩。模型预测时查找哈希表,速度非常快。

这个思路简单直接,但是效果不及预期,所以又加入一个负号,一个哈希码有正负之分,进一步缩小量化误差。再把传统的权值传播转变成在哈希码0和1之间的权重传播,找到对应的规律,用相应的方式做优化和计算。 

2014年发表在ArXiv的论文,把压缩问题看成量化问题,对网络中的参数做量化。例如对参数进行二值化,参数大于0就是1,小于0就是-1,网络在全连接层部分压缩比1:32。除了简单二值化,还可以做标量量化(Scalar Quantization),给定某一层权重矩阵W,把W转换成M×N个数,之后进行K-means聚类,将其中的任意值用聚类中心index。这种方法压缩比较低,但是保留的信息会更多。还有一种方法,乘法量化(Product Quantization),给定参数W,把参数W切成s个小的矩阵,W1…Ws,对M×N矩阵,切成M×N/S,每个矩阵单独做一次量化,每个矩阵都有对应的索引表。另外还有残差量化(Residual Quantization),先量化第一次,对第一次量化的残差再做一次量化。

对比各个实验,乘法量化的结果最好。 

 (二)参数裁剪

参数裁剪,就是把所对应的网络当成一棵树,树上并不是每个连接都有用,有一些连接可以删掉,且网络性能损失最小。首先设损失函数,标示原始网络的误差跟删掉某个节点之后的误差二者之间的关系。计算每个节点的显著性(saliency,删除节点之前和之后的误差)。把所有的参数显著性计算出来并存在矩阵M中,删除显著性最小的节点,如此循环,一直到达到满意的压缩比为止。这是BMVC 2015的工作。

还有组合式的压缩算法(ICLR2016):

1、在最早的网络里面,把不相关的单元用类似于网络裁剪的方式删掉;

2、对剩下的单元做量化;

3、统计比特数分布,把权重再做一次哈夫曼编码,使高频的权重有很短的编码,低频的权重有很长的编码。

这种方式可以获得非常高的压缩比。例如可以计算出40倍、39倍、35倍、49倍的压缩比,例如把1070KB的参数压缩成27KB,将top-1 error从1.64%降到了1.58%。

(三)参数矩阵分解

2015年NIPS的文章,Tensorizing Neural Networks,对于神经网络做tensor分解。通过2ensor分解的形式,存储全连接层稠密的权重矩阵。分解之后,把矩阵A拆成子矩阵相乘的形式(低维的tensor),每一维都对应一个元素的表示,可以做很高的存储表示。

如果对大的矩阵做tensor分解,在线存储时可以把原始的大矩阵转换成线性的tensor矩阵,N1、N2、N3、N4连乘矩阵变成了k个小矩阵的连乘,大大降低了存储和计算量。

如何将张量转化成传统向量的矩阵?就是构建Index的索引表,向量可以看成是一维向量的索引,矩阵可以看成是二维向量的索引。通过构建索引表,把向量或者矩阵全部转成向量保存。通过构建向量保存,一层一层往里学,例如在每步学习的过程中采用随机下降加上反向操作,与传统方式不同的是,传统方式截取了权重里的gradient,而这里的gradient分为三部分,第一部分是原有的gradient,前一部分跟后一部分的gradient使用迭代顺序求解,分为前、中、后三个步骤,可以使用BP算法的sequencial gradient update。

之前的工作,优化目标就像在做参数的重构,但是网络不是用来重构参数的,需要重构用于最终分类层的特征;第二,每一层压缩的结果都可以往下回传,可以把所有的全连接层一起压缩,所以优化单元单层测试是有问题的。

我们在2016年做的工作,直接优化倒数第二层,也就是softmax之前层的特征,它在模型中占的比重远超重构参数的比重。第二,允许每层结果往下回传,多层做严格的压缩。通过这种方式开发新的优化学习算法——“全局最小化的压缩”,有有监督和无监督两个版本。

有监督的全局最小化压缩

目标是使压缩之后的response,接近原始的网络加入参数之后的response。为此,把结果一层一层的往下传重构的项,重构生成的上面那层误差要小。

  • 在每一层里做一个SVD,如果学出参数W来,可以估计生成的响应函数y,这是迭代的过程,可以用GSVD去解。

  • 固定生成的参数W,然后更新生成的y。在每次迭代中选最小的y替换原始的y,之后做迭代计算。

  • 把原来大的F、W拆成了对应每一层的W值。最开始使用随机初始化,初始化之后在每一层做SVD,然后将求出来的残差通过BP的方式进行传播。这个算法跑起来很慢,但是效果非常好,可以达到目前(2016年12月)为止CNN压缩完之后最好的指标。    

三、DNN的加速(DNN Acceleration)

压缩跟加速很多时候是重合的,但是重点不同。例如CNN,最慢的部分是卷积,最大的部分是全连接层,加速一般在卷积层做,压缩一般是在全连接层下做。

DNN Acceleration也是做parameter quantization,做参数的parameter pruning,做tensor decomposition,只是关注的焦点放在了卷积层。

(一)CVPR 2016论文,把CNN做量化(特别是在卷积层)。把权重矩阵分解成m个子矩阵,每个子空间做辞典去量化。测试时,输入被分解成m个子向量,每个向量在对应辞典里做量化,做出来的结果再做内积乘,之后看卷积结果。 

1、feature map。response feature map可以理解成两个部分,第一部分是空间上的部分,第二个部分是权重,可将两个向量转变成子空间里小向量的内积和,直接量化全连接层。原始的全连接层W转化成一个辞典D跟参数B,这是标准的词典学习问题,可以用随机算法去做辞典。对于卷积层,下标表示空间位置,上标表示N个子空间或者子向量,在子空间里做内积的叠加,然后扩展到空间意义上做累加,最后计算卷积层的量化表示结果。

这种方式没有考虑误差的传播,只近似了参数的量化结果,没有得到很好的量化。而且,累计误差会随着网络的叠加而增加,需要修正误差。不同层的error的correction是不同的,包含三个部分,分别是对全卷积层修正,对卷积层修正,对多层的混合修正。对于多层混合的修正,首先做单层的优化,是基于上一层优化的结果,然后采用量化后的输入结果,把上一层的量化考虑到这一层的量化里,这是CVPR 2016的文章。

(二)NIPS 2015论文,直接做二值网络。

二值网络起初做不出来,因为参数update的时候不能假设网络参数是1或者-1,否则无法做梯度传播。论文引入概率,如果当前的概率满足0-1分布,当ΣX大于1时,当前的取值是1,当ΣX小于1时,当前的取值是-1,前面的概率是p,后面的概率是1-p,使得直接做优化的二值问题成为可能,这篇论文的思路与众不同,区别在于加入概率先验,可以做离散的优化。

(三)ECCV 2016的论文XNOR-Net

这个思路是加速卷积。卷积操作分两个部分,input和weight,如果把weight做成binary的话,就可以直接压缩存储开销,如果把input做成binary的话,不仅存储开销加速,计算也会加速,因为binary和binary可以直接做异或操作。把input和weights都量化成+1、-1,不仅可以压缩,而且可以用异或操作去做加速,卷积的计算变成异或计算,就提高了计算效率。

1、把weight做成binary,用一个scale α和一个binary matrix B去逼近当前的W。

2、把input也量化到二值参数,对二值做异步操作。把真实的X×W拉成一个长向量Y,每层表示的是Xi跟Wi的计算结果,相应的H跟B相乘,也可以转化成长向量C,在向量内部做量化。

(四)ICLR 2015的论文

在卷积层做tensor decomposition,把原始的卷积拆成两个tensor相乘.另外一个分解成4个一维向量的卷积,用它去逼近三维中的卷积层。

(五)我们的工作

我们主要想把卷积层做小。前人的做法是设计紧凑的卷积核和量化权重,在卷积层做量化,做权重剪枝、做张量分解、组合式目标。如果把卷积当成是kernal运算的话,是减少kernal中的冗余信息。kernal中的信息可在统一框架下求解,这个框架包含两部分,第一部分,传统kernal内部的信息;第二部分(之前没有人做),空间部分的采样,输入信号本身是冗余的,尤其是空间冗余性,可以把空间的冗余性跟feature map冗余性融合到一个完整的框架里做加速。我们的主要贡献有3点:

1、考虑视觉输入的冗余,包括卷积核通道冗余,用tensor decomposition进行分解,不把所有的pixel放进来,只放一部分去做。

2、两个冗余信息彼此之间可以组合,把卷积核的冗余跟卷积空间计算的冗余组合起来,协同优化。

3、卷积空间的冗余是一个mask模板,可以采用不同策略,比如采用random mask或者learning based mask。

第一步,用两个小的卷积核代替原始的卷积,减少3D卷积核的通道冗余性。第二步,减少空间计算冗余,跳过不显著点的计算,提出特定的算法计算当前点的显著性。通过显著性构造一个基于学习的模板,在每个点计算saliency,留下排序靠前的30%-40%的点,过滤掉大部分的视觉数据,可以很快的过滤掉卷积层。把通道跟空间二者联合起来,去除空间和通道上的冗余信息,然后逐层优化。

在ActivityNet和GoogleNet上,我们的模型基本上是最好的。

 四、总结与展望

在深度神经网络里压缩和加速,是我们研究组最近做的重点工作。

我们与腾讯优图实验室共享技术,做合作发表,也初步应用在腾讯优图的产品中。例如,在“天天P图”中,应用于具体的跟踪跟关键点定位的模块;在超大规模数据集中,在QQ空间或者QQ直播平台中,快速过滤敏感内容。技术在高加速比的前提下,可以节约资源,带来很大的经济效益。

厦门大学媒体分析与计算实验室是我2013年回国之后建立的,现有科研人员包括工程师、秘书约十余人,教师偏少,我们现在有一些合作,也有一些大的项目,参与了一些国家重点计划,欢迎大家来实验室参观。

Q&A

提问:目前这些网络压缩算法能得到多大的加速比?   

纪荣嵘:这取决于可承受的性能损失。例如在ImageNet上,top-1 error损失上升100%的情况下可能6—8倍,但是如果不要求所有类别的top-1 error,只看特定方面的performance,加速比可以达到很大很大。极端的情况,大概600MB的模型到20MB,是30倍左右的加速。

提问:设计一个比较小、比较合适的网络,或在一个成熟网络上做压缩,您觉得哪种方式更实用?

纪荣嵘:这是两条路,第一条路是影子网络,这个网络很小,只要能模仿出大网络的处理就行,但是泛化能力会很差。另外一个,把大网络压小,这个是现在大家都在做的事情,因为前面那条路已经被证明基本走不通。

提问:目前深度学习发展特别快,每年都有新的算法出现,以后是否会出现一个模型本身就很小,因此就不用压缩了?

纪荣嵘:例如ResNet,这个模型很小,但不适用于所有场景。图像的解析、边缘检测就不适用Resnet。

提问:你的计算用了低秩分解,它本身就是一个没有完全解决的数据问题,如何既保证精度又保证时间复杂度?

纪荣嵘:时间复杂度本身也没有保证,只能说实验效果还可以,就是数字上还可以。


感谢AIDL志愿者王嘉豪协助整理!

志愿者持续招募中,有意者联系微信号“AIDL小助手(ID:must-tech)”




历史文章推荐:

中科院自动化所王亮研究员:深度学习与视觉计算

UCLA朱松纯:A Cognitive Architecture for Human-Machine Teaming

Rutgers大学熊辉教授:《易经》如何指导我们做人工智能?

UCLA朱松纯: 正本清源·初探计算机视觉的三个源头、兼谈人工智能

[AIDL1][附PPT]山世光:从人脸识别看深度学习对计算机视觉的推动及挑战





您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存