深度学习入门站 · 理解深度学习
首页 › 第 20 章

为什么深度学习有效?

一个理论视角:为什么"深而窄"的网络比"浅而宽"更擅长学习。
图 20-1:深度学习为什么有效:数据、算力、架构、表示学习
图 20-1:深度学习为什么有效:数据、算力、架构、表示学习

这一章是《理解深度学习》里最特别的一章:它不教你任何新模型,而是回答一个大家早就想问的问题——深度学习为什么这么能打?很多我们习以为常的现象,其实"理论上说不通":为什么同样多的参数,深而窄的网络比浅而宽的网络更能表达复杂函数?为什么图像、语音、语言这些现实问题,恰好适合深度学习来解?学完这一章,你就能用"分治""特征的层次结构""流形"这三个词,把深度学习的成功讲给别人听。

深而窄 vs 浅而宽:深度买到了什么?

先澄清一个常见的误会。通用逼近定理(Universal Approximation Theorem)说:只要隐藏单元足够多,一个很浅的网络也能以任意精度逼近任何函数。听起来"深度无所谓"?别急——定理只承诺了"理论上能做到",没承诺"要花多少单元"。就像从 1 加到 100,你可以一个一个加,也可以套公式,都能算对,但成本天差地别。

关键证据来自 ReLU 网络的一个性质:它算出的函数是分段线性的,就像用无数根小直尺拼出一条弯弯曲曲的线;拼出的"段数"越多,表达能力越强。研究者发现,同样的参数量,深网络能切出比浅网络多得多的线性段。有些特殊的"病态"函数,浅层网络需要指数级增长的单元才能画出来,深层网络却轻轻松松(Eldan & Shamir 2016;Telgarsky 2016)。深度买到的东西,就是这种"表达效率"。

怎么直观理解?假设我们只会画一个最简单的小锯齿 $g(x)$:在区间 $[0,1]$ 上从 0 爬到 1,再落回 0。现在把 $g$ 的输出再喂给 $g$,连续嵌套 $L$ 次,写成一个式子就是:

$$f(x) = \underbrace{g(g(\cdots g(x)\cdots))}_{L\ \text{次嵌套}}$$

这个式子意思是:把同一个"小动作"重复做 $L$ 遍。神奇的是,每嵌套一次,分段数就翻一倍——嵌套 $L$ 次后函数有 $2^L$ 段。想"一步到位"画出这么多段,浅层网络大约需要 $2^L-1$ 个单元;而深度网络只需要 $L$ 层、每层 3 个单元。$L=20$ 时,前者要约 100 万个单元,后者只要 60 个。跑一下代码,亲眼看看这个差距:

import numpy as np

def sawtooth(x):
    # 一个只有 1 个"山峰"的简单函数(用 3 个 ReLU 拼成)
    return 2*np.maximum(x, 0) - 4*np.maximum(x - 0.5, 0) + 2*np.maximum(x - 1, 0)

def count_segments(y):
    # 数函数"折成了几段":只统计斜率真正变号的拐点
    d = np.diff(y)
    up = (d[:-1] > 1e-12) & (d[1:] < -1e-12)    # 先升后降
    down = (d[:-1] < -1e-12) & (d[1:] > -1e-12)  # 先降后升
    return int(up.sum() + down.sum()) + 1

x = np.linspace(0, 1, 4001)
y = x.copy()
for depth in range(1, 5):
    y = sawtooth(y)                 # 嵌套:把上一层的输出再喂给同一个函数
    segs = count_segments(y)
    print(f"深度 {depth}: 折成 {segs:>3} 段 | 浅层约需 {segs - 1} 个单元, 深层只用 {depth * 3} 个")

每深一层,段数直接翻倍。更夸张的是,2017 年有研究者把 CIFAR-10 数据集的标签全部随机打乱,过参数化的网络照样能把训练数据"背"下来——它的表达能力大到可以死记硬背。所以问题从来不是"能不能表达",而是"花多少参数表达"。

🪆
生活类比
深度网络就像一套俄罗斯套娃:打开一个,里面是一个小一号的,再打开又是更小的。把一个小函数 $g$ "装进"另一个 $g$ 里,一层套一层——单独看每一层都简单得可笑,套在一起却表达出复杂得惊人的函数。

