跳到主要内容

深度由此开始 — 多层感知机、反向传播与深网的泛化之谜

这一章讲四件事: 为什么线性模型必须升级(隐藏层); 为什么升级的关键是一个小小的非线性函数(激活函数); 几百层网络的梯度怎么算(反向传播)以及为什么会算崩(数值稳定性); 最后是一个诚实的交代:深度网络为什么能泛化,理论上没人知道。 这是全书从「线性模型」跨入「深度学习」正门的一章。

1. 线性模型的死穴:它假设了单调性

线性模型藏着一个比「线性」更弱的假设:单调性—— 任何特征变大,输出要么永远变大(权重正),要么永远变小(权重负)1

有时候这说得通(收入越高、还款能力越强); 有时候靠预处理能救(体温偏离 37°C 越远越危险, 那就拿「离 37°C 的距离」当特征)2。 但图像判死刑:位置 (13,17) 的像素变亮,应该让「是狗」的可能性 永远变大还是永远变小? 说不清——像素的意义取决于周围的像素, 而且把整张图反色,猫还是猫3。 这种「特征间的交互」手工算不出来,所以:

让模型自己学一个表示(隐藏层),再在学出的表示上做线性预测。

2. 关键的一步:没有非线性,堆层等于没堆

最直觉的堆法是再叠一层全连接:H = XW⁽¹⁾+b⁽¹⁾,O = HW⁽²⁾+b⁽²⁾。 第一层学出的中间结果 H 叫隐藏表示

但这样什么都没赚到。展开一算4:

O = (XW⁽¹⁾+b⁽¹⁾)W⁽²⁾ + b⁽²⁾ = X·(W⁽¹⁾W⁽²⁾) + (b⁽¹⁾W⁽²⁾+b⁽²⁾) = XW + b

仿射函数的仿射函数还是仿射函数——两层塌缩回一层, 等价于一个单层模型,只是参数多了一倍。深度的开关是:

在每层的仿射变换之后,插一个非线性激活函数 σ: H = σ(XW⁽¹⁾+b⁽¹⁾)。有了它,模型再也塌缩不回线性5

三个主力激活函数,记住形状和导数就够6:

函数形状导数命运
ReLU max(0,x)负半轴拍平成 0,正半轴原样通过0 或 1现代默认;导数要么消失要么直通,优化行为好
sigmoid 1/(1+e⁻ˣ)压到 (0,1)最大 0.25,两端≈0饱和区梯度消失,隐藏层被淘汰;二分类输出层还在用
tanh压到 (−1,1),原点对称最大 1,两端≈0比 sigmoid 居中,循环网络的门里常见

sigmoid 的历史地位值得一提:早期研究者想要「神经元要么点火要么不点」的效果, 也就是一个阈值(超过某个界限才触发、否则静默的)开关。

sigmoid 正是这种开关的平滑可导近似,所以成了默认选择7—— 直到它的饱和区成为训练深网的噩梦(第 5 节),ReLU 才接管。

万能逼近:能表示 ≠ 能学到

一个著名的理论结果:只要隐藏层足够宽,单隐层网络能表示任何函数(Cybenko 1989 等)。 作者给了一个清醒的类比:神经网络有点像 C 语言—— 能表达任何程序,但写出你要的那个程序才是难点8。 「能表示」是表达力问题,「能学到」是优化与泛化问题,两回事。 而且深往往比宽省参数——这是「深度学习」而不是「宽度学习」的原因之一。

3. 反向传播:五步链式法则走查

第 02 章说反向传播是「沿计算图反向应用链式法则」。 这一节把它在一个具体网络上走完—— 单隐层 MLP + weight decay(数字与公式都是书里的)9

前向(箭头向下,每个中间值都存起来):

z = W⁽¹⁾x 隐藏层线性部分
h = φ(z) 激活
o = W⁽²⁾h 输出
L = l(o, y) 损失
s = (λ/2)(‖W⁽¹⁾‖² + ‖W⁽²⁾‖²) 正则项
J = L + s 总目标

反向(从 J 出发,五步,每一步都是链式法则):

① ∂J/∂o = ∂L/∂o 输出处
② ∂J/∂W⁽²⁾ = ∂J/∂o · hᵀ + λW⁽²⁾ 靠输出的参数(用到前向存的 h)
③ ∂J/∂h = W⁽²⁾ᵀ · ∂J/∂o 把「责任」传回隐藏层
④ ∂J/∂z = ∂J/∂h ⊙ φ'(z) 穿过激活函数(逐元素乘)
⑤ ∂J/∂W⁽¹⁾ = ∂J/∂z · xᵀ + λW⁽¹⁾ 靠输入的参数(用到前向存的 x)

