先建立一个能用的直觉
把同一个 LIF 单元在 t₀、t₁、t₂、t₃ 复制展开,复制体共享权重,状态边把它们串起来。Loss 可以从最后或所有时间步产生。
它到底解决了什么麻烦
当前 spike 依赖当前膜电位,而当前膜电位依赖上一步。梯度必须跨越这条递归状态链才能把延迟误差归因到早期输入和共享权重。
Math · 不背公式,顺着计算读
每张卡先讲人话,再拆符号、走计算顺序,最后代入一组数。读完后请合上说明,自己复算一次。
V[t] 的梯度有两个来源:本步损失直接责怪它,以及未来状态通过 V[t+1] 回头责怪它。BPTT 就是在反复合并这两笔账。
符号分别是谁
- L
- 整个序列的总损失
- Lt
- 第 t 步产生的局部损失
- ∂V[t+1]/∂V[t]
- 状态从本步传到下一步的局部 Jacobian
按这个顺序计算
- 计算本步监督产生的直接梯度。
- 取下一时刻已经累计好的梯度。
- 乘状态转移的局部导数后加回来,再继续向 t−1 传播。
代入一组数
本步直接梯度 0.2,未来累计梯度 0.5,局部状态导数约为 β=0.8,则总梯度约 0.2+0.5×0.8=0.6。
同一权重 W 在所有时间步反复使用,所以每个时间步都交回一份梯度,最后把这些贡献相加。
符号分别是谁
- ∂L/∂S[t]
- 损失对本步 spike 的上游梯度
- ∂S[t]/∂V[t]
- 由 surrogate 估计的阈值局部梯度
- ∂V[t]/∂W
- 本步膜电位对共享权重的敏感度
- Σt
- 累加所有时间步对同一参数的贡献
按这个顺序计算
- 从 loss 传到本步 spike。
- 穿过 surrogate 到膜电位。
- 再传到 W,并对 t=1…T 的贡献求和。
代入一组数
若三个时间步对某权重的梯度分别是 0.03、−0.01、0.05,最终该权重收到 0.07,而不是只取最后一步的 0.05。
把几个容易混的概念拆开
Memory cost
朴素 BPTT 需要保存 T 个时间步的中间激活,显存与计算通常随 T 增长。
Truncated BPTT
按窗口截断状态图可降成本,但会舍弃更远的梯度依赖。
跟着机制一步一步走
01
梯度有两条方向
空间方向穿过层:output → hidden → input;时间方向穿过状态:V[t] → V[t−1]。SNN 的 BPTT 同时叠加这两条路径,因此深度和时间长度都会影响梯度稳定性。
- 输出损失可以只放在末步,也可对所有步监督。
- 共享权重的梯度在所有时间步求和。
- 完整 BPTT 的激活存储通常与 T 近似线性增长。
02
截断、detach 与 online training
Truncated BPTT 每隔 K 步 detach 状态,减少显存但舍弃更远依赖。Online 方法尝试边前向边近似梯度,换取更低内存;它们不是免费的等价替代。
公式在代码里对应哪一行
这一章更适合在交互实验里逐步观察;代码实验页还提供了完整训练程序。
先写下预测,再动参数
在 BPTT 可视化中先完成所有 forward,再执行 backward;跟随高亮边从 Loss 回到早期状态。
我最常见到的误解
只在最后一步调用 loss 却期待每个时间步得到同样强的监督。读出策略会明显影响梯度分配。
到了论文里,它会怎么出现
Event-driven backprop、rate-based backprop 与在线近似都在尝试减少完整 BPTT 的内存和时间成本。
别急着翻页,先验算一下
本章检测0/3 已作答