深度学习与围棋

978-7-115-55146-7
作者: [美]马克斯•帕佩拉(Max Pumperla)
译者: 赵普明
编辑: 杨海玲

图书目录:

详情

这是一本深入浅出且极富趣味的深度学习入门书。本书选取深度学习近年来最重大的突破之一 AlphaGo,将其背后的技术和原理娓娓道来,并配合一套基于 BetaGo 的开源代码,带领读者从零开始一步步实现自己的“AlphaGo”。本书侧重实践,深入浅出,庖丁解牛般地将深度学习和AlphaGo这样深奥的话题变得平易近人、触手可及,内容非常精彩。 全书共分为3个部分:第一部分介绍机器学习和围棋的基础知识,并构建一个最简围棋机器人,作为后面章节内容的基础;第二部分分层次深入介绍AlphaGo背后的机器学习和深度学习技术,包括树搜索、神经网络、深度学习机器人和强化学习,以及强化学习的几个高级技巧,包括策略梯度、价值评估方法、演员-评价方法 3 类技术;第三部分将前面两部分准备好的知识集成到一起,并最终引导读者实现自己的AlphaGo,以及改进版AlphaGo Zero。读完本书之后,读者会对深度学习这个学科以及AlphaGo的技术细节有非常全面的了解,为进一步深入钻研AI理论、拓展AI应用打下良好基础。 本书不要求读者对AI或围棋有任何了解,只需要了解基本的Python语法以及基础的线性代数和微积分知识。

图书摘要

版权信息

书名:深度学习与围棋

书号:978-7-115-55146-7

本书由人民邮电出版社发行数字版。版权所有,侵权必究。

您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。

我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。

如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。


著    [美]马克斯•帕佩拉(Max Pumperla)

     [美]凯文•费格森(Kevin Ferguson)

译    赵普明

责任编辑 杨海玲

人民邮电出版社出版发行  北京市丰台区成寿寺路11号

邮编 100164  电子邮件 315@ptpress.com.cn

网址 http://www.ptpress.com.cn

读者服务热线:(010)81055410

反盗版热线:(010)81055315


Original English language edition, entitled Deep Learning and the Game of Go by Max Pumperla and Kevin Ferguson published by Manning Publications Co., 209 Bruce Park Avenue, Greenwich, CT 06830. Copyright © 2019 by Manning Publications Co.

Simplified Chinese-language edition copyright © 2020 by Posts & Telecom Press. All rights reserved.

本书中文简体字版由Manning Publications Co.授权人民邮电出版社独家出版。未经出版者书面许可,不得以任何方式复制或抄袭本书内容。

版权所有,侵权必究。


这是一本深入浅出且极富趣味的深度学习入门书。本书选取深度学习近年来最重大的突破之一 AlphaGo,将其背后的技术和原理娓娓道来,并配合一套基于 BetaGo 的开源代码,带领读者从零开始一步步实现自己的“AlphaGo”。本书侧重实践,深入浅出,庖丁解牛般地将深度学习和AlphaGo这样深奥的话题变得平易近人、触手可及,内容非常精彩。

全书共分为3个部分:第一部分介绍机器学习和围棋的基础知识,并构建一个最简围棋机器人,作为后面章节内容的基础;第二部分分层次深入介绍AlphaGo背后的机器学习和深度学习技术,包括树搜索、神经网络、深度学习机器人和强化学习,以及强化学习的几个高级技巧,包括策略梯度、价值评估方法、演员-评价方法 3 类技术;第三部分将前面两部分准备好的知识集成到一起,并最终引导读者实现自己的AlphaGo,以及改进版AlphaGo Zero。读完本书之后,读者会对深度学习这个学科以及AlphaGo的技术细节有非常全面的了解,为进一步深入钻研AI理论、拓展AI应用打下良好基础。

本书不要求读者对AI或围棋有任何了解,只需要了解基本的Python语法以及基础的线性代数和微积分知识。本书适合广大在校学生、技术人员,以及所有对AI、深度学习或围棋感兴趣的读者。


围棋是中华传统文化的一颗明珠,属于琴棋书画四艺之一。

围棋是最古老的棋类游戏之一,相传为尧帝所创,早在春秋、战国时期,《左传》《论语》中就有记载。从古诗中我们能感受到历代以来围棋深入人心的程度:“楚江巫峡半云雨,清簟疏帘看弈棋”(杜甫),“别后竹窗风雪夜,一灯明暗覆吴图”(杜牧),“战罢两奁分白黑,一枰何处有亏成”(王安石),“且共江人约,松轩雪夜棋”(寇准),“忘忧清乐在枰棋,仙子精功岁未笄”(宋徽宗),“随缘冷暖开怀酒,懒算输赢信手棋”(唐寅)。

围棋也是世界上最复杂的棋类游戏之一。在国际公认的几大棋类中,围棋在复杂度上独占鳌头,并且远超同侪。正如本书中所介绍的,围棋的每一回合都千变万化,因此潜在的可选棋局的数量极其庞大,“远远超过宇宙中所有粒子的总和”。因此用传统的方法来预测围棋的变化是几乎不可能的事情。其他几大棋类,如国际象棋、中国象棋等,也有类似的特点,但围棋与它们相比有着数量级的鸿沟。例如,国际象棋平均每回合的可能变化大概有30种,而围棋平均每回合的可能变化有250种左右。如果只提前预测5步棋,国际象棋需要预测大概2400万种变化,而围棋则需要处理约1万亿种变化。由于复杂度的增长是呈指数级的,因此多预测几步,两者变化数的差别就会变成天文数字。

