一种基于忆阻器的神经网络加速器中激活函数的实现方法与流程

专利2022-06-29  101


本发明属于新型材料的非易失存储器领域,涉及存储器内计算技术和神经网络激活函数运算部分的加速。



背景技术:

新兴的忆阻器(rram)被认为是深度神经网络(dnn)加速的新范例,因为它能快速地实现在dnn中必不可少的矩阵向量乘(矩阵向量乘)操作。在rram连续的输入电压切换过程中,矩阵向量乘可以在rram的忆阻器阵列结构上进行模拟域的计算,并具有大量的并行性,几乎将计算复杂度从o(n2)减少到o(1)。同时,当所需要计算的权重直接映射在rram的忆阻器阵列上时,可以消除数据的搬移过程。

现阶段针对基于忆阻器神经网络加速运算的方法,不同于传统的cmos工艺,忆阻器利用阻值存储逻辑信息“1”和“0”,输入数据经过数字模拟转换器件(dac)将数字量转换为电压模拟量,并通过字线将电压施加给电导,结合欧姆定律和基尔霍夫电流定律,电流在位线上汇聚,经由采样保持电路将电流值转换为电压值,再经由模拟数字转换器件(adc)和移位相加模块得到最后的输出结果,从而完成神经网络中大量的乘累加操作运算操作。

基于rram的深度神经网络加速器由于其善于求解矩阵向量乘法而显示出巨大的潜力。然而,这种矩阵向量乘的计算设计范式不适用于神经网络中的其他操作,如激活函数运算操作,它可能包含各种超越函数,需要不同的定制电路,就像传统的神经网络加速器设计一样。如果采用rram电路和cmos电路相结合的方式,那激活函数运算部分可能成为整个神经网络加速的瓶颈。



技术实现要素:

本申请要解决的问题是rram电路不适合激活函数的运算。本申请通过有效的编码和多次迭代合并的方法,提出了基于忆阻器的cordic算法(rram-cordic算法)和其在忆阻器阵列上的运算方式,从而实现了各种基于rram的激活函数计算,可以根据对精度、运算速度和互连方式与所需要计算的激活函数的种类等需求进行选择。

为实现上述目的,本申请还提出了一种基于忆阻器的神经网络加速器中激活函数的实现方法,包括:改造传统的cordic算法(改造后的算法称为rram-cordic算法),使其适合于用忆阻器阵列来运算,然后改造忆阻器阵列电路,使其适合于执行rram-cordic算法,从而能够运算超越函数,从而能够运算激活函数。

进一步地,所述rram-cordic算法,是对传统cordic算法的改进,在所述rram-cordic算法中,直接令θi=2-i,使用角度二极化重编码(bbr)对输入编码,并通过多次迭代合并的方式,构造出乘累加算子。

进一步地,将输入值用二进制方式表示(角度用弧度表示,再转化为二进制),经过公式eq1的转换将二进制的角度旋转方向定义域bi∈{0,1}转换为ri 1∈{-1,1},定义域转换保持了传统cordic算法旋转角度的连续性,也消除了角度预测的过程,因为-1代表顺时针旋转,1代表逆时针旋转。

进一步地,基于传统cordic算法,每一次的迭代如eq2所示:

通过两次迭代合并的方式,可以将公式eq2转换成公式eq3,构造出乘累加算子:

可以对eq2进行多次迭代合并,当合并所有迭代时,可得出eq7,直接由初始值计算出最终值。

进一步地,利用在接近0时tanθ≈θ的泰勒级数展开,可以得到公式eq4:

可以发现在截断精度允许的范围内,其数值的表示范围超过了截断精度,可以忽略这些因子项,构造乘累加算子,合并迭代,得公式eq5:

其中k的取值依据所计算的函数与计算精度要求来确定。

