全书导航
大模型之路:从图灵、感知机到 ChatGPT · 卷 2

第 13 章:GPU 与大数据:深度学习的两个齿轮

本章问题:为什么深度学习等到 2010 年代才爆发?


13.1 两个迟到二十年的条件

上一章我们讲了三要素——数据、算力、算法——在寒冬中持续积累。这一章我们把镜头拉近到其中两个,看它们如何从量变走到质变。

回顾一下时间线。

感知机知道如何从样本中调整权重——1958 年。反向传播提供了一个训练多层网络的有效方法——核心数学在 1970 年就存在,在 1986 年被广泛认识。多层网络在数学上可以近似任意连续函数——这个定理在 1989 年就被证明了。

也就是说,到 1980 年代末,深度学习的核心数学理念已经基本齐备。那为什么真正爆发要等到 2010 年代?为什么 AI 要多等二十年?

答案不在数学里——答案在硬件和数据里。

一个简单但强大的类比:你发明了内燃机,但没有汽油,也没有公路。发动机会开动,但跑不远。深度学习在 1980 年代的处境就像这样——理论引擎已经有了,但算力(汽油)不够,数据(公路)也不够。

2010 年代的变化不是某人突然聪明地想到了新算法。而是汽油和公路终于同时到货了。

这场"到货"花了二十年的基础建设——没有人一开始是为了深度学习而建设它。但深度学习成了最会用它的人。


13.2 为什么 GPU 是神经网络正在等待的硬件

传统的计算机程序是顺序的——做完步骤 1,再做步骤 2,再做步骤 3。CPU(中央处理器)被设计成尽可能快地执行这种顺序指令流。它有复杂的电路来预测下一条指令是什么、提前把数据从内存拉到缓存里、优化分支。

训练一个神经网络的计算不是这样的。

训练神经网络时,你需要做大量的矩阵乘法和逐元素运算。有一个权重矩阵 W,有一批输入向量 x₁, x₂, ..., x₅₀₀。你需要每一个输入 x 分别和 W 做乘法——这些乘法彼此之间完全独立,可以同时做。矩阵乘法天然是并行的。

GPU(图形处理器)最初是为游戏设计的——它的任务是同时计算屏幕上每一个像素的颜色。一帧 3D 游戏画面有几百万个像素,每个像素的颜色由场景几何、光照和纹理决定。不同的像素计算互不依赖。GPU 被优化来做"成千上万个简单计算同时跑"——这和神经网络的训练需求恰好匹配。

CPU 像一条只有两个收费窗口的高速公路——窗口效率极高,但吞吐量有上限。GPU 像一百个收费窗口同时工作——每个窗口本身比 CPU 的窗口慢,但一百个窗口加在一起,吞吐量远大于两个。

在 CPU 上训练一个中等规模神经网络可能需要几周。同样的网络放在 GPU 上,可能只需要几小时。

但最初的 GPU 不是为科学计算设计的——它期望你用图形 API 来和它对话(OpenGL、DirectX)。你不能只是说"请帮我把这两个大矩阵乘起来"——你得把你的计算伪装成"我想渲染一个三角形,它有一些纹理",然后从图形管线里偷偷把中间数据取出来。虽然极其不优雅,但结果上的速度提升说服了最早的那批研究者。


13.3 CUDA:黄仁勋的豪赌

真正的转折发生在 2006 年。NVIDIA 发布了 CUDA——一种让程序员可以直接用 C/C++ 编写在 GPU 上运行的并行程序的框架。

CUDA 去掉了"必须伪装成图形渲染"的枷锁。现在研究者可以直接写"把这批数据切分成 10,000 块,并行做同样的乘法",GPU 照办。

这不是一个小改进。这相当于把一个只能从特定入口进入的专用设施变成了可以通过标准道路到达的通用工厂。CUDA 让 GPU 一下子从"游戏玩家的硬件"变成了"可以用于任何大规模并行计算的硬件"。NVIDIA 的 CEO 黄仁勋在 2006 年做这个决策时,当时被认为是在赌一个不明确的市场——科学计算、流体模拟、金融建模——谁会真的需要用 GPU 做通用计算?

他赌对了。但最大的受益者不在流体力学或金融工程里——在人工智能里。

杨立昆后来回忆过:在 CUDA 出现之前,用 GPU 训练神经网络就像"用一种你不会说的语言给别人解释事情"——极其难受,但如果你真的去做了,效果惊人。CUDA 出现之后,你可以"直接用英语说"了。

到 2009 年左右,在 GPU 上训练神经网络的代码框架开始出现——不再需要每个实验室从头手写 CUDA 核函数。这为接下来 ImageNet 时代的到来扫清了一大道工程障碍。


13.4 大数据的同步爆发

同一时期,数据的规模和质量发生了质的飞跃。

1990 年代,一个典型的机器学习训练集可能有几百到几千个样本。2000 年代初,互联网公司开始内部积累百万级的数据集——搜索点击数据、商品购买数据、社交关系数据——但这些数据很少被公开。

2000 年代末到 2010 年代,几个大规模的、向外开放的数据集出现了:

ImageNet(2009):1,400 万张标注过的图片,覆盖约 22,000 个类别。在此之前,最大的公开图像分类数据集(Caltech-101)只有约 9,000 张。ImageNet 一下子把可用规模加了三到四个数量级。

Common Crawl(2008 年开始运行):定期爬取整个万维网的原始数据,开放给研究者。到后来大模型时代的预训练数据中,很大一部分来自 Common Crawl。

语音数据集:Google、微软等公司开始在内部积累千万小时级别的语音数据,训练语音识别模型。

在传统机器学习时代,"过拟合"是最经常被担心的风险——数据太少,模型太灵活,学跑了。大数据时代,风险从"数据太少学不到"变成了"数据太多但不够好"、"标注不够细"、"数据有偏见"。旧时代的约束突然就被松开了。

这也是为什么在 2010 年之前没人能训练"深度"网络——不是因为大家不知道"深度"可能更强大,而是如果只有几千张图片,一个浅层模型加精心设计的特征比一个深层网络的表现好得多。深层网络有大量参数,它们需要大量数据来训练——小样本只会导致严重的过拟合。

大数据让深层网络从"理论上有用"变成了"工程上可行"。


13.5 三要素的汇合

算法、算力、数据——在 2010 年代初同时到达了一个新的阈值。

有些人喜欢讨论这三者中哪一个最重要。这是一种假的分立。三者在逻辑上是互相依赖的:

  • 更快的算力让训练更深的网络变得可能——但你仍然需要足够多的数据来防止深层网络在有限样本上过拟合。
  • 更多的数据让你可以训练更复杂的模型——但复杂的模型训练需要的算力也必须同步增长。
  • 更好的算法(ReLU、Dropout、Xavier 初始化、Batch Normalization)让更深的网络可以稳定训练——但这些算法之所以被发明出来,是因为研究者终于有足够的算力和数据去实验"深网络到底卡在什么问题上"。

这不是一个"哪一个先发生"的线性故事——它更像一个良性循环。算力增长→可以尝试更深的网络→发现深层网络训练不稳定→发明新算法(如 ReLU)→深层网络训练变稳定→需要更多数据来喂它→算力继续增长。

2010 年代就是这样一个循环加速的十年。


13.6 本章小实验:感受并行

做一个思维实验。

想象你是一个图书馆管理员。你需要把 100,000 本书按作者姓氏的字母顺序重新排列在书架上。

方案 A(顺序):你自己去一本一本地挑,排好,再挑下一本。

方案 B(并行):你把 100,000 本书平均分给 100 个管理员。每个人只管自己的 1000 本书,独立排序。最后 100 个管理员把各自排好的部分按照字母顺序拼接起来。

方案 B 比方案 A 快——也许是 100 倍(如果调度代价很小)。

但现在假设:你的 100 个管理员需要互相协调——一个管理员排完书后必须立刻告诉下一个管理员"我这部分最大的字母是多少",然后下一个管理员才能根据那个信息重新排列自己那部分。这就要来回通信了。通信延迟一旦加入,并行加速比就会下降。

GPU 训练的同样道理:矩阵乘法的"完美并行"是极少数——不需要通信。但一旦你要做某些需要"全局信息"来继续的运算(比如在一批样本里算均值和方差来做 Batch Normalization),就需要并发程序之间暂停下来同步一次。这就是为什么不同神经网络架构的并行效率差别很大。

矩阵乘法在 GPU 上是效率天堂。频繁同步全局状态就不是了。


13.7 本章地图

text
问题:为什么深度学习等到 2010 年代才爆发?原因:核心算法(反向传播)在 1980 年代已存在,但缺少两个齿轮——大规模并行算力和大规模训练数据。GPU:为游戏图形设计的并行处理器,恰好天然匹配神经网络的矩阵乘法。CUDA(2006)打开了通用并行计算的大门。大数据:ImageNet(2009)、Common Crawl 等超大规模数据集在 2000 年代末出现,使深层网络脱离了"过拟合地狱"。三要素循环:算法、算力、数据不是三个独立条件——它们的共同增长形成了一个加速循环。今天:Scaling Law 继承了这三要素的关系——模型规模、数据规模和计算量必须同步扩大才能使 loss 稳定下降。

13.8 本章结语:准备好了

到 2010 年时,一切已经准备就绪。

反向传播算法——知道怎么让错误信号流回去调整每个参数。ReLU 和改进的初始化方法——让几十层的网络不再陷入梯度消失。GPU 和 CUDA——让训练不再以周为周期,而是以小时。ImageNet——1400 万张已经标注好等着喂进网络的图片数据。

这些柱子各自竖了五年、十年、二十年——但还没有人把它们全部接在一起引爆。

下一章,我们看一个数据集如何改变一个行业。ImageNet 不只是"更多的图片"——它代表了一种对研究方向的重新设计,以及随之而来的一次令所有人大跌眼镜的竞赛:2012 年的 AlexNet。

SECTION §02 · ENGAGE

Discussion

留言区 · GitHub-powered comments via Giscus