本申请要求于2016年8月22日提交的美国专利申请no.15/242,622、和于2016年8月22日提交的美国专利申请no.15/242,624的优先权。
发明领域
本发明涉及考虑负载均衡的深度神经网络压缩方法及装置。
背景技术:
人工神经网络的压缩
人工神经网络(artificialneuralnetworks,anns),也简称神经网络(nns),是一种模仿动物神经网络的行为特征,进行分布式并行信息处理的数学计算模型。近年来,神经网络发展很快,被广泛应用于诸多领域,如图像识别、语音识别、自然语言处理、天气预报、基因表达、内容推送等等。
神经网络中,有大量彼此连接的节点(也称“神经元”)。神经网络具备两个特性:1)每个神经元,通过某种特定的输出函数(也叫激活函数activationfunction),计算处理来自其它相邻神经元的加权输入值;2)神经元之间的信息传递强度用所谓的权值来定义,算法会不断自我学习,调整这个权值。
早期的神经网络只有输入和输出层两层,无法处理复杂的逻辑,因此限制了其实用性。
如图1所示,深度神经网络(deepneuralnetworks,dnns)通过在输入层和输出层之间添加隐藏的中间层,革命性地改变了这一点。
循环神经网络(recurrentneuralnetworks,rnns)是一种常用的深度神经网络模型。不同于传统前向神经网络(feed-forwardneuralnetworks),循环神经网络引入了定向循环,能够处理输入之间前后关联的问题。在语音识别中,信号的前后关联很强,例如识别句子中的单词和该单词前面的单词序列关系十分紧密。因此,循环神经网络在语音识别领域有着非常广泛的应用。
然而,通过近几年的迅速发展,神经网络的规模不断增长,已公开的比较先进的神经网络可达数百层、数亿个连接,属于计算和访存密集型应用。在神经网络逐渐变大的情况下,模型压缩就变得极为重要。
深度神经网络中,神经元的连接关系在数学上可以表示为一系列矩阵。经过训练后的网络虽然预测准确,但其矩阵都是稠密的,即“矩阵中充满了非零元素”,从而导致大量的存储和计算资源被消耗。这不但降低了速度,而且增加了成本。这样一来,在移动端推广应用就面临着巨大的困难,极大的制约了神经网络的发展。
图2示出了一种利用剪切、重训的压缩神经网络的示意图。
近年来,广泛的研究表明,在通过训练得到的神经网络模型矩阵中,仅有部分权值较大的元素代表着重要连接,而其他权值较小的元素可以被移除(置为零),
图3示出了对应的神经元被剪枝(pruning)。剪枝后的神经网络精度会下降,但是可以通过重训(finetune),对仍然保留在模型矩阵中的权值大小进行调整,从而减小精度损失。
模型压缩可以将神经网络中的稠密矩阵稀疏化,能够有效的降低存储量、减少计算量,在保持精度的同时实现加速。模型压缩对于专用的稀疏神经网络加速器而言,显得极为重要。
crs和ccs
如前所述,对于稀疏矩阵的处理,为了减少内存,往往需要对矩阵进行压缩存储,比较经典的存储方法包括:行压缩(compressedrowstoragecrs)和列压缩存储(compressedcolumnstorageccs)。
为了利用激励函数的稀疏性,可以将编码稀疏权重矩阵w存入压缩列存储(ccs)格式的变量中。
对于w矩阵每列wj,我们存储一个包含非零权重的向量v,以及等长向量z,向量z用于编码v的相应条目之前零的个数,v和z各自由一个四位数值表示。如果超过15个零出现在一个非零的条目,在向量v中添加一个零。例如,以下列被编码为:
[0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3]
v=[1,2,0,3],z=[2,0,15,2]。
所有列的v和z的都存储在一对大阵列中,其中指针向量p指向每个列的向量的开始。p指针向量中的最后一项指向超过最后一个向量元素,这样pj+1-pj给出了第j列中的非零数(包括填补的零)。
通过压缩列存储格式(ccsformat)中列存储稀疏矩阵,使得利用激励函数的稀疏性变得容易。只需要用每个非零激励与其相应列中的所有非零元素相乘。
美国专利uspatent9317482“universalfpga/asicmatrix-vectormultiplicationarchitecture”中更详细地披露了如何使用compressedsparserow(csr)在基于cpu和gpu的方案中,其中也采用compressedvariablelengthbitvector(cvbv)format。
语音识别speechrecognition
语音识别(speechrecognition),是将语言的模拟信号顺序映射到一个具体的单词集合上。近年来,人工神经网络的方法在语音识别领域取得的效果已经远远超出了所有传统方法,正在成为全行业的主流。其中,深度神经网络有着极为广泛的应用。
图4示出了一种使用神经网络的语音识别引擎的例子。在图4的模型中,涉及利用深度学习模型来计算语音输出概率,即输入语音串与各种匹配候选之间相似度预测。通过本发明的方案,可以利用例如fpga来加速实现图4的dnn部分。
图5进一步示出了应用于图4的语音识别引擎的深度学习模型。
图5a中显示了包含cnn(卷积神经网络)、lstm(长短时记忆模型)、dnn(深度神经网络)、softmax等模块的深度学习模型。
图5b是本发明所旨在应用的学习模型,使用了多层lstm。
图5b的网络模型中,输入是一段语音片段。例如,约1秒的语音,被依次切割为100帧,每帧的特性可以由浮动型向量表示。
lstm(长短时记忆)
在语音识别领域,为了解决对长期信息的记忆问题,hochreiter&schmidhuber于1997年提出了长短时记忆(longshort-termmemory,lstm)模型。
图6示出了在语音识别领域所的使用一种lstm网络模型。lstm神经网络是rnn的一种,将普通rnn当中简单的重复神经网络模块改变为复杂的连接交互关系。lstm神经网络在语音识别中也取得了非常好的应用效果。
关于lstm的更多信息,可以参见如下文章:sakh,senioraw,beaufaysf.longshort-termmemoryrecurrentneuralnetworkarchitecturesforlargescaleacousticmodeling[c]//interspeech.2014:338-342,sakh,seniora,beaufaysf.longshort-termmemorybasedrecurrentneuralnetworkarchitecturesforlargevocabularyspeechrecognition[j].arxivpreprintarxiv:1402.1128,2014.
如上所述,lstm是一种类型的rnn。rnn与dnn的区别在于,rnn是时间依赖型的。具体而言,时刻t的输入依赖于时刻t-1的输出,即,当前帧的计算需要前一帧的计算结果。
图6所示的lstm的结构中,各个参数的意义如下:
-i、f、o分别代表三个gate,g为cell的特征输入;
-粗线代表上一帧的输出;
-每个gate有一个权值矩阵,t时刻输入与t-1的输出经过gate时的计算量较大;
-虚线代表peephole,peephole以及三个叉乘符号对应的操作均为element-wiseoperation,计算量较小。
如图7所示,为了减小lstm层的计算量,需要再额外引入一个投影层进行降维。
图7对应的计算公式为:
it=σ(wixxt+wiryt-1+wicct-1+bi)
ft=σ(wfxxt+wrfyt-1+wcfct-1+bf)
ct=ft⊙ct-1+it⊙g(wcxxt+wcryt-1+bc)
ot=σ(woxxt+woryt-1+wocct+bo)
mt=ot⊙h(ct)
yt=wyrmt
wic,wcf,woc即是peephole,对应示意图中的三条虚线。计算中单元(cell)作为操作数的运算均为向量间的element-wiseoperation。也可以将其理解成向量和对角矩阵的乘法,此时权值矩阵是对角矩阵。
近年来,广泛的研究表明,通过训练得到的神经网络模型矩阵中,仅有部分权值较大的元素代表着主要连接,发挥着关键作用,而其他权值较小的元素发挥的作用较小,可以被移除(置为零),与此同时对应的神经元也被剪枝(pruning)。剪枝后的网络通过重训(fine-tune),调整仍然保留在模型矩阵中权值的大小,可以保证网络的精度不下降。模型压缩可以将稠密的神经网络变成稀疏的神经网络,能够有效的减少计算量、降低访存量,从而实现加速。
然而,cpu与gpu无法充分享受到网络模型稀疏化后带来的好处,取得的加速有限。基于现场可编程门阵列(field-programmablegatearray,fpga)这一高性能硬件载体实现的稀疏神经网络加速器,相比于主流的cpu和gpu,具有一个数量级以上的能效比优势。然而,为了充分发挥其效能,也对神经网络的压缩提出了诸如负载均衡等更高的要求。
因此,本发明的目的在于提供一种考虑负载均衡的深度神经网络的压缩方法,其旨在针对fpga等平台的工作特点,实现多个处理单元(processelement,pe)负载均衡的神经网络模型压缩,从而达到释放储存资源、加快计算速度、降低功耗的全方位综合性能优化的效果。
技术实现要素:
为此,在一方面,本发明提出一种对神经网络进行压缩的方法,所述神经网络的神经元的连接关系被多个矩阵多表示,包括:分块步骤,对所述多个矩阵进行分块,把每个矩阵分为多个子矩阵;压缩步骤,对每个子矩阵进行压缩,从而把每个子矩阵压缩为稀疏矩阵;和编码步骤,对压缩后的每个稀疏子矩阵按照进行编码。
在另一方面,本发明提出一种压缩神经网络的方法,所述神经网络的神经元之间的连接关系以多个矩阵表示,所述方法包括:分块步骤,对所述多个矩阵进行分块,把每个矩阵分为多个子矩阵;敏感度分析步骤,用于分析所述多个矩阵中的每个矩阵的敏感度,以及确定各个矩阵的初始压缩比;压缩步骤,用于基于所述初始压缩比对所述各个矩阵的子矩阵进行压缩,以获得压缩后的神经网络;和重训步骤,用于重训所述压缩后的神经网络。
在另一方面,本发明提出一种对神经网络进行压缩的装置,所述神经网络的神经元的连接关系被多个矩阵多表示,包括:分块单元,用于对所述多个矩阵进行分块,把每个矩阵分为多个子矩阵;压缩单元,用于对每个子矩阵进行压缩,从而把每个子矩阵压缩为稀疏矩阵;和编码单元,用于对压缩后的每个稀疏子矩阵按照进行编码。
在另一方面,本发明提出一种压缩神经网络的装置,所述神经网络的神经元之间的连接关系以多个矩阵表示,所述装置包括:分块单元,用于对所述多个矩阵进行分块,把每个矩阵分为多个子矩阵;敏感度分析单元,用于分析所述多个矩阵中的每个矩阵的敏感度,以及确定各个矩阵的初始压缩比;压缩单元,用于基于所述初始压缩比对所述各个矩阵的子矩阵进行压缩,以获得压缩后的神经网络;和重训单元,用于重训所述压缩后的神经网络。
附图说明
图1示出了一种深度神经网络(deepneuralnetworks,dnns)的模型。
图2示出了一种利用剪切、重训的压缩神经网络的示意图。
图3示出了剪枝后的神经网络,其中一部分神经元被剪枝。
图4示出了一种使用神经网络的语音识别引擎的例子。
图5示出了应用于语音识别引擎的深度学习模型。
图6示出了应用于语音识别领域的一种lstm网络模型。
图7示出了一种改进的lstm网络模型。
图8示出了一种lstm神经网络的压缩方法。
图9示出了敏感度测试的具体步骤。
图10显示了对lstm网络应用敏感度测试的得到的相应曲线。
图11示出了确定最终稠密度序列并进行剪枝的具体步骤。
图12示出了通过“压缩试验-稠密度序列调整”迭代调整初始稠密度序列的具体子步骤。
图13示出了对神经网络进行重训的具体步骤。
图14示出了矩阵与向量相乘的运算的示例。
图15示出了不考虑负载均衡进行矩阵压缩的一个示例性结果。
图16示出了因负载不均衡产生空载周期的一个示例。
图17示出了对稠密矩阵进行分块的示例。
图18示出了考虑负载均衡进行矩阵压缩的一个示例性结果。
图19示出了按照稀疏矩阵储存方式进行储存的示例。
图20示出了考虑负载均衡的压缩方法的流程图。
图21示出了根据本发明的考虑负载均衡的压缩方法与常规压缩方法在不同压缩率下的加速比。
具体实施方式
发明人过去的研究成果
如发明人之前的文章“learningbothweightsandconnectionsforefficientneuralnetworks”中,已经提出了一种通过修剪来压缩神经网络(例如,cnn)的方法。所述方法包括如下步骤。
初始化步骤,把卷积层、fc层的权重初始化为随机值,其中生成了具有完全连接的ann,所述连接具有权重参数,
训练步骤,训练所述ann,根据ann的精度,来调整ann的权重,直到所述精度达到预定标准。所述训练步骤基于随机梯度下降算法来调整所述ann的权重,即随机调整权重值,基于ann的精度变化来进行选择。关于随机梯度算法的介绍,可以参见上述“learningbothweightsandconnectionsforefficientneuralnetworks”。此外,所述精度可以量化为,针对训练数据集,ann的预测结果和正确结果之间的差异。
修剪步骤,基于预定的条件,发现ann中的不重要的连接,修剪所述不重要的连接。具体而言,被修剪的连接的权重参数不再被保存。例如,所述预定条件包括以下任意之一:连接的权重参数为0;或连接的权重参数小于预定值。
微调步骤,将被修剪的连接重新设置为权重参数值为零的连接,即,恢复所述被修剪的连接,并分配权重值为0。
迭代步骤,判断ann的精度达到预定标准。如果没有,重复上述训练、修剪、微调步骤。
本发明提出的改进
本发明提供了一种多次迭代的深度神经网络的压缩方法。
图8示出了根据本发明的一个实施例的一种适用于lstm神经网络的压缩方法,其中通过多次迭代操作来实现神经网络的压缩。
根据图8的实施例,每次迭代操作具体包括敏感度分析、剪枝、重训三个步骤。下面对每个步骤进行具体说明。
步骤8100,敏感度测试(sensitivityanalysis)。
在该步骤中,例如,针对lstm网络中所有矩阵进行敏感度分析,以确定不同矩阵的初始稠密度(或者初始压缩比)。
图9示出了敏感度测试的具体步骤。
如图9所示,在步骤8110,例如,对lstm网络中的各个矩阵尝试按照不同稠密度进行压缩(所选择的稠密度例如是0.1,0.2,…,0.9,对矩阵的具体压缩方法参考步骤8200)。然后,测量以不同稠密度压缩的网络的词错误率(worderrorrate,wer)。
在识别一段单词序列时,可能存在一些单词被错误地插入、删除或替换的情况。例如,对于包含n个单词的一段初始识别文字而言,如果有i个单词被插入、d个单词被删除以及s个文字被替换,那么wer为:
wer=(i+d+s)/n,
其中,wer通常由百分比表示。通常而言,压缩后网络的wer会变大,这意味着压缩后网络的精度会变差。
在步骤8120,对于一个矩阵,以稠密度为横坐标,wer为纵坐标,绘制神经网络中该矩阵在不同稠密度下的wer曲线。针对每个矩阵都绘制所述稠密度-wer曲线。
在步骤8130,对于一个矩阵,从曲线中寻找wer剧烈变化的点所对应的稠密度为该矩阵的初始稠密度。针对每个矩阵都获得所述初始稠密度。
在本实施例中,选取稠密度-wer曲线的拐点所对应的稠密度作为该矩阵的初始稠密度。具体而言,在一次迭代中拐点以如下方法确定:
已知压缩前(即稠密度为1)的初始网络wer为:wer(initial);
针对不同稠密度得到相应的压缩后的网络wer为:wer(0.1)、wer(0.2)、···、wer(0.9);
计算δwer,即:wer(0.1)与wer(initial)进行比较、wer(0.2)与wer(initial)进行比较、···、wer(0.9)与wer(initial)进行比较;
基于计算得到的δwer,拐点指的是δwer小于一定阈值的所有点当中具有最小稠密度的那个点。应当理解,可以基于其他策略选取曲线中wer剧烈变化的点,这些策略也包含在本发明的范围中。
在一个示例中,对于一个3层lstm网络,其中每层有9个稠密矩阵需要压缩:wix、wfx、wcx、wox、wir、wfr、wcr、wor、wrm,这样一共有27个稠密矩阵需要压缩。
首先,对每个矩阵,按照稠密度从0.1到0.9,以步长0.1做9次试验,测试整个网络在9次试验中的wer,并绘制相应稠密度-wer曲线。这样,针对27个矩阵,一共获得27条曲线。
然后,针对每个矩阵,从该矩阵对应的稠密度-wer曲线中(例如,针对第一层lstm中的wix矩阵绘制的曲线),找到wer剧烈变化的点。
这里,认为相比于本轮迭代的初始网络的wer,δwer变化小于1%的所有点当中具有最小稠密度的那个点为拐点。
例如,假设初始网络的wer为24%,则选取曲线中wer小于25%的所有点当中具有最小稠密度的那个点作为拐点。取拐点对应的稠密度作为该wix的初始稠密度。
这样,可以得到一个长度为27的初始稠密度序列,分别对应每个矩阵的初始稠密度。因此可以以该初始稠密度序列指导压缩。
一个初始稠密度序列的例子如下(矩阵排列顺序为wcx、wix、wfx、wox、wcr、wir、wfr、wor、wrm):
densitylist=[0.2,0.1,0.1,0.1,0.3,0.3,0.1,0.1,0.3,
0.5,0.1,0.1,0.1,0.2,0.1,0.1,0.1,0.3,
0.4,0.3,0.1,0.2,0.3,0.3,0.1,0.2,0.5]
图10示出了一个单层lstm网络中9个矩阵的相应稠密度-wer曲线。可以看到,不同矩阵对于压缩的敏感度大相径庭,其中,w_g_x,w_r_m,w_g_r相对于其他矩阵而言较为敏感,即在稠密度-wer曲线中存在max(δwer)>1的点。
步骤8200,确定最终稠密度序列(densitydetermination)并进行剪枝(pruning)。
图11示出了确定最终稠密度序列并进行剪枝的具体步骤。
如图11所示,图8的步骤8200可以包括若干子步骤。
首先,在步骤8210,基于步骤8100中确定的初始稠密度序列,指导每一个对应的矩阵进行初次压缩试验。
然后,在步骤8215,基于初次压缩试验的结果,测试压缩后网络的wer。如果压缩前后网络的δwer超过某一阈值ε(例如,4%),则进行到下一步骤8220。
在步骤8220,通过“压缩试验-稠密度序列调整”迭代来调整初始稠密度序列。在步骤8225,获得最终稠密度序列。
如果δwer未超过该阈值ε,则直接进行到步骤8225,初始稠密度序列即为最终稠密度序列。
最后,在步骤8230,基于最终稠密度序列指导lstm网络进行剪枝。
下面,对图11的各子步骤进行详细说明。
步骤8210,进行初次压缩试验
根据研究中获得的经验,矩阵中绝对值比较大的权值对应着比较强的神经元连接关系。因此,在本实施例中,基于矩阵中元素的绝对值进行矩阵压缩。应当理解,可以基于其他策略对矩阵进行压缩,这些策略也包含在本发明的范围中。
根据本发明的一个实施例,对每个矩阵中的所有元素按照绝对值从小到大进行排序。然后,基于步骤8100中确定的该矩阵的初始稠密度对该矩阵进行压缩,只保留对应的稠密度所对应比例的绝对值较大的元素,并且将其余元素置零。例如,如果该矩阵的初始稠密度为0.4,那么,保留该矩阵中绝对值较大的前40%的元素,将剩余60%元素置零。
步骤8215,判断压缩前后网络的δwer超过某一阈值ε(例如,4%)。
步骤8220,如果压缩前后网络的δwer超过所述阈值ε(例如,4%),则通过“压缩试验-稠密度序列调整”迭代。
步骤8225,通过在步骤8220调整初始稠密度序列,获得最终稠密度序列。
图12示出了通过“压缩试验-稠密度序列调整”迭代调整初始稠密度序列的具体步骤。
如图12所示,在步骤8221,对相对敏感的矩阵的稠密度进行调整。即,上浮相对敏感的矩阵的稠密度,例如,上浮0.05。基于该稠密度,对相应矩阵进行压缩试验。
在本实施例中,压缩试验的策略与初次压缩试验相同,但是应当理解,可以选择其他策略对矩阵进行压缩,这些策略也包含在本发明的范围中。
然后,计算压缩后的网络的wer,若wer仍不满足目标,则继续上浮相对敏感的矩阵的稠密度,例如上浮0.1。基于该稠密度,对相应矩阵进行压缩试验。以此类推,直到压缩前后网络的δwer在所述阈值ε(例如,4%)以下。
可选地或依次地,在步骤8222,可以继续对相对不敏感的矩阵的稠密度进行微调,从而使压缩前后网络的δwer在某一阈值ε’(例如,3.5%)以下。这样,可以进一步提高压缩后的网络的准确度。
如图12所示,对相对不敏感的矩阵的稠密度的微调过程类似于前述对相对敏感的矩阵的稠密度的微调过程。
在一个示例中,神经网络的原始wer为24.2%,步骤8100中获得的初始稠密度序列为:
densitylist=[0.2,0.1,0.1,0.1,0.3,0.3,0.1,0.1,0.3,
0.5,0.1,0.1,0.1,0.2,0.1,0.1,0.1,0.3,
0.4,0.3,0.1,0.2,0.3,0.3,0.1,0.2,0.5]
按照初始稠密度序列对网络进行剪枝,压缩后的网络的wer恶化为32%,此时需要调整初始稠密度序列。具体步骤如下:
根据步骤8100的结果得知,第一层lstm中的矩阵wcx,wcr,wir,wrm、第二层中矩阵的wcx,wcr,wrm、和第三层中矩阵的wcx,wix,wox,wcr,wir,wor,wrm相对敏感,其余矩阵相对不敏感。
首先,对上述相对敏感的矩阵,按0.05的步长增大其对应的初始稠密度。
然后,基于上浮的稠密度对神经网络阵进行压缩试验。通过计算得到压缩后网络的wer为27.7%。此时,满足压缩前后网络δwer<4%的要求,停止调整相对敏感的矩阵的稠密度。
根据本发明的另一实施例,可选地,可以对相对不敏感的矩阵的初始稠密度进行微调,使压缩前后网络δwer<3.5%。在本示例中,省略该步骤。
因此,通过“压缩试验-稠密度序列调整”迭代调整得到的最终稠密度序列为:
densitylist=[0.25,0.1,0.1,0.1,0.35,0.35,0.1,0.1,0.35,
0.55,0.1,0.1,0.1,0.25,0.1,0.1,0.1,0.35,
0.45,0.35,0.1,0.25,0.35,0.35,0.1,0.25,0.55]
此时,压缩后的神经网络的整体稠密度约为0.24。
步骤8230,基于最终稠密度进行剪枝(pruning)。
例如,在本实施例中,同样基于矩阵中元素的绝对值对矩阵进行剪枝。
具体地,对每个矩阵中的所有元素按照绝对值从小到大进行排序;然后,基于最终稠密度序列对各矩阵进行压缩,对于每个矩阵,只保留相应稠密度对应的绝对值较大的元素,并且将其余元素置零。
在步骤8300,重训(finetuning)
对神经网络的训练是对损失函数进行优化的过程。损失函数指的是在给定输入下,神经网络模型预测的结果与真实结果之间的差别。希望损失函数的值尽可能小。
对神经网络的训练的本质在于寻找最优解。重训即指在已有的一个可能的离最优解很近的次优解的情况下,搜索最优解,也就是在一定的基础上继续训练。
例如,对于lstm深度神经网络,在步骤8200剪枝操作以后,在保留下来的权值的基础上继续训练,寻找最优解,就是一个重训的过程。
图13示出了对神经网络进行重训的具体步骤。
如图13所示,输入是在步骤8200剪枝操作之后的神经网络。
在步骤8310中,首先,用训练集训练步骤8200得到的稀疏神经网络并进行权值矩阵更新。
然后,在步骤8320,判断该矩阵是否收敛到局部最优解。
如果未收敛到局部最优解,则返回步骤8310,重复训练集训练和权值矩阵更新的步骤。
如果收敛到最优解,则进行到步骤8330,获得最终神经网络。
在本发明一个实施例中,重训时采用梯度下降法来更新权值矩阵。
具体地,梯度下降法基于这样的观察:
如果实值函数f(x)在点a处可微且有定义,那么函数f(x)在a点沿着梯度相反的方向-
对于γ>0为一个够小数值时成立,那么f(a)≥f(b),其中a是向量。
考虑到这一点,我们可以从函数f的局部极小值的初始估计x0出发,并考虑如下序列x0,x1,x2,…使得:
因此可得到:
如果顺利的话,序列(xn)收敛到期望的极值。注意每次迭代步长γ可以改变。
这里,将f(x)理解为损失函数,就可以理解梯度下降法使得模型预测损失减小的原理。
在一个示例中,参考论文dsd:regularizingdeepneuralnetworkswithdense-sparse-densetrainingflowinnips2016,对lstm深度神经网络的重训方法如下:
这里,w是权值矩阵,η代表学习率,也就是随机梯度下降法的步长,f是损失函数,
上式的含义是:用权值矩阵减去学习率与损失函数梯度的乘积,来更新权值矩阵。
在另一个示例中,保持网络中各个矩阵压缩后非零元素的分布的方法是使用掩码(mask)矩阵,该掩码矩阵仅包括0和1元素,用于记录压缩后矩阵非零元素的分布信息。
通常带掩码的重训方法如下:
mask=(w(0)≠0)
也就是,对计算出来的梯度乘以掩码矩阵,保证梯度矩阵变成与掩码矩阵相同的形状,用来更新权值矩阵。
下面,详细说明重训过程和收敛判断准则的一个具体示例。
在该示例中,重训的输入为:待训练的网络、学习率、最大训练轮数、keep_lr_iters(保持原学习率的轮数)、start_halving_impr(用于确定改变学习率的时机,例如0.01)、end_halving_impr(用于终止训练,例如0.001)、halving_factor(例如0.5)、数据集(训练集、交叉验证集、测试集)等。
此外,重训的输入还包括学习动量、num-stream、batch-size等参数,这里暂时省略这些参数。重训的输出为:训练后的网络。
重训的具体过程如下:
1、对待训练的初始模型采用交叉验证数据集测试平均损失(crossloss,后面简称“loss”),作为衡量网络训练好坏的初始标准;
2、迭代训练:
·迭代训练分为多个“epoch”进行(这里,训练集中所有数据运行一遍称为一个epoch,后面简称“一轮”),迭代的总轮数不会超过最大训练轮数max_iters;
·在每一轮中,采用训练数据集,利用梯度下降法,更新网络中矩阵的权值;
·每轮训练结束后,保存训练出的网络,并对其采用交叉验证数据集测试平均损失loss,如果此时的loss比上一轮有效训练的loss(记为loss_prev)大,则拒绝本次训练(下一轮的训练还是基于上一轮训练结果),否则接受本次训练(下一轮训练基于本轮训练结果),并存储本轮的loss;
·学习率的动态改变及训练终止的条件:涉及到输入参数start_halving_impr、end_halving_impr、halving_factor等,每轮训练结束后,根据(loss_prev-loss)/loss_prev计算improvement并记为real_impr,其表示本轮被接受的训练结果的loss相比于上一轮被接受的训练结果的loss相对提升的大小,然后根据real_impr进行处理:
1)如果迭代轮数小于keep_lr_iters,则不改变学习率;
2)如果real_impr小于start_halving_impr(例如0.01),即本轮训练相比于上一轮提升已经到某个较小的限度内,说明接近局部最优解了,则使得学习率减小(乘以halving_factor,通常是折半),从而减小梯度下降法的步长,以更小的步子接近局部最优解;
3)如果real_impr小于end_halving_impr(例如0.001),即本轮训练相比于上一轮相对提升比较小了,认为训练已经达到终点并终止训练(但是如果训练轮数小于min_iters,则会继续训练至min_iters轮)。
因此,训练结束的情况可能包括以下四种:
1、训满min_iters轮,中间未出现real_impr小于end_halving_impr,则取第min_iters轮的结果;
2、训满min_iters轮,中间出现了real_impr小于end_halving_impr,则取前min_iters轮中loss最小的那一轮训练结果;
3、正常训练超过min_iters轮,但是小于max_iters轮,出现real_impr小于end_halving_impr,则取最后一轮,也就是loss最小的那一轮的训练结果;
4、正常训练到max_iters轮,未出现real_impr小于end_halving_impr,取第max_iters轮的结果。
应注意,上述示例描述了一种重训过程以及用于确定矩阵是否收敛到局部最优解的判断准则。然而,在实际操作中,为了提高压缩效率,不必须等到收敛结果,可以取中间结果,然后进行下一轮压缩。
此外,判断准则还包括判断经过训练后的网络的wer是否满足一定标准等,这些判断准则也包含在本发明的范围中。
通过重训,网络的wer下降,从而减少了压缩带来的精度损失。例如,通过重训,一个稠密度为0.24的lstm网络的wer可以从27.7%下降到25.8%。
迭代步骤(iteration)
返回参照图8,如上文所述,本发明通过多次迭代操作、即重复上述步骤8100、8200、8300而将神经网络压缩至期望稠密度。
例如,在一个示例中,希望最终网络稠密度为0.14。
在第一轮迭代中,通过步骤8300得到稠密度为0.24、wer为25.8%的网络。
重复上述步骤8100、8200、8300对该网络继续进行多轮压缩。
例如,在第二轮压缩后,网络的稠密度为0.18,wer为24.7%。
继续第三轮压缩后,网络稠密度为0.14,wer为24.6%,达到目标。
本发明提出的进一步改进
如上文所述,对于神经网络模型,一般通过对其进行压缩而将稠密的神经网络变成稀疏的神经网络,从而有效的减少计算量、降低访存量,实现加速。
举例而言,lstm计算涉及9个稀疏矩阵,分别为:wix、wir、wfx、wfr、wcx、wcr、wox、wor和wry。为了提高运算效率,对需要运算的矩阵进行压缩并存储。
如图14所示,这里涉及的主要运算都是矩阵与向量相乘。
对于稠密矩阵,由于每一个元素(包括0)都参与运算,多个pe并行计算不会产生负载不均衡的问题。然而,由于这里使用了压缩技术,对稠密矩阵进行了稀疏化,实际上存储和参与运算的元素都是非零元素,因此也导致产生负载不均衡的问题。
图15示出了不考虑负载均衡进行矩阵压缩的一个示例性结果。不考虑负载均衡,即,对稠密矩阵直接进行压缩。
如图15所示,以pe0、pe1为例。压缩后,pe0中有14个非零元素,因此需要较长计算时间;而pe1中仅有5个非零元素,因此需要较短计算时间。由于二者在进行矩阵向量相乘运算时,需要共享输入向量,所以即使pe1首先完成计算,也需要等待pe0,因而产生了空载的时间。
图16示出了因pe之间负载不均衡产生空载周期的示例。可见,pe之间负载越不均衡,空载周期越长。
为解决上述问题,本发明提出一种考虑负载均衡的压缩方法。
该方法的本质在于,在对稠密矩阵进行压缩之前,先将稠密矩阵分割成大小相似的稠密子矩阵,其中,各子矩阵中含有相似数目的非零元素。
具体地,使用本发明的压缩方法进行矩阵压缩和储存包括以下步骤:
首先,在进行稠密矩阵压缩之前对矩阵进行分块;
然后,以相同的压缩率对每个稠密子矩阵进行压缩;
最后,对压缩后的每个稀疏子矩阵按照稀疏矩阵的特有格式进行存储。
下面,对矩阵分块、矩阵压缩和稀疏矩阵存储进行详细说明。
矩阵分块
由于单个矩阵与向量相乘是在n个pe中同时进行的,所以,需要首先对矩阵进行分块。即,将矩阵分成n个子矩阵,并且将数据相应地分给各个pe。
由于希望每个pe中非零元素较为均衡,从而保证均衡的计算时间,希望对每个稠密矩阵分块后,各子矩阵大小相似并且每个子矩阵中具有相似数量的非零元素。
在本发明的一个实施例中,对每个稠密矩阵以每隔n行抽取的方式进行分割,从而形成n个大小相似的子矩阵。这里,选择隔n行抽取的方式分割矩阵是为了使分割后的子矩阵更倾向于具有相似数量的非零元素。这样,在以相同压缩率对子矩阵进行压缩后,每个pe中的非零元素较为均衡。
图17示出了按行循环将2048*512的稠密矩阵分为32个子矩阵的示例,每个子矩阵的大小为64*512。例如,所述32个子矩阵可以对应于32个计算单元(pe),或其它个数(例如16、8、4个)的计算单元。
应理解,也可以采用其他矩阵分块策略用于形成非零元素较为均衡的子矩阵,这些策略也包括在本发明的范围内。
矩阵压缩为稀疏矩阵
在分块后,以相同的压缩率对每个子矩阵进行压缩。例如,将各子矩阵中的元素按绝对值从小到大进行排序,保留与相应压缩率相对应比例的绝对值较大的元素,并将其余元素置零。
由于这n个子矩阵采用完全相同的压缩率,压缩后,其非零元素个数也是均衡的。
图18示出了考虑负载均衡进行矩阵压缩的一个示例性结果。
如图18所示,以pe0、pe1为例,考虑负载均衡进行压缩后,pe0中有10个非零元素,pe1中有9个非零元素。pe0和pe1二者的计算时间相似,从而减少了空载周期,进而缩短了计算周期。
稀疏矩阵编码存储
对压缩后的稀疏子矩阵进行储存。通过使用稀疏矩阵特有的格式进行储存,可以大大减小储存空间。其中,使用真值、相对行索引和列指针三个向量来表示原来的稀疏矩阵。
图19示出了一种具体的存储方法,其示出了由被框选的行组成的子矩阵按照稀疏矩阵存储格式存储的结果。
关于该储存方法的具体内容,可以参照发明人之一过去发表的研究论文:eie:efficientinferenceengineoncompresseddeepneuralnetwork.。此外,可以采用行压缩(compressedrowstoragecrs)和列压缩存储(compressedcolumnstorageccs)。
lstm神经网络的压缩
图20示出了根据本发明的一个实施例的适用于lstm神经网络的压缩方法。
根据图20的实施例,每次迭代操作具体包括矩阵分块、敏感度分析、剪枝、重训4个步骤。下面对每个步骤进行具体说明。
步骤2010,矩阵分块。
在该步骤中,结合硬件中pe的个数(假设为n),对每一个待压缩的矩阵按每隔n行进行抽取的方式,将其分割成n个大小相似的子矩阵。
步骤2020,敏感度测试。
在该步骤中,针对lstm网络中的各个矩阵尝试按照不同压缩率进行压缩,基于以不同压缩率压缩后的网络的词错误率,确定各矩阵的初始压缩率。
例如参照图8、图9的记载可知,在敏感度测试过程中,也涉及以不同的压缩比对矩阵进行压缩。所述敏感度测试步骤2020中的压缩步骤,可以进一步参考图8的步骤8200以及图11的流程记载。
因此,通过步骤2010的矩阵分块步骤,可以进一步提高敏感度测试步骤2020的速度和效率,从而实现了优化。
步骤2030,压缩步骤。
基于步骤2020中确定的压缩率对相应子矩阵进行压缩。
具体地,将各子矩阵中的元素按绝对值从小到大进行排序,保留与相应压缩率相对应比例的绝对值较大的元素,并将其余元素置零。
由于这n个子矩阵采用完全相同的压缩率,压缩后,其非零元素个数也是均衡的。
关于所述压缩操作的更多信息,可以进一步参考图8的步骤8200以及图11、12的流程记载。
步骤2040,重训步骤。
对步骤2030中得到的神经网络进行重训,从而在不改变压缩率的情况下重新提升网络的准确率,减小压缩带来的精度损耗。
具体地,首先,使用训练集对该神经网络进行训练,并进行权值矩阵更新;然后,判断该矩阵是否收敛到局部最优解。如果未收敛到局部最优解,则返回继续训练;如果收敛到最优解,则把该神经网络作为最终神经网络。
关于所述重训操作的更多信息,可以进一步参考图8的步骤8300以及图13的流程记载。
图21示出了根据本发明的考虑负载均衡的压缩方法和不考虑负载均衡的压缩方法在不同压缩率下取得的加速比。可见,通过本发明的考虑负载均衡的压缩方法,网络的运算效率得到提高。
技术效果
基于上述技术方案可知,本发明提出考虑负载均衡的压缩方法具有以下有益效果:
1、通过采用该方法,可以将原始的稠密网络经过一系列独特的压缩操作,生成精度基本保持不变,但实际参数大大减少的新网络,从而解决运算中有效数据占比较低的问题,极大的减小了存储空间,有效的提高了运算效率;
2、如上文所述,pe之间负载不均衡会导致硬件实际性能与理论峰值性能之间存在显著差异。通过采用本发明的压缩方法,在网络压缩时充分考虑fpga等硬件平台多个内核并行计算的特点,使各个pe中参与运算的矩阵非零元个数相似,从而保证各个pe的负载均衡,极大的提升硬件平台的资源利用率。
以上实施例仅仅以lstm网络作为说明本发明的例子。应当理解,本发明可以不限于lstm神经网络,而是可以应用到其他各种神经网络。