进一步地,对忆阻器阵列的改造方法为:使用一对忆阻器阵列来进行所述rram-cordic算法中的乘累加运算;使用状态机来计算所述rram-cordic算法中的系数的绝对值,并分别取正负两个值作为权重写入所述忆阻器阵列;使用所述状态机来计算rram-cordic算法中的系数的符号,并在运算时选择使用正值的权重或负值的权重。

进一步地,所述忆阻器阵列内部划分为若干组,每组的字线位线不重叠,每组对应执行所述rram-cordic算法中的一个迭代,或若干步合并后的迭代。

进一步地,所述忆阻器阵列内部的组从1递增编号,以流水的形式执行所述rram-cordic算法,第i组的计算结果作为第i 1组的输入,第1组的输入为初始值,第n组的输出为计算结果。

本申请还提出了一种基于忆阻器阵列的电路,用来运行所述rram-cordic算法,包含状态机、两个忆阻器阵列,两个忆阻器阵列组成一对。

进一步地,每一所述忆阻器阵列内部被划分为若干组,组与组之间位字线均无重叠,这样组与组之间的输入与输出不会互相干扰。

进一步地,所有的组从1递增编号,第i组的输出连接至第i 1组的输入,第1组的输入为初始值,最后中一组的输出为计算结果。

进一步地,所述状态机被设计为:在开始运算前,依据要计算的函数,把计算出来的每次迭代的系数的绝对值分别取正负两个值作为权重写入所述忆阻器阵列中对应的组,在运算时,通过输出行控信号来控制选择正值的权重或负值的权重。

本发明的有益效果在于,通过rram-cordic算法可以实现各种基于rram的激活函数计算,可以根据对精度、运算速度和互连方式与所需要计算的激活函数的种类等需求进行选择,消除了实现超越函数的cmos电路,可以用更多的计算资源交换矩阵向量乘,从而在rram中大大提高了运算效率。

以下将结合附图对本发明的构思、具体结构及产生的技术效果作进一步说明,以充分地了解本发明的目的、特征和效果。

附图说明

图1是忆阻器模拟运算示意图;

图2(a)、(b)、(c)是本发明的另一个较佳实施例的激活函数运算电路架构示意图;

其中:dac/adc-数模/模数转换模块,s&&h-采样保持电路,s&&a-移位加法模块。

具体实施方式

以下参考说明书附图介绍本发明的多个优选实施例,使其技术内容更加清楚和便于理解。本发明可以通过许多不同形式的实施例来得以体现,本发明的保护范围并非仅限于文中提到的实施例。

忆阻器本身是一种存储器件,但由于其特有的根据流经自身的电荷量来改变阻值的阻变特性,这让它在存储器内计算领域很有应用前景。图1为忆阻器的结构和模拟运算方式的示意图,它有正负两个电极,电极之间是具有阻变特性的材料,多个忆阻器单元以一定的拓扑结构排列在电路中,通过在字线上控制输入电压,位线上累计输出电流的方式,模拟乘累加运算。同时又由于忆阻器既可以作为存储器件,又可以进行运算的特性,省去了传统计算机中数据访存的操作,使得整体运算速度有了很大的提高。

本申请对传统cordic算法和忆阻器存储阵列结构进行改进,提出一种新的基于忆阻器的计算激活函数的算法,命名为rram-cordic算法,该算法一方面能够在不增加额外cmos运算电路的前提下实现任意的超越函数运算,同时提供了算法在rram忆阻器阵列上的两种运算方式,以便根据不同应用场景下对精度、运算速度和互连方式与所需要计算的激活函数的种类等需求进行选择。另一方面丰富了神经网络在rram计算阵列上的运算原语,解决了计算过程中可能出现的cmos电路和rram电路计算速度不匹配的问题,提高整体运算效率。

rram-cordic算法为改进的cordic算法,采用角度二极化重编码(bbr)方法,消除传统cordic算法计算过程中方向选择的过程,同时结合rram器件特有的擅长乘累加运算的特性,通过多次跨步迭代合并的方法构造更多的乘累加算子,从而加速了计算超越函数需要多次迭代的过程。

