程健作者

深度学习高效计算与处理器设计

编者按:“夫因朴生文,因拙生巧,相因相生,以至今日。”在人工智能领域,机器学习研究与芯片行业的发展,即是一个相因相生的过程。 自第一个深度网络提出,深度学习历经几次寒冬,直至近年,才真正带来一波AI应用的浪潮,这很大程度上归功于GPU处理芯片的发展。与此同时,由于AI应用场景的多元化,深度学习在端侧的应用需求日益迫切,也促使芯片行业开展面向深度学习的专用芯片设计。如果能够将深度算法与芯片设计相结合,将大大拓展AI的应用边界,真正将智能从云端落地。 本文中,来自中科院自动化所的程健研究员,将带着大家一方面探索如何将深度学习高效化,另一方面讨论如何针对深度算法来设计专用处理芯片。 文末,提供文中提到参考文献的下载链接。

上图是本次汇报的大纲,主要从深度学习发展现状、面临的挑战、神经网络加速算法设计、深度学习芯片设计和对未来的展望五个方面来展开。

首先我们来看一下深度学习的发展现状。毋庸置疑的是深度学习目前在各个领域都取得了一些突破性的进展,上图展示了深度学习目前广泛应用的领域。

深度学习近年来取得的长足发展离不开三个方面,上图展示了其不可或缺的三个要素。一是随着互联网的发展产生的大数据,二是游戏行业的发展促使的如GPU计算资源的迅速发展,三是近年来研究者们对于深度学习模型的研究。在目前的情况下,给定一个应用场景,我们可以使用大量的数据和计算资源搭建非常深的网络模型来达到比较高的性能。然而在实际应用中,这些复杂网络由于需要很高的计算量难以很好地部署到设备上以满足实际应用的需求,所以如何减少深度神经网络计算量,成为深度学习领域中的研究热点。

另一方面,面向深度学习设计的芯片也受到了越来越多的关注。目前一些通用的芯片如CPU不能很好地适应神经网络这种计算量非常密集的操作,而计算能力强大的GPU由于其价格和功耗因素很难在大量终端设备上部署。所以如何设计一个面向深度学习的专用芯片达到速度和功耗的要求是目前比较火热的研究方向。

虽然现在对神经网络模型设计和深度学习芯片设计的研究很多,但依旧面临很多挑战。

面临的挑战之一是越来越复杂的网络模型,上图展示了近年来主流网络模型的参数和计算量等信息。可以看出随着网络规模越来越大,网络结构越来越复杂,由此带来的越来越大的计算量会是一个挑战。

面临的挑战之二是深度学习复杂多变的应用场景,主要包括在移动设备上算不好、穿戴设备上算不了、数据中心算不起三个方面。由于移动设备和可穿戴设备本身硬件比较小,允许运行的计算量非常有限,在面临非常复杂多变的应用场景的时候,往往不能满足实际需求。而目前存在的一些移动中心的计算由于其代价昂贵使得大多数人只能望而却步。

面临的挑战之三是近年来摩尔定理随着时间推移的失效,不能像以前一样仅仅依靠在硬件上堆叠晶体管来实现物理层面的性能提升。

目前深度学习面临的三个挑战促使我们从两个方面去思考,一是网络模型本身优化的问题,二是设计面向深度学习专用芯片来实现神经网络的高效计算。下面分别从这两个方面进行阐述。

深度学习模型的优化计算方面,包括一些最近几年研究的工作,上图展示了三种方式,下面主要列出了一些比较适合芯片的神经网络加速计算的方法。


首先对于神经网络大部分的计算,无论是卷积层还是全连接层都可以转换成矩阵乘的基础操作,上图展示了这个过程,所以对矩阵乘进行加速的方法都可以引入到神经网络的加速中来,包括低秩分解、网络稀疏化、低精度表示等方法。

上图展示了低秩分解的基本思想,将原来大的权重矩阵分解成多个小的矩阵,右边的小矩阵的计算量都比原来大矩阵的计算量要小,这是低秩分解的基本出发点。

低秩分解有很多方法,最基本的是奇异值分解SVD。上图是微软在2016年的工作,将卷积核矩阵先做成一个二维的矩阵,再做SVD分解。上图右侧相当于用一个R的卷积核做卷积,再对R的特征映射做深入的操作。从上面可以看到,虽然这个R的秩非常小,但是输入的通道S还是非常大的。

