APP下载

基于梯度下降的脉冲神经网络训练算法

2021-02-27徐梦遥

现代计算机 2021年35期
关键词:脉冲阈值卷积

徐梦遥

(上海交通大学电子信息与电气工程学院,上海 200240)

0 引言

人工神经网络(artificial neural network,ANN)近年来迅猛发展并广泛运用于各行业[1]。ANN的一个计算单元包括多个加权输入和一个连续可求导的激活函数,可求导的激活函数使ANN易于通过沿梯度下降的方法进行训练[2],这样的计算单元也被称为人工神经元。但ANN与生物神经网络在结构,计算,信息传递机制上存在较大差异,且在很多任务场景中仍无法实现更智能的功能。与传统人工神经元相比,新一代脉冲神经网络(spiking neural network,SNN)神经元在信息的表达和传递上更加接近生物神经元[3-4],因此作为第三代神经网络,有望处理更复杂的任务、实现更好的性能,因而受到学术界的广泛研究。此外,对于规模更大的深度神经网络(deep neural net⁃work,DNN),脉冲神经网络的脉冲特性能够实现更好的能效比,占用更少的硬件资源。但由于脉冲神经网络不可求导的激活函数和离散的信息表达方式,现有的基于梯度下降的反向传播算法难以被用于训练SNN[5],因此SNN尚且缺乏一个有效的训练方法,影响了它的广泛应用。

一个常见的训练SNN的方法是先训练ANN,然后将其转换为SNN并进行权重微调[7-9]。这样的方法普遍存在的问题是会对ANN产生很多限制,例如不得使用偏差、批量归一化和平均池化层。Sengupta团队[9]提出将SNN神经元输入的最大值设置为激活阈值,但脉冲时间序列的总长度达到2000—2500,导致整个网络的计算时间非常长。Rueckauer团队[10]选择输入分布的某一个百分位作为阈值,在一定程度上降低了整个网络的计算延迟并提高了鲁棒性,但阈值的选择缺乏有效的方法。Hu团队[11]提出的ANN到SNN的转换算法是目前最成功的转换方法,但其脉冲时间序列长度非常长,计算效率较低。

另一种训练SNN的方法是使用反向传播进行训练[12-13],最大的挑战是脉冲神经网络激活函数和离散脉冲时间序列是不连续且不可求导的。Wu团队[14]第一次提出了利用空间和时间域上的反向传播来训练SNN,并在MNIST数据集上达到了较好的准确率。该方法的不足在于训练的计算量非常大,导致其难以被运用在规模更大的网络结构上。Zenke 和 Ganguli[15]设计了基于膜电位的模拟梯度函数用于反向传播,但此方法仅针对单一时刻的脉冲,难以运用在脉冲时间序列上。Shrestha和Orchard团队[16]使用膜电位和阈值之间的差异计算梯度,但仅在MNIST数据集上训练了一个较小的浅层网络,没有训练较大规模的网络。

总结现有的训练方法,训练大型脉冲神经网络依然存在三个尚未解决的问题:①以脉冲作为输入和输出的神经元模型是不可求导的,这阻碍了基于梯度下降的训练算法的实现。②离散的脉冲时间序列使得反向传播难以实现。③由于使用类似二进制的脉冲来表示数据,相比较传统神经网络,脉冲神经网络对参数变化更敏感,训练过程中可能存在难以收敛的问题。本文针对这三个问题,分别提出了解决方案。针对不可求导的脉冲神经元模型,本文设计了一种模拟神经元模型的可求导激活函数,这样的激活函数可以保证训练得到合理的激活阈值,对应图1绿色部分。针对第二个离散时间序列问题,本文提出将时间维度转换为空间维度方法,即训练时,在空间维度上处理数据在时间维度中的相互关系。针对第三个问题,本文设计了不同的编码与解码层将图片数据转换为脉冲数据,对应图1中蓝色部分。同时,笔者开发了一个基于Pytorch的训练深度脉冲神经网络的框架,对应图1整个训练阶段(Train⁃ing Stage)。图1中各部分的标号代表在本文中的详细介绍章节。训练阶段结束后会将训练好的权重和阈值传给测试阶段,激活函数采用原始的脉冲神经元模型进行最终的准确度测试,对应图1下半部分(Test Stage)。

图1 论文主要工作和实验流程