传统的cordic算法是令tanθi=2-i,需要每次迭代运算完才能判定下次迭代运算的旋转方向,而rram-cordic算法直接令θi=2-i,bbr编码就是将输入值用二进制方式表示(角度用弧度表示,再转化为二进制),经过公式eq1的转换将二进制的角度旋转方向定义域bi∈{0,1}转换为ri 1∈{-1,1},定义域转换保持了传统cordic算法旋转角度的连续性,也消除了角度预测的过程,因为-1代表顺时针旋转,1代表逆时针旋转。

基于传统cordic算法,每一次的迭代如eq2所示:

通过多次迭代合并的方式,可以将公式eq2转换成公式eq3,构造出乘累加算子,既可以减少迭代次数,也可以使运算适应于忆阻器阵列。

利用在接近0时tanθ≈θ的泰勒级数展开,可以得到公式eq4。

可以发现在截断精度允许的范围内,其数值的表示范围超过了截断精度,可以忽略这些因子项,构造乘累加算子,合并迭代,具体公式eq5所示:

使用eq2反复迭代,得出eq7,直接由初始值计算出最终值。

在一个较佳的实施例中,使用如图2(a)所示的电路执行rram-cordic算法。该电路的设计思路是依据eq1、eq2与eq5。两个忆阻器阵列组成一对,用来执行eq2与eq5。每一忆阻器阵列由64x64个忆阻器组成,内部被划分为若干3x8的组以及1个19x8的组,组与组之间位字线均无重叠,构成阶梯形(在其它实施例中,也可以是其它形状,只要组与组之间的位字线均无重叠即可),这样组与组之间的输入与输出不会互相干扰。自左上至右下依次为每组从1递增编号(在其它实施例中,编号的方法可以不同,体现出顺序既可),第1组的输入为初始值,第1组的输出连接至第2组的输入,第2组的输出连至第3组的输入,依此类推。每组的输出,除了连接到本忆阻器阵列的下一组输入外,还交叉连接到另一忆阻器阵列的下一组输入。eq2中,第i步迭代的xi和yi系数值作为权重值映射到第i组忆阻器,以xi 1=1*xi ri*tanh(2-i)*yi为例,系数为1和ri*tanh(2-i),ri*tanh(2-i)在某一运算中可能为正也可能为,对正负都作了权重映射,所以,每组被映射了3个权重值,由行控信号来选择具体使用正的还是负的权重。eq5中,xk和yk系数作为权重映射到最后一组忆阻器。行控信号由状态机来产生,状态机执行eq1,对需要计算超越函数的数据编码并使其作为行控信号,如果是“1”控制表示正数的权重行打开,如果是“0”控制表示负数的权重行打开。在执行运算前,状态机把权重写入忆阻器阵列,在运算时,状态机输出行控信号,第1组根据初始值和其上映射的权重执行eq2,然后第2组把第1组的计算结果作为输入并根据其上映射的权重执行eq2,依此类推,直到第k步,然后最后1组执行eq5。

在另一个较佳的实施例中,使用如图2(b)所示的电路执行rram-cordic算法。该电路的设计思路是依据eq1与eq7。两个忆阻器交叉阵列组成一对,两块忆阻器阵列的外部输入分别为初始值x0、y0。本实施例中,令eq7中n的取值为16,每块忆阻器阵列内部划分为两个32x8的组,第一个32x8的组编号为1,映射权重的原码,即ri=1或者ri*ri 1*......=1,第二个32x8的组编号为2,映射权重的补码,即ri=-1或者ri*ri 1*......=-1。与上一个实施例相比,不再采用逐步迭代的方式,而是将所有次迭代过程全部展开后,直接计算出x0和y0的系数,作为权重值紧密的在竖直方向映射,只需要一次乘累加运算之后直接得到xn、yn。eq7中,所有迭代合并之后得到的x0和y0系数值作为权重值映射到忆阻器,以eq7为例,需要做权重映射的系数是1、r0tanh(2-0)、r1tanh(2-1)、r2tanh(2-2)、r0r1tanh(2-1)tanh(2-0)和r0r1r2tanh(2-2)tanh(2-1)tanh(2-0)等等,系数绝对值越来越小,若系统的数量超出32个,则后面的舍去,ri或者ri*ri 1*......作为行控信号选择具体使用正的还是负的权重。行控信号由状态机来产生,状态机执行eq1,对需要计算超越函数的数据编码并求得ri或者ri*ri 1*......使其作为行控信号,如果ri或者ri*ri 1*......是“1”控制表示正数的权重行打开,如果是“-1”控制表示负数的权重行打开。在执行运算前,状态机把权重写入忆阻器阵列,在运算时,状态机输出行控信号,执行eq7。

