入门介绍(一):脉冲神经网络(SNN)
入门介绍(一):脉冲神经网络(SNN)
背景
脉冲神经网络(SNN)模拟了生物神经元的发放脉冲过程。1907年,科学家Louis Lapicque发现了神经元不仅传递电信号,还能存储电荷,并通过电容器与电阻的组合来模拟神经元膜的电性质。这与RC电路(电阻-电容电路)的行为类似:电容器存储电荷,电阻控制电荷流动。
在神经元中,当输入电流刺激时,膜电位(即神经元内外的电压差)会逐渐变化。当电流停止,电位又逐渐恢复。这种电位变化遵循一阶微分方程:
τ d V m e m ( t ) d t = − V m e m ( t ) + I ( t ) R \tau\frac{dV_\mathrm{mem}(t)}{dt}=-V_\mathrm{mem}(t)+I(t)R τdtdVmem(t)=−Vmem(t)+I(t)R
其中,τ 是神经元的时间常数,R 是电阻,C 是电容,I(t) 是输入电流。
基本工作原理
SNN的工作机制可以概括为四个步骤:
- 积分:神经元接收来自其他神经元的输入,导致膜电位上升。
- 漏电:由于电流的自然流失,膜电位会逐渐下降,模拟了生物神经元的电泄漏现象。
- 脉冲发射:当膜电位达到某个阈值时,神经元会发射一个脉冲。
- 重置:发射脉冲后,膜电位会重置为初始值,这模拟了神经元的“复位”过程。
这些步骤可以用简单的Python代码模拟,代码使用了LIF(Leaky Integrate-and-Fire)神经元模型。这个模型可以通过公式计算神经元的膜电位变化,以及在不同输入下,如何控制脉冲发射。
实现脉冲神经网络
我们以一个简单的LIF神经元为例,通过模拟其膜电位变化,来看在不同刺激下神经元如何反应。下面是计算LIF神经元膜电位的Python代码:
def LIF(Vmem_o, I, R=1e+5, C=5e-7, dt=0.01):tau = R * CVmem = Vmem_o + (dt / tau) * (-Vmem_o + I * R)return Vmem
- Vmem_o 是初始的膜电位,
- I 是输入电流,
- R 是电阻,
- C 是电容,
- dt 是时间步长。
接下来,我们可以通过不同的条件来运行这个模型,例如,假设没有输入电流时,膜电位会如何变化,或者在有输入刺激时膜电位如何变化。
前向传播和脉冲发射
在脉冲神经网络中,数据以时间序列的脉冲形式输入。每个脉冲通过输入层传递给网络中的神经元,神经元通过其阈值机制决定是否发射脉冲。不同于传统神经网络,SNN处理的是脉冲时序而不是连续的数值信号。
例如,通过速率编码,我们可以根据输入信号的强度调整脉冲发射的频率。较高的信号强度对应于更高的脉冲频率,这与生物神经元的活动相似。
学习机制:反向传播和STDP
与传统神经网络不同,脉冲神经网络中的学习规则主要依赖于时序。一种常用的规则是脉冲时间依赖可塑性(STDP),它根据脉冲的先后顺序调整神经元之间的连接权重。
另一种方法是代理梯度(Surrogate Gradient),它将神经元的脉冲发射行为近似为一个可导的函数,利用梯度下降法进行权重更新。这种方法类似于传统神经网络中的反向传播(Backpropagation),但是需要考虑时间维度的数据处理方式。
小结
SNN通过模拟生物神经元的脉冲发射行为来处理信息,具有极大的时间序列处理潜力。通过简单的LIF模型,我们可以理解其基本工作原理,包括膜电位的变化和脉冲发射机制。在未来,SNN有望在低功耗、实时处理等领域中发挥巨大作用。