跳到主要内容

第2章:视觉突破——卷积网络与深度学习的崛起

承接第1章的三个遗留问题:梯度消失让深层网络无法训练,算力不足让实验无法规模化,标注数据稀缺让模型无从泛化。 本章展示这三个问题如何在视觉领域被一一攻克——而这条路,最终铺向了 LLM 时代。


2.1 卷积的直觉:局部性与平移不变性

为什么全连接对图像低效?

先看一张 224×224 的彩色图像:像素数 = 224×224×3=150,528224 \times 224 \times 3 = 150,528

如果把它展平成向量,送入一个隐藏层(假设 1024 个神经元),仅这一层的参数量就是:

150,528×1,0241.5 亿参数150{,}528 \times 1{,}024 \approx 1.5 \text{ 亿参数}

这带来两个问题:

  1. 计算爆炸:参数太多,内存和算力吃不消。
  2. 无视空间结构:展平后,相邻像素之间的空间关系完全丢失。对于全连接层,左上角的像素和右下角的像素"地位相等"——但对图像来说,局部纹理才是判断猫还是狗的关键。

图像天然具有两个性质:

  • 局部性(Locality):判断某个区域是不是"边缘",只需要看附近几个像素,不需要看整张图。
  • 平移不变性(Translation Invariance):一只猫出现在图片左边还是右边,都是猫;识别它的"模式"不应该随位置改变。

卷积操作正是为利用这两个性质而设计的。

卷积核:共享权重、局部感知

一个 3×33 \times 3 的卷积核(kernel)是一个小矩阵,它在输入图像上滑动,每次只看一个 3×33 \times 3 的局部区域,计算点积:

y[i,j]=m=02n=02w[m,n]x[i+m,  j+n]y[i,j] = \sum_{m=0}^{2}\sum_{n=0}^{2} w[m,n] \cdot x[i+m,\; j+n]

关键洞察:同一个卷积核的权重,在整张图上共享

这意味着"检测水平边缘"的那组权重,无论应用到图像的哪个位置,都是同一套——极大减少参数量。一个 3×33\times3 卷积核只有 9 个参数,却能作用于整张图。

:::info 参数量对比

方式处理 224×224 图像所需参数(第一层)
全连接层(1024神经元)~1.5 亿
64 个 3×3 卷积核3×3×3×64=1,7283 \times 3 \times 3 \times 64 = 1,728

参数量减少了 5 个数量级。 :::

池化:降维与位置鲁棒性

卷积之后,特征图(feature map)仍然很大。池化层(Pooling)对局部区域取最大值(Max Pooling)或平均值,从而:

  1. 降低分辨率,减少后续计算量。
  2. 增加位置鲁棒性:一个特征在 2×22\times2 范围内稍微移动,最大池化的输出不变——这强化了平移不变性。
y[i,j]=max0m,n<2x[2i+m,  2j+n]y[i,j] = \max_{0 \le m,n < 2} x[2i+m,\; 2j+n]

卷积(提取局部特征)+ 池化(降维+鲁棒)构成了视觉网络的基本积木。接下来,让我们看它第一次被真正工程化的时刻。


2.2 LeNet(1998)

问题:如何自动识别手写邮政编码?

1990 年代,美国邮政局每天处理数亿封信件,手动识别手写邮编耗费大量人力。Yann LeCun 在 AT&T Bell Labs 提出了 LeNet-5,用卷积网络解决这个问题。

架构:卷积 + 池化 + 全连接的基础范式

LeNet-5 的结构可以描述为:

输入 32×32 灰度图
→ Conv(6个5×5核) → 28×28×6
→ AvgPool(2×2) → 14×14×6
→ Conv(16个5×5核)→ 10×10×16
→ AvgPool(2×2) → 5×5×16
→ 展平 → 400维
→ FC(120) → FC(84) → FC(10)
→ 输出:10个数字类别

这个"Conv-Pool-Conv-Pool-FC"的结构,成为此后二十年 CNN(Convolutional Neural Network,卷积神经网络)设计的基础范式。

LeNet 在 MNIST 数据集上达到了 99%+ 的准确率,比当时所有方法都好。但它有两个硬约束:

  • 只能处理 32×3232\times32 的小图像
  • 训练依赖 CPU,速度极慢,无法扩展到更复杂任务

这两个约束,把 CNN 困在小众场景里,长达十几年。


2.3 沉寂的十年(1998–2012)

LeNet 发表后,神经网络并没有立刻席卷学界。恰恰相反,在接下来的十年里,支持向量机(SVM)才是主流

