一个用于在 CPU 或 GPU 上模拟尖峰神经网络(SNNs)的 Python 软件包,使用 PyTorch 的 Tensor
功能。
BindsNET 是一个尖峰神经网络模拟库,专注于开发生物启发的机器学习算法。
该软件包作为应用 SNNs 于机器学习(ML)和强化学习(RL)问题的研究的一部分,在 生物启发神经与动态系统实验室(BINDS) 使用。
请查看 BindsNET 示例,其中包含一系列实验、结果分析函数、实验结果的图表等。有关该软件包的文档可以在这里找到。
要求
- Python >=3.9,<3.12
设置
使用 Pip
从 GitHub 仓库安装最新稳定版本
pip install git+https://github.com/BindsNET/bindsnet.git
或者,从源码构建 bindsnet
软件包,克隆 GitHub 仓库,切换到此项目的顶级目录,并执行
pip install .
或者,以可编辑模式安装(允许在不重新安装的情况下修改软件包):
pip install -e .
要安装与 OpenAI gym RL 环境库 接口所需的软件包,请按照其指示安装运行 RL 环境模拟器所需的软件包(在 Linux / MacOS 上)。
使用 Docker
链接到 Docker 仓库。
我们还提供了一个 Dockerfile,其中安装了 BindsNET 及其所有依赖项。在此项目的顶级目录中执行
docker build .
以创建一个 docker 镜像。
要更改新建镜像的名称,请执行
docker tag <IMAGE_ID> <NEW_IMAGE_ID>
要运行一个容器并获得其中的 bash 终端,请执行
docker run -it <NEW_IMAGE_ID> bash
入门
要运行与此论文中的 SNN 近似的复制,执行
cd examples/mnist
python eth_mnist.py
可以传递一些可选命令行参数,包括 --plot
(显示有用的监控图),--n_neurons [int]
(模拟的兴奋性和抑制性神经元数量),--mode ['train' | 'test']
(将网络操作设置为训练或测试阶段)等。使用 --help
或 -h
标志运行脚本以获取更多信息。
examples
目录中有许多其他示例,用于展示 BindsNET 的功能。看看吧,告诉我们你的想法!
运行测试
执行以下操作以运行测试:
python -m pytest test/
如果您的机器上没有安装 Open AI 的 gym
,某些测试将失败。
背景
模拟生物合理的尖峰神经元动态是一个挑战。通常通过求解描述这些动态的常微分方程(ODEs)来完成。PyTorch 并不显式支持微分方程的求解(例如 brian2
),但我们可以将描述动态的 ODE 转换为差分方程,并以固定的、短间隔(大约 1 毫秒的 dt
)进行求解,作为一种近似。当然,从内部来看,像 brian2
这样的软件包也在做同样的事情。 在 PyTorch
中做到这一点令人兴奋有几个原因:
-
我们可以使用强大且灵活的
torch.Tensor
对象,它是numpy.ndarray
的封装,可以在 GPU 设备之间进行传输。 -
我们可以通过在 SNN 架构中重用
torch.nn.functional
PyTorch 子模块中的函数来避免“重新发明轮子”;例如,卷积或池化函数。
神经元尖峰的顺序及其相对时间编码信息的概念是神经科学的核心主题。 Markram 等人(1997) 提出,神经元之间的突触应根据这种相对时间加强或退化,之前,Donald Hebb 提出了 Hebbian 学习理论,通常简述为“同时发火的神经元连接在一起。” Markram 等人的 Hebbian 理论扩展被称为尖峰时间依赖可塑性(STDP)。
我们感兴趣的是将 SNN 应用于 ML 和 RL 问题。我们使用 STDP 来修改连接 SNN 中神经元对或种群的突触权重。在 ML 的背景下,我们希望学习突触权重的设置,该设置将生成数据依赖的 SNN 尖峰活动。这种活动将允许我们随后执行某个感兴趣的 ML 任务;例如,区分或聚类输入数据。在 RL 的背景下,我们可以将尖峰神经网络视为一个 RL 代理,其尖峰活动可以转换为环境操作空间中的动作。
我们提供了一些简单的入门脚本,用于无监督学习(通过 STDP 学习完全连接或卷积表示),有监督学习(根据数据标签夹紧输出神经元以实现期望的尖峰行为)和强化学习(将 Atari 游戏 Space Invaders 的观察结果转换为 SNN 的输入,并将网络活动转换回游戏中的动作)。
基准测试
我们模拟了一个包含 n 个泊松输入神经元的网络,这些神经元的发火率(赫兹)随机从 U(0, 100) 中抽取,所有这些神经元与同样大小的漏泄积分和发火(LIF)神经元种群全连接,连接权重从 N(0,1) 中抽取。我们系统地将 n 从 250 变为 10,000,每次增加 250,并使用每个库运行每个模拟 1,000 毫秒,时间分辨率 dt = 1.0。我们测试了 BindsNET(使用 CPU 和 GPU 计算)、BRIAN2、PyNEST(运行 C++ NEST 核心模拟器的 NEST SLI 接口的 Python 接口)、ANNarchy(使用 CPU 和 GPU 计算)和 BRIAN2genn(BRIAN2 的前端,GeNN 模拟器)。
一些软件包,包括 BRAIN 和 PyNEST,允许设置某些全局首选项;例如,CPU 线程数,OpenMP 进程数等。我们为基准测试选择了这些设置,试图最大化每个库的速度,但请注意,BindsNET 无需设置这些选项。我们的方法继承了 PyTorch 的计算模型,似乎最大限度地利用了可用硬件,因此使从业者能够以最少的努力从系统中获得最佳性能。
所有模拟均在 Ubuntu 16.04 LTS、Intel(R) Xeon(R) CPU E5-2687W v3 @ 3.10GHz、128Gb RAM @ 2133MHz 和两块 GeForce GTX TITAN X (GM200) GPUs 上运行。所有情况下都使用 Python 3.6。记录每次模拟运行的时钟时间。
引用
如果您在研究中使用 BindsNET,请引用以下文章:
@ARTICLE{10.3389/fninf.2018.00089,
AUTHOR={Hazan, Hananel and Saunders, Daniel J. and Khan, Hassaan and Patel, Devdhar and Sanghavi, Darpan T. and Siegelmann, Hava T. and Kozma, Robert},
TITLE={BindsNET: A Machine Learning-Oriented Spiking Neural Networks Library in Python},
JOURNAL={Frontiers in Neuroinformatics},
VOLUME={12},
PAGES={89},
YEAR={2018},
URL={https://www.frontiersin.org/article/10.3389/fninf.2018.00089},
DOI={10.3389/fninf.2018.00089},
ISSN={1662-5196},
}
贡献者
- Daniel Saunders (email)
- Hananel Hazan (email)
- Darpan Sanghavi (email)
- Hassaan Khan (email)
- Devdhar Patel (email)
许可证
GNU Affero 通用公共许可证 v3.0