本讲目录

第 05 讲 · AlexNet 与深度学习热潮

诞生场景:2012 年之前,计算机视觉的标准流程是:博士们手工设计特征(SIFT、HOG……一个好特征够发一篇顶会),再喂给 SVM。ImageNet 挑战赛(120 万张图、1000 类)上,这套流程的错误率卡在 26% 附近逐年只降零点几。2012 年 9 月 30 日,Hinton 的两个学生 Krizhevsky 和 Sutskever 用一个 8 层卷积神经网络(AlexNet)拿到 15.3%,领先第二名 10.9 个百分点——竞赛史上从未有过的断层。整个领域一夜转向,深度学习热潮就此点燃。本讲讲清楚:CNN 是什么、为什么它天生适合图像、以及 2012 年到底是哪几件事凑齐了。

学习层:一个小窗口如何看见边缘

具体图像谜题:白色方块的左边是什么方向?

把下面的 5×5 网格看成一张黑底白方块的图像:1 是亮像素,0 是暗像素。先只看窗口行 \(r=1\)、列 \(c=0\) 的 3×3 小块,并暂时使用竖直边缘核。这个窗口的左侧是 0,右侧是 1;在不把核翻转的前提下,输出应该是正、负还是接近 0?

X =          K_edge =       当前窗口 X[1:4, 0:3] =
0 0 0 0 0    -1  0  1       0 1 1
0 1 1 1 0    -2  0  2       0 1 1
0 1 1 1 0    -1  0  1       0 1 1
0 1 1 1 0
0 0 0 0 0

先预测,再让窗口移动

先写下三个答案再打开实验:① \(H=W=5,k=3,p=0,s=1\) 时输出是几乘几?② 同一个亮方块向右平移一格,边缘响应的数值会消失,还是主要在特征图上向右移动?③ 若把步长改为 \(s=2\)、填充改为 \(p=1\),\(5\times5\) 输入的输出尺寸是多少?点击“下一窗口”,用逐项乘加检查自己的预测。

最小模型:只保留一个核和一个输出

先忘掉 AlexNet 的数百万参数,只保留一个像素网格 \(X\)、一个 \(3\times3\) 核 \(K\) 和一个输出位置。本实验把偏置固定为 \(b=0\)。窗口左上角由 \(r s-p,\;c s-p\) 给出,越过边界的像素按 0 处理;输出就是窗口与核的逐元素乘积之和。移动窗口时,同一份 K 被再次使用,这正是参数共享,而不是为每个位置另存一套权重。

无 JavaScript 时的静态版本:下面的输入、核与计算仍然可读;固定偏置 \(b=0\),默认采用 CNN 实际使用的互相关(不翻转核)、步长 \(s=1\)、填充 \(p=0\)。在窗口 \(r=1,c=0\) 处,逐项计算为 \(0\times(-1)+1\times0+1\times1+0\times(-2)+1\times0+1\times2+0\times(-1)+1\times0+1\times1=4\);整个输出特征图为:

3   0  -3
4   0  -4
3   0  -3

输出尺寸 = floor((5 + 2×0 - 3) / 1) + 1 = 3×3。
脚本加载后:可切换边缘、模糊、锐化三个核;改步长/填充;点击像素编辑输入;移动或逐格扫描窗口;查看感受野、逐项乘积和输出特征图。

误区与边界:卷积不会自动解决一切

  • 严格数学卷积会先把核旋转 180°;深度学习框架通常实现的是互相关(cross-correlation),即按显示顺序逐项相乘、不翻转。核是可学习参数时,翻转可视作重新编号;但对 Sobel 这类手工核,翻转会改变边缘方向,不能把两个运算当成同一个。
  • 参数共享带来的是理想条件下的平移等变:输入平移,特征响应也随之平移。它不是天然平移不变;有限边界、零填充、步长采样、池化和最后的分类头都可能改变响应,最多在合适设计下带来有限的位置鲁棒性。
  • 边界窗口看到的不是“缺失的真实像素”,而是约定的填充值;不同 padding 会改变输出尺寸与边缘响应。步长大于 1 还会跳过部分位置,微小平移可能落入不同采样格。
  • 边缘/模糊/锐化核只是建立直觉的固定滤波器;真正的 CNN 通过损失函数和反向传播学习核,不能看到一个漂亮响应就断言它已经学到了物体语义。

回到正式公式:从玩具网格到 CNN