三步看点:每步只做「上游传来的梯度 × 本处的局部导数」; 参数梯度里出现的是前向存下的中间值(h 和 x)——所以前向必须存; 正则项的贡献就是那步「+λW」,和主梯度并行相加。

由此得一个直接的工程后果:反向要用前向存的所有中间值, 所以训练比预测费内存得多——中间值的大小约等于层数×批大小, 层深批大,显存(GPU 卡上自己的内存)就 OOM(内存溢出)10

4. 数值稳定性:梯度为什么会消失或爆炸

第 3 节那串连乘,就是问题的来源。 L 层网络,某层参数的梯度是 L−l 个矩阵的连乘—— 矩阵连乘,特征值稍偏一点,结果就指数级地放大或缩小11

梯度消失:sigmoid 在输入很大或很小时导数≈0。 多层串联时,除非各层输入都恰好落在 0 附近 (书里叫 Goldilocks 区),梯度在某一关被掐断,前层就学不到东西—— 这曾长期困扰深网训练,ReLU 的流行正是对症:正半轴导数恒为 112

梯度爆炸:反方向,连乘发散。书里演示了 100 个方差为 1 的 高斯随机矩阵连乘,结果直接爆掉——初始化不当时,优化器根本没有机会。

对称性必须打破:同一层的神经元在数学上完全对称(置换不变)。 如果所有参数初始化成同一个常数,每个神经元算出的激活相同、梯度也相同—— 它们将永远同步更新,整个隐藏层退化成一个神经元13。 所以初始化必须随机。顺带一提:dropout(第 6 节)也能打破这种对称。

Xavier 初始化给出的具体尺度14: 前向想让每层输出的方差稳定,需要 n_in·σ² = 1; 反向想让梯度方差稳定,需要 n_out·σ² = 1; 两者不可兼得,取折中 σ² = 2/(n_in+n_out)—— 按输入输出神经元数的几何关系定初始化方差。 后来有人沿着这条思路设计出能直接训练一万层网络的初始化(Xiao et al. 2018)15

5. 深网的泛化之谜:理论失声的地方

第 04 章留下的问题,这里给出研究现状。作者的态度非常坦白: 「如果你想要一个利落的解释——为什么能优化、为什么能泛化—— 那你可以先去给自己倒一杯酒。」两个方向都还是 wild west16

三件反直觉的事,每件都砸经典理论一下:

  1. 所有候选模型都能把训练误差降到零时,经典「复杂度-过拟合」曲线失灵; 而且把模型做得更大,泛化误差常常继续降;
  2. double descent:泛化鸿沟随复杂度先升后降再升, 不是经典理论预言的单峰17;
  3. 基于 VC 维/Rademacher 复杂度的经典泛化界, 对「能拟合随机标签」的网络给不出任何有效解释18

一个越来越有影响的视角是把过参数化网络看成非参数模型: 1-近邻分类器训练误差恒为 0,却能一致收敛到最优预测—— 「完美拟合训练集」与「泛化好」本来就不矛盾。 更强的联系是 NTK(神经正切核):无限宽的随机初始化 MLP, 等价于一个特定的核方法19

实践者的工具箱不靠理论,靠「试出来有效」: early stopping(网络要很多轮才有能力拟合噪声,所以提前停; 数据越脏,越该早停)和下一节的 dropout。

6. dropout:往网络内部注入噪声

第 04 章的 weight decay 限制参数取值;dropout 走另一条路: 让函数对小扰动不敏感(平滑=简单)

谱系:Bishop 1995 年证明「训练时给输入加高斯噪声」 在数学上等价于 Tikhonov 正则化; 2014 年 Srivastava/Hinton 把这个想法搬进网络内部: 前向传播(从输入到输出把网络算一遍、得到预测的那一趟)时,每个隐藏单元(隐藏层里的单个神经元)以概率 p 被临时置零20。 (原论文用性繁殖打破基因共适应来类比,作者明说那是他们附会的叙事—— 真正管用的是机制本身。)

关键的工程设计是无偏:被置零的单元输出 0, 幸存的单元输出放大 1/(1−p) 倍21:

h' = 0 概率 p
h' = h/(1−p) 概率 1−p

这样每个单元输出的期望不变

h'
= h。 效果是:输出层不敢过度依赖任何一个隐藏单元—— 它随时可能缺席,梯度也随之消失。 走查一下:5 个单元的隐藏层,p=0.5,某一步 h₂ 和 h₅ 被置零, 这一步的输出完全绕开它们俩,反向时它们也收不到梯度。

惯例:靠近输入的层 dropout 率更低;训练时开,测试时关。 (也有人测试时多次开 dropout 采样,用预测的分歧度估计不确定性—— 这是技巧不是常规22。)

7. 作者的判断与证据

书里给了证据的: 两层线性塌缩的推导;反向传播五步; Xavier 的方差推导;Bishop 噪声=正则化的等价(引文);dropout 实验。

