本申请要求在先提交的中国专利申请201610663201.9、“一种优化人工神经网络的方法”和中国专利申请201610663563.8“一种用于实现ANN的深度处理单元”的优先权。
具体实施方式
本申请的一部分内容曾经被发明人姚颂的学术文章“Going Deeper WithEmbedded FPGA Platform for Convolutional Neural Network”(2016.2)所发表。本申请包含上述文章的内容,并且在其基础上进行了更多的改进。
本申请中,将主要以图像处理为例来说明本发明对CNN的改进。本申请的方案适用于各种人工神经网络,包括深度神经网络(DNN)、循环神经网络(RNN)与卷积神经网络(CNN)。以下以CNN为例进行说明
CNN基本概念
CNN在广泛的视觉相关任务中都达到最先进的性能。为帮助理解本申请中分析的基于CNN图像分类算法,我们首先介绍了CNN的基础知识,介绍图像网络数据集和现有CNN模型。
如图1所示,典型的CNN由一系列有序运行的层组成。
CNN模型的参数被称为“权重”(weights)。CNN的第一层读取输入图像,并输出一系列的特征图(map)。下面的层读取由上一层产生的特征图,并输出新的特征图。最后一个分类器(classifier)输出输入图像可能属于的每一类别的概率。CONV层(卷积层)和FC层(全连层)是CNN中两种基本层类型。CONV层后,通常有汇集层(Pooling layers)。
在本申请中,对于一个CNN层,
表示第j个输入特征图(input feature map),
表示第i个输出特征图(output feature map),b
i表示第i个输出图的偏置项。
对于CONV层,nin和nout分别代表输入和输出特征图的数量。
对于FC层,nin和nout分别代表输入和输出特征向量的长度。
CONV层(Convolutional layers,卷积层)的定义:CONV层以一系列特征图作为输入,并以卷积内核卷积获得输出特征图。
通常与CONV层相连的非线性层,即,非线性激励函数,被施加到输出特征图中的每个元素。
CONV层可以用表达式1表示:
其中gi,j是应用到第j个输入特征图和第i个输出特征图的卷积内核。
FC层(Fully-Connected layers,全连层)的定义:FC层应用于输入特征向量上的一个线性变换:
fout=Wfin+b (2)
W是一个nout×nin变换矩阵,b是偏置项。值得注意,对于FC层,输入的不是几个二维特征图的组合,而是一个特征向量。因此,在表达式2中,参数nin和nout实际上对应于输入和输出特征向量的长度。
汇集(pooling)层:通常与CONV层相连,用于输出每个特征图中的每个分区(subarea)的最大值或平均值。Pooling最大值可以由表达式3表示:
其中p是汇集内核的大小。这种非线性的“降采样”不仅为下一层降低了特征图的大小和计算,还提供了一种平移不变(translation invariance)。
CNN可用于前向推理过程中进行图像分类。但在对任何任务使用CNN之前,应该首先训练CNN数据集。最近的研究表明,对于一个给定任务的基于大数据集的前向培训的CNN模型可以用于其他任务,并在网络权值(network weights)中实现高精度的微小调整,这个微小调整叫做“微调(fine-tune)”。CNN的培训主要是在大型服务器上实现。对于嵌入式FPGA平台,我们专注于加速CNN的推理过程。
图2示出了为了加速CNN从处理流程和硬件架构的角度提出的整套技术方案。
图2左侧显示了人工神经网络模型,即要优化的目标。在图2中间显示了如何压缩、量化、编译CNN模型以减少内存占用和操作数量,同时最大限度地减少精度损失。图2右侧显示了为压缩后的CNN提供的专用硬件。
串联神经网络的动态量化方案
图3显示了图2的量化步骤的更多细节。
对于一个定点数,它的值表示如下:
其中bw是数的位宽度,fl是可以是负的部分的长度(fractional length)。
为了将浮点数转换成定点数的同时得到最高精度,提出了一个动态精度数据量化策略和自动工作流程。
与以前的静态精度量化策略不同,所提出的数据量化流程中,fl对于不同的层和特征图集是动态变化的,同时在一个层中保持静态,以尽量减少每层的截断误差。
如图3所示,本申请所提出的量化流程主要由两个阶段组成:权重量化阶段和数据量化阶段。
权重量化阶段的目的是找到一个层的权重的最佳fl,如表达式5:
其中W是权重,W(bw,fl)代表在给定的bw和fl下的W的定点格式。
可选地,首先分析了每一层权重的动态范围,例如通过采样进行估计。之后,为了避免数据溢出,初始化fl。此外,我们在初始fl的邻域搜索最优fl。
可选地,在权重定点量化步骤中,采用另一种方式来寻找最佳fl,如表达式6。
其中,i代表在bw位中的某一位,ki为该位权重。采用表达式6的方式,对不同的位给予不同的权重,再计算最优的fl。
数据量化阶段旨在为CNN模型的两层之间的特征图集寻找最优fl。在此阶段,可以使用训练数据集(bench mark)来训练CNN。所述训练数据集可以为data set0。
可选地,首先完成所有CNN的CONV层、FC层的权重量化,再进行数据量化。此时,把训练数据集输入到已经被量化权重的CNN,经过CONV层、FC层的逐层处理,得到各层输入特征图。
针对每一层输入特征图,使用贪婪算法逐层比较定点CNN模型和浮点CNN模型的中间数据,以减少精度损失。每一层的优化目标如表达式7所示:
在表达式7中,当A表示一层(例如某一CONV层或FC层)的计算,x表示输入,x+=A·x时,x+代表该层的输出。值得注意的是,对于CONV层或FC层,直接结果x+具有比给定的标准更长的位宽度。因此,当最佳fl选择时需要截断。最后,整个数据量化配置生成。
根据本发明的另一个实施例,在数据定点量化步骤中,采用另一种方式来寻找最佳fl,如表达式8。
其中,i代表在bw位中的某一位,ki为该位权重。与表达式6的方式类似,对不同的位给予不同的权重,再计算最优的fl。
上述数据量化步骤得到最优的fl。
另外,权重量化和数据量化可以交替进行。就数据处理的流程顺序而言,所述ANN的卷积层(CONV层)、全连层(FC层)中各个层为串联关系,所述训练数据集被所述ANN的CONV层和FC层依次处理时得到的各个特征图集。
具体而言,所述权重量化步骤和所述数据量化步骤根据所述串联关系交替进行,其中在所述权重量化步骤完成其中当前一层的定点量化之后、开始下一层的定点量化之前,对当前一层所输出的特征图集执行数据量化步骤。
上述逐层变精度定点化方法及装置适用于简单的无分支的神经网络的方案。
图4示出了纯串行的神经网络,神经网络的任意一层Layer N,有且仅有一个前驱层,有且仅有一个后继层。基本流程:对于输入的神经网络,按从输入到输出,逐层按一个函数使得误差最小化,确定下来每一层的精度,直到最后一层。
图5所示的定点方式:采用逐层定点的方式寻找最合适的定点位置。
可以看到,图5的方法需要在线生成定点数神经网络。所谓“在线”,就是选取若干典型图片,对该系列图片进行测试,在对这些图片进行测试的过程中才能知道中间的结果。由于图5的方案采用了逐层定点的方式对神经网络进行定点,所以需要一个支持定点数的测试工具,工具的输入时已经经过定点上一层的输出结果,工具的输出是该层定点数网络的结果。
复杂网络的定点动态量化方案
图5的方案采用定点方法逐层传播,每一层的定点都要依赖之前层。对于网络结构存在分支与分支合并的情况没有办法处理。
图5的方案对于现在流行的网络(GoogLeNet,SqueezeNet等)并不适用。图5的方法每一层的定点操作都依赖于上一层的定点结果,所以对网络结构有很大限制。
图6a-6c示出了复杂的神经网络的一个例子GoogLeNet,其中网络有多个分支,同时包括串联、并联的关系,图6c是GoogLeNet模型的输入,图6a是GoogLeNet模型的输出。图6所示的复杂网络GoogLeNet的更多信息可以参看Christian Szegedy等人的Going deeperwith convolutions一文。
对于有分支的网络(例如GoogLeNet),对于多层的级联(CONCAT,concatenation)操作,上层有多个层的输出接入到CONCAT的输入。
CONCAT操作就是指将各输入层的数据按照通道进行连接(级联,CONCATenation)而成新的一层,再输出给下一层。例如CONCAT的输入有两层:输入A和输入B,输入A的特征图尺寸为WxH,通道数为C1,而输入B的特征图尺寸为WxH,通道数为C2。经过CONCAT层之后的特征图维度为WxHx(C1+C2)。
如图7所示的一个例子中,CONCAT层有4个输入,1*1的卷积层、3*3的卷积层、5*5的卷积层、3*3的最大汇集层,CONCAT层把这4个输入级联起来,提供一个输出。有分支的复杂神经网络需要CONCAT操作,从而神经网络模型中存在相应的CONCAT层。
图8示出了CONCAT层执行的操作的例子。
BLOB(binary large object)是二进制大对象,是一个可以存储二进制文件的容器。在计算机中,BLOB常常是数据库中用来存储二进制文件的字段类型。BLOB可以理解为一个大文件,典型的BLOB是一张图片或一个声音文件,由于它们的尺寸,必须使用特殊的方式来处理(例如:上传、下载或者存放到一个数据库)。
在本发明实施例中,BLOB可以理解为四维的数据结构。CONCAT层把前一级的多个层的输出的BLOB1、BLOB2、…BLOBn级联为一个输出。
进一步,在硬件中实现CONCAT操作,通过修改各输入BLOB1、BLOB2、…BLOBn在内存中摆放的位置(内存地址)来实现分支的合并。
如图8所示,BLOB 1,2,3……n的定点配置信息可能不一致。然而,实际的硬件中,要求CONCAT层的所有输入的定点配置是一致的。如果定点配置信息不一致,会导致CONCAT层的数据冲突,神经网络无法再逐层向下一层运行。
如图9所示,为了解决上述问题,我们采用新方法来确定神经网络的输入范围的定点位置。
在图9所示的方法中,CNN(卷积神经网络)是有分支的神经网络,至少包括:第1、第2、…第n个卷积层(CONV层),第1、第2、…第m个全连层(FC层),第1、第2、…第l个CONCAT层,其中所述n、m、l为正整数。
图9左侧分支所示的权重参数流程与图5的大致相同。与图5所示方法不同,在图9右侧分支的数据量化流程中,包括如下步骤。
第一,对所述CNN的各层(CONV层、FC层、CONCAT层中的每一层)的输出的数值范围进行估计,其中该数值是浮点数。
根据本发明的一个实施例,其中第一步骤包括:把输入数据提供给所述CNN,所述输入数据被所述CNN的m个卷积层(CONV层)、n个全连层(FC层)、l个CONCAT层处理,得到各层的输出。
第二,把上述输出的数值范围从浮点数定点量化为定点数。
上述步骤把每层的输出从浮点数量化为定点数,其中针对每层的输出动态地选取量化范围,该量化范围在所述该层是不变的。
根据本发明的一个实施例,可以采用公式7或8的方式来计算最优fl,从而确定定点量化范围。
第三,基于CONCAT层的输出的定点量化范围,修改所述CONCAT层的各个输入的定点量化范围。
第三步骤包括:确定所述CNN中的各个CONCAT层,其中每个CONCAT层把前一级的多个层的输出合并为自己的一个输出。例如,可以从所述CNN的网络模型中找出多个子网络,每个子网络以CONCAT层作为最后一层,从而以所述子网络作为单位进行处理。
根据本发明的一个实施例,第三步骤还包括:对CONCAT层的前一级的多个层的输出,比较所述CONCAT层的前一级每层输出的定点量化范围与所述CONCAT层的输出的定点量化范围。如果不相同,则把该输入的定点量化范围修改为与所述CONCAT层的输出的定点量化范围。
根据本发明的一个实施例,第三步骤还包括:如果一个CONCAT层的前一级某个输入是另一个CONCAT层,则把所述另一个CONCAT层作为另一个子网络,迭代执行步骤第三步骤。
如图9左侧分支所示,跟据本发明的一个实施例,还包括:权重定点量化步骤,把CONV层、FC层和CONCAT层中各层的权重从浮点数量化为定点数。
此外,图9所示的左侧分支的权重量化流程和右侧分支的数据量化流程可以同时执行,也可以交替执行。
例如,执行数据定点量化步骤之前,先对所有的CONV层、FC层和CONCAT层完成所述权重定点量化步骤。
或者,所述权重量化步骤和所述数据量化步骤可以交替进行。按照输入数据被处理的顺序,在所述权重量化步骤完成所述卷积层(CONV层)、全连层(FC层)、CONCAT层的当前一层的定点量化之后、在开始下一层的定点量化之前,对该层的输出执行数据量化步骤。
根据本发明的一个实施例,还额外包括第四步骤:在第三步骤之后,输出所述CONV层、FC层、CONCAT层中各个层的输出的定点量化范围。
图10示出了基于本发明实施例的根据CONCAT层来调整前一级输入的定点量化位置的例子。
图10的例子中,CONCAT层有两个输入,分别是卷积层CONV3、CONV4,CONV3层的输入为CONV2,CONV2层的输入是CONV1。
依据图9的流程,第一步骤包括:把数据输入到神经网络中,得到各个层的输出数据,并确定各层的输出的数值范围。例如,图10示出了各个CONV层和CONCAT层的输出的数值范围,例如以高斯分布。
第二步骤,把各层的输出的数值范围从浮点数定点量化为定点数。例如,参考公式4,假设把浮点数量化为8位的定点数,即,bw=8。例如,CONV3层的输出定点为fl=5,CONV4层的输出定点为fl=3,CONCAT层的输出定点为fl=4。
第三步骤,基于所述CONCAT层的输出的定点配置信息,来修改所述CONCAT层的各个输入CONV3、CONV4的定点量化范围。
例如,比较所述CONV3的输出的定点量化范围(fl=5)与所述CONCAT层的输出的定点量化范围(fl=4)。两者不相同,则把CONV3的输出的定点量化范围修改为与所述CONCAT层的输出的定点量化范围。因此,CONV3的输出的定点量化范围被修改fl=4。
接下来,比较所述CONV4的输出的定点量化范围(fl=3)与所述CONCAT层的输出的定点量化范围(fl=4),两者不相同,则把CONV4的输出的定点量化范围修改为与所述CONCAT层的输出的定点量化范围。因此,CONV4的输出的定点量化范围被修改fl=4。
如果CONCAT层还有其他输入,则以类似方式进行修改。
另外,如果CONCAT层CONCAT1的某个输入也是一个CONCAT层CONCAT1,则执行迭代操作。首先,将后者CONCAT2视为前一级的输入,依照输出CONCAT1的定点配置进行修改;然后,再将修改后的CONCAT2作为输出,修改CONCAT2的前一级各个输入的定点配置。
此外,应当理解,本发明的方案适用于各种形式的复杂人工神经网络,而不仅限于具有CONCAT级联操作的、带有分支的人工神经网络。此外,CONCAT操作也应当作为广义来理解,即,把不同的子网络(或,网络分支)组合为一个网络的操作。
此外,本发明说明书和权利要求中的“多个”是指两个或两个以上。
需要说明的是,本说明书中的各个实施例采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。
在本申请所提供的几个实施例中,应该理解到,所揭露的装置和方法,也可以通过其它的方式实现。以上所描述的装置实施例仅仅是示意性的,例如,附图中的流程图和框图显示了根据本发明的多个实施例的装置、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或代码的一部分,所述模块、程序段或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现方式中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或动作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。
以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应所述以权利要求的保护范围为准。