为什么传统机器学习课程很少讲 SNN(脉冲神经网络 Spiking Neural Network)
一句话总结:SNN 不属于传统机器学习/深度学习主线,定位、范式、应用、门槛都和主流体系脱节,所以常规课基本不涉及。
1. 范式完全不一样,不属于“主流深度学习”
传统课程讲的是人工神经网络 ANN(CNN、MLP、RNN、Transformer):
- 用连续模拟值做计算(0~1、实数)
- 基于静态帧/固定输入,前向传播+反向传播训练
- 目标:分类、回归、特征提取,面向计算机视觉、NLP
而 SNN 是脉冲驱动的仿生网络:
- 用**离散脉冲(尖峰信号)**传递信息,模仿生物神经元放电
- 依赖时间维度(脉冲发放时刻、频率、时序),是时空动态网络
- 激活、编码、学习规则和 ANN 完全不同
两者底层计算逻辑不互通,传统课顺着 ANN 往下讲,自然不会切入 SNN。
2. 训练方式非主流,反向传播不再通用
传统机器学习核心是梯度下降 + 反向传播,整套理论、推导、代码都是围绕它搭建。
SNN 天然有两个难点:
- 脉冲是不可导的离散事件,标准 BP 直接失效
- 主流是生物启发学习规则:STDP(脉冲时序依赖可塑性),不是梯度下降
传统课程不会额外花大篇幅讲一套全新的学习理论,课时和知识体系都不允许。
3. 应用场景窄,工业落地远不如 ANN
传统课程优先教工程能用、就业主流的技术:
- ANN/CNN/Transformer:图像、语音、大模型、推荐、风控,工业遍地都是
- SNN 目前主打:类脑计算、低功耗边缘设备、神经形态硬件、仿生机器人
这些属于小众前沿方向,不是通用机器学习岗位必备技能,通识课不会重点覆盖。
4. 历史发展路线不同
- 传统机器学习脉络:感知机 → 多层感知机 → CNN/RNN → 深度学习大爆发
- SNN 属于计算神经科学 + 类脑工程分支,起源于神经生物学,不是从传统ANN演化来的
早期神经网络研究分两条线:
- 工程派:简化生物,追求性能 → 现在主流深度学习
- 仿生派:还原生物神经元 → SNN、类脑计算
普通机器学习课走工程派主线,跳过了仿生分支。
5. 入门门槛更高,数学更偏时域+神经动力学
SNN 需要额外知识:
- 神经元膜电位动力学(微分方程)
- 脉冲编码(速率编码、时间编码、相位编码)
- 时序信号、神经形态学
- 硬件(神经形态芯片,如Intel Loihi、天机芯)
传统课侧重线性代数、概率、静态优化,不涉及时域动力学,强行加入会大幅提升学习难度。
6. 课程定位:通识 vs 前沿专题
- 本科/通识机器学习:覆盖基础、经典算法、工业主流
- SNN 一般出现在:
- 研究生类脑计算、神经形态工程、计算神经科学选修课
- 前沿AI专题、低功耗AI、仿生智能方向
简单类比理解
- 传统ANN:像数字电路,稳定、通用、好上手、到处在用
- SNN:像模仿人脑的神经电路,仿生、低功耗、时序驱动、偏前沿科研
普通“电路课”只讲数字电路,不会专门讲仿生神经电路,道理完全一样。
如果是想入门SNN,我可以给你整理一条从传统ANN过渡到SNN的学习路线。
这里给你一套由浅入深、衔接传统机器学习/深度学习的SNN入门路线,分阶段安排,配套核心知识点、学习顺序、工具与实践,兼顾理论+代码。
一、前置基础(先补齐,避免卡壳)
1. 必学先修(传统知识复用)
- 深度学习基础:MLP、反向传播、梯度下降、激活函数
- 微分方程基础:常微分方程(ODE)、简单动力学(SNN神经元核心是膜电位动态变化)
- 时序信号基础:信号采样、时域特征、序列处理
2. 生物神经极简认知(不用深挖生物学)
只需理解3个核心概念:
- 神经元膜电位:累积输入、达到阈值就发放脉冲(Spike)
- 不应期:发放脉冲后短暂无法再次放电
- 突触可塑性:突触权重随脉冲时序改变(对应网络“学习”)
二、第一阶段:SNN 核心概念 & 神经元模型(入门核心)
目标:分清SNN和ANN的本质区别,看懂基础神经元公式
1. 核心概念逐个突破
- 脉冲编码(SNN输入输出的关键)
- 速率编码(最常用):用单位时间脉冲数量表示数值
- 时间编码:用脉冲发放时刻传递信息
- 相位编码(进阶)
- 时间维度:SNN是时空网络,输入是「帧+时间步」,不再是静态张量
2. 主流神经元模型(按学习优先级排序)
从易到难,优先掌握前2个:
- LIF 泄漏积分发放神经元(Leaky Integrate-and-Fire) ✅ 工业/科研最常用,公式简单,入门首选 掌握:膜电位积分、漏电、阈值触发脉冲、重置、不应期
- IF 积分发放神经元:LIF简化版,无漏电,用来理解基础逻辑
- 进阶(后期再学):Izhikevich、HH 神经元(偏神经动力学)
3. 学习规则
- STDP 脉冲时序依赖可塑性 生物启发无梯度学习:前后神经元脉冲的时间差决定权重增减
- 现代主流改造:基于梯度的SNN训练(把SNN适配BP,衔接传统深度学习)
本阶段任务
- 手写LIF神经元公式,模拟单神经元脉冲发放过程
- 实现:把一张静态图片,用速率编码转为脉冲序列
三、第二阶段:SNN 训练方法(重中之重,衔接ANN)
传统课只教BP,SNN分两大流派,按工程实用度学习:
流派1:ANN → SNN 转换法(上手最快,推荐先学)
思路:训练成熟的ANN,直接转换成等价SNN
- 原理:ReLU激活 ≈ LIF速率编码稳态输出
- 优点:不用重新学训练逻辑,复用原有CNN/模型权重,工业低功耗部署首选
- 学习要点:转换规则、权重缩放、时间步选择、精度损失补偿
流派2:直接训练 SNN(原生SNN训练,科研主流)
解决脉冲不可导问题的主流方案:
- 代理梯度(Surrogate Gradient) 目前学术界标配:用近似可导函数替代脉冲阶跃函数,依旧使用反向传播 → 这是和传统深度学习衔接最紧密的路线,重点掌握
- 纯生物学习:STDP、R-STDP(无梯度,偏类脑硬件)
流派3:混合架构
SNN + ANN 结合、脉冲CNN、脉冲ResNet等,基于上面两种方法拓展。
四、第三阶段:网络结构 & 经典模型
在ANN结构基础上改造,循序渐进:
- 基础:脉冲全连接网络(SNN-MLP)
- 主流:脉冲卷积网络 S-CNN(图像任务最常用)
- 时序拓展:脉冲循环网络 S-RNN、脉冲Transformer(前沿)
- 轻量化/低功耗:针对边缘设备的SNN优化(剪枝、量化)
典型任务练手(由易到难)
- 静态图像分类(MNIST → CIFAR10,SNN最经典入门任务)
- 动态手势、音频、动作识别(发挥SNN时序优势)
- 事件相机(Event Camera) 数据处理(SNN天然适配场景)
五、第四阶段:硬件 & 高阶方向(按需选择)
如果偏向科研/类脑计算再深入,工程应用可暂时跳过:
- 神经形态硬件:Intel Loihi、清华天机芯、类脑芯片基本概念
- 低功耗优化:SNN相比ANN的能效优势、硬件部署
- 前沿方向:SNN大模型、脉冲自监督学习、仿生机器人、脑机接口
六、工具栈(直接上手,不用重复造轮子)
1. 主流开源框架(按推荐度)
- SpikingJelly(国内首选,中文文档友好,教程全) 基于PyTorch,完美衔接深度学习生态,入门首选
- BindsNET:纯STDP、神经动力学方向
- PyTorch + 手写LIF:想深入底层,自己实现神经元与代理梯度
2. 数据集
- 静态转脉冲:MNIST、CIFAR10(用编码生成脉冲数据)
- 原生脉冲数据集:N-MNIST、DVS-Gesture(事件相机数据)
七、分阶段学习时间表(参考)
第1周:基础认知 + LIF神经元
看懂模型公式,单神经元脉冲仿真,静态数据转脉冲编码
第2周:ANN转SNN + 简单SNN-MLP
用训练好的PyTorch MLP转SNN,跑通MNIST分类
第3~4周:代理梯度 + S-CNN原生训练
实现脉冲卷积网络,用代理梯度+BP训练,对比ANN精度
1~2个月:进阶
事件相机任务、STDP、轻量化、硬件相关知识
八、入门推荐资料(精简不堆砌)
1. 文档/教程
- SpikingJelly 官方文档 & 示例代码(优先):实战最强
- 《Neuromorphic Computing: From Circuits to Systems》(偏基础理论)
2. 论文(入门必读经典)
- Surrogate Gradient Learning in Spiking Neural Networks(代理梯度综述,必看)
- Conversion of Artificial Neural Networks to Spiking Neural Networks(ANN转SNN经典)
3. 视频
B站搜:脉冲神经网络 / SNN 入门,很多基于SpikingJelly的实战教程
起步建议(第一步就做这个)
- 打开PyTorch,先手写一个最简LIF神经元,跑单神经元脉冲模拟;
- 用速率编码把MNIST图片转成脉冲序列;
- 用SpikingJelly跑官方MNIST SNN示例,跑通第一个实验。
接下来你想先从理论公式入手,还是直接上手代码实战?我可以对应给你最简示例。
那我直接给你最简单、能立刻跑通、零门槛上手 SNN 的第一段代码,基于 PyTorch + SpikingJelly(国内最友好、最容易入门的 SNN 框架)。
你复制就能跑,不用管复杂理论,先跑通再说!
第一步:安装环境(1 行命令)
pip install spikingjelly torch torchvision
第二步:复制运行 → 你的第一个 SNN 模型
这是训练 SNN 做 MNIST 手写数字分类,最经典入门任务:
import torch
import torch.nn as nn
from torch.utils.data import DataLoader
from torchvision import datasets, transforms
import spikingjelly.clock_driven as snn
# 超参数
time_step = 10 # SNN 时间步(模拟生物脉冲时序)
batch_size = 64
lr = 1e-3
epochs = 3
# 数据加载(MNIST)
transform = transforms.ToTensor()
train_dataset = datasets.MNIST('./data', train=True, download=True, transform=transform)
train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
# 构建 SNN 网络(脉冲全连接网络)
class SNN(nn.Module):
def __init__(self):
super().__init__()
# 层
self.fc1 = nn.Linear(784, 128)
self.lif1 = snn.neuron.LIFNode() # 脉冲神经元(核心!)
self.fc2 = nn.Linear(128, 64)
self.lif2 = snn.neuron.LIFNode()
self.fc3 = nn.Linear(64, 10)
self.lif3 = snn.neuron.LIFNode()
def forward(self, x):
# SNN 需要在时间维度上展开
out = x.view(-1, 784)
# 第1层
out = self.fc1(out)
out = self.lif1(out.unsqueeze(0).repeat(time_step, 1, 1)) # 增加时间步
# 第2层
out = self.fc2(out)
out = self.lif2(out)
# 输出层
out = self.fc3(out)
out = self.lif3(out)
# 对时间步取平均得到最终预测
return out.mean(0)
# 模型、优化器、损失
model = SNN()
optimizer = torch.optim.Adam(model.parameters(), lr=lr)
loss_fn = nn.CrossEntropyLoss()
# 训练
model.train()
for epoch in range(epochs):
total_loss = 0
for img, label in train_loader:
optimizer.zero_grad()
output = model(img)
loss = loss_fn(output, label)
loss.backward()
optimizer.step()
total_loss += loss.item()
print(f"Epoch {epoch+1}, Loss: {total_loss/len(train_loader):.4f}")
# 测试一张图
model.eval()
img, label = train_dataset[0]
with torch.no_grad():
pred = model(img).argmax(1)
print(f"真实标签: {label}, 预测标签: {pred.item()}")
你只需要知道 3 个关键点
-
LIFNode
就是 SNN 的核心:脉冲神经元,像生物脑细胞一样放电。 -
time_step
SNN 是时序网络,需要在时间轴上跑多步,模拟脉冲传递。 -
训练方式和 ANN 几乎一样
用的还是:- 反向传播
- 梯度下降
- Adam + CrossEntropy
→ 你之前学的深度学习知识 100% 能用!
跑通之后,我可以带你继续:
-
手写 LIF 神经元公式(理解SNN本质)
-
把 ANN 转成 SNN(不用重新训练)
-
训练 SCNN 脉冲卷积网络(图像更强)
-
做 事件相机/动态手势识别(SNN 最强应用)