1 脉冲神经网络原理

与ANN相似,脉冲神经网络由相互连接的神经元组成,每一个神经元与上一层的若干个神经元连接,这一层的输出又作为下一层神经元的输入。不同于ANN输入以数值的形式出现,SNN神经元的输入则是脉冲时间序列,如图2中的Prespikesx1,x2和x2表示的是一个神经元的三个输入,他们的脉冲数量都为3,横坐标为时间,表示每一个序列的三个脉冲都在不同的时刻到达神经元。

图2 脉冲神经元示意图

衰减-整合-发射(leaky-integrate-and-fire,LIF)神经元模型是广泛用于描述脉冲神经网络神经元的模型,在此模型中,神经元的行为类比的建模为由电容器和电阻器组成的并联电路。

其中u是神经元膜电位,τ是膜电位衰减的时间常数。输入电流It定义为t时刻输入脉冲的加权总和:

其中,nl表示前一层网络中与当前神经元相连接的权重数量,wi是前一层的第i个神经元连接到当前神经元的权重。onl-1(t-tk)是第i个神经元在tk时刻的脉冲值,可以用以下公式表示:

图2中的LIF Neuron展现了LIF神经元的内部机制。每个脉冲oi-1(t-tk)通过相应的权重wi进行放大或缩小,以产生流入神经元的电流。输入电流累加到神经元的膜电位u中,对应衰减-整合-发射神经元模型中的整合,但该电位随时间常数τ随时间呈指数减弱,对应衰减。当膜电位超过阈值Vth时,神经元会产生输出脉冲,此时膜电位重置为ureset,否则,神经元接收输入脉冲后只会更新膜电位,并不会产生输出脉冲。对应衰减-整合-发射中的发射。描述以上脉冲神经元(LIF)模型的差分表达式为:

2 脉冲神经网络训练算法设计

2.1 脉冲序列的编码层与解码层设计

本文设计的脉冲编码层是整个SNN的第一层。编码层采用二进制编码,将浮点数转化为固定位数的二进制定点数,将初始数据压缩至x∈(0,1),将小数点固定在二进制数的最前端,即表示整数的位数为0,所有bit都用于表示小数,例如将浮点数f=0.23224转换为8位的二进制数0.00111011,将小数点固定在定点数的最左端,相当于把这个二进制数左移8位,得到b=00111011,这个二进制数就是编码层产生的脉冲序列,t=0时,最高位为0,代表此时没有脉冲,t=2时,第三高位为1,代表此时有脉冲,注意8位的二进制数意味着T=8。

本文设计的解码层作为SNN的最后一层。如果解码层依然采用二进制解码,在反向传播过程中,损失函数的导数通过这一个解码层时,会分别乘以20,21,…,27,导数值通过该层后会有指数倍的方差,使得训练过程中更新后的权重波动异常大而无法收敛。因此为了避免这一问题,本文在解码层设计了一个全连接层进行解码,此过程如图3所示。这个全连接层有T×1维的权重,且这个权重同其他全连接层一样,是神经网络中可训练的参数。

图3 全链接解码层

2.2 脉冲神经网络激活函数设计

对于单个脉冲神经元,它的激活函数是一个阶跃函数:

u是该神经元的膜电位,如图4所示。

图4 阶跃函数

当膜电位u超过阈值Vth时,神经元便会立刻产生一个脉冲传递到下一层的神经元。假设Vth=0,阶跃函数是不可导的函数,因此无法运用传统的沿梯度下降训练算法,因而设计一种可求导的拟激活函数即可解决上述问题:

此处的c是一个压缩常数,当c=1,Vth=0时,这个拟激活函数就是Sigmoid函数:

当c=3,Vth=1时,如图5黑色函数曲线所示,激活函数在x方向上被压缩。c越大,Θ(u)函数越接近阶跃函数,c越小,激活函数越平滑。

图5 不同压缩常数下的拟激活函数

在本实验中,脉冲神经网络的训练初期将c的初始值设置为1,随着迭代次数的增加,将c的值线性缓慢增大,从而无限逼近阶跃函数,最终当c=15时,如图5橘色函数曲线所示,平滑的激活函数已经非常趋近其原始的阶跃函数,当模型训练的损失不再减小时,即得到我们所需的模型参数,包括卷积层的卷积核权重,全链接层的权重和阈值Vth。激活函数对输入u求导得到:

在实验过程中发现,如果一层网络的所有神经元对应不同的阈值,参数的个数会急剧增加,训练时长也会增大,并且通过实验结果分析得知,将每一层网络同一个输出通道(chanel)的神经元使用相同的阈值时的训练结果,与使用各不相同的阈值的训练结果相比,并没有明显的准确率下降。因此同一层同一个通道的神经元使用一个共同的阈值Vth。

2.3 LIF迭代模型的设计与实现

脉冲神经元传递信息的机制可概括为LIF模型,在这个模型中,脉冲时间序列并没有固定的时间间隔,本文设计的迭代模型改变了LIF的随机性,加入固定时间步长的概念。并且具有时间维度的信息难以适应现有的神经网络训练框架,因此我们设计了LIF模型的迭代表达式,将时间转变为数据的第一个维度,也就是将时间维度刻画为空间维度,因而可以很好的适应现有的神经网络计算框架,例如Pytorch和TensorFlow等。以下是具体的设计思路。

首先对已有LIF模型表达式使用欧拉方法求解一阶微分方程,获得一个迭代表达式:

接下来,将神经元产生输出脉冲信号和重置的机制加入到公式中,假设ureset=0,得到下面的状态转移公式:

其中,l(n)分别表示第n层的神经元数量,wnij是从第n层的第j个神经元到第n+1层的第i个神经元的权重。Θ(∙)是2.2中的激活函数。以上两个表达式表明,ot,n+1是否产生输出脉冲会影响下一个状态ot+1,n+1。如果神经元在时间t发出脉冲,在t+1时刻,通过(1-ot,n+1(i))这个系数,将神经元膜电位重置为0,如果t时刻未产生脉冲输出,则将膜电位衰减成kτut,n+1。设kτut,n+1=0,即上一时刻的膜电位不会衰减后累积到下一时刻,则称这样的模型为整合-发射激活(IF Activa⁃tion)模型。

如图6所示,t时刻,神经元没有产生输出脉冲,膜电位为u,乘以时间衰减因子0.8之后,累加到下一时刻的膜电位上,并在下一个时刻经过脉冲激活函数,神经元进行下一时刻的脉冲输出。

图6 LIF模型的迭代示意图

2.4 处理时间脉冲序列的训练框架设计

在SNN训练过程中,为了表示时间维t={1,2,…,T},我们将一个特征图拆分为T个脉冲图,第t个图的任意位置(x,y)的值代表t时刻(x,y)位置的脉冲值bt(x,y),bt(x,y)∈{0,1}。如果bt(x,y)=1,则代表(x,y)位置有脉冲,若bt(x,y)=0,则代表没有脉冲。例如,对同一个(30×30)的特征图拆分成的T个(30×30)的脉冲图,在卷积层都让他们与相同的大小为3×3的卷积核进行卷积操作,stride为1,即卷积核对每一个脉冲图都进行卷积操作。因此输出是大小为(28×28)的T个特征图。

全链接层可看为是卷积核为(1×1)的卷积层,因此全链接层是卷积层的一种特殊情况,类比于全链接层也进行同样的运算。在Pytorch平台的具体实现中,将脉冲序列的时间维转换到批训练的batch维度,即可完成上述操作。例如原来的ANN训练中,设batch size=64,而训练脉冲神经网络时,同一批数据由于采用脉冲的形式表达,因此batch size=64×T。LIF迭代模型的具体实现框架如图7所示。在每个时刻t,激活层对一个batch中所有图的进行迭代的状态更新操作。

图7 LIF神经元拟激活层示意图

3 实验设计与结果分析

实验分为两个阶段,在训练阶段,对应图1中Training Stage,不断增大压缩常数直到拟脉冲神经元激活函数趋于阶跃函数并且训练的loss不再下降时,将训练得到的权重和阈值传递给测试阶段(Test Stage),则用脉冲神经元LIF模型替代拟脉冲神经元激活函数,对应图1中下半部分,最终对测试集进行准确度测试。

3.1 基于MNIST的脉冲卷积神经网络

