简述脉冲神经网络SNN:下一代神经网络,及其仿真工具

脉冲神经网络(SNN)属于第三代神经网络模型,实现了更高级的生物神经模拟水平。除了神经元和突触状态之外,SNN
还将时间概念纳入了其操作之中。本文将简要介绍这种神秘的神经网络形式。

所有对目前机器学习有所了解的人都听说过这样一个事实:目前的人工神经网络是第二代神经网络。它们通常是全连接的,接收连续的值,输出连续的值。尽管当代神经网络已经让我们在很多领域中实现了突破,但它们在生物学上是不精确的,其实并不能模仿生物大脑神经元的运作机制。

在这里插入图片描述

第三代神经网络,脉冲神经网络(Spiking Neural Network,SNN),旨在弥合神经科学和机器学习之间的差距,使用最拟合生物神经元机制的模型来进行计算。脉冲神经网络与目前流行的神经网络和机器学习方法有着根本上的不同。SNN 使用脉冲——这是一种发生在时间点上的离散事件——而非常见的连续值。每个峰值由代表生物过程的微分方程表示出来,其中最重要的是神经元的膜电位。本质上,一旦神经元达到了某一电位,脉冲就会出现,随后达到电位的神经元会被重置。对此,最常见的模型是 Integrate-And-Fire(LIF)模型。此外,SNN 通常是稀疏连接的,并会利用特殊的网络拓扑。
在这里插入图片描述
LIF 模型中膜电位的微分方程
在这里插入图片描述
脉冲期间的膜电位形态
在这里插入图片描述
三神经元网络的脉冲训练
在这里插入图片描述
脉冲神经网络图示

乍一看,脉冲神经网络的方法像是一种倒退。我们从连续输出移动至二进制输出,这些脉冲训练的可解释性不强。但是,脉冲训练增强了我们处理时空数据(或者说真实世界感官数据)的能力。空间指神经元仅与附近的神经元连接,这样它们可以分别处理输入块(类似于 CNN 使用滤波器)。时间指脉冲训练随着时间而发生,这样我们在二进制编码中丢失的信息可以在脉冲的时间信息中重新获取。这允许我们自然地处理时间数据,无需 RNN 添加额外的复杂度。事实证明脉冲神经元是比传统人工神经元更强大的计算单元。

既然理论上 SNN 比第二代网络更强大,那么我们很自然会想到为什么它们没有得到广泛应用。主要问题在于 SNN 的训练。尽管我们有无监督生物学习方法,如赫布学习(Hebbian learning)和 STDP,但没有适合 SNN 的有效监督训练方法能够 i 通过提供优于第二代网络的性能。由于脉冲训练不可微,我们无法在不损失准确时间信息的前提下使用梯度下降来训练 SNN。因此,为了正确地使用 SNN 解决真实世界任务,我们需要开发一种高效的监督学习方法。这是一项艰巨的任务,因为它涉及到,给定这些网络的生物现实主义,确定人类大脑如何学习。

另一个问题是在正常硬件上模拟 SNN 需要耗费大量算力,因为它需要模拟微分方程。但是,神经形态硬件,如 IBM TrueNorth,旨在使用利用神经元脉冲行为的离散和稀疏本质的专门硬件模拟神经元,进而解决该问题。

今天看来,SNN 的未来依然不甚清晰。一方面,它们是我们当前神经网络的天然继承者;但是另一方面,对大多数任务来说它们还远不是实践工具。目前在实时图像和音频处理中有一些 SNN 实际应用,但相关文献仍然很少。绝大多数 SNN 论文或者是理论的,或者在一个简单的全连接第二代网络之中展示性能。然而,很多团队正致力于开发 SNN 监督式学习规则,并且我对 SNN 的未来充满乐观。

关于仿真工具方面。我感觉大多数都是对脉冲放电行为,在数学上就是微分方程的形式,对生物神经网络放电行为进行建模,其实用意义暂时还不大。。

