1、基本概念
脉冲神经网络(Spiking Neural Network, SNN )是第三代神经网络,最接近人脑的工作方式,和我们常用的 卷积神经网络CNN和循环神经网络RNN(第二代)有本质区别。脉冲神经网络:模仿人脑神经元不连续放电,只在电位累积到阈值时,发出一个脉冲(0/1 信号),所以平时不耗电。
脉冲神经网络就是用来类脑计算的,人脑相对GPU卡来说,具有算力高、功耗低(相当于耗电功率20W )和计算快的特点。神经元 是大脑的基本功能单位,人脑中大约有860亿个神经元。突触是神经元之间的连接桥梁,人脑中的突触数量大概有100亿个。
SNN的基本计算单元是脉冲神经元,其活动以离散的脉冲形式进行。不同于传统神经元的连续激活值,脉冲神经元通过发放脉冲来传递信息,模拟生物神经元的行为。经过多年发展,已建立了多种脉冲神经元模型,如H-H模型、LIF模型、Izhikevich 模型和脉冲响应模型(SRM)等
1)脉冲神经网络三要素:
膜电位 :神经元内部的电压,随输入累积
阈值 :电压超过阈值,神经元发放脉冲(spike=1)
重置:发放后电压归零,等待下一次累积
2)SNN 最大特点:
事件驱动 :只有发放脉冲时才计算,超低功耗
带时间信息 :天然处理时序信号(语音、雷达、视觉动态)
仿生:最接近生物大脑的神经网络
2、简单举例
SNN 最常用、最简单的神经元模型LIF:Leaky Integrate-and-Fire(漏电流整合 - 发放)
规则:
1)输入电流 → 膜电位慢慢上升
2)膜电位 超过阈值 → 发出一个脉冲
3)发出脉冲后 → 膜电位重置为 0
没输入时 → 膜电位会慢慢泄漏(衰减)
实现代码如下:
python
import numpy as np
import matplotlib.pyplot as plt
# ====================== 1. 定义 LIF 神经元类 ======================
class LIFNeuron:
def __init__(self, threshold=1.0, reset_potential=0.0, leak=0.1):
# 神经元参数
self.threshold = threshold # 放电阈值
self.reset_potential = reset_potential # 放电后重置电位
self.leak = leak # 漏电系数(电位衰减)
# 神经元状态
self.membrane_potential = 0.0 # 膜电位(初始为0)
def forward(self, input_current):
"""
一步更新:输入电流 → 更新膜电位 → 判断是否放电
返回:是否发放脉冲(True/False)
"""
# 1. 漏电:膜电位衰减
self.membrane_potential *= (1 - self.leak)
# 2. 整合:加入输入电流
self.membrane_potential += input_current
# 3. 判断是否放电
if self.membrane_potential >= self.threshold:
# 发放脉冲
spike = 1
# 放电后重置电位
self.membrane_potential = self.reset_potential
else:
# 不放电
spike = 0
return spike
# ====================== 2. 模拟信号与运行 ======================
if __name__ == "__main__":
# 创建神经元
neuron = LIFNeuron(threshold=1.0, leak=0.1)
# 模拟时间步(20步)
time_steps = 20
# 输入电流:前10步给0.2,后10步给0(测试累积放电)
input_currents = [0.2] * 10 + [0.0] * 10
# 记录数据
potentials = [] # 膜电位记录
spikes = [] # 脉冲记录
# 逐时间步运行
for current in input_currents:
spike = neuron.forward(current)
spikes.append(spike)
potentials.append(neuron.membrane_potential)
# ====================== 3. 绘图可视化 ======================
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.figure(figsize=(10, 6))
# 子图1:输入电流
plt.subplot(3,1,1)
plt.plot(input_currents, 'b-', label='输入电流')
plt.ylabel('电流')
plt.legend()
plt.grid(True)
# 子图2:膜电位
plt.subplot(3,1,2)
plt.plot(potentials, 'r-', label='膜电位')
plt.axhline(y=1.0, color='k', linestyle='--', label='放电阈值')
plt.ylabel('电位')
plt.legend()
plt.grid(True)
# 子图3:脉冲输出
plt.subplot(3,1,3)
plt.stem(spikes, 'g-', label='输出脉冲', basefmt=" ")
plt.xlabel('时间步')
plt.ylabel('脉冲')
plt.legend()
plt.grid(True)
plt.tight_layout()
plt.show()
该程序包含:1 个输入、1 个 LIF 神经元、模拟时间序列信号和观察神经元膜电位变化 + 脉冲发放。
,运行结果如下:

由上图可看出:
第1张图表示输入电流:前 10 步有电流,后 10 步无
第2张图表示膜电位 :慢慢累积,超过阈值立刻放电并归零
第3张图表示输出脉冲:只有放电时输出 1,其余为 0
3、总结
SNN = 第三代神经网络,模仿人脑神经元放电机制。核心:膜电位累积 → 超过阈值 → 发放脉冲 → 重置。最简单模型:LIF 神经元(漏电 + 整合 + 发放),上面的代码是 SNN 最小可用实现,能直观看到脉冲生成。