深度神经网络发展历程全回顾:如何加速DNN运算?

深度神经网络(DNN)目前是许多现代AI应用的基础。自从DNN在语音识别和图像识别任务中展现出突破性的成果,使用DNN的应用数量呈爆炸式增加。这些DNN方法被大量应用在无人驾驶汽车,癌症检测,游戏AI等方面。在许多领域中,DNN目前的准确性已经超过人类。与早期的专家手动提取特征或制定规则不同,DNN的优越性能来自于在大量数据上使用统计学习方法,从原始数据中提取高级特征的能力,从而对输入空间进行有效的表示。

然而,DNN超高的准确性是以超高的计算复杂度为代价的。通常意义下的计算引擎,尤其是GPU,是DNN的基础。因此,能够在不牺牲准确性和增加硬件成本的前提下,提高深度神经网络的能量效率和吞吐量的方法,对于DNN在AI系统中更广泛的应用是至关重要的。研究人员目前已经更多的将关注点放在针对DNN计算开发专用的加速方法。

雷锋网(公众号:雷锋网)了解到,近日一篇名为《Efficient Processing of Deep Neural Networks: A Tutorial and Survey》的论文横空出世,这篇来自MIT的论文详细介绍了DNN高效运算的最新进展,提供了DNN的综述,以及加速DNN计算的方法。

鉴于篇幅,雷锋网主要针对论文中的如下几部分详细介绍:

  • DNN的背景,历史和应用

  • DNN的组成部分,以及常见的DNN模型

  • 简介如何使用硬件加速DNN运算

DNN的背景

人工智能与深度神经网络

深度神经网络,也被称为深度学习,是人工智能领域的重要分支,根据麦卡锡(人工智能之父)的定义,人工智能是创造像人一样的智能机械的科学工程。深度学习与人工智能的关系如图1所示:

  深度神经网络发展历程全回顾:如何加速DNN运算?               

图1:深度神经网络与人工智能的关系

人工智能领域内,一个大的子领域是机器学习,由Arthur Samuel在1959年定义为:让计算机拥有不需要明确编程即可学习的能力。这意味着创建一个程序,这个程序可以被训练去学习如何去做一些智能的行为,然后这个程序就可以自己完成任务。而传统的人工启发式方法,需要对每个新问题重新设计程序。

高效的机器学习算法的优点是显而易见的。一个机器学习算法,只需通过训练,就可以解决某一领域中每一个新问题,而不是对每个新问题特定地进行编程。

在机器学习领域,有一个部分被称作brain-inspired computation。因为人类大脑是目前学习和解决问题最好的“机器”,很自然的,人们会从中寻找机器学习的方法。尽管科学家们仍在探索大脑工作的细节,但是有一点被公认的是:神经元是大脑的主要计算单元。人类大脑平均有860亿个神经元。神经元相互连接,通过树突接受其他神经元的信号,对这些信号进行计算之后,通过轴突将信号传递给下一个神经元。一个神经元的轴突分支出来并连接到许多其他神经元的树突上,轴突分支和树突之间的连接被称为突触。据估计,人类大脑平均有1014-1015个突触。

突触的一个关键特性是它可以缩放通过它的信号大小。这个比例因子可以被称为权重(weight),普遍认为,大脑学习的方式是通过改变突触的权重实现的。因此,不同的权重导致对输入产生不同的响应。注意,学习过程是学习刺激导致的权重调整,而大脑组织(可以被认为是程序)并不改变。大脑的这个特征对机器学习算法有很好的启示。

神经网络与深度神经网络

神经元的计算是输入值的加权和这个概念启发了神经网络的研究。这些加权和对应于突触的缩放值以及神经元所接收的值的组合。此外,神经元并不仅仅是输入信号的加权和,如果是这样的话,级联的神经元的计算将是一种简单的线性代数运算。相反的是,神经元组合输入的操作似乎是一种非线性函数,只有输入达到某个阈值的时候,神经元才会生成输出。因此,通过类比,我们可以知道神经网络在输入值的加权和的基础上应用了非线性函数。

图2(a)展示了计算神经网络的示意图,图的最左边是接受数值的“输入层”。这些值被传播到中间层神经元,通常也叫做网络的“隐藏层”。通过一个或更多隐藏层的加权和最终被传播到“输出层”,将神经网络的最终结果输出给用户。