分治:复杂函数 = 简单函数的"套娃"

为什么嵌套这么有效?因为深度学习骨子里是一种分而治之(divide and conquer)的策略:把一个大问题,拆成许多小问题逐层解决。一个 $K$ 层的深网络可以写成:

$$f(x) = g_K\left(g_{K-1}\left(\cdots g_1(x)\cdots\right)\right)$$

这个式子意思是:先让 $g_1$ 对输入做一点小加工,把结果交给 $g_2$,再交给 $g_3$……每一层都不需要理解"整个问题",只要处理"上一层递过来的结果"。这就像工厂流水线:每个工位只拧一颗螺丝,但整条线合起来能组装出一台汽车。

回到通用逼近定理:浅层网络"理论上"确实也能逼近同样的函数,但往往需要天文数字般的单元(回想上面的 $2^L$)。深度的价值不是"能不能表达",而是高效表达——用少得多的参数完成同样的活。参数少,往往意味着更容易训练、更容易泛化。这就是"深度"最重要的意义。

💡
**核心思想**:深度不是"层数多"这种表面文章,而是一种表达策略——把复杂函数分解成简单函数的复合(分治),每一层只做一点点小改进。同样多的参数,深网络因此能表达复杂得多的函数,这是它"能打"的第一个秘密。

学到的不是答案,是特征的层次结构

分治听起来抽象,看看深度网络实际学到了什么就明白了。以图像识别为例:训练好的网络,底层神经元学会的是边缘、色块、小线段;中间层把边缘组合成纹理和局部形状(眼睛、轮子、羽毛);高层把部件组合成"头""翅膀";最后一层才把它们组装成"这是一只猫"。整个过程像搭乐高:底层是标准积木,越往上越是完整的零件,最后拼出整件作品。这就是特征的层次结构——从低级到高级,一层层抽象。

为什么这套打法在现实世界这么好使?因为图像、语音、语言这些数据本身就有层次:像素组成边缘,边缘组成物体;音素组成词,词组成句子;笔画组成字,字组成文章。深度学习的层次化表达,恰好"歪打正着"地匹配了现实世界天然的层次结构。

更进一步,网络的结构还自带"先入为主"的假设,这叫归纳偏置(inductive bias)。卷积网络天生假设"图像各处的规律是共享的",于是在每个位置用同一套参数扫描;Transformer 天生适合"顺序不敏感、内容重要"的数据。架构和数据的结构越匹配,学起来越省力、泛化越好——这也是为什么"什么问题配什么结构"在深度学习里极其重要。

高维空间的直觉:数据是"摊"在低维结构上的

还有一个数学上的悖论:维数灾难(curse of dimensionality)。书里的小数据集 MNIST-1D 只有 40 个输入维度,每个维度就算只有 10 种取值,可能的输入也有 $10^{40}$ 种,而训练样本只有 1 万个——可能输入足足多了 36 个数量级。照这个算法,数据在输入空间里应该稀薄得像真空,模型怎么可能学得会?

答案藏在流形假说(manifold hypothesis)里:真实数据虽然生活在高维空间,却往往"挤"在某个低维结构上——就像一张纸可以弯成任意形状,但它本质上还是二维的。一张 $100\times100$ 的图片有 1 万个像素维度,但"像猫的图片"其实只由姿态、光照、品种等少数几个自由度控制,只占整个空间极小的一块。深度网络的高明之处在于:每一层把数据"拉直一点、摊开一点",逐层展开卷曲的流形,最后让纠缠不清的类别边界变成一条轻松可分的直线。

但也别把深度学习神化。它只是在数据流形附近自信:2014 年的研究给一张被正确识别为"狗"的照片加上人眼几乎看不出差别的小扰动,网络立刻把它认成"鸵鸟"——这种对抗样本说明,模型对"流形之外"的世界一无所知。它的强大,建立在"现实世界的数据恰好落在那块低维结构上"这个幸运事实上。

🎯 小测验

1. 通用逼近定理说"单元足够多的浅层网络也能逼近任意函数",那深度到底买到了什么?
2. "流形假说"想表达的核心意思是?
3. 深度网络"特征的层次结构"指的是什么?