AlphaGo全系列

AlphaGo算是这波AI浪潮的里程碑事件了。如果说AlexNet让学术界重新认识了DL的话,AlphaGo则让大众都认识到了DL的威力。我也是在AlphaGo的感召之下,投身ML/DL领域的(2016.7)。因此,了解AlphaGo的原理,就成为了我一直以来的目标。岂料直到三年多之后(2019.11),我才能真正看懂AlphaGo。

历史

我对人工智能的认识,始于1997年深蓝大战卡斯帕罗夫。然而,人工智能的历史还可追溯到更早的时代。其中,最重要的地方是贝尔实验室和MIT。

比如,C语言和Unix之父Ken Thompson,就写过一个叫Belle的国际象棋程序。这也是第一个达到大师级水平的国际象棋程序。

这个时代,博弈系统的人工智能主要采用穷举遍历博弈树的方式。Ken Thompson针对国际象棋残局进行了计算机穷举。他发现之前一些公认和局的残局,实际上是有胜负的,只是胜负要在50步以上,其中的一些走法甚至看不出具体的含义。

穷举法到深蓝时代,达到了顶峰。此后的博弈研究逐渐转向其他领域,围棋就是其中一个热点。

国内的围棋软件早期大概算“手谈”(作者:陈志行)最为出名。我1996年的时候接触过,但是它的棋力实在太差。我的一个手下败将(可让6子),居然也可让软件2子。总之,完全入门级的水平,只适合学棋4个月以内的人。

后来的GNUGo就好的多了,我最多只能让它2子。

陈志行,1931~2008,广东番禺人。中山大学化学系毕业(1952),中山大学教授。1991年退休后,从事电脑围棋开发。从1993年起,共10次获得电脑围棋世界冠军。

参考:

https://www.cnblogs.com/wiki3d/p/handtalk.html

陈志行:计算机围棋程序手谈作者

DarkForestGo

DarkForestGo是田渊栋2015年11月的作品,虽然棋力和稍后的AlphaGo相去甚远,但毕竟也算是用到了RL和DNN了。

论文:

《Better Computer Go Player with Neural Network and Long-term Prediction》

代码:

https://github.com/facebookresearch/darkforestGo

DarkForest中的一些规则借鉴了开源围棋软件Pachi:

http://pachi.or.cz/

以下是作者本人的讲解:

https://zhuanlan.zhihu.com/p/20607684

AlphaGo的分析

上图是DarkForest的网络结构图。其中的细节,我们将在讲解AlphaGo的时候,再细说。

AlphaGo

论文:

《Mastering the game of Go with deep neural networks and tree search》

AlphaGo主要由几个部分组成:

  1. 走棋网络(Policy Network),给定当前局面,预测/采样下一步的走棋。

  2. 快速走子(Fast rollout),目标和1一样,但在适当牺牲走棋质量的条件下,速度要比1快1000倍。

  3. 估值网络(Value Network),给定当前局面,估计是白胜还是黑胜。

  4. 蒙特卡罗树搜索(Monte Carlo Tree Search,MCTS),把以上这三个部分连起来,形成一个完整的系统。

以下是详细的解说。

Policy Network

上图是AlphaGo的Policy Network的网络结构图。

从结构来看,它与DarkForestGo是十分类似的:

  1. 都是1层5x5的conv+k层3x3的conv。

  2. 两者的input plane都是手工构建的特征。

  3. 由于棋子的精确位置很重要,这些CNN中都没有pooling。

它们的差异在于:

1.DarkForestGo训练时,会预测三步而非一步,提高了策略输出的质量。

Policy Network摆脱了之前的基于规则的围棋软件,长于局部,但大局较差的弱点,它的大局观非常强,不会陷入局部战斗中。例如,DarkForestGo的走棋网络直接放上KGS就有3d的水平。

它的缺点是:会不顾大小无谓争劫,会无谓脱先,不顾局部死活,对杀出错,等等。有点像高手不经认真思考的随手棋——只有“棋感”,而没有计算。(其实更类似于计算力衰退的老棋手,比如聂棋圣。)

Value Network

AlphaGo的Value Network也是一个和Policy Network几乎一样的深度卷积网络。

Fast rollout

有了走棋网络,为什么还要做快速走子呢?

  • 走棋网络的运行速度是比较慢的(3毫秒),而快速走子能做到几微秒级别,差了1000倍。

  • 快速走子可以用来评估盘面。由于天文数字般的可能局面数,围棋的搜索是毫无希望走到底的,搜索到一定程度就要对现有局面做个估分。在没有估值网络的时候,不像国象可以通过算棋子的分数来对盘面做比较精确的估值,围棋盘面的估计得要通过模拟走子来进行,从当前盘面一路走到底,不考虑岔路地算出胜负,然后把胜负值作为当前盘面价值的一个估计。显然,如果一步棋在快速走子之后,生成的N个结果中的胜率较大的话,那它本身是步好棋的概率也较大。