我们从人工智能(AI)在棋类游戏上“攻城略地”的历史中,也可以看出这种差别。1997年,IBM的计算机深蓝利用经典AI算法历史性地战胜了国际象棋世界冠军加里•卡斯帕罗夫(Garry Kasparov),攻克了西方世界的“最后一城”。2006年,在首次中国象棋人机大战中,超级计算机“天梭”以5.5:4.5战胜了5位象棋大师。至此围棋成为人类剩下的“最后一座堡垒”,而这座堡垒又坚守了10年。研究界和AI业界几十年的尝试都没能突破,这让人们产生了一个共识:如果还限于经典AI算法的藩篱之中,那么即使配备再高的计算力也无法突破围棋这座堡垒。从这一点上来说,围棋是独一无二的。这也是本书选用围棋作为核心话题的原因。

直到2016年3月AlphaGo横空出世,战胜了围棋世界冠军李世石,围棋这座堡垒才终于宣告失守。虽然这也要归功于近年来硬件水平的不断提高和分布式计算的不断成熟,但最重要的是,如果没有AlphaGo革命性创新的深度学习算法,超越人类水准的围棋AI是不可能实现的。

那么AlphaGo到底做了怎样惊天动地的突破,才使得人工智能最终攀上围棋的巅峰呢?这也正是本书的核心内容——深度学习算法。AlphaGo在深度学习上做出了两次突破。第一次突破,即AlphaGo的第一个版本,是将几种传统机器学习算法与简单的深度学习算法的创造性的集成,产生了“一加一大于二”的效果。AlphaGo采用围棋职业高手的棋谱作为基础数据,以此训练神经网络(经典机器学习到这里就止步了),然后再进行强化学习,通过自我对弈来增强性能,最后在对弈的过程中,把前面的神经网络用在经典树搜索算法中指导下棋。这种监督学习与强化学习的有机结合,正是它产生突破的关键点。第二次突破,也就是AlphaGo Zero,对上一个版本做了巨量的减法,完全抛弃了人类棋谱数据,也完全抛弃了人类对围棋的理解(如劫争之类的围棋专属特征),从零开始,通过强化学习来自我进化,重新发现所有的围棋技巧。由于这个全新的架构更加简单,更加直接,在摆脱人类规则的影响后,它产生了自己独有的洞察力。并且由于引入了几项前沿的深度学习技术(如残差网络等),它的学习效率比上一个版本更高,最终达到了从未有过的棋力水平。此外,这套算法泛用性极强,很容易进一步扩展应用到其他的领域。实际上在翻译本书时,AlphaGo已经有了更加泛化的下一代版本AlphaZero,它很快就学会了3种不同的棋类:围棋、国际象棋和日本将棋。

人工智能,尤其是近年来大热的深度学习,总体来说是偏数学和理论的。几本经典书籍都是以数学推导为主,话题全面,公式量大,但阅读难度较高,并不是最适合作为入门教程。但要想写出浅显易懂的内容来,就必须抛弃很多数学推导,并更多地讨论实践的内容。本书就是一本非常好的实践性入门介绍。它采用Keras深度学习框架,用Python来实现代码,并选取了计算机围棋这个既激动人心又浅显易懂的课题。

如果要用一个词来总结本书的特色,我认为是“庖丁解牛”。本书虽然没有深入讨论太多理论细节,但基本上将AlphaGo背后所有的理论知识都覆盖了。对这样高深的课题进行如此全面的介绍,需要非常细致的层次划分,才能逐步深入,产生深入浅出的效果。

本书第一部分介绍基础知识,分别是机器学习概述、围棋基础介绍以及围棋软件的基础框架,这部分内容恰好能让我们在零基础的情况下开发出一个最基本的围棋机器人来。这是第一个层次。

第二部分对AlphaGo与AlphaGo Zero背后的技术做了划分,并且按照难易度巧妙地进行了合理的安排。树搜索、神经网络、数据预处理、代理开发即部署、强化学习这几个话题,层层深入,使我们在阅读的过程中渐渐对AlphaGo有了更清晰的认知。并且每一章我们都能开发出一个更强大的围棋机器人来,从而可以直接看到自己的进步。这部分最后三章分别介绍了一项强化学习的高级技巧,它们也是AlphaGo和AlphaGo Zero必不可少的组成部分。这是第二个层次。

第三部分把前面介绍的所有内容集成到一起,最终开发出我们自己的AlphaGo和AlphaGo Zero。这是第三个层次。

读完本书,我们不但会对围棋AI这个课题有广泛而深入的理解,而且能够掌握并自己实现最前沿的技术成果。我们不仅会有丰富的实践体验,也会对其背后的理论有初步的思考与把握。打好坚实的基础,再去阅读更深入的理论性著作,或者尝试开发AI在更多领域的应用,就变得更清晰而轻松了。因此我强烈推荐在阅读几本经典理论著作之前,快速阅读本书。

非常感谢人民邮电出版社杨海玲编辑,是她的邀请让我有机会翻译本书,也让我在这个过程中学到了许多知识。虽然我本科毕业设计做的是机器学习,但毕业之后成了典型的程序员,再也没有深入接触过这个领域了。这次翻译让我能够再次深入了解这个自己阔别已久的领域,也为我打开了通向新世界的一扇窗。经过这些年的发展,机器学习已经变得前所未有的强大,实在是令人豁然开朗、耳目一新。对我个人来说,本书是最佳的人工智能和深度学习入门书,希望读者也能有这种体验。

由于我的理论基础并不坚实,翻译与写作水平也有限,因此书中难免会出现翻译不当或表达不畅的情况,希望读者谅解并指正。


