zoukankan      html  css  js  c++  java
  • 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展示一些简单的示例。

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

    1. INTRODUCTION

    2. REVIEW OF SNN SOFTWARE PACKAGES


    2.1. Objectives of SNN Simulations

    2.2. Comparison of State-of-Art Simulation Packages

    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

    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

    4.2. Supervised Learning

    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

    4.5. Benchmarking

    5. ONGOING DEVELOPMENTS

    6. DISCUSSION

  • 相关阅读:
    IOException while loading persisted sessions:java.io.EOFException
    Android Studio | 详细安装教程
    Android -- 关闭AsyncTask(异步任务)
    钢铁侠传-文言文
    http协议 get/post 请求 解析XML
    HTTP状态码大全
    jquery+ajax 类百度输入框
    这就是知识点
    关于Eclipse+SVN 开发配置
    企业信息化快速开发平台--JeeSite
  • 原文地址:https://www.cnblogs.com/lucifer1997/p/14212746.html
Copyright © 2011-2022 走看看