跳到主要内容

异或画不出那条线 — 为什么必须叠层,以及那 154 行代码

这一章讲三件事: 一个神经元的能力上限在哪里(它比你以为的低得多); 叠一层之后凭什么就跨过了那个上限;以及最基础的那种网络长什么样、能做到什么程度。

它在全书链条里的位置: 第 02 章给了一块砖,第 03 章给了调砖的办法。 这一章第一次把砖砌成墙。后面的卷积、循环、Transformer,都是这面墙的变形。

1. 一个神经元能做什么

这块积木的历史比很多人想象得更戏剧化。

1950 年代,一位心理学家在康奈尔航空实验室提出了感知器, 后来还真做出了一台机器,让它学着区分简单图案1。 当时媒体热情高涨,仿佛会学习的机器马上就要从实验室里走出来。

它到底有多大本事? 书里的判断很冷静: 一个神经元本质上只是一个带非线性开关的线性分类器 (把几个输入按固定比例加起来,超过一条线就说是,不超过就说不是)2

这句话的意思是:它能做的全部事情,就是在空间里画一条直线,然后说「线这边是 A,那边是 B」。

有意思的是,第 03 章那两个模型都是它的特例: 开关选那个 S 形的压缩函数,它就是判断是非的那个模型; 开关干脆什么都不做(输出等于输入),它就是估房价那条线。 你已经学过的两样东西,原来是同一块积木的两种设置。

2. 走查:两个开关和一盏灯

这一章从头到尾只用一个输入。 一盏灯,两个开关,规则是: 两个开关中恰好一个打开时灯亮;两个都关或两个都开,灯灭3

这个规则叫异或。把四种情况画在平面上(横轴是开关 A,纵轴是开关 B, 1 表示打开,0 表示关闭):

B
1 │ ●亮 ○灭

0 │ ○灭 ●亮
└────────────────── A
0 1

这张图看的是四种开关组合各自的结果:亮的两个点在对角线上,灭的两个点在另一条对角线上。

现在拿起一把直尺,试着画一条直线,把两个「亮」和两个「灭」分开。

画不出来。无论你怎么摆,总会有一个点站错边。 这就是一个神经元的能力上限——它当场挠头,如果神经元有头的话。

这不是一个数学游戏。1969 年,正是这个例子让当时的主流断定这条路走不通, 热情迅速降温,神经网络进入了第 01 章讲的那段低谷。

3. 走查第二步:两层就够了

解法朴素得让人意外:先画两条线,再把结果组合一下。

第一层放两个神经元,各画一条线:

这一层的两个神经元它各自在判断什么四种输入下的输出
第一个「至少有一个开关是开的吗」00→0,01→1,10→1,11→1
第二个「两个开关都开着吗」00→0,01→0,10→0,11→1

这张表看的是同一批四种输入,被两个神经元各自判了一遍。

现在看第二层。它要的答案是「至少有一个开着,但不是两个都开着」—— 也就是拿第一个的输出减去第二个的输出:

输入第一个说第二个说相减灯该亮吗
0, 0000灭 ✓
0, 1101亮 ✓
1, 0101亮 ✓
1, 1110灭 ✓

四种情况全对。 而第二层做的事,不过是给上一层的两个输出配两个权重:+1 和 −1。

这就是叠层的全部理由,一句话: 一层只能画一条边界; 多层可以先学出几条简单边界,再把这些边界组合成复杂的判断区域。 真正的力量不在单个神经元有多聪明,而在许多简单神经元怎么被组织起来。

4. 排成一层:为什么这个写法要紧

把 𝑚 个神经元并排放置,每个都接收同样的输入,但各自学不同的权重—— 这样一排就构成了一层4。一层的输出是一串数,每一位对应一个神经元的响应。

这件事可以写得非常紧凑:把所有神经元的权重摞成一个矩阵 (一个按行和列排好的数表,行数是这一层有几个神经元,列数是每个神经元接几个输入), 整层的计算就变成一次「矩阵乘一串数,再加一串数,再过一遍开关」。

这个写法不只是好看。 书里点得很准:它天然适合显卡的并行计算5。 矩阵乘法正是显卡最擅长的事,一层几千个神经元的计算可以在几毫秒内完成。

记住这条因果链,它会在第 18 章被反复用到:

一层 = 一次矩阵乘法
→ 矩阵乘法可以拆成成千上万个互不等待的小乘加
→ 显卡正好擅长同时做成千上万个一样的小活
→ 所以这一行跑得动

这张图说的是「为什么是显卡」:不是因为显卡聪明,是因为一层网络的形状正好合它的胃口。

5. 那道开关换了一次,换出一个分水岭

