分享

【紫冬报告】程健:深度神经网络加速与压缩

 徒步者的收藏 2018-05-18
CASIA

今日聚焦

中科院自动化所程健研究员从背景沿革、技术分类、发展历程、具体应用、未来趋势等多方面详细介绍2017-2018年深度神经网络加速与压缩领域的关键研究进展。


郑板桥《赠君谋父子》诗言:删繁就简三秋树,领异标新二月花”,意谓画作兰竹时要去其繁杂使之趋于简明,而针对不同意境则要发散引申、从而实现创新。在人工智能领域,深度神经网络的设计便如同绘制枝蔓繁复的兰竹,需要对其删繁就简;将其拓展至不同应用场景则如同引申意境,需要创新算法的支撑。


图片来自网络


1946年,世界上第一台通用计算机“恩尼亚克”诞生;七十余年后的今天,计算机不仅体积大为缩减,计算能力也极大提升。然而随着深度学习的崛起,计算设备可集成算法的能力边界也在不断拓展,当前我们仍面临着巨大计算量和资源消耗的压力。


深度神经网络作为目前人工智能的基石之一,其复杂性及可移植性直接影响着人工智能在生活中的应用,因此,学术界展开了深度网络加速与压缩领域的研究。


今天,来自中科院自动化所的程健研究员,将向大家介绍过去一年中深度神经网络加速与压缩方面的研究进展。(文末附上参考文献的下载链接)


  背景  

首先,我们来了解一下常用卷积神经网络的计算复杂度情况



从上表可以看出,近年来网络层数越来越多,计算复杂度越来越高。过高的计算复杂度通常要求我们使用GPU或者高性能的CPU对神经网络进行运算。实际上,在深度学习应用的过程中,我们还面临很多如移动设备、嵌入式设备这样存在计算、体积、功耗等限制的设备,而这些约束导致现有的高性能深度神经网络无法在这些设备上进行有效的计算和应用。



这给我们提出了新的挑战保持现有神经网络性能基本不变的情况下,如何大幅减小网络计算量、大幅削减网络模型存储,才能使得网络模型在资源受限的设备上高效运行。这正是我们做深度神经网络加速、压缩的基本动机。


加速与压缩技术分类简介

加速和压缩本身并不是同一件事,但通常情况下我们往往同时做加速和压缩,且二者都会给网络计算带来收益,因此我们今天把它们放在一起来讲。


网络加速与压缩技术据采用方法的不同大致可分为Low-Rank 、Pruning、Quantization、Knowledge Distillation。目前存在很多体积较小、性能不错的紧致网络,其架构设计过程中也含有很多网络加速压缩的基本思想,因此我们今天也将Compact Network Design作为网络加速和压缩方法的一种来介绍。


会议论文分布

我们对2017年和2018年目前发表在国际顶会上有关网络加速和压缩的论文做了统计。



由上图可以看出:CVPR201710篇关于网络加速和压缩的文章,CVPR2018年增加到13篇;ICLR201712篇文章,ICLR2018增加到14篇,这是两个与深度学习应用相关的主要会议。NIPSICML等相对传统、注重理论的会议也发表了多篇相关文章,其中NIPS201710篇,ICMI20174篇。简言之,在过去的一年多里,深度神经网络加速与压缩不仅在应用方面有所突破,理论方面也有所进展。


根据网络加速与压缩方法的分类来看:Low-Rank只有2篇,Pruning、Quantization则有三十多篇,Knowledge Distillation4篇,Compact CNN Design3篇。可见Pruning、Quantization是研究领域的绝对热点问题。下面分别进行简单介绍。


Low-Rank

深度网络加速和压缩的第一种方法是Low-Rank低秩分解。卷积神经网络中的主要计算量在于卷积计算,而卷积计算本质上是矩阵分析的问题,通过矩阵分析、高等数学的学习,我们知道可以通过SVD奇异值分解等矩阵分析方法来有效减少矩阵运算的计算量。


对于二维矩阵运算来说,SVD是非常好的简化方法。早期时候,微软研究院曾做过相关工作来实现网络加速。而对于高维矩阵的运算往往会涉及到Tensor分解方法来进行加速和压缩,主要是CP分解、Tucker分解、Tensor Train分解和Block Term分解,这是2015年、2016年所做的工作。


矩阵分解方法目前已经非常成熟了,因此20172018年只有两篇关于Tensor RingBlock Term分解在RNN应用的文章。为什么Low-Rank不再流行了呢?除了刚才提及的分解方法显而易见、容易实现外,另一个比较重要的原因是现在越来越多的网络采用1×1卷积,这种小的卷积很难通过矩阵分解方法来实现网络加速和压缩


2
Pruning

深度网络加速和压缩的第二种方法是Pruning简单来说就是把神经网络中的连接剪掉,这样一来整个网络的复杂度特别是网络模型的大小就会减小很多。早在ICLR2016,斯坦福大学就提出了一种称为Deep Compression的随机剪枝方法。然而随机剪枝方法对硬件非常不友好,在硬件实现的过程中往往不一定能很好地对网络起到加速和压缩的作用。后来大家想到使用成块出现的结构化PruningFilter Pruning、梯度Pruning等方法。


1) Structured Pruning

对于结构化PruningICML2017有一篇对于权重进行分析剪枝的文章。具体方法是:首先使用Group Sparsity组稀疏的方法对分组特征添加稀疏正则来修剪掉权重矩阵的一些列,然后通过Exclusive Sparsity增强不同权重之间特征的竞争力来学习更有效的filters,两者共同作用取得了很好的Pruning结果。


