赫布理论来自神经科学:两个神经元同时激活,它们之间的连接就加强。公式是 Δw = η·y·x, 只看「有没有一起亮」,不看对错。 差量规则多了一个减号:Δw = η·(t - y)·x,判对了误差是 0,权重不动;判错了才按错的方向改。 这一节的 Demo 里,赫布规则 8 轮下来权重一点没动、 误差一直是 1——因为输出恒为 0,Δw = η·y·x 永远是 0,它连启动都启动不了。
上一节讲的是「弯一下的函数」,这一节讲「怎么改权重」。 这一节是全书最小的一步,也是从「联想」走到「学习」的那一步。 4.6 的梯度法、4.7 的反向传播,都是差量规则的推广。 书里把它放在激励函数之后、多层网络之前,正是历史上的顺序。
一、赫布理论:一起亮就加强
1949 年 Hebb 提出一个假说: 如果神经元 A 反复参与激发神经元 B,它们之间的连接就会变强。 后来这句话被压成「一起激发的细胞连在一起」。 写成公式就是 Δwᵢ = η·y·xᵢ。xᵢ 是输入,y 是输出。输入大、输出也大,这个连接就加强得最多。 这条规则解释了「联想」:你闻到某个味道想起某件事,是因为那两件事在你脑子里同时被激活过很多次。 但它没解释「怎么学会一个任务」。
二、差量规则:多一个减号
Widrow 和 Hoff 在 1960 年提出 ADALINE,规则改成 Δw = η·(t - y)·x。多了个 t,也就是正确答案。 这个改动的效果是根本性的:判对了 (t-y)=0,权重一点不动;判错了才更新,而且错得越多改得越狠。 对比一下:赫布规则里「输出是 1」就加强,不管这个 1 该不该出现; 差量规则里只有「输出比目标小」才加强,方向永远是对着目标去的。 从「一起亮就加强」到「差多少改多少」,就是从无监督的联想走到有监督的学习。
三、从差量到梯度
差量规则里的 (t - y) 其实就是平方误差 ½(t-y)² 对 y 的导数(差一个负号)。 所以它可以写成 w ← w - η·∂L/∂w。 一旦写成这个形式,就能推广了:L 不一定是平方误差,y 不一定是单个输出,w 也不一定只有一层。 只要能把 ∂L/∂w 算出来,就能用同一句话更新。 这就是 4.6 节梯度法要做的事。而多层网络里「怎么把 ∂L/∂w 算出来」,就是 4.7 节的反向传播。
四、赫布的现代回响
赫布规则本身在现代网络里几乎不用了,但它的思想还在两处活着。 一是无监督学习:自编码器、对比学习,本质都是「让相关的东西靠近」,不需要标签。 二是注意力机制:第 6 章的 Attention 里,「一起出现的词权重更高」这个直觉,和赫布是同一个思路。 所以这一节不是历史陈列。理解它为什么不够用,比记住它是什么更重要。
五、动手 Demo:两种改权重的办法
同一份 AND 数据,同样跑 8 轮,分别用赫布规则和差量规则。 权重都从 0 开始,学习率都是 0.2,看两种规则各自收敛到哪儿。
AND = [((0.0, 0.0), 0.0), ((0.0, 1.0), 0.0),
((1.0, 0.0), 0.0), ((1.0, 1.0), 1.0)]
def run(rule, rounds=8, eta=0.2):
w = np.zeros(2)
b = 0.0
for _ in range(rounds):
for xs, t in AND:
y = 1.0 if float(np.dot(w, xs)) + b > 0 else 0.0
if rule == "hebb":
w = w + eta * y * np.array(xs) # 只看输出亮不亮
b = b + eta * y
else:
e = t - y # 差量规则:看误差
w = w + eta * e * np.array(xs)
b = b + eta * e
return w, b
实跑输出:
--------------------------------------------------------------------
赫布理论与差量规则:两种改权重的办法
--------------------------------------------------------------------
轮 1 2 3 4 6 8
------------------------------------------
Hebb 1 1 1 1 1 1
差量 1 3 3 2 0 0
规则 最终 w 最终 b 末轮误差
----------------------------------------------
Hebb (0.00, 0.00) 0.00 1
差量 (0.40, 0.20) -0.40 0
**Hebb 规则只看「输入和输出一起亮」就加强连接,它心里没有目标值。**
所以它有个致命毛病:权重初始化成 0 时输出恒为 0,Δw = η·y·x 永远是 0——
**它连启动都启动不了。**8 轮下来权重一点没变,错的那个样本一直错着。
就算给它一个非零初值,它也不知道该往哪边改:判对判错都在加强同一批连接。
**差量规则多了一个东西:误差 (t - y)。**判对了误差是 0,权重不动;
判错了才按错的方向改。这一个减法,就是从「联想」走到「学习」的关键一步。
第 4.6 节的梯度法、第 4.7 节的反向传播,本质上都是差量规则的推广:
**把「错多少」换成「损失对权重的偏导」。**
赫布那一行:误差从头到尾都是 1,权重最后是 (0.00, 0.00),一点没动。 原因很简单也很值得记: 权重初始为 0 时,所有样本的 z 都是 0,输出 y 恒为 0。于是 Δw = η·y·x = 0,权重永远是 0。 它把自己锁死在起跑线上了。 差量规则的轨迹是 1、3、3、2、0、0——先是变差,再慢慢变好。因为它是逐个样本更新的, 修好后面的可能弄坏前面的。第 6 轮才稳定到 0 错。 最终权重 (0.40, 0.20)、b = -0.40。验算一下:(1,1) 时 0.4+0.2-0.4 = 0.2 大于 0,输出 1; (1,0) 时 0.4-0.4 = 0,不大于 0,输出 0。刚好卡在边界上,但够用。
30 秒实验
- 把赫布规则的初始权重改成 (0.6, 0.6)、b=-0.5,它能动起来吗?动起来之后能学会 AND 吗?
- 把差量规则的学习率从 0.2 改成 0.05,还能在第 8 轮之前收敛吗?
- 把 AND 换成 OR,两种规则的表现有什么不同?
常见误区
- 以为赫布规则就是「早期版本的梯度下降」。它没有目标函数、没有误差项,本质是相关性学习, 不是优化。
- 以为差量规则只适用于单层。它的形式 w ← w - η·∂L/∂w 完全通用, 多层网络只是需要一种算法把 ∂L/∂w 算出来。
- 以为判对了也要更新所有权重。差量规则里判对时误差为 0, 那条样本对权重没有任何贡献——这是它比赫布规则高效的原因。
自测三问(点开对答案)
1. 赫布规则和差量规则的公式差在哪? —— 赫布是 Δw = η·y·x,只看输出;差量是 Δw = η·(t-y)·x,多了一个「目标减输出」。 这个减号让更新方向永远对着目标。 2. 为什么赫布规则在权重全为 0 时启动不了? —— 因为权重为 0 时输出恒为 0,Δw = η·y·x 也跟着恒为 0。要启动它,必须给一个非零初值。 3. 差量规则和梯度下降是什么关系? —— (t-y) 就是平方误差对输出的导数(差个符号),所以差量规则是梯度下降在一层线性输出上的特例。 写成 ∂L/∂w 的形式就推广到任意模型了。规则有了,但只能训一层。下一节把层数加上去——看两层网络怎么解决单层永远学不会的 XOR。
- ☐ (本节完,下一节 4.4 类神经网络的学习)