如何看待第三代神经网络SNN?详解脉冲神经网络的架构原理、数据集和训练方法 原创

作者丨科技猛兽
编辑丨极市平台
本文首发于极市平台公众号,转载请获得授权并标明出处。

本文目录

1 脉冲神经网络简介
2 脉冲神经网络原理
3 脉冲神经网络数据集
4 脉冲神经网络训练方法
5 脉冲神经网络评价指标

1 脉冲神经网络简介

脉冲神经网络 (SNN) 属于第三代神经网络模型,实现了更高级的生物神经模拟水平。除了神经元和突触状态之外,SNN 还将时间概念纳入了其操作之中,是一种模拟大脑神经元动力学的一类很有前途的模型。

那么什么是第一代和第二代神经网络模型呢?

第一代神经网络

第一代神经网络又称为感知器,在1950年左右被提出来,它的算法只有两层,输入层输出层,主要是线性结构。它不能解决线性不可分的问题,对稍微复杂一些的函数都无能为力,如异或操作。

第二代神经网络:BP 神经网络

为了解决第一代神经网络的缺陷,在1980年左右 Rumelhart、Williams 等人提出第二代神经网络多层感知器 (MLP)。和第一代神经网络相比,第二代在输入层之间有多个隐含层的感知机,可以引入一些非线性的结构,解决了之前无法模拟异或逻辑的缺陷。

第二代神经网络让科学家们发现神经网络的层数直接决定了它对现实的表达能力,但是随着层数的增加,优化函数愈发容易出现局部最优解的现象,由于存在梯度消失的问题,深层网络往往难以训练,效果还不如浅层网络。

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

第三代神经网络:脉冲神经网络

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

然而,关于 SNN 作为人工智能和神经形态计算机群体中的计算工具的实用价值,长期以来一直存在争论。尤其是和人工神经网络 (ANN) 相比。在过去的几年里,这些怀疑减缓了神经形态计算 (neuromorphic computing ) 的发展,而随着深度学习的快速进步,研究人员试图从根本上缓解这个问题,人们想要通过加强 SNN 的手段,如改善训练算法,来缓解这个问题。

与成熟有效的人工神经网络 (ANN) 训练算法:误差反向传播算法 (Back Propagation) 不同,神经网络研究中最困难的问题之一是由于复杂的动力学和脉冲的不可微性质导致的训练困难。

为了提升脉冲神经网络的精度,已有一些前人的工作做出了探索,如:

  • Spike timing dependent plasticity (STDP) :无监督学习方法

1 Unsupervised learning of digit recognition using spike-timing-dependent plasticity

  • 添加奖励机制

2 Combining stdp and reward-modulated stdp in deep convolutional spiking neural networks for digit recognition

  • 把预训练好的 ANN 转化为 SNN

3 Spiking deep convolutional neural networks for energy-efficient object recognition
4 Spiking deep residual network
5 Fast-classifying, high-accuracy spiking deep networks through weight and threshold balancing
6 Training spiking deep networks for neuromorphic hardware
7 Conversion of continuous-valued deep networks to efficient event-driven networks for image classification

为了提升 ANN 与 SNN 的兼容性,通常把 bias 去掉,使用 ReLU 激活函数,把 max-pool 换成 average-pool 等。把 ANN 转化成 SNN 时,通常包括 weight/activation normalization,threshold tuning, sampling error compensation 等操作以维持精度。

  • 脉冲神经网络使用 BP 算法训练

8 Hybrid macro/micro level backpropagation for training deep spiking neural networks
9 Training deep spiking neural networks using backpropagation
10 Spatio-temporal backpropagation for training high-performance spiking neural networks
11 Direct training for spiking neural networks: Faster, larger, better

在执行反向传播时,梯度可以沿着空间维度通过聚合脉冲传播,也可以沿着时间和空间2个维度通过计算膜电势的梯度传播。

简而言之,通过上述努力,SNN 在视觉识别任务中的应用精度逐渐接近 ANN。

由于 SNN 缺乏专门的benchmark,许多工作直接使用 ANN 的 benchmark 来验证 SNN 模型。例如,用于 ANN 验证的图像数据集被简单地转换为 Spike 版本,用于 SNN 训练和测试。 此外,网络的准确性仍然是主要的评估指标,但众所周知,我们的大脑在绝对识别准确性方面,通常比现有的人工智能机器表现得差。这反映了我们需要更全面和公平的衡量标准来评估和模拟生物大脑工作方式的 SNN。简而言之,由于不适当的评估指标,目前的 SNN 无法击败 ANN。因此,出现了1个开放的问题,即:

如何评估 SNN 是有意义的?

Training spiking deep networks for neuromorphic hardware

这篇文章将预训练好的 ANN 转化成 SNN,在这个工作里面作者考虑到了 SNN 网络的 Efficiency,而不仅仅是 Accuracy。评价一个 SNN 时要从多个角度考量,比如:application accuracy,memory cost, compute cost 。

在以 ANN 主导的评价指标和任务中,相同大小的 SNN 无法打败 ANN。但是在以 SNN 主导的评价指标和任务中,SNN 的表现会更好。

2 脉冲神经网络原理

如下图1所示是ANN 和 SNN 的单个基本神经元。