2) Network Slimming

我们能否对feature mapactivation也做一些pruning的工作呢?ICCV2017的一篇文章中,有人通过给每个通道channel添加一个尺度因子scaling factor,然后对这些尺度因子scaling factor添加sparsity regularization,最后根据尺度因子大小对相应的通道channels进行修剪,将一些尺度因子比较小的通道剪掉,来实现对整个网络的瘦身效果。


3) meProp

刚才所讲的都是在网络前向传播过程中所做的Pruning,那么,我们能否在网络训练的过程中加入Pruning来加快网络训练的过程呢?ICML2017有一篇文章对网络训练过程中的梯度信息做了分析,通过去掉幅值比较小的梯度来简化网络的反向传播过程,从而加快网络的训练过程。从结果来看,这种方法可以通过仅仅更新1%-4%的权重来实现和原有网络相当的效果



3
Quantization

Pruning外,还有一种研究较多的方法是Quantization量化。量化可以分为Low-Bit Quantization(低比特量化)Quantization for General Training Acceleration(总体训练加速量化)Gradient Quantization for Distributed Training(分布式训练梯度量化)


1) Low-Bit Quantization via ADMM

在量化(特别是低比特量化)实现过程中,由于量化函数的不连续性,在计算梯度的时候会产生一定困难。对此,阿里巴巴的冷聪等人把低比特量化转化成ADMM可优化的目标函数,从而由ADMM来优化。


2) Binary Weight Network via Hashing

我们实验室从另一个角度思考这个问题,使用哈希把二值权重量化,再通过哈希求解。


3) Two-Step Quantization

前面两篇文章都是对权重进行量化,那么feature map是否也可以进行量化呢?以前有人考虑过这个问题,将权重和feature map一起进行量化,但在实际过程中非常难以收敛。我们实验室在CVPR2018上提出一个方法,受两步哈希法的启发,将量化分为两步,第一步先对feature map进行量化,第二步再对权重量化,从而能够同时进行很好的量化


4) Flexpoint

刚才的量化都是在网络inference的过程中,其实量化也可以在训练过程中使用,这是英特尔在NIPS2017提出的Flexpoint方法。我们知道在32位浮点和16位浮点存储的时候,第一位是符号位,中间是指数位,后面是尾数。他们对此提出了把前面的指数项共享的方法,这样可以把浮点运算转化为尾数的整数定点运算,从而加速网络训练。



3
Gradient Quantization

在很多深度学习训练过程中,为了让训练更快,往往会用到分布式计算;而分布式计算过程中有一个很大的问题:每一个分布式服务器都和中心服务器节点有大量的梯度信息传输过程,从而造成了带宽限制。这篇文章采取把要传输的梯度信息量化为三值的方法来有效加速分布式计算


4
Knowledge Distillation


这方面早期有两个工作,Knowledge Distillation最早由Hinton2015年提出,随后Romero提出了FitNets。在Knowledge Distillation中有两个关键的问题,一是如何定义知识,二是使用什么损失函数来度量student网络和teacher 网络之间的相似度。


这里主要介绍2017年的两个相关工作。


一是FSP方法它实际上将原始网络中feature map之间的相关度作为知识transferstudent network中,同时使用了L2损失函数。



另一篇ICLR2017的文章在feature map中定义了attention,使用了三种不同的定义方法,将attention作为知识transferstudent network中。



下面是几种主流方法在知识定义和损失函数选择方面的对比


紧致网络设计

我们刚才讲到的几种网络加速和压缩方法都是在原有非常复杂的网络基础上,对它进行量化、剪枝,让网络规模变小、计算变快。我们可以考虑直接设计又小又快又好的网络,这就是紧致网络设计的方法。这里主要讲三个相关的工作。


1
MobileNets V1、V2

谷歌在2017年和2018年连续推出MobileNets V1MobileNets V2其中使用了depthwise1x1卷积MobileNets V1是一个在网络非常精简情况下比较高性能的网络;MobileNets V2开始于通道比较少的1×1的网络,然后映射到通道比较多的层,随后做一个depthwise,最后再通过1x1卷积将它映射回去,这样可以大幅减少1×1卷积计算量。


2
ShuffleNet

MobileNets1x1的卷积占有很大的比重,基于这样的原则,旷视科技在CVPR2018提出通过把1×1的卷积分组来减少计算的方法;由于分组后存在不同通道之间信息交流非常少的问题,他们又在卷积层之间增加channel shuffle过程进行随机扰乱,增加了不同通道之间的信息交流。这是ShuffleNet所做的工作。



3
紧致网络设计方法比较


未来发展趋势
  • 我们发现,现在绝大部分加速和压缩的方法都需要有一个fine-tuning的过程,这个过程需要有一定量的含有标签的原始训练样本,这在实际应用过程中可能会有一定的限制。未来将会有一些Non-fine-tuning或者Unsupervised Compression方法的出现。实际上现在已经有人在研究这方面的东西。


  • 加速和压缩过程中会涉及到很多参数,甚至还包含很多经验性的东西,未来能不能做到尽可能少需要、不需要经验或者参数越少越好的self-adaptive方法


  • 现在很多加速压缩方法往往都是针对分类问题,未来在目标检测、语义分割方面也会出现类似的工作。


  • 现在很多方法与硬件的结合越来越紧密,对于加速和压缩方面来说也是如此,未来二者之间的结合肯定会越来越多


  • 二值网络越来越成熟,未来研究的人会越来越多



欲了解更多详细信息,可以参考我们最近发表在FITEE 2018上的综述论文。


作者简介

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多