为什么 SVM 赢了?

SVM 背后的核技巧(Kernel Trick)让它能在高维空间找到最优分类边界,而且:

  • 有坚实的凸优化理论保证全局最优
  • 在小数据集上泛化能力强
  • 不需要调很多超参数

反观神经网络:梯度消失问题(第1章)仍未解决,深层网络基本训练不动;数据少的时候,神经网络容易过拟合;训练一个像样的网络需要数周 CPU 时间。

在数据量有限、算力有限的世界里,SVM 是更务实的选择。

三个缺失要素

:::warning 三缺一不可

缺失要素影响
大规模标注数据神经网络参数多,少量数据只会过拟合
GPU 并行算力深层网络的矩阵运算在 CPU 上慢几十倍
更好的训练技巧ReLU、Dropout、BatchNorm 都还未出现

三者同时缺失,深度学习就是纸上谈兵。 :::

转折点:三件事在 2009–2012 年同时发生

  1. ImageNet(2009):李飞飞团队发布 ImageNet,包含 1400 万张图片、1000 个类别,提供了前所未有的大规模标注数据。
  2. CUDA GPU 可编程(2007–2010):NVIDIA 的 CUDA 让研究者可以用游戏显卡做通用并行计算,矩阵乘法速度提升 10–50 倍。
  3. ILSVRC 竞赛(2010):ImageNet 大规模视觉识别竞赛开始举办,每年评测,全球顶尖实验室同台比拼。

2010、2011 年的冠军仍是传统方法(手工特征 + SVM)。2012 年,一切改变了。


2.4 AlexNet(2012):深度学习的奇点

问题:能否让神经网络赢得 ImageNet?

Geoffrey Hinton 的学生 Alex Krizhevsky,用两块 GTX 580 GPU 训练了一个更深的卷积网络。

核心改进

1. 更深的网络:5 个卷积层 + 3 个全连接层,参数约 6000 万。

2. ReLU 激活函数

以前常用 Sigmoid 或 Tanh:

σ(x)=11+ex,tanh(x)=exexex+ex\sigma(x) = \frac{1}{1+e^{-x}}, \quad \tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}}

这两个函数在 x|x| 较大时梯度趋近于 0,直接导致梯度消失。

AlexNet 改用 ReLU(Rectified Linear Unit,线性整流函数):

ReLU(x)=max(0,x)\text{ReLU}(x) = \max(0, x)

ReLU 在正区间梯度恒为 1,从根本上缓解了梯度消失,而且计算极简。

3. Dropout 正则化:训练时随机将 50% 的神经元输出置为 0,强迫网络学习冗余表示,大幅降低过拟合。

4. 双 GPU 并行训练:当时单卡显存不够,将网络切分到两张 GPU 上,训练时间从"数月 CPU"缩短到"约一周 GPU"。

5. 数据增强(Data Augmentation):随机裁剪、水平翻转,人工扩大训练集多样性。

效果:历史性突破

年份方法ILSVRC Top-5 错误率
2010传统特征 + SVM28.2%
2011改进传统方法25.8%
2012AlexNet15.3%
第二名(2012)传统方法26.2%

AlexNet 的错误率比第二名低了 10.9 个百分点——这不是小幅改进,这是降维打击。

从这一天起,所有主流视觉研究都开始拥抱深度学习。

:::tip 为什么 2012 年是奇点? AlexNet 的成功不仅仅是"一个模型赢了比赛",而是证明了可扩展性:给更多数据、更多算力、更深网络,精度就会提升。这个范式此后被复制到 NLP、语音、蛋白质结构预测……直至今天的 LLM。 :::

遗留问题

AlexNet 揭示了一个新困境:更深的网络精度更高,但梯度消失问题随深度指数级恶化。能不能把网络做到几十层、上百层?


2.5 VGG 与 GoogLeNet(2014):深度的两种哲学

2014 年,两支团队用截然不同的思路同时推进深度极限。

VGG:简单暴力的堆叠

牛津大学 VGG 团队的答案很直接:把 3×3 的小卷积核一直堆下去

为什么偏爱 3×3 卷积?两个 3×3 卷积叠加的感受野等于一个 5×5 卷积,但参数量更少:

2×(3×3)=18<5×5=252 \times (3 \times 3) = 18 < 5 \times 5 = 25

VGG-16 有 16 个带参数的层,VGG-19 有 19 层。结构极度规整,工程上易于理解和复现。

