程序算法艺术与实践关于 AlphaGo 论文的阅读笔记

这是Deepmind 公司在2016年1月28日Nature 杂志发表论文 《Mastering the game of Go with deep neural networks and tree search》,介绍了 AlphaGo 程序的细节。本博文是对这篇论文的阅读笔记。

AlphaGo 神经网络构成

AlphaGo 总体上由两个神经网络构成,以下我把它们简单称为「两个大脑」,这并非原文中的提法,只是我的一个比喻。

第一个大脑(Policy Network)的作用是在当前局面下判断下一步可以在哪里走子。它有两种学习模式:一个是简单模式,它通过观察 KGS(一个围棋对弈服务器)上的对局数据来训练。粗略地说:这可以理解为让大脑学习「定式」,也就是在一个给定的局面下人类一般会怎么走,这种学习不涉及对优劣的判断。另一个是自我强化学习模式,它通过自己和自己的海量对局的最终胜负来学习评价每一步走子的优劣。因为是自我对局,数据量可以无限增长。

第二个大脑(Value Network)的作用是学习评估整体盘面的优劣。它也是通过海量自我对局来训练的(因为采用人类对局会因为数据太少而失败)。

在对弈时,这两个大脑是这样协同工作的:

第一个大脑的简单模式会判断出在当前局面下有哪些走法值得考虑。

第一个大脑的复杂模式通过蒙特卡洛树来展开各种走法,即所谓的「算棋」,以判断每种走法的优劣。在这个计算过程中,第二个大脑会协助第一个大脑通过判断局面来砍掉大量不值得深入考虑的分岔树,从而大大提高计算效率。

与此同时,第二个大脑本身通过下一步棋导致的新局面的优劣本身也能给出关于下一步棋的建议。

最终,两个大脑的建议被平均加权,做出最终的决定。

在论文中一个有趣的结论是:两个大脑取平均的结果比依赖两者各自得出的结果都要好很多。这应当是让 AlphaGo 表现出和人类相似性的关键所在。

======================================
两个网络的输入都是整个棋盘的状态,不存在一个注重局部一个注重整体。区别在于功能,policy network用于直接给出落子策略,value network用于快速估计当前局面导致最终获胜的概率。MCTS在一个简化版的policy network的指导下多次搜索到终局来实时(但比较慢)估计当前局面最终获胜的概率。value network估算的概率和MCTS估算的概率直接加权平均,最终选择落子位置的时候是依据这个加权平均和完整版policy network给出的对各落子位置的收益的一个加权平均,但是一个位置被MCTS搜索(类似于计算)的次数越多,policy network的结果(类似于经验和直觉)给的权值也越小。所以这一步并不是一个简单的加权平均,也不是局部判断和全局判断的加权平均。两个网络考虑了多少全局因素和局部因素只跟训练数据和当前棋盘状态有关,跟用的哪个网络没有关系。

使用图像识别常用的卷积神经网咯识别棋局确实可能不是最好的方案,但是围棋的状态和图像都具有一定的平移对称性,这是卷积网络擅长利用的特点。我不了解围棋,但我猜人识别围棋局面应该也是有使用识别图像时的类似思维的。我看到有懂围棋的说人会使用一些抽象的模糊的概念进行快速但不精确的推演,如果这点很重要的话,现在的算法可能还需要加入recurrent neural network来实现类似的功能,但也应该不是大问题。加上机器快速搜索的能力,我觉得三月份输赢也许不好说,但是AI在围棋上碾压人类也就一两年内的事了。

学习效率问题。现在AI学习的方式确实跟人很不一样,但这只是因为人在学习一个新领域的知识的时候并不是真正从零开始的,而像神经网络这样的模型往往是从随机的参数开始训练的,没有任何别的先验信息。比如AI如果懂得人类语言以及各种常识,常用概念,那么开始学围棋的时候并不用像现在这样看大量人类的棋谱,然后疯狂自己跟自己下,而可以跟人一样由老师从基础知识开始一点点教授,这样也许起步能更快一些。但是到了需要大量模仿和练习来提升技能的阶段,AI的学习效率真不一定比人差。

