BindsNET: A Machine Learning-Oriented Spiking Neural Networks Library in Python

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

Frontiers in neuroinformatics, (2018)

 

Github:https://github.com/BindsNET/bindsnet

 

Abstract

  SNN仿真软件的开发是实现神经系统建模和生物启发算法开发的关键组件。现有的软件框架支持广泛的神经功能,软件抽象级别和硬件设备,但通常不适合快速原型设计或应用于机器学习领域的问题。在本文中,我们描述了一个新的Python软件包,用于仿真SNN,特别适合于机器学习和强化学习。我们的软件BindsNET1可快速构建和仿真脉冲网络,并具有用户友好的简洁语法。BindsNET建立在PyTorch深度神经网络库上,有助于在快速CPU和GPU计算平台上实现SNN。此外,可以调整BindsNET框架以利用其他现有的计算和硬件后端。例如TensorFlow和SpiNNaker。我们提供与OpenAI gym库的接口,允许在强化学习环境中训练和评估脉冲网络。我们认为该程序包有助于将脉冲网络用于大规模机器学习问题,并通过在实践中使用BindsNET展示一些简单的示例。

 

1 BindsNET代码可从https://github.com/Hananel-Hazan/bindsnet获得。要安装本文使用的代码版本,请使用pip install bindsnet = 0.2.2。本文的基准测试代码可在examples/benchmark目录中找到。

 

Keywords: GPU-computing, spiking Network, PyTorch, machine learning, python (programming language), reinforcement learning (RL)

 

