重新认识穷举法——完备性带来的结果
在商业上,大数据不仅便于掌握大局和每一个具体细节,而且改变了人们开发产品和解决问题的思路,这些做事方法的变化在很大程度上是大数据的完备性带来的。
在我们的认识里,穷举法在工作中并不是一个好的方法。首先,在大多数情况下无法穷举所有的情况;其次,即使在一些场合能够穷举出各种情况,这种方法也被称为笨办法,用穷举法会被人瞧不起。以笛卡儿和牛顿为代表的方法论都是在强调寻找一种普遍规律,然后用数据来验证。一旦这种普遍规律被找到,它就一劳永逸地解决问题。当然,当过去认为是普遍适用的规律遇到意外时,人们会找到相应补救的规律。但是,不论我们找到多少新的规律来处理那些不常见的意外情况,可能还会有意外发生,这种工作方式到后来效率就变得非常低了。当我们所找到的规律只能覆盖不常见的个案时,这种方法其实就和穷举法差不多了。既然如此,我们可能需要重新认识穷举法这种笨办法,或许在大数据时代它并不像想象中的那么笨。
下面一个例子是我在Google遇到的实际案例,从这个例子中,大家可以看出我们在研究和开发工作中方法的变化,当然这个变化是基于我们有非常多的数据和非常强大的计算能力。
网页搜索最早是用关键词索引查找的,这很容易被想到。但是在欧洲语言中,用词受限于时态、语态、性别(阳性和阴性)77,同一个意思在不同上下文可能用了不同的拼写,因此严格按照关键词匹配,例如查找时使用单数名词,就可能找不到有复数名词的内容。当然,这也难不倒工程师们,大家很容易想到把意思相同的词归为一类,按照类别来查找,而归类最简单的方法就是采用词干(stem,有时也叫作词根),比如计算一词的动词形式在英语中是compute,变化形式是computed、computing或者computes等,名词形式是computation,形容词是computed,计算机是computer、computers……这些都可以对应一个词干comput,如果用comput查找,似乎比用每一个单独的衍生词(compute、computer、computation等)更合理。这个想法几乎在一有文献搜索时就有人想到了,可以追溯到40多年前,但是奇怪的是直到2003年,在真正的产品中都没有使用这种方法。自从有了互联网和网页搜索,不断有人尝试用这种方法改进搜索质量,但是发现它带来的问题和好处同样多,比如在搜索计算机产品时,单数名词computer和复数名词computers是等价的,但是如果我们说计算机科学computer science时,就不能用复数computers取代computer了,在前一种情况下,使用词根是合情合理的,而后一种情况就会找到一些不相干的结果。因此,无论是学术界还是工业界,在进行了多年尝试后,都先后放弃了上述想法。
是否有办法确定在什么情况下应该使用词干搜索,在什么情况下必须严格按照关键词的原型搜索呢?对于具有较高语言水平的人,实际上是能够做到这一点的,但是要让计算机做到这一点就很困难,因为在什么情况下可以让一些近义词相互替换,什么情况下不可以,这并非几条规则就能够写清楚的,也不是简单地使用一个概率模型就能估摸出来的,在很多时候它们都需要按照个例来处理(case by case),或者说随时按照具体情况做具体的分析。至于这些具体情况有多少种,基本上讲,亿万用户能够想到的每一种搜索关键词组合,都是一种情况。在大数据时代之前,没有人奢望有一种方法能够把这么多情况一一考虑到,但是在大数据背景下,列举每一种(常见)情况,并且有针对性地做出不同的处理,则成为可能。
2003年,在Google内部,辛格博士和我等4个人,再一次尝试使用词干进行搜索,尽管我们知道前面有很多人尝试失败。与之前其他人不同的是,我们找到了一种方法,能够对每一种关键词的组合做专门的处理,比如我们知道在什么情况下动词compute和computes、computed、computing,甚至和名词computer或者近义词calculate、estimate是同义词,可以混为一谈,什么时候必须严格分开,也就是说,对于每一次搜索我们都能找到最好的匹配方式。Google在2003年一整年中,搜索质量的改进一半是靠这个方法。至于我们是怎么做到的,说起来可能会显得很没有技术含量。我们事先把多年来用户搜索过的关键词搭配都整理出来,然后在2003年美国独立日的长周末期间(有4天的假期),我们停掉了公司当时5个最大的数据中心中的一个,利用4天时间,对每一个关键词的搭配做了特殊处理。这实际上就是一种穷举法,Google的优势在于它有足够的数据和计算能力用“笨办法”把每一种搜索事先试一遍,而这一点大部分公司做不到。当然有人会问,如果将来遇到过去没有见过的新的关键词怎么办,办法也很简单,第一次遇到它时,用户只能认倒霉,搜索引擎只能按照旧的搜索方法给出结果;但是同时计算机会离线地把这个关键词处理一遍,这样以后别人再搜索这个关键词时,就可以使用针对它的特定搜索方法进行搜索了。
在这个例子里,我们看到大数据思维改变了我们的做事方式,因为过去被看作笨办法的穷举法变成了可行的方法。更为颠覆我们思维方式的是,穷举法可以方便我们对特殊情况做特殊处理,这反而是过去那些放之四海而皆准的机械思维做不到的。
通过这件事我们也能进一步体会大数据完备性的特点。在过去,统计学家们一直试图寻找好的采样方法,以便在有限的样本中找到覆盖尽可能全的规律,但是在大数据时代,这些努力都不需要了,因此样本集可以等于全集。另外,我们还可以从这个案例中看到大数据时效性的特点。对于新的、过去没有见过的情况,Google的服务器反应是非常及时的,即在第二次就能把新鲜的数据提供给用户使用,这在大数据时代之前也是做不到的。
如果Google搜索的例子对很多非IT行业的读者来说还不够直接,Google自动驾驶汽车则是一个利用大数据思维解决问题的极佳案例。
Google的自动驾驶汽车可以算是一个非常聪明的机器人,因为它可以像人一样控制汽车,识别道路,并且对各种随机突发性事件快速地做出判断。如果单从驾驶的安全性来看,它的表现甚至超过了人。从有做无人驾驶汽车的想法开始,到研制出让人眼前一亮的原型车,Google只花了4年多的时间,这让全世界大吃一惊,其震惊程度不亚于当年深蓝战胜卡斯帕罗夫。其原因是,在所有专家们看来,自动驾驶汽车这件事太难了,而Google在这个领域进步的程度超出了最乐观的专家们最大胆的想象。
在Google之前,全世界的学术界已经花了几十年来研制自动驾驶汽车。20世纪90年代初在清华大学上班和上学的人或许还能记得,在学校的主楼前一条几十米长的弧形马路上时常有人在试验自动驾驶汽车。在我和我同学的印象中,那辆车的时速只有每小时一两公里,在无人干涉的情况下自动行驶的距离从来没有超过100米,这显然和实用性相差太远,当然后来清华大学也放弃了这个尝试。
世界上其他大学和研究所在这个领域的进展也快不了多少。在2004年,美国国防部高级研究计划局(Defense Advanced Research Projects Agency,简称DARPA)组织了世界上第一届自动驾驶汽车拉力赛。由于当时各个研究团队水平都不高,因此比赛不敢在真正的道路上进行,而是选择了150英里78长的废弃道路。不过后来的结果表明根本不需要准备这么长的赛道,因为最终取得第一名的汽车花了几个小时才开出8英里,然后就抛锚了。至于其他参赛的汽车,不是提前抛锚了,就是撞坏了。
恰巧也是在这一年,经济学家弗兰克·李文(Frank Levy)和理查德·默南(Richard Murnane)出版了《劳工新种类》(New Division of Labor)一书,在书中他们列出了一些在近期内不会受到技术进步威胁的工作,其中货车司机的工作赫然在列。李文和默南在写书时并不知道DARPA拉力赛的结果,他们的判断是根据他们自己当时对科技进步的了解而做出的。在作者给出的很多理由中,很重要的一条是这样说的:计算机善于执行事先制定好的规则,解决确定性问题,而驾驶汽车会遇到很多的不确定性,并非规则能够解决的,需要实时做出聪明的判断。这两位经济学家认为,处理不确定性问题的能力是人所特有的,机器暂时不会具有这个能力。
但是,就在DARPA拉力赛过去仅仅6年之后,2010年Google就研制出了自动驾驶汽车,并且已经在各种道路上,从闹市区到高速路,行驶了14万英里,没有出一次事故79。为什么Google能在如此短的时间里做到这一点呢?除了它聘用了在这个领域世界上最好的专家,即几年前获得自动驾驶汽车拉力赛第一名的卡内基·梅隆大学的团队,以及采用了当时最好的信息采集技术,从激光雷达(Ladar)到高速摄像机,再到红外传感器等,最根本的原因是Google采用了和其他研究单位不同的研究方法——它把自动驾驶汽车这个看似是机器人的问题变成了一个大数据的问题。
图4.11 Google自动驾驶汽车,注意,里面没有方向盘
首先,Google自动驾驶汽车项目其实是它已经成熟的街景项目的延伸。对Google自动驾驶汽车的各种报道通常都会忽视一个事实,那就是它只能去Google“扫过街”的地方。对于这些已经去过的地方,Google都收集到了非常完备的信息,比如周围的各种目标的形状大小、颜色,每条街道的宽窄、限速,不同时间的交通情况、人流密度等,Google都事先处理好以备未来使用。因此,自动驾驶汽车每到一处,对周围的环境是非常了解的,它可以迅速把这些数据调出来作为参考。而过去那些研究所里研制的自动驾驶汽车使用的是人的思维方式,每到一处都要临时识别目标,这样即使所搭载的计算机再快,也来不及进行太深入的计算,因此无法做出准确判断。
其次,自动驾驶汽车上装有十多个传感器,每秒钟进行几十次的各种扫描,这一方面超过了人所能做到的”眼观六路、耳听八方”,同时大量的数据要在短时间内处理完,计算的压力是非常大的。Google的自动驾驶汽车是通过移动互联网与Google的超级数据中心相连的,虽然它本身携带的电脑不过是一台简单的服务器,但是整体的数据量和计算能力要远远超出过去其他公司和大学那些自动驾驶汽车上面所携带的计算机。
再次,我们人开车,常常是根据周围情况临时做出判断,遇到死胡同,转弯掉头再找其他的道路。Google拥有一个最好的全球地图数据,它的自动驾驶汽车不仅行驶的路线大部分是事先规划好的,而且对各地的路况以及不同交通状况下车辆行驶的模式有准确的了解,因此它可以规避很多不必要的麻烦。当然,如果开到了事先(扫街汽车)没有去过的地方,自动驾驶汽车常常会无计可施。
在2016年年初,Google的无人驾驶汽车在道路上安全行驶了200多万英里之后,终于出了第一起负主动责任的交通事故。出事的原因与其说是它的判断出了问题,不如说是数据的缺失。出事的那辆汽车在道路上检测到一个5公斤大小的小沙袋,那种沙袋一般是家庭用在院落的水沟旁防止洪水的。一般司机遇到这种情况就直接压过去了,但是Google自动驾驶汽车没见过这个东西,因此试图换道绕过去,而那辆车并没有方向盘,乘客也无法人为控制方向,结果出了一次小事故。
图4.12 让Google自动驾驶汽车出事故的就是这样一个小沙袋
我们讲这件事情,并非想要讨论自动驾驶汽车的产品设计是否应该允许人能够控制它,也不是讨论它是否安全,事实上它比人开车安全得多,而是从反面证明这是一个利用数据获得智能的典型案例。在今天的很多智能产品和服务上,可以说没有数据就没有智能。
Google在数据上的优势,是大学和各个研究所并不具备的。即使是全球著名的汽车公司,包括丰田、大众和美国通用,也不具备如此多的数据。因此,它们虽然在自动驾驶汽车研制方面早起步几十年,但是很快就被Google超越。另外,计算机学习“经验”的速度远远比人快得多,这也是大数据多维度的优势,因此Google自动驾驶汽车的进步才能如此快。这并非说明Google的科研能力超过了过去那么多大学、研究所和公司的总和,反而是体现出大数据的威力,以及采用大数据思维的重要性。