图1:ANN 和 SNN 的基本神经元

(a) 图是典型的单个 ANN 神经元,ANN 的计算方法是:

y=ϕ(b+∑jxjwj)(1) y=\phi (b+\sum_j x_jw_j)\tag{1} y=ϕ(b+jxjwj)(1)

式中, ϕ(⋅)\phi(\cdot)ϕ() 是非线性的激活函数。

X0X_0X0 代表上个神经元过来的连续的激活值 (Pre-activation),通过突触 (Synapse) 传递到树突的位置 (Dendrite),并且最终由细胞体 (Soma) 来处理这个激活值 (具体处理方法就是1式)。

ANN 中的神经元使用高精度和连续值编码的激活值进行相互通信,并且只在空间域 (spatial domain,即 layer by layer) 传播信息。从上述方程可以看出,输入和权重的相乘和累加 (MAC) 是网络的主要操作。

**(b) 图是典型的单个 SNN 神经元,**它的结构与 ANN 神经元相似,但行为不同。脉冲神经元之间的交流通过 binary 的 events,而不是连续的激活值。

S0S_0S0 代表上个神经元过来的一个一个的脉冲 (Spike),通过突触 (Synapse) 传递到树突的位置 (Dendrite),并且最终由细胞体 (Soma) 来处理这些脉冲 (具体处理方法就是2式)。

这个式子看起来很麻烦,我们先来理解下每个变量的含义。

式中 ttt 代表时间步长, τ\tauτ 是常数, uuusss 代表膜电位和输出峰值。

ur1u_{r_1}ur1ur2u_{r_2}ur2 分别是静息电位和重置电位。

wjw_jwj 是第 jjj 个输入突触的权重。

tjkt_j^ktjk 是当第 jjj 个输入突触的第 kkk 个脉冲在 TwT_wTw 这个积分时间窗口内激发了 (即状态为1) 的时刻。

K(⋅)K(\cdot)K() 是代表延时效应的核函数。

TwT_wTw 是积分时间窗口。

uthu_{th}uth 是个阈值,代表要不要点火 (Fire) 一次。

接下来我们用人话解释一下2式是什么意思:

1 当膜电位 u(t)u(t)u(t) (也就是细胞体 Soma 这个隐含电位) 高于阈值 uthu_{th}uth 时,脉冲神经元看做一次点火,此时输出电位 s(t)s(t)s(t) 置为1,同时膜电位 u(t)u(t)

### SNN LeNet 的实现与比较 #### 1. Spike Neural Network (SNN) 基本概念 Spiking Neural Networks 是一种基于脉冲信号传递的神经网络模型,它模仿生物神经系统的工作机制。相比于传统的人工神经网络(ANN),SNN 使用离散的时间步长来模拟神经元之间的通信过程[^2]。这种特性使得 SNN 更加适合处理动态数据流低功耗应用。 在硬件实现方面,FPGA 平台被广泛用于加速 SNN 的运行效率[^3]。通过设计高效的编码方法尖峰生成策略,可以显著提升 SNN 在实际场景中的表现。 #### 2. LeNet 架构概述 LeNet 是由 Yann LeCun 提出的一种经典的卷积神经网络架构,主要用于图像分类任务。它的核心组成部分包括输入层、多个卷积层、池化层以及全连接层。通过对 MNIST 数据集的成功实验验证,LeNet 成为了现代 CNN 发展的重要基石之一[^4]。 #### 3. SNN 实现 LeNet 的可能性分析 将传统的 ANN 结构转换成对应的 SNN 形式是一个复杂的过程,涉及以下几个关键技术点: - **神经元状态更新规则** 需要定义如何利用膜电位变化规律替代原有的激活函数操作。例如,在某些研究中采用了指数权重依赖性的 STDP 学习规则来进行参数调整[^4]。 - **输入数据预处理** 对原始像素值进行适当变换以便适应 SNN 输入需求。这可能涉及到时间轴上的扩展或者频率域内的映射技术。 - **权重量化方案** 考虑到资源限制因素,在部署过程中往往需要对浮点数形式表示出来的权重系数实施固定精度近似处理[^5]。 以下是简化版 Python 示例代码展示了一个基本框架思路: ```python import numpy as np class SNNAxon: def __init__(self, delay=1): self.delay = delay def transmit(self, spike_train): delayed_spikes = np.roll(spike_train, shift=self.delay) return delayed_spikes[:len(spike_train)] def convert_ann_to_snn(ann_model): snn_layers = [] for layer in ann_model.layers: if isinstance(layer, ConvLayer): # Assuming custom class definitions exist. converted_layer = SpikingConvLayer( kernel_size=layer.kernel_size, stride=layer.stride, padding=layer.padding ) elif isinstance(layer, DenseLayer): converted_layer = SpikingDenseLayer(units=layer.units) snn_layers.append(converted_layer) return SequentialModel(layers=snn_layers) # Example usage with pseudo-LeNet structure conversion. pseudo_lenet = create_pseudo_lenet() # Placeholder function call. snn_version_of_lenet = convert_ann_to_snn(pseudo_lenet) ``` 上述片段仅作为理论指导用途,并未完全覆盖具体细节部分。 --- ###
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值