为了速度快,Fast rollout没有使用神经网络,而是使用传统的局部特征匹配(local pattern matching)加线性回归(logistic regression)的方法。

这种方法虽然没有NN这么强,但还是比更为传统的基于规则的方案适应性好。毕竟规则是死的,而传统的机器学习,再怎么说也是可以自动学习规则的。当然了,这更比随机走子的效率高了。

DarkForestGo的走子基于规则模板,且没有快速走子,个人以为这才是它棋力差的主要原因。

由于Fast rollout既可以提供策略,又有一定的价值评估的手段,因此单独使用它,比单独使用Policy Network或者Value Network都要好。相当于是一个劣化版本的AlphaGo。

MCTS

AlphaGo的MCTS使用的是传统的UCT算法,没太多好讲的。一个细节是Game Tree的结点并不是立即展开,而是要等到路过该结点的次数超过一定阈值,才进行展开,从而大大减小了搜索空间。

其他关键点


AlphaGo不是一个纯粹的DRL,它还是使用了人类棋谱的先验数据。

  • 首先,从人类棋谱中学习rollout策略,并初始化Policy Network。

  • 然后,使用自我博弈的方式,训练Policy Network和Value Network。

由于很多人类的棋局都是因为中间偶然的失误导致了全盘覆灭(所谓“一着不慎满盘皆输”),其中的偶然性非常大,局部的优劣往往和棋局的最终结果无关,因此Value Network并没有用人类棋谱来训练。

AlphaGo每更新一个“小版本”后,都要将这个版本和迄今最好的版本对比,如果新的版本胜率超过55%,才会用来取代以前最好的版本。这样做的显然的好处是防止AlphaGo自我博弈得“走火入魔”,陷入局部最优。

AlphaGo Zero

论文:

《Mastering the game of Go without human knowledge》

AlphaGo Zero对AlphaGo进行了全面提升:

  • input plane去掉了手工特征,基本全由历史信息组成。

  • Policy Network和Value Network不再是两个同构的独立网络,而是合并成了一个网络,只是该网络有两个输出——Policy Head和Value Head。

  • 骨干结构采用了Resnet,层数大大增加。

  • 完全采用自我博弈,去掉了人类棋谱。

  • 取消了Fast rollout。AlphaGo Zero的实践表明,如果有足够好的Value函数的话,MCTS的采样效率要远远高于传统的alpha-beta剪枝。因此,rollout也不是必须的。

稍后的AlphaZero的实践表明:AlphaZero搜索80000个节点的棋力,已经超过了Stockfish搜索70000000个节点的棋力。

  • Policy Gradient vs. Policy Iteration

AlphaGo依赖快速走子的结果,获得最终的结果信息。因此,它的奖励来源比较单一:只有对局的最终结果。这种做法实际上就是通常说的Policy Gradient。

但正如之前指出的:棋下输了,不意味着每步棋都是臭棋。因此,只使用最终结果,既会导致奖励稀疏,也不利于实时评估走子的价值。

AlphaGo Zero转而采用Policy Iteration方法,实时对盘面进行估计,不再依赖终局结果。

AlphaZero

论文:

《Mastering Chess and Shogi by Self-Play with aGeneral Reinforcement Learning Algorithm》

AlphaZero相对于AlphaGo Zero的改进不算大,毕竟也就只差2个月。它的贡献在于,证明了DRL对于很多棋类都是有效的。

MuZero

MuZero是DeepMind 2019年11月的作品。

论文:

《Mastering Atari, Go, Chess and Shogi by Planning with a Learned Model》

参考代码:

https://github.com/AppliedDataSciencePartners/DeepReinforcementLearning

基本结构

MuZero在不具备任何底层动态知识的情况下,通过结合基于树的搜索和学得模型,在Atari 2600游戏中达到了SOTA表现,在国际象棋、日本将棋和围棋的精确规划任务中可以匹敌AlphaZero,甚至超过了提前得知规则的围棋版AlphaZero。

传统方法的局限:

  • Model-based RL在Atari 2600游戏上表现不佳。这类游戏的Model很难刻画,规则比较抽象。

  • Model-Free RL在棋类游戏上表现不佳。棋类的规则十分明确。

上图是MuZero和AlphaZero的网络结构对比图。从中可以看出:

1.AlphaZero只有一个网络。(虽然有两个用途:Policy和Value)

2.MuZero有三个网络:

  • Prediction Network。这个和AlphaZero相同。

  • Dynamics Network。

  • Representation Network。