第一个实验的神经网络结构针对手写数字数据集(MNIST)而设计,首先初始数据输入后进行编码,编码层将浮点数变为8个时间步长的连续脉冲时间序列,然后依次与16、32、32和16个大小均为3×3的卷积核卷积,注意每一个卷积层后都经过一个批标准化层,然后再进入LIF激活层。在最后一个全链接层之前经过一个2.1中设计的全链接解码层,输出则恢复为浮点数,然后经过一个全链接层直至输出,最终输出结果。

3.1.1 训练结果准确率分析

当设置压缩常数为2时,图8展示了整个训练过程中损失和在验证集上测试的准确度变化曲线,a图的横坐标为网络训练迭代次数,纵坐标为损失。由图中曲线可以看出,在训练的初始阶段,loss下降非常明显,从2.5下降到了0.5。到第50次迭代以后,训练的loss开始缓慢的下降,在到达第200次迭代以后,训练的loss不再明显下降,收敛到了0.2左右。b图的横坐标为epoch,纵坐标为在验证集上测试的准确度。在第1个epoch之后,准确率就已经达到了94%。在接下来的5个epoch之后,准确率已经达到了98%,最终在20个epoch之后之后,在验证集上的准确率达到99.1%。

图8 训练过程的损失和准确度曲线

为避免训练初始阶段就出现因压缩常数较大而导致梯度消失的现象,先将压缩常数设置为较小的数,本实验初始压缩常数设置为2。开始训练后,在loss到达一定的值而不再显著下降时,再逐步增加压缩常数的值为4,6,9,直到设置为20时停止增大压缩常数,此时拟脉冲神经元激活函数已经非常接近LIF模型的阶跃函数,在每个压缩常数下,训练完成后基于测试集的准确率如图9所示。随着压缩常数的增大准确率呈略微下降的趋势,但变化不明显,均在98.7%附近。由此可以得出以下结论,即在MNIST数据集上,使用较小的压缩常数训练之后的结果就已经可以达到98%,不需要再使用更大的压缩常数进行反复的训练,可以大大降低训练的时间成本和能耗成本。由此可知本文提出的训练方法较为高效。

图9 基于MNIST的脉冲神经网络在不同压缩常数时的准确度

将训练好的网络参数运用到第二阶段上,最终的准确率为98.81%。与其他脉冲神经网络在MNIST数据集上的结果比较如表2所示。相较于其他的SNN训练结果,提升了高达8.51%的准确率。

表2 不同SNN在MNIST数据集上的准确率

续表2

3.1.2 阈值分布分析

阈值的初始值均设置为0,在经过上述不断增大压缩常数的训练过程后,压缩常数固定在20时,第一、二和四个卷积层后的LIF层阈值分布直方图如图10所示,此处为了使图片显示分布效果更好,仅展示了三个卷积层后的阈值分布。图中各层的阈值分布方差较大,由此可以得出网络经过本文提出的训练方法训练过后,各个网络层的阈值处于一个特定的分布,从而使网络达到较好的分类结果。

图10 基于MNIST的脉冲神经网络各层阈值分布直方图

3.2 基于CIFAR-10的脉冲残差神经网络

实验二采用的网络结构是基于CIFAR-10数据集的ResNet20[25]。本实验在ResNet20网络结构的框架上,设计的脉冲神经网络如图11所示,与原本的ResNet20的差别在于,增加了编码层作为第一层,每一个block中有两个卷积层,仅第一个卷积层后采用拟激活函数LIF Activation,后一个卷积层接IF Activation。

图11 20层残差脉冲神经网络结构

每一批有64个样本,动量(Momentum)设置为0.9,在每一个脉冲神经元激活层之前采用Batch Normalization[26]。从 0.1 的学习率(Learning rate)开始,在损失(Loss)随着迭代不再显著下降时将其除以10,并在64000次迭代时终止训练,数据预处理[27]将原始图像的四个边填充4个像素,并且从填充图像或其水平翻转中随机采样并剪裁为32×32大小的图片进行训练。

3.2.1 训练结果准确率分析

当设置压缩常数为2时,图12展示了整个训练过程中损失和在验证集上测试的准确度变化曲线。

图12 基于CIFAR-10的ResNet训练中的损失和准确度曲线

图(a)的横坐标为网络训练迭代次数,纵坐标为损失。网络在每一个epoch完成之后,利用验证集对网络模型的效果进行测试,从而可以评估脉冲神经网络训练算法的效果。在训练开始阶段损失快速下降,到达500个迭代之后,损失在1.0附近波动。图(b)横坐标为epoch,纵坐标为在验证集上测试的准确度。准确率随着epoch增加而逐步增大,最后维持在70%附近。

