暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

AI高考那年

2012年10月,意大利佛罗伦萨。

一间挤满了计算机视觉研究者的会议室里,气氛有点奇怪。不是兴奋,是困惑,甚至带着一丝……怀疑。

台上正在公布ImageNet挑战赛的结果。这个比赛办了三年,大家已经习惯了:每年冠军的错误率往下降两三个百分点,像挤牙膏一样。你改进一下特征提取,我调一调分类器参数,大家在一个叫“人工设计特征+统计模型”的赛道上,稳稳地跑着。

但今年的结果一出来,所有人都愣住了。

冠军是一个叫“SuperVision”的团队,来自加拿大多伦多大学,就三个人:一个头发花白的老教授,和两个研究生。他们的成绩是——

top-5错误率15.3%

会议室里安静了一两秒,然后有人小声说:“第二名的成绩是多少?”

26.2%。

领先第二名10.9个百分点。

在这个连年进步2-3个百分点都值得庆祝的比赛里,有人一下子领先了10.9个百分点。

(让天下灭有难学的编程注:top-5错误率,就是给AI看一张图,它猜5次,5次全错才算错。2010年冠军错28.2%,2011年错25.8%,按这个速度,要到2015年才能到15.3%。)

“他们是不是作弊了?” 这句话不是观众席里某个人说的,而是很多研究者脑子里同时冒出来的念头。

ImageNet数据集的创建者李飞飞教授后来回忆,她当时正在家里,看到结果后立刻改了行程——她必须亲自飞到佛罗伦萨,亲眼看看这是怎么回事。

她没有看到作弊。她看到了一场革命。

一场“正常”的考试

在讲这个革命之前,我们得先说说这场考试本身。

2010年,一群计算机视觉研究者组织了一场大规模的AI比赛,名字很长,大家通常用它的数据集来称呼它:ImageNet挑战赛

ImageNet是什么?是一个巨大的图片库。李飞飞教授从2007年开始带着团队建这个东西,花了将近三年,动用了来自167个国家的近49000名标注工人,从1.6亿张候选图片里,筛选并标注了超过1400万张图片。

1400万张是什么概念?如果你一秒看一张,不吃不睡,要162天才能看完。

挑战赛用的是这个库的一个子集:120万张训练图片,1000个类别。规则很简单——给AI看一张图,让它猜是什么,猜5次,错得越少越好。

2010年,冠军成绩是28.2%的错误率。按考试满分100分算,大概72分。能及格,但说不上好。

2011年,冠军成绩是25.8%。进步了2.4个百分点。74分。

大家都很满意。这就是正常的进步速度嘛。照这个速度,2012年也许能到24%,2013年22%……像挤牙膏一样,但牙膏总归在往外挤。

所有人都默认:这就是AI进步的速度。

直到那个叫AlexNet的家伙出现。

“你这跑法不对吧?”

我们得把那个场景再还原一下。

假设你是2012年参赛的一个研究员。你用的方法是这样的:先设计一堆固定的检测器——比如“找这种方向的边缘”“统计这种纹理出现了几次”——用它们从图片里抽出一堆数字,然后把这些数字交给一个统计模型,让它判断“这组数字更像猫还是更像狗”。

这个方法叫人工设计特征+统计模型分类。它的瓶颈很明显:检测器是固定的。人类能想到的特征就那么多,能手动设计的检测器也就那么多。不管你后面的统计模型多厉害,输入它的那些特征就这些——特征本身不够好,分类结果就上不去。

你的成绩是26.2%,拿了第二名。你觉得不错了。

然后你听到第一名那个15.3%的成绩。

你的第一反应是什么?肯定是:“不可能。”

你的第二反应是:“他用了什么方法?”

答案让你更困惑了:深度卷积神经网络

这是一个1990年代就有人提过的老古董。你的同行们早在2000年代初就试过,发现层数一多就训练不动——那个叫“梯度消失”的问题,像一堵墙,谁也翻不过去。大多数人都放弃了,转去搞别的方法。

但这个多伦多来的团队,不仅翻过去了,还跑得飞快。

你开始打听细节,然后你发现了更让人崩溃的事:他们用来训练这个网络的硬件,是两块NVIDIA的GTX 580游戏显卡,每块499美元。

你心里想的是:我们用了这么复杂的特征设计,这么精巧的统计模型,结果被两块游戏显卡打败了?

(让天下没有难学的编程注:GTX 580是2010年发布的游戏显卡,512个计算核心,3GB显存。AlexNet就是用这两块显卡,花了5到6天训练出来的。如果用CPU,同样的训练可能要跑好几个月。)

三把钥匙同时转动

好,现在让我们跳出那个会议室,用一个更冷静的视角,看看2012年到底发生了什么。

如果把AI的突破比作打开一扇锁着的门,那这把锁需要三把钥匙同时插进去才能打开。这三把钥匙是:数据、算力、算法

在2012年之前,这三把钥匙总是缺一两把。

第一把钥匙:数据。

深度神经网络有一个特点:它需要海量的数据来学习。如果只有几百张图片,它会“死记硬背”那些图片的细节,而不是学到真正通用的规律。就像一个学生,如果只做了3道练习题就去考试,他可能只是记住了那3道题的答案,换个数字就不会了。

