跳到主要内容

从神经元到深度网络 — 「深」字的实际含义

这一章讲三件事: 为什么要把激活函数从阶跃换成平滑曲线; 多层网络怎么用「半平面拼形状」突破单神经元的直线极限; 以及反向传播——错误信号怎么从输出层一路分摊回每个权重。 主走查是一张手写数字的四步进化:同一个网络,0.67 改到 0.97,每一步改的是什么、值多少。

1. 顶层全景

上一章的神经元一个人干活;这一章把它们排成列、连成网。全章的终点是这张图:

一张 28×28 的手写数字图(784 个像素值,每个 0~1)


隐藏层 1:32 个神经元 ← 每个都做「加权求和+偏置+激活」

隐藏层 2:32 个神经元

输出层:10 个神经元 ← 每个数字一个,输出"这张图是这个数字的可能性"

挑最大的那个当答案

图说:这就是全章的主走查对象。784→32→32→10 这个网络有 26,506 个可调参数1, 是上一章那颗「一个权重」神经元的两万多倍。 「深度」的分界线也在这张图里:两个隐藏层起,网络才被行业叫「深」2

2. 核心原理

2.1 激活函数家族:阶跃为什么不够用

阶跃门槛(上一章的 Heaviside 函数)有个硬伤:它是跳变的——输入在门槛两侧挪一点点,输出从 0 直接蹦到 1。 这给两层后果。第一,输出永远是 0/1,网络永远做不了「给个连续的数」的任务(下一章的回归); 第二,后面要用的训练算法要求激活函数几乎处处可微(大意:函数处处平滑,除了孤立的点), 跳变函数直接不合格3

于是换一批候选,原书列了五个4:

激活函数输出范围一句话
sigmoid(0, 1)平滑 S 形,「软化的阶跃」
tanh(−1, 1)同样是 S 形,但以 0 为中心
线性不变原样返回,用于不需要弯的网络出口
ReLU[0, ∞)负数归零、正数照抄;算自己和自己的导数都便宜
Leaky ReLU负半轴留小坡ReLU 变体,负数不归零,缓解「梯度消失」(第 3.4 节讲)

换完之后有一条必须点破的事:换了平滑激活,一颗神经元的边界还是一条线。 它做的仍是「加权求和 + 一个只增不减的弯折」,弯折不出第二条边界5。 突破极限靠的不是换函数,是加层

2.2 两层网络:用半平面拼形状

两个神经元叠成两层后,分工出现了。第一层(叫隐藏层,因为它夹在输入和输出之间、读者看不见它内部) 的每个神经元切出半个平面;第二层(叫输出层)把这些半平面组合起来: 有的神经元做「并」(任一半平面命中就算命中),有的做「交」(要同时命中)6

这种「每层全连接到下一层」的结构有三个名字,指的是同一个东西: 密集网络 = 全连接网络 = 多层感知机7

经典判据是逻辑门。两层网络能实现 NOT、AND、OR、NAND,唯独实现不了 XOR (「相同出 0、不同出 1」);三层就能了8。原因和半平面拼形状是同一件事: XOR 的两个「1」在对角上,任何一条直线都切不开,必须先切两条线再取并——这正好是「两层」能做而「一层」不能做的。

2.3 「错多少」要变成一个数

上一章的错误只有 ±1/0 三种值,太糙。要精细训练,先得把「错多少」量化成一个连续的数, 这个量叫损失函数——预测和真值差异的数学表达式,训练的目标就是把它压到最低9

本章用均方误差(MSE):每个输出减真值、平方、加起来再除二(平方保证大错罚得重、且处处可微)10

有了连续的损失,更新策略也升级了。概念上的做法是:轻微拧动一个权重,看损失变大了还是变小了, 朝变小的方向拧;对每个权重都这么做。这个流程叫梯度下降—— 「梯度」就是损失关于权重的斜率(往哪边拧、拧多急),「下降」就是往低处走11

2.4 反向传播:一次算清所有权重的方向

「每个权重分别试一下」在参数一多时算不起。反向传播是高效的替代: 用链式法则(微积分里「复合函数的导数=导数的连乘」)一次算出损失对每个权重的梯度, 从最后一层往前逐层推,中间结果复用,不做重复计算12。 原书对它的地位下得很重:「可以说是深度学习取得广泛成功的头号功臣」13