======================================

提出下面这些问题和评论

首先,这些神经网络训练在很大程度上是通过自我对局来实现的。这既是某种优势(按照 Facebook 人工智能研究员田渊栋的说法,几千万自我对局这种规模是相当惊人的数据量),某种程度上来说也是不得已而为之,因为人类对局的总数实在太少,会导致机器学习中常见的过度拟合问题。

但是这样是否有可能造成自我设限乃至画地为牢的后果?这同时牵涉到人们对神经网络学习过程的理解和对围棋本身的理解。一方面,神经网络本身是否包容一定程度的「think out of the box」的能力,这固然取决于具体的神经网络算法,但也确实是人们对神经网络方法的一个本质困惑。另一方面,因为 AlphaGo 最基础的定式仍然是来源于人类对局,因此,这个问题依赖于人类棋手本身是否已经穷尽了围棋中所有有意义的基本定式。

(作为一个案例,在 AlphaGo 和樊麾的第二盘对局中,很多人都注意到 AlphaGo 走了一个不标准的大雪崩定式,这是说明 AI 学错了呢,还是它发现这是更好的走法?)

其次,这两个大脑的工作方式确实和人类很相似,一个判断细部,一个纵览全局。但 AlphaGo 最终的结合两者的方式相当简单粗暴:让两者各自评估一下每种可能的优劣,然后取一个平均数。这可绝不是人类的思维方式。

对人类来说,这两种思考问题的方式的结合要复杂的多(不仅仅是在围棋中是这样)。人们并不是总是同时对事态做出宏观和微观的判断,而是有时候侧重于大局,有时候侧重于细部。具体的精力分配取决于事态本身,也取决于人在当时的情绪、心理和潜意识应激反应。这当然是人类不完美之处,但也是人类行为丰富性的源泉。

而 AlphaGo 固然体现出一定的大局观,但从具体算法看来,它在为了宏观优势做出局部牺牲这方面的能力和人类完全不能相提并论。AlphaGo 引入整体盘面评估确实是它胜于许多别的围棋 AI 的地方,但从根本上来说,这只是人们让 AI 具有「战略思维」的尝试的第一步,还有太多可以改进的可能性。

最后,和很多别的围棋 AI 一样,当 AlphaGo 学习盘面判断的时候,采用的是图像处理的技术,也就是把围棋棋盘当做一张照片来对待。这当然在技术上是很自然的选择,但是围棋棋局究竟不是一般意义上的图案,它是否具有某些特质是常见的图像处理方法本身并不擅长处理的呢?

应用

为什么要让人工智能去下围棋?有很多理由。但在我看来最重要的一个,是能够让我们更深入地理解智能这件事的本质。

神经网络和机器学习在过去十年里跃进式的发展,确实让 AI 做到了许多之前只有人脑才能做到的事。但这并不意味着 AI 的思维方式接近了人类。而且吊诡的是,AI 在计算能力上的巨大进步,反而掩盖了它在学习人类思维方式上的短板。

以 AlphaGo 为例。和国际象棋中的深蓝系统相比,AlphaGo 已经和人类接近了许多。深蓝仍然依赖于人类外部定义的价值函数,所以本质上只是个高效计算器,但 AlphaGo 的价值判断是自我习得的,这就有了人的影子。然而如前所述,AlphaGo 的进步依赖于海量的自我对局数目,这当然是它的长处,但也恰好说明它并未真正掌握人类的学习能力。一个人类棋手一生至多下几千局棋,就能掌握 AlphaGo 在几百万局棋中所训练出的判断力,这足以说明,人类学习过程中还有某种本质是暂时还无法用当前的神经网络程序来刻画的。

