一种LSTM中门控单元加速运算的硬件实现电路的制作方法

文档序号:15934219发布日期:2018-11-14 02:07阅读:406来源:国知局

本发明属于集成电路设计技术领域,具体涉及针对lstm中门控单元的加速运算的硬件实现电路。

背景技术

lstm(longshort-termmemory长短期记忆模块)是一种时间递归神经网络,适合于处理和预测时间序列中间隔和延时相对较长的重要事件。lstm已经在科技领域有了多种应用,基于lstm的系统可以学习翻译语言、控制机器人、图像分析、文档摘要、语音识别、预测疾病等等任务。

lstm与传统递归神经网络相比,区别主要在于它在算法中增加了判断信息是否有用的处理器,而一个处理器中包含了三个门控单元:输入门、遗忘门和输出门。一个信息进入到lstm网络当中,可以根据规则来判断是否有用,可以在反复运算下解决神经网络中长序依赖的问题,也就说即便是非常长远的信息也可以保存下来用于判断当前时刻的是输出。这三个门控单元除了权重矩阵不同,用到的输入向量都是当前时刻的输入以及上一个时刻隐藏层的输出,并且权重矩阵与输入向量结合的方法都一样,具体公式如下:

it=sigmoid(w(xi)xt+w(hi)ht-1+bi)

ft=sigmoid(w(xf)xt+w(hf)ht-1+bf)

ot=sigmoid(w(xo)xt+w(ho)ht-1+bo)

其中,it代表输入门的输出,ft代表遗忘门的输出,ot代表输出门的输出,xt代表当前时刻的输入向量,ht-1代表上一时刻的隐藏层的输出向量,w(x)代表与当前时刻输入向量相对应的输入层权重矩阵,w(h)代表与上一时刻隐藏层输出相对应的隐藏层权重矩阵。

尽管现在深度神经网络的结构在许多不同领域的任务中都取得了巨大突破,准确度也大幅度上升,但是这些模型结构也越来越复杂,需要巨大的参数量和计算量,传统的商业处理器性能增长缓慢,亟需新的硬件平台加速人工智能算法的部署和应用。在进行lstm硬件加速器设计时,由于lstm计算需要的参数量巨大,所需的大量存储量成为了限制硬件实现电路发展的主要原因,门控单元是组成lstm的重要模块之一,一个门控单元的计算主要由矩阵向量乘法以及非线性激活函数组成,本发明提出了一种高效率的lstm门控单元实现的硬件电路结构,可以复用矩阵向量乘法中的输入向量,并且通过分段线性的方法映射复杂的非线性函数,该发明极大地减小了电路的运算复杂度,提高了电路的运行效率。



技术实现要素:

为了克服现有技术的不足,本发明的目的在于提供一种针对lstm中门控单元加速运算的硬件实现电路。

本发明提供的针对lstm中门控单元的加速运算的硬件实现电路,其包括数据传输模块、输入层乘累加模块、隐藏层乘累加模块以及非线性激活函数模块;其中:

所述数据传输模块,用于传输lstm中一个门控单元所需要的全部数据,包括当前时刻的输入向量、上个时刻隐藏层的输出向量、与输入向量相对应的输入层权重矩阵以及与上一时刻隐藏层输出向量对应的隐藏层权重矩阵。每个数据都通过一个fifo传入运算单元,内置一个组合逻辑来控制fifo进行数据传输时的传输长度以及传输次数等参数。

所述输入层乘累加模块,包含四个并行的子模块,用于完成lstm门控单元中与当前时刻输入向量相关的矩阵向量乘法运算。该模块采用两个数据流:当前时刻的输入向量流和输入层权重矩阵流,将同一个的输入向量与权重矩阵的每一行相乘并进行累加,产生一个与权重矩阵的高长度相同的输出向量。

所述隐藏层乘累加模块,包含四个并行的子模块,用于完成lstm门控单元中与上一时刻隐藏层的输出向量相关的矩阵向量乘法运算。该模块采用两个数据流:上一时刻隐藏层输出向量流和隐藏层权重矩阵流,将同一个的输入向量与权重矩阵的每一行相乘并进行累加,产生一个与权重矩阵的高长度相同的输出向量。