深度神经网络发展历程全回顾:如何加速DNN运算?

图2:神经网络示意图

在神经网络领域,一个子领域被称为深度学习。最初的神经网络通常只有几层的网络。而深度网络通常有更多的层数,今天的网络一般在五层以上,甚至达到一千多层。

目前在视觉应用中使用深度神经网络的解释是:将图像所有像素输入到网络的第一层之后,该层的加权和可以被解释为表示图像不同的低阶特征。随着层数的加深,这些特征被组合,从而代表更高阶的图像特征。例如,线可以被组合成形状,再进一步,可以被组合成一系列形状的集合。最后,再训练好这些信息之后,针对各个图像类别,网络给出由这些高阶特征组成各个对象的概率,即分类结果。

推理(Inference)与训练(Training)

既然DNN是机器学习算法中的一员,那么它的基本编程思想仍然是学习。DNN的学习即确定网络的权重值。通常,学习过程被称为训练网络(training)。一旦训练完成,程序可以使用由训练确定的权值进行计算,这个使用网络完成任务的操作被被称为推断(inference)。

接下来,如图3所示,我们用图像分类作为例子来展示如何训练一个深度神经网络。当我们使用一个DNN的时候,我们输入一幅图片,DNN输出一个得分向量,每一个分数对应一个物体分类;得到最高分数的分类意味着这幅图片最有可能属于这个分类。训练DNN的首要目标就是确定如何设置权重,使得正确分类的得分最高(图片所对应的正确分类在训练数据集中标出),而使其他不正确分类的得分尽可能低。理想的正确分类得分与目前的权重所计算出的得分之间的差距被称为损失函数(loss)。因此训练DNN的目标即找到一组权重,使得对一个较大规模数据集的loss最小。

深度神经网络发展历程全回顾:如何加速DNN运算?

图3:图像分类