这一节讲全书最重要的一次「小改动、大影响」。

早期默认的开关是那个 S 形函数:输入很小时输出趋近 0,输入很大时趋近 1, 中间平滑过渡。它在 (0, 1) 之间,符合概率的直觉,所以顺理成章。

但它有一个致命弱点6:当输入很大或很小时,这条 S 形曲线几乎是平的—— 斜率接近零。而第 03 章说过,往回拧参数靠的正是斜率。斜率接近零, 意味着这一层几乎收不到任何「该往哪拧」的信号。

在两三层的浅网络里这还能忍。但一旦堆到十几层,信号一路乘下来变成极小的数, 前几层根本收不到有意义的更新——训练就停在那儿了。 这个现象叫梯度消失,它困扰了这一行近二十年。 (具体消失得有多快、有多少种治法,第 08 章讲。)

2012 年之后换上的那个开关,简单得可笑:负的归零,正的不变。 它的名字叫 ReLU。

书里列了它的三个优势7,值得逐条看,因为它们正好对应上面那三个毛病:

ReLU 的优势它治的是什么
正半轴斜率恒为 1信号不再一路衰减,能一直传到最深的层
一次比较、一次赋值,没有指数运算算得极快
大约一半的神经元输出为零网络变得稀疏(大部分单元这一次干脆不出声),既省算又更像真实神经元

它也有一个明显缺点:死亡 ReLU。 如果某个神经元的输入一直是负数, 它就永远输出 0、斜率也永远是 0,这个神经元就「死」了,再也不会被更新8。 后来的变体主要在修这一条:把负半轴的斜率从 0 改成一个小正数、 或者让这个斜率本身也可学、或者把那个硬拐角改成平滑过渡9

书里给的实践建议一句话:不知道用什么,就用 ReLU;想调优,再试那几个平滑或带门的变体10

6. 前馈网络:信息只往一个方向走

把「一层」当作一个模块,一层接一层串起来,每层的输出作为下一层的输入—— 这就是前馈神经网络11。「前馈」的意思是信息单向从输入流向输出,没有回路

它还有两个你会撞见的别名:多层感知器;以及全连接(这一层的每个单元都连着下一层的每个单元,一个不落)网络。三个名字,同一件事。

输入层 隐藏层 1 隐藏层 2 输出层
(原始数据) (中间结果) (中间结果) (预测)
●─────────────●────────────●─────────────●
●─────────────●────────────●─────────────●
●─────────────●────────────●

这张图看的是信息的流向:从左到右,每一层的每个单元都连着下一层的每个单元,没有往回的箭头。

中间那些层叫隐藏层——之所以叫隐藏,是因为它们不直接接触外部世界, 只在网络内部传递中间结果12这个名字里没有任何神秘的意思, 它不是「藏起来的知识」,只是「不跟外面打交道的那几层」。

为什么要多层? 第 02 章已经给过答案:多层能让网络学到层次化的抽象13。 浅层检测边缘,中层检测局部形状,深层识别完整物体。 网络没人教它这样分工,它自己就分了。

对文字也一样:浅层学到词的组合规律,中层学到句子的骨架,深层学到这句话在表达什么。 这个现象在后面讲大模型时还会再出现一次。

7. 通用近似定理和它的三行小字

这一节是给「一层就够了吗」这个问题一个正式答复。

第 02 章提过那条定理:一个只有一层隐藏层、但这一层足够宽的网络, 能以任意精细的程度逼近一大类连续函数。听起来叠层完全没必要。

书里把它的三行小字列得很清楚14:

  1. 「足够宽」可能是天文数字。 定理没说要多宽,而复杂函数可能要天文数字个神经元;
  2. 「存在」不等于「找得到」。 定理只保证有那么一组参数,没说梯度下降能走到它;
  3. 它说的是连续函数。 而现实里很多关系不连续、带噪、根本不是函数。

实测的经验和定理给的直觉正好相反: 一个 10 层、每层 100 个神经元的深网络,往往比一个 2 层、每层 10000 个神经元的宽网络 更容易学出有用的东西,也更省参数15

这是全书反复出现的一条提醒:「理论上能」和「实际好学」是两回事。 一条定理告诉你天花板在哪,但它不告诉你怎么爬上去。

8. 走查第三步:换个输入,跑一个真能跑的例子

异或那盏灯太小。换一个真实但仍然小得能读完的任务:认手写数字。

书里用的是一个经典数据集,由六万张训练图和一万张测试图组成, 每张是 28 × 28 的灰度数字,要分到 0 到 9 共十类16

一个最简单的解法长这样17:

哪一层有多少个单元在干什么
输入层78428 × 28 = 784,一个像素一个单元
隐藏层 1256 个开关用 ReLU
隐藏层 2256 个开关用 ReLU
输出层10收尾用 Softmax,给出每一类的可能性

尺子用交叉熵,拧参数的办法用梯度下降的一个改进版。这套配置的成绩是18:

十个数字认错的比例
上面这个几十万参数的网络,普通笔记本上训几分钟约 2%(准确率 98% 以上)
加上第 06 章要讲的那种专门看图的结构低于 0.5%(准确率 99.5% 以上)
普通人辨认手写数字书里说深层结构「接近甚至超过」这个水平

注意这条走查的完整形状,它对后面任何复杂模型都成立:

数据 → 模型 → 损失 → 优化 → 预测
784个数 两层 交叉熵 梯度下降 0到9里的一个

这张图说的是第 03 章那三件事在一个真实任务上的排布:骨架一点没变,只是每一格填了具体内容。

9. 那 154 行代码

总纲第②步问过:几千亿个旋钮怎么才能一起拧?答案就是自动微分。这里给它一个大小上的参照物。

补充(不在书里,依据我们的 frontier 书架): 这件事最小的、能真的跑起来的实现, 是一个叫 micrograd 的教学项目,总共两个文件: 一个负责「记账 + 倒推」,94 行;一个负责「把单元、层、多层网络定义出来」,60 行1994 + 60 = 154 行。

这个数值得记住,因为它划掉了一个常见的误解。 很多人以为「让几千亿个数一起被调整」 是某种庞大精妙的工程;实际上那套记账逻辑小到一个下午能读完, 庞大的是数据和算力,不是这件事本身的复杂度。

10. 前馈网络今天在哪,以及它和大脑差多远

它没有退休,只是不单独用了。 今天它更多是作为别的网络的最后一层, 或者作为更大结构里的一个内部构件——第 10 章你会看到, 一块 Transformer 积木里参数最多的那一部分,正是一个两层的前馈网络。

最后补上第 02 章欠的那一半:这东西和真实大脑到底差多远?

书里把差异列得很诚实20:

维度人脑今天的网络
规模约 860 亿个神经元,连接总数通常被估计为百万亿级参数已到万亿级,但不是同一种复杂性
硬件生物的、动态可塑的、三维组织的数字的、相对静态的、按矩阵排布的
功耗约 20 瓦(一只灯泡)训练和部署要数据中心级的电力与散热
学新东西一生不断学新的,不忘旧的继续在新数据上训,会灾难性地遗忘旧知识
怎么学生物学家至今没在真实大脑里找到对应「误差往回传」的机制靠误差一层层倒推

最后一行最值得停一下。 「神经网络」这个名字来自大脑, 但它靠的那套学习机制,在真实大脑里根本没找到对应物。 书里的结论很干脆:它从大脑得到启发,但在实现上走了自己的路—— 就像飞机不模仿鸟扑翼,却同样实现了飞行。

倒数第二行(灾难性遗忘)是第 27 章的一个关键伏笔。 今天的模型训完就「定格」了,想更新它的基础知识,基本只能重训一遍。

11. 作者的判断与证据

有证据的部分。 异或的不可分性是数学事实;S 形开关的斜率在两端趋近零是数学事实; 手写数字那套配置的成绩是可复现的;人脑功耗约 20 瓦是公认估计。

要分开看的三处:

  1. 「不知道用什么激活函数就用 ReLU」。 这是经验建议,不是结论。 书里紧接着列了几个更平滑或带门的变体,并说它们在 Transformer 和扩散模型里被广泛使用—— 也就是说在今天最前沿的模型里,默认已经不是 ReLU 了。
  2. 「深度通常比单纯变宽更划算」。 书里用的词是「实际经验告诉我们」, 没有给证明,也没给「多深算够」的判据。
  3. 人脑与网络的对照表。 书里自己强调「二者并不处于同一种复杂性维度之中」—— 这张表只能用来建立量感,不能用来推断「参数追平就等于追平大脑」。

判断(我们的,不是书里的):这一章最该记住的不是前馈网络,是第 2、3 节那两张表。 「一层画不出那条线,两层先画两条再组合」—— 这是整本书里唯一一处你能用一把直尺亲手验证的地方。 后面所有复杂结构,本质上都在做同一件事:先学一堆简单的判断,再把它们组合起来。 如果错,会错在: 异或是一个被精心挑选的极端例子。 现实里很多任务用一条线也能做到八九成,叠层带来的提升未必这么戏剧化。

