具体实施方式
下面将参照附图更详细地描述本公开的优选实施方式。虽然附图中显示了本公开的优选实施方式,然而应该理解,可以以各种形式实现本公开而不应被这里阐述的实施方式所限制。相反,提供这些实施方式是为了使本公开更加透彻和完整,并且能够将本公开的范围完整地传达给本领域的技术人员。
本申请中,将主要以图像处理为例来说明本发明对CNN的改进。本申请的方案适用于各种人工神经网络,包括深度神经网络(DNN)、循环神经网络(RNN)与卷积神经网络(CNN)。以下以CNN为例进行说明
CNN基本概念
CNN在广泛的视觉相关任务中都达到最先进的性能。为帮助理解本申请中分析的基于CNN图像分类算法,我们首先介绍了CNN的基础知识,介绍图像网络数据集和现有CNN模型。
如图1所示,典型的CNN由一系列有序运行的层组成。
CNN模型的参数被称为“权重”(weights)。CNN的第一层读取输入图像,并输出一系列的特征图(map)。下面的层读取由上一层产生的特征图,并输出新的特征图。最后一个分类器(classifier)输出该输入图像可能属于的每一类别的概率。CONV层(卷积层)和FC层(全连接层)是CNN中两种基本层类型。CONV层后通常还接有池化层(Pooling layers)。
CONV层(Convolutional layers,卷积层)以一系列特征图作为输入,并以卷积内核卷积获得输出特征图。池化层通常与CONV层相连,用于输出每个特征图中的每个分区(sub area)的最大值或平均值,由此通过亚采样降低计算量,同时保持某种程度的位移、尺度和形变不变性。一个CNN中可以包括卷积层和池化层之间的多个交替,由此逐步降低空间分辨率并增加特征映射的数量。随后可以连接至至少一个全连接层,通过应用于输入特征向量上的线性变换,得到包括多个特征值的一维向量输出。
CNN可用于前向推理过程中进行图像分类。但在对任何任务使用CNN之前,应该首先训练CNN数据集。最近的研究表明,对于一个给定任务的基于大数据集的前向培训的CNN模型可以用于其他任务,并在网络权值(network weights)中实现高精度的微小调整,这个微小调整叫做“微调(fine-tune)”。
在对CNN的训练过程中,通常先不考虑对实际图像分类中使用的位于网络最末端的分类器的训练,而是专注于CNN本身,尤其是CONV层和FC层(有时还包括池化层)的训练。在训练过程中,输入训练数据,使用BP算法(误差反向传播算法)根据得到的误差函数反向调整CNN各层的权重,由此训练得到各层的权重参数。
CNN的培训主要是在大型服务器上实现。对于嵌入式平台,例如包括FPGA的SoC平台,则专注于加速CNN的推理过程。
图2示出了为了加速CNN从处理流程和硬件架构的角度提出的整套技术方案。图2左侧显示了人工神经网络模型,即要优化的目标。在图2中间显示了如何通过去冗余来压缩、定点化、编译CNN模型,由此减少内存占用和操作数量,同时最大限度地减少精度损失。图2右侧显示了为压缩后的CNN提供的专用硬件。
串联神经网络的动态量化方案
如下将针对图2的定点化步骤进行具体描述。
对于一个定点数,它的值表示如下:
其中bw是数的位宽,fl是可以是小数部分的长度(fractional length)。
为了将浮点数转换成定点数的同时得到最高精度,提出了一个动态精度数据化策略和自动工作流程。与以前的静态精度量化策略不同,所提出的数据量化流程中,fl对于不同的层和特征图集是动态变化的,同时在一个层中保持静态,以尽量减少每层的截断误差。
本申请所提出的定点量化流程主要由两个阶段组成:权重量化阶段和数据量化阶段。权重量化阶段的目的是找到一个层的权重的最佳fl。可选地,可以首先分析了每一层权重的动态范围,例如通过采样进行估计。之后,为了避免数据溢出,初始化fl并在初始fl的邻域搜索最优fl。可选地,还可以采用其他方式来寻找最佳fl,例如对不同的位给予不同的权重,再计算最优的fl。
数据量化阶段旨在为CNN模型的两层之间的特征图集寻找最优fl。在此阶段,可以使用训练数据(bench mark)来训练CNN。所述训练数据可以为data set 0。
可选地,首先完成所有CNN的CONV层、FC层的权重量化,再进行数据化。此时,把训练数据输入到权重已经定点化的CNN,经过CONV层、FC层的逐层处理,得到各层输入特征图。
针对每一层输入特征图,使用贪婪算法逐层比较定点CNN模型和浮点CNN模型的中间数据,以减少精度损失。在另一个实施例中,还可以采用其他方式来寻找数据定点化步骤中的fl,例如对不同的位给予不同的权重,再计算最优的fl。
另外,权重定点化和数据定点化可以交替进行。就数据处理的流程顺序而言,所述ANN的卷积层(CONV层)、全连层(FC层)中各个层为串联关系,所述训练数据被所述ANN的CONV层和FC层依次处理时得到的各个特征图集。
具体而言,上述权重量化和数据量化步骤可以根据串联关系交替进行,其中在权重量化步骤完成其中当前一层的定点化之后、开始下一层的定点化之前,对当前一层所输出的特征图集执行数据量化步骤。
上述逐层变精度定点化方法及装置适用于简单的无分支的神经网络的方案。
图3示出了纯串行的神经网络,对于神经网络的任意一层Layer N,有且仅有一个前驱层,有且仅有一个后继层。基本流程:对于输入的神经网络,按从输入到输出,逐层按一个函数使得误差最小化,确定下来每一层的精度,直到最后一层。
图4显示了针对串联连接的CNN的量化方案。在图4所示的方案中,CNN包括多个卷积层(CONV层)和至少一个全连接层(FC层),并且该方案采用逐层定点的方式寻找最合适的定点位置。从图中可以看出,图4的方法需要在线生成定点数神经网络。所谓“在线”,就是选取若干典型图片,对该系列图片进行测试,在对这些图片进行测试的过程中才能知道中间的结果。由于图4的方案采用了逐层定点的方式对神经网络进行定点,所以需要一个支持定点数的测试工具,工具的输入是已经经过定点上一层的输出结果,工具的输出是该层定点数网络的结果。
复杂网络的定点动态量化方案
图4的方案采用定点方法逐层传播,每一层的定点都要依赖之前层。对于网络结构存在分支与分支合并的情况没有办法处理。
在有分支的网络(例如GoogLeNet)中,对于多层的级联(CONCAT,concatenation)操作,上层有多个层的输出接入到CONCAT的输入。CONCAT操作就是指将各输入层的数据按照通道级联而成新的一层,再输出给下一层。例如CONCAT的输入有两层:输入A和输入B,输入A的特征图尺寸为WxH,通道数为C1,而输入B的特征图尺寸为WxH,通道数为C2。经过CONCAT层之后的特征图维度为WxHx(C1+C2)。图5示出了针对复杂CNN的CONCAT操作的一个例子。如图5所示,CONCAT层有4个输入,1*1的卷积层、3*3的卷积层、5*5的卷积层、3*3的最大汇集层,CONCAT层把这4个输入级联起来,提供一个输出。有分支的复杂神经网络需要CONCAT操作,从而神经网络模型中存在相应的CONCAT层。
图6示出了CONCAT层执行的操作的例子。
BLOB(binary large object)是二进制大对象,是一个可以存储二进制文件的容器。在计算机中,BLOB常常是数据库中用来存储二进制文件的字段类型。
BLOB可以理解为一个大文件,典型的BLOB是一张图片或一个声音文件,由于它们的尺寸,必须使用特殊的方式来处理(例如:上传、下载或者存放到一个数据库)。在本发明实施例中,BLOB可以理解为四维的数据结构。CONCAT层把前一级的多个层的输出的BLOB1、BLOB2、…BLOBn级联为一个输出。
进一步,在硬件中实现CONCAT操作,通过修改各输入BLOB1、BLOB2、…BLOBn在内存中摆放的位置(内存地址)来实现分支的合并。
如图6所示,BLOB1,2,3…n的定点配置信息可能不一致。然而,实际的硬件中,要求CONCAT层的所有输入的定点配置是一致的。如果定点配置信息不一致,会导致CONCAT层的数据冲突,神经网络无法再逐层向下一层运行。如图7所示,为了解决上述问题,我们采用新方法来确定神经网络的输入范围的定点位置。
在图7所示的方法中,CNN(卷积神经网络)是有分支的神经网络,包括多个卷积层(CONV层)、至少一个全连接层(FC层)和至少一个CONCAT层。图7左侧分支所示的权重参数流程与图4的大致相同。与图4所示方法不同,在图7右侧分支的数据量化流程中,包括如下步骤。
第一,对所述CNN的各层(CONV层、FC层、CONCAT层中的每一层)的输出的数值范围进行估计,其中该数值是浮点数。
根据本发明的一个实施例,其中第一步骤包括:把输入数据提供给所述CNN,所述输入数据被CNN的多个卷积层(CONV层)、至少一个全连层(FC层)、至少一个CONCAT层处理,得到各层的输出。
第二,把上述输出的数值范围从浮点数定点化为定点数。
上述步骤把每层的输出从浮点数量化为定点数,其中针对每层的输出动态地选取量化范围,该量化范围在所述该层是不变的。
第三,基于CONCAT层的输出的定点化范围,修改所述CONCAT层的各个输入的定点化范围。
第三步骤包括:确定所述CNN中的各个CONCAT层,其中每个CONCAT层把前一级的多个层的输出合并为自己的一个输出。例如,可以从所述CNN的网络模型中找出多个子网络,每个子网络以CONCAT层作为最后一层,从而以所述子网络作为单位进行处理。
根据本发明的一个实施例,第三步骤还包括:对CONCAT层的前一级的多个层的输出,比较所述CONCAT层的前一级每层输出的定点化范围与所述CONCAT层的输出的定点化范围。如果不相同,则把该输入的定点化范围修改为与所述CONCAT层的输出的定点化范围。
根据本发明的一个实施例,第三步骤还包括:如果一个CONCAT层的前一级某个输入是另一个CONCAT层,则把所述另一个CONCAT层作为另一个子网络,迭代执行步骤第三步骤。
如图7左侧分支所示,根据本发明的一个实施例,还包括:权重定点化步骤,把CONV层、FC层和CONCAT层中各层的权重从浮点数量化为定点数。
此外,图7所示的左侧分支的权重量化流程和右侧分支的数据量化流程可以同时执行,也可以交替执行。例如,执行数据定点化步骤之前,先对所有的CONV层、FC层和CONCAT层完成所述权重定点化步骤。
或者,所述权重量化步骤和所述数据量化步骤可以交替进行。按照输入数据被处理的顺序,在所述权重量化步骤完成所述卷积层(CONV层)、全连层(FC层)、CONCAT层的当前一层的定点化之后、在开始下一层的定点化之前,对该层的输出执行数据量化步骤。
根据本发明的一个实施例,还额外包括第四步骤:在第三步骤之后,输出所述CONV层、FC层、CONCAT层中各个层的输出的定点化范围。
定点后的微调方案
图4和图7分别描述了针对简单串联网络和复杂神经网络的动态定点量化方案。但本发明的发明人发现,网络精度在定点过后会有所下降。在网络层数变深或者网络被设计用来解决回归问题的情况下,网络性能会严重退化。有鉴于此,本发明的发明人通过使用训练数据训练,能够进一步微调定点过后的网络,取得优于直接定点神经网络的性能。
图8示出了根据本发明一个实施例的神经网络调整方案的例子。图8的上部所示的神经网络量化流程与图4的大致相同。与图4所示不同的是,图8还包括下部的微调分支,优选可以包括如下步骤:
第一,网络浮点化步骤,将在上部定点化的多个层转为浮点数以便将CNN转换回浮点数CNN。
根据本发明的一个实施例,在上部定点化的可以是该CNN中的所有层,例如,图3中全部的CONV层和FC层。因此,在执行该网络浮点化步骤时,可以将上述定点化的层全部强制浮点化。
根据本发明的另一个实施例,定点化的可以仅仅是CNN中的部分层。可以根据实际的需求(例如,精度需求、硬件资源状况等),选择神经网络中适于定点化的层。例如,在一个实施例中,可以将诸如CONV层定点化,但保持所有FC层的浮点化。而在执行该网络浮点化步骤时,可以仅强制浮点化之前被定点化的部分层。
第二,权重微调步骤,通过使用训练数据进行训练,微调该浮点数CNN中至少一层的权重参数。
在一个实施例中,选择已在上部定点化并在前一步骤被重新定点化的层进行微调。例如,可以对CNN中的各个CONV层进行微调。在其他实施例中,也可以微调在前一直保持为浮点化的层。
在一个实施例中,上述微调可以是训练数据输入网络,并且根据相应得到的表示了实际结果和真值结果之间差异的误差函数,使用BP算法调整该浮点数CNN中至少一层的参数。倘若连续两次微调得到的整体权重参数变化小,则指示各层的权重参数已经调整至(或者接近)最优值,因此可以结束上述微调。
通过将定点过后的网络(或其部分层)强制转化为浮点数,然后在此浮点数网络的基础对网络进行微调,能够得到相比于原始浮点网络,分布上更接近最优值的参数。这时,经过微调的网络参数仍然是浮点数。
在随后的网络实际运行中可以直接使用这些浮点化的网络参数。然而,优选将浮点数CNN中的多个层的权重参数重新定点化。图9示出了根据本发明另一个实施例的神经网络调整方案的例子。与图8不同的是,下部的微调部分在图9中变为右侧分支,并且经过该右侧分支浮点化微调的网络可以使用图中左侧的分支进行重新定点,以得到重新定点的网络。这一浮点化微调以及重新定点的过程同样可以使用误差函数由bp算法找出最优或接近最优的值。类似地,倘若连续两次微调和定点操作之间的权重参数(例如,各层权重之和或其平均)变小,则意味着已经找出各层权重的优化值(此时为定点值),于是便能够结束图9的操作,并进行后续的操作。
该重新定点的网络与在前的新浮点网络的残差比原始定点网络和原始浮点网络之间的残差更小。这样,在新浮点网络和原始浮点网络性能接近的情况下,重新定点化的网络(微调后)会比原始定点化网络(微调前)具备更好的性能,并且仍然具备定点化网络简化计算的优良性能。
由于训练过程中采用浮点数,但在前向过程中却使用定点数,因此在根据图9的网络中,训练和运行数据的表示有差异,这就使得良好的训练结果有时并不能代表良好的实际运行结果。针对这种情况,本发明还可以优选地包括图10的操作。在一个实施例中,图9的后续操作包括图10的操作,由此得到一个完整的优选方案。
在网络训练的过程中,可以筛选出少数几个层作为关键层,并且保持这几个层在训练过程中始终使用浮点数。在一个实施例中,关键层可以是网络中的FC层。这些FC层可以在网络中的CONV层进行定点化、浮点化微调、再定点化的过程中始终保持浮点。在CONV层的权重参数调整完毕之后,再对这些FC层进行调整。在随后的实际使用网络的过程中,仍然保证这些FC层使用的是浮点数。
根据图10的实施例能够保证在训练和实际运行的过程的数据表示没有差异,使得训练结果的好坏能够准确预测运行结果的好坏,由此进一步提升网络的性能。
可以理解,包括CONCAT层或是带有其他分支的复杂人工神经网络同样可以利用本发明的定点化后微调的方法。虽然图11直接示出了应用于复杂网络的优选实施例,但是本领域技术人员显见的是,类似图8和图9的微调实施例也可以用于复杂人工神经网络,在此不再赘述。
定点后微调方案的装置实现
根据本发明的定点后微调方案也可由装置实现。图12示出了用于实现本发明技术方案的一种调整ANN的装置。ANN至少包括两个或更多个卷积层(CONV层)以及至少一个全连接层(FC层)。该装置1200包括网络定点化装置1210、网络浮点化装置1220和权重微调装置1230。
网络定点化装置1210对网络多个层的输出的数值范围和权重参数进行定点化。网络浮点化装置1220将定点化的所述多个层转为浮点数以便将ANN转换回浮点数ANN。权重微调装置1230通过使用训练数据进行训练,微调浮点数ANN中至少一层的权重参数。
在一个实施例中,权重微调装置1230微调的是之前从定点化转换回浮点化的多个层的权重。
在一个实施例中,该装置1200还优选地包括重新定点化装置1240。重新定点化装置1240在微调之后将浮点化的多个层的权重参数重新定点化。
在一个实施例中,该神经网络包括至少一个浮点数层,优选为FC层,例如,一个卷积神经网络末端的所有FC层。这一个或多个层的其输出的数值范围和/或参数始终保持为浮点数。浮点数层可由权重微调装置1230微调,也可以在重新定点化装置1240定点化那些被定点化再浮点化的层之后,由浮点数层微调装置1250进行微调。优选地,该权重微调装置1230和浮点数层微调装置1250可由同一模块实现。
在实际应用中,上述各个功能模块可由处理器实现。例如,在如图2所示的结构中,可由通用处理系统对在可编程逻辑模块(例如,FPGA)上实现的人工神经网络进行调整,由此得到技术简化且性能优化的适于小型化实现的人工神经网络。
此外,应当理解,本发明的方案适用于各种形式的人工神经网络。不仅包括简单的串联连接的网络,还包括具有CONCAT级联操作的、带有分支的人工神经网络,以及其他形式的神经网络。此外,CONCAT操作也应当作为广义来理解,即,把不同的子网络(或,网络分支)组合为一个网络的操作。
此外,本发明说明书和权利要求中的“多个”是指两个或两个以上。
需要说明的是,本说明书中的各个实施例采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。
在本申请所提供的几个实施例中,应该理解的是,所揭露的装置和方法,也可以通过其它的方式实现。以上所描述的装置实施例仅仅是示意性的,例如,附图中的流程图和框图显示了根据本发明的多个实施例的系统和方法的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或代码的一部分,所述模块、程序段或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标记的功能也可以以不同于附图中所标记的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
以上已经描述了本发明的各实施例,上述说明是示例性的,并非穷尽性的,并且也不限于所披露的各实施例。在不偏离所说明的各实施例的范围和精神的情况下,对于本技术领域的普通技术人员来说许多修改和变更都是显而易见的。本文中所用术语的选择,旨在最好地解释各实施例的原理、实际应用或对市场中的技术的改进,或者使本技术领域的其它普通技术人员能理解本文披露的各实施例。