权重(weight)的优化过程类似爬山的过程,这种方法被称为梯度下降(gradient decent)。损失函数对每个权值的梯度,即损失函数对每个权值求偏导数,被用来更新权值(例:第t到t+1次迭代:深度神经网络发展历程全回顾:如何加速DNN运算?,其中α被称为学习率(Learning rate)。梯度值表明权值应该如何变化以减小loss。这个减小loss值的过程是重复迭代进行的。

梯度可以通过反向传播(Back-Propagation)过程很高效地进行计算,loss的影响反向通过网络来计算loss是如何被每个权重影响的。

训练权重有很多种方法。前面提到的是最常见的方法,被称为监督学习,其中所有的训练样本是有标签的。无监督学习是另一种方法,其中所有训练样本都没有标签,最终目标是在数据中查找结构或聚类。半监督学习结合了两种方法,只有训练数据的一小部分被标记(例如,使用未标记的数据来定义集群边界,并使用少量的标记数据来标记集群)。最后,强化学习可以用来训练一个DNN作为一个策略网络,对策略网络给出一个输入,它可以做出一个决定,使得下一步的行动得到相应的奖励;训练这个网络的过程是使网络能够做出使奖励(即奖励函数)最大化的决策,并且训练过程必须平衡尝试新行为(Exploration)和使用已知能给予高回报的行为(Exploitation)两种方法。
用于确定权重的另一种常用方法是fine-tune,使用预先训练好的模型的权重用作初始化,然后针对新的数据集(例如,传递学习)或新的约束(例如,降低的精度)调整权重。与从随机初始化开始相比,能够更快的训练,并且有时会有更好的准确性。

DNN发展简史

  • 1940s    神经网络被提出

  • 1960s    深度神经网络被提出

  • 1989     识别手写数字的神经网络(LeNet)

  • 1990s    针对浅层网络的专用硬件被开发出(Intel ETANN)

  • 2011     基于DNN的语音识别突破(Microsoft)

  • 2012     在视觉方面,DNN代替了传统的人工提取特征的方法(AlexNet)

  • 2014+   用于DNN加速的硬件兴起(Neuflow,DianNao)

尽管神经网络在20世纪40年代就被提出了,但一直到80年代末期才有了第一个实际应用,识别手写数字的LeNet。这个系统广泛地应用在支票地数字识别上。而自2010年之后,基于DNN的应用爆炸式增长。

深度学习在2010年前后得到巨大成功主要是由三个因素导致的。首先是训练网络所需的海量信息。学习一个有效的表示需要大量的训练数据。目前Facebook每天收到超过3.5亿张图片,沃尔玛每小时产生2.5Pb的用户数据,YouTube每分钟有300小时的视频被上传。因此,云服务商和许多公司有海量的数据来训练算法。其次是充足的计算资源。半导体和计算机架构的进步提供了充足的计算能力,使得在合理的时间内训练算法成为可能。最后,算法技术的进化极大地提高了准确性并拓宽了DNN的应用范围。早期的DNN应用打开了算法发展的大门。它激发了许多深度学习框架的发展(大多数都是开源的),这使得众多研究者和从业者能够很容易的使用DNN网络。
ImageNet挑战是机器学习成功的一个很好的例子。这个挑战是涉及几个不同方向的比赛。第一个方向是图像分类,其中给定图像的算法必须识别图像中的内容,如下图所示。训练集由120万张图像组成,每张图片标有图像所含的1000个对象类别之一。然后,该算法必须准确地识别测试集中图像。

图4显示了多年来ImageNet挑战中各年最佳参赛者的表现。可以看出算法的准确性最初错误率25%以上。 2012年,多伦多大学的一个团队使用图GPU的高计算能力和深层神经网络方法,即AlexNet,将错误率降低了约10%。他们的成就导致了深度学习风格算法的流行,并不断的改进。

深度神经网络发展历程全回顾:如何加速DNN运算?

图4:Imagenet历年准确率变化

ImageNet挑战中使用深度学习方法的队伍,和使用GPU计算的参与者数量都在相应增加。2012年时,只有四位参赛队使用了GPU,而到了2014年,几乎所有参赛者都使用了GPU。这反映了从传统的计算机视觉方法到于深度学习的研究方式的完全的转变。
在2015年,ImageNet获奖作品ResNet 超过人类水平准确率(top-5错误率低于5%),将错误率降到3%以下。而目前的重点也不过多的放在准确率的提升上,而是放在其他一些更具挑战性的方向上,如对象检测和定位。这些成功显然是DNNs应用范围广泛的一个原因。

DNN的应用

目前DNN已经广泛应用到各个领域,下面列举一些DNN已经深远影响的领域,和一些未来可能产生巨大影响的领域。

  • 图像和视频    视频可能是大数据时代中最多的资源。它占据了当今互联网70%的流量。例如,世界范围内每天都会产生80亿小时的监控视频。计算机视觉需要从视频中抽取有意义的信息。DNN极大地提高了许多计算机视觉任务地准确性,例如图像分类,物体定位和检测,图像分割,和动作识别。

  • 语音和语言    DNN也极大地提高了语音识别和许多其他相关任务地准确率,例如机器翻译,自然语言处理和音频生成。

  • 医药    DNN在基因学中扮演了重要的角色,它探究了许多疾病的基因层面的原因,例如孤独症,癌症,和脊髓性肌萎缩。它同样也被应用在医学图像检测中,用来检测皮肤癌,脑癌以及乳腺癌等等。

  • 游戏    近期,许多困难的AI挑战包括游戏都被使用DNN的方法解决了。这些成功需要训练技术上的创新,以及强化学习(网络通过自身输出的结果进行反馈训练)。DNN在Atari(一种流行的家用游戏机)和围棋上,已经有了超过人类的准确度。

  • 机器人    DNN在一些机器人学的任务上同样取得了成功,例如机械臂抓取,运动规划,视觉导航,四旋翼飞行器稳定性控制以及无人驾驶汽车驾驶策略。

DNN目前已经有了很广泛的应用。我们将目光放向未来,DNN会在医药和机器人领域扮演更重要的角色。同时,也会在金融(例如交易,能源预测和风险评估),基础设施建设(例如结构安全性,交通控制),天气预报和事件检测中有更多的应用。

嵌入式与云

不同的DNN应用和过程(training vs inference)有不同的计算需求。尤其是训练过程,需要一个较大的数据集和大量计算资源来进行迭代,因此需要在云端进行计算。而推理过程可以在云端或者终端进行(例如物联网设备或移动终端)。

在DNN的许多应用中,需要推理过程在传感器附近。例如无人驾驶汽车或者无人机导航或者机器人,处理过程就必须在本地进行,因为延迟和传输的不稳定性造成的安全风险过高。然而对视频进行处理计算相当复杂。因此,能够高效分析视频的低成本硬件仍然是制约DNN应用的重要因素。能够执行DNN推理过程的嵌入式平台要有严格的能量消耗,计算和存储成本限制。这篇论文在推理过程中的计算需求方面进行了详细的介绍,感兴趣的读者可以参考文末连接进一步深入了解。

DNN组成部分与常见模型

DNN针对不同的应用有很多种形式,而流行的形式也在快速地进化,以改善准确性和高效性。据雷锋网了解,所有DNN的输入都是一系列需要被网络分析的值。这些值可以是一幅图片的像素,音频波形的幅值采样值,或者一些表示系统或游戏状态的数值。

处理输入的网络主要有两种形式:前馈(Feed Forward)或者循环(Recurrent),如图2(c)所示。在前馈网络中,所有的计算都是对前面层输出的一系列运算。最后的运算生成网络的输出,例如一个图片包含某个物体的概率值,一段音频序列包含某个单词的概率值。在这样的DNN中,网络是无记忆性的,针对同一段输入,输出总是相同的,而与网络先前的输入是无关的。

相反,循环神经网络(RNN),拥有内部记忆,允许长期的依赖影响输出。其中LSTM(Long Short Term Memory network)是RNN中很流行的一个变体。在这些网络中,一些内部中间操作生成的值会被存储在网络中,并在后面的操作中与其他输入结合,共同作为输入。

如图2(d)左部分网络,DNN可以由全连接层组成(Fully-Connected Layer,也叫做多层感知机)。在全连接层中,输出激活是所有输入激活的加权和(前后两层的神经元是全部连接在一起的)。由于临近两层的所有神经元都是相互连接的,这会导致权重参数过多,需要大量的存储空间和计算资源。不过幸运的是,在许多应用中,我们可以通过设置某些激活之间连接的权值为0来减少参数的数量,而不影响准确性。这种叫做稀疏连接层(Sparsely-Connected Layer),如图2(d)右部分网络。

为了减少权重参数,提高计算效率,我们可以更进一步,限制对输出有贡献的权值的数量。如果输出值是输入中一个固定窗口大小的函数,就可以实现结构上的稀疏性。如果每个计算每个输出时的权重都是相同的,那么就可以进一步提升效率。权值共享(weight sharing)可以极大地降低权重对存储空间的需求。

一个最流行的窗口化,权值共享的网络就是卷积神经网络(convolution neural network)。如图5(a)所示,每个输出仅仅由一小个邻域的激活的加权和计算得到。每个滤波器拥有有限的感知野(receptive field),输入中超过一定距离的值的权重都被设置为零。同时,对于每个输出,同样的权值是被共享的,也就是说滤波器有空间不变性。

深度神经网络发展历程全回顾:如何加速DNN运算?

图5:卷积

DNN组成部分

  1. 卷积神经网络:如图6所示,由多个卷积层组成(CONV),每个卷积层对各自的输入进行高阶抽象,这种高阶抽象被称为特征图(feature map,fmap)。CNN可以通过非常深的层级实现极高的性能。卷积神经网络被广泛应用在图像理解,语音识别,游戏,以及机器人学等。图5(b)介绍了CNN卷积的过程,CNN中的每个卷积层主要由高维卷积构成。输入为一系列二维特征图(input feature map),特征图的个数被称为通道,这里有C个通道。卷积层输出的每个点都是所有通道卷积之和。卷积层输出的通道数取决于滤波器的个数,本例中有M个滤波器,因此输出特征图为M通道。

    深度神经网络发展历程全回顾:如何加速DNN运算?

    图6:卷积神经网络

  2. 非线性函数:在每个卷积或全连接计算之后,都会使用一个非线性激活函数。如图7所示,不同种类的非线性函数向DNN中引入非线性。起初DNN经常使用Sigmoid或tanh函数,目前ReLU和它的一些变种函数被证明可以更简单,更易训练,同时也能达到更高的准确性,因此变得越来越流行。

    深度神经网络发展历程全回顾:如何加速DNN运算?

    图7:常用非线性激活函数

  3. 池化(Pooling):池化可以使网络鲁棒性更强。通常池化都是不重叠的,这样能降低表示的维数,减小参数量。

    深度神经网络发展历程全回顾:如何加速DNN运算?

    图8:池化

  4. 标准化(Normalization):控制各层输入的分布可以极大的加速训练过程并提高准确度。常有的如批标准化(batch normalization)(如下公式),它更进一步的进行缩放和平移,其中γ和β为参数,需要在训练中学习。

    深度神经网络发展历程全回顾:如何加速DNN运算?

常见DNN模型

LeNet:1989年第一个CNN方法,为了解决手写数字识别而设计的。

AlexNet:它在2012年赢得了ImageNet挑战,是第一个使用CNN方法赢得ImageNet的网络。它拥有5个卷积层和3个全连接层。

Overfeat:它与AlexNet结构很相似,同样拥有5个卷积层和3个全连接层,区别是Overfeat的滤波器数量更多,所以准确度略有提升。

VGG-16:网络深度大大加深,达到16层,其中包含13个卷积层和3个全连接层。为了平衡网络层数加深而导致的成本增加,一个大的滤波器被分解为多个小的滤波器,来减小参数数量,并具有相同的感知野。VGG有两个模型,还有一个VGG-19的模型,比VGG-16的Top-5错误率低0.1%。

深度神经网络发展历程全回顾:如何加速DNN运算?

图9:为了减少参数,为了使感知野大小不变,使用两个较小的滤波器代替大的滤波器

GoogLeNet:网络深度达到22层,同时引入了Inception模型,如图10所示。之前的模型通常是级联的,而Inception模型是并行连接的。可以看到,它使用了多种大小的滤波器对输入进行处理,这是为了能够在不同尺度上处理输入。22层网络包括了三个卷积层,接下来使9个inceptioin层(每层相当于两个卷积层),以及一个全连接层。

深度神经网络发展历程全回顾:如何加速DNN运算?

图10:Inception模型

ResNet:也叫做残差网络(Residual Net)。使用了残差连接使得网络变得更深(34层,或更多甚至千层)。它是ImageNet挑战中第一个top-5错误率低于人类的。当网络层次变得更深时,训练时的一个难点就是梯度消失(Vanishing Gradient)。由于沿着网络进行反向传播时,梯度会越来越小,导致对于很深的网络,最初几层网络的权重基本不会更新。残差网络引入了“短接”模型,包含了全等连接,使得梯度传播可以跳过卷积层,即使网络层数达到一千层仍可以训练。

深度神经网络发展历程全回顾:如何加速DNN运算?

图11:残差模型

DNN处理的硬件

由于DNN的流行,许多硬件平台都针对DNN处理的特性进行针对性的开发。无论是服务器级别的还是嵌入式的SoC硬件都在快速发展。因此,了解各种平台如何加速计算,是十分重要的。

CONV和FC层的基本组成都是乘加操作(Multiply-and-Accumulate,MAC),可以很容易的并行化。为了实现高性能,如图12所示,包括时间和空间的架构的经典模型经常被使用。时间架构(也称作SIMD或SIMT)主要出现在CPU或GPU中。它对大量ALU使用集中控制。这些ALU智能从存储器层次结构中获取数据,并且彼此不能通信数据。相比之下,空间架构使用数据流处理,即ALU形成处理链,使得它们能直接将数据从一个传递到另一个。每个ALU有自己的控制逻辑和本地内存,称为暂存器或注册文件。空间架构主要使用在为DNN专门设计的ASIC中。

深度神经网络发展历程全回顾:如何加速DNN运算?

图12:时间和空间架构

对于时间架构,可以使用核心中的计算转换(Computational Transform)来减少乘法的数量,以增加吞吐量(Throughput)。

对于加速硬件中使用的空间架构,使用存储器层次结构中的低成本内存,来增加数据重利用率,以降低能耗。

论文很详细的介绍了如何通过这两种方法改进时间和空间架构,以加速DNN运算的,感兴趣的读者可以阅读原论文深入了解:Efficient Processing of Deep Neural Networks: A Tutorial and Survey

雷锋网版权文章,未经授权禁止转载。详情见。


深度神经网络发展历程全回顾:如何加速DNN运算?

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/79144.html

(0)
上一篇 2021年8月12日 06:12
下一篇 2021年8月12日 06:12

相关推荐

发表回复

登录后才能评论