Hebb 学习算法:从局部规则到特征提取

Lesson 0003  ·  2025-06-15  ·  约30分钟  ·  前置:0002 Hebb & STDP
本课目标:彻底理解为什么 Hebb 学习能从数据中提取特征。从数学上解释"局部规则 + 统计结构 → 特征涌现"的机制,亲手运行多神经元竞争学习,看到它们各自抢到不同的主成分。

1. 回顾:你在 0002 看到了什么

一个线性神经元,权重 w,输入 x。每次呈现一个数据点,用 Oja 规则更新:

y = w·x   →   Δw = η · y · (x − y · w)

几千次迭代后,w 收敛到数据的第一主成分(PC1)。

但为什么?"w 被数据推着走"这个直觉没错,但它掩藏了精确的数学机制。不理解这个机制,你就无法理解多神经元竞争、深层特征提取、以及这些与反向传播的深层联系。

2. 把局部规则写成整体统计

单次更新看起来是局部的:

Δw = η · (w·x) · x = η · (xxᵀ) · w

这里 xxᵀ 是一个 2×2 外积矩阵(以 2D 输入为例)。每个数据点给出一瞬间的"推力"——沿 x 方向推 w,推力大小正比于 w 在 x 方向上的投影。

对 N 个数据点取平均(等价于在整个数据集上训练一轮):

E[Δw] ∝ E[xxᵀ] · w = C · w

其中 C = E[xxᵀ] 是输入数据的协方差矩阵(假设零均值)。

关键公式:E[Δw] ∝ C · w。平均更新方向 = 协方差矩阵 × 当前权重。这不是设计出来的——它是"每个局部 Δw = η·y·x 都包含 xxᵀ"这个事实自然推导出的结果。

3. 为什么 w 会收敛到主成分:幂迭代

核心:反复做 w ← w + η·C·w 等价于幂迭代(power iteration)——数值线性代数中求最大特征向量的标准算法。

幂迭代的步骤:

wt+1 = C · wt   (然后归一化)

把 w₀ 用 C 的特征向量展开:w₀ = Σᵢ αᵢ · eᵢ(其中 C·eᵢ = λᵢ·eᵢ,λᵢ 按降序排列)。

做 k 次 C 的乘法:

wk = Cᵏ · w₀ = Σᵢ αᵢ · λᵢᵏ · eᵢ
= λ₁ᵏ · [ α₁·e₁ + α₂·(λ₂/λ₁)ᵏ·e₂ + α₃·(λ₃/λ₁)ᵏ·e₃ + ... ]

当 k 很大时:

这就是"特征提取"的数学本质:Hebb 学习 = 随机梯度上升 on wᵀCw(Rayleigh 商)。协方差矩阵的第一特征向量就是使输出方差最大化的方向——Hebb 学习在做的事,等价于最大化神经元输出的方差。这个神经元"喜欢"的是使它最兴奋的输入模式。

既然等价于 PCA,为什么不直接做 SVD?

这是一个正确的问题,答案揭示了类脑计算存在的根本理由。

需求SVD / 批量 PCAHebb / Oja(在线 PCA)
需要看到全部数据 是——必须先算协方差矩阵 C = (1/N)·XᵀX 否——来一个样本学一步,不需要存任何历史数据
空间复杂度 O(D²)——对 D=10⁶ 的图像,协方差矩阵有 10¹² 个条目 O(k·D)——只存 k 个神经元的权重向量
新数据到来时 必须重算整个 SVD 继续迭代即可——自然支持在线学习
数据分布随时间变化 无法跟踪——算出来的是"过去"的主成分 自然跟踪漂移——权重是持续更新的
分布式/边缘计算 需要汇总所有数据到一处 每个节点可以独立更新,适合去中心化
神经形态硬件 物理上不可能——芯片上的突触只能做局部更新 天然适合——Loihi、TrueNorth 等硬件原生支持
生物可实现 不可能——大脑没有全局协方差矩阵 完全可能——只需 pre 和 post 的局部信号
⚠ 实用建议:如果你在做 Kaggle 竞赛或离线数据分析——用 sklearn.decomposition.PCA,一行代码,比 Hebb 快 100 倍。不要自己写 Hebb 来做 PCA。

Hebb/PCA 算法的实际价值出现在:数据维度太高存不下协方差矩阵;数据持续流式到达;计算必须分布式/局部化(神经形态芯片);或者你在建模一个生物系统——你想知道大脑可能用什么机制来发现感官信号的结构,而不是"大脑怎么算 SVD 的"。

4. Oja 规则:自动归一化的精巧之处

纯 Hebb 规则 w ← w + η·C·w 会让 ∥w∥ → ∞(因为 λ₁ > 0 时每步都放大)。

Oja 规则(1982)的更新:

Δw = η · y · (x − y · w)

展开成统计:

E[Δw] ∝ C·w − (wᵀCw)·w

这个 −(wᵀCw)·w 项做了什么?精确抵消了 C·w 在 w 方向上的分量。可以证明:

⚠ 常见误区:"Oja 规则 = Hebb + L2 正则化"。不是。L2 正则化是 −λ·w(固定系数衰减)。Oja 的衰减项是 −η·y²·w——衰减强度与输出的平方成正比。输出大时衰减强,输出小时衰减弱。这是自适应的归一化,不是固定的惩罚。

5. 多神经元竞争:从 PC1 到完整 PCA

单个神经元 → PC1。如何提取 PC2、PC3?

直观:第二个神经元应该学习"第一个神经元没学的部分"。数学上,就是让第二个神经元的权重与前一个正交。这可以通过侧抑制(lateral inhibition)实现。

Sanger 规则(Generalized Hebbian Algorithm, 1989):