推导只看结构,不看记号(全章只此一处公式):

输出层权重更新: Δw(输出) = -η · δ(输出) · (下一层的输出)
其中 δ(输出) = (预测 - 真值) × 激活函数的导数 ← 错误 × 该神经元的"灵敏度"

隐藏层权重更新: Δw(隐藏) = -η · δ(隐藏) · (输入)
其中 δ(隐藏) = Σ δ(输出)×连线的权重,再乘本层激活的导数 ← 上层的错误按连线权重"分摊"下来

图说:第二行就是"反向传播"这个名字的由来——错误从输出层
倒着流回每个隐藏神经元,谁责任大(连线权重粗)谁分得多[^14]。

对照上一章的更新式 w ← w − η·error·x:形状一模一样, 变的只是 error 从「±1 的糙信号」升级成「分摊到这个权重的精确份额」。

两个代价要交代。第一,链式法则逐层连乘,激活函数必须几乎处处可微——这就是 2.1 节换掉阶跃的原因; 第二,层数一深,连乘的导数一大串,连乘很多个小于 1 的数会越乘越小, 底层收到的错误信号趋近于零,学不动了——这就是 2.1 表里「梯度消失」四个字的来历14

2.5 三层与万能近似

三层的写法是把「两层」的积木再叠一块。原书演示:两个隐藏层配 7 和 5 个神经元, 就能分对两层网络不可能分对的那组非凸数据15。 规律在原书 1.4 节里说得很直白:层数越多,能拼的形状越复杂; 层和神经元够多时,网络能逼近任何函数16

「任何函数」是有数学定理背书的:1989 年 Cybenko 证明了 sigmoid 网络 可以逼近任何连续函数,Hornik 等人推广到更一般的激活函数17。 但要当心读法——定理说的是「存在这样的网络」,不保证你训练得到它: 数据够不够、训练陷不陷进坏位置,定理一概不管。这是「万能近似」四个字最常见的误读。

3. 主走查:一张手写数字的四步进化

走查对象是 2.1 节那张全景图:MNIST 数据集(1998 年由 LeCun 和 Cortes 构建的手写数字基准, 6 万张训练图、1 万张测试图,每张 28×28 像素)18里的一张图,从输入层走到答案。 四步改造,每步只动一个地方,每步的准确率都是原书实测值。

第 0 步(基线):784→32→32→10,全部 sigmoid 激活,损失用 MSE,最朴素的随机梯度下降 (SGD:每次只抽一小撮样本算梯度就更新,不等全量),学习率 0.1,只过一遍全部训练数据 (一个 epoch = 完整过一遍训练集)19。测试集准确率 0.6720

3.1 第 1 步:让出口的十个数加起来等于 1

问题:现在 10 个出口各自给一个 0~1 的数,互不相干;可一张图只有一个数字。

每个出口的数可粗读作「是它的把握」——这种把握叫概率,10 个出口的把握理应加起来等于 1

softmax(把 10 个打分折算成一组加起来等于 1 的份额)就是这一步要换上的出口。

做法:先对 10 个原始打分取指数(指数函数先把差距放大),再除以总和,得到一组加起来恰为 1 的数21

(那 10 个原始打分有术语,叫 logits——最后一层在套激活前的线性输出。)

效果:0.67 → 0.7722

3.2 配套:损失换成「比分布」

「分布差多远」这件事有把现成的尺:熵(信息论里度量「不确定程度」的数)。

配套的正确姿势是把损失换成交叉熵——预测与真值两个分布之间的那把尺。

准确说,它比较两个概率分布(各组可能性各占多少):预测一个、真值一个,差多远罚多少。

数学上它有个漂亮性质——最小化它等价于最大化似然(「让模型给正确答案打出最高分」)23

真值这边要先换成 one-hot 编码:正确数字的位置填 1、其余 9 个位置填 0(比如「3」变成 [0,0,0,1,0,0,0,0,0,0])24

3.3 第 2、3 步:换弯折、换更新策略

