1974年,为了给在瑞典斯德哥尔摩召开的“国际信息联合会大会”(IFIP)找点乐子,举行了第一届世界计算机象棋锦标赛。
舍佛的兴趣遂转向德州扑克和围棋。
巴贝奇
拿破仑执白棋先手,但最后“土耳其人”大胜,拿破仑恼羞成怒,把棋盘上的棋子全胡撸到地上。
最后汤普森等破费了600美元罚款,才赎回 Belle,但比赛耽误了。
第一次锦标赛,除了美国和加拿大的几位高手外,还邀请了欧洲的几个团队,当然要包括苏联神秘的 KAISSA。
他最杰出的成绩是发明了 UNIX 操作系统和 C 语言,1999年被克林顿授予美国“国家技术奖章”。
许峰雄的室友很快把他拉到 HiTech 项目帮忙设计一个硬件的评估函数,但许峰雄却和柏林纳关系不睦。
倒是围棋确实更具挑战性,但围棋在西方没什么受众,自然没什么聪明人愿意花时间。
“土耳其人”是个骗子?
但即使后来拿到机时,那机器和程序的水平也很有限。
KAISSA(象棋女神)
当时麻省理工学院的程序员格林布拉特也在改进 Kotok 的程序,他在 PDP-6 上实现了程序 MacHack VI。
舍佛团队继续精研跳棋理论和实践,直到2007年,他们证明对于跳棋,只要对弈双方不犯错,最终都是和棋,而 Chinook 已经可以不犯错。
围棋的棋子多,组合可能性也多,画出博弈树的所有可能枝叶后,在上面跑 α-β 不太经济。
香农的论文引用了冯诺伊曼的《博弈论》和维纳的《控制论》。
司马贺在1957年预言十年内计算机下棋程序可以击败人类,明显未果,于是他在1965年再度预言这个目标在 20 年内可以实现。
这个程序用了 16KB 内存,后来 PDP 的厂家 DEC 把它预装到所有 PDP 系列的机器中。
图灵在曼彻斯特大学的同事普林茨接着图灵的思路,在1951年写了一个残局程序,能在离将死还有两步的情况下,找到最优解。这个问题也被称为“两步将死”(mate-in-two)问题。
陆续和“土耳其人”接触过的名人还有富兰克林、爱伦坡和数学家巴贝奇。
IBM 的外号叫 Big Blue,于是新的项目1996年被命名为“深蓝”(Deep Blue)。
许峰雄在计算机系也变成众矢之的,每次都是靠导师孔祥重的帮忙化险为夷。
香农在1950年的《哲学杂志》发表“计算机下棋程序”(Programming a Computer for Playing Chess)一文,开启了计算机下棋的理论研究,其中主要思路在“深蓝”和 AlphaGo 中还能看到。
原始的 Minimax 算法是在博弈树被全部画出后再静态地计算评估函数,而 α-β 剪枝术则采取边画树边计算评估函数的动态方法。
于是聪明人想到了蒙特卡洛方法。
现在两台个人电脑下棋,人已经看不懂它们在下什么。尽管如此,“深蓝”队员,同样毕业于卡内基梅隆大学的坎普尔仍然不认为机器有智能。
Belle 是第一个取得“大师”称号的计算机棋手。
当评估函数的值超越给定的上界和下界时,树的搜索过程就停止,这样大大减少了树的规模。
1950年香农去英国参加信息论会议时到曼彻斯特大学图灵的办公室回访,他们这次只聊了下棋和大脑。
MacHack 也是 Internet 前身 ARPANET 上最早的网络游戏。
而此时 IBM 意识到“深思”的商业价值,于是劝说整个团队在毕业后加入 IBM,开发下棋机,把对手锁定为当时的世界冠军俄罗斯特级大师卡斯帕罗夫。
AlphaGo Master 版本战胜了世界顶尖的围棋选手,而升级版的 AlphaGo Zero 经过40天的自我训练,打败了 AlphaGo Master。
1967年 MacHack 参加象棋锦标赛,并累计积分1400 ,这相当于不错的高中生水平。
1996年 ACM 年会的闭幕节目是“深蓝”对决卡斯帕罗夫,六局棋。“深蓝”旗开得胜,第一局就赢了老卡,最后还是老卡 4:2 赢得决赛。
跳棋插曲
卡斯帕罗夫对机器下棋非常熟悉,他在屡次和机器对决后曾说:机器下棋没有洞见(insight)。
max 和 min 的对弈就形成了博弈树。树的增长是指数式的,当树很深时,树的规模会变得不可控。
蒙特卡洛方法最常用的例子就是计算圆的面积: 在一个正方形里贴边画一个圆,然后随机向这个正方形里扔沙粒,扔到足够多时,开始数有多少沙粒落在圆里,结果除以所扔沙粒总数再乘以正方形面积,就是圆的面积。
“深蓝”胜利之后,聪明人认为计算机下棋这事已经到头了,没人愿意费力不讨好,IBM 也解散了“深蓝”团队。
1966年,美苏的对抗也扩展到计算机下棋。苏联科学院的理论与实验物理研究所(ITEP)也在本所研制的一台 M20 计算机上开发了一款下棋程序,他们要和斯坦福大学的 Kotok-McCarthy 程序一决高下。
在资金有限的情况下,许峰雄和几个研究生利用业余时间快速开发出了 ChipTest,而 ChipTest 立即变成了 HiTech 的竞争对手,并受到柏林纳的打压。
二战没结束时,图灵就研究计算机下棋,他1947年编了第一个下棋程序。
平均而言,在同样资源限制下,α-β 剪枝术要比原始 Minimax 算法搜索的树深度多一倍,也就是说,可以比 Minimax 向前看的步数多一倍。
达特茅斯会议的组织者之一麦卡锡首先提出 α-β 剪枝术以控制树的增长。纽厄尔、司马贺和肖,在他们著名的定理证明程序之后,又做了下棋程序。
ChipTest 的改进版“深思”(Deep Thought)1989年赢得弗雷德金二等奖:成为第一个国际象棋特级大师的机器棋手。随后 HiTech 也加入这个行列。
20世纪80年代中期,卡内基梅隆大学的柏林纳开始用专用硬件来实现下棋机,他的成果 HiTech 马上成为最强的机器棋手。
KAISSA 击败了在 ACM 年会拿了四次冠军的 CHESS,赢得头筹,报了两年前斯帕斯基输给菲舍尔的一箭之仇。
图灵在1952年曾与之对弈一局,轻松取胜。
以当时的水平,想造台会下棋的机器,门儿都没有。
最后苏联3:1战胜美国。
谷歌的 AlphaGo 首次引用了强化学习,使得机器和自己对弈学习。
和牛顿、霍金一样,巴贝奇还做过一届剑桥大学的卢卡斯教授,他对所有机器装置都感兴趣,他在看到“土耳其人”时,正在研制第一台“分析机”。他认为他的“分析机”也可以下棋,但那至多是猜测。
他们的结果发表在2007年9月的《科学》杂志上,自此跳棋这一页就算翻过去了。
1838年马泽尔和施伦伯杰相继去世,随后“土耳其人”也退役,被费城的中国博物馆收藏。
但1972年斯帕斯基却又输给美国怪人菲舍尔,这是美国第一次在国际象棋领域战胜苏联。
进入20世纪80年代,又出了新一茬象棋程序。当时最厉害的两个电脑棋手,一个是跑在超级计算机克雷上的 Blitz,另一个则是贝尔实验室的专用机器 Belle。
大师的预言:CHESS
1971年,当年击败 Kotok-McCarthy 的苏联小组改进了他们的程序,新程序名叫 KAISSA。
KAISSA 和传奇大师斯帕斯基赛了两局,一负一和,这个战绩惊动了棋界。
图灵没有参加这次在伦敦的会议,但贡献了两篇短文,一篇讲机器学习,另一篇讲下棋。
控制树的增长
Battle: Blitz vs Belle
Deep Blue
在“深蓝”赢了卡斯帕罗夫之后,职业棋手并没有因此而改行,他们反而更多地依赖计算机来训练。机器作为教练,反而更快地帮助人类棋手进步。
可惜那时计算机的时间(简称“机时”)很宝贵,轮不到他上机——地主家没余粮,即便是图灵也不能保证机时。
20世纪80年代末,最强的跳棋程序一直就是加拿大阿尔伯塔大学的 Chinook,作者是现任阿尔伯塔大学理学院院长的计算机系教授舍佛。
CHESS 在20世纪70年代末80年代初一直是计算机下棋的冠军。此时尚看不到计算机短期内可以赢人的可能性。
当时给格林布拉特帮忙的志愿者中有个人叫克柔可,他后来成为 Internet 前身 ARPANET 的重要人物,并创办了互联网标准化组织 IETF 且写了第一个标准化文本 RFC。
从1966年11月22日开始,直到1967年3月10日止,他们通过电报的方式走了四局。
1959年,麻省理工学院的几位本科生在当时刚到校任教的麦卡锡指导下开始学习计算机下棋,他们用 Fortran 实现了一款实战下棋程序,BT页游sf,此时已经可以击败一般的象棋初学者了。
20世纪80年代,机器之间的比赛此起彼伏,但机器和人之间仍然有着不可逾越的鸿沟。
这个结果变成了其中一位学生 Kotok 的本科学位论文。
最终,机器战胜了人类。
但他在计算机下棋上的贡献多少被略视了。在1982年的北美计算机象棋锦标赛上,Belle 击败了 Blitz。
香农把棋盘定义为二维数组,每个棋子都有一个对应的子程序计算棋子所有可能的走法,最后有个评估函数(evaluation function)。
这其实是整个“深蓝”团队的意见,他们都不是人工智能出身,反而和同系的人工智能教授结下梁子。
1982年在去苏联比赛的路上,Belle 被美国政府在肯尼迪机场海关没收,理由是企图向苏联输送先进武器。
Minimax 算法中,二人对弈的一方为 max,另一方为 min,max 一方的评估函数要越高越好,min 一方的则越低越好。
此时老卡对“深蓝”刮目相看,他说机器对手不光有洞见,而且有几步简直像“上帝下的”。
Go vs AlphaGo
第一个可以走完全局的下棋程序是 IBM 的工程师伯恩斯坦1958年在一台 IBM 704上做的。机器每步要花8分钟想,随便会走几步棋的人就能击败这个程序。
此后 Chinook 孤独求败。
巴托老兵不死,在做了一届计算机系主任后,几年前从麻省大学退休了。退休前,他终于看到强化学习渐成显学,他和萨顿合著的《强化学习》也马上要出第二版了。
丁斯利的公开纪录,除了输给 Chinook 几局棋外,从没有输给过任何人类棋手。
1951年,图灵的另一个朋友斯特拉切在曼彻斯特 Mark-1 上写了第一款跳棋程序。
他和经济学家摩根斯顿合作的《博弈论》1944年出版,其中首先提出两人对弈的 Minimax 算法。
1970年开始,美国计算机学会(ACM)的年会都在晚餐时举行计算机象棋比赛,CHESS 连着四年都是冠军。
第二年“深蓝”和老卡再战,老卡号称要捍卫人类的智力尊严。他赢了第一局,但随后则越来越保守,彻底输给“深蓝”。
几乎和图灵同时,冯诺伊曼也在研究计算机下棋。
第二届时,纽厄尔的学生柏林纳参加了,取得第二名,这鼓舞了纽厄尔,他决定把柏林纳留校,专职在卡内基梅隆大学研究计算机做计算机象棋。
1992年丁斯利大战 Chinook 并取胜,1994年再战,但在比赛期间不幸确诊患了胰腺癌,不久病逝。
有好事者把拿破仑和“土耳其人”的对战棋谱记录在案,确实艺不如“机”。
相对于计算机在国际象棋中的胜利,中国象棋的进展一直落后。一些外行认为中国象棋要比国际象棋难,其实非也。
数学家丁斯利自20世纪50年代起就一直是跳棋的人类冠军。丁斯利对跳棋理论研究很深,对舍佛团队也很支持。
强化学习从20世纪80年代就被发明,但一直不被重视,是 AlphaGo 使得它发出亮光。
1827年,“土耳其人”到美国巡演时的一次表演中,两个孩子看见当时的顶级棋手施伦伯杰频繁出入后台,跟随后才发现施伦伯杰藏匿在“土耳其人”之中,他们把这个秘密透露给报界。
萨顿还值壮年,AlphaGo 团队里就有4个萨顿的学生,其中包括首席科学家席尔瓦。
1962年麦卡锡前往斯坦福大学任教,他进行了持续改进,这个程序后来被称为 Kotok-McCarthy 程序。
1978年最厉害的计算机程序 CHESS 和列维比了一盘,自然是列维赢,麦卡锡为此输了500英镑。
这时来自中国台湾的许峰雄到卡内基梅隆大学计算机系跟随孔祥重读计算机体系结构方向的博士。
1997年5月11日,老卡认输,“深蓝”成了第一位战胜当时世界冠军的机器。事后,卡斯帕罗夫回忆:第二局是关键,机器表现超出他的想象,它经常放弃短期利益,表现出非常拟人的危险。
见过这台机器的高人(数学家巴贝奇)一开始就猜这是魔术而不是科技。但当时还是有很多人愿意相信“土耳其人”真会下棋。
“深蓝”获胜后,美国人工智能学会(AAAI)曾经组织过一个研讨会,对人工智能启发式搜索做出过杰出贡献的加州大学洛杉矶分校教授科夫曾不满“深蓝”团队的立场。
思路和求圆的面积类似,随机模拟对弈双方走棋。当走棋的次数很多时,就可算出下棋点的概率,然后挑概率最大的地方落子。
从来就没有过这么多年轻棋手在年龄很小时就积分这么高,这都得益于计算机教练,因为过去的孩子从来就没有机会能和特级高手比赛。
计算机 · 下棋之初
传统的棋局都把下棋过程分为三个阶段:开局、中局和残局,不同阶段需要不同的技术手段。
1968年国际象棋大师列维和麦卡锡打赌十年内机器不可能赢列维。
1956年 IBM 的塞缪尔(达特茅斯会议的参加者之一)写了第二个跳棋程序,这款程序的特点是自学习,这也是最早的机器学习程序之一,后来不断改进,曾经赢过盲人跳棋大师。
Belle 的发明人之一汤普森那可是了不起的人物,在计算机界无人不晓。