yi = wi·x   (第 i 个神经元的响应)
Δwi = η · yi · (x − Σj≤i yj·wj)

注意括号里的 Σj≤i yj·wj:第 i 个神经元在学习时,要减去前面所有神经元已经学到的部分。

这本质上是Gram-Schmidt 正交化的在线版本——权重自动收敛到互相正交的方向,且按特征值降序排列。

与反向传播的深层联系:Sanger 规则的 Σj≤i yj·wj 看起来像某种"误差信号"。但它是层内的——不需要从输出层反传。这暗示了一种可能:大脑可能通过层内竞争 + 层间前馈的组合,近似了需要反向传播才能做的事。

6. 交互:多神经元竞争学习——看它们抢方向

实验目标:观察 3 个神经元在同一个 2D 数据云上竞争。每个箭头 = 一个神经元的权重向量。它们从随机方向出发,通过竞争 Hebb 学习,各自收敛到不同的主成分方向。

3-Neuron Competitive Hebbian Learning

Neuron 1 Neuron 2 Neuron 3 虚线 = 数据的主成分方向
迭代: 0 w₁ = (—, —) w₂ = (—, —) w₃ = (—, —)

观察要点:
① 点击"×200"几次 → 三个箭头从混乱中分离,各自指向不同方向
② Neuron 1(紫)通常收敛到数据主方向(45° 虚线)——它没有竞争者,抢到最好的
③ Neuron 2(蓝)收敛到次方向(−45° 虚线)——主方向被抢了,它被迫学剩下的
④ Neuron 3(红)在两个方向间摇摆或收敛到噪声方向——数据只有 2 个主成分,第 3 个是多余的
⑤ 调节 β=0.1(弱竞争)→ 多个神经元可能学同一个方向。β=1.0(强竞争)→ 强制分离
⑥ 核心直觉:竞争迫使不同神经元学习不同的特征——这是"分工"在神经系统中的体现

7. 从竞争到层级:多层 Hebb 学习如何堆叠

单层竞争 Hebb 学到的是第一层特征——对视觉来说,就是 Gabor-like 的边缘检测器(类似 V1 简单细胞)。

第二层怎么做?把第一层的输出(各主成分上的投影 y₁, y₂, y₃...)作为第二层的输入:

Layer 1: yi = wi·x   (提取边缘、方向等低级特征)
Layer 2: zj = vj·y   (在第一层特征的共现模式上再做 Hebb)

第二层 Hebb 学习提取的是"特征的特征":哪些边缘倾向于同时出现?哪些方向组合成角?哪些角组合成轮廓?

这产生了一个无监督的层级特征金字塔——不需要标签,每一层通过 Hebb/竞争提取上一层活动的统计结构。这与卷积网络惊人相似,但卷积网络用反向传播做,而这里用纯局部规则。

层级学到什么(视觉为例)对应脑区对应 CNN
Layer 1边缘方向、空间频率V1 简单细胞Conv1 滤波器
Layer 2角、曲率、纹理基元V2Conv2–3
Layer 3物体部件(眼睛、轮子)V4 / ITConv4–5
更高层完整物体、场景IT / 海马FC / classifier
来自使命的连接:这个无监督层级特征提取是智能系统的感知基础。一个智能体不能依赖标签来认识世界——它必须从原始感官信号中自己发现世界隐藏的结构(边缘、物体、因果关系)。Hebb/竞争学习提供了这个"自我发现"的最基本算法。后面学预测编码时,你会看到它把这个逻辑推广到了时间维度——不仅发现空间结构,还发现时序结构。

8. 小测验

Q1: 为什么 Hebb 学习的平均更新 E[Δw] ∝ C·w(C 是协方差矩阵)是理解特征提取的关键?
因为 C 包含了所有输入数据的标签信息
因为它揭示了局部规则在统计上等价于幂迭代——w 自然会收敛到 C 的最大特征向量
因为 C 是稀疏矩阵,计算效率高
因为它证明了 Hebb 学习等价于梯度下降
Q2: 在多神经元竞争学习中,Neuron 2 为什么不会学到和 Neuron 1 相同的方向?
因为 Neuron 2 的学习率被设得更小
因为侧抑制使 Neuron 2 必须学习减去 Neuron 1 已学部分后的残差——相当于 Gram-Schmidt 正交化
因为 Neuron 2 的初始权重总是与 Neuron 1 正交
因为数据被预处理去除了 PC1 分量
Q3: 为什么 2D 数据上的第 3 个竞争神经元会"摇摆不定"?
因为学习率太高导致不收敛
因为 2D 数据只有 2 个真实维度——PC3 的特征值几乎为零,没有稳定的"第三方向"可学
因为第 3 个神经元受到了前两个的过度抑制
因为竞争强度 β 设得太大

📖 推荐主源

Oja 原始论文: Oja (1982) — "A Simplified Neuron Model as a Principal Component Analyzer" 4 页的短论文,证明了单神经元 + Hebb + 归一化等价于 PCA。

Sanger 规则: Sanger (1989) — "Optimal Unsupervised Learning in a Single-Layer Linear Feedforward Neural Network" Generalized Hebbian Algorithm——多个神经元通过 Σj≤i 的侧抑制自动提取前 N 个主成分。

综述: PCA 神经网络综述 — Diamantaras & Kung 覆盖 Oja, Sanger, APEX 等所有基于 Hebb 学习的 PCA 网络。

🤖 提问提示:Sanger 规则中的 Σj≤i yj·wj 与反向传播中的 δ 信号有什么异同?为什么深层 Hebb 网络在实践中不如反向传播训练的 CNN?Foldiak 的 Hebb + 反 Hebb 模型是怎么回事?随时问。