Representation & Dynamics Network

Representation & Dynamics Network的主要思想来自如下论文:

1.《The Predictron: End-To-End Learning and Planning》

2.《Value Prediction Network》

上文已经指出Model-based方法的困难在于:有的时候Model是很难刻画的,而环境本身也许并不如模拟器那么纯粹、简单。

一个很自然的思路就是:既然NN能表示Policy和Value,那么能不能表示Model呢?

参考论文1提出了Predictron框架,它的主要思路是:

  • 构建一个abstract MDP model。虽然我们并不知道它的state,更不清楚它的transition,但是不要紧,假设它存在就好。

  • 状态表示。(即上图中的s0,s1,…s^0,s^1,\dotss0,s1,…)

s⃗=f(s)\vec{s} = f(s)s=f(s)

这里用s⃗\vec{s}s表示系统的抽象状态以区别其实际状态s。也就是说,在系统模型中,预测的不是实际的状态s, 而是抽象的状态。即:建立real state space到abstract state space的映射。

  • 模型预测,不只是状态流的预测,还包括立即回报和折扣因子的预测。

s⃗′,r⃗,γ=m(s⃗,β)\vec{s}',\vec{r},\gamma = m(\vec{s}, \beta)s′,r,γ=m(s,β)

  • 抽象状态s⃗\vec{s}s处的值函数:

v⃗=v(s)\vec{v} = v(s)v=v(s)

  • 由回报、折扣因子和值函数计算得到估计值。这里可以对这个abstract MDP model应用TD(n)和TD(λ\lambdaλ)算法,得到如上图所示的k-step和λ\lambdaλ-weighted的预测值。其中的g表示累计奖励值。

这里的套路其实和DQN非常像,都是让预测值(这里是g)尽可能接近真实值。区别在于:这里既然是Model-based方法,那么自然有利用Model生成模拟样本的步骤,而DQN没有这样的步骤。

参考论文2的做法也是类似的。

Encodingfθenc:x→s\mathbf{Encoding}\quad f_\theta^{enc}: x\to sEncodingfθenc​:x→s

Valuefθvalue:s→Vθ(s)\mathbf{Value}\quad f_\theta^{value}: s\to V_\theta(s)Valuefθvalue​:s→Vθ​(s)

Outcomefθout:s,o→r,γ\mathbf{Outcome}\quad f_\theta^{out}: s,o\to r,\gammaOutcomefθout​:s,o→r,γ

Transitionfθtrans:s,o→s′\mathbf{Transition}\quad f_\theta^{trans}: s,o\to s'Transitionfθtrans​:s,o→s′

x:观测值(observation)。

s:abstract state。

o:abstract state上的option。

s’:下一个abstract state。

也是预测若干步的奖励值。

实现细节

重新回到MuZero,下图是MuZero的关键步骤图。

A部分:Representation Network + Dynamics Network + MCTS

B部分:从policy:πt\pi_tπt​中采样得到action:at+1a_{t+1}at+1​,环境根据at+1a_{t+1}at+1​得到observation:ot+1o_{t+1}ot+1​、h和reward:ut+1u_{t+1}ut+1​。这些样本在用过后,被存入replay buffer。

C部分:训练时,从replay buffer中,采样得到oto_tot​,通过h函数,得到sts_tst​,然后执行K-step展开,得到p,v,r。

loss公式为:

lt(θ)=∑k=0Klr(ut+k,rtk)+lv(zt+k,vtk)+lp(πt+k,ptk)+c∥θ∥2l_t(\theta)=\sum_{k=0}^K l^r(u_{t+k},r_t^k)+l^v(z_{t+k},v_t^k)+l^p(\pi_{t+k},p_t^k)+c\|\theta\|^2lt​(θ)=k=0∑K​lr(ut+k​,rtk​)+lv(zt+k​,vtk​)+lp(πt+k​,ptk​)+c∥θ∥2

其中,p,v,r分别是policy、value、reward的预测值。而π\piπ、z、u则是对应的target值。(参见《深度强化学习(2)》中DQN一节中的current Q-value和target Q-value的定义)

MuZero和VPN一样,都是在abstract state space中用dynamics model做planning。MuZero的改进在于增加了对每个abstract state上policy的预测,因此效率比VPN要高一些。

最后需要澄清一点的是:模拟的Model永远比不上确定的规则。MuZero在棋类上的表现并不如AlphaZero。对比数据中,围棋项目的优势,更多的在于MuZero使用了更宽的网络。