第 2 步:内部换 ReLU。 sigmoid 在输入很大或很小时曲线几乎平了,导数趋近零—— 这正是梯度消失的高发区。ReLU 在正半轴导数恒为 1,信号传得动25。效果:0.77 → 0.9426

第 3 步:改用分批更新。 批大小(每次更新用多少张图)从 1 提到 32——每次用 32 张图的平均梯度更新,又快又稳。

同时换优化器(管「怎么调权重」的那件套):从 SGD 换成 RMSprop——这类现代优化器的核心想法是给每个权重单独调学习率, 共同点是动量:一个权重连续往同方向更新,步子就逐渐放大;反复变向,步子就缩小27

训练轮数从 1 个 epoch 提到 10 个。效果:0.94 → 0.9728

3.4 看错在哪

画一张混淆矩阵——10×10 的方表,第 i 行第 j 列填「真值是 i、被判成 j」的次数, 对角线是判对的,表越干净对角线越亮29。四步之后仍最容易混淆的是 5、8、9, 其次是 2;挑出错图看,不少确实写得很潦草,混淆情有可原30

0.67 ──softmax+交叉熵──▶ 0.77 ──ReLU──▶ 0.94 ──批量+RMSprop+10轮──▶ 0.97
出口改成"加起来=1" 治梯度消失 每个权重自己的步长
图说:四步没有一步是"加大网络"。26,506 个参数从头到尾没变,
变的是出口的形状、弯折的方式、步长的分法。

4. 作者的判断与证据

  • 有证据的:半平面拼形状(原书图 1-12 的固定权重演示)、XOR 判据、 MNIST 四步阶梯的每一级准确率,全是可复跑的实验。
  • 作者的判断(标注为判断):「反向传播是深度学习成功的主因」13; 「5/8/9 普遍更难认」——原书自己也注明这是猜想,因为混淆矩阵每次训练会变30
  • 训练工程的经验值:迭代(一遍遍重复训练循环)次数 10⁵ 才训得动两层(从 10² 加上来的), 原书让读者自己试 10³、10⁴ 看差别31——「试」依然是主旋律。

5. 边界与局限

边界说明
万能近似 ≠ 万能训练定理只保证存在,不保证学到(2.5 节)
梯度消失sigmoid 深层网络的固有病;ReLU 缓解,层数再深要靠残差连接(第 05 章 seminal 提到 ResNet)
全连接的开销每个神经元连所有输入;784 个像素要 2 万多参数,换成 1000×1000 的图就失控——第 05 章的卷积是解药
数据要人标MNIST 的 7 万个标签是人打的;这个成本问题第 08、14 章正面处理

还有一个原书在 MNIST 项目里点到、值得展开的词:超参数—— 层数、每层神经元数、学习率、批大小、epoch 数这些训练开始前就要人定的设置; 它们不像权重那样被反向传播更新,只能靠人试32。「调参」调的全是它们。

6. 可带走的

  1. 「深」= 两个以上隐藏层;每加一层,可拼的形状复杂一阶(XOR 是试金石);
  2. 平滑激活函数是训练算法的前提,阶跃出不了可微的损失;
  3. 损失函数把「错多少」变成一个数;梯度下降=沿斜率往低处走;
  4. 反向传播=链式法则逐层分摊错误,是上一章更新式的精确版;
  5. 万能近似定理说「存在」,不承诺「学到」;
  6. MNIST 四步改进口诀:出口归一(softmax)→ 内部换 ReLU → 小批更新+自适应优化器, 0.67 到 0.97 没加大网络半分;
  7. 混淆矩阵看错在哪,比只看准确率有用;
  8. 超参数是训练前人拍的板;调参调的是它们,不是权重。

7. 原文地图