(顺便提一句,很多评论认为 AlphaGo 能够通过观察一个特定棋手的对局来了解他的棋风以做出相应的对策。至少从论文来看,这几乎确定是不可能的事。一个棋手的对局数对 AlphaGo 来说实在太少,无从对神经网络构成有效的训练。观察和总结一个人的「棋风」这件事仍然是人类具有完全优势的能力,对电脑来说,这恐怕比赢棋本身还更难一些。)

这当然不是说,AlphaGo 应该试图去复刻一个人类棋手的大脑。但是 AlphaGo 的意义当然也不应该仅仅反映在它最终的棋力上。它是如何成长的?成长曲线具有什么规律?它的不同参数设置如何影响它的综合能力?这些不同参数是否就对应了不同的棋风和性格?如果有另一个不同但水平相当的 AI 和它反复对弈,它能否从对方身上「学到」和自我对弈不同的能力?对这些问题的研究和回答,恐怕比单纯观察它是否有朝一日能够超越人类要告诉我们多得多的知识。

因此,即使 AlphaGo 在三月份战胜了李世乭,在我看来也是另一扇大门的开启而非关闭。事实上,即使就围棋发展本身而论,如果把 AlphaGo 的两个大脑以如此简单的方式线性耦合起来就能胜过人类,那只能说明人们对围棋的规律还有太多值得探索的空间。

而对人工智能领域来说,AlphaGo 和一切神经网络一样,本质上还只是个大黑盒,我们能观察到它表现出的巨大能力,但对它究竟是如何「思考」的这件事依然所知甚少。在工程上,这是个伟大的胜利。在科学上,这只是万里长征的第一步而已。

参考资料

AlphaGo 项目主页:http://www.deepmind.com/alpha-go.html

Nature 论文:http://www.nature.com/nature/journal/v529/n7587/full/nature16961.html

Nature 报道:http://www.nature.com/news/google-ai-algorithm-masters-ancient-game-of-go-1.19234

Dan Maas 对论文的浅显总结:http://www.dcine.com/2016/01/28/alphago/

时间: 2024-11-05 11:41:24

程序算法艺术与实践关于 AlphaGo 论文的阅读笔记的相关文章

程序算法艺术与实践之二:函数的渐近的界

众所周知,算法所需的时间应当是随着其输入规模增长的,而输入规模与特定具体问题有关.对大多数问题来说其最自然的度量就是输入中的元素个数.算法的运行时间是指在特定输入时所执行的基本操作数.我们可以得到关于一个关于输入规模n的所需时间的函数.然而可以进一步简化算法的时间分析,我们进行进一步抽象,首先,忽略每条语句的真实代价,通过运行时间的增长率来度量一个算法在时间方面的表现.我们只考虑公式的最高次项,并忽略它的常数系数.本博文主要介绍一些相关的数学知识即:函数的渐近的界的定义与性质.常用的证明方法.

程序算法艺术与实践:递归策略之递归,循环与迭代

众所周知,递归的实现是通过调用函数本身,函数调用的时候,每次调用时要做地址保存,参数传递等,这是通过一个递归工作栈实现的,同时影响效率的.递归是利用系统的堆栈保存函数当中的局部变量来解决问题的,而递归就是在栈处理栈上一堆的指针指向内存中的对象,这些对象一直不被释放,直到递归执行到最后一次后,才释放空间. 循环效率与递归效率 递归与循环是两种不同的解决问题的典型思路.当然也并不是说循环效率就一定比递归高,递归和循环是两码事,递归带有栈操作,循环则不一定,两个概念不是一个层次,不同场景做不同的尝试.

程序算法艺术与实践经典排序算法之Insertion Sort

插入排序(Insertion Sort)的基本思想是每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止. 基本思想与伪代码 经过j-1遍处理后,A[1..j-1]己排好序.第j遍处理仅将A[j]插入L[1..j-1]的适当位置,使得A[1..j]又是排好序的序列.要达到这个目的,我们可以用顺序比较的方法.首先比较A[j]和A[j-1],如果A[j-1]≤ A[j],则A[1..j]已排好序,第i遍处理就结束了:否则交换A[j]与A[j-1]的

