深度神经网络发展历程全回顾:如何加速 DNN 运算?
高云河 AI 科技评论
深度神经网络(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 的背景
人工智能与深度神经网络
深度神经网络,也被称为深度学习,是人工智能领域的重要分支,根据麦卡锡(人工智能之父)的定义,人工智能是创造像人一样的智能机械的科学工程。
人工智能领域内,一个大的子领域是机器学习,由 Arthur Samuel 在 1959 年定义为:让计算机拥有不需要明确编程即可学习的能力。这意味着创建一个程序,这个程序可以被训练去学习如何去做一些智能的行为,然后这个程序就可以自己完成任务。而传统的人工启发式方法,需要对每个新问题重新设计程序。
高效的机器学习算法的优点是显而易见的。一个机器学习算法,只需通过训练,就可以解决某一领域中每一个新问题,而不是对每个新问题特定地进行编程。
在机器学习领域,有一个部分被称作 brain-inspired computation。因为人类大脑是目前学习和解决问题最好的 “机器”,很自然的,人们会从中寻找机器学习的方法。尽管科学家们仍在探索大脑工作的细节,但是有一点被公认的是:神经元是大脑的主要计算单元。人类大脑平均有 860 亿个神经元。神经元相互连接,通过树突接受其他神经元的信号,对这些信号进行计算之后,通过轴突将信号传递给下一个神经元。一个神经元的轴突分支出来并连接到许多其他神经元的树突上,轴突分支和树突之间的连接被称为突触。据估计,人类大脑平均有 1014-1015 个突触。
突触的一个关键特性是它可以缩放通过它的信号大小。这个比例因子可以被称为权重(weight),普遍认为,大脑学习的方式是通过改变突触的权重实现的。因此,不同的权重导致对输入产生不同的响应。注意,学习过程是学习刺激导致的权重调整,而大脑组织(可以被认为是程序)并不改变。大脑的这个特征对机器学习算法有很好的启示。
神经网络与深度神经网络
神经元的计算是输入值的加权和这个概念启发了神经网络的研究。这些加权和对应于突触的缩放值以及神经元所接收的值的组合。此外,神经元并不仅仅是输入信号的加权和,如果是这样的话,级联的神经元的计算将是一种简单的线性代数运算。相反的是,神经元组合输入的操作似乎是一种非线性函数,只有输入达到某个阈值的时候,神经元才会生成输出。因此,通过类比,我们可以知道神经网络在输入值的加权和的基础上应用了非线性函数。
展示了计算神经网络的示意图,图的最左边是接受数值的 “输入层”。这些值被传播到中间层神经元,通常也叫做网络的 “隐藏层”。通过一个或更多隐藏层的加权和最终被传播到 “输出层”,将神经网络的最终结果输出给用户。
在神经网络领域,一个子领域被称为深度学习。最初的神经网络通常只有几层的网络。而深度网络通常有更多的层数,今天的网络一般在五层以上,甚至达到一千多层。
目前在视觉应用中使用深度神经网络的解释是:将图像所有像素输入到网络的第一层之后,该层的加权和可以被解释为表示图像不同的低阶特征。随着层数的加深,这些特征被组合,从而代表更高阶的图像特征。例如,线可以被组合成形状,再进一步,可以被组合成一系列形状的集合。最后,再训练好这些信息之后,针对各个图像类别,网络给出由这些高阶特征组成各个对象的概率,即分类结果。
推理(Inference)与训练(Training)
既然 DNN 是机器学习算法中的一员,那么它的基本编程思想仍然是学习。DNN 的学习即确定网络的权重值。通常,学习过程被称为训练网络(training)。一旦训练完成,程序可以使用由训练确定的权值进行计算,这个使用网络完成任务的操作被被称为推断(inference)。
接下来,如图 3 所示,我们用图像分类作为例子来展示如何训练一个深度神经网络。当我们使用一个 DNN 的时候,我们输入一幅图片,DNN 输出一个得分向量,每一个分数对应一个物体分类;得到最高分数的分类意味着这幅图片最有可能属于这个分类。训练 DNN 的首要目标就是确定如何设置权重,使得正确分类的得分最高(图片所对应的正确分类在训练数据集中标出),而使其他不正确分类的得分尽可能低。理想的正确分类得分与目前的权重所计算出的得分之间的差距被称为损失函数(loss)。因此训练 DNN 的目标即找到一组权重,使得对一个较大规模数据集的 loss 最小。
权重(weight)的优化过程类似爬山的过程,这种方法被称为梯度下降(gradient decent)。损失函数对每个权值的梯度,即损失函数对每个权值求偏导数,被用来更新权值(例:第 t 到 t+1 次迭代:
其中α被称为学习率(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%。他们的成就导致了深度学习风格算法的流行,并不断的改进。
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 组成部分
卷积神经网络:如图 6 所示,由多个卷积层组成(CONV),每个卷积层对各自的输入进行高阶抽象,这种高阶抽象被称为特征图(feature map,fmap)。CNN 可以通过非常深的层级实现极高的性能。卷积神经网络被广泛应用在图像理解,语音识别,游戏,以及机器人学等。图 5(b)介绍了 CNN 卷积的过程,CNN 中的每个卷积层主要由高维卷积构成。输入为一系列二维特征图(input feature map),特征图的个数被称为通道,这里有 C 个通道。卷积层输出的每个点都是所有通道卷积之和。卷积层输出的通道数取决于滤波器的个数,本例中有 M 个滤波器,因此输出特征图为 M 通道。
非线性函数:在每个卷积或全连接计算之后,都会使用一个非线性激活函数。如图 7 所示,不同种类的非线性函数向 DNN 中引入非线性。起初 DNN 经常使用 Sigmoid 或 tanh 函数,目前 ReLU 和它的一些变种函数被证明可以更简单,更易训练,同时也能达到更高的准确性,因此变得越来越流行。
池化(Pooling):池化可以使网络鲁棒性更强。通常池化都是不重叠的,这样能降低表示的维数,减小参数量。
标准化(Normalization):控制各层输入的分布可以极大的加速训练过程并提高准确度。常有的如批标准化(batch normalization)(如下公式),它更进一步的进行缩放和平移,其中γ和β为参数,需要在训练中学习。
常见 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%。
GoogLeNet:网络深度达到 22 层,同时引入了 Inception 模型,如图 10 所示。之前的模型通常是级联的,而 Inception 模型是并行连接的。可以看到,它使用了多种大小的滤波器对输入进行处理,这是为了能够在不同尺度上处理输入。22 层网络包括了三个卷积层,接下来使 9 个 inceptioin 层(每层相当于两个卷积层),以及一个全连接层。
ResNet:也叫做残差网络(Residual Net)。使用了残差连接使得网络变得更深(34 层,或更多甚至千层)。它是 ImageNet 挑战中第一个 top-5 错误率低于人类的。当网络层次变得更深时,训练时的一个难点就是梯度消失(Vanishing Gradient)。由于沿着网络进行反向传播时,梯度会越来越小,导致对于很深的网络,最初几层网络的权重基本不会更新。残差网络引入了 “短接” 模型,包含了全等连接,使得梯度传播可以跳过卷积层,即使网络层数达到一千层仍可以训练。
DNN 处理的硬件
由于 DNN 的流行,许多硬件平台都针对 DNN 处理的特性进行针对性的开发。无论是服务器级别的还是嵌入式的 SoC 硬件都在快速发展。因此,了解各种平台如何加速计算,是十分重要的。
CONV 和 FC 层的基本组成都是乘加操作(Multiply-and-Accumulate,MAC),可以很容易的并行化。为了实现高性能,如图 12 所示,包括时间和空间的架构的经典模型经常被使用。时间架构(也称作 SIMD 或 SIMT)主要出现在 CPU 或 GPU 中。它对大量 ALU 使用集中控制。这些 ALU 智能从存储器层次结构中获取数据,并且彼此不能通信数据。相比之下,空间架构使用数据流处理,即 ALU 形成处理链,使得它们能直接将数据从一个传递到另一个。每个 ALU 有自己的控制逻辑和本地内存,称为暂存器或注册文件。空间架构主要使用在为 DNN 专门设计的 ASIC 中。
对于时间架构,可以使用核心中的计算转换(Computational Transform)来减少乘法的数量,以增加吞吐量(Throughput)。
对于加速硬件中使用的空间架构,使用存储器层次结构中的低成本内存,来增加数据重利用率,以降低能耗。
论文很详细的介绍了如何通过这两种方法改进时间和空间架构,以加速 DNN 运算的,感兴趣的读者可以阅读原论文深入了解:Efficient Processing of Deep Neural Networks: A Tutorial and Survey
如果你对人工智能感兴趣并有志从事相关领域,那么这个课程也许能帮你入门真切感受 AI 的落地,并且有机会和知名技术大牛面对面交流、进入人工智能公司参观交流,真正和 AI 一线从业者深入探讨。了解课程详情可扫描海报上的二维码,联系客服留言 AI 科技评论读者,有惊喜折扣放送。
本文转载自异步社区
原文链接:
https://www.epubit.com/articleDetails?id=NC7E3EF939B70000197CE1AAB8420B5C0 |
- 点赞
- 收藏
- 关注作者
评论(0)