VGG-16 将 ILSVRC 错误率降至 7.3%,参数量约 1.38 亿。

代价:参数太多,推理慢,内存占用大。

GoogLeNet:Inception 多尺度并行

Google 团队的答案是:不一定要更深,也可以更"宽"

Inception 模块同时用 1×11\times13×33\times35×55\times5 卷积和 MaxPool 并行处理同一输入,再拼接结果:

输入特征图
┌───┬───┬───┬───┐
1×1 1×1 1×1 MaxPool
↓ ↓ ↓
3×3 5×5 1×1
└───┴───┴───┴───┘
拼接所有输出

不同尺寸的卷积核捕捉不同尺度的特征,网络自己学习哪种尺度最有用。

GoogLeNet 共 22 层,参数只有 AlexNet 的 1/12(约 500 万),ILSVRC 错误率降至 6.7%

共同发现

两队殊途同归,都证明了:越深(或越宽)的网络,表达能力越强,精度越高。但随着层数增加,训练变得越来越不稳定——梯度在几十层的反向传播中指数衰减,深层参数几乎得不到有效更新。

这个问题在 2015 年迎来了最优雅的解法。


2.6 ResNet(2015):残差连接征服深度

问题:为什么 56 层比 20 层更差?

理论上,56 层的网络至少应该和 20 层一样好——多出来的 36 层可以学恒等映射(什么都不做)。但 Microsoft Research 的何恺明团队在实验中发现,56 层网络在训练集上的损失就已经比 20 层更高,不是过拟合,而是退化(Degradation)

更深的网络更难优化——这是梯度消失的直接体现。

核心思想:残差连接(Residual Connection)

何恺明的洞察简洁到令人惊叹:

与其让网络学习 H(x)\mathcal{H}(x)(目标映射),不如让它学习 F(x)=H(x)x\mathcal{F}(x) = \mathcal{H}(x) - x(残差),然后在输出时加回 xx

输出=F(x)+x\text{输出} = \mathcal{F}(x) + x

这个"跳跃连接(Skip Connection)"将输入 xx 直接加到几层之后的输出上:

x ──────────────────────────┐
│ │ (跳跃连接)
└→ Conv → BN → ReLU → Conv ─⊕→ ReLU → 输出

为什么有效?

反向传播时,梯度可以通过跳跃连接直接回传到浅层,绕过中间层的连乘衰减:

Lossx=Loss输出(1+Fx)\frac{\partial \text{Loss}}{\partial x} = \frac{\partial \text{Loss}}{\partial \text{输出}} \cdot \left(1 + \frac{\partial \mathcal{F}}{\partial x}\right)

即使 Fx\frac{\partial \mathcal{F}}{\partial x} 接近 0(梯度消失),总梯度中的"1"保证了信号能流通。梯度高速公路由此建立。

效果:152 层、人类基准

模型层数ILSVRC Top-5 错误率
AlexNet815.3%
VGG-16167.3%
GoogLeNet226.7%
ResNet-50505.3%
ResNet-1521523.57%
人类基准~5.1%

ResNet-152 在 ImageNet 上首次超越人类,用的只是一个干净的残差设计。

:::info 残差连接的深远影响 残差连接成为了现代深度学习的标配:

  • Transformer(2017):每个注意力层和 FFN 层都有残差连接
  • GPT / BERT(2018–):继承自 Transformer
  • 扩散模型 U-Net:跳跃连接贯穿整个架构

没有残差连接,就没有今天的 LLM。 :::


本章小结

模型年份核心贡献解决的问题
LeNet1998卷积 + 池化范式小规模图像识别
AlexNet2012ReLU、Dropout、GPU训练大规模图像分类
VGG2014深度规整堆叠提升表达能力
GoogLeNet2014Inception 多尺度并行效率与精度平衡
ResNet2015残差连接梯度消失、网络退化

视觉领域用了近二十年,才把"更深的网络"这个想法变成现实。每一步都是被前一个问题逼出来的:全连接低效 → 卷积;小数据 + 弱算力 → 等待 GPU + ImageNet;梯度消失 → ReLU;网络退化 → 残差连接。


引出下一章:CNN 征服了图像——输入是固定大小的像素网格,位置关系清晰。但语言不一样:一句话的长度是可变的,单词之间的依赖可以跨越任意距离,"它"指代的是前面哪个名词,要看整个句子的上下文。

对序列数据,卷积束手无策。下一章,我们来看研究者为语言设计的第一套专用武器——循环神经网络(RNN)及其变体。