前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【AIDL专栏】纪荣嵘:深度神经网络压缩及应用

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

作者头像
马上科普尚尚
发布2020-05-11 14:23:32
1K0
发布2020-05-11 14:23:32
举报
文章被收录于专栏:人工智能前沿讲习

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

深度神经网络(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直播平台中,快速过滤敏感内容。技术在高加速比的前提下,可以节约资源,带来很大的经济效益。

Q&A

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

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

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

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

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

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

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-03-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 人工智能前沿讲习 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档