先建立一个能用的直觉
SNN 的一次 forward 不是只穿过网络深度,还要沿时间轴重复更新。每一步都读取本步输入与上一步状态。
即使 t=2 没有输入 spike,t=1 留下的膜电位仍可能影响输出;这就是状态记忆。
它到底解决了什么麻烦
没有时间展开,就看不到膜电位如何连接相邻时间步,也无法理解 BPTT 为什么需要保存中间状态。
Math · 不背公式,顺着计算读
每张卡先讲人话,再拆符号、走计算顺序,最后代入一组数。读完后请合上说明,自己复算一次。
在第 t 步,只拿上一层同一时刻的 spike 做一次线性变换。它描述空间/层间传播,还没有处理本层自己的时间记忆。
符号分别是谁
- l
- 当前网络层编号
- S(l−1)[t]
- 上一层在当前时间步发出的 spike 向量
- W(l)
- 从上一层连到当前层的共享权重
- I(l)[t]
- 送入当前层神经元的加权电流
按这个顺序计算
- 找到本步活跃的输入 spike。
- 每个 spike 乘对应突触权重。
- 对进入同一神经元的贡献求和,得到 I。
代入一组数
两个输入 spike 为 [1,0],某神经元权重为 [0.4,−0.7],则本步电流 I=0.4;第二条突触因为没有 spike,不贡献电流。
落到代码就是
current = linear(spikes_previous_layer)这行同时有两条边:βV[t−1] 是时间边,I[t] 是从上一层来的深度边;最后一项把上一步发放造成的 reset 写进递推式。
符号分别是谁
- βV[t−1]
- 从过去保留下来的状态
- I[t]
- 当前时间步收到的层间输入
- S[t−1]Vth
- 上一时刻发放后应扣除的 reset
按这个顺序计算
- 沿时间轴衰减旧状态。
- 加入本步加权输入。
- 按所采用的时间索引约定扣除 reset,再计算本步 spike。
代入一组数
β=0.8、旧 V=0.6、本步 I=0.4、上步未发放时,新 V=0.88;即使本步 I 只有 0.4,历史也把它推到了更高位置。
把几个容易混的概念拆开
Time-major tensor
[T, B, …] 把时间放在首维;也有库使用 [B, T, …],进入模型前必须确认。
State lifecycle
序列开始时初始化,序列内持续更新,独立样本之间必须重置或显式传递。
跟着机制一步一步走
01
手算四个时间步
设 β=0.8、阈值 1、subtract reset,输入依次为 [0.4, 0.4, 0.4, 0]。膜电位依次更新为 0.4、0.72、0.976、0.7808,因此四步都不发放。若第三步输入改为 0.5,则第三步越阈值并触发 reset。
- 每一步先读取旧状态,再加入当前输入。
- 无输入不等于无状态。
- 输出 spike 与 reset 后状态必须分开记录。
带走这一点调试 SNN 时,打印单个样本的逐步 trace 往往比看最终 accuracy 更有效。
02
状态什么时候清零?
独立图片 batch 之间通常清零;长视频被切成连续片段时可以传递,但需要 detach 截断旧计算图。验证阶段也必须使用与训练一致的状态边界。
公式在代码里对应哪一行
这一章更适合在交互实验里逐步观察;代码实验页还提供了完整训练程序。
先写下预测,再动参数
在 BPTT 实验切换 Forward,逐步观察 input → current → membrane → spike;不要一次跳到最后。
我最常见到的误解
训练不同 batch 时忘记清空膜电位,会把上一批样本的信息泄漏到下一批。
到了论文里,它会怎么出现
并行脉冲神经元与状态空间化方法试图减少严格逐步执行造成的训练瓶颈。
别急着翻页,先验算一下
本章检测0/3 已作答