🧠 第八章 神经网络训练
📄 一句话概括

完全可分的数据 2 轮就停,最后一轮 0 个错; 轻微重叠跑满 200 轮还在错 2 个,严重重叠错 24 个。 同一套规则,数据可分就成了,不可分就永远停不下来。

📝 本节和前面几节的关系

上一节讲训练的三件套。从这一节起换视角:六种网络架构,每种都是为了一类特定问题才长成那样的。 第一个是最老的:感知机。

一、规则只有一句话

看一个样本,如果分类对了,什么都不做; 如果分错了,就把权重往「正确答案的方向」推一格:w 加 y 乘 x,b 加 y。 没有学习率,没有损失函数,没有梯度。就这么一句。 它和上一节的神经网络不一样:那个是「算损失、求导、挪一小步」;这个是「错就推一格」,硬的、离散的。 1957 年 Rosenblatt 做出这个东西的时候,媒体说它「能学会认东西」。这就是神经网络的第一波热潮。

二、可分数据一定停:表里第一行

定理是这样的:只要存在一条直线能把两类分开,这个规则一定在有限步内停下来。 Demo 第一行造了完全可分的数据(两类中心差 1.2、噪声 0.5、每类 40 个点),结果 2 轮就停了, 最后一轮 0 个错。 2 轮这个数说明不了什么——它取决于数据有多容易分、顺序怎么排。 容易分的数据,第一轮扫过去就几乎全对了。 关键是「停」这件事本身。它证明了这套规则不会无限晃,这是当年最让人兴奋的地方。

三、不可分就永远不停

第二行(轻微重叠,中心差 0.6、噪声 0.9)跑满 200 轮,最后一轮还错 2 个。 第三行(严重重叠,中心重合、噪声 1.4)跑满 200 轮,还错 24 个。 注意这两行都写「200 轮未收敛」,不是「收敛在 2 个错」。 区别很大:它不是找到一个错 2 个的解然后停住,是一直在晃——这一轮错的点下一轮可能对了, 但别的点又错了。 如果打印每一轮的错数,会看到它在 2 到 6 之间来回跳,永远不归零。 这就是死穴。现实数据几乎都有重叠,所以感知机能用的场合非常有限。

四、它倒了,才有了后面的故事

1969 年 Minsky 和 Papert 出了本书,把感知机的局限一条条列清楚(异或就是其中最有名的例子)。 之后十几年,神经网络研究基本没钱了。 补上这个洞的是两件事: 多层(解决异或这类线性不可分)和反向传播加连续可微的损失 (解决「分错了推一格」这种硬规则没法做多层训练)。 换成连续的损失之后,一切都不一样了:可以做梯度下降,可以一层一层往下传,可以处理重叠数据。 8.1.1 那个异或 Demo 就是这条路的结果。 所以学感知机不是为了用它。 是为了搞清「为什么现在的网络长这样」——它每一个设计选择,都在补感知机的某个洞。

五、动手 Demo:感知机:可分数据 2 轮收敛,重叠数据 200 轮不收敛

造三组二维二类数据(完全可分、轻微重叠、严重重叠),每类 40 个点打乱顺序; 用「分错就推一格」的规则最多跑 200 轮,记录多少轮停下来、最后一轮还错几个。

for ep in range(epochs):
    errs = 0
    for i in range(len(y)):
        if y[i] * (X[i] @ w + b) <= 0:      # 分错了
            w += y[i] * X[i]
            b += y[i]
            errs += 1
    if errs == 0:
        return ep + 1, 0

实跑输出:

--------------------------------------------------------------------
感知机:可分数据一定收敛,不可分就永远不收敛
--------------------------------------------------------------------
  数据       样本数   收敛用了几轮   最后一轮错几个
  ------------------------------------------------
  完全可分   80                  2                0
  轻微重叠   80       200 轮未收敛                2
  严重重叠   80       200 轮未收敛               24

  感知机的更新规则只有一句:分错了就把权重往正确方向推一格。它没有学习率、没有梯度、没有损失函数。
  1958 年有人证明:只要数据线性可分,这个规则一定在有限步内停。表里第一行就是这件事的实证。
  第二、第三行是它的死穴:数据一重叠,就找不到一条线能全分对,于是权重永远在晃,200 轮也停不下来。
  这个缺陷当年让神经网络冷了十几年。补上它的正是「多层 + 反向传播」——换成连续可微的损失,就能用梯度下降,而不是靠「分错就推一格」这种硬规则。

第一行 2 轮收敛。数据两类中心差 1.2、噪声 0.5,重叠很少,所以几乎一遍就分开了。 第二行错 2 个、第三行错 24 个,都是「跑满 200 轮」的结果。 错数随重叠程度单调上升,说明这个数字确实反映数据的可分性。 这里没有学习率可调,也没有别的超参数。 感知机要么能分,要么不能分,没有「调一调说不定就好了」的余地。这是它和现代网络最根本的差别。 我用了 80 个样本。样本再少一点(比如 20 个),第一行也可能几轮就停;再多一点,轮数会涨。 这个数跟样本量有关,别记成定值。

30 秒实验

  1. 把 epochs 从 200 提到 2000,看第三行最后一轮错几个——会变少还是不变?
  2. 把类别顺序从打乱改成「先全给 A 类再全给 B 类」,看收敛轮数怎么变。
  3. 想一想:为什么「分错推一格」这个规则没法直接用在多层网络上?

常见误区

  1. 「感知机是早期版本,现在没用了」——它的局限正是现代网络每个设计要解决的问题。
  2. 「错 2 个就是收敛了」——不是,它一直在晃,只是刚好这一轮错 2 个。
  3. 「加学习率能让它更好」——感知机根本没有学习率这个概念,规则是离散的。
自测三问(点开对答案) 1. 感知机的更新规则是什么? —— 分类正确不动;分错就 w 加 y 乘 x、b 加 y,把边界往正确方向推一格。 2. 什么条件下感知机一定收敛? —— 数据线性可分时,一定在有限步内停下来。 3. 为什么重叠数据上它永远停不下来? —— 找不到一条线能全分对,权重就一直被不同样本推来推去。

感知机只能处理「一条线能分开」的问题。下一节换到图像:用卷积把「局部结构」这件事利用起来。

相关笔记