严格的二维离散卷积是 \( (X*K)[i,j]=\sum_{u,v}X[i-u,j-v]K[u,v] \);而 CNN 的前向层通常是互相关:

\( Y[i,j]=b+\sum_{u=0}^{k_h-1}\sum_{v=0}^{k_w-1}X[i s-p+u,\;j s-p+v]K[u,v] \),越界位置由 padding 规则补值。于是

\( H_{\text{out}}=\left\lfloor\frac{H+2p_h-k_h}{s_h}\right\rfloor+1,\qquad W_{\text{out}}=\left\lfloor\frac{W+2p_w-k_w}{s_w}\right\rfloor+1. \)

多通道输入时,核还要沿通道求和:\(Y_{o,i,j}=b_o+\sum_{c,u,v}X_{c,i s-p+u,j s-p+v}K_{o,c,u,v}\);若有 \(C_{\text{out}}\) 个输出核,参数量是 \(C_{\text{out}}(C_{\text{in}}k_hk_w+1)\)。同一个 \(K_o\) 在所有空间位置复用,才同时得到局部连接、参数共享与平移等变的归纳偏置。

迁移题:从一个响应到一整层

若把一个核换成 64 个核,输出会多出哪一维?若把 \(3\times3\)、步长 1 的层改成步长 2,为什么“输入向右一格,响应也向右一格”的直觉不再能逐格成立?请用四行伪代码写出:取窗口 → 逐元素乘加 → 加偏置 → 写入特征图,并标出哪一个循环共享同一组参数。

卷积操作:卷积核在特征图上滑动 + 特征层级(边→纹理→物体)。

图 5.1卷积操作:卷积核在特征图上滑动 + 特征层级(边→纹理→物体)。

ImageNet 错误率逐年下降 + AlexNet 拐点:可 [plot]。

图 5.2ImageNet 错误率逐年下降 + AlexNet 拐点:可 [plot]。

1. 为什么全连接网络搞不定图像

把一张 \(224 \times 224 \times 3\) 的彩色图直接拉平成向量,维数 \(d = 150{,}528\)。接一个区区 1000 个神经元的全连接隐藏层,参数量:

\[ 150{,}528 \times 1000 \approx 1.5 \times 10^8 \]

一层就 1.5 亿参数——过拟合(第 01 讲:复杂度远超数据量)、算不动,而且浪费:它为"左上角的猫"和"右下角的猫"分别学一套完全独立的权重,尽管两者是同一个模式。全连接层对输入维度的排列是无差别的——把所有像素固定打乱,它学得一样好——这说明它完全没有利用图像的结构。

图像有什么结构?三条先验:

  1. 局部性:识别边缘、角点,只需看一小片邻域;
  2. 平移共性:探测"竖直边缘"的方法在图像任何位置都一样;
  3. 层级性:边缘 → 纹理 → 部件(眼睛、轮子)→ 物体(脸、车)。

CNN 就是把这三条先验硬编码进网络结构的产物——第 01 讲 NFL 定理说"学习必须押注世界的结构",CNN 是教科书级的押注。

2. 卷积层的数学

2.1 定义

二维离散卷积(数学定义):\((I * K)(i,j) = \sum_m \sum_n I(i-m,\, j-n)\, K(m,n)\)。深度学习框架实际实现的是不翻转核的互相关:

\[ (I \star K)(i,j) = \sum_{m}\sum_{n} I(i+m,\, j+n)\, K(m,n) \]

(核是学出来的,翻转可以看作参数的重新编号,所以框架通常统一称为"卷积";但对固定的手工核,翻转会改变响应方向,不能把两个运算当成同一个。)\(K\) 是一个小窗口(如 \(3\times3\)),称为卷积核 / 滤波器:它在图像上滑动,每个位置输出"该处邻域与模板的匹配程度",得到一张特征图。经典手工核可以帮助建立直觉——比如 \(K = \begin{pmatrix} -1 & 0 & 1 \\ -2 & 0 & 2 \\ -1 & 0 & 1 \end{pmatrix}\)(Sobel)输出竖直边缘图。CNN 与手工特征时代的分野在于:核里的数字不再由人设计,而是当成参数由反向传播学出来。

一个卷积层含多个核(比如 64 个),每个核产出一张特征图;对多通道输入,核的形状是 \(k \times k \times C_{\text{in}}\),跨通道求和。输出尺寸(输入宽 \(W\)、核宽 \(k\)、边缘补零 \(p\)、步幅 \(s\)):

