第 8 天 · 两块 GPU 加大数据,深度学习翻身
一句话
AlexNet 用 5 个卷积层和 3 个全连接层,在 2 块 GPU 上训练,把 ILSVRC-2012 的 top-5 错误率降到 15.3%,第二名是 26.2%。ReLU、dropout、数据增强和 GPU 训练从此成为深度学习的标准配置。
论文讲了什么
结论先行:一个 8 层卷积神经网络(CNN),在 2 块 GPU 上训练 5 到 6 天,把 ILSVRC-2012 的 top-5 错误率降到 15.3%。第二名用手工特征,错误率是 26.2%。
问题。ImageNet 竞赛有 1000 个类别、约 120 万张训练图片。当时主流做法是手工设计特征(例如 SIFT),再接线性分类器。CNN 早在 LeNet 时代就有,但缺少足够的算力和标注数据,在大图片上训练不动。
方法。
- 结构:5 个卷积层加 3 个全连接层,最后接 1000 路 softmax。全网约 6000 万参数、65 万个神经元。第一层用 96 个 11×11 卷积核,步长 4。
- ReLU:
f(x) = max(0, x)。在 CIFAR-10 上,一个 4 层 CNN 用 ReLU 达到 25% 训练错误率,速度是 tanh 的 6 倍。 - 双 GPU:每块 GTX 580 只有 3 GB 显存。作者把每层的卷积核对半分到两块卡上,只在部分层之间交换数据。
- 局部响应归一化(LRN)和重叠池化:池化窗口 3×3、步长 2,窗口互相重叠。两者分别把 top-1 错误率降低 1.4 和 0.4 个百分点。
- 防过拟合:从 256×256 的图里随机裁出 224×224 并水平翻转;对 RGB 值做基于 PCA 的颜色扰动;前两个全连接层用 dropout,丢弃概率 0.5。
- 训练:随机梯度下降,batch 128,动量 0.9,权重衰减 0.0005。学习率从 0.01 开始,验证误差停滞时除以 10,共降 3 次,约训练 90 轮。
关键结果。
- ILSVRC-2010 测试集:top-1 错误率 37.5%,top-5 错误率 17.0%。
- ILSVRC-2012:单个模型验证集 top-5 错误率 18.2%;5 个模型平均降到 16.4%;加入额外预训练的 7 模型集成降到 15.3%。
- 深度很重要:去掉任何一个中间卷积层,top-1 错误率约上升 2 个百分点。
- 最后一个隐层输出 4096 维特征。用欧氏距离比较这些特征,可以找出语义相近的图片,即使像素差别很大。
关键概念
- 卷积神经网络(Convolutional Neural Network, CNN)
- 用小卷积核在图上滑动提取局部特征,同一个核在所有位置共享权重。浅层学到边缘和颜色,深层组合出物体部件和整体。
- ReLU(Rectified Linear Unit)
- f(x) = max(0, x)。正半轴梯度恒为 1,不像 tanh 那样在两端饱和,所以训练快得多。AlexNet 让它成为默认激活函数。
- 数据增强(data augmentation)
- 对训练图片做随机裁剪、翻转、颜色扰动,人为扩大数据集。标签不变,模型被迫学到对这些变化不敏感的特征。
- dropout
- 训练时随机让一部分神经元输出为 0,防止神经元互相依赖。AlexNet 用在前两个全连接层,详细原理见第 12 天。
- top-5 错误率(top-5 error rate)
- 模型给出概率最高的 5 个类别,正确答案不在其中才算错。ImageNet 类别很细,例如上百种狗,所以竞赛以 top-5 为主要指标。
历史位置:为什么值得读
它终结了一个时代的争论。2012 年以前,计算机视觉的主流是手工特征,神经网络被很多人认为难训练、难解释。AlexNet 在 ILSVRC-2012 上领先第二名约 11 个百分点。这个差距大到无法忽视,视觉领域在两三年内全面转向深度学习。
三个条件同时成熟。2009 年李飞飞团队发布 ImageNet,提供了足够的标注数据。NVIDIA 的 CUDA 让 GPU 可以做通用计算。Krizhevsky 自己写了高效的 GPU 卷积代码(cuda-convnet)。作者在论文里明确说:更快的 GPU 和更大的数据集会带来更好的结果。
它开启了一条清晰的后续路线。2013 年 ZFNet 可视化并调优了 AlexNet;2014 年 VGG 把大卷积核换成多层 3×3 小核;2015 年 ResNet(第 9 天)把深度推到 152 层。dropout 的完整论文是第 12 天。2013 年 Google 收购了三位作者创办的 DNNresearch。Sutskever 后来参与创办 OpenAI,这份论文清单就出自他。
学前准备
- 理解卷积、池化、全连接层的计算方式
- 能手算卷积输出尺寸:(W − K + 2P) / S + 1
- 会用 PyTorch 写 nn.Module 并跑一个训练循环
- 可以先看第 28 天 CS231n 的 CNN 部分作为入门
在原仓库怎么学
- 读 README.md,它分为历史背景、结构、实现、训练技巧 4 部分。对照原论文第 3 节读。
- 读 implementation.py。它包含原始结构和 ReLU、dropout、LRN 三个部件。逐层核对卷积核数量、尺寸和步长是否和论文一致。
- 看 data/README.md,确认数据放在哪里。没有 ImageNet 时用 CIFAR-10,torchvision 会自动下载。
- 运行 train_minimal.py 跑一次小规模训练,再用 visualization.py 画结构图、特征图和训练曲线。
- 打开 notebook.ipynb,按 Part 顺序走一遍结构和关键创新。
- 做 exercises/ 的 5 个练习:01 从零搭 AlexNet;02 消融实验,逐个去掉创新点;03 特征可视化;04 迁移学习;05 加入现代改进。答案在 exercises/solutions/。
- 想多练可以做 assessments/exercises.md,含 GPU 影响模拟、ReLU 对比 Sigmoid、学习率调度、数据增强 4 题。参考答案在 assessments/solutions.md。
今天再看
活下来的:ReLU 家族(大语言模型里换成了 GELU、SwiGLU)、dropout、数据增强、GPU 训练、端到端学习。还有一个更重要的遗产:用大网络加大数据,替代人工设计。
被取代的:LRN 很快被批归一化取代,今天几乎没人用。11×11 大卷积核被多层 3×3 小核取代。按 GPU 切分卷积核是被显存逼出来的权宜之计,但它是模型并行的早期形态。今天训练大语言模型用的张量并行和流水线并行(第 24 天 GPipe),解决的是同一个问题。
和大语言模型的联系:AlexNet 证明了“规模加数据就能赢”。2020 年的规模定律(第 25 天)把这个经验写成了公式。AlexNet 的倒数第二层特征可以迁移到其他任务,这也是今天“预训练加微调”范式的源头。
容易卡住的地方
- 论文写输入是 224×224,但 11×11、步长 4、无填充的卷积要得到 55×55 输出,输入必须是 227×227。复现时用 227,或给第一层加 padding=2。
- torchvision 的 alexnet 不是论文原版:它基于 Krizhevsky 2014 年的单卡版本,通道数是 64/192/384/256/256,没有 LRN。对比参数量时别混淆。
- 在 CIFAR-10 的 32×32 图片上直接用原结构,第一层就把图缩到很小。建议把第一层改成小卷积核和步长 1,或把图放大到 227,因为否则后面的池化会把尺寸降到 0 并报错。
- 论文的双 GPU 分组在单卡上可以用 Conv2d 的 groups=2 模拟。不模拟也可以,但参数量和论文的约 6000 万会不同。
延伸阅读
- 原论文:ImageNet Classification with Deep Convolutional Neural Networks
- 原仓库第 8 天目录:08_alexnet/ —— 代码、笔记本、练习与答案(英文)
- Visualizing and Understanding Convolutional Networks(ZFNet) —— 可视化 AlexNet 每层学到什么
- Very Deep Convolutional Networks(VGG) —— 用多层 3×3 小核加深网络
- One weird trick for parallelizing CNNs —— Krizhevsky 的单卡版结构与并行方法
- ImageNet Large Scale Visual Recognition Challenge —— ILSVRC 竞赛的数据与历年结果