为了解决SVD分解过程中通道S比较大的问题,我们从另一个角度出发,沿着输入的方向对S做降维操作,这就是上图展示的Tucker分解的思想。具体操作过程是:将原来的卷积,首先在S维度上做一个低维的表达,再做一个正常的3×3的卷积,最后再做一个升维的操作。

在SVD分解和Tucker分解之后的一些工作主要是做了更进一步的分解。上图展示了使用微调的CP分解加速神经网络的方法。在原来的四维张量上,在每个维度上都做类似1×1的卷积,转化为第二行的形式,在每一个维度上都用很小的卷积核去做卷积。在空间维度上,大部分都是3×3的卷积,所以空间的维度很小,可以转化成第三行的形式,在输入和输出通道上做低维分解,但是在空间维度上不做分解,类似于MobileNet。

上图展示了我们在2016年的工作,结合了上述两种分解方法各自的优势。首先把输入参数降维,然后在第二个卷积的时候,做分组操作,这样可以降低第二个3×3卷积的计算量,最后再做升维操作。另一方面由于分组是分块卷积,它是有结构的稀疏,所以在实际中可以达到非常高的加速,我们使用VGG网络在手机上的实验可以达到5-6倍的实际加速效果。

第二个方面是网络的剪枝,基本思想是删除卷积层中一些不重要的连接。

上图展示了在NIP2015上提出的非常经典的三阶段剪枝的方法。首先训练一个全精度网络,随后删除一些不重要的节点,后面再去训练权重。这种非结构化的剪枝的方法,虽然它的理论计算量可以压缩到很低,但是收益是非常低的,比如在现在的CPU或者GPU框架下很难达到非常高的加速效果。所以下面这种结构化的剪枝技术越来越多。

从去年的ICCV就有大量基于channel sparsity的工作。上面是其中的一个示意图,相当于对每一个feature map定义其重要性,把不重要的给删除掉,这样产生的稀疏就是有规则的,我们可以达到非常高的实际加速效果。

第三个方面是低比特量化,上图展示了具体操作方法。目前的低比特量化方法和上面提到的低秩分解、网络剪枝这两种方法是可结合的。左侧是不同的比特数在计算机上的存储方式,右侧是不同操作的功耗。可以看出来低比特的功耗远远小于高比特浮点数操作的功耗。

上图是在定点表示里面最基本的方法:BNN和BWN。在网络进行计算的过程中,可以使用定点的数据进行计算,由于是定点计算,实际上是不可导的,于是提出使用straight-through方法将输出的估计值直接传给输入层做梯度估计。在网络训练过程中会保存两份权值,用定点的权值做网络前向后向的计算,整个梯度累积到浮点的权值上,整个网络就可以很好地训练,后面几乎所有的量化方法都会沿用这种训练的策略。前面包括BNN这种网络在小数据集上可以达到跟全精度网络持平的精度,但是在ImageNet这种大数据集上还是表现比较差。

上图展示了ECCV2016上一篇名为XNOR-Net的工作,其思想相当于在做量化的基础上,乘了一个尺度因子,这样大大降低了量化误差。他们提出的BWN,在ImageNet上可以达到接近全精度的一个性能,这也是首次在ImageNet数据集上达到这么高精度的网络。

上图展示了阿里巴巴冷聪等人做的通过ADMM算法求解binary约束的低比特量化工作。从凸优化的角度,在第一个优化公式中,f(w)是网络的损失函数,后面会加入一项W在集合C上的loss来转化为一个优化问题。这个集合C取值只有正负1,如果W在满足约束C的时候,它的loss就是0;W在不满足约束C的时候它的loss就是正无穷。为了方便求解还引进了一个增广变量,保证W是等于G的,这样的话就可以用ADMM的方法去求解。

他们在AlexNet和ResNet上达到了比BWN更高的精度,已经很接近全精度网络的水平。

上图是我们今年通过Hashing方法做的网络权值二值化工作。第一个公式是我们最常用的哈希算法的公式,其中S表示相似性,后面是两个哈希函数之间的内积。我们在神经网络做权值量化的时候采用第二个公式,第一项表示输出的feature map,其中X代表输入的feature map,W表示量化前的权值,第二项表示量化后输出的feature map,其中B相当于量化后的权值,通过第二个公式就将网络的量化转化成类似第一个公式的Hashing方式。通过最后一行的定义,就可以用Hashing的方法来求解Binary约束。

