郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布!
Frontiers in neuroinformatics, (2018)
Abstract
尖峰神经网络仿真软件的开发是实现神经系统建模和生物启发算法开发的关键组件。 现有的软件框架支持广泛的神经功能,软件抽象级别和硬件设备,但通常不适合快速原型设计或应用于机器学习领域的问题。 在本文中,我们描述了一个新的Python软件包,用于模拟尖峰神经网络,特别适合于机器学习和强化学习。 我们的软件BindsNET1可快速构建和仿真尖峰网络,并具有用户友好的简洁语法。 BindsNET建立在PyTorch深度神经网络库上,有助于在快速CPU和GPU计算平台上实现尖峰神经网络。 此外,可以调整BindsNET框架以利用其他现有的计算和硬件后端。 例如TensorFlow和SpiNNaker。 我们提供与OpenAI体育馆库的接口,允许在强化学习环境中训练和评估尖峰网络。 我们认为该程序包有助于将尖峰网络用于大规模机器学习问题,并通过在实践中使用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的简单形式,其中权重根据pre的相对时间而增加或减少。 -和突触后峰值,具有用户指定的(可能是非对称的)学习率。 还实施了Florian(2007)的奖励调制STDP(MSTDP)和具有资格跟踪的奖励调制STDP(MSTDPET)规则,用于基础强化学习实验。 通常,任何学习规则都可以与任何连接类型和其他网络组件一起使用,但是研究人员需要选择正确的实验方法。
数据集模块提供了一种下载,预处理和迭代机器学习数据集的方法。 例如,MNIST对象为MNIST手写数字数据集提供此功能。 除此以外,还支持其他几个数据集,包括CIFAR-10,CIFAR-100(Krizhevsky和Hinton,2009年)和Spoken MNIST。 可以使用编码模块将数据集中的样本编码为峰值序列,当前支持几种功能,这些功能可基于不同的统计分布和生物学启发的刺激转换,从非负数据创建峰值序列。编码函数包括:poisson()和rank_order(),poisson()将表示发射率的数据转换为具有所述发射率的Poisson峰值序列,然后将数据转换为按输入数据的强度在时间上排序的每个神经元单个峰值(Thorpe和Gautrais,1998 )。 尖峰可用作SNN甚至其他ML系统的输入。 数据集的子模块预处理允许用户将各种预处理技术应用于原始数据。 例如裁剪,二次采样,二值化等。
环境模块提供一个接口,作为增强学习代理的SNN可以从该接口获取增强学习环境中的信息并采取行动。 GymEnvironments对象包含用于健身房(Brockman等人,2016)RL环境的通用包装,并调用其reset(),step(action),close()和render()功能,同时提供默认的预处理功能 preprocess()用于从每个环境中进行观察。 步骤(动作)功能在健身房环境中执行一个动作,该动作返回观察值,奖励值,情节是否结束的指示以及包含其他信息的(名称,值)对的字典。 另一个对象DatasetEnvironment为数据集模块中的对象提供了通用包装,使它们可用作Pipeline实例中的组件(请参见第3.3节)。 environment.action模块提供了将一个或多个网络层的峰值映射到环境中的动作的方法; 例如,select_multinomial()将尖峰的(归一化)向量视为概率分布,从中可以对环境类似大小的动作空间中的动作进行采样。
在评估模块中实现了作为机器学习模型的SNN评估的简单方法。 在无监督学习的情况下,assign_labels()函数将数据标签分配给神经元,这些神经元对应于在网络训练期间它们最容易在其上加峰值的数据类别(Diehl和Cook,2015)。 这些标签用于使用all_activity()和ratio_weighting()等方法对新数据进行分类(Hazan等人,2018)。 我们最近添加了logreg_fit和logreg_predict方法,以通过从scikit-learn库借用的logistic回归实现对分类数据进行拟合和预测(Pedregosa等,2011)。 我们计划在不久的将来添加其他“读出”方法,例如k最近邻(KNN)和支持向量机(SVM)。
在模型模块中定义了网络体系结构的集合。 例如,Diehl and Cook(2015)的网络结构由DiehlAndCook2015对象实现,该对象支持具有合理默认值的参数,例如n_neurons,excite,inhib等。
3.3. The Pipeline Object
3.4. Visualization
3.5. Adding New BindsNET Features
3.5.1. Neuron Models
3.5.2. Connection Types
3.5.3. Learning Rules
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