参考以下链接:
NEST:
https://blog.huzicheng.com/2017/06/08/introduction-to-NEST/
https://github.com/nest/nest-simulator
PyNN:
https://www.cnblogs.com/yifdu25/p/8401683.html
软件工具链接可参考博文。
不得不说,这些年脉冲神经网络发展的还挺快:
https://blog.csdn.net/xiaoqu001/article/details/78713527

脉冲神经网络框架之bindsnet

当前脉冲神经网络的框架其实比较多,我之前用过PyNN+Nest,也用过下曼大的SpiNNaker,因为研究嘛,经常要修改学习算法一些比较底层的东西,框架用起来实在是太麻烦,有时想改部分东西,发现别人都封装好,不好改,所以就走上自己写代码的不归路。

一路走来,最大问题不是写不出代码,而是准确度总是比别人论文中低一点,所以抽点时间看了下别人写的框架,打算优化一下自己代码。当然我不会去看nest,brain这些框架,因为他们不会对我写代码有太大帮助,他们应该都是C语言,然后进行编译,我将选着一些由python写的框架进行解读。

当前github中有个比较多星星的python实现的SNN框架——BindsNET,python+pytorch实现
链接如下:
https://github.com/Hananel-Hazan/bindsnet
下面是github中对BindsNET的介绍:
它是使用PyTorch张量功能在CPU或GPU上模拟尖峰神经网络(SNN)的Python包。
BindsNET是一个用于开发生物启发的机器学习算法的神经网络仿真库。
该软件包是目前正在进行的将SNN应用于生物启发神经动力学系统(BINDS)实验室机器学习(ML)和强化学习(RL)问题的研究的一部分。
查看BindsNET实验存储库中的实验集合,附带用于在CICS集群上分配的bash脚本、用于分析结果的函数、实验结果的图表等等。

之后我将会对这个框架进行详细解读

发现这个网站不错:
https://www.pianshen.com/article/94171855502/

已标记关键词 清除标记
NNBP 1.0用法说明 本程序是BP算法的演示程序, 其中的Levenberg-Marquardt算法具有实用价值. 程序主界面如下: 一、网络训练 程序默认状态是样本训练状态,现将样本训练状态下的如何训练网络进行说明: 1. 系统精度: 定义系统目标精度,根据需要定义网络训练误差精度.误差公式是对训练出网络的输出层节点和实际的网络输出结果求平方差的和. 2. 最大训练次数: 默认为10000次,根据需要调整,如果到达最大训练次数网络还未能达到目标精度,程序退出. 3. 步长: 默认为0.01,由于采用变步长算法,一般不需人工设置. 4. 输入层数目: 人工神经网络的输入层神经元的节点数目. 5. 隐含层数目: 人工神经网络的隐含层神经元的节点数目. 6. 输出层数目: 人工神经网络的输出层神经元的节点数目. 7. 训练算法: 强烈建议选取Levenberg-Marquardt算法,该算法经过测试比较稳定. 8. 激活函数: 不同的网络激活函数表现的性能不同,可根据实际情况选择. 9. 样本数据的处理: 由于程序没有实现归一化功能, 因此用来训练的样本数据首先要归一化后才能进行训练. 其中: 数据输入: 就是选择用来训练的样本的文件,文件格式为每个参与训练网络的样本数据(包括输入和输出)占用一行,数据之间用空格隔开. 存储网络: 就是用来存放最终训练成功的网络权值等信息的文件,在仿真时调用用. 保存结果: 网络训练的最终结果,副产品,可丢弃,用来查看网络训练的精度. 10. 训练 点击该按钮用来训练网络。 二、网络仿真 首先要点击按钮 切换到数据仿真状态. 界面如图: 调入训练好的网络,然后选择用来仿真的数据(只包含输入层神经元的节点数目),点击仿真按钮即可。 调入网络: 选择已经训练好的网络文件,假设net_lm_sigmoid_16.txt文件是已经满足精度和泛化能力较好的网络文件,就调入该文件。 数据输入: 选择用来仿真的数据文件,该文件格式同前面介绍的用来训练网络的文件的格式,但需要去掉用网络来模拟的参数,只提供用来测试的网络输入层数据。 仿真结果: 用来保存对测试数据仿真后得到结果文件,即为所想要的数据。
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页