我们做了实验,达到了比之前任何一个网络都高的精度,非常接近全精度网络的性能。

上图是我们在CVPR2017上的工作。实际中借助了矩阵分解和定点变换的优势,对原始权值矩阵直接做一个定点分解,限制分解后的权值只有+1、-1、0三个值。将网络变成三层的网络,首先是正常的3×3的卷积,对feature map做一个尺度的缩放,最后是1×1的卷积,所有的卷积的操作都有+1、-1、0。

上图是我们在ImageNet数据集上与流行的网络模型做的对比实验,可以看出我们提出的FFN与一些网络相比已经达到甚至超过全精度网络的性能;虽然与ResNet-50相比还存在一些性能上的损失,但是相比之前的方法损失已经小了很多。

下面讲述一些专门针对深度学习芯片设计的工作。

上图是2017年芯片设计两个顶会ISCA和ISSCC上与deep learning相关session情况,这两个会议上都有专门针对深度学习的讨论可以看出深度学习对芯片设计产生了巨大影响。

首先是上图中谷歌在2017年推出的的TPU,设计了矩阵基本乘法的单元,使用int8来表示,还专门针对芯片上包括权值的所有数据设计了一些缓冲区域。

上图是中科院计算所研发的寒武纪。它在思想上实际和TPU有一点相似,实际中专门针对CNN设计了一些计算单元,还对常用的一些卷积神经网络中的操作专门设计了一些指令,这样芯片可以达到452GOP/s的高速度和485Mw的低功耗。

上图是清华大学2016年在FPGA平台上使用了VGG16所做的早期工作,采用类似正常网络的计算思路,在FPGA上实现了VGG16,可以达到4.5帧每秒的速度。

上图是MIT发布的一款名为Eyeriss的芯片,把正常的3×3卷积核操作做差分运算,将每一行做一个类似的处理,在卷积核进来以后,对整个feature map扫描以后,再把数据给抛掉。

上面对3×3的卷积核的处理只是针对一行,如果并行处理三行,就是上面这张图。将三行都保存在片上,蓝色的部分相当于特征,对其使用类似于一个流水线的方式进行处理,最左边的图表示一二三,中间是三三四,右边是三四五,用这种方式把feature map在芯片上所有位置的响应都计算出来。

上面是我们2018年在DATE上的工作,我们和清华大学使用相同的板子做了VGG16。我们的出发点是这样的,由于VGG16的feature map非常大,所以在计算过程中我们不可避免地需要在内存和板子上搬数据,这会带来非常大的功耗。如果我们一次要搬这个数据的话,无论是从功耗还是速度的角度都有很大的损失。我们从算法和硬件结合的角度考虑,首先从算法上对神经网络进行分块的操作,将上面正常的卷积,分成2×2的四块,本来从A1计算B1的时候需要A2和A3的信息,现在在算法的层面把这些依赖都去掉,就可以转化成下面的这种方式。所有对B1的计算只依赖于A1,得到B1以后不需要等B2和B3的计算结果,就可以直接使用B1去计算C1,而且还可以把A1、B1、C1的操作做层之间的合并,这样计算时延非常低,并且我们在整个网络的运算过程中不需要大量的内存,从而大幅提高了神经网络的计算速度。

下面谈一谈我们能看到的对神经网络未来的展望。

1. 首先前面提到的二值化方法大多都是针对权值的二值化,对这些网络的feature map做8比特的量化,很容易达到类似于feature map是浮点数的性能。如果我们能够把feature map也做成binary的话,无论是在现有的硬件还是在专用的硬件上都可以达到更好的性能。但是性能上还有很大损失。所以如何更高效地二值化网络也是未来研究的热点。


2. 目前在训练阶段的一些量化操作都是针对测试阶段的。如果我们要设计一款有自主学习能力的芯片,则需要在训练的阶段实现量化,我们可以在芯片实际使用的时候在线更新权值,这是未来发展的一个趋势。


3. 另一个方面是不需要重新训练,或者只需要无监督训练的网络加速与压缩方法。现在的网络加速方法都是做了一些网络压缩以后还要做大量的fine-tuning操作,但是实际使用中用户给定一个网络,如果我们可以使用不需要重新训练,或者我们只是用一部分不带标签的数据就可以对这个网络进行压缩的话,这是一个非常有实用价值的研究方向。