1. INTRODUCTION

  深度学习模型在计算机视觉,自然语言处理和其他领域的最新成功(LeCun et al., 2015)导致机器学习软件包的激增(Jia et al., 2014; Abadi et al., 2015; Chen et al., 2015; Tokui et al., 2015; Al-Rfou et al., 2016; Paszke et al., 2017)。GPU加速深度学习原型一直是这一成功的主要支持者(Chetlur et al., 2014),因为它们的大规模并行操作可以快速处理独立节点的层。由于深度神经网络在生物学合理性经常引起争议(Stork, 1989),因此将深度学习算法与神经科学中经过长期研究的思想相结合的兴趣不断增加(Marblestone et al., 2016),这两者都是增加深度学习的一种手段。机器学习性能并更好地仿真生物大脑中的学习和决策(Wang et al., 2018)。

  SNN (Maass, 1996, 1997; Kistler and Gerstner, 2002)有时被称为神经网络的"第三代",因为它们有可能取代计算神经科学领域的深度学习方法(Wall and Glackin, 2013)和生物学合理的机器学习(ML) (Bengio et al., 2015)。SNN还被认为对于数据处理任务更为实用,因为数据中包含SNN的神经元会随着时间自然整合其输入,因此数据具有时序分量。此外,它们的二值(脉冲或不脉冲)操作非常适合在硬件设备上进行快速且节能的仿真。

  尽管SNN没有被广泛用作机器学习系统,但最近的研究表明它们有潜力。SNN通常采用无监督学习规则进行训练,以学习数据集的有用表征,然后可以将其用作监督学习方法的特征(Diehl and Cook, 2015; Kheradpisheh et al., 2016; Ferr et al., 2018; Hazan et al., 2018; Saynders et al., 2018)。经过训练的深度神经网络可以转换为SNN (Rueckauer et al., 2017; Rueckauer and Liu, 2018),并在硬件中实现,同时保持良好的图像识别性能(Diehl et al., 2015),这表明SNN原则上可以与深度学习方法竞争。在类似的工作中(Hunsberger and Eliasmith, 2015; Lee et al., 2016; O'Connor and Welling, 2016; Huh and Sejnowski, 2017; Mostafa, 2018; Wu et al., 2018),流行的反向传播算法(或其变体)已应用于SNN的不同版本,以在标准图像分类数据集上实现可比的性能,从而提供了其他证据来支持增强网络解决ML问题的潜力。最后,RL的思想可用于有效训练SNN以进行目标分类或其他任务(Florian, 2007; Mozafari et al., 2018)。

  脉冲神经元的膜电位(或电压)通常由常微分方程描述。神经元的膜电位通过突触前的输入而增加或减少,这取决于它们的符号和强度。在LIF模型(Kistler and Gerstner, 2002)和其他几种模型的情况下,神经元不断衰减至静息电位。如果神经元集成了足够的输入并达到其阈值电压vthr,它会发出一个脉冲,该信号通过突触传播至下游神经元,其突触后效应由突触强度调节,其电压会重置为某个值vreset。神经元之间的突触也可以有自己的动态,可以通过规定的学习规则或外部奖励信号进行修改。

  存在几种用于SNN离散时间仿真的软件包,它们具有不同水平的生物学合理性并支持硬件平台。但是,许多这样的解决方案并不是针对ML应用开发的,它们通常具有深刻的原型,从而为新用户带来陡峭的学习曲线。而且,具有高度生物学合理性的程序包可能不适合ML中的问题,因为它们在仿真上计算量大,并且可能需要进行高度的超参数调整。SNN的实时硬件实现也存在,但不能支持某些软件解决方案可以实现的快速原型制作。

  由于上述缺点,我们提出了BindsNET SNN库,该库是在流行的PyTorch深度学习库的基础上开发的(Paszke et al., 2017)。该软件的核心是允许用户构建,训练和评估由神经元及其连接组成的SNN。连接权重的学习受到生物学学习文献中各种算法的支持(Hebb, 1949; Markram et al., 1997)。单独的模块为BindsNET提供的OpenAI gym (Brockman et al., 2016) RL环境库提供接口。Pipeline对象用于简化脉冲网络与RL环境之间的交互,从而从实验人员的视野中消除了许多混乱的细节。其他模块还提供函数,例如加载ML数据集,将原始数据编码为脉冲序列网络输入,绘制网络状态变量和输出以及将SNN作为ML模型进行评估。

  本文的结构如下:我们从第2节开始,评估现有的SNN仿真软件和硬件实现。在第3节中,将详细描述BindsNET库,强调创建每个软件模块的动机,描述它们的功能以及它们在解决特定任务时的互操作方式。第4部分介绍了代码片段和简单案例研究,以演示可能的BindsNET应用程序的广度。未来发展的理想方向和特征在第5章中列出,而潜在的研究影响在第6节中进行了评估。

 

2. REVIEW OF SNN SOFTWARE PACKAGES

2.1. Objectives of SNN Simulations

  在过去的二十年中,神经网络在机器学习和人工智能研究中变得越来越重要,从而导致了用于训练,评估和部署的高效软件包的泛滥。另一方面,部分由于其固有的复杂性和计算要求,对"第三代"神经网络(SNN)的仿真未能充分发挥其潜力。但是,脉冲神经元擅长记住其激活的短期历史,并具有与其他神经元的有效二值通信功能,这是减少神经形态硬件能量需求的有用功能。脉冲神经元的生物学对应物比深度神经网络所使用的计算单元具​​有更多的特性,这在实用的计算能力或ML性能方面可能构成重要的优势。

  想要针对ML目的使用脉冲神经元网络进行实验的研究人员可以为SNN仿真软件提供多种选择,虽然存在许多框架,但每个框架都针对特定的应用领域量身定制。在本节中,我们描述了现有的相关软件库以及与之相关的挑战,并将这些与我们软件包的优势进行了对比。

  我们认为,所选的仿真框架必须易于开发,调试和运行,并且最重要的是,要支持其用户所需的生物复杂性水平。我们希望使用一种编程语言来维持开发的一致性,并且希望令其可接受或作为开源项目。我们描述了在每个竞争性解决方案中是否以及如何实现这些方面。

 

2.2. Comparison of State-of-Art Simulation Packages

  存在许多SNN框架,每个框架都有一组独特的用例。一些专注于神经元的生物学合理性仿真,而另一些专注于高级脉冲网络功能。要建立一个甚至可以运行最简单的机器学习实验的网络,将面临多种困难的设计选择:神经元和网络应具有哪些生物学特性?例如,应使用多少个GABAergic神经元或NMDA/AMPA受体,或采用哪种形式的突触动态?存在许多此类选项,其中某些选项可能会或可能不会对ML系统的性能产生重大影响。

  表1中比较了几种著名的SNN仿真程序包。例如,NEST (Gewaltig and Diesmann, 2007),BRIAN (Stimberg et al., 2014)和ANNarchy (Vitay et al., 2015)专注于从亚细胞组件和生化反应进行准确的生物学仿真,直至单个神经元的复杂模型(都达到网络水平)。其他流行的生物学合理性平台是NEURON (Carnevale and Hines, 2006),Genesis (Cornelis et al., 2012)。这些仿真平台针对希望仿真多室神经元模型的神经生物物理学界和神经科学家,其中每个室是神经元的不同部分,具有不同的功能,形态学细节和形状。这些软件包能够在各种类型的系统上仿真大型SNN,从笔记本电脑一直到HPC系统。但是,每个仿真组件必须是同质的,这意味着必须使用单一类型的神经元和单一类型的突触来构建它。如果研究人员想利用各种突触类型来仿真多种类型的神经元,则在这些框架中可能会很困难。有关这些库中可用的神经元的开发时间,模型性能和模型种类的更详细比较,请参见(Tikidji-Hamburyan et al., 2017)。

  BRIAN,ANNarchy,NEST和NEURON软件包的主要优点在于,除了用于神经元和连接对象的内置模块外,程序员还可以使用微分方程指定神经元和连接的动态。这样就无需在代码中手动指定每个新神经元或连接对象的动态属性。在ANNarchy的情况下,将方程编译为快速C++代码,在BRIAN2的情况下,使用NumPy和基本线性代数子程序(BLAS)将矢量方程和线性代数运算编译为Python和原始C-like语言(hoc)的混合体 (Hines et al., 2009)负责NEURON的SNN仿真。另外,在NEST程序包中,程序员可以组合预配置的对象(接受参数)来创建SNN。在所有这些库中,对网络组件操作的重大更改都需要修改底层代码,这是一项艰巨的任务,它阻碍了快速网络原型的建立,并破坏了编程的连续性。目前,BindsNET不支持描述神经动态的任意微分方程的求解,而是为了简单起见,提供了几种流行的神经元类型供用户选择。

  NeuCube (Kasabov, 2014)和Nengo (Bekolay et al., 2014)等框架专注于SNN的高级行为,可用于机器学习实验。NeuCube支持基于发放率编码的脉冲网络,而Nengo支持在脉冲,发放率或高级抽象神经行为级别进行仿真。NeuCube尝试将时空输入数据映射到三维SNN架构中。但是,它不是一个开源项目,因此在范围和可用性上受到了一定限制。Nengo通常用作仿真大脑或大脑区域的高级功能,作为实现神经工程框架(Stewart, 2012)而非机器学习框架的认知建模工具箱。Nengo是一个用Python编写的开源项目,并支持Tensorflow (Abadi et al., 2015)后端以提高仿真速度并利用某些有限的ML功能。它还具有在专用硬件平台上部署神经模型的选项; 例如SpiNNaker (Plana et al., 2011)。CARLsim (Beyeler et al., 2015)和NeMo (Fidjeland et al., 2009)也专注于SNN的高级方面,因此是在机器学习中应用的良好候选。两者都可以仿真以Izhikevich神经元(Izhikevich, 2003)构建的大型脉冲网络,并以逼真的突触动态作为基本计算单元,并支持使用GPU硬件进行加速计算。像以前的框架一样,低级仿真代码是用C++编写的,以提高效率,但是程序员可以使用独立于仿真器的PyNN Python库(Davison et al., 2008),MATLAB或Java与它们进行交互。

  GeNN (GPU增强的神经网络)库(Yavuz et al., 2016)是一种环境,可通过代码生成技术在CPU或NVIDIA GPU上仿真SNN。网络是用C风格的API定义的,用于仿真网络的代码(在CPU或GPU上)由GeNN自动生成。最近的BRIAN2genn软件包(Stimberg et., 2018, 测试版)可通过调用BRIAN2的set_device()函数在外部框架中执行代码,来将用BRIAN2编写的网络模型转换为使用GeNN库在NVIDIA GPU上运行。尽管此平台同时针对CPU和GPU (BindsNET库的核心功能),但它需要在网络原型设计和部署之间进行(通常是昂贵的)中间代码生成步骤(有关此问题的说明,请参见图11)。运行时也很难干预生成的代码。例如,如果满足某些条件,则截断突触,或者随着仿真的进行而改变学习率。

  以上许多软件包都是用一种以上的编程语言编写的:核心功能以较低级的语言(例如C++)实现,从而以较低的开销实现了良好的性能,并且编写了暴露给软件包用户的代码以更高级的语言(例如Python或MATLAB)来实现快速原型制作。如果此类框架不适合用户需求,学习曲线陡峭或不够灵活以无法创建所需模型,则用户可能必须使用高级和低级语言才能对所需的内部组件进行编程。作者尤其在BRIAN2库中遇到了这一困难,因为仿真功能的某些部分已针对生成的代码进行了调节,例如,在为机器学习任务训练SNN时,很难或不可能进行修改。 这个问题很可能出现在类似的软件框架中。例如GeNN和ANNarchy。

  BindsNET依靠PyTorch进行矩阵计算,以便对SNN进行有效的仿真。在不改变数学运算细节的情况下,BindsNET原则上可以连接到各种硬件,例如FPGA,ASIC,DSP或ARM,以执行仿真。可以设计一种API来编译在BindsNET中创建的脉冲网络,使其在指定的硬件上运行,而不是使用PyTorch作为仿真主力。这样,BindsNET可以看作是软件和硬件领域之间的桥梁,使研究人员能够快速测试CPU或GPU上的软件原型,并最终将仿真部署到快速且节能的专用硬件上。目前尚不存在这样的API,但可以在该库的未来版本中添加。

 

3. PACKAGE STRUCTURE

  图1包含BindsNET软件包的所有软件模块的摘要。
  许多BindsNET对象使用torch.Tensor数据结构进行计算。例如,所有支持Nodes接口的对象都使用Tensor来存储和更新状态变量,例如脉冲出现或电压。Tensor对象是一个多维矩阵,包含单个数据类型的元素。例如具有8, 16, 32或64位精度的整数或浮点数。它们可以通过调用Tensor.cpu()或Tensor.cuda()在设备之间轻松移动,并且默认情况下可以使用torch.set_default_tensor_type('torch.cudaFloatTensor')定位GPU设备。

 

3.1. SNN Simulation

  BindsNET提供了一个Network对象(在网络模块中),该对象负责协调一个或多个Nodes和Connections对象,并支持使用Monitors来记录这些组件的状态变量。时间步骤参数dt是Network构造函数的唯一(可选)参数,它控制仿真的时间分辨率。run(inpts, time)函数实现所有网络组件的同步更新(对于多个时间步骤time/dt)。此函数调用get_inputs()作为子例程来计算到所有Nodes实例的突触前输入(以及inpts中用户定义的输入)。reset_()方法调用所有网络组件的重置函数,即将状态变量重置为默认值。实现了网络与磁盘之间的保存和加载,从而允许重复使用经过训练的连接权重或其他参数。

  nodes模块中的Nodes抽象基类指定抽象函数step(inpts, dt)和reset_()。第一个由Network实例的run()函数调用,以执行单个时间步骤的更新,第二个将脉冲,电压和任何其他记录的状态变量重置为默认值。Nodes类的实现包括Input(具有用户指定或固定脉冲的神经元)McCullochPittsNodes(McCulloch-Pitts神经元),IFNodes(IF神经元),LIFNodes(LIF神经元)和IzhikevichNodes(Izhikevich神经元)。其他神经元或类似神经元的计算元素可以通过扩展Nodes抽象类来实现。许多Nodes对象都支持可选参数,用于自定义神经属性,例如阈值,重置和静息电位,不应期,膜时间常数等。应该注意的是,某些Nodes对象的行为并不取决于dt参数。例如,McCullochPittsNodes对象没有先前时间步骤的存储(无状态),但它仍可能嵌入在SNN仿真中。

  topology模块用于指定Nodes实例之间的交互,其中最通用的是在Connection对象中实现的。Connection知道源(突触前)和目标(突触后)Nodes,以及连接强度权重w的矩阵。默认情况下,连接不会实现连接权重的任何学习,而是通过包含update_rule参数来实现的。在learning模块中实现了生物学学习文献中的几种规范学习规则,其中包括Hebbian学习(Hebbian),脉冲时序依赖可塑性(STDP)(PostPre)的变体,以及诸如奖励调节STDP(MSTDP)之类的鲜为人知的方法。Connection的可选参数norm指定每个目标神经元的所需权重总和,由父Network在每次run()调用期间强制执行。SparseConnection对象可用于指定将某些权重固定为零的连接。但是,由于缺乏对PyTorch库中稀疏Tensor的充分支持,该功能尚无法用于学习功能。Conv2dConnection对象实现了二维卷积操作(使用PyTorch的torch.nn.conv2d函数),并支持learning模块中的所有更新规则。LocallyConnectedConnection实现了一个二维卷积层,没有共享权重。也就是说,每个输入区域都与一组不同的过滤器权重相关联(Bruna et al., 2013; Saunders et al., 2018)。

 

3.2. Machine and Reinforcement Learning

  BindsNET的开发考虑了机器和强化学习应用。这些工作的核心是learning模块,该模块包含可以附加到Connection对象以在SNN仿真期间对其进行修改的功能。默认情况下,实例化连接时没有学习规则。当突触前脉冲和突触后脉冲在时间上彼此靠近时,Hebbian规则("一起发放,一起绑定")对称地增强权重,而PostPre规则实现STDP的简单形式,其中权重根据突触前和突触后脉冲的相对时间而增加或减少,并具有用户指定的(可能是非对称的)学习率。我们还实现了Florian (2007)的奖励调节STDP (MSTDP)和具有资格迹的奖励调节STDP (MSTDPET)规则,用于基础强化学习实验。通常,任何学习规则都可以与任何连接类型和其他网络组件一起使用,但是研究人员需要选择正确的实验方法。

  数据集模块提供了一种下载,预处理和迭代机器学习数据集的方法。例如,MNIST对象为MNIST手写数字数据集提供此功能。除此以外,我们还支持其他几个数据集,包括CIFAR-10,CIFAR-100,(Krizhevsky and Hinton, 2009)和Spoken MNIST。可以使用encoding模块将数据集中的样本编码为脉冲序列,当前支持几种功能,这些功能可基于不同的统计分布和生物学启发的刺激转换,从非负数据创建脉冲序列。编码函数包括poisson()和rank_order(),poisson()将表示发放率的数据转换为具有所述发放率的Poisson脉冲序列,然后将数据转换为按输入数据的强度在时间上排序的每个神经元单个脉冲(Thorpe and Gautrais, 1998)。脉冲可用作SNN甚至其他ML系统的输入。数据集的子模块预处理允许用户将各种预处理技术应用于原始数据;例如裁剪,下采样,二值化等。

  environment模块提供一个接口,作为强化学习智能体的SNN可以从该接口获取强化学习环境中的信息并采取动作。GymEnvironments对象包含用于gym (Brockman et al., 2016) RL环境的通用包装,并调用其reset(),step(action),close()和render()函数,同时提供默认的预处理函数preprocess()用于从每个环境中进行观察。step(action)函数在gym环境中执行一个action,该action返回观察值,奖励值,回合是否结束的指示以及包含额外信息的(名称,值)对的字典。另一个对象DatasetEnvironment为datasets模块中的对象提供了通用包装,使它们可用作Pipeline实例中的组件(请参见第3.3节)。 environment.action模块提供了将一个或多个网络层的脉冲映射到环境中的动作的方法;例如,select_multinomial()将脉冲的(归一化)向量视为概率分布,从中可以对环境类似大小的动作空间中的动作进行采样。

  在evaluation模块中实现了作为机器学习模型的SNN评估的简单方法。在无监督学习的情况下,assign_labels()函数将数据标签分配给神经元,这些神经元对应于在网络训练期间它们最容易在其上发放脉冲的数据类别(Diehl and Cook, 2015)。这些标签用于使用all_activity()和ratio_weighting()等方法对新数据进行分类(Hazan et al., 2018)。我们最近添加了logreg_fit和logreg_predict方法,以通过从scikit-learn库借用的logistic回归实现对分类数据进行拟合和预测(Pedregosa et al., 2011)。我们计划在不久的将来添加其他"读出"方法,例如k近邻(KNN)和支持向量机(SVM)。

  在模型模块中定义了网络结构的集合。 例如,Diehl and Cook (2015)的网络结构由DiehlAndCook2015对象实现,该对象支持具有合理默认值的参数,例如n_neurons,excite,inhib等。

 

3.3. The Pipeline Object

  为了简化包括SNN的机器学习系统的原型,我们还提供了Pipeline对象来构成环境,网络,环境观测值的编码以及从网络活动到环境行动空间的映射。Pipeline还提供了可选参数,用于在网络运行期间可视化环境和网络状态变量,定期跳过或记录观测值,每个观测值的仿真时间(默认为1个时间步骤)等。流水线的主要动作可以解释为在流水线step()函数中实现的四步重复过程:

  1. 根据最后一个或多个时间步骤中一个或多个网络层的活动来选择一个动作。
  2. 此动作用作环境的step()函数的输入,该函数返回一个新的观测值,一个标量奖励,仿真是否已完成以及特定于环境的任何额外信息。
  3. 根据用户指定的编码功能(自定义或来自encoding模块),将环境返回的观测结果转换为脉冲序列,并请求仿真时间。
  4. 脉冲序列编码的观测值用作网络的输入。

  除了Pipeline对象所需的参数(network, environment, encoding和action)外,还支持一些关键字参数,例如history和delta。history_length参数指示要维护多个序列观察值,以便计算当前观察值与存储在history数据结构中的观察值之差。这意味着在每个时间步骤中,只有环境观测空间中的新信息作为输入传递到网络。delta参数(默认为1)指定在history中存储观察值的时间间隔。如果观测值在连续步骤之间变化不大,这可能很有用;然后,我们应该在进行观察之间等待一些delta时间步骤,以期望会有显著差异。例如,结合history_length = 4和delta = 3将存储观测值{0, 3, 6, 9},{3, 6, 9, 12},{6, 9, 12, 15}等。存在用于处理控制台输出,绘图等的关键字参数,并且在Pipeline对象文档中进行了详细说明。

  图2描绘了Pipeline对象的功能图。

 

3.4. Visualization

  BindsNET包含有用的可视化工具,可在网络或环境仿真期间或之后提供信息。在analysis.plotting模块中实现了一些通用的绘图函数;例如plot_spikes()和plot_voltages()动态创建和更新绘图,而不是在每个时间步骤都重新创建图形。这些函数可以通过一次调用显示脉冲和电压。其他函数包括plot_weights()(显示连接权重),plot_input()(显示原始输入数据)和plot_performance()(显示性能指标的时间序列)。Python生态系统中的其他可视化库(例如matplotlib)可用于绘制网络状态变量或其他数据,因为BindsNET的用户可能需要绘制模块未涵盖的更复杂的用例。

  analysis.visualization模块包含仿真完成后网络状态变量的其他绘图函数。这些工具使实验人员可以分析学习到的权重或脉冲输出,或总结其SNN模型的长期行为。例如,weights_movie()函数根据其值序列创建Connection的权重矩阵的动画,从而使连接权重更新的轨迹可视化。

 

3.5. Adding New BindsNET Features

  为了扩展BindsNET,可以使用所需的功能来扩展软件包中找到的某些抽象对象。在下面,我们讨论BindsNET的用户和开发人员如何自定义定义新的神经元模型,连接类型和学习规则。能够以类似方式定义其他BindsNET对象(例如Monitors,Datasets等)。

 

3.5.1. Neuron Models

  抽象类Nodes实现了所有神经元类型共有的函数。它定义了抽象函数step()和reset_(),它们可以选择在子类中重写,或者可以通过编写以下形式的类来定义新的Nodes对象:

这三个函数通常都调用名称相似的Nodes抽象类函数,但是可以根据需要完全重新定义这些函数。抽象基类AbstractInput也可用于使用用户定义的输入定义节点类型(例如,使用RealInput对象仿真恒定电流注入)。
  目前,BindsNET不会自动求解状态变量动态方程(例如,BRIAN仿真器Goodman and Brette, 2009)。相反,用户必须在step()函数的主体中自己定义神经元差分方程。我们将Euler集成作为对高效计算的强调的一部分。在将来的BindsNET版本中可能会添加动态方程的自动解。

 

3.5.2. Connection Types

  类AbstractConnection实现所有连接对象共有的函数。它定义了抽象方法compute(s),update(dt),normalize()和reset_()。BindsNET的用户可以通过创建从AbstractConnection继承的类来定义自己的连接类型。要定义一个新的连接对象,必须编写以下形式的类:

 

3.5.3. Learning Rules

  抽象类LearningRule定义了所有学习规则共有的函数。它定义了抽象方法update(dt),用于以某种方式更新连接的突触强度。通常,此方法利用突触前和突触后神经元脉冲和/或脉冲迹来计算一些局部学习规则。例如PostPre STDP。但是,BindsNET的用户可能希望构建学习规则,而不是依赖于非局部信息。例如,MSTDP和MSTDPET规则要求使用奖励关键字参数来调节突触权重更新的信号和强度。要定义新的学习规则,可以编写如下的类:

 

4. EXAMPLES OF USING BINDSNET TO SOLVE MACHINE LEARNING TASKS

  我们提供一些简单的示例脚本,以给人一个如何使用BindsNET来构建实现机器学习功能的SNN的印象。BindsNET是通过功能封装的概念构建的,从而使其可以更快且更轻松地进行泛化和原型制作。请注意以下示例中脚本的紧凑性:创建模型,加载数据集,根据流水线指定它们的交互以及运行训练循环所需的代码行较少。当然,这些命令依赖于许多行的基础代码,但是用户不再需要为每个实验脚本实现它们。如果可用参数的更改还不够,则实验人员可以通过在模型中对基础代码进行更改来进行干预,而无需更改语言或环境,从而保留了编码环境的连续性。

 

4.1. Unsupervised Learning

  models模块中的DiehlAndCook2015对象实现了Diehl and Cook (2015)中讨论的网络结构的简化版本。图3给出了训练SNN以学习无标签MNIST数字数据集表征的最小工作示例,图4描绘了状态变量监视图。Pipeline对象用于隐藏数据集,编码函数和网络实例之间协调的混乱细节。可以根据需要将其他图或控制台输出的代码添加到训练循环中,以进行监视。

  本文的主要目的是介绍BindsNET软件框架,而对正在进行或将来研究的目标是对实现与其他SNN平台进行比较的系统评估。但是,重要的是要证明BindsNET达到了其同行的标准。为了说明BindsNET的性能,在此我们介绍一些初步结果。进一步的细节在Saunders et al. (2018)和Hazan et al. (2018)中给出。对于MNIST数据集,BindsNET的分类性能达到95%,与Diehl and Cook (2015)中报道的基于BRIAN的实现相当。此外,BindsNET的灵活平台允许对学习规则和超参数进行广泛的探索,并且我们已经证明,我们的方法可以通过较小的SNN达到或超过BRIAN的精度。此外,随着训练的进行,我们在学习的早期阶段使用BindsNET的方法的精度迅速提高,使用的示例比替代方法少得多(Hazan et al., 2018)。同样,在当前的工作中,我们并不打算对基于BindsNET的解决方案进行系统的评估,但是初步结果是有希望的,并且正在进行大量工作。

 

4.2. Supervised Learning

  我们使用一个简单的两层SNN来实现Fashion-MNIST图像数据集的监督学习(Xiao et al., 2017)。图5给出了训练脉冲网络对数据进行分类的最小示例,图6描绘了输出结果。将100个兴奋性神经元层分为10组,每组10个大小。在每个输入示例中,我们观察数据的标签,并从其组中截断随机选择的兴奋性神经元,以在每个时间步骤上发放脉冲。这迫使神经元朝当前输入示例的形状调整其滤波器权重。

 

4.3. Reinforcement Learning

  我们构建了一个三层SNN以计算从Breakout观测值编码的脉冲。输入层采用80x80图像的脉冲编码,该图像已根据来自GymEnvironment的观察进行了下采样和二值化。输出层由4个神经元组成,它们对应于Breakout游戏的4种可能动作。计算的结果是输出层中的脉冲活动,通过使用输出层中脉冲总和的softmax函数将其转换为游戏动作空间中的动作。网络和环境的仿真是交错的,并且似乎并行运行。SNN与softmax函数的组合给出了RL环境的随机策略,用户可以应用任何RL算法来修改SNN的参数以更改策略。有关构建SNN和部署GymEnvironment实例所涉及细节的更完整视图,请参阅图7中所示的脚本以及图8中的伴随展示。

 

4.4. Reservoir Computing

  储层计算机通常由三个部分组成:(1) 编码器,用于转换从馈送给它的环境的输入;(2) 基于随机连接的神经元(储层)的动态系统;以及(3) 读出机制。通常通过梯度下降训练读数,以对某些目标函数执行分类或回归。BindsNET可用于轻松使用脉冲神经元来构建储层计算机,并且可以选择使用PyTorch的机器学习函数来学习从高维储层状态到所需输出的函数。图9中给出了用于定义和仿真简单储层计算机的代码,图10显示了监视仿真进度的图。CIFAR-10自然图像数据集上的储层计算机的输出被用作转换输入到逻辑回归模型。然后训练逻辑回归模型,以根据储层产生的特征识别类别。

 

4.5. Benchmarking

  为了比较几个竞争的SNN仿真器,我们设计了一个简单的仿真程序,并根据其他类似框架对我们的软件进行基准测试。我们仿真了一个网络,该网络具有从U(0, 100)随机抽取的n个Poisson输入神经元,其发放率(以赫兹为单位),将所有对象与相等大小的LIF神经元群体连接在一起,并从N(0, 1)中采样连接权重。我们以250的步长系统地将n从250改变为10000,然后对每个库进行每个仿真1000 ms,时间分辨率dt = 1.0。我们测试了BindsNET(使用CPU和GPU计算),BRIAN2,PyNEST(运行C++ NEST核心仿真器的NEST SLI接口的Python接口),ANNarchy(使用CPU和GPU计算)和BRIAN2genn (BRIAN2前端 GeNN仿真器)。考虑了Nengo和NEURON仿真器,但在两种情况下,我们都无法实现基准网络结构。与BindsNET相比,这表明使用这些竞争性仿真库的表达性或相对难度。几个软件包,包括BRIAN和PyNEST,允许设置某些全局首选项;例如CPU线程数,OpenMP进程数等。我们为基准测试选择了这些设置,以最大程度地提高每个库的速度,但是请注意,BindsNET不需要设置这些选项。我们的方法继承了PyTorch的计算模型,似乎可以充分利用可用的硬件,因此可以使从业人员轻松地从其系统中获得最优性能。

  所有仿真均在配备Intel(R) Xeon(R) CPU E5-2687W v3 @ 3.10GHz, 128Gb RAM @ 2133MHz和两个GeForce GTX TITAN X (GM200) GPU的Ubuntu 16.04 LTS上运行。在所有情况下都使用Python 3.6,但要使用ANNarchy进行仿真则需要使用Python 2.7。记录每个仿真运行的时钟时间。结果如图11所示。

  如图11所示,对于n > 2.5K,PyNEST仿真运行被切断,对于n > 5K,ANNarchy(在CPU上)被切断,原因是在此之后,它们的仿真时间远远超过了其他库的仿真时间。在小型网络(n < 2.5K)下,BindsNET仿真(仅CPU版本)比BRIAN2仿真要快。然而,随着仿真神经元数量的增加,这种关系发生了逆转。但是,在较大的网络(n > 1.5K)中,纯GPU的BindsNET仿真器比BRIAN2更快,并且在较小的网络中,仿真时间具有竞争力。BRIAN2genn仿真器非常快,几乎恒定的仿真时间约为0.2s。但是,无论网络大小如何,都需要大约25s的编译时间,然后才能开始仿真。与此类似,使用ANNarchy使用GPU计算进行仿真的速度相当快,但是随着网络规模的增长,编译时间超线性增加。

  因此,BindsNET构成了一些流行的现有SNN仿真库的速度竞争替代品。尽管我们的基准研究远非全面,但它展示了BindsNET可能比其他方法更可取的特定用例;即,在具有所有连接的前馈网络的情况下。可以进行类似的研究来评估其相对于其他SNN结构可比的性能。我们希望,在不同的应用程序中,其他库在速度或内存使用方面将表现更好,并且实验者应选择最优的软件来完成仿真任务。如前所述,我们的方法最适用于在CPU和GPU上快速进行SNN的原型制作和测试,这在前面的基准分析中得到了部分证明。特别是,使用BindsNET库进行GPU计算的主要优点是,与BRIAN2genn和ANNarchy库相反,它不需要网络定义和仿真之间的编译步骤。这非常适合机器学习实验,该实验通常需要多次模型构建和超参数调整迭代,而每次尝试之前重新编译可能会阻碍这些迭代。

 

5. ONGOING DEVELOPMENTS

  BindsNET仍处于开发的早期阶段,因此未来的工作和改进空间很大。由于这是一个开源项目,并且由于研究界对使用SNN进行机器学习的兴趣很大,因此我们很乐意为库提供大量社区贡献。的确,我们相信该项目的公众利益以及它所依赖的库的强大支持将成为其成熟和功能扩展的重要驱动因素。我们提到了一些具体的实现目标:

  • 其他神经元类型,学习规则,数据集,编码函数等。添加的函数应根据库用户的需求而优先。
  • SNN的机器学习和强化学习算法的专业化。这些可以采取其他学习规则的形式,也可以采取在网络级别而不是在单个突触上运行更复杂的训练方法。
  • 与PyTorch紧密集成。PyTorch的大部分神经网络函数在SNN环境(例如Conv2dConnection)中很有用,并将受益于它们的继承。
  • 将在PyTorch中实现或以ONNX格式指定的深度神经网络模型自动转换为近似等效的SNN(如Diehl et al., 2015)。
  • 性能优化:提高库原型的性能将节省使用SNN进行所有实验的时间。高优先级特征是使用稀疏脉冲向量和连接权重来进行有效的线性代数运算。
  • SNN的自动平滑:将脉冲神经元近似为可微分的运算(Hunsberger and Eliasmith, 2015),将能够使用反向传播来训练易于转移到SNN的网络。然后可以使用torch.autograd自动微分库(Paszke et al., 2017)来优化ML问题的脉冲网络参数。

 

6. DISCUSSION

  我们已经介绍了BindsNET开源软件包,用于以机器学习为导向的方法对SNN进行生物学启发式快速原型制作。BindsNET完全用Python开发,并建立在其他成熟的Python库的基础之上,这些库利用强大的功能来利用多CPU或多GPU硬件配置。具体来说,PyTorch的ML工具和强大的数据结构是BindsNET操作的核心部分。BindsNET还可以与gym库交互,以将SNN连接到强化学习环境。 总而言之,BindsNET为研究社区提供了一种有吸引力的替代方案,目的是为SNN实验开发更快且更灵活的工具。

  BindsNET包含一个简单易用,灵活且高效的SNN仿真框架。我们的库在ML和RL方面与其他解决方案区分开来;避免使用生物神经元的复杂细节,而使用高级功能。具有计算倾向的研究人员可能熟悉潜在的PyTorch函数和原型,并对第三代神经网络解决ML问题的潜力感到兴奋,从而推动了ML和计算神经科学领域的采用。机器学习编程工具和神经科学思想的这种结合可以促进生物神经网络和机器学习的进一步集成。迄今为止,SNN尚未在ML和RL问题中得到广泛应用。拥有一个针对此的库是朝着令人兴奋的新研究方向迈出的有希望的一步。

  对开发用于ML或RL应用程序的SNN感兴趣的研究人员会发现,BindsNET是一种强大而简单的工具,可以用来发展他们的想法。为此,神经成分的生物复杂性已降至最低,并且强调了高级的定性功能。但是,实验人员仍然可以在膜电位和脉冲水平上访问和控制神经元组,并在突触强度水平上进行连接,构成相对较低的抽象水平。即使包含了这些详细信息,也可以直接构建大型而灵活的网络结构并将其应用于实际数据。我们相信,我们的框架使研究人员能够轻松地将神经网络作为ML模型或RL智能体进行推断,将推动生物学合理的机器学习的发展,或将ML与神经科学概念进一步融合。

  尽管BindsNET在精神上与Nengo (Bekolay et al., 2014)的神经和大脑建模软件相似,因为这两个软件包都可以将深度学习库用作"后端"进行计算,但Nengo可选择以有限的方式使用Tensorflow,而BindsNET默认情况下,PyTorch用于所有网络仿真函数(带有torch.Tensor对象)。此外,对于喜欢PyTorch的灵活性和命令性执行特征的用户,BindsNET继承了这些特征,并在开发时考虑了许多相同的设计原则。BindsNET与使用GPU计算的其他仿真库相比具有优势,这需要在网络构建和部署之间进行昂贵的编译步骤。BindsNET不需要这些昂贵的中间步骤,因为它使用PyTorch的"急切"执行,而与实际的仿真硬件无关。

  在性能和功耗方面,用于增强神经网络计算的硬件平台比软件仿真具有优势。例如,SpiNNaker (Plana et al., 2011)将廉价,通用但专用的CPU板组合在一起,从而在硬件中创建了功能强大的SNN仿真框架。其他平台(例如TrueNorth Akopyan et al., 2015, HRL, and Braindrop)涉及新芯片的设计。英特尔的Loihi平台是一项新颖的开发,可用于基于脉冲的计算,其性能优于所有已知的常规解决方案(Davies et al., 2018)。其他解决方案基于可编程硬件,例如FPGA,FPGA可以将神经公式转换为电子门的配置,从而加快计算速度。可以使用更专用的硬件(例如ASIC和DSP)来并行化,从而加快计算速度。为了在硬件领域进行实验,通常必须学习针对硬件平台的特定编程语言,或者在芯片设计人员所施加的约束下,将现有的实验谨慎地适应于独特的硬件环境。无论哪种情况,对于想要快速进行原型制作和测试的研究人员来说,都不是理想的情况。BindsNET平台引入了一种灵活性,可以在未来的硬件开发中加以利用,尤其是在机器学习问题中。

  对于希望快速构建灵活的SNN原型(由易于使用但功能强大的深度学习库支持)的用户而言,BindsNET是一个简单而诱人的选择。它鼓励将脉冲网络作为机器学习模型或强化学习智能体的概念,并且是同类产品中最早提供与机器学习和强化学习环境无缝接口的一种。该库受几个成熟且功能齐全的开源软件项目的支持,并受益于它们的成长和不断改进。BindsNET被认为是PyTorch库的扩展,代表了从第二代神经网络到第三代SNN的自然发展。

posted on 2021-01-20 20:53  穷酸秀才大草包  阅读(1547)  评论(0编辑  收藏  举报

导航