主题原书章原文位置
激活函数清单Using Different Activation Functionstext/11-fm-using-different-activation-functions.txt:5(搜「Sigmoid」)
可微性与反向传播的关系Using Different Activation Functionstext/11-fm-using-different-activation-functions.txt:19(搜「differentiable almost everywhere」)
单神经元仍是线性边界Using Different Activation Functionstext/11-fm-using-different-activation-functions.txt:21(搜「linear decision boundary」)
隐藏层/输出层与半平面组合Classifying Data with a Two-Layer Neural Networktext/12-fm-classifying-data-with-a-two-layer-neural-network.txt:11(搜「synthesizes these regions」)
「深」的门槛(≥2 隐藏层)Classifying Data with a Two-Layer Neural Networktext/12-fm-classifying-data-with-a-two-layer-neural-network.txt:7(搜「two or more hidden layers」)
三个同义名Classifying Data with a Two-Layer Neural Networktext/12-fm-classifying-data-with-a-two-layer-neural-network.txt:15(搜「multilayer perceptrons」)
XOR 判据Classifying Data with a Two-Layer Neural Networktext/12-fm-classifying-data-with-a-two-layer-neural-network.txt:21(搜「XOR」) · text/13-fm-classifying-data-with-a-three-layer-neural-netwo.txt:15(搜「XOR」)
损失函数定义Classifying Data with a Two-Layer Neural Networktext/12-fm-classifying-data-with-a-two-layer-neural-network.txt:113(搜「loss function」)
MSE 公式Classifying Data with a Two-Layer Neural Networktext/12-fm-classifying-data-with-a-two-layer-neural-network.txt:133(搜「mean squared error」)
梯度下降Classifying Data with a Two-Layer Neural Networktext/12-fm-classifying-data-with-a-two-layer-neural-network.txt:117(搜「gradient descent」)
反向传播的地位与链式法则Classifying Data with a Two-Layer Neural Networktext/12-fm-classifying-data-with-a-two-layer-neural-network.txt:119(搜「arguably the main technique」) · text/12-fm-classifying-data-with-a-two-layer-neural-network.txt:123(搜「chain rule」)
错误反传(名字由来)Classifying Data with a Two-Layer Neural Networktext/12-fm-classifying-data-with-a-two-layer-neural-network.txt:165(搜「backpropagating the errors」)
万能近似(书内表述)Classifying Data with a Three-Layer Neural Networktext/13-fm-classifying-data-with-a-three-layer-neural-netwo.txt:17(搜「approximate any function」)
三层分对非凸数据Classifying Data with a Three-Layer Neural Networktext/13-fm-classifying-data-with-a-three-layer-neural-netwo.txt:73(搜「impossible to classify with a two-layer」)
Cybenko/Hornik 定理Seminal Works and Further Readingtext/16-fm-seminal-works-and-further-reading.txt:13(搜「Approximation by Superpositions」) · text/16-fm-seminal-works-and-further-reading.txt:15(搜「Universal Approximators」)
MNIST 数据集Project 1A: Classifying Handwritten Digitstext/14-fm-project-1a-classifying-handwritten-digits.txt:7(搜「60,000 training images」)
26,506 个参数Project 1A: Classifying Handwritten Digitstext/14-fm-project-1a-classifying-handwritten-digits.txt:108(搜「26,506」)
基线 0.67Project 1A: Classifying Handwritten Digitstext/14-fm-project-1a-classifying-handwritten-digits.txt:199(搜「accuracy of about 0.67」)
softmax 与 logitsProject 1A: Classifying Handwritten Digitstext/14-fm-project-1a-classifying-handwritten-digits.txt:254(搜「softmax activation」) · text/14-fm-project-1a-classifying-handwritten-digits.txt:258(搜「logits」)
交叉熵=最大似然Project 1A: Classifying Handwritten Digitstext/14-fm-project-1a-classifying-handwritten-digits.txt:288(搜「maximizing the likelihood」)
one-hotProject 1A: Classifying Handwritten Digitstext/14-fm-project-1a-classifying-handwritten-digits.txt:121(搜「one-hot」)
sigmoid 与梯度消失、ReLUProject 1A: Classifying Handwritten Digitstext/14-fm-project-1a-classifying-handwritten-digits.txt:294(搜「vanishing gradients」)
0.77 / 0.94 / 0.97Project 1A: Classifying Handwritten Digitstext/14-fm-project-1a-classifying-handwritten-digits.txt:275(搜「accuracy of about 0.77」) · text/14-fm-project-1a-classifying-handwritten-digits.txt:311(搜「accuracy of around 0.94」) · text/14-fm-project-1a-classifying-handwritten-digits.txt:349(搜「accuracy of around 0.97」)
动量与 RMSprop/AdamProject 1A: Classifying Handwritten Digitstext/14-fm-project-1a-classifying-handwritten-digits.txt:334(搜「momentum」)
混淆矩阵定义Project 1A: Classifying Handwritten Digitstext/14-fm-project-1a-classifying-handwritten-digits.txt:207(搜「confusion matrix is a square」)
5/8/9 难认(猜想)Project 1A: Classifying Handwritten Digitstext/14-fm-project-1a-classifying-handwritten-digits.txt:244(搜「5s, 8s, and 9s」)
超参数Project 1A: Classifying Handwritten Digitstext/14-fm-project-1a-classifying-handwritten-digits.txt:205(搜「Hyperparameters」)
10⁵ 轮迭代Classifying Data with a Two-Layer Neural Networktext/12-fm-classifying-data-with-a-two-layer-neural-network.txt:186(搜「num_train_iterations」)

