浅谈脉冲神经网络

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 最小可用实现,能直观看到脉冲生成。