\[ W_{\text{out}} = \left\lfloor \frac{W + 2p - k}{s} \right\rfloor + 1 \]

2.2 参数量:三个数量级的压缩

第一层用 64 个 \(11 \times 11 \times 3\) 的核(AlexNet 的真实配置量级):

\[ 64 \times (11 \times 11 \times 3 + 1) \approx 2.3 \times 10^4 \]

对比全连接的 \(1.5 \times 10^8\):少了四个数量级。压缩来自两条:局部连接(每个输出只看 \(11\times11\) 邻域,不看全图)与参数共享(同一个核用于所有位置——"竖直边缘探测器"只学一份)。用第 01 讲的语言:假设空间被先验大幅裁剪,同样数据下泛化界大幅收紧。

2.3 平移等变性(证明)

记平移算子 \((T_\Delta I)(i,j) = I(i - \Delta_1, j - \Delta_2)\)。则

\[ \big((T_\Delta I) \star K\big)(i,j) = \sum_{m,n} I(i - \Delta_1 + m,\, j - \Delta_2 + n) K(m,n) = (I \star K)(i - \Delta_1,\, j - \Delta_2) = \big(T_\Delta (I \star K)\big)(i,j) \]

即 \(T_\Delta I \star K = T_\Delta(I \star K)\):先平移再卷积 = 先卷积再平移。在理想的无限网格或边界处理完全一致时,猫往右挪 10 像素,特征图上的响应也右挪 10 像素、数值保持对应——这叫等变(equivariance)。真实的有限图像还会遇到边界、离散步长与下采样;后面的池化/汇聚可以带来一定位置鲁棒性,但卷积层本身并不天然提供不变性(invariance),最终分类是否不随位置改变取决于整套架构与数据。

2.4 池化与感受野

池化(pooling):把特征图每个 \(2\times2\) 小块换成其最大值(max pooling),尺寸减半。作用:缩小计算量、扩大后续层视野、并在某些局部变化下增加位置鲁棒性(模式挪动 1 像素时最大值可能不变);它不是对任意平移的严格不变性。

感受野:输出图上一个像素"看得见"的输入区域。逐层递推(第 \(l\) 层核宽 \(k_l\)、步幅 \(s_l\)):

\[ r_l = r_{l-1} + (k_l - 1) \prod_{i=1}^{l-1} s_i, \qquad r_0 = 1 \]

层数越深、中间步幅越多,感受野越大——底层看边缘,高层看物体,层级先验由此实现。训练后的可视化(Zeiler & Fergus 2013)证实了这一点:第 1 层学出 Gabor 状边缘核,中层响应纹理与部件,高层响应完整物体——网络自己学出了过去要靠博士手工设计的整套特征体系,而且是为任务量身定做的。这就是"表示学习",深度学习的真正卖点。

1998 年 LeCun 的 LeNet-5(卷积-池化-卷积-池化-全连接)已经集齐了全部要素,在手写数字上商用(美国的支票读取机)。但在更大的图上它火不起来——差的不是想法,是燃料。

3. 2012:三样燃料同时到位

1. 大数据——ImageNet。李飞飞团队 2009 年发布:1400 万张标注图像、2 万类;竞赛用其中 120 万张、1000 类。此前的数据集(几万张量级)喂不饱深度网络(第 01 讲:大假设空间需要大 \(n\)),ImageNet 第一次够了。

2. 大算力——GPU。为游戏而生的显卡恰好擅长卷积所需的大规模并行乘加。AlexNet 用 2 块 GTX 580(各 3GB 显存,模型被迫劈成两半分放)训练约一周;同样的活 CPU 要以月计。深度学习从此与 GPU 绑定,这条线一路延伸到今天的万卡集群与英伟达的市值神话。

3. 训练技巧——把第 04 讲的死穴逐个拆掉:

配方的完整性

回看第 04 讲第二次寒冬的三条死因:梯度消失(ReLU 解决)、数据少(ImageNet 解决)、算力弱(GPU 解决)。没有新理论,没有新范式,是工程要素的凑齐——这个"理论滞后于实践"的格局从 2012 年延续至今(第 07 讲的 Scaling Laws 依然是经验规律)。

4. 军备竞赛与 ResNet(2012–2015)

AlexNet 之后,ImageNet 错误率成为整个领域的记分牌:

