为什么传统机器学习课程很少讲 **SNN(脉冲神经网络 Spiking Neural Network)

3 阅读10分钟

为什么传统机器学习课程很少讲 SNN(脉冲神经网络 Spiking Neural Network)

一句话总结:SNN 不属于传统机器学习/深度学习主线,定位、范式、应用、门槛都和主流体系脱节,所以常规课基本不涉及。

1. 范式完全不一样,不属于“主流深度学习”

传统课程讲的是人工神经网络 ANN(CNN、MLP、RNN、Transformer):

  • 连续模拟值做计算(0~1、实数)
  • 基于静态帧/固定输入,前向传播+反向传播训练
  • 目标:分类、回归、特征提取,面向计算机视觉、NLP

SNN 是脉冲驱动的仿生网络

  • 用**离散脉冲(尖峰信号)**传递信息,模仿生物神经元放电
  • 依赖时间维度(脉冲发放时刻、频率、时序),是时空动态网络
  • 激活、编码、学习规则和 ANN 完全不同

两者底层计算逻辑不互通,传统课顺着 ANN 往下讲,自然不会切入 SNN。

2. 训练方式非主流,反向传播不再通用

传统机器学习核心是梯度下降 + 反向传播,整套理论、推导、代码都是围绕它搭建。

SNN 天然有两个难点:

  1. 脉冲是不可导的离散事件,标准 BP 直接失效
  2. 主流是生物启发学习规则:STDP(脉冲时序依赖可塑性),不是梯度下降

传统课程不会额外花大篇幅讲一套全新的学习理论,课时和知识体系都不允许。

3. 应用场景窄,工业落地远不如 ANN

传统课程优先教工程能用、就业主流的技术:

  • ANN/CNN/Transformer:图像、语音、大模型、推荐、风控,工业遍地都是
  • SNN 目前主打:类脑计算、低功耗边缘设备、神经形态硬件、仿生机器人

这些属于小众前沿方向,不是通用机器学习岗位必备技能,通识课不会重点覆盖。

4. 历史发展路线不同

  • 传统机器学习脉络:感知机 → 多层感知机 → CNN/RNN → 深度学习大爆发
  • SNN 属于计算神经科学 + 类脑工程分支,起源于神经生物学,不是从传统ANN演化来的

早期神经网络研究分两条线:

  1. 工程派:简化生物,追求性能 → 现在主流深度学习
  2. 仿生派:还原生物神经元 → SNN、类脑计算

普通机器学习课走工程派主线,跳过了仿生分支。

5. 入门门槛更高,数学更偏时域+神经动力学

SNN 需要额外知识:

  • 神经元膜电位动力学(微分方程)
  • 脉冲编码(速率编码、时间编码、相位编码)
  • 时序信号、神经形态学
  • 硬件(神经形态芯片,如Intel Loihi、天机芯)

传统课侧重线性代数、概率、静态优化,不涉及时域动力学,强行加入会大幅提升学习难度。

6. 课程定位:通识 vs 前沿专题

  • 本科/通识机器学习:覆盖基础、经典算法、工业主流
  • SNN 一般出现在:
    • 研究生类脑计算、神经形态工程、计算神经科学选修课
    • 前沿AI专题、低功耗AI、仿生智能方向

简单类比理解

  • 传统ANN:像数字电路,稳定、通用、好上手、到处在用
  • SNN:像模仿人脑的神经电路,仿生、低功耗、时序驱动、偏前沿科研

普通“电路课”只讲数字电路,不会专门讲仿生神经电路,道理完全一样。

如果是想入门SNN,我可以给你整理一条从传统ANN过渡到SNN的学习路线

这里给你一套由浅入深、衔接传统机器学习/深度学习的SNN入门路线,分阶段安排,配套核心知识点、学习顺序、工具与实践,兼顾理论+代码。

一、前置基础(先补齐,避免卡壳)

1. 必学先修(传统知识复用)

  • 深度学习基础:MLP、反向传播、梯度下降、激活函数
  • 微分方程基础:常微分方程(ODE)、简单动力学(SNN神经元核心是膜电位动态变化)
  • 时序信号基础:信号采样、时域特征、序列处理

2. 生物神经极简认知(不用深挖生物学)

只需理解3个核心概念:

  1. 神经元膜电位:累积输入、达到阈值就发放脉冲(Spike)
  2. 不应期:发放脉冲后短暂无法再次放电
  3. 突触可塑性:突触权重随脉冲时序改变(对应网络“学习”)

二、第一阶段:SNN 核心概念 & 神经元模型(入门核心)

目标:分清SNN和ANN的本质区别,看懂基础神经元公式

1. 核心概念逐个突破

  1. 脉冲编码(SNN输入输出的关键)
    • 速率编码(最常用):用单位时间脉冲数量表示数值
    • 时间编码:用脉冲发放时刻传递信息
    • 相位编码(进阶)
  2. 时间维度:SNN是时空网络,输入是「帧+时间步」,不再是静态张量