2009年之前,没有人有这么多标注好的图片。李飞飞教授改变了这一切。她花了将近三年,动用了近49000名标注工人,建成了ImageNet——1400万张标注好的图片,两万多个类别。这在当时是前所未有的规模。

没有ImageNet,就没有AlexNet的突破。那些深层的检测器需要看到足够多的例子,才能从随机数字变成有意义的特征提取器。

第二把钥匙:算力。

有了数据还不够。AlexNet有6000万个参数——6000万个需要调整的数字。训练这个网络意味着:对120万张训练图片,每一张都要做6000万次乘法和加法,然后根据结果调整参数,这个过程要反复90轮。

如果用普通电脑的CPU来算,可能要算好几个月甚至好几年。

Alex Krizhevsky——就是那个团队里两个研究生之一——用了一个聪明的办法:用游戏显卡来算。

CPU像一个大厨,手艺精湛,但一次只能炒一道菜。GPU像1000个帮厨,每个人只会切菜这种简单操作,但1000个人同时干活,切菜的总速度远远超过一个大厨。

训练神经网络正好就是这种活——大量简单的乘法和加法,可以同时做。这就是GPU的主场。

2009年,斯坦福大学的吴恩达团队发表了一篇论文,证明在特定的AI训练任务上,GPU比CPU快约70倍。

70倍。原来要算70天的事情,现在1天就能算完。

Alex Krizhevsky用两块GTX 580显卡,把网络劈成两半,一半放在一块显卡上,一半放在另一块上,让它们协同工作。训练时间:5到6天。

第三把钥匙:算法。

数据和算力到位了,但还需要算法上的突破。

在2012年之前,深度神经网络有一个严重的问题:层数一多,就训练不动了。因为一个叫“梯度消失”的问题——那个“该调多少”的信号,每经过一层就会变小一点。传到最前面几层的时候,已经小到几乎为零。

AlexNet用了几个关键的技术改进来解决这个问题:

第一个叫ReLU激活函数。在它之前,常用的激活函数会把很大或很小的数字都“压扁”到一个很小的范围内,这导致信号在传递过程中迅速变小。ReLU做的事很简单:如果输入大于0,就原样输出;如果输入小于等于0,就输出0。就这么简单,但训练速度一下子快了6倍。

第二个叫Dropout。这个技巧是Hinton教授在同一年提出的。原理很简单:在训练过程中,每一步都随机“关掉”一部分神经元。这意味着,网络不能依赖某几个特定的神经元来记住答案——它必须学到更“通用”的特征。就像考试前,老师每次模拟考都随机不让你用一部分公式——你就不得不真正理解原理,而不是死记公式。

第三个就是网络结构本身。AlexNet有8层——5层卷积层加3层全连接层,共6000万个参数。1998年Yann LeCun的LeNet-5只有6万个参数——AlexNet的参数量是它的1000倍。更大的网络能学到更复杂的特征。

“完美风暴”

1990年代:算法有了,但数据太少、算力太弱。结果:网络只能做很小的任务,比如识别手写数字。

2000年代初:算力在进步,但没有GPU加速。数据开始增多,但还不够。算法遇到了梯度消失等瓶颈。结果:大多数研究者放弃了神经网络。

2009-2012年:

数据:ImageNet提供了120万张标注图片

算力:GPU被发现可以大幅加速神经网络训练

算法:ReLU解决了梯度消失,Dropout解决了过拟合

三把钥匙同时插进去,拧动了。

结果就是AlexNet。

(让天下没有难学的编程注:这就像一把锁需要三把钥匙才能打开。在2012年之前,总是缺一两把。2012年,三把钥匙终于凑齐了。)

后续:门开了,所有人涌了进去

AlexNet之后,几乎所有参赛团队都转向了同一种方法——深度神经网络。

后面的进步速度更是惊人:

2013年:11.7%

2014年:6.7%(已经接近人类水平)

2015年:3.57%(超过人类)

2017年:2.25%

从28.2%到2.25%,从“勉强及格”到“远超人类”,只用了7年。

而引爆这一切的,是一个教授和两个研究生,用两块游戏显卡,在5天里训练出来的一个程序。

有时候我会想一个假设:如果李飞飞没有建ImageNet呢?如果GPU没有被用来训练神经网络呢?如果Hinton团队没有参加2012年的比赛呢?

AI的爆发也许会推迟好几年。或者,也许最终还是会发生——因为三个要素各自的发展趋势已经不可逆转。但2012年是那个“完美风暴”的时刻,所有条件恰好同时成熟了。

一句话回顾

2012年不是“进步快了一点”。是换了一条赛道

三要素齐了——数据(ImageNet)、算力(GPU)、算法(ReLU、Dropout)——AI从此走上了快车道。

而引爆这一切的AlexNet,用的核心方法有一个名字:神经网络

下一篇,我们就来拆开这个词——你会发现,它其实就是一堆乘法和加法。真的,就这么简单。


关注微信公众号【让天下没有难学的编程】,一起学习AI吧

求职、职场,技术讨论等,任何问题都欢迎+V


文章转载自让天下没有难学的编程,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论