如图2(a)这种电路,运算的迭代周期长、互连较复杂且不能同时计算多种超越函数,但计算精度高。如图2(b)这种电路,运算的迭代周期短,互连简单且可以同时计算多种超越函数,但计算精度低。

在另一个实施例中,使用如图2(a)的电路计算tanh(0.25)的值。神经网络的计算精度是16bits,每个rram单元能表示2bit数据,因此8个rram单元才能表示一个数据。即映射一个权重值需要8个rram单元。

0.25的16bit二进制表示是0.010000000000000,基于公式eq1先将010000000000000用bbr编码方式编码,得到忆阻器阵列的行控开关信号ri(-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,),这一部分在状态机里面完成。结合传统cordic初始输入值,bbr编码之后的阵列输入初始值是n=16时,k是传统cordic算法中的固定值1.2075,因此阵列的输入是固定的初始值(1.17520355517,0.54308172669)。

然后基于传统cordic算法的迭代公式eq2:

我们合并两次迭代得到公式eq3:

且根据泰勒级数展开我们可以知道,在接近于0的时候tanθ≈θ,可以将公式eq2近似得到eq4:

在16bit精度的允许范围内,在i>7时tanh(2-2i-1)表示的数据已经不能在硬件上表示了,所以可以省去。因此根据表1可以知道在i>7时的迭代可以近似成eq6,这样9次迭代合并成一次迭代。

由于i≤7时的tanh(2-2i-1)不能省略,所以迭代不能合并,具体合并多少次迭代根据实际要计算的超越函数来计算。

θi和tanhθi的十进制表示和二进制表示

表1

参考表1,将所有的tanh(2-i)都计算完成后就可以得到需要被映射在忆阻器阵列上所有的权重值。这些权重值需要原码和补码两种表示即正负tanh(2-i),在忆阻器阵列上对应映射在两行上,公式eq2中的1也作为权重映射在忆阻器阵列上,这3行对应着图2(a)里面的黑白灰三行。行控开关信号ri=1时选择原码那一行,ri=-1时选择补码那一行。以0.25为例,第二次迭代选择原码和1那两行作为权重,其余次迭代选择补码和1那两行作为权重。

