经典STDP模型
STDP(Spike-Timing-Dependent Plasticity,脉冲时间依赖可塑性)可认为是对Hebb学习规则的一种拓展。在实际的生物体中,神经细胞是一个复杂的动力学系统,具有静息、兴奋、发放脉冲,接收脉冲、膜电位累积、不应期等多种状态和行为。研究发现,两个神经元之间突触连接强度的变化与神经元发放脉冲的精确时间紧密相关。具体地,突触前和突触后神经元发放脉冲的相对时间差对神经元之间突触连接权值改变的方向和大小具有关键作用。
STDP被如下等式定义[1]:
Δ
w
=
∑
t
p
r
e
∑
t
p
o
s
t
W
(
t
p
o
s
t
−
t
p
r
e
)
W
(
Δ
t
)
=
{
A
p
r
e
e
−
Δ
t
/
τ
p
r
e
,
Δ
t
>
0
A
p
o
s
t
e
Δ
t
/
τ
p
o
s
t
,
Δ
t
<
0
\Delta w = \sum_{t_{pre}}\sum_{t_{post}}W(t_{post} - t_{pre}) \\ W(\Delta t) = \begin{cases} A_{pre} e^{-\Delta t/\tau_{pre}},\quad \Delta t > 0\\ A_{post} e^{\Delta t/\tau_{post}}, \quad \Delta t < 0 \end{cases}
Δw=tpre∑tpost∑W(tpost−tpre)W(Δt)={Apree−Δt/τpre,Δt>0AposteΔt/τpost,Δt<0
用brian2实现:
from brian2 import *
import numpy as np
import matplotlib.pyplot as plt
# 参数见Competitive Hebbian learning through spike-timing-dependent synaptic plasticity论文
tau_pre = tau_post = 20*ms
A_pre = 0.01
A_post = -A_pre * 1.05
delta_t = np.linspace(-50, 50, 100)*ms
W = where(delta_t > 0, A_pre * exp(-delta_t / tau_pre), A_post * exp(delta_t / tau_post))
plot(delta_t/ms, W)
xlabel(r'$\Delta t$ (ms)')
ylabel('W')
axhline(0, ls='-', c='k')
plt.savefig(r'C:\Users\wzc\Documents\自学技术笔记\img\demo_stdp.png')
plt.show()
得到如下的结果:
然而,直接使用这个方程模拟它将是非常低效的,因为我们必须对所有的尖峰对求和。这在生理上也是不现实的,因为神经元无法记住之前的所有尖峰时间。事实证明,有一种更有效、生理上更合理的方法可以获得同样的效果。我们定义两个新变量
a
p
r
e
、
a
p
o
s
t
a_{pre}、a_{post}
apre、apost,分别是前突触活动和后突触活动的‘trace’,并有如下的微分方程:
τ
p
r
e
d
a
p
r
e
d
t
=
−
a
p
r
e
τ
p
o
s
t
d
a
p
o
s
t
d
t
=
−
a
p
o
s
t
\tau_{pre} \frac{da_{pre}}{dt} = -a_{pre} \\ \tau_{post} \frac{da_{post}}{dt} = -a_{post}
τpredtdapre=−apreτpostdtdapost=−apost
当前突触神经元产生脉冲尖峰时,更新前突触trace和突触权重:
a
p
r
e
=
a
p
r
e
+
A
p
r
e
w
=
w
+
a
p
o
s
t
a_{pre} = a_{pre} + A_{pre} \\ w = w + a_{post}
apre=apre+Aprew=w+apost
类似地,当后突触神经元产生脉冲尖峰时:
a
p
o
s
t
=
a
p
o
s
t
+
A
p
o
s
t
w
=
w
+
a
p
r
e
a_{post} = a_{post} + A_{post} \\w = w + a_{pre}
apost=apost+Apostw=w+apre采用python中的Brian2公式格式实现如下,其中taupre和taupost是时间常数
τ
p
r
e
、
τ
p
o
s
t
\tau_{pre}、\tau_{post}
τpre、τpost,event-driven代表是脉冲事件驱动的,当有脉冲到来时,采用此STDP规则进行更新。
'eqs_stdp': '''
w : volt
dapre/dt = -apre/taupre : volt (event-driven)
dapost/dt = -apost/taupost : volt (event-driven)
''',
'eqs_on_pre': '''
v_post += w
apre += Apre
w = clip(w+nu_pre*apost, wmin, wmax)
''',
'eqs_on_post': '''
apost += Apost
w = clip(w+nu_post*apre, wmin, wmax)
'''
可以证明的,这种方式跟原始经典的STDP规则是完全一样的。
参考文献
[1] Song S, Miller K D, Abbott L F. Competitive Hebbian learning through spike-timing-dependent synaptic plasticity[J]. Nature neuroscience, 2000, 3(9): 919-926.