大家好,欢迎来到IT知识分享网。
脉冲神经网络入门指南(五):LIF 神经元的数学推导与模拟【原理与可视化】
系列博客:
脉冲神经网络入门指南(一)Introduction【文献精读】_了解脉冲神经网络的学习规则-CSDN博客
脉冲神经网络入门指南(二)From Artificial to Spiking Neural Networks-什么是LIF神经元【文献精读】-CSDN博客
脉冲神经网络入门指南(三)The Neural Code-编码方式【文献精读】_脉冲神经网络编码-CSDN博客
脉冲神经网络入门指南(四)Training Spiking Neural Networks-反向传播方式【文献精读】-CSDN博客
1. 背景概述
泄漏积分-触发(Leaky Integrate-and-Fire,LIF)神经元模型是一种用来模拟生物神经元电活动的简单模型。该模型将神经元视为一个带有电阻
和电容
的 RC电路 ,描述了神经元膜电位随时间的变化。当膜电位超过某个阈值时,神经元会发出一个脉冲。
什么是 RC 电路?
RC 电路是由电阻 (Resistor, R) 和电容 (Capacitor, C) 组成的简单电路。这两种元件各自具有特定的电学特性:
- 电阻 R:电阻限制电流流过电路的速度。根据欧姆定律,电阻上的电压降 V R V_R VR 与流过电阻的电流 I I I 之间的关系是 V R = I R V_R = IR VR=IR。
- 电容 C:电容存储电荷并在电路中储存和释放电能。电容两端的电压 V C V_C VC 与储存在电容中的电荷 Q Q Q 之间的关系是 V C = Q C V_C = \frac{Q}{C} VC=CQ。电容中的电流 I I I 是电压随时间变化的速率,即 I = C d V C d t I = C \frac{dV_C}{dt} I=CdtdVC。
脉冲神经元为什么可以类比为带有电阻和电容的低通滤波电路?
脉冲神经元的膜电位动态特性与 RC 电路的电压动态特性非常相似。以下几点解释了这种类比:
- 电容性膜:神经元膜的电容特性类似于LIF神经元中的积分过程。神经元膜由脂质双层组成,能存储电荷,类似于电路中的
电容
。当突触输入引起的离子流动产生电流时,膜电位逐渐积累,就像电容器在电流作用下逐渐充电。 - 离子通道:神经元膜上的离子通道充当电阻,控制电离子的流动,类似于LIF神经元中的泄漏过程。这些通道允许离子通过,产生
电阻效应
,使得电流缓慢流出,逐渐降低膜电位,类似于电阻在RC电路中放电的过程。 - 电位变化:神经元膜电位的变化过程可以类比于RC电路中的电压变化。当膜电位达到某个阈值时,神经元发放
脉冲(fire)
,然后膜电位迅速重置。这类似于RC电路中电容器电压达到一定值后放电的过程。
具体来说,RC 电路作为低通滤波器,能 平滑输入 信号的快速变化,输出一个相对平滑的电压信号。类似地,神经元膜电位在接收到突触输入的快速变化后,通过电容和电阻的共同作用,逐渐变化并趋向于一个稳态值
。这种缓慢的变化过程模拟了神经元膜电位的 时间动力学特性 。
因此,将脉冲神经元类比为带有电阻和电容的低通滤波电路,能够合理地解释LIF神经元膜电位的 积分(积累电荷)、泄漏(电阻放电) 和 发放脉冲(达到阈值后的放电) 过程。这种类比帮助我们更直观地理解神经元膜电位随时间的变化以及脉冲发放机制。
2. 模型基础
LIF 神经元模型基于以下几个关键假设:
- 膜电位 U ( t ) U(t) U(t):代表神经元膜两侧的电压差。
- 输入电流 I i n ( t ) I_{in}(t) Iin(t):通过神经元膜的电流。
- 膜电阻 R R R 和膜电容 C C C:神经元膜的电特性。
3. 微分方程推导
在一个简单的 RC 电路中,电阻和电容串联
连接在电源上。通过该电路的电流会导致电容上的电压随时间变化。对于 RC 电路,应用 基尔霍夫电压定律 (Kirchhoff’s Voltage Law, KVL) ,可以得到如下的微分方程:
τ d U ( t ) d t = − U ( t ) + I i n ( t ) R \tau \frac{dU(t)}{dt} = -U(t) + I_{in}(t)R τdtdU(t)=−U(t)+Iin(t)R
其中, τ = R C \tau = RC τ=RC 是电路的时间常数。
基尔霍夫电压定律 (Kirchhoff’s Voltage Law, KVL)
基尔霍夫电压定律 (Kirchhoff’s Voltage Law, KVL) 是电路分析中的一条基本定律。它指出,在任何一个封闭回路中,各元件的电压之和等于零。换句话说,在一个闭合电路中,电源提供的电压与各个元件上的电压降之和相等。具体表述如下:
∑ k = 1 n V k = 0 \sum_{k=1}^{n} V_k = 0 k=1∑nVk=0
其中, V k V_k Vk 是第 k k k 个元件的电压降或电压升。
在 RC 电路中的应用
在一个简单的串联 RC 电路中,电阻 ® 和电容 © 连接在一个电源电压 V i n ( t ) V_{in}(t) Vin(t) 上。应用基尔霍夫电压定律于该电路,可以得到:
V i n ( t ) = V R ( t ) + V C ( t ) V_{in}(t) = V_R(t) + V_C(t) Vin(t)=VR(t)+VC(t)
其中:
- V i n ( t ) V_{in}(t) Vin(t) 是电源提供的电压。
- V R ( t ) V_R(t) VR(t) 是电阻上的电压降。
- V C ( t ) V_C(t) VC(t) 是电容上的电压降。
具体推导
为了更详细地理解 RC 电路中的电压变化,我们需要考虑电阻和电容的电学特性:
- 电阻上的电压降:根据欧姆定律,电阻上的电压降 V R ( t ) V_R(t) VR(t) 与流过电阻的电流 I ( t ) I(t) I(t) 之间的关系是:
V R ( t ) = I ( t ) R V_R(t) = I(t) R VR(t)=I(t)R
- 电容上的电压降:电容上的电压降 V C ( t ) V_C(t) VC(t) 与电容所储存的电荷 Q ( t ) Q(t) Q(t) 之间的关系是:
V C ( t ) = Q ( t ) C V_C(t) = \frac{Q(t)}{C} VC(t)=CQ(t)
电容 (Capacitance, ( C )) 是描述电容器储存电荷能力的物理量,定义为:
C = Q V C = \frac{Q}{V} C=VQ
其中:
- ( C ) 是电容,单位是法拉 (Farad, F)。
- ( Q ) 是储存在电容器上的电荷,单位是库仑 (Coulomb, C)。
- ( V ) 是电容器两端的电压,单位是伏特 (Volt, V)。
电容上的电流 I ( t ) I(t) I(t) 与电压变化率 d V C ( t ) d t \frac{dV_C(t)}{dt} dtdVC(t) 之间的关系是:
I ( t ) = C d V C ( t ) d t I(t) = C \frac{dV_C(t)}{dt} I(t)=CdtdVC(t)
电容中的电流 I ( t ) I(t) I(t) 与电荷的变化率相关:
I ( t ) = d Q ( t ) d t I(t) = \frac{dQ(t)}{dt} I(t)=dtdQ(t)
将以上两点结合起来,应用基尔霍夫电压定律于 RC 电路:
V i n ( t ) = V R ( t ) + V C ( t ) V_{in}(t) = V_R(t) + V_C(t) Vin(t)=VR(t)+VC(t)
代入 V R ( t ) V_R(t) VR(t) 和 V C ( t ) V_C(t) VC(t) 的表达式:
V i n ( t ) = I ( t ) R + Q ( t ) C V_{in}(t) = I(t) R + \frac{Q(t)}{C} Vin(t)=I(t)R+CQ(t)
因为我们最终希望得到的是电压关于时间的一个微分方程,所以需要通过电流和电容的定义来化简。
由于 I ( t ) = d Q ( t ) d t I(t) = \frac{dQ(t)}{dt} I(t)=dtdQ(t),我们可以将上式改写为:
V i n ( t ) = R d Q ( t ) d t + Q ( t ) C V_{in}(t) = R \frac{dQ(t)}{dt} + \frac{Q(t)}{C} Vin(t)=RdtdQ(t)+CQ(t)
形式上的一致性
步骤 1:重新定义变量
在这个步骤中,我们将电荷 Q ( t ) Q(t) Q(t) 转换为电容电压 U ( t ) U(t) U(t) 。我们知道电容上的电压 U ( t ) U(t) U(t) 和电荷 Q ( t ) Q(t) Q(t) 之间的关系是:
U ( t ) = Q ( t ) C U(t) = \frac{Q(t)}{C} U(t)=CQ(t)
因此,电荷 Q ( t ) Q(t) Q(t) 可以表示为:
Q ( t ) = C U ( t ) Q(t) = C U(t) Q(t)=CU(t)
步骤 2:代入电压表达式
我们把上一步得到的电荷表达式代入原始方程:
V i n ( t ) = R d Q ( t ) d t + Q ( t ) C V_{in}(t) = R \frac{dQ(t)}{dt} + \frac{Q(t)}{C} Vin(t)=RdtdQ(t)+CQ(t)
代入 Q ( t ) = C U ( t ) Q(t) = C U(t) Q(t)=CU(t) :
V i n ( t ) = R d d t ( C U ( t ) ) + C U ( t ) C V_{in}(t) = R \frac{d}{dt} (C U(t)) + \frac{C U(t)}{C} Vin(t)=Rdtd(CU(t))+CCU(t)
步骤 3:求导和简化
进行求导并简化:
V i n ( t ) = R C d U ( t ) d t + U ( t ) V_{in}(t) = R C \frac{dU(t)}{dt} + U(t) Vin(t)=RCdtdU(t)+U(t)
由于 τ = R C \tau = RC τ=RC ,因此上式可以写成:
V i n ( t ) = τ d U ( t ) d t + U ( t ) V_{in}(t) = \tau \frac{dU(t)}{dt} + U(t) Vin(t)=τdtdU(t)+U(t)
步骤 4:重新定义输入电压
为了与神经元模型保持一致,我们假设电源电压 V i n ( t ) V_{in}(t) Vin(t) 是电流 I i n ( t ) I_{in}(t) Iin(t) 乘以电阻 R R R ,即:
V i n ( t ) = I i n ( t ) R V_{in}(t) = I_{in}(t) R Vin(t)=Iin(t)R
步骤 5:代入输入电压表达式
将上述表达式代入之前的方程:
I i n ( t ) R = τ d U ( t ) d t + U ( t ) I_{in}(t) R = \tau \frac{dU(t)}{dt} + U(t) Iin(t)R=τdtdU(t)+U(t)
步骤 6:整理方程形式
为了得到标准形式,我们把 U ( t ) U(t) U(t) 移到等式的右边:
τ d U ( t ) d t = I i n ( t ) R − U ( t ) \tau \frac{dU(t)}{dt} = I_{in}(t) R – U(t) τdtdU(t)=Iin(t)R−U(t)
为了和标准形式一致,我们可以写成:
τ d U ( t ) d t = − U ( t ) + I i n ( t ) R \tau \frac{dU(t)}{dt} = -U(t) + I_{in}(t)R τdtdU(t)=−U(t)+Iin(t)R
这样就得到了最终的形式:
τ d U ( t ) d t = − U ( t ) + I i n ( t ) R \tau \frac{dU(t)}{dt} = -U(t) + I_{in}(t)R τdtdU(t)=−U(t)+Iin(t)R
其中, τ = R C \tau = RC τ=RC 是时间常数, U ( t ) = V C ( t ) U(t) = V_C(t) U(t)=VC(t) 是电容上的电压。这表明 RC 电路的电压变化可以用一个一阶微分方程来描述,与脉冲神经元模型中的膜电位变化方程形式一致。
4. 恒定电流输入时的解
微分方程
首先,我们从 LIF 神经元模型的微分方程开始:
τ d U ( t ) d t = − U ( t ) + I i n R \tau \frac{dU(t)}{dt} = -U(t) + I_{in}R τdtdU(t)=−U(t)+IinR
这里:
- τ = R C \tau = RC τ=RC 是时间常数。
- U ( t ) U(t) U(t) 是膜电位。
- I i n I_{in} Iin 是恒定的输入电流。
- R R R 是电阻。
目标
我们需要求解 U ( t ) U(t) U(t) 随时间 t t t 的变化。首先,将微分方程改写为标准形式
:
d U ( t ) d t = − U ( t ) τ + I i n R τ \frac{dU(t)}{dt} = -\frac{U(t)}{\tau} + \frac{I_{in}R}{\tau} dtdU(t)=−τU(t)+τIinR
分离变量
将变量 U ( t ) U(t) U(t) 和 t t t 分离,我们得到:
d U ( t ) − U ( t ) + I i n R = d t τ \frac{dU(t)}{-U(t) + I_{in}R} = \frac{dt}{\tau} −U(t)+IinRdU(t)=τdt
积分
对两边进行积分:
∫ 1 − U ( t ) + I i n R d U ( t ) = ∫ 1 τ d t \int \frac{1}{-U(t) + I_{in}R} \, dU(t) = \int \frac{1}{\tau} \, dt ∫−U(t)+IinR1dU(t)=∫τ1dt
计算积分
左边的积分可以通过 换元法 求解。令:
v = − U ( t ) + I i n R ⇒ d v = − d U ( t ) ⇒ − d v = d U ( t ) v = -U(t) + I_{in}R \quad \Rightarrow \quad dv = -dU(t) \quad \Rightarrow \quad -dv = dU(t) v=−U(t)+IinR⇒dv=−dU(t)⇒−dv=dU(t)
因此,左边的积分变为:
∫ 1 v ( − d v ) = − ∫ 1 v d v = − ln ∣ v ∣ = − ln ∣ − U ( t ) + I i n R ∣ \int \frac{1}{v} (-dv) = -\int \frac{1}{v} \, dv = -\ln|v| = -\ln|-U(t) + I_{in}R| ∫v1(−dv)=−∫v1dv=−ln∣v∣=−ln∣−U(t)+IinR∣
右侧积分是一个简单的常数积分。常数积分的基本形式是:
∫ a d x = a x + C \int a \, dx = ax + C ∫adx=ax+C
其中 ( a ) 是一个常数, ( x ) 是积分变量, ( C ) 是积分常数。
在我们的积分中,常数是 1 τ \frac{1}{\tau} τ1 ,积分变量是 t t t 。所以可以写成:
∫ 1 τ d t \int \frac{1}{\tau} \, dt ∫τ1dt
应用常数积分公式:
∫ 1 τ d t = 1 τ ⋅ t + C \int \frac{1}{\tau} \, dt = \frac{1}{\tau} \cdot t + C ∫τ1dt=τ1⋅t+C
其中 1 τ \frac{1}{\tau} τ1 是常数,积分变量 t t t 积分后就是 t t t ,并加上积分常数 C C C 。
因此,右边的积分结果是:
∫ 1 τ d t = t τ + C \int \frac{1}{\tau} \, dt = \frac{t}{\tau} + C ∫τ1dt=τt+C
这是因为我们在积分时,将常数 1 τ \frac{1}{\tau} τ1 提出来,然后对 t t t 进行积分,积分结果就是 t t t ,最后加上积分常数 C C C 。
合并结果
将左边和右边的积分结果合并:
− ln ∣ − U ( t ) + I i n R ∣ = t τ + C -\ln|-U(t) + I_{in}R| = \frac{t}{\tau} + C −ln∣−U(t)+IinR∣=τt+C
为了简化,我们取对数两边的负号:
ln ∣ − U ( t ) + I i n R ∣ = − t τ − C \ln|-U(t) + I_{in}R| = -\frac{t}{\tau} – C ln∣−U(t)+IinR∣=−τt−C
将 − C -C −C 简化为常数 C ′ C’ C′ :
ln ∣ − U ( t ) + I i n R ∣ = − t τ + C ′ \ln|-U(t) + I_{in}R| = -\frac{t}{\tau} + C’ ln∣−U(t)+IinR∣=−τt+C′
对两边取指数
:
∣ − U ( t ) + I i n R ∣ = e C ′ e − t τ |-U(t) + I_{in}R| = e^{C’} e^{-\frac{t}{\tau}} ∣−U(t)+IinR∣=eC′e−τt
设 e C ′ = K e^{C’} = K eC′=K ,我们得到:
− U ( t ) + I i n R = ± K e − t τ -U(t) + I_{in}R = \pm K e^{-\frac{t}{\tau}} −U(t)+IinR=±Ke−τt
因为我们在这个问题中关注的是 t t t 从零开始的解,所以我们可以选择一个特定的初始条件 U ( 0 ) = U 0 U(0) = U_0 U(0)=U0 来确定 K K K 。因此:
− U ( t ) + I i n R = K e − t τ -U(t) + I_{in}R = K e^{-\frac{t}{\tau}} −U(t)+IinR=Ke−τt
确定常数 K K K
在 t = 0 t = 0 t=0 时,膜电位 U ( 0 ) = U 0 U(0) = U_0 U(0)=U0 :
− U 0 + I i n R = K ⇒ K = I i n R − U 0 -U_0 + I_{in}R = K \quad \Rightarrow \quad K = I_{in}R – U_0 −U0+IinR=K⇒K=IinR−U0
因此,微分方程的解为:
− U ( t ) + I i n R = ( I i n R − U 0 ) e − t τ -U(t) + I_{in}R = (I_{in}R – U_0) e^{-\frac{t}{\tau}} −U(t)+IinR=(IinR−U0)e−τt
最终解
将 U ( t ) U(t) U(t) 表达出来:
U ( t ) = I i n R − ( I i n R − U 0 ) e − t τ U(t) = I_{in}R – (I_{in}R – U_0) e^{-\frac{t}{\tau}} U(t)=IinR−(IinR−U0)e−τt
这就是恒定电流输入 I i n ( t ) = I i n I_{in}(t) = I_{in} Iin(t)=Iin 时的解,描述了膜电位 U ( t ) U(t) U(t) 随时间 t t t 的变化。
解释
- 初始膜电位:在 t = 0 t = 0 t=0 时,膜电位 U ( t ) = U 0 U(t) = U_0 U(t)=U0 。
- 稳态值:随着时间 t t t 的推移,膜电位 U ( t ) U(t) U(t) 逐渐接近稳态值 I i n R I_{in}R IinR 。
- 指数松弛:膜电位 U ( t ) U(t) U(t) 以指数方式松弛到稳态值,松弛的速率由时间常数 τ \tau τ 决定。
这表明,对于恒定的输入电流,膜电位 U ( t ) U(t) U(t) 逐渐趋于稳态值 I i n R I_{in}R IinR ,并且这个过程是一个指数衰减过程,初始值和稳态值之间的差值随着时间的推移逐渐减小。
对于恒定的输入电流 I i n ( t ) = I i n I_{in}(t) = I_{in} Iin(t)=Iin,微分方程的解为:
U ( t ) = I i n R + [ U 0 − I i n R ] e − t τ U(t) = I_{in}R + \left[ U_0 – I_{in}R \right] e^{- \frac{t}{\tau}} U(t)=IinR+[U0−IinR]e−τt
这里, U 0 U_0 U0 是初始时刻 ( t = 0 t = 0 t=0) 的膜电位。这表明膜电位 U ( t ) U(t) U(t) 随时间以指数方式松弛到稳态值 I i n R I_{in}R IinR。
5. 离散时间下的近似解
为了在计算机上模拟 LIF 神经元,我们需要将微分方程离散化。使用前向欧拉法可以得到方程 (1) 的近似解:
U [ t ] = β U [ t − 1 ] + ( 1 − β ) I i n [ t ] U[t] = \beta U[t-1] + (1 – \beta) I_{in}[t] U[t]=βU[t−1]+(1−β)Iin[t]
其中, β = e − Δ t τ \beta = e^{-\frac{\Delta t}{\tau}} β=e−τΔt 是离散时间步长 Δ t \Delta t Δt 对应的衰减因子。
连续时间微分方程
我们从 LIF 神经元模型的连续时间微分方程开始:
τ d U ( t ) d t = − U ( t ) + I i n ( t ) R \tau \frac{dU(t)}{dt} = -U(t) + I_{in}(t)R τdtdU(t)=−U(t)+Iin(t)R
为了简化书写,我们改写为标准形式:
d U ( t ) d t = − U ( t ) τ + I i n ( t ) R τ \frac{dU(t)}{dt} = -\frac{U(t)}{\tau} + \frac{I_{in}(t)R}{\tau} dtdU(t)=−τU(t)+τIin(t)R
前向欧拉法
前向欧拉法是一种数值积分方法
,用于将连续时间的微分方程转换为离散时间
的差分方程。其基本思想是将微分方程在每个时间步上用一个 简单的差分近似 。
对于微分方程:
d U ( t ) d t = f ( U ( t ) , t ) \frac{dU(t)}{dt} = f(U(t), t) dtdU(t)=f(U(t),t)
前向欧拉法的离散化形式为:
U ( t + Δ t ) ≈ U ( t ) + Δ t ⋅ f ( U ( t ) , t ) U(t + \Delta t) \approx U(t) + \Delta t \cdot f(U(t), t) U(t+Δt)≈U(t)+Δt⋅f(U(t),t)
应用前向欧拉法
将上面的微分方程:
d U ( t ) d t = − U ( t ) τ + I i n ( t ) R τ \frac{dU(t)}{dt} = -\frac{U(t)}{\tau} + \frac{I_{in}(t)R}{\tau} dtdU(t)=−τU(t)+τIin(t)R
代入前向欧拉法公式中:
U ( t + Δ t ) ≈ U ( t ) + Δ t ( − U ( t ) τ + I i n ( t ) R τ ) U(t + \Delta t) \approx U(t) + \Delta t \left( -\frac{U(t)}{\tau} + \frac{I_{in}(t)R}{\tau} \right) U(t+Δt)≈U(t)+Δt(−τU(t)+τIin(t)R)
为了方便,我们使用离散时间索引来表示时间步长:
- 设 U [ t ] U[t] U[t] 表示第 t t t 个时间步上的膜电位。
- 设 I i n [ t ] I_{in}[t] Iin[t] 表示第 t t t 个时间步上的输入电流。
因此,离散化后的方程为:
U [ t + 1 ] ≈ U [ t ] + Δ t ( − U [ t ] τ + I i n [ t ] R τ ) U[t+1] \approx U[t] + \Delta t \left( -\frac{U[t]}{\tau} + \frac{I_{in}[t]R}{\tau} \right) U[t+1]≈U[t]+Δt(−τU[t]+τIin[t]R)
整理方程
将上式中的项整理:
U [ t + 1 ] ≈ U [ t ] − Δ t τ U [ t ] + Δ t τ I i n [ t ] R U[t+1] \approx U[t] – \frac{\Delta t}{\tau} U[t] + \frac{\Delta t}{\tau} I_{in}[t]R U[t+1]≈U[t]−τΔtU[t]+τΔtIin[t]R
进一步整理:
U [ t + 1 ] ≈ U [ t ] ( 1 − Δ t τ ) + Δ t τ I i n [ t ] R U[t+1] \approx U[t] \left( 1 – \frac{\Delta t}{\tau} \right) + \frac{\Delta t}{\tau} I_{in}[t]R U[t+1]≈U[t](1−τΔt)+τΔtIin[t]R
引入衰减因子 β \beta β
我们引入衰减因子:
β = 1 − Δ t τ \beta = 1 – \frac{\Delta t}{\tau} β=1−τΔt
为了更准确地表示衰减因子,我们可以使用指数形式:
β = e − Δ t τ \beta = e^{-\frac{\Delta t}{\tau}} β=e−τΔt
这是因为在小的 Δ t \Delta t Δt 限制下,指数近似 e − Δ t τ e^{-\frac{\Delta t}{\tau}} e−τΔt 与 1 − Δ t τ 1 – \frac{\Delta t}{\tau} 1−τΔt 是非常接近的。
e − Δ t τ ≈ 1 − Δ t τ e^{-\frac{\Delta t}{\tau}} \approx 1 – \frac{\Delta t}{\tau} e−τΔt≈1−τΔt 是一个常见的近似。
最终离散化方程
因此,离散时间下的近似解可以写为:
U [ t + 1 ] ≈ β U [ t ] + Δ t τ I i n [ t ] R U[t+1] \approx \beta U[t] + \frac{\Delta t}{\tau} I_{in}[t]R U[t+1]≈βU[t]+τΔtIin[t]R
再简化一点,考虑 ( 1 − β ) (1 – \beta) (1−β) 的形式:
U [ t + 1 ] = β U [ t ] + ( 1 − β ) I i n [ t ] R U[t+1] = \beta U[t] + (1 – \beta) I_{in}[t] R U[t+1]=βU[t]+(1−β)Iin[t]R
在离散时间的模拟中,我们通常将输入电流和电阻的乘积看作一个整体输入量。为简化书写,我们可以定义:
I e f f [ t ] = I i n [ t ] R I_{eff}[t] = I_{in}[t] R Ieff[t]=Iin[t]R
这样我们就有:
U [ t + 1 ] ≈ β U [ t ] + ( 1 − β ) I e f f [ t ] U[t+1] \approx \beta U[t] + \left(1 – \beta\right) I_{eff}[t] U[t+1]≈βU[t]+(1−β)Ieff[t]
U [ t + 1 ] = β U [ t ] + ( 1 − β ) I i n [ t ] U[t+1] = \beta U[t] + (1 – \beta) I_{in}[t] U[t+1]=βU[t]+(1−β)Iin[t]
这里的 ( 1 − β ) (1 – \beta) (1−β) 可以看作是输入电流对膜电位的影响因子。
解释
- β \beta β 是时间步长 Δ t \Delta t Δt 对应的衰减因子,表示膜电位随时间衰减的速率。
- ( 1 − β ) (1 – \beta) (1−β) 是输入电流的影响因子,表示输入电流如何影响膜电位。
这个离散化方程表明,膜电位 U [ t + 1 ] U[t+1] U[t+1] 是由上一个时间步的膜电位 U [ t ] U[t] U[t] 的衰减部分和当前时间步输入电流的贡献部分共同决定的。
通过这种离散化,我们可以在计算机上对 LIF 神经元进行 数值模拟 ,得到每个时间步的膜电位变化。
6. 可学习权重和脉冲发放
引入可学习权重
在深度学习中,我们通常将输入电流 I i n [ t ] I_{in}[t] Iin[t] 表示为输入 X [ t ] X[t] X[t] 和可学习权重 W W W 的乘积,即 I i n [ t ] = W X [ t ] I_{in}[t] = WX[t] Iin[t]=WX[t]。因此,方程 (3) 可以改写为:
U [ t ] = β U [ t − 1 ] + ( 1 − β ) W X [ t ] U[t] = \beta U[t-1] + (1 – \beta) WX[t] U[t]=βU[t−1]+(1−β)WX[t]
引入脉冲发放后的重置机制
在模拟脉冲神经元时,我们需要考虑脉冲发放后的重置机制。当膜电位 U [ t ] U[t] U[t] 超过阈值 θ \theta θ 时,神经元发放脉冲并将膜电位重置。这意味着在下一时间步,膜电位 U [ t + 1 ] U[t+1] U[t+1] 需要减去一个值 θ \theta θ,如果神经元在上一时间步 t t t 发放了脉冲。
这项附加的逻辑在物理实现中是
瞬时
的,但在数学模型中可以看作在 下一时间步 生效。
定义脉冲发放的二值输出 S o u t [ t ] S_{out}[t] Sout[t]:
S o u t [ t ] = { 1 , if U [ t ] > θ 0 , otherwise S_{out}[t] = \begin{cases} 1, & \text{if } U[t] > \theta \\ 0, & \text{otherwise} \end{cases} Sout[t]={
1,0,if U[t]>θotherwise
S o u t [ t ] ∈ { 0 , 1 } S_{out}[t] \in \{0, 1\} Sout[t]∈{
0,1} 是神经元的输出脉冲,当膜电位 U [ t ] U[t] U[t] 超过阈值 θ \theta θ 时, S o u t [ t ] = 1 S_{out}[t] = 1 Sout[t]=1,否则 S o u t [ t ] = 0 S_{out}[t] = 0 Sout[t]=0。
为了引入脉冲发放后的重置机制
,我们可以修改原公式,使其包含一个重置项 S o u t [ t − 1 ] θ S_{out}[t-1]\theta Sout[t−1]θ,表示如果在 t − 1 t – 1 t−1 时刻发放了脉冲,膜电位需要减去 θ \theta θ:
U [ t ] = β U [ t − 1 ] + ( 1 − β ) W X [ t ] − S o u t [ t − 1 ] θ U[t] = \beta U[t-1] + (1 – \beta) WX[t] – S_{out}[t-1]\theta U[t]=βU[t−1]+(1−β)WX[t]−Sout[t−1]θ
- β U [ t − 1 ] \beta U[t-1] βU[t−1]:表示上一时间步膜电位的衰减,类比为电路中的泄露电流,即神经元膜电位的衰减过程。
- ( 1 − β ) W X [ t ] (1 – \beta) WX[t] (1−β)WX[t]:表示当前时间步输入信号的加权贡献,类比为电路中的积分电流,即神经元对输入信号的积分响应。
- − S o u t [ t − 1 ] θ – S_{out}[t-1]\theta −Sout[t−1]θ:表示如果上一时间步发放了脉冲,膜电位需要减去阈值 θ \theta θ ,类比为电路中的输出脉冲,即神经元输出的脉冲信号。
7. 完整的LIF模型
综上所述,完整的 LIF 神经元模型可以表示为:
U [ t ] = β U [ t − 1 ] + W X [ t ] − S o u t [ t − 1 ] θ U[t] = \beta U[t-1] + WX[t] – S_{out}[t-1]\theta U[t]=βU[t−1]+WX[t]−Sout[t−1]θ
输出脉冲 S o u t [ t ] S_{out}[t] Sout[t] 满足以下条件:
S o u t [ t ] = { 1 , if U [ t ] > θ 0 , otherwise S_{out}[t] = \begin{cases} 1, & \text{if } U[t] > \theta \\ 0, & \text{otherwise} \end{cases} Sout[t]={
1,0,if U[t]>θotherwise
这就是 LIF 神经元模型的数学公式。它描述了神经元膜电位随时间的变化以及膜电位超过阈值时的脉冲发放机制。
在这篇博客中,我将进一步解释 Leaky Integrate-and-Fire (LIF) 神经元模型 的核心概念,并结合实际的数值模拟,逐步展示LIF神经元是如何工作的。LIF模型在神经科学和神经形态计算领域被广泛应用,因为它简单地模拟了生物神经元的基本行为——积分输入、触发脉冲、复位。
8.模拟LIF神经元行为
LIF神经元的核心机制是通过输入电流逐步增加膜电位,当膜电位达到阈值时触发脉冲(spike),随后电位重置。为了让这个过程更加直观,我将基于上述原理实现一个LIF神经元的完整行为模拟,并通过图像展示其脉冲发射情况。
模拟步骤:
- 输入电流:我们通过一个时间序列模拟输入电流的变化。
- 膜电位积累:在输入电流的作用下,膜电位随时间逐步积累。
- 脉冲发射:当膜电位达到阈值 V t h V_{th} Vth 时,神经元发射脉冲,膜电位重置为 V r e s e t V_{reset} Vreset。
模拟结果展示:
上图展示了Leaky Integrate-and-Fire (LIF) 神经元的典型脉冲发射过程。
- 膜电位变化(第一部分):
- 在施加输入电流时,神经元膜电位逐渐积累。当膜电位达到设定的阈值 V t h V_{th} Vth(图中的红色虚线)时,神经元发射一个脉冲,随后膜电位立即重置为 0(即 V r e s e t V_{reset} Vreset)。
- 在重置后,神经元再次开始积累膜电位,直到下一次发射脉冲。
- 脉冲序列(第二部分):
- 显示了神经元在膜电位达到阈值时的脉冲发射情况。每当膜电位超过阈值时,图中会显示一个脉冲。可以看到,在输入电流持续时间内,脉冲发射保持稳定。
- 输入电流(第三部分):
- 该部分展示了施加给神经元的输入电流。在模拟中,输入电流在200ms到800ms之间保持恒定。这一段恒定的输入驱动了神经元膜电位的变化,使其不断发射脉冲。
通过这张图可以直观地理解LIF神经元的工作机制:膜电位在输入电流的作用下逐步积累,当电位超过阈值时,神经元发射脉冲并重置,随后重复这个过程。
实现代码
# 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.show()
代码中的数学公式
这段代码使用的是LIF神经元模型的 微分方程,表示神经元膜电位 V ( t ) V(t) V(t) 随时间 t t t 的变化。LIF神经元的核心公式如下:
τ m d V ( t ) d t = − V ( t ) + R m I ( t ) \tau_m \frac{dV(t)}{dt} = -V(t) + R_m I(t) τmdtdV(t)=−V(t)+RmI(t)
这里:
- V ( t ) V(t) V(t) 是当前时间 t t t 的膜电位。
- I ( t ) I(t) I(t) 是时间 t t t 时刻输入的电流。
- τ m \tau_m τm 是膜时间常数。
- R m R_m Rm 是膜电阻。
离散化后的更新公式
为了在计算机中模拟,代码将这个微分方程通过 离散化 来求解。前向欧拉法是一种常见的离散化方法,其基本思想是用一个小的时间步长 Δ t \Delta t Δt 来近似连续时间的变化。通过离散化,LIF神经元的膜电位更新公式可以写成:
V ( t + Δ t ) = V ( t ) + Δ t τ m ( − V ( t ) + R m I ( t ) ) V(t + \Delta t) = V(t) + \frac{\Delta t}{\tau_m} \left( -V(t) + R_m I(t) \right) V(t+Δt)=V(t)+τmΔt(−V(t)+RmI(t))
在代码中,假设 Δ t \Delta t Δt 已经隐含在更新过程中,因此表达式简化为:
V [ t + 1 ] = V [ t ] + 1 τ m ( − V [ t ] + R m I [ t ] ) V[t+1] = V[t] + \frac{1}{\tau_m} \left( -V[t] + R_m I[t] \right) V[t+1]=V[t]+τm1(−V[t]+RmI[t])
代码的解读
dV = (-V_mem[t-1] + R_m * I_input[t]) / tau_m
这一行表示:d V = − V ( t ) + R m I ( t ) τ m dV = \frac{-V(t) + R_m I(t)}{\tau_m} dV=τm−V(t)+RmI(t)
这就是膜电位的瞬时变化率。
V_mem[t] = V_mem[t-1] + dV
表示:V ( t + 1 ) = V ( t ) + d V V(t + 1) = V(t) + dV V(t+1)=V(t)+dV
这是根据离散化的欧拉法公式更新膜电位。
if V_mem[t] >= V_th:
这一部分是在检查膜电位是否达到了阈值 ( V_{th} )。如果膜电位超过了阈值,则神经元触发脉冲:if V ( t ) ≥ V t h , then spike \text{if } V(t) \geq V_{th}, \text{ then spike} if V(t)≥Vth, then spike
V_mem[t] = V_reset
这部分则是当神经元发射脉冲时,将膜电位重置为 ( V_{reset} )。V ( t ) = V r e s e t if spike occurs V(t) = V_{reset} \quad \text{if spike occurs} V(t)=Vresetif spike occurs
与论文常见公式 (2)、(3)、(4) 的区别
公式 (2)、(3)、(4) 是一种不同的脉冲神经网络(SNN)模型,它可能使用的是 基于时间步长的神经元膜电位更新机制,而不是LIF的膜电位动态积累过程。这种模型通常用于 事件驱动 的脉冲神经网络。让我们简单回顾这些公式:
- 公式 (2) 表示当前层神经元的膜电位更新,它基于前一层神经元的脉冲传递:
v t e m p ( ℓ ) ( t + 1 ) = v ( ℓ ) ( t ) + W ( ℓ ) s ( ℓ ) ( t ) v^{(\ell)}_{temp}(t + 1) = v^{(\ell)} (t) + W^{(\ell)} s^{(\ell)} (t) vtemp(ℓ)(t+1)=v(ℓ)(t)+W(ℓ)s(ℓ)(t) - 公式 (3) 是膜电位在当前层的更新,减去输出脉冲的影响:
v ( ℓ ) ( t + 1 ) = v t e m p ( ℓ ) ( t + 1 ) − s ( ℓ + 1 ) ( t ) v^{(\ell)}(t + 1) = v^{(\ell)}_{temp}(t + 1) − s^{(\ell+1)}(t) v(ℓ)(t+1)=vtemp(ℓ)(t+1)−s(ℓ+1)(t) - 公式 (4) 定义了当膜电位达到阈值时,神经元发射脉冲:
s ( ℓ + 1 ) ( t ) = { V t h ( ℓ ) if v t e m p ( ℓ ) ( t + 1 ) ≥ V t h ( ℓ ) 0 otherwise s^{(\ell+1)}(t) = \begin{cases} V^{(\ell)}_{th} & \text{ if } v^{(\ell)}_{temp}(t + 1) ≥ V^{(\ell)}_{th} \\ 0 & \text{ otherwise} \end{cases} s(ℓ+1)(t)={
Vth(ℓ)0 if vtemp(ℓ)(t+1)≥Vth(ℓ) otherwise
这些公式与经典的LIF模型在膜电位更新和脉冲触发机制上有些不同,主要是使用了时间步长的方式来表示脉冲神经元的更新过程,而不是LIF神经元中的电压动态累积和泄漏机制。
总结
- 代码中的LIF模型基于经典的电路类比,使用了欧拉法来离散化膜电位的更新公式。
- 公式 (2)、(3)、(4) 是另一种脉冲神经网络的膜电位更新方式,与LIF模型的动力学方程不同,可能用于 基于事件驱动的SNN 或 时延编码模型。
两者都属于脉冲神经网络的范畴,但具体机制和公式表达的模型行为有显著差异。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/158301.html