脉冲神经网络(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/
https://blog.csdn.net/xiaoqu001/article/details/78713527