时空反向传播 (STBP) 算法深度解析
1. 核心挑战:SNN 为什么难训练?
传统的深度学习(ANN)使用反向传播(BP)算法,依赖链式法则计算梯度。SNN 想要使用 BP,面临一个数学上的'死胡同':
- 脉冲的不可导性: SNN 中的神经元发放脉冲是一个二值的阶跃函数(Step Function)。
- 梯度消失或爆炸: 阶跃函数的导数在阈值处是无穷大(狄拉克 δ 函数),在其他地方是 0。这意味着梯度要么无法传播,要么爆炸,导致网络无法通过标准的梯度下降来更新权重。
Output = 1 if u > V_th else 0
STBP 的解决思路: 将 SNN 在时间维度上展开,将其视为一个特殊的循环神经网络(RNN),并在反向传播时引入代理梯度(Surrogate Gradient)。
2. STBP 的'时空'含义
STBP 的精髓在于它同时在两个维度上计算梯度的传播:
- 空间维度 (Spatial Domain):
- 就像传统的 CNN/MLP 一样,误差从输出层向输入层,逐层(Layer-by-Layer)反向传播。
- 这解决了'如何调整权重以提取特征'的问题。
- 时间维度 (Temporal Domain):
- 由于 LIF 神经元有膜电位泄漏(Leakage)和累积特性,当前时刻的状态依赖于上一时刻。误差需要从 t 时刻向 t-1 时刻传播。
- 这解决了'如何利用历史信息'的问题。
3. 算法数学推导 (结合相关研究)
A. 前向传播 (LIF 动力学)
在离散时间步 t,LIF 神经元 i 的行为被建模为:
- 膜电位更新: u_i^t = u_i^{t-1} \cdot \tau_{decay} + x_i^t + b_i (若上一步未发放脉冲)
- 脉冲发放: s_i^t = g(u_i^t - V_{th}),其中 g(x) 是海维赛德阶跃函数。
预突触输入: x_i^t = \sum_j w_{ij} s_j^{t-1}
B. 反向传播 (链式法则)
我们要计算损失函数 L 对权重 W 的梯度 \frac{\partial L}{\partial W}。根据链式法则,总梯度是空间梯度和时间梯度的总和。
\frac{\partial L}{\partial u_i^t} = \underbrace{\frac{\partial L}{\partial s_i^t} \frac{\partial s_i^t}{\partial u_i^t}}{\text{空间传播}} + \underbrace{\frac{\partial L}{\partial u_i^{t+1}} \frac{\partial u_i^{t+1}}{\partial u_i^t}}{\text{时间传播}}
这里有两个关键项:
- 时间依赖项 \frac{\partial u_i^{t+1}}{\partial u_i^t}: 这对应于神经元的泄漏因子(decay factor)。\frac{\partial u_i^{t+1}}{\partial u_i^t} \approx \tau_{decay} (忽略复位影响的简化)
- 脉冲导数项 \frac{\partial s_i^t}{\partial u_i^t} (Crucial!): 这是 s 对 u 求导。由于 s 是阶跃函数,直接求导不可行。STBP 在这里引入了'代理梯度'。
C. 代理梯度 (Surrogate Gradient)
在前向传播时,仍然使用阶跃函数以保持 SNN 的二值特性;但在反向传播计算梯度时,使用一个平滑的可导函数 h(u) 来近似阶跃函数。