深度学习(四十三)——深度强化学习(6)AlphaGo全系列相关推荐

  1. MATLAB强化学习实战(十三) 使用强化学习智能体训练Biped机器人行走

    使用强化学习智能体训练Biped机器人行走 两足机器人模型 创建环境接口 选择和创建训练智能体 DDPG Agent TD3 Agent 指定训练选项和训练智能体 仿真训练过的智能体 比较智能体性能 ...

  2. 深度学习之强化学习(1)强化学习案例

    深度学习之强化学习(1)强化学习案例 强化学习案例 1. 平衡杆游戏 2. 策略网络 3. 梯度更新 4. 平衡杆游戏实战 完整代码 人工智能=深度学习+强化学习--David Silver  强化学 ...

  3. 43.深度解密四十三:网络营销推广实战中的“辅助营销工具”大全

    网络营销推广技术.技巧深度解密(四十三)指南: 1.本文档适合零基础以及互联网营销推广工作者,主要讲解网络营销需要的相关辅助营销工具的问题. 2.原创版权文档,任何抄袭或者全部.部分模仿都是侵权行为. ...

  4. 强化学习笔记1:强化学习概述

    七个字概括强化学习适用的问题:多序列决策问题 1 agent和environment         强化学习讨论的问题是一个智能体(agent) 怎么在一个复杂不确定的环境(environment) ...

  5. 强化学习笔记4:强化学习分类

    1 model-free & model-based model-based(有模型) RL agent,它通过学习环境的状态转移来采取动作. model-free(免模型) RL agent ...

  6. 百度强化学习框架PARL入门强化学习

    1.什么是强化学习? 强化学习(Reinforcement Learning, RL),又称再励学习.评价学习或增强学习,是机器学习的范式和方法论之一,用于描述和解决智能体(agent)在与环境的交互 ...

  7. C#多线程学习(四) 多线程的自动管理(线程池) (转载系列)——继续搜索引擎研究...

    在多线程的程序中,经常会出现两种情况: 一种情况:   应用程序中,线程把大部分的时间花费在等待状态,等待某个事件发生,然后才能给予响应                   这一般使用ThreadPo ...

  8. 【强化学习】什么是强化学习算法?

    [强化学习]什么是强化学习算法? 一.强化学习解决什么问题? 二.强化学习如何解决问题? 2.1.强化学习的基本框架 2.2.强化学习系统的要素 2.3.强化学习与监督学习的区别 2.4.强化学习与非 ...

  9. 强化学习—— 多智能体强化学习

    强化学习-- 多智能体强化学习 1. 多智能体关系分类 1.1 合作关系(Fully Cooperative) 1.2 竞争关系(Fully Competitive) 1.3 混合关系(Mixed C ...

最新文章

  1. 零基础如何学习java技术?
  2. uos连接服务器共享文件夹,使用UOS系统共享文件给其他设备的的办法
  3. QT Creator应用程序开发——01简单按钮显示
  4. 笔记本电脑怎么清理灰尘_笔记本发热怎么办?这里有解决方案
  5. centos 6.5 安装谷歌浏览器Chrome
  6. 科学技术是对人类历史发展和现代国家兴亡起决定作用的一种力量
  7. 23种设计模式(十八)状态变化之备忘录
  8. php 判断访问类型,php如何判断访问系统的用户设备类型(代码示例)
  9. 基于肌电信号(sEMG) 的深度学习手势分类
  10. MongoDB数据库入门到精通看这一篇就够了
  11. 简单爬取京东商品名称、价格(仅供学习)
  12. C++运算符重载(简单易懂)
  13. c语言if语句知识点总结,c语言中if语句知识点总结.docx
  14. 【Python】输入一个整数,输出这个整数的所有数字和,例如输入256,则输出13
  15. C语言直接驱动硬件实现PC机的串口操作
  16. 用c语言试完成九九乘法口诀表中倒直三角形,
  17. geoserver osm 导入_[原]导入OpenStreetMap海图数据,并在GeoServer上发布
  18. DesktopGoose的下载和使用(抖音网红桌宠鹅)【保姆级教程】
  19. 多乐士发布2020年度色彩--豆蔻青
  20. 神经网络给图片生成标题,神经网络提取图片特征

热门文章

  1. 关于const记录类型全局变量赋初值的问题
  2. 四象限法推导lm曲线_IS曲线推导
  3. forEach-关于跳出循环
  4. 判断扫码是支付宝还是微信
  5. android linux内核开发环境,定制Android 4.2.2开发环境
  6. xman的思维导图快捷键_这个良心好用的思维导图软件,居然不用氪金充钱
  7. sql 数组_sql注入中级
  8. 两列布局左边定宽,右边自适应
  9. 三维重建:PNG格式详解-与LibPNG使用
  10. Oracle 调度程序(scheduler)摘自一位大神