12. 边界与局限

  • 这一章没有讲怎么把两层训出来。 上面那两条边界是我们手工凑的; 真实训练里它们是被梯度下降自己找到的,而这个过程书里不展开。
  • 感知器的历史只给了一句。 那台机器具体怎么学、1969 年那本书具体证明了什么, 这一版没写。
  • 激活函数只列了名字,没有曲线对比。 几个变体各自好在哪,书里也只给了一句话。
  • 手写数字那个例子没有说清参数怎么数出来。 「不过几十万」是书里的说法, 但 784 × 256 + 256 × 256 + 256 × 10 具体是多少,书里没算。
  • 和大脑的对照只到「不一样」为止。 「大脑到底怎么学」这个问题, 书里明说至今仍是谜。

13. 可带走的

  1. 一个神经元只能画一条直线。 它的能力上限比名字暗示的低得多。
  2. 异或用一条直线永远分不开。 拿把直尺试一次,这件事你就永远记住了。
  3. 叠层的全部理由:先学几条简单边界,再把它们组合成复杂区域。 不是「参数更多」。
  4. 一层等于一次矩阵乘法,而矩阵乘法正好合显卡的胃口。 这条因果链在第 18 章会被反复用到。
  5. 把开关从 S 形换成「负的归零」,是能不能训深的分水岭。 前者两端太平,信号传不回去。
  6. 隐藏层没有任何神秘意思,就是「不跟外面打交道的那几层」。
  7. 「理论上能」和「实际好学」是两回事。 通用近似定理告诉你天花板,不告诉你怎么爬。
  8. 自动微分那套记账逻辑只有 154 行。 庞大的是数据和算力,不是这件事本身。
  9. 今天的网络会灾难性遗忘,人脑不会。 这是第 27 章讨论通用智能时绕不开的一条。

14. 原文地图

主题原书章原文位置
感知器的历史第3章 从神经元到深度网络text/04-ch03.txt:12(搜「感知器」)
单个神经元的上限第3章 从神经元到深度网络text/04-ch03.txt:36(搜「线性分类器」)
异或第3章 从神经元到深度网络text/04-ch03.txt:40(搜「两个开关中恰好一个打开时灯亮」)
排成一层与矩阵写法第3章 从神经元到深度网络text/04-ch03.txt:47(搜「并排放置」) · :56(搜「天然适合 GPU 并行计算」)
S 形开关的弱点第3章 从神经元到深度网络text/04-ch03.txt:75(搜「致命弱点」)
ReLU 的三个优势与缺点第3章 从神经元到深度网络text/04-ch03.txt:85(搜「ReLU 的优势很直观」) · :89(搜「死亡 ReLU」) · :92(搜「Leaky ReLU」) · :96(搜「就用 ReLU」)
前馈网络与三个别名第3章 从神经元到深度网络text/04-ch03.txt:110(搜「前馈神经网络」)
隐藏层的命名第3章 从神经元到深度网络text/04-ch03.txt:127(搜「不直接接触外部世界」)
深度带来层次化抽象第3章 从神经元到深度网络text/04-ch03.txt:132(搜「层次化的抽象」)
通用近似定理的三行小字第3章 从神经元到深度网络text/04-ch03.txt:148(搜「小字注释」) · :152(搜「每层 100 个」)
手写数字第3章 从神经元到深度网络text/04-ch03.txt:157(搜「MNIST 手写数字识别」) · :158(搜「包含 6 万张训」) · :161(搜「784 个神经元」) · :168(搜「训练几分钟就能达到 98%」)
人脑与网络的差异第3章 从神经元到深度网络text/04-ch03.txt:661(搜「百万亿级」) · :669(搜「20 瓦」) · :675(搜「灾难性地遗忘旧知识」) · :673(搜「至今仍是谜」)