当我们不断增大压缩常数,得到的准确率如图13所示。随着压缩常数的增大准确率呈略微下降的趋势,符合我们的预期,即输出数据随着激活函数趋向阶跃函数而越接近0或1,从而导致准确率逐渐下降。

图13 基于CIFAR-10的脉冲残差神经网络训练准确度

3.2.2 阈值分布分析

阈值的初始值均设置为0,在经过上述不断增大压缩常数的训练过程后,压缩常数固定在13时,第1,3,11,17个卷积层后的LIF层阈值分布直方图如图14所示。

图14 基于CIFAR10的脉冲神经残差网络各层阈值分布直方图

最终训练完成后,各层的阈值分布方差较大。此处为了使图片显示分布效果更好,仅展示了四个卷积层后的阈值分布。各个网络层的阈值处于一个特定的分布,从而使网络达到较好的分类结果。

3.3 脉冲神经网络能耗分析

传统ANN中的浮点数(floating point)乘累加(multiply-accumulate,MAC)操作被SNN中的浮点数加法操作取代。与加法操作(0.9 pJ)相比,乘累加操作的功耗(4.6 pJ)是加法操作的5.1倍[28]。以下方程用于计算ANN中某一层网络的乘累加操作数量:

其中kw代表卷积核的宽度,kh代表卷积核的高度,cin是输入通道数,cout是输出通道数,hout和wout是输出特征图的高度和宽度,nin是全链接层的输入神经元个数,nout是全链接层输出的神经元个数。对于相同结构的脉冲神经网络层,加法操作的数量与脉冲个数#spikes相关:

图15是脉冲神经网络和传统人工神经网络在相同的网络结构下,基于上述功耗计算公式而得出的每一层网络的功耗对比。对于基于MNIST的脉冲卷积网络,传统人工神经网络的能耗为395673.60 nJ,脉冲神经网络的能耗为307930.5 nJ,与传统人工神经网络相比减少了22.18%,对于基于CIFAR-10的脉冲残差神经网络,传统人工神经网络的能耗为233238.4 nJ,脉冲神经网络的能耗为173525.39 nJ,传统人工神经网络相比减少了25.61%。

图15 脉冲神经网络各层能耗与传统神经网络对比

脉冲神经网络使用脉冲时间序列来传输数据,而脉冲神经网络的功耗又与脉冲时间序列的时间长度和脉冲频率息息相关,脉冲时间序列的时间长度越短,脉冲频率越低,整个网络计算的时间和功耗都会有所降低。表3列举了近年来各种的脉冲神经网络实现中脉冲时间序列的时间步长,为更公平有效的横向对比,此处均列举的是针对CIFAR-10数据集的脉冲神经网络。

表3 不同SNN的脉冲时间序列长度

从表3中可以看出,本论文提出的训练算法中,脉冲时间序列的时间步长仅仅为8个时间步长,对比Hunsberger团队提出的时间序列长度为6000的SNN,本论文提出的SNN仅需要时间长度为8脉冲时间序列,达到了750倍的加速。相较于Garg团队的实验结果,即时间步长为48的脉冲时间序步,本文的脉冲时间序列也达到了6倍的加速。假设经过各个网络的脉冲时间序列频率相同,则功耗也会以同等比例降低。

4 结语

本文设计一种新的脉冲神经元信息传递模型,实现了一种新的基于梯度下降的脉冲神经网络训练算法,提供了一种与Pytoch兼容的训练框架。在神经网络的常见训练集上实现了较高的准确率,同时相较于传统的人工神经网络保证了较低的能耗。接下来的工作将会着眼于更高效的编码和解码方法设计。

猜你喜欢

脉冲阈值卷积
基于全卷积神经网络的猪背膘厚快速准确测定
非平稳声信号下的小波变换去噪方法研究
基于图像处理与卷积神经网络的零件识别
土石坝坝体失稳破坏降水阈值的确定方法
非均匀光照下文本图像分割算法研究
超快脉冲激光器提高数据传输速度
基于深度卷积网络与空洞卷积融合的人群计数
大射电
基于脉冲反射法电缆故障定位脉冲源的设计