所述非线性激活函数模块,用于完成lstm门控单元中非线性函数的硬件实现。lstm当中用到的非线性函数为sigmoid和tanh,这两个非线性函数中用到了求幂和除法运算,直接映射的话硬件开销很大,该模块通过分段线性近似的方法,在保证精度的同时,利用查找表将非线性函数映射成硬件电路。

本发明中,所述的两个乘累加模块除了输入数据不同,具体的硬件结构完全相同,乘累加模块在实现矩阵向量乘法时完成数据的复用和数据的并行,具体方式如下:

乘累加模块采用两个数据流:输入向量流和权重矩阵流,由于相同的输入向量要与权重矩阵的每一行相乘并进行累加,所以每次获取到当前时刻的输入向量之后,将输入向量存入fifo中,当完成了该输入向量与矩阵的每一行的乘法之后再去获取下一个时刻的输入向量。输入向量每次与权重矩阵中的一行完成乘法之后会得到输出向量的一个元素,在计算出每个输出元素之后,乘累加模块被置零,以避免累加先行的矩阵行计算。最终乘累加模块得到的输出应该是一个与权重矩阵的高度大小相同的向量。

每个乘累加模块中包含四个并行的子模块,将输入向量和矩阵拆分成四部分同时进行乘法运算,四个子模块共同完成一个矩阵向量乘法,极大提高了电路运行的效率。

本发明中,所述的非线性激活函数模块中,通过分段线性近似的方法完成复杂非线性函数的硬件映射,具体方式如下:

由于lstm当中用到的非线性函数为sigmoid和tanh,这两个非线性函数中用到了求幂和除法运算,直接映射的话硬件开销很大,所以该模块通过分段线性近似的方法在保证精度的同时,完成非线性函数的映射。首先将得到这两个非线性函数的分段线性近似值,共同存入一个文件中,通过产生一个地址去索引其对应的非线性函数的输出,用地址的最高位来判断是sigmoid还是tanh,这样在使用非线性函数的时候可以进行灵活调用。

本发明中,通过数据传输模块将一个门控单元所需要的数据传输给计算单元,然后通过两个乘累加模块完成输入数据的矩阵向量乘法运算,最后通过非线性激活函数模块得到整个门控单元的运算结果。在乘累加模块中实现了数据的复用和数据的并行,在非线性激活函数模块中采用分段线性近似的方法在不影响精度的情况下完成对复杂函数的拟合,极大地减少了硬件资源消耗,缓解了lstm在硬件实现时遇到的存储空间消耗量大的问题,提高了电路的工作效率。

附图说明

图1为lstm中门控单元电路工作基本框图。

图2为乘累加模块电路工作框图。

图3为乘累加模块中数据复用和并行原理图。

图4为非线性激活函数模块索引地址生成方法。

图5为非线性激活函数模块工作框图。

具体实施方式

本发明中,lstm中门控单元电路的工作基本框图如图1所示。该设计的工作过程如下:首先通过数据传输模块将一个门控单元所需要的全部数据传输给计算单元,包括当前时刻的输入向量、上个时刻隐藏层的输出向量、与输入向量相对应的输入层权重矩阵以及与上一时刻隐藏层输出对应的隐藏层权重矩阵。

计算单元获取到所有的输入数据流之后,会经过乘累加模块得到矩阵向量乘法的输出结果,每个门控单元包括两个乘累加模块,输入层乘累加模块和隐藏层乘累加模块,分别计算当前时刻的输入向量xt与输入层权重矩阵w(x)相乘的结果以及上一个时刻隐藏层输出ht-1与隐藏层权重矩阵w(h)相乘的结果。

乘累加模块的工作原理为:该模块采用两个数据流:输入向量流和权重矩阵流,数据流中每次获取输入向量和权重矩阵中的一个元素,对于长度为width的输入向量,总共获取width次;对于高为height,宽为width的权重矩阵,每次获取矩阵中的一个元素,总共需要获取(height*width)次。最终一个乘累加模块可以得到这两个输入的矩阵向量乘法结果,结果应该为一个长度为height的向量。

