如何利用Bindsnet-Python模拟脉冲神经网络(SNN)?Part I. 建立一个网络

如何利用Bindsnet-Python模拟脉冲神经网络(SNN)?Part I. 建立一个网络

微信公众号:脑机接口研习社
关注脑机接口最新进展

脑机接口研习社公众号即将开通机器学习专栏,从本篇文章开始,将介绍如何利用Bindsnet-Python包模拟脉冲神经网络(SNN)

一、脉冲神经网络(SNN)简介

首先,我们来看什么是人工神经网络。

人工神经网络(Artificial Neural Network,即ANN ),是20世纪80年代以来人工智能领域兴起的研究热点。它从信息处理角度对人脑神经元网络进行抽象,建立某种简单模型,按不同的连接方式组成不同的网络。在工程与学术界也常直接简称为神经网络或类神经网络。神经网络是一种运算模型,由大量的节点(或称神经元)之间相互联接构成。每个节点代表一种特定的输出函数,称为激励函数(activation function)。每两个节点间的连接都代表一个对于通过该连接信号的加权值,称之为权重,这相当于人工神经网络的记忆。网络的输出则依网络的连接方式,权重值和激励函数的不同而不同。

参考链接:https://baike.baidu.com/item/%E4%BA%BA%E5%B7%A5%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C/382460?fr=aladdin#3

在人工神经网络的发展过程中,产生了几代经典的神经网络模型。

第一代神经网络是感知机(perceptron),是神经元间的直连感知,模拟的是简单的神经元模型,只能处理二进制。

如何利用Bindsnet-Python模拟脉冲神经网络(SNN)?Part I. 建立一个网络
▲Perceptrons: The First Neural Networks

第二代BP(back propagation)一类的神经网络,模拟了神经元全连接和反馈机制,是基于神经脉冲的频率进行编码。

第三代是深度学习领域涉及的神经网络,如卷积神经网络(Convolutional Neural Networks,CNN,比感知机多了卷积层,模拟了多层的神经元之间的部分连接和反馈机制。

如何利用Bindsnet-Python模拟脉冲神经网络(SNN)?Part I. 建立一个网络
▲ A Comprehensive Guide to Convolutional Neural Networks

到CNN为止,所有连接权重的更新速度是一样的。即所有神经元的连接,在某个时间点的兴奋度低,但在下一个时间点的兴奋度可能很高!

这可能不符合常识,因为知道,大脑中的神经元在训练足够多的次数后,神经元的连接会变得越来越强烈,以至于最后会产生条件反射。所以此刻兴奋的神经元在下一时刻应该惯性地也比较兴奋才对。

这就引出了脉冲神经网络(SNN)的想法:神经元兴奋度不应该是一瞬间更新的,而是慢慢衰减的,衰减的过程中有机会向更深的网络激活兴奋区,最后,激活的兴奋区才是最后的预测判别结果。SNN主要模拟的是神经突触以电脉冲传递信息的编码方式。

如何利用Bindsnet-Python模拟脉冲神经网络(SNN)?Part I. 建立一个网络
▲Spiking Neural Networks, the Next Generation of Machine Learning

CNN和SNN是不同视角的类脑智能,人工智能的发展也都是向着更加类脑的方向发展。

二、Bindsnet-Python简介

Bindsnet是一个python包,它使用pytorch函数在CPU或GPU上模拟脉冲神经网络(SNN)。

Bindsnet是一个脉冲神经网络模拟库,旨在开发用于机器学习的生物启发算法。

此软件包是在受生物启发的神经和动力系统(binds)实验室中,将SNN应用于机器学习(Machine Learning,ML)和强化学习(Reinforcement Learning, RL)问题的持续研究的一部分。

三、建立一个网络(Creating a Network)

BindsNET主要提供bindsnet.network.Network的object, 它负责协调其所有组成部分的仿真:神经元,突触,学习规则(neurons, synapses, learning rules)等。

代码示例:

from bindsnet.network import Network
network = Network()

该bindsnet.network.Network的Object接受可选关键字参数dt, batch_size,learning,和reward_fn。

dt参数指定模拟时间步长,该步长确定要解决模拟的时间粒度(以毫秒为单位)。为了简化计算,所有仿真均使用Euler方法进行。如果在仿真中遇到不稳定性,请使用较小的dt值来解决数值的不稳定性。

batch_size参数指定输入数据的预期minibatch大小。但是,由于BindsNET支持动态minibatch大小,因此可以放心地忽略此参数。它用于初始化有状态的神经元和突触变量,如果过早事先指定,可能会提供较小的加速。

learning参数用于启用或禁用对网络组件的自适应参数的更新,例如,突触权重或自适应电压阈值。

reward_fn参数采用一个类,该类指定如何计算标量奖励信号并将其馈送到网络及其组件。通常,此可调用类的输出将用于某些“奖励调节( reward-modulated)”或“三因素(three-factor)”学习规则中。

下期将介绍如何添加网络元件(Adding Network Components)。

未完待续……

参考链接:

https://bindsnet-docs.readthedocs.io/guide/guide_part_i.html#creating-a-network

https://www.cnpython.com/pypi/bindsnet

https://baike.baidu.com/item/%E4%BA%BA%E5%B7%A5%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C/382460?fr=aladdin#3

https://www.zhihu.com/question/297704400

http://nooverfit.com/wp/%e8%84%89%e5%86%b2%e7%a5%9e%e7%bb%8f%e7%bd%91%e7%bb%9csnn%e4%bc%9a%e6%98%af%e4%b8%8b%e4%b8%80%e4%bb%a3%e7%a5%9e%e7%bb%8f%e7%bd%91%e7%bb%9c%e5%90%97%ef%bc%9f-%e7%9f%a5%e8%af%86%e6%a2%b3%e7%90%86/

图源/谷歌图片

如何利用Bindsnet-Python模拟脉冲神经网络(SNN)?Part I. 建立一个网络
如何利用Bindsnet-Python模拟脉冲神经网络(SNN)?Part I. 建立一个网络
如何利用Bindsnet-Python模拟脉冲神经网络(SNN)?Part I. 建立一个网络
如何利用Bindsnet-Python模拟脉冲神经网络(SNN)?Part I. 建立一个网络

上一篇:DML与TPL 数据管理语句与数据库事务


下一篇:BindsNET学习系列 ——Connection