对我们AlphaGo团队的成员来说,AlphaGo的开发经历是我们一生中难得的奇遇。与那些伟大的探险相似,它也开始于脚下的一小步:用人类围棋高手的棋谱来训练一个简单的卷积神经网络。AlphaGo引领了近年来机器学习领域的几次标志性突破,并被爆出一系列令人难忘的大新闻,包括与樊麾、李世石、柯洁等围棋大师的对决。这一系列比赛为围棋带来了深远的影响,改变了围棋在全世界范围内的格局,而且也让更多人了解并喜欢上了人工智能这个领域,这些都令我们感到自豪。

但读者可能会问,为什么要关注游戏呢?答案是,儿童通过游戏来了解真实世界,与之类似,机器学习研究者也通过游戏来训练人工智能软件。沿着这个脉络,DeepMind公司的整体策略也是用游戏来模拟真实世界。而AlphaGo项目正是这个策略的一部分。这能帮助我们更好地研究人工智能,训练学习代理,以期望将来的某一天,我们能构建真正的通用学习系统,可以解决真实世界中最复杂的问题。

诺贝尔经济学奖获得者Daniel Kahnemann在他关于人类认知的《思考,快与慢》一书中描述了两种思维方式,而AlphaGo的工作方式正是类似于这两种思维方式。在AlphaGo中,慢的思考模式是通过一种名为蒙特卡洛树搜索(Monte Carlo Tree Search)的算法来实现的。对于某个棋盘布局,这个算法可以通过扩展一个游戏树来规划下一步动作。游戏树代表了未来所有可能的落子动作与回应动作。但由于围棋大约有10170(即1后面有170个0)种可能的棋盘布局,因此要搜索全部的可能动作序列,其实是不可能实现的。为了解决这个问题,需要缩减搜索空间,我们给蒙特卡洛树搜索配套了一个深度学习组件——训练两个神经网络,其中一个用来预测对弈双方的获胜概率,另一个用来预测最有希望获胜的落子动作。

AlphaGo的更新版AlphaZero,依照强化学习的原理,完全靠自我对弈来进行学习。这样就不再需要任何人工训练数据了。它从零开始学习下围棋(以及国际象棋、将棋等),在与自己对弈的学习过程中,它常常能独立发现(之后再抛弃)人类棋手几百年来积累下来的策略,也独立地创造了许多属于它自己的独特策略。

在本书的阅读过程中,两位作者Max Pumperla和Kevin Ferguson将引领读者踏上从AlphaGo到它的后期扩展的美好旅程。读完本书之后,读者不仅能够了解如何实现AlphaGo风格的围棋引擎,还能对现代人工智能算法最重要的几个组成部分——蒙特卡洛树搜索、深度学习和强化学习,有深入的理解与实践。作者精心地组织了这几个人工智能话题,并选取围棋作为实践案例,使之既富有趣味,又浅显易懂。除此之外,读者还能学会围棋(这个人类有史以来发明的最美丽、最具挑战性的棋类游戏之一)的基础知识。

另外,本书从一开始就构建了一个可以运行的、简单的围棋机器人,并随着本书内容对它进行逐步的强化:从完全随机地选择动作,逐渐进化成一个复杂的、有自我学习能力的围棋AI。作者对基础概念做了精彩的阐述,再加上可执行的Python代码,带着读者一步一步地前进。必要时,他们也会深入阐述数据格式、部署和云计算等细节话题,使读者可以把围棋机器人真正地运行起来,并享受弈棋的乐趣。

总而言之,本书可读性、趣味性都很高,是对现代人工智能和机器学习的引人入胜的介绍。它成功地把AlphaGo这个人工智能领域中最激动人心的里程碑之一,转化为一门优秀的入门课程。循着这条道路学习下去的读者,将能够掌握足够的基础知识,理解和构建现代AI系统,并可以在任何需要时结合“快速”模式匹配与“慢速”规划的问题应用这些知识。因为“快思考”与“慢思考”正是基本认知能力的基础。

Thore Graepel

DeepMind研究科学家,代表DeepMind的AlphaGo团队


2016年初,当AlphaGo第一次上新闻时,我们为计算机围棋的这个突破性进展感到无比激动。那时人们普遍认为,围棋的人工智能要达到人类级别,至少还得等10年。我们一场不漏地跟踪比赛进程,甚至熬夜观看赛事直播。当然,我们有许多伙伴——AlphaGo与樊麾、李世石和柯洁等围棋大师的对决,吸引了全球数以百万计的观众。

AlphaGo横空出世之后不久,我们就着手创建名为BetaGo的小型开源库,以验证我们是不是能够实现AlphaGo的一些核心运行机制。BetaGo项目的目标,是向感兴趣的开发人员展示AlphaGo背后的技术。当然,我们认识到自己没有足够的资源(时间、计算能力或智能)来与DeepMind那令人难以置信的成就去竞争,但构建属于自己的围棋机器人,本身就是一件很有趣的事情。

从那以后,我们有幸在许多场合讨论计算机围棋的话题。由于我们都是围棋爱好者,同时也是机器学习从业者,因此有时候很容易忘记公众并不像我们这样紧密跟踪新闻事件,他们从新闻事件中得到的信息是很少的。事实上,有点儿讽刺的是,虽然有数百万人观看比赛,但至少从我们的角度来看,观众大致分属于两个脱节的团体:

对外行来说,机器学习和围棋这两门技艺可能让他们感到高深莫测。虽然在过去几年中,有越来越多的软件开发人员开始学习机器学习,特别是深度学习,但是围棋在西方仍然极少人知晓。我们认为这种情况非常糟糕,所以真诚地希望这本书能够使上述两个团体更加紧密地联系在一起。

我们坚信,支撑AlphaGo系统的原理,可以通过更贴近实践的方式传授给广大软件开发人员。对围棋的享受和理解,来自大量的对弈和试验。这个道理对机器学习或其他任何学科是同样适用的。

