PDF 物理页索引 2990
文件中的第 2991 页 · 印刷页码:未识别
写这本书时,我的脑海里浮现出各式各样但又有相似之处的读者。
围绕大数据以及机器学习的讨论充满争议,如果你对此感到好奇,且怀疑有比论文上看到的更为深层次的东西,那么这本书就是你进行革命的指南。
如果你的主要兴趣是机器学习的商业用途,那么本书至少能通过6种方法帮助你:成为分析学中更精明的消费者;充分利用你的数据专家;减少许多数据挖掘项目的隐患;看看如果不买手写编码软件,你能让什么进行自动操作;降低信息系统的僵硬度;期待正朝你走来的新技术。我见过太多浪费大量时间和金钱去解决难题的人,他们使用了错误的学习算法,或者误解了学习算法的含义。要避免这些惨败,实际上,你只需要阅读这本书。
如果你是普通人或者决策者,关注由大数据和机器学习引发的社会和政治问题,那么本书将为你提供该技术的入门知识:什么是机器学习,机器学习能干什么、不能干什么。本书没有让你觉得乏味的复杂细节。从隐私问题到未来的工作,以及机器人化引起战争的道德观,我们会看到真正的问题所在,以及如何正确思考。
如果你是科学家或者工程师,那么机器学习肯定是你不想错过的有力武器。在大数据时代(即便是中型数据时代),陈旧的、靠得住的统计工具并不会让你走得更远。你需要的是机器学习的非线性技术来精确模仿多种现象,它会带来全新的、科学的世界观。今天,“范式转移”被人们用得过于随意,但我可以毫不夸张地说,本书要讲的内容就是和“范式转移”相关。
如果你是机器学习专家,那么你可能对本书的大部分内容已经相当熟悉,但你仍会发现其中有许多新颖的看法、经典的观点,以及有用的例子和类比。很大程度上,我希望本书能提出与机器学习相关的、新的看法,甚至能让你开始思考新的方向。我们身边到处是容易达成的目标,我们理应追寻这种目标,但我们也不应忽略不远处就有更大的目标(关于这一点,我希望你们能原谅我诗意地用“终极算法”来指通用型学习算法)。
PDF 物理页索引 2991
文件中的第 2992 页 · 印刷页码:未识别
如果你是学生,无论你多大,是考虑该选什么专业的高中生,还是决定该研究什么领域的本科生,或者是考虑转行、经验丰富的专家,我希望本书能让你对这个令人着迷的领域感兴趣。当今世界极度缺乏机器学习专家,如果你决定加入这一行列,你不仅能得到令人激动的时刻和丰厚的物质回报,还有服务社会的大好机会。如果你已经在研究并学习主算法,我希望本书能帮你了解它的历史。如果你在旅途中偶然发现本书,也值得你用心阅读。
最后要强调一点,如果你渴望奇迹,那么机器学习对你来说就是一场精神盛宴。我诚挚地邀请你一同前往。
[1] Kinect是微软对Xbox360体感周边外设正式发布的名字。——编者注
[2] IBM,国际商业机器公司。——编者注
PDF 物理页索引 2992
文件中的第 2993 页 · 印刷页码:未识别
第一章机器学习革命
我们生活在算法的时代。一两代人以前,提到“算法”这个词,可能多数人会脑中一片空白。当今,文明社会的每个角落都存在算法,日常生活的每分每秒也都和算法有关。算法不仅存在于你的手机或笔记本电脑,还存在于你的汽车、房子、家电以及玩具当中。当人们进出银行时,银行系统就是由各种算法交织而成的庞大集合体。算法安排航班,也驾驶飞机。算法能经营工厂、进行交易、运输货物、处理现金收益,还能保存记录。如果所有算法都突然停止运转,那么就是人类的世界末日。
算法就是一系列指令,告诉计算机该做什么。计算机是由几十亿个微小开关(称为晶体管)组成的,而算法能在一秒内打开并关闭这些开关几十亿次。最简单的算法是触动开关。一个晶体管的状态就是一个比特信息:如果开关打开,信息就是1;如果开关关闭,信息就是0。银行的计算机的某个比特信息会显示你的账户是否已透支。美国社会保障总署的计算机的某个比特信息表明你是活着还是已死亡。第二简单的算法是:把两个比特结合起来。克劳德·香农以“信息论之父”而为人所知,他第一个意识到晶体管的活动就是在运算,因为晶体管开了又关,是对其他晶体管的回应(这是他在麻省理工学院的硕士论文——有史以来最有意义的硕士论文)。如果A晶体管只有在B和C晶体管都打开时才打开,那么这时它就是在做小型的逻辑运算。如果A晶体管在B和C晶体管其中一个打开时才打开,就是另外一种小型逻辑运算。如果A晶体管在B晶体管任何关闭的时候打开,或者反过来,这又是第三种运算。信不信由你,所有算法,无论多复杂,都能分解为这三种逻辑运算:且,或,非。利用不同的符号来代替“且”“或”“非”运算,简单的算法就可以用图表来表示。例如,如果发烧可由感冒或者疟疾引起,那么你应该用泰诺来治疗发烧和头疼,可以用图1–1表示。
PDF 物理页索引 2993
文件中的第 2994 页 · 印刷页码:未识别
通过结合许多这样的逻辑运算,我们可以进行极其复杂的逻辑推理。人们往往认为计算机只和数字有关,其实并非如此,它完全关乎逻辑。数字和算术都是由逻辑构成的,而计算机的所有其他部分也是如此。想把两个数相加?可以由晶体管的组合体来完成。想赢得《危险边缘》智力比赛?也可以由晶体管的组合体来完成(当然,这个组合体庞大得多)。
PDF 物理页索引 2994
文件中的第 2995 页 · 印刷页码:未识别
即便如此,为了做不同的事而制造新的计算机代价过于昂贵。当然,现代计算机是各种晶体管的大集合,能做许多不同的事,这取决于哪些晶体管被激活。米开朗琪罗说过,他所做的一切,就是从大理石石块中看出雕像,然后将多余的石头刻掉,直到雕像的形状显现出来。同样,算法排除计算机中多余的晶体管,直到出现想要的功能,无论是客机的自动驾驶仪,还是皮克斯的新电影,原理都是这样。
一种算法不仅是简单的一套指令,这些指令必须精确且不能模糊,这样计算机才能够执行。例如,食谱并不算一种算法,因为食谱没有明确给出做事的顺序,或者具体每一步是怎样的。一勺白糖到底是几克?每个尝试新食谱的人都知道,跟着食谱做,可能会做出很美味的食物,也可能会做得一塌糊涂。相比之下,算法总能得出同样的结果。即便食谱明确指出需要半盎司白糖,计算机也不知道如何执行,因为计算机不知道什么是白糖、什么是盎司。如果我们想对厨用机器人编程,让它来做蛋糕,我们要通过视频教它如何辨认白糖、如何拿起勺子等(我们现在仍在努力)。计算机必须知道如何执行算法,直到打开及关闭指定的晶体管。因此,食谱离算法还很远。
另一方面,下面是玩井字棋的算法:
如果你或对手有两粒连子,占据剩下的角落。
否则,如果两边有两个连子的走法,就那样走。
否则,如果正中央是空的,走正中央。
否则,如果你的对手走到角落,占据他的对角。
否则,如果有空白的角落,占据它。
否则,占据任意空白的角落。
这个算法有很大的优点,那就是它绝对不会输。当然,它仍忽略了许多细节,比如在计算机的记忆中,棋盘如何表示,而棋的走法又如何改变这种表示方法。例如,每个角落我们有两个比特,如果中间是空的,值就是00;如果有一个圈,值就变成01;如果有一个叉,值就变成10。即便如此,这也足够精确、清晰,能让有能力的编程员来填补被忽略的空白。它还有一个好处,就是不用我们自己指定算法,细到单个晶体管。在构建数据存储块时,我们可以使用之前存在的算法,而且有很多这样的算法供选择。
PDF 物理页索引 2995
文件中的第 2996 页 · 印刷页码:未识别
算法是一套严格的标准。人们常说,你没法真正了解某样东西,直到你能用一种算法来将其表达出来(理查德·费曼曾说,“如果我无法创造某样东西,那么也就无法理解它”)。方程式对物理学家和工程师来说就是谋生工具,而这也仅仅是一种特殊算法。例如,牛顿第二定律,可以说是有史以来最重要的等式,告诉你用物体的质量乘以其加速度,可以算出作用在物体上的力。该定律还隐含地告诉你,加速度等于作用力除以质量,要弄明白这一点,只需一个运算步骤。在科学的任何领域,如果某个理论无法用算法表示,那么它就不是很严谨(更别提你无法用计算机来解决这个问题,因为你能让计算机替你做的事实在太有限)。科学家提出理论,工程师制造设备,计算机科学家提出算法,这和理论及设备都有关。
设计算法并没有那么简单。这个过程充满陷阱,什么事都不能想当然。如果你的一些构建已经出错,就得找其他方法。设计算法最重要的一点就是,你得用一种计算机能理解的语言来将算法记录下来,比如Java或者Python(从这个角度看,就是一个程序)。接下来,你得对其进行纠错:找出每个误差并修正,直到计算机能够运行程序,而不至于搞砸。一旦你有了能完成你心愿的程序,就轻松多了。计算机会以飞快的速度,按我们的要求办事,而且毫无怨言。世界上的每个人都能享用你的创作成果。如果你愿意,这个成果可以一文不收;当然,如果你解决的问题足够有意义,这个成果也可以让你成为亿万富翁。程序员(创造算法并将其编码的人)是一个“小神灵”,能任意创造不同的世界。甚至你也可以说《圣经·创世记》里的神也是“程序员”:语言(而不是统治权)才是他创造世界的工具。语言构成了这个世界。当今时代,坐在沙发上利用笔记本电脑,你就可以成为一个“神”。你完全可以想象一个世界,并实现它。
PDF 物理页索引 2996
文件中的第 2997 页 · 印刷页码:未识别
有朝一日,计算机科学家会互相依赖各自的成果,然后为新事物创造算法。这些算法会与其他算法相结合,目的是利用其他算法的成果,反过来产生能服务更多算法的成果。每一秒钟,数十亿计算机里的数十亿晶体管会打开关闭数十亿次。算法形成新型生态系统,它将生生不息,具有无可比拟的生命多样性。
然而,不可避免地,在这个“伊甸园”里也会有狡猾的人存在,人们称之为“复杂性怪兽”。和九头蛇一样,这个复杂性怪兽有很多头,其中一个就是空间复杂性,即为了储存在计算机内存中,一个算法所需信息的比特数量。如果计算机无法提供该算法所需的内存,那么这个算法就没用,必须忽略。接着是邪恶的同类——时间复杂性:该算法运行多长时间,也就是说,在产生想要的结果之前,算法利用及重新利用晶体管的步骤有多少。如果算法运行时间太久,我们等不了,那么这个算法也没用。复杂怪兽最恐怖的一面就是人类的复杂性。当算法变得很复杂以致人类大脑已无法理解,当算法不同部分的交互过多且过于深入时,误差就会悄然潜入。我们找不到这些误差,也就无法纠正它们,算法也就不会做我们想做的事。即便我们让它运行起来,它也会停下来。对使用它的人来说,它没必要那么复杂,而且它和其他算法也合作得不好,这为日后埋下隐患。
每位计算机科学家每天都在和“复杂性怪兽”做斗争。如果科学家输了这场斗争,复杂性就会渗入我们的生活。你可能已经注意到,很多这样的斗争科学家已经输了。即便如此,我们也会继续构建我们的算法之塔,并迎接越来越大的挑战。每一代新的算法都要在之前的基础上构建,除了这代算法的复杂性,它们还面临之前算法的复杂性。塔会变得越来越高,会覆盖整个世界,但它也会变得越来越脆弱,像一座纸片做的房子,随时都会倒塌。算法里的微小误差可能导致价值10亿美元的火箭爆炸,或者可能导致停电,造成数百万美元的损失。算法以意想不到的方式进行交互,股票市场就会崩溃。
PDF 物理页索引 2997
文件中的第 2998 页 · 印刷页码:未识别
如果程序员是“小神”,复杂性怪兽就是魔鬼。慢慢地,魔鬼会赢得战争。
总得有个更好的方法来与魔鬼做斗争。
学习算法入门
每个算法都会有输入和输出:数据输入计算机,算法会利用数据完成接下来的事,然后结果就出来了。机器学习则颠倒了这个顺序:输入数据和想要的结果,输出的则是算法,即把数据转换成结果的算法。学习算法能够制作其他算法。通过机器学习,计算机就会自己编写程序,就用不到我们了。
哇!
计算机会自己编写程序。现在看来这是一个强大的想法,甚至可能有点吓人。如果计算机开始自己编程,那么我们将如何控制它们?我们会看到,人类可以很好地控制它们。可能会有人当即反对,这听起来太美好了,不像真的。当然,编写算法需要智力、创造力、问题解决能力,这些都是计算机没有的。如何把机器学习与魔法区分开来?的确,今天为止,人们能编写许多计算机无法学习的程序。可令人更为惊讶的是,计算机却能学习人们无法编写出来的程序。我们会开车、会辨认字迹,但这些技能都是潜意识发挥出来的,无法向计算机解释这些事情是如何完成的。但是,如果我们把关于这些事情的足够多的例子交给学习算法,该算法会很乐意弄明白怎样独立完成这些事情,这时我们就可以放手让算法去做了。邮局正是通过这种方法来识别邮政编码,自动驾驶汽车也是这样才得以实现在路上跑。
PDF 物理页索引 2998
文件中的第 2999 页 · 印刷页码:未识别
解释机器学习的力量的最好方法,也许就是将其与其他低技术含量的活动进行类比。工业社会,商品由工厂制造,这也意味着工程师必须弄明白商品如何通过零件组装起来、这些零件如何生产等,细到生产原料。这是一项大工程。计算机是人类发明的最复杂的产品,计算机设计、工厂生产、程序运行都涉及大量的工作。还有另外一种方法能让我们得到一些想要的东西:让自然规律去塑造它们。在农业当中,我们播种,确保种子有足够的水分和营养,然后收割成熟的作物。为什么技术不能这样?完全可以,而这也是机器学习的承诺。学习算法是种子,数据是土壤,被掌握的程序是成熟的作物。机器学习专家就像农民,播下种子,灌溉,施肥,留意作物的生长状况,事事亲力亲为,而不是退居一旁。
一旦我们这样看待机器学习,随即也会发生两件事:
第一,我们掌握的数据越多,我们能学的也越多。没有数据?什么也学不到。大数据?很多东西可以学习。这也是机器学习无处不在的原因,因为有飞速增长的数据。如果你在超市购买机器学习,其包装上可能会写着“只需添加数据”。
第二,机器学习是一把剑,利用这把剑可以杀死复杂性怪兽。只要有足够的数据,一段只有几百行代码的程序可以轻易生成拥有上百万行代码的程序,而且它可以为解决不同问题不停产生不同的程序。这可以显著降低程序员工作的复杂度。当然,就像对付九头蛇,我们砍掉它的头,会立即长出新头,但长出的头会变小,而且头的生长也需要时间,因此我们仍有可能胜出。
我们可以把机器学习当作逆运算,正如开平方是平方的逆运算、整合是分化的逆运算。正如我们会问“什么数的平方是16”,或者“导数为x+1的函数是什么”,我们也会问“什么算法会得出该结果”。我们很快会看到,怎样将这个观点运用到具体的学习算法中。
PDF 物理页索引 2999
文件中的第 3000 页 · 印刷页码:未识别
有些学习算法学习知识,有的则学习技能。“所有人都会死”是知识,骑单车是技能。在机器学习中,知识往往以统计模型的形式出现,因为多数知识都是可以统计的:所有人都会死,但只有4%是美国人。技能往往以程序的形式出现:如果马路向左弯曲,那么向左转动车头;如果一只鹿跳到你面前,那么立刻刹车(很遗憾,在写这本书时,谷歌的自动驾驶汽车仍会把被风吹起的塑料袋和鹿弄混)。通常,这些程序都很简单,复杂的是它们的核心知识。如果你能判断哪些邮件是垃圾邮件,那么你也就能判断该删除哪些邮件。如果你能在象棋游戏中判断这盘棋自己的优势在哪里,那么你也就懂得该怎么走(能让你处于最有利地位的一步)。
机器学习有许多不同的形式,也会涉及许多不同的名字:模式识别、统计建模、数据挖掘、知识发现、预测分析、数据科学、适应系统、自组织系统等。这些概念供不同群体使用,拥有不同的联系。有些有很长的半衰期,有些则较短。在本书中,我用“机器学习”一词泛指所有这些概念。
机器学习有时会和人工智能(AI)混淆。严格来讲,机器学习是人工智能的子域,但机器学习发展得如此壮大且成功,现已超越以前它引以为傲的母领域。人工智能的目标是教会计算机完成现在人类做得更好的事,而机器学习可以说就是其中最重要的事:没有学习,计算机就永远无法跟上人类的步伐;有了学习,一切都与时俱进。
在信息处理这个生态系统中,学习算法是顶级掠食者。数据库、网络爬虫、索引器等相当于食草动物,耐心地对无限领域中的数据进行蚕食。统计算法、线上分析处理等则相当于食肉动物。食草动物有必要存在,因为没有它们,其他动物无法存活,但顶级掠食者有更为刺激的生活。数据爬虫就像一头牛,网页相当于它的草原,每个网页就是一根草。当网络爬虫进行破坏行动时,网站的副本就会保存在其硬盘当中。索引器接着做一个页面的列表,每个词都会出现在页面当中,这很像一本书后的索引。数据库就像大象,又大又重,永远不会被忽略。在这些动物当中,耐心的野兽飞快运转统计和分析算法,压缩并进行选择,将数据变为信息。学习算法将这些信息吞下、消化,然后将其变成知识。