4、神经形态计算基础:脉冲神经网络(SNN)简介、LIF神经元模型、突触可塑性

4.1 从传统神经网络到脉冲神经网络

做视觉仿生系统,绕不开一个核心问题:生物神经元到底是怎么工作的?

传统的人工神经网络(ANN)用连续激活值来模拟神经元。比如ReLU、Sigmoid,输入一个实数,输出一个实数。这很数学,也很方便。但说实话,跟真实的生物神经元比起来,它简化得太多了。

生物神经元传递信息靠的是脉冲(Spike)。一个神经元在某个时刻“放电”了,就产生一个脉冲。不放电,就没有。信息编码在脉冲的时间频率里,而不是在连续的数值里。

这就是脉冲神经网络(SNN)的出发点。它更贴近生物机制,也天然适合处理时空信息——比如视频流、触觉序列、听觉信号。我在做视觉仿生项目时,一开始用传统CNN处理动态视觉传感器(DVS)的数据,效果总是不理想。后来换成SNN,才真正体会到“时间维度”带来的优势。

核心区别一句话总结:

  • ANN:用连续值传递信息,计算密集,功耗高
  • SNN:用离散脉冲传递信息,事件驱动,功耗极低

你想想看,一个SNN神经元大部分时间都在“静默”,只有收到足够多的输入脉冲时才放电。这种稀疏计算特性,让SNN在硬件实现上天然省电。这也是为什么神经形态芯片(比如Intel的Loihi、IBM的TrueNorth)都采用SNN架构。

4.2 LIF神经元模型:最经典的脉冲神经元

SNN里最常用的神经元模型,就是LIF(Leaky Integrate-and-Fire)模型。名字有点长,但拆开看就很好理解:

  • Leaky(泄漏):膜电位会随时间自然衰减,就像水桶有个小洞
  • Integrate(积分):输入脉冲不断累积,膜电位逐渐升高
  • Fire(放电):膜电位超过阈值,就产生一个输出脉冲,然后复位

嗯,说白了就是一个带泄漏的积分器,加上一个阈值比较器。

4.2.1 LIF模型的数学描述

LIF模型的微分方程很简单:

τ * dV/dt = - (V - V_rest) + R * I(t)

其中:

  • V:膜电位
  • V_rest:静息电位(通常设为0或-70mV)
  • τ:膜时间常数,控制泄漏速度
  • R:膜电阻
  • I(t):输入电流(来自其他神经元的脉冲)

V >= V_th(阈值)时,神经元放电,然后 V 立即复位到 V_reset

我在项目中遇到过一个问题:时间常数 τ 设得太小,神经元对输入过于敏感,动不动就放电;设得太大,又反应迟钝。后来我总结了一个经验——τ 通常设为输入脉冲间隔的2~5倍,这样既能累积信息,又不会过度泄漏。

4.2.2 离散化实现(代码示例)

实际编程时,我们需要把微分方程离散化。这里给一个简单的Python实现:

class LIFNeuron:
    def __init__(self, tau=10.0, v_rest=0.0, v_th=1.0, v_reset=0.0):
        self.tau = tau
        self.v_rest = v_rest
        self.v_th = v_th
        self.v_reset = v_reset
        self.v = v_rest  # 当前膜电位

    def step(self, I_input, dt=1.0):
        # 泄漏积分
        dv = (-(self.v - self.v_rest) + I_input) / self.tau * dt
        self.v += dv

        # 判断是否放电
        if self.v >= self.v_th:
            self.v = self.v_reset  # 复位
            return 1  # 产生脉冲
        else:
            return 0  # 无脉冲

这段代码虽然简单,但已经能跑通一个基本的LIF神经元了。我建议你动手跑一下,看看不同 tau 值对放电频率的影响。

避坑指南: 我曾经把 dt 设得太大(比如 dt=10),结果神经元直接跳过了阈值,永远不放电。离散化步长一定要小于时间常数,一般 dt 取 τ 的 1/10 到 1/5 比较安全。

4.3 突触可塑性:SNN的学习机制

有了神经元,还得有学习规则。SNN的学习跟ANN很不一样——你不能直接用反向传播,因为脉冲的“放电”操作不可微。

突触可塑性,说白了就是神经元之间的连接权重怎么调整。最经典的规则是STDP(Spike-Timing-Dependent Plasticity,脉冲时序依赖可塑性)

4.3.1 STDP的核心思想

STDP的规则非常直观:

  • 如果前突触神经元先放电,后突触神经元后放电(即前→后),说明前一个神经元对后一个神经元的放电有贡献,权重增强(长时程增强,LTP)
  • 如果后突触神经元先放电,前突触神经元后放电(即后→前),说明前一个神经元“迟到”了,权重减弱(长时程抑制,LTD)

用数学公式表示就是:

Δw = 
  A_plus * exp(-Δt / τ_plus)   如果 Δt > 0(前→后)
  -A_minus * exp(Δt / τ_minus) 如果 Δt < 0(后→前)

其中 Δt = t_post - t_pre,即前后脉冲的时间差。

你想想看,这个规则多符合直觉:“你先触发了我,我就加强联系;你后触发我,我就减弱联系”。生物实验也证实了这一点。

4.3.2 我在项目中用STDP踩过的坑

我曾经在一个手势识别项目里用STDP训练SNN。一开始权重发散得厉害,神经元要么全放电,要么全静默。后来发现是 A_plusA_minus 的比例没调好。

我的经验是:抑制系数(A_minus)通常要比增强系数(A_plus)大10%~20%。这样能防止权重无限增长,保持网络稳定。另外,时间常数 τ_plusτ_minus 一般设为10~20ms,跟生物神经元的脉冲宽度一致。

注意: STDP是无监督学习规则。它只根据脉冲时序调整权重,不需要标签。如果你想做分类任务,通常需要在SNN顶层加一个读出层,用监督信号去微调。

4.4 本章知识体系总览

下面这张图总结了本章的核心逻辑:

神经形态计算基础:知识体系 SNN简介 LIF神经元模型 突触可塑性 事件驱动 · 稀疏计算 泄漏积分 · 阈值放电 STDP · 时序依赖 核心逻辑: 生物脉冲编码 → LIF神经元累积/放电 → STDP调整突触权重 典型应用:动态视觉传感器(DVS)处理 · 触觉序列识别 · 低功耗边缘计算

4.5 小结与个人体会

SNN和LIF模型,说白了就是用时间换精度,用稀疏换功耗。它不像ANN那样能轻松达到99%的准确率,但在低功耗、实时性要求高的场景下,SNN有不可替代的优势。

我个人习惯在做视觉仿生系统时,先用LIF神经元搭一个基础SNN,然后用STDP做无监督预训练,最后用少量标注数据做监督微调。这样既保留了SNN的时序特性,又解决了纯STDP分类精度不够的问题。

嗯,这一章的内容就到这里。记住:脉冲是语言,时间是载体,可塑性是灵魂。搞懂了这三样,神经形态计算的大门就算敲开了。

关键概念速查表:

概念一句话解释我的经验值
SNN用脉冲(0/1)传递信息的神经网络适合DVS、触觉等时空数据
LIF带泄漏的积分-放电神经元模型τ设为脉冲间隔的2~5倍
STDP根据脉冲时序调整突触权重A_minus比A_plus大10%~20%

公众号:蓝海资料掘金营,微信deep3321