Hebb 学习算法:从局部规则到特征提取
1. 回顾:你在 0002 看到了什么
一个线性神经元,权重 w,输入 x。每次呈现一个数据点,用 Oja 规则更新:
几千次迭代后,w 收敛到数据的第一主成分(PC1)。
但为什么?"w 被数据推着走"这个直觉没错,但它掩藏了精确的数学机制。不理解这个机制,你就无法理解多神经元竞争、深层特征提取、以及这些与反向传播的深层联系。
2. 把局部规则写成整体统计
单次更新看起来是局部的:
这里 xxᵀ 是一个 2×2 外积矩阵(以 2D 输入为例)。每个数据点给出一瞬间的"推力"——沿 x 方向推 w,推力大小正比于 w 在 x 方向上的投影。
对 N 个数据点取平均(等价于在整个数据集上训练一轮):
其中 C = E[xxᵀ] 是输入数据的协方差矩阵(假设零均值)。
3. 为什么 w 会收敛到主成分:幂迭代
核心:反复做 w ← w + η·C·w 等价于幂迭代(power iteration)——数值线性代数中求最大特征向量的标准算法。
幂迭代的步骤:
把 w₀ 用 C 的特征向量展开:w₀ = Σᵢ αᵢ · eᵢ(其中 C·eᵢ = λᵢ·eᵢ,λᵢ 按降序排列)。
做 k 次 C 的乘法:
= λ₁ᵏ · [ α₁·e₁ + α₂·(λ₂/λ₁)ᵏ·e₂ + α₃·(λ₃/λ₁)ᵏ·e₃ + ... ]
当 k 很大时:
- (λ₂/λ₁)ᵏ → 0,因为 λ₂ < λ₁
- 所有非主成分的分量以指数速度衰减
- 剩下的只有 e₁——第一主成分方向
既然等价于 PCA,为什么不直接做 SVD?
这是一个正确的问题,答案揭示了类脑计算存在的根本理由。
| 需求 | SVD / 批量 PCA | Hebb / Oja(在线 PCA) |
|---|---|---|
| 需要看到全部数据 | 是——必须先算协方差矩阵 C = (1/N)·XᵀX | 否——来一个样本学一步,不需要存任何历史数据 |
| 空间复杂度 | O(D²)——对 D=10⁶ 的图像,协方差矩阵有 10¹² 个条目 | O(k·D)——只存 k 个神经元的权重向量 |
| 新数据到来时 | 必须重算整个 SVD | 继续迭代即可——自然支持在线学习 |
| 数据分布随时间变化 | 无法跟踪——算出来的是"过去"的主成分 | 自然跟踪漂移——权重是持续更新的 |
| 分布式/边缘计算 | 需要汇总所有数据到一处 | 每个节点可以独立更新,适合去中心化 |
| 神经形态硬件 | 物理上不可能——芯片上的突触只能做局部更新 | 天然适合——Loihi、TrueNorth 等硬件原生支持 |
| 生物可实现 | 不可能——大脑没有全局协方差矩阵 | 完全可能——只需 pre 和 post 的局部信号 |
sklearn.decomposition.PCA,一行代码,比 Hebb 快 100 倍。不要自己写 Hebb 来做 PCA。Hebb/PCA 算法的实际价值出现在:数据维度太高存不下协方差矩阵;数据持续流式到达;计算必须分布式/局部化(神经形态芯片);或者你在建模一个生物系统——你想知道大脑可能用什么机制来发现感官信号的结构,而不是"大脑怎么算 SVD 的"。
4. Oja 规则:自动归一化的精巧之处
纯 Hebb 规则 w ← w + η·C·w 会让 ∥w∥ → ∞(因为 λ₁ > 0 时每步都放大)。
Oja 规则(1982)的更新:
展开成统计:
这个 −(wᵀCw)·w 项做了什么?精确抵消了 C·w 在 w 方向上的分量。可以证明:
- ∥w∥ → 1(收敛到单位长度)——自动归一化
- w 的方向 → e₁(C 的最大特征向量)——等价于幂迭代
- 不需要显式计算 C,不需要全局信息,完全是局部的 Δw = f(x, y, w)
5. 多神经元竞争:从 PC1 到完整 PCA
单个神经元 → PC1。如何提取 PC2、PC3?
直观:第二个神经元应该学习"第一个神经元没学的部分"。数学上,就是让第二个神经元的权重与前一个正交。这可以通过侧抑制(lateral inhibition)实现。
Sanger 规则(Generalized Hebbian Algorithm, 1989):
Δwi = η · yi · (x − Σj≤i yj·wj)
注意括号里的 Σj≤i yj·wj:第 i 个神经元在学习时,要减去前面所有神经元已经学到的部分。
- 神经元 1:Δw₁ = η·y₁·(x − y₁·w₁) ——就是 Oja 规则,学 PC1
- 神经元 2:Δw₂ = η·y₂·(x − y₁·w₁ − y₂·w₂) ——学 x 中减去 PC1 投影后剩下的部分 → PC2
- 神经元 3:学减去 PC1 和 PC2 后剩下的 → PC3
这本质上是Gram-Schmidt 正交化的在线版本——权重自动收敛到互相正交的方向,且按特征值降序排列。
6. 交互:多神经元竞争学习——看它们抢方向
实验目标:观察 3 个神经元在同一个 2D 数据云上竞争。每个箭头 = 一个神经元的权重向量。它们从随机方向出发,通过竞争 Hebb 学习,各自收敛到不同的主成分方向。
3-Neuron Competitive Hebbian Learning
观察要点:
① 点击"×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 2: zj = vj·y (在第一层特征的共现模式上再做 Hebb)
第二层 Hebb 学习提取的是"特征的特征":哪些边缘倾向于同时出现?哪些方向组合成角?哪些角组合成轮廓?
这产生了一个无监督的层级特征金字塔——不需要标签,每一层通过 Hebb/竞争提取上一层活动的统计结构。这与卷积网络惊人相似,但卷积网络用反向传播做,而这里用纯局部规则。
| 层级 | 学到什么(视觉为例) | 对应脑区 | 对应 CNN |
|---|---|---|---|
| Layer 1 | 边缘方向、空间频率 | V1 简单细胞 | Conv1 滤波器 |
| Layer 2 | 角、曲率、纹理基元 | V2 | Conv2–3 |
| Layer 3 | 物体部件(眼睛、轮子) | V4 / IT | Conv4–5 |
| 更高层 | 完整物体、场景 | IT / 海马 | FC / classifier |
8. 小测验
📖 推荐主源
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 网络。