目录
一、STDP机制
1、STDP 的基本原理
权重调整的“时间差依赖性”
2、STDP 的数学模型
二、SNN的应用场景
三、从人工神经网络ANN到脉冲神经网络SNN
1、脉冲
2、稀疏性(Sparsity)
3、事件驱动处理(静态抑制)
四、脉冲神经元
1、简单神经元模型
2、LIF神经元推导
3、其他神经元模型
(1)IF神经元
(2)基于电流的模型CuBa
(3)递归神经元
(4)深度学习启发的尖峰神经元
下面这篇有关脉冲神经网络介绍的比较详细清晰,如果入门可以了解一下。
脉冲神经网络入门指南(一)Introduction【文献精读】_了解脉冲神经网络的学习规则-CSDN博客
作者写了一个脉冲神经网络入门指南系列,参考的文献是:
Eshraghian, Jason K., et al. "Training spiking neural networks using lessons from deep learning." Proceedings of the IEEE (2023).
文章中的框架如下:
- 在第2节中,解释使用脉冲的常见优势,并从基本原理推导出一个脉冲神经元模型。
- 在第3节中,通过探索各种脉冲编码策略赋予这些脉冲意义,研究它们如何影响学习过程,并讨论如何使用目标和正则化函数来调整SNN的脉冲模式。
- 在第4节中,将探讨使用基于梯度优化来训练SNNs的挑战,并推导出几种解决方案。这些解决方案包括在脉冲时间定义导数以及使用梯度的近似值。
- 在这样做的过程中,将揭示反向传播算法与脉冲时序依赖性可塑性(STDP)学习规则之间的细微联系,并在随后的部分中利用这一联系推导出朝着生物学上合理的学习机制迈进的在线反向传播变体(见图2)。
目标是将已经在广泛领域中证明其价值的人工神经网络(ANNs)与脉冲神经网络(SNNs)的潜在效率结合起来。这种结合有望在保留ANNs强大功能的同时,利用SNNs的高效能和低功耗特点,推动更加节能和高效的智能系统的开发。
一、STDP机制
脉冲时序依赖性可塑性(Spike-Timing-Dependent Plasticity, STDP)是脉冲神经网络(Spiking Neural Networks, SNN)中的一种重要学习规则,模拟了生物神经网络中突触连接强度的动态调整机制。STDP 是一种基于脉冲时序的突触可塑性,它通过调整神经元间突触的权重,来使网络逐渐形成合适的连接,从而在学习和记忆中发挥作用。
整的规则非常简单,关键在于两个神经元发出脉冲的时间差——即突触前神经元发出脉冲的时间和突触后神经元发出脉冲的时间的差。
1、STDP 的基本原理
在 STDP 中,突触权重的调整取决于前后神经元脉冲的时间差。具体来说,突触权重的变化通常遵循以下规律:
- 如果突触前神经元的脉冲(输入脉冲)在突触后神经元的脉冲(输出脉冲)之前到达,突触权重将 增加,称为 长时程增强(LTP)。
- 如果突触前神经元的脉冲在突触后神经元的脉冲之后到达,突触权重将 减小,称为 长时程抑制(LTD)。
简单理解就是:
-
若突触前脉冲比突触后脉冲早:
- 如果突触前神经元先发出脉冲,然后触发了突触后神经元的发火(即两者几乎同时发火),我们认为突触前神经元的信号对突触后神经元的发火有帮助。这时,STDP 会增加权重,让这一连接变得更强。
- 这叫做长时程增强(LTP)。
-
若突触前脉冲比突触后脉冲晚:
- 如果突触后神经元先发火,突触前神经元才发脉冲,这种连接被认为对突触后神经元的发火没有什么帮助,因此会减小权重,让这一连接变弱。
- 这叫做长时程抑制(LTD)。
突触权重的调整幅度通常是时间差的指数函数,时间差越小,突触权重的变化越显著。这一规律在一定程度上符合生物实验中的赫布学习规则,即“同步发火的神经元更倾向于加强彼此的连接”。
权重调整的“时间差依赖性”
- 时间差越小:意味着两个脉冲之间的时间间隔越短,即两者越“同步”。在这种情况下,权重的变化会更大(无论是增加还是减少),因为短时间内的相互作用被认为对突触连接的塑性影响更大。
- 时间差越大:突触前后的脉冲时间间隔越大时,权重变化的幅度会变小,调整力度逐渐减弱。因为时序关联性变弱,突触前脉冲对突触后发火的影响被认为较小。
2、STDP 的数学模型
在数学上,STDP 的权重更新可以表示为:
- 若 Δt = tpost−tpre>0,则权重增加,Δw=A+exp(−Δt/τ+)
- 若 Δt = tpost−tpre<0,则权重减少,Δw=−A−exp(Δt/τ−)
其中:
- A+和 A−是学习率参数,控制权重增加和减少的幅度。
- τ+和 τ−是时间常数,分别控制权重增强和抑制的时间尺度。
这种 基于时间的调节机制 使得神经网络能够根据输入脉冲的时序信息进行学习和适应,这与生物神经系统中的学习和记忆过程非常相似。
二、SNN的应用场景
SNNs 不使用浮点值,而是使用单比特
、二进制激活
(脉冲),在时间上编码信息,而不是强度(intensity)。因此,SNNs 利用低精度参数和高时空稀疏性。
脉冲算法已被用于在医疗、机器人技术、混合现实等领域实现低功耗人工智能算法,还有许多其他领域也在使用。
脉冲神经网络(SNN)模型还用于 机器人技术 ,以使其更类似于人类,并降低操作成本。 无人机 也必须在低功耗环境下运行,以最大限度地利用轻量电池的价值,并从使用神经拟态处理器中受益。 音频信号 可以在神经形态硬件上以亚毫瓦(sub-mW)的功耗和低延迟进行处理,因为脉冲神经网络(SNNs)为时间信号处理提供了一种高效的计算机制。
三、从人工神经网络ANN到脉冲神经网络SNN
1、脉冲
- 脉冲(Spikes):生物神经元通过脉冲进行相互作用。
生物神经元之间的通信方式是通过电脉冲(spikes)进行相互作用,这些脉冲是幅度约为100毫伏的电脉冲。
在大多数情况下,神经元的动作电位的变化比膜电位的变化更为重要,因为动作电位的变化直接关联着神经元的激活状态和信息传递。
图3:神经元通过脉冲进行通信
(a)神经元示意图;
(b)测量沿神经元轴突传播的动作电位。波动的亚阈(subthreshold)电压存在于细胞体(soma,体细胞)中,但在超过1毫米的距离后会严重衰减;
(c)神经元的脉冲用二进制表示;
(d)事件驱动处理。只有动态场景的部分被传递到输出(“1”),而静态区域被抑制(“0”)。
(e)主动像素传感器和动态视觉传感器;
许多神经元的计算模型将脉冲的表示简化为一个离散的、单比特的、要么发生要么不发生的事件。
将高精度激活与高精度权重相乘需要将其转换为整数,将乘法分解为多个加法,这引入了进位(introduce)传播延迟。
另一方面,基于脉冲的方法 只需要将权重与脉冲(“1”)相乘 。这用一个简单的内存读取权重值来代替了繁琐的乘法过程。
虽然从上述可看,激活是被限制为单个比特,但是二值化神经网络和脉冲神经网络有很大不同,是因为脉冲的时序(timing)。时间不是二值化的量,可以使用已经在数字电路中实现的时钟信号来实现。
2、稀疏性(Sparsity)
在生物神经元网络中,大多数神经元在大多数时间内处于非激活状态,即不发放电脉冲。这意味着在任何给定的时刻,网络中的大多数神经元都不会发放电脉冲,只有少数神经元会根据输入信号发放电脉冲。
这种特性使得神经网络在处理信息时更加高效,因为网络中的连接和通信主要发生在活跃的神经元之间,从而减少了整体的计算和通信成本。
如果按照存储矩阵的简单数据结构,使用的存储空间随着要存储的条目数增加。如果使用存储稀疏矩阵的数据结构仅消耗非零元素的内存。
由于大多数条目为零,我们可以通过仅写出非零元素来节省时间,就像在游程(run-length)编码中一样(从零开始索引):
游程编码(Run-Length Encoding, RLE)是一种数据压缩技术,它通过将数据序列中的重复模式转换为更紧凑的表示形式来减少数据的存储需求。这种方法的核心思想是识别并利用数据中的重复性,用一个较短的编码来代替连续的重复数值序列。在神经网络中,游程编码特别适用于稀疏矩阵,即矩阵中大部分元素为零的情况。通过游程编码,我们可以用更少的存储空间来表示数据,因为只记录非零元素及其在矩阵中的位置,而不需要存储所有的零元素。这种方法在处理大规模稀疏数据时非常有效,因为它显著减少了数据的存储空间需求。
其他可应用在SNN的数据压缩技术:
时间编码(Time Encoding):时间编码技术通过记录神经元发放脉冲的时间戳来编码数据。这种方法可以捕获神经元活动的时序信息,对于处理时序敏感的任务非常有用。
3、事件驱动处理(静态抑制)
静态抑制(又称为事件驱动处理)Static Suppression (a.k.a., event-driven processing):是指系统对变化的响应比对静态输入更加敏感。感觉周边(periphery)特征涉及几种机制,这些机制促进神经元对动态、变化的刺激同时抑制其对静态、不变的信息的反应。在视网膜神经节和初级视觉层中,神经元的时空感受对空间对比区域(边缘)的兴奋反应,而不是对空间不变区域的反应。早期听觉处理中的类似机制包括频谱时间感受(spectro-temporal receptive fields),这些感受导致神经元对声音中变化的频率产生更有利的反应,而不是对静态频率的反应。
简单来说:静态抑制(Static Suppression)是一种感觉系统,它对变化的响应比对静态输入更加敏感。
神经元对持续刺激的反应随时间减弱。在较短的时间尺度(毫秒级),神经元对快速变化的刺激有强烈的反应,但随着刺激的持续,神经元的反应会逐渐减弱,这被称为适应或感知适应。这种适应性在较长的时间尺度(秒级)上观察到,神经元对持续的固定刺激的反应减弱。
动态视觉传感器(Dynamic Vision Sensor, DVS)或称为硅视网膜,是一种特殊类型的摄像头,它能够检测亮度的变化。如果亮度发生变化,DVS会报告亮度变化,否则,如果亮度没有变化,DVS保持静默,不发送信号。这种传感器能够捕捉快速变化的亮度,适用于需要快速响应的应用场景。在图3(d-e)中,DVS的行为被描述为在没有亮度变化时保持静默,这与神经元对持续刺激的适应性相对应,即神经元对持续的固定刺激反应减弱的特性相似。
这也意味着每个像素独立于所有其他像素激活,而不是等待全局快门产生静止帧。与传统的CMOS图像传感器相比,活跃像素的减少导致了巨大的能源节约。这种低功率和异步像素的混合使得摄像头具有快速的时钟速度,使得商用的DVS摄像头拥有微秒级的时间分辨率,而无需费力。传统基于帧的摄像头和基于事件的摄像头之间的区别如图4所示。
上方是基于帧的摄像头,下方是基于事件的摄像头/硅视网膜。
- 前者以固定帧率记录场景作为图像序列。它独立于场景中的活动运行,可能会因为全局快门而导致运动模糊。
- 硅视网膜的输出直接受到场景中视觉活动的驱动,因为每个像素对照明变化作出反应。
四、脉冲神经元
人工神经网络(ANN)和脉冲神经网络(SNN)可以模拟相同类型的网络拓扑结构,但 SNN用脉冲神经元模型代替了人工神经元模型。
1、简单神经元模型
图5:泄漏积分-触发(Leaky Integrate-and-Fire,LIF)神经元模型。(a)一个绝缘的双层脂质膜将细胞内和细胞外介质分开。带门控的离子通道允许Na+等载流子通过膜扩散。(b)电容性膜和电阻性离子通道形成一个RC电路。当膜电位超过阈值θ θθ时,会产生一个脉冲。(c)由I i n 产生的输入脉冲通过树突传递到神经元体。足够的兴奋会在输出处引发脉冲发射。(d)模拟描绘了膜电位U(t)达到阈值,任意设定为θ=0.5V,产生输出脉冲。
就像人工神经元模型一样,脉冲神经元也是通过输入的加权和来运行。与将结果通过sigmoid或ReLU非线性传递不同,加权和对神经元的 膜电位U ( t ) 有贡献。如果神经元受到加权和的足够兴奋,并且膜电位达到阈值θ,那么神经元将向其后续连接发出脉冲。但大多数神经元的输入是 非常短暂 的电活动脉冲。所有输入脉冲同时到达神经元体的可能性非常小(图5c)。这表明存在一种时间动力学(temporal dynamics),可以随时间“维持”膜电位。
2、LIF神经元推导
脉冲神经网络入门指南(五):LIF 神经元的数学推导与模拟【原理与可视化】_lif神经元电路-CSDN博客
搭配着下图看,LIF神经元的推理过程。
其中模拟LIF神经元行为部分,实现一个LIF神经元的完整行为模拟,并通过图像展示其脉冲发射情况。神经元微分求解过程可以跟着推导,写的确实不错。
最后在“8.模拟LIF神经元行为”部分,代码可能存在以下问题。
(1)运行时,代码片段中需要引入np包,否则会报错:
Traceback (most recent call last):
File "LIF.py", line 2, in <module>
timesteps = np.linspace(0, 100, 1000) # Time in ms
NameError: name 'np' is not defined
在文件头部加入:
import numpy as np
import matplotlib.pyplot as plt
(2)因为是在服务器上运行的,会提示没有可视化界面,错误代码行定位:
plt.show()
错误提示:
python3 LIF.py
Unable to init server: Could not connect: Connection refused
Unable to init server: Could not connect: Connection refused
(LIF.py:1819509): Gdk-CRITICAL **: 11:11:23.021: gdk_cursor_new_for_display: assertion 'GDK_IS_DISPLAY (display)' failed
此时表示将图片保存在同目录中。
完整的程序代码如下:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
matplotlib.use('Agg')
# Parameters for LIF neuron
timesteps = np.linspace(0, 100, 1000) # Time in ms
tau_m = 20.0 # Membrane time constant in ms
V_th = 1.0 # Threshold voltage
V_reset = 0.0 # Reset voltage after spike
R_m = 1.0 # Membrane resistance
I_input = np.zeros_like(timesteps)
I_input[200:800] = 1.2 # A step current input applied between 200ms and 800ms
# Initialize membrane potential and spikes
V_mem = np.zeros_like(timesteps)
spikes = np.zeros_like(timesteps)
# Simulate membrane potential for LIF neuron
for t in range(1, len(timesteps)):
dV = (-V_mem[t-1] + R_m * I_input[t]) / tau_m
V_mem[t] = V_mem[t-1] + dV
# Check for spike and reset membrane potential
if V_mem[t] >= V_th:
V_mem[t] = V_reset # Reset potential
spikes[t] = 1 # Spike occurs
# Plot the results
plt.figure(figsize=(10, 8))
# Plot membrane potential
plt.subplot(3, 1, 1)
plt.plot(timesteps, V_mem, label="Membrane potential $V(t)$")
plt.axhline(y=V_th, color='red', linestyle='--', label="$V_{th}$ (Threshold)")
plt.title("Membrane Potential of a Leaky Integrate-and-Fire Neuron")
plt.ylabel("Membrane potential (V)")
plt.legend()
plt.grid(True)
# Plot spikes
plt.subplot(3, 1, 2)
plt.plot(timesteps, spikes, label="Spikes", color='purple')
plt.title("Spike Train")
plt.ylabel("Spike")
plt.grid(True)
# Plot input current
plt.subplot(3, 1, 3)
plt.plot(timesteps, I_input, color='orange', label="Input current")
plt.title("Input Current to the Neuron")
plt.ylabel("Input current (I)")
plt.xlabel("Time (ms)")
plt.legend()
plt.grid(True)
plt.tight_layout()
plt.savefig("LIF_neuron_simulation.png")
运行效果图:
三个图片共同展示了LIF神经元的典型脉冲发射过程。
最上图是膜电位变化:在施加输入电流时,神经元膜电位逐渐积累。当膜电位达到设定的阈值(图中的红色虚线)时,神经元发射一个脉冲,随后膜电位立即重置为 0。在重置后,神经元再次开始积累膜电位,直到下一次发射脉冲。
中图是脉冲序列:每当膜电位超过阈值时,图中会显示一个脉冲。可以看到,在输入电流持续时间内,脉冲发射保持稳定。
最下图是输入电流:模拟过程中,输入电流在200ms到800ms之间保持恒定。这一段恒定的输入驱动了神经元膜电位的变化,使其不断发射脉冲。
3、其他神经元模型
(1)IF神经元
是在LIF的基础上,去掉了泄露机制,即下图中的β=1。
(2)基于电流的模型CuBa
LIF神经元忽略了生物神经元中突触后电流的缓慢变化。这种变化会影响膜电位的时间动态特性,使其不会像LIF神经元那样立即跃迁,而是经历一个缓慢的上升过程。
为了弥补这一不足,CuBa模型通过将突触后电流的动态特性纳入考虑,改进了传统LIF神经元的行为,使其对输入信号有更平滑的响应。
模型的核心特点
-
二阶低通滤波器行为:
- 如果LIF神经元是一阶低通滤波器,CuBa神经元通过增加一个额外的动力学过程,成为二阶低通滤波器。
- 输入尖峰信号的影响被“平滑”两次:一次是突触电流的动态过程,另一次是膜电位的变化。
-
有限的上升时间:
- CuBa神经元的膜电位不会对传入的尖峰信号立即作出跳跃响应,而是经过一个有限的时间上升到峰值。
- 这一特性更接近生物神经元的实际行为。
-
突触后电流的时间常数:
- 突触电流的动态变化被建模为一个指数衰减过程,其时间常数决定了输入信号的平滑程度。
- 通过调节时间常数,可以模拟不同类型突触的传导特性。
(3)递归神经元
神经元的输出尖峰被路由回输入,如图6(a)所示,明确标记为递归。而不是替代模型,递归是一种可以应用于任何神经元的拓扑结构,可以以不同方式实现:一对一递归,每个神经元将其尖峰路由到自身,或者全对全递归,其中一层的输出尖峰被加权并求和(例如,通过密集或卷积层)加权,然后反馈到全层[81]。
(4)深度学习启发的尖峰神经元
深度学习启发的尖峰神经元(Spiking Neurons Inspired by Deep Learning)是近年来尖峰神经网络(SNNs)研究的一个重要方向。这类神经元模型不仅基于神经科学的生物特性,还从深度学习中的机制和架构中汲取灵感,用以克服传统尖峰神经网络在时间动态建模和长期依赖性方面的限制。通过整合深度学习中的递归、记忆单元和注意力机制,这些模型显著增强了尖峰神经网络的表达能力和实际应用场景。
① 深度学习启发的尖峰神经元的意义
-
传统SNN的局限性:
- 尖峰神经元传统上受生物神经科学启发,主要关注短期记忆(short-term memory)和生物可解释性。
- 但在处理长期依赖性(long-term dependency)数据时,传统尖峰模型的表现有限。
-
深度学习的启发:
- 深度学习中发展出的LSTM(长短期记忆网络)、GRU(门控循环单元)、变换器(Transformer)等架构已经证明了其在捕捉长期依赖关系方面的强大能力。
- 将这些架构的关键思想整合到尖峰神经网络中,可以显著增强SNN在时间序列、自然语言处理和其他复杂任务中的性能。
后面还有编码方式和反向传播方式训练SNN还没看完,等明天看完再更新。