ResNet(He et al. 2015,152 层)的解法是一行改动。让模块不再直接学目标映射 \(H(x)\),而是学残差 \(F(x) = H(x) - x\):

\[ y = x + F(x) \]

输入 \(x\) 通过一条捷径(skip connection)直接加到输出上。两个立竿见影的效果:

学恒等变容易了:只需把 \(F\) 压到 0(权重归零即可),退化问题的病根被拔掉。

梯度有了高速公路:反向传播过这个模块,

\[ \frac{\partial \ell}{\partial x} = \frac{\partial \ell}{\partial y}\left(I + \frac{\partial F}{\partial x}\right) = \frac{\partial \ell}{\partial y} + \frac{\partial \ell}{\partial y}\frac{\partial F}{\partial x} \]

第一项原封不动地穿透模块——无论 \(F\) 的梯度多小,深层的梯度都能沿捷径无衰减直达浅层。第 04 讲的连乘衰减 \(\prod(\cdot)\) 结构,被加法结构 \(I + (\cdot)\) 替换了。配合 BatchNorm(Ioffe & Szegedy 2015:对每个 mini-batch 把各通道激活标准化 \(\hat z = \frac{z - \mu_B}{\sqrt{\sigma_B^2 + \epsilon}}\) 再学个缩放平移 \(\gamma\hat z + \beta\),让每层输入分布稳定、可用大学习率),百层千层网络从此可训。

ResNet 在 ImageNet 上错误率 3.57%,首次超过人类水平(约 5%)。残差连接从此成为一切深度架构的标配——包括下一讲的 Transformer(每个子层都是 \(x + \text{Sublayer}(x)\))和今天所有 LLM。这一小节的公式是你与现代所有大模型架构之间的直接桥梁。

5. CNN 大放异彩(2012–2017)

热潮迅速溢出分类任务:目标检测(R-CNN 系列、YOLO:图里有什么、在哪)、语义分割(逐像素分类,医学影像)、人脸识别(刷脸支付背后是 CNN 特征 + 度量学习)、风格迁移、AlphaGo(2016:棋盘当 19×19 的"图像",CNN 评估局面 + 蒙特卡洛树搜索——第一次让"深度学习"成为全球新闻头条)。

工程范式也随之定型——迁移学习:在 ImageNet 上预训练的 CNN,其底层特征(边缘、纹理)是通用的;新任务只需换掉最后几层、用小数据微调。"预训练 + 微调"这个今天 LLM 世界的核心工作流,是 CNN 时代发明并验证的。

同时,一个旧行当悄然消亡:手工特征工程。SIFT、HOG 的作者们转了方向,"端到端学习"(像素进、答案出,中间一切表示自动学习)成为默认信条。人类的角色从"设计特征"上移到了"设计结构先验(架构)"——而下一讲将看到,连结构先验都被进一步简化的架构,如何吞掉整个 NLP,再回头吞掉视觉本身。

本讲小结

概念 一句话
全连接之败 \(10^8\) 参数 + 无视图像结构 + 位置间重复学习
卷积 滑动窗口模板匹配;核由反向传播学出
参数共享 一个模式探测器全图共用,参数量降四个数量级
平移等变 \(T_\Delta I \star K = T_\Delta(I \star K)\),逐行可证
感受野 \(r_l = r_{l-1} + (k_l - 1)\prod s_i\);深度造就层级特征
AlexNet 配方 ImageNet + GPU + ReLU + dropout + 数据增强
ReLU 正区导数恒 1,拆掉梯度消失的连乘收缩
ResNet \(y = x + F(x)\);梯度走加法高速路,百层可训
范式转移 特征工程 → 表示学习;预训练 + 微调诞生

动手:跑 labs/lab05_cnn_mnist.py——在你的 M4(MPS 加速)上训一个小 CNN 识别手写数字,对比全连接基线的参数量与准确率,并可视化第一层学出的卷积核。

延伸阅读:Krizhevsky et al. "ImageNet Classification with Deep CNNs" (2012)——深度学习时代的开山论文,意外地好读;He et al. "Deep Residual Learning" (2015)。


下一讲离开图像,进入语言。图像是固定尺寸的网格,而句子是变长的序列,"猫追狗"和"狗追猫"用词相同意义相反——顺序就是一切。RNN 为此而生又困于此,直到 2017 年一篇标题狂妄的论文出现:《Attention Is All You Need》。