关于 AlphaGo 论文的阅读笔记

这是Deepmind 公司在2016年1月28日Nature 杂志发表论文 <Mastering the game of Go with deep neural networks and tree search>.介绍了 AlphaGo 程序的细节. 本博文是对这篇论文的阅读笔记. AlphaGo 神经网络构成 AlphaGo 总体上由两个神经网络构成.以下我把它们简单称为「两个大脑」,这并非原文中的提法,仅仅是我的一个比喻. 第一个大脑(Policy Network)的作用是在当前局面下推断

程序员修炼之道——从小工到专家阅读笔记02

在注重实效的途径中,为我们介绍了一些原则. 首先是重复的危害.其中有一句关键,系统中的每一项知识都必须具有单一,无歧义,权威的表示.——不要重复你自己.有些重复是强加的,比如说建立具有重复信息的文档,在不同环境下重复的定义,编程语言中的重复结构,但是有一些方法可以把重复信息放在一处.比如在头文件中定义了一个定义,而在其他文件中就没有必要再去定义.无意的重复,一般来自于设计中的错误,比如在定义线段的起点和重点的时候,就不要再定义长度,因为长度是一个可以计算出来的变量.无耐性的重复,有的时候写代码往

机器学习算法与Python实践之(四)支持向量机(SVM)实现

机器学习算法与Python实践之(四)支持向量机(SVM)实现 机器学习算法与Python实践之(四)支持向量机(SVM)实现 [email protected] http://blog.csdn.net/zouxy09 机器学习算法与Python实践这个系列主要是参考<机器学习实战>这本书.因为自己想学习Python,然后也想对一些机器学习算法加深下了解,所以就想通过Python来实现几个比较常用的机器学习算法.恰好遇见这本同样定位的书籍,所以就参考这本书的过程来学习了. 在这一节我们主要是

GeekBand-极客班-C++算法原理与实践-董飞-课程笔记(一)

GeekBand-极客班-C++算法原理与实践-董飞-课程笔记(一) 算法入门和编程风格 从一道入门题谈起 /*StrStr Returns the position of the first occurrence of string get in string source, or -1 if target is not part not of source. */ 另一篇博客:http://blog.csdn.net/lionpku/article/details/46713877 StrS

机器学习算法与Python实践之(七)逻辑回归(Logistic Regression)

机器学习算法与Python实践这个系列主要是参考<机器学习实战>这本书.因为自己想学习Python,然后也想对一些机器学习算法加深下了解,所以就想通过Python来实现几个比较常用的机器学习算法.恰好遇见这本同样定位的书籍,所以就参考这本书的过程来学习了. 这节学习的是逻辑回归(Logistic Regression),也算进入了比较正统的机器学习算法.啥叫正统呢?我概念里面机器学习算法一般是这样一个步骤: 1)对于一个问题,我们用数学语言来描述它,然后建立一个模型,例如回归模型或者分类模型等

数据挖掘系列(8)朴素贝叶斯分类算法原理与实践

隔了很久没有写数据挖掘系列的文章了,今天介绍一下朴素贝叶斯分类算法,讲一下基本原理,再以文本分类实践. 一个简单的例子 朴素贝叶斯算法是一个典型的统计学习方法,主要理论基础就是一个贝叶斯公式,贝叶斯公式的基本定义如下: 这个公式虽然看上去简单,但它却能总结历史,预知未来.公式的右边是总结历史,公式的左边是预知未来,如果把Y看出类别,X看出特征,P(Yk|X)就是在已知特征X的情况下求Yk类别的概率,而对P(Yk|X)的计算又全部转化到类别Yk的特征分布上来. 举个例子,大学的时候,某男生经常去图