由于在进行矩阵向量乘法运算时同一个输入向量要与权重矩阵的每一行相乘并进行累加才能得到输出向量的一个元素,所以每次获取到当前时刻的输入向量xt或ht-1之后,将输入向量存入fifo中,当完成了该输入向量与矩阵的每一行的乘法之后再去获取下一个时刻的输入向量,以此实现输入向量的数据复用。该模块会内置一个计数器(cnt),当计数器的大小等于权重矩阵的高度和宽度之积(height*width)时,代表完成了一个矩阵向量的乘法运算,可以去获取下一个时刻的输入向量xt+1或ht。

输入向量与权重矩阵的每一行相乘时,每个对应元素相乘并进行累加得到输出向量的一个元素。在计算出每个输出元素之后,乘累加模块被置零,以避免累加先行的矩阵行计算。最终乘累加模块得到的输出应该是一个与权重矩阵的高度大小相同的向量。每次乘累加得到的输出结果也将被存放在fifo中,直到完成一个完整的矩阵向量乘法,就输出到下一个模块中。乘累加模块的工作电路框图如图2所示。

本发明为了提高电路的运行效率,门控单元中采用了两种数据并行的方式,如图3所示,一种是横向的并行,每个乘累加模块中包含了四个子模块(mac1,mac2,mac3,mac4),门控单元中一次性读入32bits的输入数据[xt3,xt2,xt1,xt0]和[w3,w2,w1,w0],四个子模块分别处理其中的8bits输入数据,四个子模块并行计算,完成矩阵向量乘法,提高了电路的运算效率。另一种数据并行的方式为纵向并行,因为lstm中总共用到三个门控单元,所以可以纵向并行三个乘累加模块,分别输入[wi,wf,wo],同时完成三个门控单元的计算。图3描述了乘累加模块中数据复用和并行的过程。

关于门控单元中出现的偏置项(bias),只要将其加入到其中一个权重矩阵的最后一行就可以,而不需要增加多余的输入端口和配置。

例如,若一个lstm中门控单元的输入向量xt大小为(1,672),门控单元的输出维度为(1,600),那么我们需要将输入向量乘上一个大小为(672,600)的权重矩阵,所以我们的xt需要被复用600次。

两个乘累加模块的输出为w(x)*xt和w(h)*ht-1,将两个输出结果相加再通过一个非线性激活函数模块,就可以完成一个门控单元的所有运算。

一个完整的lstm中会用到sigmoid和tanh两种非线性激活函数,sigmoid和tanh函数的表达式如下所示:

可以看到这两个非线性激活函数包含了复杂的求幂以及除法运算,如果直接映射会消耗大量的硬件资源,为了节省资源并且提高电路的运算效率,我们将这两个激活函数用同一个模块完成,具体方法为将这两个非线性函数的线性近似结果保存到同一个文件当中,用查找表的方法得到非线性函数的近似值。

当这两个非线性函数的输入远大于0或者远小于0的时候结果会近似达到饱和,例如对于sigmoid函数,当输入大于8之后,可以近似的将函数的输出看作等于1,当输入小于-8之后,可以近似的将函数的输出看作为0;对于tanh函数,当输入大于8时,可以将函数的输出近似看作为1,当输入小于-8之后,可以将函数的输出近似看作为-1。所以我们在进行线性分段近似的时候只需要考虑输入在[-8,8]范围内的输出结果。所以在查找表中进行地址索引时,如果乘累加模块的输出为16bits,则可以选取其中的12bits外加一位选择位(select)作为索引的地址,其中来自乘累加模块的12bits包含了1位符号位,3位整数位和8位小数位,另外的1位选择位用来选择是sigmoid还是tanh。图4描述了索引地址选择的方法。

每个非线性激活函数选择了4096个采样点,所以查找表中一共有8192个采样结果,前4096个是sigmoid的输出,后4096个是tanh的输出。因为输入索引的范围为(-8,8),所以每间隔16/4096=0.00390625产生一个索引。

图5描述了非线性激活函数模块的工作框图,该模块通过这样分段线性近似的方法在保证了计算精度的同时减少了硬件资源消耗,并且计算一个非线性激活函数的值只需要2个clock的延迟,相比较于传统方法,不管是硬件开销还是延迟都有了很好的性能提升。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1