序章:当机器第一次'睁开了眼睛' · Prologue: When Machines First Opened Their Eyes
第 1 章 · 序章:当机器第一次"睁开了眼睛"
> Prologue: When Machines First Opened Their Eyes
---
2012 年 10 月的一个清晨,多伦多大学计算机系的走廊里弥漫着一种奇怪的静默。一间实验室的灯整夜没关,屏幕的冷光映在三个年轻人的脸上——Alex Krizhevsky、Ilya Sutskever 和他们的导师 Geoffrey Hinton。他们刚刚把一组数字输进了 ImageNet 图像识别大赛的提交系统,然后各自回家睡觉,没有人敢相信自己看到的结果。
第二天早晨 8 点,排行榜刷新:Krizhevsky 的模型以 15.3% 的 top-5 错误率(top-5 error rate)拔得头筹,而第二名的成绩是 26.2%。差距是 10.9 个百分点——在那个领域,这个差距相当于奥运会百米赛场上跑出 9 秒 58 与 11 秒 50 的差距,几乎超出了统计学可以解释的范围。
全球的人工智能研究者盯着那块刚刚更新的屏幕,集体陷入了一种复杂的状态:兴奋、困惑、与隐约的恐惧。
兴奋,是因为这台机器终于做到了人类几秒钟就能做到的事情——把一张照片里的猫、狗、汽车、教堂、花朵,准确无误地认出来。 困惑,是因为没人能说清楚,为什么这件事突然在 2012 年变得可能了。同一种思路、同样的卷积神经网络(Convolutional Neural Network, CNN),在十年前几乎是垃圾,为什么今天忽然灵了? 恐惧,则是因为一种隐约的直觉:如果机器可以"看见",那么"看懂""听懂""读懂"还会远吗?
这一年的这次比赛,后来被反复称为深度学习的 "诺曼底登陆"(D-Day of Deep Learning)。而那只在比赛图集里被正确打上标签的猫,也成了 AI 史册里最有名的一只猫。
本章要回答的核心问题非常简单,却足以撑起一本厚书:
> 为什么图像识别曾被称为"AI 的珠穆朗玛峰"?又为什么它在 2012 年后突然被攻克?
为了回答这个问题,我们会见到三位关键人物:一位在神经网络寒冬中坚持了三十年、被同行视为"堂吉诃德"的英国老人;一位华裔女科学家,为了给机器"看世界的权利",召集了几万人在网上给图片打标签;以及两位来自多伦多的年轻人,他们的代码在 GPU(Graphics Processing Unit,图形处理器)的轰鸣声中跑出了奇迹。
最后,我们会顺着那只猫的眼睛,向更深的地方看下去:识别一只猫很容易,理解一个"场景"却难如登天。这道鸿沟,正是接下来整本书要走的路。
---
1.1 在 2012 年之前,"让机器看见"几乎是一个笑话
1.1.1 视觉,对人类而言是本能;对机器而言是噩梦
我们先做一个简单的思想实验。
把一只手机横过来,对准你面前的桌面。屏幕上会出现一张照片:一只灰色的猫蜷在一本摊开的书旁边,窗外是阴天的光,背后有一盆绿萝。
作为一个人类,你大概只需要 0.3 秒 就能理解这张图的全部信息:猫是主体,书是陪衬,窗外天色暗示时间,绿萝的颜色告诉你这是一间有人住的屋子。你甚至能推断出猫刚睡醒,因为它的耳朵正缓缓抬起。
这种能力听起来毫不费力——三岁小孩就能做到——但当我们试图让一台计算机做同样的事情时,事情会瞬间变得诡异。
计算机看到的"图像",其实是一个巨大的数字矩阵:假设这张照片的分辨率是 $1920 \times 1080$,那它就是 207 万个像素(pixel)的集合,每个像素又有三个通道(红、绿、蓝,RGB),取值范围 0 到 255。也就是说,机器"看见"的,是一个约 620 万个数字 的阵列。
> 🎯 关键直觉:人脑"看见"的,是一个故事;机器"看见"的,是一片数字的汪洋。从 620 万个数字到"一只灰色的猫蜷在书旁",这中间发生了什么?这是过去六十年人工智能最头疼的难题之一。
1.1.2 早期方法的"手工特征"困局
在深度学习登场之前,主流的图像识别方法有一个共同的名字:手工特征工程(Hand-crafted Features)。
研究者们坚信,机器之所以识别不好图像,是因为我们没有给它"足够好的线索"。于是他们设计了大量精巧的算法,试图把图像中"有用的部分"提取出来——比如:
- **边缘检测(Edge Detection)**:找出图像中亮度急剧变化的地方,这些通常是物体的轮廓。
- **SIFT(Scale-Invariant Feature Transform)**:在不同的尺度下找到"角点"和"特征点",它们对旋转、缩放、光照具有不变性。
- **HOG(Histogram of Oriented Gradients)**:统计图像局部区域中梯度方向的分布。
- **Bag of Visual Words**:把图像类比成一篇文章,把"视觉单词"(一块块小图块)装进一个"词袋",再用文本分类的方法来识别。
这些方法在特定的、干净的、控制条件下(比如固定的摄像头、统一的背景)效果不错。但一旦换到 ImageNet 这种"互联网野生照片"——各种各样的猫、各种各样的狗、各种各样的姿势、各种各样的遮挡、光照、角度——它们集体崩溃了。
原因可以用一句话总结:手工特征是人设计的,人设计的特征,只能捕捉人想到的东西。
> 🧠 判断依据:从 2005 年到 2011 年,ImageNet 比赛的最佳成绩错误率从 28.2% 一路缓慢下降到 25.8%。七年时间,几乎没有突破。研究者们开始怀疑:是不是这个问题本身就被问错了?
1.1.3 寒冬中的神经网络:一个被嘲笑的童话
就在手工特征方法陷入困境的同时,另一条几乎被所有人遗忘的路线在悄悄酝酿。
它的名字叫 人工神经网络(Artificial Neural Network),灵感来自大脑的神经元连接。它的核心想法非常朴素——
> 既然人脑能学会识别猫,那为什么不能用一堆"数学神经元"模拟人脑,让它们自己学?
1943 年,Warren McCulloch 和 Walter Pitts 提出了第一个神经元的数学模型。1958 年,Frank Rosenblatt 发明了 感知机(Perceptron),一度让人们以为"通用人工智能"就在眼前。
然而 1969 年,Marvin Minsky 和 Seymour Papert 出版了《Perceptrons》一书,冷静地证明了一个致命的限制:单层感知机连"异或"(XOR)这种简单逻辑都学不会。
这盆冷水泼得极冷。整个 1970 年代到 1980 年代初,神经网络几乎从主流学术界消失了。研究者们纷纷转向了看起来更有前途的"专家系统(Expert System)"和"符号主义 AI(Symbolic AI)"。
但有一个人没放弃。
Geoffrey Everest Hinton——一个出生于英国温布尔登、曾祖父是著名逻辑学家 George Boole 的心理学家和计算机科学家——从 1980 年代起,就一直固执地相信一件事:
> *"大脑是一个大规模的、分布式的、靠梯度下降学习的系统。如果你把这件事做对了,它就会工作。"*
他在多伦多大学(University of Toronto)教书,论文被拒,学生很少,资金匮乏。他被同行称为 "神经网络最后的传教士",有时也被委婉地形容为"堂吉诃德"。
但他一直没停。
---
1.2 一个华裔女性的执念:要让机器"看见"整个世界
1.2.1 李飞飞和 2007 年的顿悟
在距离多伦多约 4000 公里的斯坦福大学(Stanford University),一位年轻的华裔助理教授也在思考同一个问题:为什么机器识别图像这么难?
她叫 李飞飞(Fei-Fei Li),2005 年在加州理工学院(Caltech)拿到博士学位,2006 年到斯坦福任教,研究方向是计算机视觉和机器学习。
2007 年前后,李飞飞意识到一个让整个社区尴尬的事实:
> 不是算法不够好,是数据不够多。
她后来在多次演讲中提到这个顿悟:
> *"当你教一个三岁的孩子认识一只猫时,你不需要给 ta 看一千万张猫的照片。给她看一两张,她就认识了。但我们的机器需要看几百万张、上千万张才有可能学会。问题是——谁给这几千万张图打标签?"*
这听起来像一个工程问题,但在 2007 年,这是一个哲学问题。
彼时最大的公开图像数据集——Caltech 101——只有 101 个类别、约 9 千张图片。这远远不够。研究者们其实早就知道"数据不够",但没有人真的去做——因为这件事太笨、太累、看起来太不"聪明"。
李飞飞决定做这件笨事。
1.2.2 ImageNet 的诞生:14 万工人,320 万张图
2007 年,李飞飞和她的同事开始构建一个在当时看来"疯狂"的项目:ImageNet。
她的设想是:构建一个包含 数百万张标注图像 的数据库,覆盖 数千个类别——不仅仅是猫、狗、车这些常见物体,还要有蘑菇的种类、鸟的种类、花的种类,乐器的型号,建筑的风格。
这意味着:他们需要给 几百万张图 打上 正确、精细的标签。
怎么做?
李飞飞想到了一个非常聪明的机制——Amazon Mechanical Turk(亚马逊众包平台)。
这是亚马逊推出的一个众包服务平台,允许全球任何人接受微小的任务(比如给一张图写一个词)来换取几美分的报酬。李飞飞和团队把"给图片打标签"这个任务拆成了无数个小任务,发到了 Mechanical Turk 上。
最高峰时期,ImageNet 项目雇用了来自 167 个国家的 超过 49,000 名众包工人,耗时近 两年,标注了超过 1500 万张图片。
最终对外发布的版本包含:
- **1,281,167 张训练图像**
- **50,000 张验证图像**
- **100,000 张测试图像**
- 共 **1,000 个类别**
每一个类别(比如"虎斑猫")至少有 1,000 张图。
> 🎯 为什么这件事重要? > > 在机器学习领域有一句老话:"数据和特征决定了上限,模型和算法只是逼近这个上限。"(*Better data beats better algorithms.*) > > ImageNet 把图像识别的"数据基线"提高了一两个数量级。在它之前,算法是稀缺资源;在它之后,数据成了新的稀缺资源。
1.2.3 ImageNet 大赛:一场每年一度的"华山论剑"
光有数据库还不够,李飞飞还做了一件事:办一场比赛。
从 2010 年起,ImageNet Large Scale Visual Recognition Challenge(ILSVRC)成为计算机视觉界一年一度的"华山论剑"。研究团队用 ImageNet 的训练集训练自己的模型,然后在测试集上一较高低。
这场赛事的意义远超过比赛本身:
1. 提供统一基准(Common Benchmark):以前每个实验室用自己的数据集,结果很难互相比较。ImageNet 给了所有人一个共同的"考卷"。 2. 激发工业界参与:谷歌、微软、百度等公司开始组织团队参赛,工业界第一次和学术界在同一个擂台上较量。 3. 降低准入门槛:所有数据公开、评测脚本公开,这让任何有 GPU 和 idea 的人都能参与。
从 2010 年到 2011 年,比赛的赢家都是工业界的大公司——使用的是前面提到的那些手工特征方法。2011 年的冠军是 XRCE(法国国家信息与自动化研究院的一个团队),错误率 25.8%。
然后,2012 年,多伦多来了。
---
1.3 AlexNet:三个人、两块 GPU、一场战争
1.3.1 多伦多的三人组
让我们把镜头拉回多伦多大学那间彻夜亮灯的实验室。
- **Geoffrey Hinton**:导师,65 岁,神经网络领域的"教父级"人物。他把毕生的赌注都押在了"深度学习"上。
- **Ilya Sutskever**:博士生,25 岁,出生于俄罗斯,在以色列长大,2010 年加入 Hinton 的实验室。他后来参与创立了 OpenAI,现在是 SSI(Safe Superintelligence Inc.)的创始人之一。
- **Alex Krizhevsky**:博士生,26 岁,出生于乌克兰,2009 年加入 Hinton 的实验室。他是个天才程序员,对 GPU 编程有近乎偏执的热情。
这三个人凑在一起,本身就是一个时代性的巧合:Hinton 提供信念,Sutskever 提供理论直觉,Krizhevsky 提供实现能力。
1.3.2 一个被论文审稿人嘲笑的想法
Krizhevsky 提出的方案很简单,也很疯狂:
用一块 NVIDIA GTX 580 GPU(图形处理器,本来是为游戏渲染设计的芯片),训练一个八层的卷积神经网络,在 ImageNet 的 120 万张图上学习识别 1000 个类别。
这听起来一点也不惊人。但问题是:
- 那块 GPU 只有 3GB 显存(今天手机的内存都比这大)。
- 120 万张图、每张图几百 KB,数据量大到根本装不进显存。
- 网络有 650,000 个神经元、60,000,000 个参数(今天看来很小,但当时训练起来极其困难)。
Krizhevsky 的解决方案体现了工程师的天才:他把网络拆成两块,分布在两块 GPU 上,让它们在训练过程中互相通信。
今天我们称之为"模型并行(Model Parallelism)",在 2012 年,这只是因为一张显卡装不下而被迫采用的技巧。
论文投出去的时候,审稿人给出了冷淡甚至有些嘲讽的评论:
> *"GPU 上的神经网络不是新想法,这个工作虽然实现得不错,但缺乏理论创新。"*
1.3.3 三个让 AlexNet "突然管用"的关键技术
从结果反推,AlexNet 的成功并不是单一因素,而是四个技术点恰好在同一时间成熟的合力。我们一一拆解:
第一招:ReLU 激活函数(Rectified Linear Unit)
在传统的神经网络中,每个神经元(neuron)输出的信号需要经过一个"激活函数(activation function)"的非线性变换。当时最流行的是 Sigmoid 函数:
$$\sigma(x) = \frac{1}{1 + e^{-x}}$$
Sigmoid 函数有一个致命的弱点:当输入很大或很小的时候,它的导数(梯度)几乎为 0。这意味着在反向传播(Backpropagation,即"把误差从输出层往输入层反传"的过程)中,梯度信号会在多层之间逐层衰减,最终消失——这就是著名的 "梯度消失问题(Vanishing Gradient Problem)"。
Krizhevsky 使用了一个简单得近乎粗暴的替代品——ReLU:
$$f(x) = \max(0, x)$$
这个函数的好处是:当 $x > 0$ 时,它的导数恒为 1。梯度不会消失。
听起来不起眼,但效果惊人:在同样的网络结构下,使用 ReLU 的训练速度比 Sigmoid 快 6 倍。
> 🧠 判断依据:深度学习的"深度"在过去之所以不可行,不是因为模型不够大,是因为梯度传不下去。ReLU 看似是个小改动,实际上是给"深度"铺了路。
第二招:Dropout(随机失活)
第二个问题:神经网络有 6000 万个参数(parameter),而训练数据只有 120 万张图。这种比例下,模型会"死记硬背"训练集,在测试集上表现很差——这叫 过拟合(Overfitting)。
2012 年,Hinton 的团队(包括 Nitish Srivastava)提出了一个看似不可思议的技巧:Dropout。
训练时,在每一次前向传播中,随机让一半的神经元"罢工"——把它们暂时从网络中移除。这意味着每次迭代,模型都在训练一个"减半版"的网络结构;最后做预测时,再把所有神经元都打开。
直觉上,这强迫网络学习"冗余"的特征表示:不能依赖任何单一神经元,因为任何一个都可能在下一秒消失。这反而让网络学到了更鲁棒(robust)的特征。
> 🎯 关键直觉:Dropout 就像一支足球队的训练——每次随机抽走一半球员,剩下的队员必须学会自己填补空位。整支球队的协作能力反而被强化了。
第三招:数据增强(Data Augmentation)与 GPU 训练
剩下的问题是数据量和算力。
Krizhevsky 用了两个现在看来很经典的方法:
1. 图像翻转与裁剪:把每张训练图像水平翻转,再从中心和四个角裁剪出 $224 \times 224$ 的小块。一张图瞬间变成 5 张、10 张。 2. GPU 训练:他写的 CUDA(NVIDIA 的并行计算框架)代码让两块 GPU 并行计算矩阵乘法(matrix multiplication,这是神经网络中最核心的运算),把训练时间从 CPU 上的几周缩短到 GPU 上的 5–6 天。
1.3.4 比赛前夜:那个 10.9% 的差距
2012 年 10 月,ImageNet 测试集揭晓。Alex Krizhevsky 把模型跑了一遍,得到 top-5 错误率 15.3%。
第二名是日本东京大学的一个团队,使用的是经典的非深度学习方法,错误率 26.2%。
差距:10.9 个百分点。
这意味着,在 1000 个类别的识别中,AlexNet 给出的前 5 个答案里有 84.7% 包含正确标签,而第二名只有 73.8%。
比赛结束后,Hinton 接受采访时说了一句非常克制但意味深长的话:
> *"我认为这基本上是深度学习第一次被严肃地证明可以在一个真正困难的问题上工作。"*
---
1.4 GPU 的意外助攻:游戏玩家的显卡,AI 学者的核反应堆
1.4.1 一块为《使命召唤》设计的芯片,怎么就跑起了深度学习?
这件事说起来像个笑话。
NVIDIA GTX 580 是一块 2010 年发布的游戏显卡。它的设计目标很简单:在 60 帧/秒的速度下渲染 3D 场景。游戏画面本质上也是"像素矩阵"——一帧 1080p 的画面,就是 1920 × 1080 × 3 = 620 万个数字。
神经网络最核心的运算是什么?矩阵乘法。
把一张图的像素拉成一个长向量,乘以一个权重矩阵(weight matrix),就得到了下一层的"特征图(feature map)"。每一层都是矩阵乘法,再加上一个非线性激活函数。
GP