如果读者在读完本书后,能体会到我们对围棋或者对机器学习的热情(希望两者都有!),那么本书的任务就完成了。如果在此之上,你还能学会如何构建和部署围棋机器人,并自己进行试验,那么更多有趣的人工智能应用也会向你打开大门。期待你享受本书的阅读过程!


本书由异步社区出品,社区(https://www.epubit.com/)为您提供相关资源和后续服务。

本书提供本书源代码。要获得以上配套资源,请在异步社区本书页面中点击,跳转到下载界面,按提示进行操作即可。注意:为保证购书读者的权益,该操作会给出相关提示,要求输入提取码进行验证。

作者和编辑尽最大努力来确保书中内容的准确性,但难免会存在疏漏。欢迎您将发现的问题反馈给我们,帮助我们提升图书的质量。

当您发现错误时,请登录异步社区,按书名搜索,进入本书页面,点击“提交勘误”,输入勘误信息,点击“提交”按钮即可。本书的作者和编辑会对您提交的勘误进行审核,确认并接受后,您将获赠异步社区的100积分。积分可用于在异步社区兑换优惠券、样书或奖品。

我们的联系邮箱是contact@epubit.com.cn。

如果您对本书有任何疑问或建议,请您发邮件给我们,并请在邮件标题中注明本书书名,以便我们更高效地做出反馈。

如果您有兴趣出版图书、录制教学视频,或者参与图书翻译、技术审校等工作,可以发邮件给我们;有意出版图书的作者也可以到异步社区在线投稿(直接访问www.epubit.com/selfpublish/ submission即可)。

如果您来自学校、培训机构或企业,想批量购买本书或异步社区出版的其他图书,也可以发邮件给我们。

如果您在网上发现有针对异步社区出品图书的各种形式的盗版行为,包括对图书全部或部分内容的非授权传播,请您将怀疑有侵权行为的链接通过邮件发给我们。您的这一举动是对作者权益的保护,也是我们持续为您提供有价值的内容的动力之源。

“异步社区”是人民邮电出版社旗下IT专业图书社区,致力于出版精品IT图书和相关学习产品,为作译者提供优质出版服务。异步社区创办于2015年8月,提供大量精品IT图书和电子书,以及高品质技术文章和视频课程。更多详情请访问异步社区官网https://www.epubit.com。

“异步图书”是由异步社区编辑团队策划出版的精品IT专业图书的品牌,依托于人民邮电出版社近40年的计算机图书出版积累和专业编辑团队,相关图书在封面上印有异步图书的LOGO。异步图书的出版领域包括软件开发、大数据、人工智能、测试、前端、网络技术等。

异步社区

微信服务号


我们要感谢Manning出版社的整个团队。有他们,这本书才得以出版。其中,要特别感谢两位兢兢业业的编辑:Marina Michaels,帮助我们完成了第一遍80%的工作;Jenny Stout,帮助我们完成了第二遍80%的工作。还要感谢我们的技术编辑Charles Feduke和技术审校Tanya Wilke,帮助我们梳理和整合了全部代码。

我们还要感谢所有审稿人,他们提供了非常有价值的反馈:Aleksandr Erofeev、Alessandro Puzielli、Alex Orlandi、Burk Hufnagel、Craig S. Connell、Daniel Berecz、Denis Kreis、Domingo Salazar、Helmut Hauschild、James A. Hood、Jasba Simpson、Jean Lazarou、Martin Møller Skarbiniks Pedersen、Mathias Polligkeit、Nat Luengnaruemitchai、Pierluigi Riti、Sam De Coster、Sean Lindsay、Tyler Kowallis和Ursin Stauss。

还要感谢所有为我们的 BetaGo 项目做过试验或贡献的朋友,特别是Elliot Gerchak和Christopher Malon。

最后,感谢所有曾经尝试教计算机下围棋并分享他们的研究的朋友。

我要感谢Carly的耐心和支持,感谢父亲和Gillian教会我写作。

特别感谢Kevin让本书出版变成现实,感谢Andreas与我进行了许多富有成效的讨论,感谢Anne对我的不断支持。


本书旨在通过一个实用而有趣的示例来介绍现代机器学习:构建一个能够进行对弈的围棋AI。读完前3章后,读者就可以开发出一个可运行的围棋AI程序,尽管它弱得可怜。之后,每一章都会介绍一种新方法来改进围棋 AI。读者可以通过反复试验来了解每一种方法的优劣与局限。在最后几章,前面所有的积累将会达到一个顶峰:将展示AlphaGo和AlphaGo Zero如何把前面介绍的所有技术集成于一体,造就强大到令人难以置信的AI。

本书适合于那些想要尝试机器学习算法,但相比数学内容来说,更喜欢实践内容的软件开发人员。本书假定读者已经掌握了Python的基础知识。当然,书中的算法也可以用其他现代语言来实现。本书不要求读者有任何围棋基础。如果你喜欢的是国际象棋或其他棋类游戏,也可以将本书介绍的方法与技巧应用到这些棋类游戏中。当然,如果你是围棋爱好者,那么观察自己开发的围棋机器人学会下棋的过程,将会非常开心!两位作者都深有同感。

本书分为3部分,共包括14章和5个附录。

第一部分介绍本书涉及的主要概念。

第二部分介绍创建一个强大的围棋AI所需的技术和理论基础。我们会着重介绍AlphaGo所采用的三大技术支柱:树搜索(第4章)、神经网络(第5章至第8章)、深度学习机器人和强化学习(第9章至第12章)。

第三部分是本书的最终部分,我们将把之前开发的所有部件整合起来,成为一个接近AlphaGo的应用。

在附录中,我们还将涵盖下面几个话题。

图0-1总结了各章对附录的依赖关系。

图0-1 各章对附录的依赖关系

本书包含了许多有单独编号的代码清单,以及内嵌于文本之中的行内代码。这些源代码都使用等宽字体,以区别于普通文本。在需要突出显示代码更改的时候(例如在已有代码基础上增添新功能时),我们会用粗体字来展示。

大多数情况下,我们都把源代码重新进行了格式化。我们添加了换行符,改写了缩进,以适配书本并不充裕的页面空间;在极少数情况下,我们会在代码中使用换行标记符(➥)。另外,如果正文中对某段代码做出了描述,那我们就会在代码清单中做对应的注释。代码清单中还添加了许多标注文本,以突出重要的概念。


马克斯•帕佩拉(Max Pumperla)就职于Skymind公司,是一名专职研究深度学习的数据科学家和工程师。他是深度学习平台Aetros的联合创始人。

凯文•费格森(Kevin Ferguson)在分布式系统和数据科学领域拥有18年的工作经验。他是Honor公司的数据科学家,曾就职于谷歌和Meebo等公司。

Max和Kevin是BetaGo的共同创造者。BetaGo是用Python开发的极少数开源围棋机器人之一。


机器学习是什么?围棋是什么?为什么围棋是游戏AI中如此重要的一个里程碑?教计算机下围棋,与教计算机下国际象棋或跳棋有什么不同?

在本书的第一部分中,我们将会回答上述所有问题。而且,我们将会构建一个灵活的围棋游戏逻辑库,为本书后面的章节内容打下良好的基础。


本章主要内容

自计算机出现以来,许多开发人员就一直热衷于研究人工智能(Artificial Intelligence,AI):在计算机上实现类似于人的行为。游戏一直是人工智能研究界的热门话题。在PC时代,AI已经在西洋跳棋、西洋双陆棋、国际象棋等绝大多数经典棋类游戏中超越了人类。但是几十年以来,围棋这个古老的策略游戏,仍然顽强地屹立于计算机之上。直到2016年,Google DeepMind的AlphaGo AI向14届世界冠军李世石发起挑战,并获得了五战四胜的成绩。其后,AlphaGo的改进版则完全超越了人类棋手的极限:它连续赢得了60场比赛,并在这个过程中战胜了几乎所有著名的围棋棋手。

AlphaGo所做出的创造性突破,是利用机器学习来增强经典AI算法。具体地说,AlphaGo使用了被称为深度学习(deep learning)的现代技术,它是一种可以把原始数据组织成多个有意义的抽象层次的算法。不仅如此,这个技术完全超越了棋类游戏的范畴:在图像识别、语音理解、自然语言翻译和机器人的控制程序中,都可以找到深度学习的应用。掌握了深度学习的基础知识,就有了理解这些应用的基础。

那么,为什么我们要写一整本书来介绍计算机围棋呢?读者可能会猜测,我们是不是铁杆围棋爱好者?——好吧,我们承认的确如此。但其实我们不研究国际象棋或双陆棋而研究围棋的真正原因是,与它们相比,强大的围棋AI离不开深度学习。Stockfish之类的顶级国际象棋引擎包含了大量的国际象棋专用逻辑,而要写出类似的东西,就需要足够的国际象棋知识。但有了深度学习,即使我们不懂围棋技巧,也能够教会计算机模仿围棋高手。这正是深度学习强大的地方,让人们能够开拓出各种各样的技术应用,无论是在棋类游戏中,还是在真实世界中。

国际象棋和西洋跳棋的AI所采取的设计策略,是想办法让AI比人类棋手想得更远、猜得更准。但如果围棋AI也这么做,则会遇到两个问题:首先,在围棋中,由于需要考虑的落子动作的可能性实在太多,没办法预测很远;其次,即使能够提前预测,也无法评价落子动作的优劣。而实践证明,深度学习是解决这两个问题的关键。

本书的主题是通过介绍AlphaGo背后的技术来引出深度学习的实践性介绍。要学习这些技术,读者并不需要对围棋有深入的研究,只需要了解机器能够学会的通用规则即可。本章介绍机器学习和它能够(以及不能)解决的问题类型。我们将通过几个示例来阐述机器学习的主要分支领域。我们将看到深度学习如何把机器学习带入新的领域。

我们先考虑一个任务:从照片中识别出某位友人。对大多数人来说,就算照片光线不足,或是友人刚理过发,或是换了新衣服,要认出他来也是轻而易举的事。但若是要在计算机上编程来解决这个问题,应当如何开始呢?恐怕谁都会毫无头绪吧。而这类问题正是机器学习所能够解决的。

传统上来讲,计算机编程指在结构化的数据上执行明确的程序规则。软件开发人员动手编写程序,告诉计算机如何对数据执行一组指令,并输出预期的结果,如图1-1所示。这个过程与税务申报有些类似:税单中的每个框都有明确的定义,并且有详尽的规则指明如何进行计算。在有的地方,这种计算规则可能相当复杂。人们在填写税单时非常容易犯错,而这正是计算机程序最擅长的任务。

图1-1 软件开发人员所熟悉的标准编程范式。开发人员构思算法并实现代码;用户提供数据

与传统的编程范式不同,机器学习不用直接实现算法,而是从样本数据推断出程序或算法。因此,在应用机器学习技术时,我们仍然向计算机提供数据,但不再提供指令,也不再等待预期的输出,而是向它提供我们所希望的输出,让机器自己找到对应的算法

要构建一个计算机程序来识别照片中的友人,可以先获取许多他的照片,然后用一套算法来分析这个照片集合,并生成一个能够匹配照片的函数。如果这一步做得足够好,生成的函数甚至可以用来检验没见过的新照片。当然,程序其实并不知道它的目标是什么,它唯一要做的是判断新图片与提供给它的原始图片是否相似。

在这个场景中,提供给机器用来训练的图片被称为训练数据(training data),而图片中人物的名称则被称为标签(label)。在为一个目标训练(train)出算法之后,可以用这个算法来预测(predict)新数据上的标签,以进行测试。图1-2展示了一个示例,并描述了机器学习范式。

图1-2 机器学习范式:在开发过程中,从数据集生成一个算法,然后将它集成到最终的应用中

机器学习适用于规则模糊的场景。它擅长解决类似于“等我看到了才知道它是什么”的问题。我们不用直接编写函数,而是提供数据来指导函数应该做什么,然后科学地生成与数据相匹配的函数。

在实践中,通常需要把机器学习和传统编程结合起来,才能构建出真正有用的应用。例如,对于前面提到的人脸识别应用,我们必须告诉计算机如何查找、加载和转换示例图像,然后才能对图像数据应用机器学习算法。除此之外,还可能需要手写一些规则,例如如何区分头部特写、日落和咖啡拉花。把传统编程技术和先进的机器学习算法结合起来,往往会比只用其中一个要好得多。

从广义上讲,AI是指任何让计算机模仿人类行为的技术。AI技术包括很多不同的范畴,例如以下几种:

这几个技术都是基于规则的,有时我们称它们经典AI老式AI(Good Old-Fashioned AI,GOFAI)。

机器学习只是人工智能领域的众多分支领域之一,但如今它可以说是最成功的一个。尤其是深度学习,作为机器学习的一个子领域,它成功地引领了近年来AI世界激动人心的几次突破,甚至解决了困扰研究界数十年的问题。在经典AI中,研究者分析人类行为,尝试找到相应的规则,并编写成代码。而机器学习和深度学习解决问题的方式则完全相反:在机器学习里,我们先收集人类行为的样例,再用数学与统计学技术从数据中抽取规则。

深度学习的应用简直无处不在,以至于研究界常常混用AI深度学习这两个词语。在本书中,为了避免混淆,我们用AI这个词来表示用计算机模仿人类行为的一般问题,用机器学习或深度学习来特指从样例中抽取算法的数学技术。

机器学习是一种专门的技术。它不能用来更新数据库记录,也不能用来呈现用户界面。在下面几种情形中,应当优先选择传统编程来解决问题。

实际上,有些问题用传统编程能够解决,但如果对问题稍作变化,就可能连机器学习也难以解决了。这两类问题的区别往往非常细微。例如,前面讨论的图像中人脸识别的问题与给人脸标记名称的问题。又如,检测文本所使用的语言并不难解决,但如果想将文本翻译成其他指定的语言,其难度就会有天壤之别。

当问题的复杂度非常高时,人们往往还是倾向于使用传统编程解决,即使机器学习可能更有用。在面对信息密集、错综复杂的场景时,例如在宏观经济学、股票市场预测和政治领域中,人们通常倾向于寻求经验法则和规则表述。但实际上机器学习的发现往往能够提供灵感,从而大大帮助这些流程管理人员或专家们的直觉判断。真实世界的数据往往比预想中更有结构。在很多领域里,我们才刚刚开始感受到自动化与增强机器学习发展所带来的好处。

机器学习的目标是构建一个很难直接实现的函数。要做到这一点,首先需要选择一个模型(model),即一族通用函数,然后需要按照一个流程从这一族函数中选取与目标相匹配的函数,这个流程被称为模型训练(training the model)或模型拟合(fitting the model)。下面是一个简单的示例。

假设我们收集了一些人的身高和体重数据,并绘制在图上。图1-3展示了从职业足球队员名单中提取的一系列数据点。

图1-3 一个简单的示例数据集。图上的每个点代表一名足球运动员的
身高与体重。我们的目标是用这些数据点拟合出一个模型

假设我们想用一个数学函数来描述这些数据点。首先,注意这些数据点大致可以形成一条向图的右上方延伸的直线。在代数中我们学过,形如f(x) = ax + b的函数可以描述一条直线。或许我们可以找到一组合适的ab值,使得ax + b能很好地匹配这些数据点。这里ab的值,就是我们需要搞清楚的模型参数(parameter),或者说权重(weight),而这个函数族就是我们的模型。我们可以编写一段Python代码来生成函数族中的任意一个函数:

class GenericLinearFunction:
    def __init__(self, a, b):
        self.a = a
        self.b = b

    def evaluate(self, x):
        return self.a * x + self.b

那么如何找到正确的a值和b值呢?我们可以使用严格的算法来找到它们,但也可以先在图上用尺子简单地画一条通过图形的直线,然后计算它的公式。图1-4展示了一条直线,这条直线大致遵循这些数据点的趋势。

图1-4 首先注意数据集大致遵循的一个线性趋势,接着找到拟合这些数据的一条直线的公式

只要挑选直线经过的几个点,就可以计算得到直线的公式,并得到类似于f(x) = 4.2x − 137的结果。至此,我们就有一个与数据相匹配的具体函数了。如果这时候我们再测量一个新球员的身高数据,就可以用得到的函数来估计他的体重。这种估计并不完全准确,但应当足够接近真实值,因此是具有实用价值的。下面的代码将GenericLinearFunction转换为一个特定的函数:

height_to_weight = GenericLinearFunction(a=4.2, b=-137)
height_of_new_person = 73
estimated_weight = height_to_weight.evaluate(height_of_new_person)

只要新得到的数据同样采集自职业足球运动员,就可以得到相当准确的估计。因为这个数据集包含的都是成年男性,年龄范围也相当狭窄,并且每天都练习同一项运动。但如果用这个函数去预测女子足球运动员、奥运举重运动员或者婴儿,就会得到很不准确的结果。生成的函数受限于训练数据。

以上就是机器学习的基本流程。在上面的例子中,训练模型即是所有形如f(x) = ax + b的函数族。实际上,即便这么简单的模型也是非常有用的,并且统计学家们一直在使用它们。如果需要处理更复杂的问题,就必须采用更复杂的模型以及更先进的训练技术了。但核心思想还是一样的:先描述一族可能的函数,再找到函数族中最适合的那个。

 

Python和机器学习

本书中的所有代码示例都是用Python编写的。为什么选择Python呢?首先,Python是一种通用的程序开发语言,有很强的表达力。此外,在机器学习和数学编程领域,Python本就是最流行的语言之一。这两个优势结合起来,使得Python成为机器学习应用的一个自然选择。

还有一个原因让Python在机器学习领域广受欢迎:它有一大堆强大的数值计算包。本书使用了以下几个包。

本书代码示例所用的库版本分别是Keras 2.2和TensorFlow 1.8。理论上,只要进行少许修改,这些代码就能在Keras 2.x系列的任何版本中运行。

 

在1.2节中,我们讨论了一个纯粹的数学模型。那么如何将机器学习应用于真实的软件应用中呢?

假设有一个照片共享应用,用户已经上传了数百万张附带标签的照片。这时我们想要添加一个新功能:为新照片推荐相关标签。这个功能非常适合使用机器学习。

首先我们需要确定想要学习的函数。假设函数是下面这样的:

def suggest_tags(image_data):
    """Recommend tags for an image.

    Input: image_data is a photo in bitmap format

    Returns: a ranked list of suggested tags
    """

有了这个函数,其他的功能就相对容易实现了。但如何着手实现suggest_tags这个函数本身呢?很难找到头绪。而这正是机器学习能够发挥作用的地方。

如果这是一个普通的Python函数,它的输入应当是某种Image对象,它返回的应当是一个字符串列表。但机器学习算法的输入和输出就没那么灵活了:机器学习通常只能处理向量和矩阵。因此,工作的第一步是用数学的形式来表示这个函数的输入和输出。

如果将输入的照片尺寸转换为固定尺寸(如128像素×128像素),我们就可以把它编码成128行、128列的矩阵了,这时照片的每个像素对应一个浮点数值。那么对于输出该如何处理呢?一种办法是限定识别的标签集合,例如,可以只选择应用里最流行的1000个标签。这样函数的输出就可以设为大小为1000的向量了,而它的每个元素对应一个标签。如果把标签输出值设置为0~1的变化数值,那么函数就可按照这个建议值的顺序生成有序的标签列表了。图1-5展示了这个应用中每个概念与数学结构之间的映射。

图1-5 机器学习算法只能操作向量或矩阵之类的数学结构,而在这个照片应用里,用来存储标签的字符串列表是一种标准的计算机数据结构。本图展示将标签列表编码成数学向量的一种可能方案

我们在上面所做的数据预处理,是所有机器学习系统都不可或缺的一个步骤。在机器学习中,我们通常会加载原始格式的数据,然后执行预处理步骤,创建一系列特征(feature),并作为输入数据发送给机器学习算法。

接下来,我们需要一个用来训练模型的算法。在前面的示例中,我们已经拥有数以百万的正确样本,即用户在应用中上传并手动标记过的所有照片。我们可以训练一个函数来尽可能地拟合这些样本数据,并希望这个函数能够聪明地处理新照片。我们把这种技术称为监督学习(supervised learning)。这么命名的原因是我们利用了人工整理的标签数据来监督指导训练过程。

训练完成之后,会得到一个函数,然后集成到应用中发布。每当用户上传新照片时,照片数据会传递给训练好的模型函数,并获得一个结果向量。接着我们就可以把结果向量中的每个值映射回它所代表的标签,然后选择数值最大的标签显示给用户。整个流程如图1-6所示。

图1-6 基于监督学习的机器学习流程

那么如何测试训练得到的模型呢?标准的做法是将原始标签数据提前预留出一部分用于测试。在训练开始之前,我们可以将数据中的一小部分(如10%)留作验证集(validation set)。验证集中的数据不能以任何形式参与训练过程。训练完成后,用得到的模型来处理验证集中的图像,并把模型建议的标签与已知的正确标签进行比较。这样就可以计算出训练模型的准确率(accuracy)了。如果想尝试不同的模型,可以把这个准确率作为一致标准,来衡量哪个模型更好。

在游戏AI中,我们可以从人类游戏的记录中提取带标签的训练数据。在线游戏对机器学习来说是一个巨大的促进:当人们在线玩游戏时,游戏服务器都可以保存一份计算机可识别的记录。我们举几个在游戏中使用监督学习的例子:

机器学习还有另一个子领域,称为无监督学习(unsupervised learning)。与监督学习不同,它不用任何标签来指导学习过程。在无监督学习中,算法必须想办法自己从输入数据中识别出模式。无监督学习的学习流程与图1-6所示的监督学习流程的唯一区别就在于它缺少标签,因此它无法像监督学习那样评估模型的预测结果。

异常值检测(outlier detection)问题,即识别不符合数据集总体趋势的数据点的问题,是无监督学习的一个典型案例。在足球运动员数据集中,异常值指的是与队员典型体格不相符的数据。例如,假设有一个身高×宽度的数据点,并且我们已经为模型拟合出一条平均直线,那就可以想出一个算法来计算这个数据点与平均直线之间的距离。如果距离超过了某个阈值,就可以把这个数据点看作异常值了。

在棋盘游戏AI中,一个很自然的问题是如何检查棋子间的相互关联,即检查哪些棋子形成一个组合。我们将在第3章中更详细地解释它对于围棋的意义。这种搜寻关联个体所形成的组合的问题被称为聚类(clustering)或组块(chunking)。图1-7展示了一个国际象棋的例子。

图1-7 用于查找棋子的聚类或组块的无监督学习流程

监督学习很强大,但如何找到高质量的训练数据可能会是一个主要问题。假设我们想要设计一个扫地机器人。它有很多传感器,用于检测是否靠近障碍物;它还有电动引擎,可以在地板上飞奔或转向。它需要一个控制系统,负责分析传感器的输入并决定应该如何移动。但这个问题无法用监督学习来解决,因为我们无法得到可以用作训练数据的样本——扫地机器人还没制造出来。

对此,我们可以用强化学习(reinforcement learning)来解决。强化学习是一种反复试错的方法。我们先从一个效率很低、精度不够高的基本控制系统开始,让机器人不断地尝试完成它的任务。在任务执行期间,我们把控制系统遇到的所有输入以及它所做的所有决策都记录下来。任务完成之后,用某种方法来评估控制系统的表现,例如,可以计算它实际覆盖到地板面积的比例,或计算它的耗电程度。这个过程能够提供一小批训练数据,我们用它们来改进控制系统。接着再反复不断地执行这个过程,我们就可以逐步得到更加高效的控制系统了。图1-8展示了训练过程的流程图。

图1-8 在强化学习中,机器人通过反复试错来学习如何与环境进行交互。它通过反复尝试完成任务来获得可供学习的监督信号数据。每经过一个训练周期,都能够得到一点增量改进

本书的内容由很多句子组成,这些句子由单词组成,这些单词又由单字组成,单字[1]则由线条和曲线组成,而这些线条和曲线由微小的墨点组成。在教孩子学习阅读的时候,我们往往从最小的部分开始,然后逐渐提高难度:首先是字,然后是词,再接着是句子,最后才是完整的书。(至于线条和曲线,孩子们往往能自己学会识别。)这种分层的结构是人类学习复杂概念的一种自然方式。每上升一层,我们都会丢掉一些细节,让概念变得更加抽象。

深度学习把这些原理应用到了机器学习之中。深度学习是机器学习的一个子领域,它采用了一个特定的模型:一族通过某种方式连接起来的简单函数。由于这类模型的结构是受到人类大脑结构的启发而创造出来的,因此我们通常把它们称为神经网络(neural networks)。神经网络中的函数链条能够将复杂的概念分解为多个层次的更简单的概念,这就是深度学习的核心思想。例如,深度学习模型的第一层,可以用来学习如何获取原始数据,并用基本的方式来组织它(如将多个点组合成直线)。后面每一层都将前面一层组织成更高级、更抽象的概念。我们把学习这种抽象概念的过程称作表征学习(representation learning)。

深度学习的神奇之处在于,我们并不需要事先了解中间层的概念具体是什么。如果选择的模型层次足够多(即深度足够深),并提供足够数量的训练数据,它就能在训练过程中逐步将原始数据组织为越来越高级的概念。那么训练算法怎么知道应当使用哪些概念呢?它并不需要知道。它只需要找到能够更好地匹配训练样本的数据组织方式就可以了。至于生成的表征是不是能够符合人们对数据的印象,那就无法保证了。图1-9展示了如何将表征学习融入深度学习的流程中。

图1-9 深度学习和表征学习

深度学习的这种强大能力是有代价的:深度学习模型需要学习的权重数量非常巨大。回顾一下前面处理身高-体重数据集的简单模型ax + b,这个模型只有两个权重需要学习。而用于处理图像标签应用的深度学习模型,则可能有上百万个权重。因此,深度学习需要更大的数据集、更强的计算能力以及更多的训练实践。深度学习与传统机器学习各有其适用的情形。在下列几种情形中,深度学习是一个不错的选择。

而在以下的情形中,应当选择参数较少的传统模型。

由于深度学习指的是模型类型,因此前面讲到的几个不同的机器学习分支,都可以应用它。例如,在监督学习中,根据拥有的训练数据的不同,我们可以在简单模型或深度学习模型之间做出选择。

本书是对深度学习和强化学习的实践性介绍。要充分掌握本书,读者应当熟练阅读与编写Python代码,并熟悉基本的线性代数和微积分知识。在本书中,我们将会讨论以下几个问题。

在纵览全书的过程中,我们会跟随一个具体而有趣的实例:构建围棋AI。我们的围棋机器人是深度学习与标准的计算机算法相结合的产物。我们将使用简单明了的Python代码,来执行棋盘规则,跟踪游戏状态,并预先推测可能发生的棋局状态。而深度学习将帮助机器人识别哪些动作值得深入探讨,并在盘中阶段的每一回合帮助它评估哪一方领先。在学习本书的各个阶段,每次采用了更复杂的技术后,读者都可以与改进的机器人对弈,并观察它的进步。

如果读者对围棋特别感兴趣,可以把本书构建的机器人当作起点去尝试自己的更多想法。读者还可以把这套技术应用到其他棋类游戏中,甚至应用到游戏之外的领域,为各种应用增添深度学习带来的强大力量。

[1] 原著中的单字指的是英文字母。——译者注


相关图书

ChatGPT原理与应用开发
ChatGPT原理与应用开发
深度学习的数学——使用Python语言
深度学习的数学——使用Python语言
深度学习:从基础到实践(上、下册)
深度学习:从基础到实践(上、下册)
动手学深度学习(PyTorch版)
动手学深度学习(PyTorch版)
深度学习与医学图像处理
深度学习与医学图像处理
深度强化学习实战:用OpenAI Gym构建智能体
深度强化学习实战:用OpenAI Gym构建智能体

相关文章

相关课程