核心结论 :脉冲神经网络(Spiking Neural Network,SNN)是仿照生物神经元以「离散脉冲(spike)」而不是「连续数值」来传递信息的第三代神经网络。它最大的两个标签是事件驱动 与极低能耗------神经元只在收到足够电流、膜电位超过阈值时才「发放一个脉冲」,多数时间不干活,所以理论上能比传统神经网络(ANN)省下几个数量级的运算量。代价是它很难训练(脉冲不可导),目前的精度普遍还追不上同等规模的 ANN。
目录
-
- 一句话结论:SNN 是「放鞭炮」的第三代神经网络
-
- 脉冲神经网络是什么:第三代神经网络的由来
-
- 神经元模型(neuron model):LIF 最主流
-
- 编码方式(encoding):怎么把外部信号变成「脉冲」
-
- SNN 怎么训练:替代梯度(surrogate gradient)与 STDP
-
- SNN 与 ANN 的本质区别:可运行的对照代码
-
- 能耗优势:从 MAC 到 AC 的量化账
-
- 应用场景与类脑芯片
-
- 对照表:症状 → 原因 → 解法
-
- 判断收尾
1. 一句话结论:SNN 是「放鞭炮」的第三代神经网络
先建立一个直觉 🎭:传统神经网络(ANN)的神经元像一直说话的人 ------每经过一层,都输出一个连续的小数(比如 0.73、0.12),层层传递。而脉冲神经网络(SNN)的神经元像隔一会儿放一个鞭炮的人------它平时闷不吭声,只有「攒」够了电流、膜电位(membrane potential)冲破阈值的那一刻,才「啪」地放一个脉冲。
这个「平时不说话、关键时候炸一下」的特性,就是 SNN 一切优点的来源,也是一切缺点的来源:
- 优点:脉冲是 0/1 离散事件,很多时候神经元在「沉默」(不放电),可以不算账;计算从「乘加」(MAC)退化成了「累加」(AC),省电。
- 缺点:脉冲的「突然放一下」在数学上是不可导的(non-differentiable),没法像 ANN 那样直接用反向传播(backpropagation)训练,得用花样绕过它。
所以一句话:SNN 用「稀疏脉冲」交换低能耗,用「难训练」交换生物可解释性。
2. 脉冲神经网络是什么:第三代神经网络的由来
SNN(Spiking Neural Network,脉冲神经网络) 最早由 Wolfgang Maass 在 1997 年的论文《Networks of Spiking Neurons: The Third Generation of Neural Network Models》中正式提出,被称为「第三代神经网络」。
这里要先理解「三代」是怎么分的:
| 代际 | 计算单元 | 传递什么 | 典型例子 |
|---|---|---|---|
| 第一代 | 阈值逻辑神经元(McCulloch-Pitts) | 0/1 离散值 | 感知机(Perceptron) |
| 第二代 | 具有连续激活函数的神经元 | 连续数值 | MLP、CNN、RNN、Transformer |
| 第三代 | 脉冲神经元(spiking neuron) | 离散 spike + 时间信息 | LIF 神经元网、类脑芯片上的 SNN |
Maass 的核心主张是:由脉冲神经元构成、能利用「脉冲的精确时序(temporal coding)」的网络,计算能力至少不弱于 同规模的前两代网络,而且某些函数只需要显著更少的神经元就能算出来。
第三代神经网络(third generation neural network):以脉冲(spike)为信息载体、以时间为额外维度的神经网络模型族,区别于以连续激活函数为核心的第二代 ANN。
生物学家早就发现,真实神经元不做「乘法」,而是通过膜电位的积分、泄漏、发放、重置这一套过程来编码信息。SNN 就是要用数学模型把这套机制复刻下来,这也是它常被归入「类脑计算」、「神经形态计算(neuromorphic computing)」的原因。
参考资料:
- Networks of Spiking Neurons: The Third Generation of Neural Network Models -- Maass 1997 ⭐值得阅读
- Recent Advances and New Frontiers in Spiking Neural Networks -- arXiv
- 第三代神经网络模型:面向 AI 应用的脉冲神经网络 -- 集智俱乐部
3. 神经元模型(neuron model):LIF 最主流
SNN 里最基础的计算单元是脉冲神经元 。它不像 ANN 神经元那样「输入加权 → 激活函数 → 输出数值」,而是遵循一个类似水桶的过程:积分 → 泄漏 → 超过阈值就发放 → 发放后重置。
最经典、用得最多的模型是 LIF(Leaky Integrate-and-Fire,泄漏积分发放)神经元。它用一个「电阻-电容(RC)」类比来描述膜电位:
latex
\tau_m \frac{dV(t)}{dt} = -(V(t) - E_L) + R_m I(t)
- V(t):膜电位(membrane potential),神经元的「水位」;
- τm=RmCm:膜时间常数,决定「水位」涨得多快;
- EL:静息电位(leak 电位),不刺激时的「基准水位」;
- I(t):输入电流,即上游脉冲带进来的「水流」;
- 当 V(t) 超过阈值 Vth 时,神经元发放一个脉冲 ,然后 V(t) 被重置到 Vreset,并进入一段不应期(refractory period)。
用大白话翻译 🎭:LIF 神经元像一个漏水的水桶------上游每放一个脉冲,就往桶里倒一点水(积分);桶底下有小孔在漏水(泄漏);水一旦满到刻度线(阈值),就「泼」出一瓢水给下游(发放脉冲),然后桶立刻被倒空、暂时不再进水(不应期)。
正是因为 LIF 保留了「泄漏」这个特性,它比最简的「积分发放」(IF,Integrate-and-Fire,不泄漏)神经元更贴近真实生物神经元------电流小了,水位一边涨一边漏,可能永远到不了阈值,这就导致 SNN 里「不是每个输入都会触发输出」,稀疏性就此产生。
参考资料:
- Simplified models of neural activity(LIF neuron)-- Rice University
- Exercise: Leaky integrate and fire model of neural spike generation -- MIT OCW
- Biological Intuition on Digital Hardware: RTL Implementation of Poisson-Encoded SNNs -- arXiv
4. 编码方式(encoding):怎么把外部信号变成「脉冲」
SNN 的输入不是普通图片的像素值、文本的向量,而是一串时序脉冲(spike train) 。把连续信号变成脉冲的过程叫编码(encoding),它决定 SNN 到底怎么「看」输入。
常见的三种编码方式:
| 编码方式 | 用输入的什么决定脉冲 | 一句话直觉 |
|---|---|---|
| 频率编码(rate coding) | 输入值越大,脉冲越密 | 说话越急=数值越大 |
| 延迟编码(latency coding) | 输入值越大,脉冲来得越早 | 越重要越先开口 |
| 增量调制(delta modulation) | 输入变化才发脉冲 | 只有变化才说话,静止不说话 |
其中频率编码 最常用、最好理解。打个比方 🎭:频率编码就像打摩斯电码------一个大数值 = 同样的时间窗口里「哒哒哒哒」敲得更密集;一个小数值 = 敲得稀稀拉拉甚至不敲。SNN 网络后面的层,就是靠「数一段时间里收到多少个脉冲(发放频率)」来还原信息的。
这种「用稀疏脉冲代替稠密数值」的编码,正是 SNN 省电的根源------一张图如果能用 30% 的神经元说话,剩下 70% 的神经元就「不干活、不算账」,乘加运算直接省掉了。
参考资料:
- Tutorial 1 - Spike Encoding -- snnTorch ⭐值得阅读
- Spiking Neural Networks in Imaging: A Review and Case Study -- PMC
- Spatio-Temporal Cluster-Triggered Encoding for Spiking Neural Networks -- arXiv
5. SNN 怎么训练:替代梯度(surrogate gradient)与 STDP
这是 SNN 最大的痛点。ANN 训练靠反向传播(backpropagation),而梯度计算的核心是「对激活函数求导」。但脉冲神经元的「发放」是一个0/1 的跳变------它要么发、要么不发,没有「发到一半」这个概念,所以这个过程的导数在数学上几乎处处为 0(不可导),梯度传不动。
解决方案一:替代梯度(surrogate gradient),这是目前主流、也最有效的方法。
它做的事是「狸猫换太子 」:前向传播(forward)时,老老实实用真实的、不可导的「发放」规则;但反向传播(backprop)需要求导时,用一条光滑的替代曲线(比如 sigmoid 或 arctan 的导数)暂时代替真实导数。这样梯度就能顺着这条光滑曲线流回去更新权重,而前向的「发放」行为没变。
替代梯度(surrogate gradient):在反向传播中用一条光滑近似函数替换不可导的脉冲发放函数,使梯度能够传播,从而能用标准梯度下降训练 SNN。
用大白话翻译 🎭:替代梯度就像在台阶上刷了一层坡道------真实的「发放」是陡峭的台阶,人(梯度)走不上去;你在旁边刷一层缓坡,人就能顺着坡爬上去,虽然走的不是台阶本身,但方向对了、也能到顶。
实际效果如何?可复算的数据摆在这里:在 MNIST 上,用替代梯度训练的 SNN 能到 97%--98% 的准确率(例如 mlx-snn 实测 97.28%,snnTorch 最佳约 98.03%),与同规模 ANN 的差距已缩到 1 个百分点以内。
解决方案二:STDP(Spike-Timing-Dependent Plasticity,脉冲时序依赖可塑性),更贴近生物,但更难训出高精度。
它的规则很符合直觉:「先放电的神经元,它到后放电神经元的连接要增强 」------谁先谁后决定权重是增还是减,就像「谁先开口,谁的影响力更大」。STDP 不需要反向传播,训练是局部的(只看相邻两个神经元),很适合类脑硬件,但精度普遍不如替代梯度。
很多前沿工作干脆混合使用:先用 ANN-to-SNN 转换或反向传播把精度拉起来,再用 STDP 微调,兼顾生物可塑性与精度。
参考资料:
- Tutorial 5 - Training Spiking Neural Networks with snnTorch -- snnTorch ⭐值得阅读
- mlx-snn: Spiking Neural Networks on Apple Silicon via MLX -- arXiv
- Adaptive and lightweight surrogate gradients: enhancing training efficiency -- Frontiers
- Efficient End-to-End Training of LIF Spiking Neural Networks via ArcTan Surrogate Gradients -- Semantic Scholar
6. SNN 与 ANN 的本质区别:可运行的对照代码
要理解 SNN 和 ANN 的差别,最直接的办法是各写一个神经元,跑同一段输入。
这里用 snnTorch(基于 PyTorch 的 SNN 库)给出两段复制粘贴就能跑的代码:第一段是一个标准的 ANN 神经元(线性加权 + ReLU),第二段是一个 LIF 脉冲神经元。你会看到:同样一个输入,ANN 直接吐出一个连续小数,而 LIF 神经元「攒一攒、破个荚、放一个脉冲」,输出完全不同。
运行前:pip install snntorch torch。
python
import torch
import snntorch as snn
from snntorch import spikegen
# ① ANN 神经元:线性加权 + ReLU,输出是连续小数
def ann_neuron(x, w, b):
return torch.relu(x @ w + b)
# ② LIF 脉冲神经元:积分->泄漏->超过阈值就发放->重置(snnTorch 内置)
lif = snn.Leaky(beta=0.9, threshold=1.0) # beta 是膜电位衰减系数,决定"漏"多快
mem = torch.zeros(1) # 膜电位从 0 开始
# ③ 造一段时序输入:把 0.8 这个"信号"用频率编码成 10 个时间步的脉冲
T = 10
spike_in = spikegen.rate(data=torch.tensor([[0.8]]), num_steps=T)
print("输入脉冲序列(频率编码,值越大越密):")
print(spike_in.squeeze().tolist())
# ④ 逐时间步喂给 LIF 神经元
print("\nLIF 神经元逐时间步的状态(mem=膜电位, spk=是否发放):")
for t in range(T):
spk, mem = lif(spike_in[t], mem) # mem 会被自动更新并带回下一时间步
print(f"t={t} 膜电位={mem.item():.3f} 发放={spk.item()}")
# ⑤ 对比:同一个输入喂给 ANN 神经元
x = spike_in[-1].unsqueeze(0) # 取一个时间步的输入
print(f"\nANN 神经元对输入 {x.item()} 的输出 = {ann_neuron(x, torch.tensor([[1.0]]), torch.tensor([0.0])).item():.3f}")
怎么读这段代码 :spikegen.rate 把「0.8」这个连续值,用频率编码打散成 10 个时间步里的 0/1 脉冲(值越大,脉冲越密)。snn.Leaky 是 LIF 神经元的封装,它会维护一个「膜电位」mem,每次收到输入后 mem = beta*mem + 输入(积分 + 泄漏),一旦超过 threshold 就发放 spk=1 并把 mem 减掉阈值(重置)。
关键差异就藏在 spk 上:LIF 的输出是一串稀疏的 0/1 ,且带时间顺序 ;ANN 的输出是一个稠密的连续小数,没有时间维度。这就是「事件驱动」与「连续计算」的根本不同。
参考资料:
- Tutorial 3 - A Feedforward Spiking Neural Network -- snnTorch ⭐值得阅读
- snntorch 神经元文档(LIF 等)-- snnTorch
7. 能耗优势:从 MAC 到 AC 的量化账
SNN 最让人心动的地方是能耗 。核心机制在于:ANN 每个神经元每经过一层都要做乘加(MAC,Multiply-Accumulate) ,而 SNN 神经元只有「发放脉冲」的那一次才算账,且脉冲是 0/1,乘法退化成纯累加(AC,Accumulate)。
打个比方 🎭:MAC 像「每步都要掏钱做一次完整的买卖 」,AC 像「只在有东西进账时才记一笔流水」。SNN 把大部分神经元的运算都省掉了------因为它们大多在「沉默」。
量化账目(可复算):
- 一次 MAC ≈ 数倍 AC 的能量 :业界(如 Han et al. 2015)测量,一次 MAC 的能量消耗大约是 AC 的一个数量级(约 4.6 pJ vs 0.9 pJ),所以把 MAC 换成 AC,单次运算就省一个数量级。
- SNN 版 Transformer 能耗更低 :实测 Spike-driven Transformer 仅消耗同等结构传统 Transformer 的 23.0% 能量,同时保住 30.4% 的能量下的竞争性精度。
- 稀疏性是关键 :SNN 要真正打赢 ANN,必须高稀疏 。对 VGG16、时间窗口 T=6 时,神经元稀疏率必须超过 93% ,才能在大多数硬件上实现能耗优势;若稀疏率只有 0.1(即 10% 突触放电),约带来 3.6 倍 能耗节省。
这里有个反直觉但必须说清的点:SNN 不是「天生省电」 。如果神经元太活跃、稀疏率不够,SNN 可能比 ANN 更耗电(因为要模拟时间步)。所以「SNN 省电」是有前提的------时间窗口要短、稀疏率要足够高。这正是 SNN 工程化的核心约束。
参考资料:
- Rethinking the Energy Efficiency of SNNs and ANNs -- ACM TACO ⭐值得阅读
- Reconsidering the energy efficiency of spiking neural networks -- arXiv
- Going Deeper in Spiking Neural Networks: VGG and Residual Architectures -- arXiv
- Can Spiking Neural Networks Kill the GPU? -- DEV Community
8. 应用场景与类脑芯片
SNN 的定位不是「替代通用大模型」,而是在特定场景下,用最低功耗解决实时、事件驱动的问题。它的强项正好对应那些「数据稀疏、必须快、必须省电」的 edge 场景。
最匹配的场景:
- 事件相机(event camera / DVS):这类传感器天然输出「变化才触发」的脉冲流,和 SNN 的输入形式完美契合,不需要额外编码。典型如自动驾驶里的动态视觉感知。
- 低功耗边缘 AI :可穿戴设备、工业传感器、无人机------需要毫瓦级功耗、毫秒级延迟,SNN 在神经形态芯片上比 GPU 推理省 10--100 倍 能量。
- 实时时序信号:语音、生物信号(如脑机接口、运动解码),SNN 天然带时间维度,适合处理「时序很重要」的任务。
配套的硬件方向:神经形态芯片(neuromorphic chip) 。SNN 靠软件跑在 GPU 上,其实浪费了「事件驱动」的优势;真正发挥威力的是专门为脉冲设计的芯片,如 Intel Loihi、IBM TrueNorth、以及各类基于忆阻器(RRAM)的自研加速器,它们用「0/1 脉冲 + 累加」的硬件结构,直接省掉浮点乘加。
一句话:SNN 真正的舞台是「神经形态芯片 + 事件传感器」的组合,而不是在 GPU 上跟大模型比参数量。它追求的从来不是「算得更大」,而是「算得更省」。
参考资料:
- Neuromorphic Computing and Spiking Neural Networks for Industrial Intelligence -- CallPress
- Spiking neural networks for object detection and semantic segmentation -- IOE
- Brain-inspired AI for Edge Intelligence: a systematic review -- arXiv
- Energy Efficient RRAM Spiking Neural Network for Real Time Classification -- Tsinghua
9. 对照表:症状 → 原因 → 解法
| 症状 | 原因 | 解法 |
|---|---|---|
| 听说 SNN 很省电,跑起来却比 ANN 还慢 | 时间窗口太长、神经元太活跃,稀疏率不够 | 缩短时间窗口 T,并用正则化手段提升神经元稀疏率(需超 93%) |
| 用反向传播训练 SNN,梯度传不动、训练不收敛 | 脉冲发放是 0/1 跳变,数学上不可导 | 用替代梯度(surrogate gradient)在反向传播时替换不可导函数 |
| 想追求生物合理性、不想要反向传播 | 反向传播不符合「局部学习」的生物直觉 | 改用 STDP(脉冲时序依赖可塑性)做局部无监督训练 |
| 想让 SNN 上普通 GPU,结果没优势 | 事件驱动的优势在 GPU 上被「稠密模拟」浪费了 | 换到神经形态芯片(Loihi / TrueNorth / RRAM 加速器) |
| 用图片/文本喂 SNN,效果很差 | 输入不是脉冲流,编码方式不对 | 先做编码(频率 / 延迟 / 增量调制),或直接用事件相机输入 |
| 精度总是追不上同规模 ANN | SNN 训练难、时间步模拟有损耗 | 先用 ANN-to-SNN 转换拿到精度,再微调;或接受它在 edge 场景的功耗优势 |
10. 判断收尾
判断收尾:当你需要「在低功耗、实时、事件驱动的 edge 场景里解决问题」,并且能用上事件传感器或神经形态芯片时,SNN 值得用------它用稀疏脉冲换来的能耗优势是实打实的;但如果你只是想在 GPU 上做图像分类、文本生成这类通用任务,SNN 目前的精度和训练成本还不划算,选 ANN / Transformer 更稳。
专栏介绍:本专栏《LLM 大模型技术专栏》从 Transformer 注意力机制一路讲到 MoE、量化部署、vLLM 推理与 Agent 落地,每篇都配一段可直接运行的代码,每周更新一篇。想按顺序读完,可在专栏页订阅。