Footnotes

  1. 出处:「第3章 从神经元到深度网络」第 12 段(text/04-ch03.txt:12,搜「感知器」)。 提出者是心理学家弗兰克·罗森布拉特,机器叫 Mark I Perceptron。

  2. 出处:「第3章 从神经元到深度网络」第 36 段(text/04-ch03.txt:36,搜「线性分类器」)。 原文接着说:激活函数选 Logistic,它就是判断是非的那个模型; 选恒等函数,它就是线性回归。

  3. 出处:「第3章 从神经元到深度网络」第 40 段(text/04-ch03.txt:40,搜「两个开关中恰好一个打开时灯亮」)。 原文的形容:「亮灯点和灭灯点像棋盘格一样交错,没法用一条直线分开」。 本章第 3 节那两张表(两个神经元各判什么、相减得到什么)是我们为了把「组合」这一步走出来编的, 书里只说了「多层网络可以先学出几个简单边界,再把这些边界组合成复杂的判断区域」,没给具体的数。

  4. 出处:「第3章 从神经元到深度网络」第 47 段(text/04-ch03.txt:47,搜「并排放置」)。

  5. 出处:「第3章 从神经元到深度网络」第 56 段(text/04-ch03.txt:56,搜「天然适合 GPU 并行计算」)。 原文说「一层几千个神经元的计算可以在几毫秒内完成」,并把这称为 「现代深度学习能跑得那么快的根本原因之一」。

  6. 出处:「第3章 从神经元到深度网络」第 75 段(text/04-ch03.txt:75,搜「致命弱点」)。 原文说这个问题「困扰了神经网络界近二十年」。

  7. 出处:「第3章 从神经元到深度网络」第 85 段(text/04-ch03.txt:85,搜「ReLU 的优势很直观」)。 第三条(稀疏)原文还补了一句:这符合生物神经元的实际情况,真实神经元大部分时间也是沉默的。

  8. 出处:「第3章 从神经元到深度网络」第 89 段(text/04-ch03.txt:89,搜「死亡 ReLU」)。

  9. 出处:「第3章 从神经元到深度网络」第 92 段(text/04-ch03.txt:92,搜「Leaky ReLU」)。 书里列的变体依次是 Leaky ReLU、PReLU、GELU、Swish 与 SiLU; 其中后三个在 Transformer 和扩散模型里被广泛使用—— 也就是说今天最前沿的模型默认已经不是 ReLU 了。

  10. 出处:「第3章 从神经元到深度网络」第 96 段(text/04-ch03.txt:96,搜「就用 ReLU」)。

  11. 出处:「第3章 从神经元到深度网络」第 110 段(text/04-ch03.txt:110,搜「前馈神经网络」)。 三个别名在同一段里并列给出。

  12. 出处:「第3章 从神经元到深度网络」第 127 段(text/04-ch03.txt:127,搜「不直接接触外部世界」)。

  13. 出处:「第3章 从神经元到深度网络」第 132 段(text/04-ch03.txt:132,搜「层次化的抽象」)。

  14. 出处:「第3章 从神经元到深度网络」第 148 段(text/04-ch03.txt:148,搜「小字注释」)。

  15. 出处:「第3章 从神经元到深度网络」第 152 段(text/04-ch03.txt:152,搜「每层 100 个」)。

  16. 出处:「第3章 从神经元到深度网络」第 158 段(text/04-ch03.txt:158,搜「包含 6 万张训」)与第 157 段(text/04-ch03.txt:157,搜「MNIST 手写数字识别」)。 这个数据集由杨立昆等人整理,在 1998 年前后的 LeNet-5 论文里广泛使用。

  17. 出处:「第3章 从神经元到深度网络」第 161 段(text/04-ch03.txt:161,搜「784 个神经元」)。 原文的配置是:输入 784、两层隐藏层各 256 个用 ReLU、输出 10 个用 Softmax、 损失用交叉熵、优化器用 Adam(第 08 章会讲它是什么)。

  18. 出处:「第3章 从神经元到深度网络」第 168 段(text/04-ch03.txt:168,搜「训练几分钟就能达到 98%」)。 99.5% 那一行在第 169 段(text/04-ch03.txt:169,搜「99.5% 以上」)。 「认错的比例」那一列是我们照准确率换算的(100% − 98% = 2%),书里给的是准确率。

  19. 补充(不在书里,依据我们的 frontier 书架): 依据: shelf=ai-frontier-reference/micrograd@src:micrograd/engine.py:94 @7bc720e951fe422b8f8814aa5aa1b64121d26b4c 事实=这个文件一共 94 行,负责记录每一步运算并把「该往哪拧」倒推回去。 另一份: shelf=ai-frontier-reference/micrograd@src:micrograd/nn.py:60 @7bc720e951fe422b8f8814aa5aa1b64121d26b4c 事实=这个文件一共 60 行,把神经元、一层、多层网络三样都定义完了。 书里说「20 行 Python 就能搭一个上亿参数的网络」,说的是使用方那一侧; 这里的 154 行说的是「让自动求导这件事成立」的那一侧,两个数不冲突。

  20. 出处:「第3章 从神经元到深度网络」第 661 段(text/04-ch03.txt:661,搜「百万亿级」)、 第 669 段(text/04-ch03.txt:669,搜「20 瓦」)、 第 675 段(text/04-ch03.txt:675,搜「灾难性地遗忘旧知识」)、 第 674 段(text/04-ch03.txt:674,搜「至今仍是谜」)。 原文的落点:「神经网络不必完全模仿大脑才能工作」。