zoukankan      html  css  js  c++  java
  • Effective and Efficient Computation with Multiple-timescale Spiking Recurrent Neural Networks

    郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布!

    ICONS, (2020)

    ABSTRACT

      受大脑启发的神经形态计算作为边缘AI范式的出现正在推动寻找在该硬件上运行的高性能且高效的脉冲神经网络。然而,与深度学习中的经典神经网络相比,当前的脉冲神经网络在引人注目的领域缺乏竞争力。在此,对于序列和流任务,我们展示了一种新型自适应脉冲循环神经网络(SRNN)与其他脉冲神经网络相比如何能够实现最先进的性能,并且几乎达到或超过经典循环神经网络(RNN)的性能,同时表现出稀疏活动。由此,我们计算出我们的SRNN在更难的任务上比经典RNN的能量利用率提高了100倍以上。为了实现这一目标,我们将标准和自适应多时间尺度脉冲神经元建模为自循环神经单元,并利用PyTorch深度学习框架中的替代梯度和自动微分来有效地实现时序反向传播,包括学习重要的脉冲神经元参数使我们的脉冲神经元适应任务。

    Keywords spiking neural networks, backpropagation through time, surrogate gradient

    1 Introduction

      现代的深度神经网络在人工智能的某些应用中已经变得非常有能力。然而,尽管它们很有效,但它们的能耗仍然是许多长期在线应用场景中应用的限制因素,如可穿戴智能设备、监控摄像头和智能手表应用[1]。标准的效率方法降低了权重[2, 3]和激活[4, 5]的位精度,或者缩放和修剪模型[6, 7]。然而,这些方法仍然遵循人工神经网络(ANN)中的标准计算模型,在每个迭代处理步骤中,神经元之间以基于帧的同步方式交换激活。

      从高效的大脑中获得灵感,脉冲神经网络(SNN)[8]将二值激活(脉冲)与异步稀疏通信结合起来。可以说,这样的SNN对硬件更友好[9]而且更节能[10]。然而,与人工神经网络相比,SNN的发展还处于早期阶段。训练深层SNN仍然是一个挑战,因为脉冲神经元的激活函数通常是不可微的,因此SNN不适用于误差反向传播的标准方法[11, 12]。特别是,由于脉冲神经元可以被建模为一类自回归神经元,学习算法必须考虑过去,SNN的状态性使得模拟和训练非常大的网络变得非常困难。最后,以图像分类任务为例,许多深度学习基准都面向人工神经网络的同步迭代处理范式。

      最近的工作[12, 13]已经证明了如何通过使用替代梯度以一种通用的方式有效地克服脉冲神经网络中的不连续梯度问题。这为在更大且更复杂的SNN中利用成熟的深度学习技术提供了新的机会。

      在此,我们开发了紧凑的循环脉冲神经网络(SRNN),我们使用这种替代梯度来训练它,以便在一个成熟的现代深度学习框架(PyTorch)中直接应用带自动微分的时序反向传播(BPTT)。利用这个框架,我们可以很容易地训练脉冲神经元本身的参数,也可以训练具有多个动态时间尺度的复杂脉冲神经元模型。正如我们所展示的,这种方法使得将这种脉冲神经网络适应于任务的特定时间动态是可行的。

      我们重点研究了有限输入维的序列分类和流分类基准,包括众所周知的序列和置换序列MNIST数据集(S-MNIST,PS-MNIST),心电图的QTDB波形分类,以及音频脉冲Heidelberg数字数据集(SHD),各种需要低功耗的长期在线计算设备的典型任务。我们展示了我们紧凑的SRNN如何解决这些复杂的任务,在SNN中超过了SoTa,与经典ANN相比接近甚至超过了SoTa。在这些任务中,SRNN表现出从低到非常低的稀疏性,并且我们表明这使得理论能量使用比高性能ANN提高了100倍以上。

    2 Related work

      在标准深度学习中,卷积神经网络(CNN)广泛用于图像分类和对象识别等视觉任务,而循环神经网络(RNN)更普遍地应用于涉及作为序列输入馈入网络的时间模式的任务。在RNN中,网络中的循环以内部隐含状态ht的形式诱导记忆,当时序输入xt馈入时,这些隐含状态会更新。对于学习,由于诱导记忆,RNN通常及时展开,例如使用时序反向传播(BPTT)[14, 15]来解释过去输入和当前状态之间的关系。然而,BPTT的计算成本很高,而且在计算梯度时往往会遇到稳定性问题。

      已经开发了几种替代RNN变体来简化和改进标准RNN中的学习。LSTM(长短期记忆)单元[16]专门设计为RNN,用于序列机器学习任务,如语音识别、语言理解和序列到序列翻译[17]。最近的创新,如IndRNN[18],借鉴了CNN中残差连接的成功经验,以促进网络中的梯度流并实现最先进的RNN性能。或者,因果卷积神经网络[19]也已成功应用于序列任务[20],但具有大量的网络大小和数据历史记忆要求。

      脉冲神经网络[21]由一类受更详细的生物神经元模型启发的基于事件的神经网络组成。生物神经元不同于ANN中的标准神经元,因为它们具有内部状态并通过同构电脉冲进行通信。大脑中较低的平均发放率[1-5Hz][22]表明,可以使用仅少量交换二值的有状态事件驱动神经元进行有效且高效的计算[10]。

      对于SNN,前馈和循环脉冲神经网络的学习规则已经开发[11, 13, 23, 24, 25, 26, 27],应用了不同类型的脉冲编码范式和学习方法。最近的工作在图像分类等任务中取得了高性能[28, 29];尽管如此,与传统CNN相比,此类SNN是否更有效尚不清楚。

      可以获得SNN潜在明显优势的一个方向是适合其固有时间计算模式的任务,并且可以使用适合低功耗神经形态硬件的相对紧凑的网络进行计算。最近的工作表明,激光雷达[30]和语音识别[23, 31]取得了实质性进展。尽管如此,在这些任务中,SNN与当前的深度学习解决方案之间存在显著性能差距。

    3 Spiking Recurrent Neural Networks

      在此,我们关注由一个或多个循环层组成的SNN,即脉冲循环神经网络(SRNN),如图1a所示。在这些网络中,我们使用两种类型的脉冲神经元之一:LIF神经元和自适应脉冲神经元。脉冲神经元源自捕捉生物神经元行为的模型[32]。像Hodgkin-Huxley模型这样的复杂模型描述了生物物理量的详细动态,但计算成本很高;现象学模型,如LIF神经元模型或脉冲响应模型,权衡了生物可解释性与计算成本降低。

    The LIF spiking neuron 以泄漏方式对输入电流It进行积分,并在其膜电位ut从下方突破固定阈值时发放动作电位,此时会发出脉冲st,该过程建模为非线性函数,之后,膜电位被复位为ur

    其中是输入信号,表示为脉冲序列{ti},ut是膜电位随时间常数τm呈指数衰减,Rm是膜电阻,脉冲的发放Spike表示为阈值和电位的非线性函数:。LIF神经元计算成本低[33],但缺乏真实神经元的许多更复杂的行为,包括表现出更长历史依赖性的响应。

      Bellec等人[23]证明使用更复杂的、适应性更强的脉冲神经元模型可以提高其SNN的性能。在自适应脉冲神经元中,阈值在每次发放脉冲后增加,然后随时间常数τadp呈指数衰减。使用dt = 1ms的前向欧拉一阶指数积分器方法在离散时间模拟连续神经元模型,我们计算:

    其中θ是由固定最小阈值b0和自适应贡献βηt组成的动态阈值;ρ用时间常数τadp表示阈值的单时间步骤衰减。该参数是一个常数,控制阈值的自适应大小(等式(8));我们将自适应神经元β的默认值设置为1.8。类似地,α用时间常数τm表示膜电位的单时间步骤衰减。

      图2说明了两个脉冲神经元模型在膜电位、阈值和脉冲行为的演变方面的行为。检查这些神经元模型,我们看到膜电位的演变由自衰减项决定,类似地,对于适应神经元,阈值由自衰减项ρ决定:有效地,可以对脉冲神经元的行为进行建模自循环权重α和ρ(图2)。在我们的网络实现中,我们将这些自循环参数τm、τadp设置为可训练的,因为它们与神经元中"记忆"的有效持续时间直接相关,我们假设将这些优化为特征将提高性能。

      为了确定SNN方法的有效性,我们还可以将SNN网络转换为具有RELU激活函数的相应RNN网络,方法是将每个时间步骤的膜电位(而不是偶尔的脉冲)与其他神经元通信,将(8)替换为:

    Backpropagation-Through-Time (BPTT) 为了训练SRNN,我们应用了时序反向传播(BPTT)[14, 15]。使用BPTT,输出预测和输出目标之差从输出传播回输入,包括过去的输入,以通过梯度下降来优化权重和参数。从概念上讲,BPTT为所有输入时间步骤展开网络。

      为了通过不连续脉冲机制计算梯度,我们应用了[12]中从早期特定实例[11, 13]中概括的替代梯度方法。为了通过脉冲神经元的不连续脉冲生成器来近似误差梯度,替代梯度方法用将传出脉冲连接到内部膜电位的导数替换了这个不存在的梯度。已经提出了多种导数[12];在此,我们使用高斯分布:其中分布的均值是θ——阈值,标准差σ——容差或方差——用于误差反向传播中缩放膜电位。除非另有说明,我们设置σ为0.5。

      为了定义BPTT最小化的损失函数,我们需要考虑正在执行的任务类型和我们拥有的标签类型:对于序列分类任务,我们接收一系列输入并可以在序列的末尾做出决定。在流式任务中,我们需要在每个时间步骤 t 生成一个输出。损失函数由误差度量进一步定义,为此我们可以定义许多不同的方法来解释输出神经元的行为。

    Decoding SRNNs 解码SNN的输出与对脉冲神经元行为的解释直接相关。输出神经元的膜电位轨迹和脉冲历史,无论是脉冲计数和/或脉冲时间,都可以用来表示每个类别的信念。我们定义了许多这样的输出解码方法及其相关的损失函数。

    Spike-based classification. 当神经元发出脉冲时,这是由膜电位(神经元的隐含状态)达到阈值引起的。在分类任务中,一种简单的分类方法是统计某个时间窗口内的脉冲数量。虽然简单,但这种方法有一些缺点,可能会导致错误分类:(1) 一些输出神经元可能会发放相同数量的脉冲;(2) 脉冲神经元的复位和不应期机制可能会降低强烈刺激的发放率;(3) 从单个神经元实时读出是不可行的。作为替代方案,我们可以直接测量每个时间步骤中可用的输出神经元。

    Ref: The Heidelberg Spiking Data Sets for the Systematic Evaluation of Spiking Neural Networks (Fig. 4)

      “我们测试了以下两种时间步长的选择:对于max-over-time损失,每个读出单元具有最大膜电位的时间步骤被认为是。相反,在last-time-step损失的情况下,所有样本的最后一个时间步骤T为每个读出神经元所选择。我们使用Adamax优化器最小化了(9)中的交叉熵。”

    Ref:The Heidelberg Spiking Data Sets for the Systematic Evaluation of Spiking Neural Networks (Formula. 9)

    Direct measures. 输出神经元的膜电位也可用于分类,因为它代表了输出神经元刺激历史的度量。我们定义了几种方法来解码膜电位历史的结果: 

    • 最后一步(last-time-step)膜电位:我们将样本最后一个时间步骤的输出膜电位值作为输出。使用softmax激活,我们然后缩放类似于ANN中的softmax函数的输出。(PS:输出神经元会进行脉冲发放)
    • 时序最大(max-over-time)膜电位:我们将样本呈现期间达到的最大膜电位作为输出神经元的值。(PS:输出神经元会进行脉冲发放)
    • 读出积分器:虽然膜电位可以解释为神经元激活的移动平均值,但由脉冲引起的复位不适合这个概念。我们定义了一个非脉冲读出层,其中在没有神经元脉冲和复位的情况下计算膜电位。这避免了脉冲神经元的复位机制对分类性能的影响。读出积分器定义为ut = αut + (1 - α)xt,其中ut是输出膜电位,xt是输入脉冲序列。α = exp(-τm/dt),其中τm是可训练的时间常数。我们使用非脉冲读出神经元随时间变化的均值。(即在仿真时间T内,计算每个时间步骤的读出值,并对其求均值)

      以前在[31]中使用了所有三种方法的变体;对于流任务,每个时间步骤需要分类,当只使用单个神经元来表示输出时,我们只能使用直接测量。

      为了训练网络,如在[31]中,我们使用交叉熵函数作为误差函数。在流式任务中,读出的膜电位用作输出,并在每个时间步骤与相应的目标进行比较。在分类任务中,读取整个序列后的输出与序列的正确标签进行比较。请注意,在[31]中,交叉熵是为时序最大解码和最后一步解码计算的。

      我们在PyTorch中实现了各种SRNN,其中代理梯度的使用使我们能够应用BPTT来有效地最小化损失,并利用标准的深度学习优化,包括脉冲神经元参数的训练。

    4 Experiments

      我们将上述方法应用于许多序列分类和流式分类任务:QTDB数据集中ECG信号中的波形分类、序列和置换序列MNIST问题(S-MNIST、PS-MNIST)和Spoken Heidelberg Digits (SHD)数据集。

    Encoding and decoding. 作为事件驱动的神经网络,SNN严重依赖编码机制将外部度量转换为馈入网络的脉冲序列。已使用多种方法将静态或连续变化的值转换为脉冲序列。在DVS传感器[34]中,使用电平交叉方案将时间连续信号编码为脉冲信号;更一般地说,已经使用了基于发放率的泊松群体编码[35, 36]。从经验上讲,我们发现不同的解码方案最适合不同的任务:对于ECG任务,在每个时间步骤直接从膜电位解码效果最好;对于S-MNIST和PS-MNIST,它是脉冲计数;而对于SHD,平均读出积分器是最有效的任务。

    ECG 心电图(ECG)分析被广泛用于监测心血管系统的功能。心电信号作为一种时间序列数据,可用于检测和识别心脏功能的不同波形和形态。对于人类来说,识别任务非常耗时,并且在很大程度上依赖于经验。

    Waveform classification. 在心电图信号中,心脏周期的三个有意义的部分包括P波、T波和QRS波群[37]。详细地说,QRS部分由Q波、R波峰和S波组成。在监测任务中,我们的目标是不断识别当前类型的波。因此,流式任务是按字符识别ECG波的所有六种模式——P、PQ、QR、RS、ST和TP。图1b显示了一个ECG信号和6个标签的相对分布示例。

    QTDB 是用于波分割的最广泛使用的ECG数据集之一,其中数据在时间维度上有很好的标签。每个样本有两个通道——'a'和'b',这提供了额外的空间信息。原始数据由每个时间步骤的浮点值组成;为了将此信号转换为基于事件的信号,我们对ECG信号应用了电平交叉编码,以将连续值转换为脉冲序列。通过将每个通道信号转换为分别代表增加和减少事件的两个脉冲通道,将电平交叉应用于归一化的ECG信号。当振幅增加或减少大于阈值时会产生脉冲——这里,我们使用0.3作为阈值。结果是ECG信号压缩了大约75%。

      我们将几个RNN和SRNN应用于ECG波形分类,见表1。我们发现具有自适应脉冲神经元的SRNN以46个神经元(36个隐含、4个输入和4个输出神经元)的最小尺寸神经网络实现了84.4%的最优性能。由LIF神经元组成的相同大小的SRNN仅达到73.7%。网络结构相同的LSTM和vanilla RNN分别达到了78.9%、77.3%和74.8%的准确率;具有290个单元的双向LSTM实现了80.76%。通过将自适应SRNN转换为ANN,即RELU SRNN,获得了最优性能(86.4%)。

      准确度结果通过评估在每个时间步骤的输入来呈现,该输入以250 Hz采样。没有考虑输入和输出评估之间的延迟。与SRNN接收作为输入的跨级编码生成的脉冲输入相反,LSTM和RNN网络在其输入处接收浮点值。这些值代表ADC样本值(12位精度)。

    S-MNIST and PS-MNIST MNIST 数据集是开创性的计算机视觉分类任务。序列MNIST(S-MNIST)基准和置换MNIST(PS-MNIST)基准被引入作为序列数据处理的相应问题[39],将MNIST图像中的每个像素逐个呈现出来,从而产生长度为28 x 28=784的序列。

      对于S-MNIST,使用Dense IndRNN[18]获得的最新准确率为99.48%;LSTM的最优报告性能是98.2%[38]。对于这些RNN,模拟灰度像素值直接作为输入馈入到网络中。对于SNN,Bellec等人[23]在S-MNIST任务上使用eProp和群体泊松编码对灰度像素值进行编码获得了93.7%,另外使用learning-2-learn元学习框架时获得了96.4%。从表1中可以看出,我们使用两个循环层的自适应SRNN以相同的编码方案获得了97.82%;使用与[23]相同的网络布局和大小,SRNN达到了97.2%。在各种SRNN架构中使用LIF神经元时,网络无法学会;再次将自适应SRNN转换为ANN,但将性能提高到98.99%,接近Dense IndRNN精度。

    PS-MNIST 是比S-MNIST更难的问题,因为首先对所有图像应用置换,然后逐个像素地顺序读取图像[39]。置换强烈扭曲了输入序列中的时间模式,使任务比S-MNIST更困难。此处的Dense IndRNN[18]获得了97.2%的准确率;LSTM[38]只达到了88%。我们不知道有关此任务的任何SNN基准数据;我们的自适应SRNN在测试数据集上达到了91.0%的准确率;LIF SRNN再次未能学会,而RELU SRNN获得了93.47%的准确率。

    SHD Spoken Heidelberg Digits脉冲数据集是专门为对脉冲神经网络进行基准测试而开发的[31]。它是基于Heidelberg Digits (HD)音频数据集创建的,该数据集包含20类从0到9的英语和德语口语数字,由12个人说出。为了训练和评估,数据集(10420个样本)被分成训练集(8156个样本)和测试集(2264个样本)。具有128个单元的LSTM实现了85.7%[31],其中连续时间流被分成10毫秒的段,并且每个段中的脉冲计数用作LSTM的输入。相比之下,将每个样本视为图像以训练具有超过100万个神经元的深度CNN达到92.4%[31]。使用由LIF神经元组成的三层脉冲循环网络,每层有128个神经元,[31]获得了71.4%。

      为了应用我们的SRNN,我们将所有音频样本转换为250×700的二值矩阵。为此,所有样本都适合在1秒的窗口内;较短的样本用零填充,较长的样本通过去除尾部切割(后者仅适用于20个样本,最长采样为1.17秒;目视检查显示尾部没有显著数据——示例如图3a所示)。然后将脉冲分段到大小为10毫秒和4毫秒的时间段中;对于SRNN,时间段中任何脉冲的存在或不存在都被记录为单个二值事件;对于LSTM,段中的脉冲计数用作(二值)输入值。在训练期间,原始训练数据集的10%子集用于验证,Adam[40]作为默认优化器。初始学习率设置为0.01,在epoch 10、50、120和200处衰减50%。对于非脉冲RELU SRNN,50个训练epoch就足够了。我们使用单个循环层和两个循环层以及LIF或自适应脉冲神经元训练SRNN。在每个样本开始时,每个SRNN神经元的膜电位设置为0到1之间的随机数。

      对于具有两层128个自适应脉冲神经元的自适应SRNN,在4毫秒段数据上进行训练,我们获得了84.4%的准确率,接近[31]中的128个单元LSTM。具有单层256个脉冲神经元的自适应SRNN实现了81.71%,证明了在SRNN中具有多个循环层的实用性。类似地,具有256个神经元的单个循环层的LIF SRNN仅达到78.93%。非脉冲RELU SRNN大大优于脉冲SRNN,准确率达到88.93%。

    Sparsity 在表1中,我们还注意到经过训练的SRNN的稀疏性(Fr),其中稀疏性被定义为每一步活跃神经元的百分比。我们发现,对于ECG任务,神经元平均每3个时间步骤发放一次(FR=0.32),这种相对较低的稀疏性可能是由于需要在每个时间步骤读取类标签造成的。对于MNIST任务,稀疏度要高得多,在0.07和0.1之间变化,而对于SHD任务,稀疏度在0.02和0.13之间变化,主要是作为准确性的函数。

      对于SHD,我们更详细地研究了不同规模网络的网络性能与稀疏性之间的关系。在图3b中,我们看到通过增加网络规模可以同时提高网络性能和稀疏性。我们还看到,与LIF神经元相比,自适应神经元的性能优势是以牺牲稀疏性为代价的。

    Complexity of Spiking Neurons 总的来说,我们发现使用在训练期间调整时间常数的自适应脉冲神经元明显优于LIF神经元,如图4(a)所示。从图4(b)中可以看出,训练这些时间常数显著提高了性能,如SHD数据集所示,因为训练这些参数的连续消融会降低性能。如图3c所示,训练也显著修改了这些参数:显示了SHD任务中τadp的初始直方图和训练后的直方图。

    5 Efficiency

      一个激烈争论的话题是,与ANN[10]相比,SNN是否可以实现有意义的功耗降低。在此,我们根据[10]中45nm CMOS技术的寄存器传输逻辑(RTL)级别的功率数推导出理论能量值。

      我们通过计算每个时间步骤所需的操作来计算循环网络的理论能量消耗。我们计算乘加操作(MAC)和累加(AC)操作[10]。一个标准的人工神经元需要为每个输入提供一个MAC;相比之下,脉冲神经元只需要每个输入脉冲的累加(AC),而它的内部状态动态需要一些MAC。

      因此,在网络中,我们需要考虑进入神经元的输入连接数、层中神经元的数量以及内部计算的成本。例如,考虑第 l 层的循环操作,定义为yl,t = f(W · xt + Wrec · yl,t-1) + b,输入大小为m,输出大小为n:这需要两个乘法运算和一个累积运算。然后,对于每个时间步骤,RNN所需的能量计算为Energyrnn = (mn + nn)EMAC。然而,在SNN中,需要考虑网络的稀疏脉冲活动(平均发放率Fr):Energysrnn = (mn + nn)EACFr;在具有稀疏活动的SRNN中,Fr << 1。

      我们将循环网络RNN的理论能量成本计算为所有L个层和所有T个时间步骤的总和,:我们计算了表2中各种循环网络的MAC/AC和能量使用。对于本研究中使用的网络架构,我们然后计算表3中的实际相对能量成本,并在图5中绘制了各种网络的准确度与能量比。在图5中,我们看到我们的SRNN解决方案位于节能且有效网络的Pareto前沿,脉冲自适应SRNN实现了接近RELU SRNN的性能,同时理论上能源效率提高了28-243倍。与在更复杂的SHD和(P)S-MNIST任务上的更经典的RNN相比,我们计算出的SRNN的能源效率要高出100倍以上,因为在这些更大的网络中,输入因子和稀疏性都增加了。

    6 Conclusions

      我们展示了如何在经典且新颖的时间连续任务上使用反向传播(BPTT)和替代梯度来训练有竞争力的循环脉冲神经网络,从而实现脉冲神经网络的最新技术并接近或超过经典RNN在这些任务上的最先进技术。计算理论能量成本,我们发现我们的脉冲SRNN的效率比性能稍好的模拟RELU SRNN高243倍,比LSTM等类似性能的经典RNN的效率高1900倍。

      我们表明,使用更复杂的自适应脉冲神经元是实现这些结果的关键,特别是还可以使用BPTT训练这些脉冲神经元的各个时间常数。具有两个时间常数的自适应脉冲神经元有效地保持了多时间尺度的记忆。我们假设这种方法非常有效,因为它允许网络中的记忆适应任务的时间动态。令人惊讶的是,将SRNN转换为非脉冲RELU RNN持续提高了性能,这表明嵌套分层循环网络架构特别有效。

      训练这些包括各种参数的复杂SRNN是唯一可行的,因为通过使用代理梯度,我们能够使用成熟且先进的深度学习框架(PyTorch),并从自动微分中受益,还可以训练脉冲神经元参数1。我们相信这种方法为进一步改进和扩展SNN开辟了新的机会。

    1 代码可以按照如下方式获取:https://github.com/byin-cwi/SRNN-ICONs2020

  • 相关阅读:
    python移动文件
    python分割多个分隔符
    pywintypes.com_error: (-2147418111, '被呼叫方拒绝接收呼叫。', None, None)
    MySQL查看和修改字符集的方法
    Django创建超级管理员用户
    P2567.[SCOI2009] windy 数(数位DP)
    920G.List of Integers(莫比乌斯函数+二分)
    916E.Jamie and Tree (倍增LCA+线段树维护DFS序)
    GYM100376F.Circle and Trees(树形DP+倍增LCA)
    GYM100376E.LinearMapReduce(线段树维护矩阵乘法)
  • 原文地址:https://www.cnblogs.com/lucifer1997/p/15008020.html
Copyright © 2011-2022 走看看