在另一个实施例中,使用如图2(a)的电路以流水线方式计算tanh(0.25和tanh(0.5的值。在第一个周期,状态机完成对0.25的编码并保存在状态机中的寄存器;在第二个周期,对0.25进行第一次迭代,第一组3*8忆阻器的行控信号是0.25编码的结果,同时对0.5编码,编码结果也保存在寄存器中;在第三个周期,0.25第一次迭代的结果作为第二次迭代的输入,在第二组3*8忆阻器上进行第二次迭代,此时第二组的行控信号采用0.25的编码结果作为行控信号,而第一组3*8模块进行第一次迭代,它的行控信号用的是0.5的编码结果;依此类推,直至所有计算都完成。这样,整个计算过程流水执行,不同实例之间并行执行。每个数据的编码结果在寄存器中保留到最终结果计算完成之后清除。

下面以实现lstm中用到的双曲激活函数“tanh”为例,从运算方式,两种不同的电路运算方式等方面体现本专利技术效果,此外还评估了rram-cordic算法的精度、对神经网络计算结果的影响以及面积折算后带来的性能提升:

运算方式:对于16bits的计算数据而言,相比于传统的cmos算法,本发明可以减少约至少62.5%的迭代步骤,这里的迭代步骤并没有计算传统cordic算法旋转方向预测的步骤,也没有考虑cmos电路和rram电路运算速度的问题,事实上传统cordic算法每次迭代之前都需要进行方向预测。

电路运算方式:本发明运算并没有增加额外的忆阻器交叉阵列,计算dnn的整体硬件模块如图2(c),同时直接利用交叉阵列周边原有的数模/模数转换模块、采样保持电路和移位加法模块模块。本发明增加了一个状态机用来控制不同超越函数的权重写入忆阻器交叉阵列,且仅在运算之前进行权重更新。本发明图2(b)采用分布式输入和分布式权重映射方式,和原有的dnn计算单元相比,硬件部分没有发生改变。本发明图2(a)采用交叉式输入与阶梯式权重映射方式,和原有的dnn计算单元相比,区别仅在于输入是两个忆阻器交叉阵列的输入是交叉的,且除了最后一次经过采样保持电路之后的电压值接入模数转换之外,其他次迭代的输出结果直接将电压值接入到下一次的输入,减少了多次数-模,模-数转化操作,提高了运算速度,而且不会由于复用模数转换模块,使这一激活函数运算电路成为整个神经网络运算电路的瓶颈。

算法精度:基于忆阻器器件的运算特性,融合角度二极化重编码(bbr)方式和多次迭代合并的运算方式,提出了改进后的cordic算法,即rram-cordic算法,经过matlab验证,和标准库函数计算的超越函数的最大相对误差和平均相对误差是2.64*10-6和2.02*10-6

对神经网络计算结果的影响:基于tensorflow平台,我们用rram-cordic算法和标准的库函数分别作激活函数模块的运算,选取了cifar10数据集在cnn的lenet5、vgg16和resnet56网络结构上进行训练和推断;选取了mnist、ptb、imdb数据集在lstm-2048-512网络上进行训练的推断,结果误差在0.02%和0.52%之间。

面积折算后的性能提升:我们折算用rram电路替代cmos电路之后剩下的面积放置更多的忆阻器交叉阵列完成整个神经网络的任务,对于不同网络结构和不同大小的忆阻器阵列,整体性能提升20%~60%。

以上详细描述了本发明的较佳具体实施例。应当理解,本领域的普通技术无需创造性劳动就可以根据本发明的构思作出诸多修改和变化。因此,凡本技术领域中技术人员依本发明的构思在现有技术的基础上通过逻辑分析、推理或者有限的实验可以得到的技术方案,皆应在由权利要求书所确定的保护范围内。


技术特征:

1.一种基于忆阻器的神经网络加速器中激活函数的实现方法,其特征在于,包括:改造传统的cordic算法(改造后的算法称为rram-cordic算法),使其适合于用忆阻器阵列来运算,然后改造忆阻器阵列电路,使其适合于执行rram-cordic算法,从而能够运算超越函数,从而能够运算激活函数。

2.如权利要求1所述的基于忆阻器的神经网络加速器中激活函数的实现方法,所述rram-cordic算法是对传统cordic算法的改进,其特征在于,直接令θi=2-i,使用角度二极化重编码(bbr)对输入编码,并通过多次迭代合并的方式,构造出乘累加算子。

3.如权利要求2所述的基于忆阻器的神经网络加速器中激活函数的实现方法,其特征在于,在所述rram-cordic算法中,将输入值用二进制方式表示(角度用弧度表示,再转化为二进制),经过公式eq1的转换将二进制的角度旋转方向定义域bi∈{0,1}转换为ri 1∈{-1,1},定义域转换保持了传统cordic算法旋转角度的连续性,也消除了角度预测的过程,因为-1代表顺时针旋转,1代表逆时针旋转;

基于传统cordic算法,每一次的迭代如eq2所示:

通过如下若干种方式的一种或多种组合对传统cordic算法改造:

方式1、通过2次迭代合并的方式,将公式eq2转换成公式eq3,构造出乘累加算子:

方式2、利用eq2进行大于2次的迭代合并;

方式3、合并全部迭代,得出eq7,直接由初始值计算出最终值:

方式4、由公式eq2,利用在接近0时tanθ≈θ的泰勒级数展开,得到公式eq4:

方式5、由公式eq4,在截断精度允许的范围内,其数值的表示范围超过了截断精度,忽略这些因子项,构造乘累加算子,合并迭代,得公式eq5:

其中k的取值依据所计算的函数与计算精度要求来确定。

4.如权利要求3所述的基于忆阻器的神经网络加速器中激活函数的实现方法,其特征在于,对忆阻器阵列电路的改造方法包括:使用一对忆阻器阵列来进行所述rram-cordic算法中的乘累加运算;使用状态机来计算所述rram-cordic算法中的系数的绝对值,并分别取正负两个值作为权重写入所述忆阻器阵列;使用所述状态机来计算rram-cordic算法中的系数的符号,并在运算时选择使用正值的权重或负值的权重。

5.如权利要求4所述的基于忆阻器的神经网络加速器中激活函数的实现方法,其特征在于,所述忆阻器阵列内部划分为若干组,每组的字线位线不重叠,每组对应执行所述rram-cordic算法中的一个迭代,或若干步合并后的迭代。

6.如权利要求5所述的基于忆阻器的神经网络加速器中激活函数的实现方法,其特征在于,所述忆阻器阵列内部的组从1递增编号,以流水的形式执行所述rram-cordic算法,第i组的计算结果作为第i 1组的输入,第1组的输入为初始值,第n组的输出为计算结果。

7.一种基于忆阻器阵列的电路,其特征在于,用于运行如权利要求1-6任一所述的rram-cordic算法,包含状态机、两个忆阻器阵列,所述两个忆阻器阵列配对使用。

8.如权利要求7所述的基于忆阻器阵列电路,其特征在于,每一所述忆阻器阵列内部被划分为若干组,组与组之间位字线均无重叠,这样组与组之间的输入与输出不会互相干扰。

9.如权利要求8所述的基于忆阻器阵列电路,其特征在于,所有的组从1递增编号,第i组的输出连接至第i 1组的输入,第1组的输入为初始值,最后中一组的输出为计算结果。

10.如权利要求8所述的基于忆阻器阵列电路,其特征在于,所述状态机被设计为:在开始运算前,依据要计算的函数,把计算出来的每次迭代的系数的绝对值分别取正负两个值作为权重写入所述忆阻器阵列中对应的组,在运算时,通过输出行控信号来控制选择正值的权重或负值的权重。

技术总结
本发明公开了一种基于忆阻器的神经网络加速器中激活函数的实现方法,包括:改造传统的CORDIC算法(改造后的算法称为RRAM‑CORDIC算法),使其适合于用忆阻器阵列来运算,然后改造忆阻器阵列电路,使其适合于执行RRAM‑CORDIC算法,从而能够运算超越函数,从而能够运算激活函数。本发明的有益效果在于,通过RRAM‑CORDIC算法可以实现各种基于RRAM的激活函数计算,可以根据对精度、运算速度和互连方式与所需要计算的激活函数的种类等需求进行选择,消除了实现超越函数的CMOS电路,可以用更多的计算资源交换矩阵向量乘,从而在RRAM中大大提高了运算效率。

技术研发人员:张子涵;景乃锋;王琴;蒋剑飞;贺光辉;绳伟光;毛志刚
受保护的技术使用者:上海交通大学
技术研发日:2020.01.14
技术公布日:2020.06.09

转载请注明原文地址: https://bbs.8miu.com/read-15845.html

最新回复(0)