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

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

概述微信公众号:脑机接口研习社关注脑机接口最新进展脑机接口研习社公众号即将开通机器学习专栏,从本篇文章开始,将介绍如何利用Bindsnet-Python包模拟脉冲神经网络(SNN)。一、脉冲神经网络(SNN)简介首先,我们来看什么是人工神经网络。人工神经网络(ArtificialNeuralNetwork,即A

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

脑机接口研习社公众号即将开通机器学习专栏,从本篇文章开始,将介绍如何利用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),是神经元间的直连感知,模拟的是简单的神经元模型,只能处理二进制。


▲Perceptrons: The First Neural Networks

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

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


▲ A Comprehensive GuIDe to Convolutional Neural Networks

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

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

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


▲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 Networknetwork = 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. 建立一个网络所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/langs/1188471.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存