作者标为未解决的: 深网为何泛化(整个第 5 节); dropout 为何有效(「性繁殖类比」被他自标为叙事; 「noise in optimization helps」是反复出现但理论未明的主题); early stopping 的有效性同样只有经验证据。

判断(我们的,不是书里的): 这一章给实践者最重要的一个校准是: 「能拟合随机标签」不是 bug,而是深度模型设计上的特性—— 它们被刻意造成了插值(在训练数据点上精确穿过、训练误差为零的)器。所以「训练误差到零」从此不构成任何信息, 评估的唯一锚点是留出数据。第 04 章的测试集纪律,在深网时代不是建议而是前提。 如果错,会错在: 如果未来理论证明某类深网的泛化可以被先验保证 (NTK 方向只是开端),「只能靠留出数据」就要被修正为「某些情形下可以有理论兜底」。

8. 边界与局限

  • 万能逼近是存在性结果,不告诉你多宽、也不保证学得到;
  • Xavier 推导假设了线性激活,对带非线性的真实网络只是「实践中好用」;
  • 本章只覆盖全连接 MLP;卷积、循环等结构第 08-11 章;
  • Kaggle 房价一节(原书 ch32)是完整项目流程(缺失值、对数变换、K 折),拆解不展开。

9. 可带走的

  1. 线性模型的死穴是单调性假设;像素的意义在上下文里,所以表示要学;
  2. 没有非线性,堆层等于没堆——仿射的仿射还是仿射;
  3. ReLU 默认,sigmoid/tanh 记住饱和区=梯度消失;
  4. 反向传播五步:责任逐层回传,参数梯度=上游梯度×前向存的中间值;
  5. 训练内存 ≈ 层数×批大小,所以训练比预测费内存得多;
  6. 梯度消失/爆炸来自矩阵连乘;初始化必须随机(破对称)且有尺度(Xavier);
  7. 深网泛化无理论:double descent、VC 维失灵、NTK 是方向;
  8. dropout:训练时以概率 p 置零、幸存放大 1/(1−p),期望不变;测试时关;
  9. early stopping:数据越脏,越该早停。

10. 原文地图

主题原书章原文位置
单调性假设、体温、反色图Multilayer Perceptronstext/26-multilayer-perceptrons.txt:76(搜「monotonicity」) · text/26-multilayer-perceptrons.txt:104(搜「37°C」) · text/26-multilayer-perceptrons.txt:123(搜「inverting an image」)
两层塌缩Multilayer Perceptronstext/26-multilayer-perceptrons.txt:211(搜「gain nothing」) · text/26-multilayer-perceptrons.txt:217(搜「affine function of an affine function」)
万能逼近与 C 语言Multilayer Perceptronstext/26-multilayer-perceptrons.txt:279(搜「C programming language」)
三个激活函数Multilayer Perceptronstext/26-multilayer-perceptrons.txt:317(搜「ReLU」) · text/26-multilayer-perceptrons.txt:438(搜「natural choice」) · text/26-multilayer-perceptrons.txt:493(搜「0.25」)
反向传播五步Forward/Backward Propagationtext/28-forward-propagation-backward-propagation-and-com.txt:47(搜「pay the cost」) · text/28-forward-propagation-backward-propagation-and-com.txt:266(搜「reuses the stored intermediate values」)
训练更费内存Forward/Backward Propagationtext/28-forward-propagation-backward-propagation-and-com.txt:270(搜「significantly more memory」)
Goldilocks 区、对称性Numerical Stability and Initializationtext/29-numerical-stability-and-initialization.txt:165(搜「Goldilocks zone」) · text/29-numerical-stability-and-initialization.txt:240(搜「permutation symmetry」)
Xavier 与万层网络Numerical Stability and Initializationtext/29-numerical-stability-and-initialization.txt:351(搜「Xavier initialization」) · text/29-numerical-stability-and-initialization.txt:385(搜「10,000-layer」)
倒一杯酒、wild westGeneralization in Deep Learningtext/30-generalization-in-deep-learning.txt:38(搜「pour yourself a drink」) · text/30-generalization-in-deep-learning.txt:43(搜「wild west」)
double descent、VC 维Generalization in Deep Learningtext/30-generalization-in-deep-learning.txt:145(搜「double-descent」) · text/30-generalization-in-deep-learning.txt:161(搜「VC dimension」)
1-近邻与 NTKGeneralization in Deep Learningtext/30-generalization-in-deep-learning.txt:193(搜「When $k=1$」) · text/30-generalization-in-deep-learning.txt:220(搜「interpolate」)
Bishop 噪声谱系、无偏Dropouttext/31-dropout.txt:33(搜「Bishop」) · text/31-dropout.txt:35(搜「Tikhonov regularization」) · text/31-dropout.txt:89(搜「debiases」)
性繁殖叙事、测试时关Dropouttext/31-dropout.txt:60(搜「sexual reproduction」) · text/31-dropout.txt:159(搜「disable dropout at test time」)