2. 主流神经元模型(按学习优先级排序)

从易到难,优先掌握前2个:

  1. LIF 泄漏积分发放神经元(Leaky Integrate-and-Fire) ✅ 工业/科研最常用,公式简单,入门首选 掌握:膜电位积分、漏电、阈值触发脉冲、重置、不应期
  2. IF 积分发放神经元:LIF简化版,无漏电,用来理解基础逻辑
  3. 进阶(后期再学):Izhikevich、HH 神经元(偏神经动力学)

3. 学习规则

  1. STDP 脉冲时序依赖可塑性 生物启发无梯度学习:前后神经元脉冲的时间差决定权重增减
  2. 现代主流改造:基于梯度的SNN训练(把SNN适配BP,衔接传统深度学习)

本阶段任务

  • 手写LIF神经元公式,模拟单神经元脉冲发放过程
  • 实现:把一张静态图片,用速率编码转为脉冲序列

三、第二阶段:SNN 训练方法(重中之重,衔接ANN)

传统课只教BP,SNN分两大流派,按工程实用度学习:

流派1:ANN → SNN 转换法(上手最快,推荐先学)

思路:训练成熟的ANN,直接转换成等价SNN

  • 原理:ReLU激活 ≈ LIF速率编码稳态输出
  • 优点:不用重新学训练逻辑,复用原有CNN/模型权重,工业低功耗部署首选
  • 学习要点:转换规则、权重缩放、时间步选择、精度损失补偿

流派2:直接训练 SNN(原生SNN训练,科研主流)

解决脉冲不可导问题的主流方案:

  1. 代理梯度(Surrogate Gradient) 目前学术界标配:用近似可导函数替代脉冲阶跃函数,依旧使用反向传播 → 这是和传统深度学习衔接最紧密的路线,重点掌握
  2. 纯生物学习:STDP、R-STDP(无梯度,偏类脑硬件)

流派3:混合架构

SNN + ANN 结合、脉冲CNN、脉冲ResNet等,基于上面两种方法拓展。


四、第三阶段:网络结构 & 经典模型

在ANN结构基础上改造,循序渐进:

  1. 基础:脉冲全连接网络(SNN-MLP)
  2. 主流:脉冲卷积网络 S-CNN(图像任务最常用)
  3. 时序拓展:脉冲循环网络 S-RNN、脉冲Transformer(前沿)
  4. 轻量化/低功耗:针对边缘设备的SNN优化(剪枝、量化)

典型任务练手(由易到难)

  1. 静态图像分类(MNIST → CIFAR10,SNN最经典入门任务)
  2. 动态手势、音频、动作识别(发挥SNN时序优势)
  3. 事件相机(Event Camera) 数据处理(SNN天然适配场景)

五、第四阶段:硬件 & 高阶方向(按需选择)

如果偏向科研/类脑计算再深入,工程应用可暂时跳过:

  1. 神经形态硬件:Intel Loihi、清华天机芯、类脑芯片基本概念
  2. 低功耗优化:SNN相比ANN的能效优势、硬件部署
  3. 前沿方向:SNN大模型、脉冲自监督学习、仿生机器人、脑机接口

六、工具栈(直接上手,不用重复造轮子)

1. 主流开源框架(按推荐度)

  1. SpikingJelly(国内首选,中文文档友好,教程全) 基于PyTorch,完美衔接深度学习生态,入门首选
  2. BindsNET:纯STDP、神经动力学方向
  3. 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. 论文(入门必读经典)

  1. Surrogate Gradient Learning in Spiking Neural Networks(代理梯度综述,必看)
  2. Conversion of Artificial Neural Networks to Spiking Neural Networks(ANN转SNN经典)

3. 视频

B站搜:脉冲神经网络 / SNN 入门,很多基于SpikingJelly的实战教程


起步建议(第一步就做这个)

  1. 打开PyTorch,先手写一个最简LIF神经元,跑单神经元脉冲模拟;
  2. 用速率编码把MNIST图片转成脉冲序列;
  3. 用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 个关键点

  1. LIFNode
    就是 SNN 的核心:脉冲神经元,像生物脑细胞一样放电。

  2. time_step
    SNN 是时序网络,需要在时间轴上跑多步,模拟脉冲传递。

  3. 训练方式和 ANN 几乎一样
    用的还是:

    • 反向传播
    • 梯度下降
    • Adam + CrossEntropy
      你之前学的深度学习知识 100% 能用!

跑通之后,我可以带你继续:

  • 手写 LIF 神经元公式(理解SNN本质)

  • ANN 转成 SNN(不用重新训练)

  • 训练 SCNN 脉冲卷积网络(图像更强)

  • 事件相机/动态手势识别(SNN 最强应用)