4. 面向不同的任务,现在进行加速的方法,包括面向深度学习的芯片,大部分都是针对分类任务去做的。但是在实际应用中,分类是一个最基础的工作,而像目标检测、图像分割的应用也非常的广泛,对这些任务进行加速也是非常重要的问题。


5. 单独做神经网络或芯片架构的优化都很难做得非常好,两个方面结合起来协同优化会更好。这些就是我们能看到的一些未来的发展。

参考文献链接:

https://pan.baidu.com/s/18s9nuulNyqDNaYG4H5KdGA

密码: 58er

深度学习大讲堂
深度学习大讲堂

高质量原创内容平台,邀请学术界、工业界一线专家撰稿,致力于推送人工智能与深度学习最新技术、产品和活动信息。

入门神经网络深度学习
1
相关数据
深度学习技术

深度学习(deep learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。 深度学习是机器学习中一种基于对数据进行表征学习的算法,至今已有数种深度学习框架,如卷积神经网络和深度置信网络和递归神经网络等已被应用在计算机视觉、语音识别、自然语言处理、音频识别与生物信息学等领域并获取了极好的效果。

权重技术

线性模型中特征的系数,或深度网络中的边。训练线性模型的目标是确定每个特征的理想权重。如果权重为 0,则相应的特征对模型来说没有任何贡献。

机器学习技术

机器学习是人工智能的一个分支,是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、计算复杂性理论等多门学科。机器学习理论主要是设计和分析一些让计算机可以自动“学习”的算法。因为学习算法中涉及了大量的统计学理论,机器学习与推断统计学联系尤为密切,也被称为统计学习理论。算法设计方面,机器学习理论关注可以实现的,行之有效的学习算法。

参数技术

在数学和统计学裡,参数(英语:parameter)是使用通用变量来建立函数和变量之间关系(当这种关系很难用方程来阐述时)的一个数量。

剪枝技术

剪枝顾名思义,就是删去一些不重要的节点,来减小计算或搜索的复杂度。剪枝在很多算法中都有很好的应用,如:决策树,神经网络,搜索算法,数据库的设计等。在决策树和神经网络中,剪枝可以有效缓解过拟合问题并减小计算复杂度;在搜索算法中,可以减小搜索范围,提高搜索效率。

凸优化技术

凸优化,或叫做凸最优化,凸最小化,是数学最优化的一个子领域,研究定义于凸集中的凸函数最小化的问题。凸优化在某种意义上说较一般情形的数学最优化问题要简单,譬如在凸优化中局部最优值必定是全局最优值。凸函数的凸性使得凸分析中的有力工具在最优化问题中得以应用,如次导数等。 凸优化应用于很多学科领域,诸如自动控制系统,信号处理,通讯和网络,电子电路设计,数据分析和建模,统计学(最优化设计),以及金融。在近来运算能力提高和最优化理论发展的背景下,一般的凸优化已经接近简单的线性规划一样直捷易行。许多最优化问题都可以转化成凸优化(凸最小化)问题,例如求凹函数f最大值的问题就等同于求凸函数 -f最小值的问题。

损失函数技术

在数学优化,统计学,计量经济学,决策理论,机器学习和计算神经科学等领域,损失函数或成本函数是将一或多个变量的一个事件或值映射为可以直观地表示某种与之相关“成本”的实数的函数。

奇异值分解技术

类似于特征分解将矩阵分解成特征向量和特征值,奇异值分解(singular value decomposition, SVD)将矩阵分解为奇异向量(singular vector)和奇异值(singular value)。通过分解矩阵,我们可以发现矩阵表示成数组元素时不明显的函数性质。而相比较特征分解,奇异值分解有着更为广泛的应用,这是因为每个实数矩阵都有一个奇异值分解,但未必都有特征分解。例如,非方阵型矩阵没有特征分解,这时只能使用奇异值分解。

张量技术

张量是一个可用来表示在一些矢量、标量和其他张量之间的线性关系的多线性函数,这些线性关系的基本例子有内积、外积、线性映射以及笛卡儿积。其坐标在 维空间内,有 个分量的一种量,其中每个分量都是坐标的函数,而在坐标变换时,这些分量也依照某些规则作线性变换。称为该张量的秩或阶(与矩阵的秩和阶均无关系)。 在数学里,张量是一种几何实体,或者说广义上的“数量”。张量概念包括标量、矢量和线性算子。张量可以用坐标系统来表达,记作标量的数组,但它是定义为“不依赖于参照系的选择的”。张量在物理和工程学中很重要。例如在扩散张量成像中,表达器官对于水的在各个方向的微分透性的张量可以用来产生大脑的扫描图。工程上最重要的例子可能就是应力张量和应变张量了,它们都是二阶张量,对于一般线性材料他们之间的关系由一个四阶弹性张量来决定。

神经网络技术

(人工)神经网络是一种起源于 20 世纪 50 年代的监督式机器学习模型,那时候研究者构想了「感知器(perceptron)」的想法。这一领域的研究者通常被称为「联结主义者(Connectionist)」,因为这种模型模拟了人脑的功能。神经网络模型通常是通过反向传播算法应用梯度下降训练的。目前神经网络有两大主要类型,它们都是前馈神经网络:卷积神经网络(CNN)和循环神经网络(RNN),其中 RNN 又包含长短期记忆(LSTM)、门控循环单元(GRU)等等。深度学习是一种主要应用于神经网络帮助其取得更好结果的技术。尽管神经网络主要用于监督学习,但也有一些为无监督学习设计的变体,比如自动编码器和生成对抗网络(GAN)。

卷积神经网络技术

卷积神经网路(Convolutional Neural Network, CNN)是一种前馈神经网络,它的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型图像处理有出色表现。卷积神经网路由一个或多个卷积层和顶端的全连通层(对应经典的神经网路)组成,同时也包括关联权重和池化层(pooling layer)。这一结构使得卷积神经网路能够利用输入数据的二维结构。与其他深度学习结构相比,卷积神经网路在图像和语音识别方面能够给出更好的结果。这一模型也可以使用反向传播算法进行训练。相比较其他深度、前馈神经网路,卷积神经网路需要考量的参数更少,使之成为一种颇具吸引力的深度学习结构。 卷积网络是一种专门用于处理具有已知的、网格状拓扑的数据的神经网络。例如时间序列数据,它可以被认为是以一定时间间隔采样的一维网格,又如图像数据,其可以被认为是二维像素网格。

映射技术

映射指的是具有某种特殊结构的函数,或泛指类函数思想的范畴论中的态射。 逻辑和图论中也有一些不太常规的用法。其数学定义为:两个非空集合A与B间存在着对应关系f,而且对于A中的每一个元素x,B中总有有唯一的一个元素y与它对应,就这种对应为从A到B的映射,记作f:A→B。其中,y称为元素x在映射f下的象,记作:y=f(x)。x称为y关于映射f的原象*。*集合A中所有元素的象的集合称为映射f的值域,记作f(A)。同样的,在机器学习中,映射就是输入与输出之间的对应关系。

Alex网络技术

AlexNet是一个卷积神经网络的名字,最初是与CUDA一起使用GPU支持运行的,AlexNet是2012年ImageNet竞赛冠军获得者Alex Krizhevsky设计的。该网络达错误率大大减小了15.3%,比亚军高出10.8个百分点。AlexNet是由SuperVision组设计的,由Alex Krizhevsky, Geoffrey Hinton和Ilya Sutskever组成。

降维技术

降维算法是将 p+1 个系数的问题简化为 M+1 个系数的问题,其中 M<p。算法执行包括计算变量的 M 个不同线性组合或投射(projection)。然后这 M 个投射作为预测器通过最小二乘法拟合一个线性回归模型。两个主要的方法是主成分回归(principal component regression)和偏最小二乘法(partial least squares)。

堆叠技术

堆叠泛化是一种用于最小化一个或多个泛化器的泛化误差率的方法。它通过推导泛化器相对于所提供的学习集的偏差来发挥其作用。这个推导的过程包括:在第二层中将第一层的原始泛化器对部分学习集的猜测进行泛化,以及尝试对学习集的剩余部分进行猜测,并且输出正确的结果。当与多个泛化器一起使用时,堆叠泛化可以被看作是一个交叉验证的复杂版本,利用比交叉验证更为复杂的策略来组合各个泛化器。当与单个泛化器一起使用时,堆叠泛化是一种用于估计(然后纠正)泛化器的错误的方法,该泛化器已经在特定学习集上进行了训练并被询问了特定问题。

深度神经网络技术

深度神经网络(DNN)是深度学习的一种框架,它是一种具备至少一个隐层的神经网络。与浅层神经网络类似,深度神经网络也能够为复杂非线性系统提供建模,但多出的层次为模型提供了更高的抽象层次,因而提高了模型的能力。

推荐文章
暂无评论
暂无评论~