Footnotes

  1. 出处:「Multilayer Perceptrons」第 76 段(text/26-multilayer-perceptrons.txt:76,搜「monotonicity」)。

  2. 出处:「Multilayer Perceptrons」第 104 段(text/26-multilayer-perceptrons.txt:104,搜「37°C」)。

  3. 出处:「Multilayer Perceptrons」第 123 段(text/26-multilayer-perceptrons.txt:123,搜「inverting an image」)。

  4. 出处:「Multilayer Perceptrons」第 211 段(text/26-multilayer-perceptrons.txt:211,搜「gain nothing」)与第 222 段(text/26-multilayer-perceptrons.txt:222,搜「collapse out the hidden layer」)。

  5. 出处:「Multilayer Perceptrons」第 240 段(text/26-multilayer-perceptrons.txt:240,搜「no longer possible to collapse」)。

  6. 出处:「Multilayer Perceptrons」第 317 段(text/26-multilayer-perceptrons.txt:317,搜「ReLU」)、第 438 段(text/26-multilayer-perceptrons.txt:438,搜「natural choice」)与第 493 段(text/26-multilayer-perceptrons.txt:493,搜「0.25」)。更新的 GELU、Swish 见同章末。

  7. 出处:「Multilayer Perceptrons」第 432 段(text/26-multilayer-perceptrons.txt:432,搜「thresholding units」)。

  8. 出处:「Multilayer Perceptrons」第 279 段(text/26-multilayer-perceptrons.txt:279,搜「C programming language」)。深比宽更省参数见第 296 段(Simonyan & Zisserman 引文)。

  9. 出处:「Forward Propagation, Backward Propagation, and Computational Graphs」第 47 段(text/28-forward-propagation-backward-propagation-and-com.txt:47,搜「pay the cost」)。

  10. 出处:「Forward Propagation, Backward Propagation, and Computational Graphs」第 270 段(text/28-forward-propagation-backward-propagation-and-com.txt:270,搜「significantly more memory」)与第 275 段(text/28-forward-propagation-backward-propagation-and-com.txt:275,搜「out-of-memory」)。

  11. 出处:「Numerical Stability and Initialization」第 80 段(text/29-numerical-stability-and-initialization.txt:80,搜「product of $L-l$ matrices」)。

  12. 出处:「Numerical Stability and Initialization」第 165 段(text/29-numerical-stability-and-initialization.txt:165,搜「Goldilocks zone」)。

  13. 出处:「Numerical Stability and Initialization」第 240 段(text/29-numerical-stability-and-initialization.txt:240,搜「permutation symmetry」)与第 260 段(text/29-numerical-stability-and-initialization.txt:260,搜「never break the symmetry」)。

  14. 出处:「Numerical Stability and Initialization」第 351 段(text/29-numerical-stability-and-initialization.txt:351,搜「Xavier initialization」)。Glorot & Bengio 2010;均匀分布版 U(±√(6/(n_in+n_out)))。

  15. 出处:「Numerical Stability and Initialization」第 385 段(text/29-numerical-stability-and-initialization.txt:385,搜「10,000-layer」)。

  16. 出处:「Generalization in Deep Learning」第 38 段(text/30-generalization-in-deep-learning.txt:38,搜「pour yourself a drink」)与第 43 段(text/30-generalization-in-deep-learning.txt:43,搜「wild west」)。

  17. 出处:「Generalization in Deep Learning」第 145 段(text/30-generalization-in-deep-learning.txt:145,搜「double-descent」)。Nakkiran et al. 2021。

  18. 出处:「Generalization in Deep Learning」第 161 段(text/30-generalization-in-deep-learning.txt:161,搜「VC dimension」)。「能拟合随机标签」指 Zhang et al. 2021 的实验。

  19. 出处:「Generalization in Deep Learning」第 197 段(text/30-generalization-in-deep-learning.txt:197,搜「consistent」)与第 232 段(text/30-generalization-in-deep-learning.txt:232,搜「neural tangent kernel」)。Jacot et al. 2018。

  20. 出处:「Dropout」第 33 段(text/31-dropout.txt:33,搜「Bishop」)与第 43 段(text/31-dropout.txt:43,搜「internal layers」)。

  21. 出处:「Dropout」第 89 段(text/31-dropout.txt:89,搜「debiases」)。E[h']=h 由设计保证。

  22. 出处:「Dropout」第 159 段(text/31-dropout.txt:159,搜「disable dropout at test time」)与第 165 段(text/31-dropout.txt:165,搜「uncertainty」)。