浅谈脉冲神经网络
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
没输入时 → 膜电位会慢慢泄漏(衰减)
实现代码如下:
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 最小可用实现,能直观看到脉冲生成。