Footnotes

  1. 出处:「Project 1A: Classifying Handwritten Digits」第 108 段(text/14-fm-project-1a-classifying-handwritten-digits.txt:108,搜「26,506」)。网络结构 784→32→32→10,三层 Linear、sigmoid 激活。

  2. 出处:「Classifying Data with a Two-Layer Neural Network」第 7 段(text/12-fm-classifying-data-with-a-two-layer-neural-network.txt:7,搜「two or more hidden layers」)。原文:网络「typically considered "deep" when it contains two or more hidden layers」。

  3. 出处:「Using Different Activation Functions」第 19 段(text/11-fm-using-different-activation-functions.txt:19,搜「differentiable almost everywhere」)。

  4. 出处:「Using Different Activation Functions」第 5-13 段(text/11-fm-using-different-activation-functions.txt:5,搜「Sigmoid」)。

  5. 出处:「Using Different Activation Functions」第 21 段(text/11-fm-using-different-activation-functions.txt:21,搜「linear decision boundary」)。

  6. 出处:「Classifying Data with a Two-Layer Neural Network」第 11 段(text/12-fm-classifying-data-with-a-two-layer-neural-network.txt:11,搜「synthesizes these regions」);图示解读在第 13 段(text/12-fm-classifying-data-with-a-two-layer-neural-network.txt:13,搜「bisects the plane」)。

  7. 出处:「Classifying Data with a Two-Layer Neural Network」第 15 段(text/12-fm-classifying-data-with-a-two-layer-neural-network.txt:15,搜「multilayer perceptrons」)。

  8. 出处:「Classifying Data with a Two-Layer Neural Network」第 21 段(text/12-fm-classifying-data-with-a-two-layer-neural-network.txt:21,搜「XOR」)与「Classifying Data with a Three-Layer Neural Network」第 15 段(text/13-fm-classifying-data-with-a-three-layer-neural-netwo.txt:15,搜「XOR」)。

  9. 出处:「Classifying Data with a Two-Layer Neural Network」第 113 段(text/12-fm-classifying-data-with-a-two-layer-neural-network.txt:113,搜「loss function」)。

  10. 出处:「Classifying Data with a Two-Layer Neural Network」第 133 段(text/12-fm-classifying-data-with-a-two-layer-neural-network.txt:133,搜「mean squared error」)。

  11. 出处:「Classifying Data with a Two-Layer Neural Network」第 117 段(text/12-fm-classifying-data-with-a-two-layer-neural-network.txt:117,搜「gradient descent」)。

  12. 出处:「Classifying Data with a Two-Layer Neural Network」第 123 段(text/12-fm-classifying-data-with-a-two-layer-neural-network.txt:123,搜「chain rule」)。

  13. 出处:「Classifying Data with a Two-Layer Neural Network」第 119 段(text/12-fm-classifying-data-with-a-two-layer-neural-network.txt:119,搜「arguably the main technique」)。 2

  14. 出处:「Project 1A: Classifying Handwritten Digits」第 294 段(text/14-fm-project-1a-classifying-handwritten-digits.txt:294,搜「vanishing gradients」)。

  15. 出处:「Classifying Data with a Three-Layer Neural Network」第 29-31 段(text/13-fm-classifying-data-with-a-three-layer-neural-netwo.txt:29,搜「num_neurons_1」)与第 73 段(text/13-fm-classifying-data-with-a-three-layer-neural-netwo.txt:73,搜「impossible to classify with a two-layer」)。

  16. 出处:「Classifying Data with a Three-Layer Neural Network」第 17 段(text/13-fm-classifying-data-with-a-three-layer-neural-netwo.txt:17,搜「approximate any function」)。

  17. 出处:「Seminal Works and Further Reading」第 13 段(text/16-fm-seminal-works-and-further-reading.txt:13,搜「Approximation by Superpositions」)、第 15 段(text/16-fm-seminal-works-and-further-reading.txt:15,搜「Universal Approximators」)。

  18. 出处:「Project 1A: Classifying Handwritten Digits」第 7 段(text/14-fm-project-1a-classifying-handwritten-digits.txt:7,搜「60,000 training images」)。

  19. 出处:「Project 1A: Classifying Handwritten Digits」第 121 段(text/14-fm-project-1a-classifying-handwritten-digits.txt:121,搜「MSELoss」)与第 158-159 段(text/14-fm-project-1a-classifying-handwritten-digits.txt:159,搜「single epoch」)。

  20. 出处:「Project 1A: Classifying Handwritten Digits」第 199 段(text/14-fm-project-1a-classifying-handwritten-digits.txt:199,搜「accuracy of about 0.67」)。

  21. 出处:「Project 1A: Classifying Handwritten Digits」第 254 段(text/14-fm-project-1a-classifying-handwritten-digits.txt:254,搜「softmax activation」)、第 258 段(text/14-fm-project-1a-classifying-handwritten-digits.txt:258,搜「logits」)。

  22. 出处:「Project 1A: Classifying Handwritten Digits」第 275 段(text/14-fm-project-1a-classifying-handwritten-digits.txt:275,搜「accuracy of about 0.77」)。

  23. 出处:「Project 1A: Classifying Handwritten Digits」第 288 段(text/14-fm-project-1a-classifying-handwritten-digits.txt:288,搜「maximizing the likelihood」)。

  24. 出处:「Project 1A: Classifying Handwritten Digits」第 121 段(text/14-fm-project-1a-classifying-handwritten-digits.txt:121,搜「one-hot」)。

  25. 出处:「Project 1A: Classifying Handwritten Digits」第 294 段(text/14-fm-project-1a-classifying-handwritten-digits.txt:294,搜「vanishing gradients」)。

  26. 出处:「Project 1A: Classifying Handwritten Digits」第 311 段(text/14-fm-project-1a-classifying-handwritten-digits.txt:311,搜「accuracy of around 0.94」)。

  27. 出处:「Project 1A: Classifying Handwritten Digits」第 334 段(text/14-fm-project-1a-classifying-handwritten-digits.txt:334,搜「momentum」)。

  28. 出处:「Project 1A: Classifying Handwritten Digits」第 349 段(text/14-fm-project-1a-classifying-handwritten-digits.txt:349,搜「accuracy of around 0.97」)。

  29. 出处:「Project 1A: Classifying Handwritten Digits」第 207 段(text/14-fm-project-1a-classifying-handwritten-digits.txt:207,搜「confusion matrix is a square」)。

  30. 出处:「Project 1A: Classifying Handwritten Digits」第 244 段(text/14-fm-project-1a-classifying-handwritten-digits.txt:244,搜「5s, 8s, and 9s」)与第 398 段(text/14-fm-project-1a-classifying-handwritten-digits.txt:398,搜「sloppily」)。 2

  31. 出处:「Classifying Data with a Two-Layer Neural Network」第 186 段(text/12-fm-classifying-data-with-a-two-layer-neural-network.txt:186,搜「num_train_iterations」)、第 218 段(text/12-fm-classifying-data-with-a-two-layer-neural-network.txt:218,搜「intermediate values」)。

  32. 出处:「Project 1A: Classifying Handwritten Digits」第 205 段(text/14-fm-project-1a-classifying-handwritten-digits.txt:205,搜「Hyperparameters」)。