目录

  • AlphaGo概述
  • AlphaGo的Policy Network
    • 网络结构
    • 训练方法
      • Behavior Cloning预训练
      • 使用Policy Gradient继续训练策略网络
    • 使用策略网络下棋
      • 铺垫内容
      • 训练State-Value Network
      • Monte Carlo Tree Search

AlphaGo概述

首先认识围棋中的一些内容:

围棋的棋盘由19×1919\times 1919×19的网格组成,因此,包含361个点,围棋竞技的状态就是黑白棋子在空间上的排列。直观的进行建模,我们可以用19×19×219\times 19\times 219×19×2的张量表示当前状态,其中,19×19×119\times 19\times 119×19×1张量代表黑棋子方,其中的值0和1代表有无放棋子;同理,另外19×19×119\times 19\times 119×19×1张量代表白棋子方(也是0和1代表有无放棋子)。

在AlphaGo中,实际是用19×19×1719\times 19\times 1719×19×17的张量保存状态,额外的通道用于反映其他信息。

对于动作,则是将棋子放到棋盘的空闲点上,动作的集合为棋盘上点的编号:A={1,2,3,...,361}A=\left\{1,2,3,...,361\right\}A={1,2,3,...,361}在围棋中,可能的动作序列一共1017010^{170}10170种,这是暴力搜索不能解决的问题,因此采用深度强化学习实现AlphaGo。

下面大致介绍AlphaGo的设计思路。

首先是训练,包含3个步骤:

  • 1.行为克隆(behavior cloning)初始化策略网络,行为克隆不是强化学习,而是一个动作分类任务(深度学习种的有监督学习),使用的标注数据为16万局真人对决记录。
  • 2.使用Policy Gradient训练策略网络:实例化两个步骤1中的策略网络进行相互博弈。
  • 3.不同于Actor-Critic Methods,AlphaGo没有同时训练策略网络和价值网络,AlphaGo先训练好策略网络,再利用策略网络训练价值网络。

在AlphaGo实际下棋时,通过策略网络和价值网络指导蒙特卡洛树搜索方法(Monte Carlo Tree Search,MCTS)进行动作搜索。

AlphaGo的Policy Network

网络结构

在AlphaGo中,使用19×19×1719\times 19\times 1719×19×17的张量表示state:

该张量具有以下设计思想:

黑棋子有8个通道,第一个通道为当前回合的棋子位置状态,0表示对应位置没有棋子,1表示有棋子,剩下7个通道为前7个回合的棋子位置状态;

白棋子同理,也有8个通道;

最后一个通道反映当前轮到哪一方做动作,如果轮到黑棋方,就为全1的矩阵,反之,如果轮到白棋方,就为全0的矩阵;

根据以上分析,AlphaGo的策略网络如下:

策略网络输入state的张量(19×19×1719\times 19\times 1719×19×17),输出361个动作组成的概率分布。

训练方法

Behavior Cloning预训练

AlphaGo训练策略网络的第一步是Behavior Cloning,一开始,网络的参数都是随机初始化。如果在这个时候让两个策略网络进行博弈,它们的动作都是完全随机的,因此需要非常非常长期的时间才能具备生成有意义的动作分布。

为了解决这个问题,AlphaGo采用有监督学习对策略网络进行预训练,通过收集16万局真人对决记录作为有标签的数据,训练策略网络。这个方法被称为Behavior Cloning,经过训练后的网络不能对抗职业玩家,但已经能够打败业余玩家。

注意Behavior Cloning不是强化学习,强化学习的监督信号来自环境给agent的奖励,Behavior Cloning属于模仿学习(Imitation Learning)。对于Behavior Cloning,agent不关心环境的奖励,只需要依照顺序模仿动作(按顺序进行动作分类)即可。

Behavior Cloning的具体过程如下:

  • 观测到当前状态sts_{t}st​;
  • 使用策略网络输出动作的概率分布:pt=[π(1∣st;θ),...,π(361∣st;θ)]∈(0,1)361p_{t}=[\pi(1|s_{t};\theta),...,\pi(361|s_{t};\theta)]\in (0,1)^{361}pt​=[π(1∣st​;θ),...,π(361∣st​;θ)]∈(0,1)361
  • 假设标注的动作为落在第281号点上,标注动作记录为at∗=281a^{*}_{t}=281at∗​=281,现在对at∗a^{*}_{t}at∗​进行one-hot编码得到向量yt∈{0,1}361y_{t}\in\left\{0,1\right\}^{361}yt​∈{0,1}361;
  • 计算交叉熵损失:Loss=CrossEntropy(yt,pt)Loss=CrossEntropy(y_{t},p_{t})Loss=CrossEntropy(yt​,pt​)使用该损失计算梯度并更新参数θ\thetaθ。

现在思考问题:Behavior Cloning训练策略网络后,还需要用强化学习继续训练策略网络,那么Behavior Cloning到底差在哪里?

  • 解释:强化学习是以环境给agent的奖励为监督信号的,但Behavior Cloning属于传统的有监督学习,它只能对以前见过的状态有良好表现(只有在训练集中见过的类似状态,网络才能输出合理的概率分布),围棋的状态是极为复杂的,16万局的游戏只算是围棋所有状态中的冰山一角,如果仅使用Behavior Cloning训练网络,在实际围棋对决时,如果遇到陌生状态,模型将很容易输出错误的动作概率分布。

使用Policy Gradient继续训练策略网络

研究人员用两个策略网络进行博弈:一个叫做Player(Agent),另一个叫做Opponent(Environment):

Player是具有最新参数的策略网络,Opponent也是策略网络,但每一局使用的参数都是随机从过去Player参数中选择的。

我们让Player和Opponent进行博弈,直到游戏结束,假设走了TTT步之后游戏结束,游戏结束前,任意步的奖励均为0:r1=r2=⋅⋅⋅=rT−1=0r_{1}=r_{2}=\cdot\cdot\cdot=r_{T-1}=0r1​=r2​=⋅⋅⋅=rT−1​=0如果Agent赢了,则有rT=+1r_{T}=+1rT​=+1,如果Agent输了,则有rT=−1r_{T}=-1rT​=−1。

回顾回报的定义:ut=∑i=tTriu_{t}=\sum_{i=t}^{T}r_{i}ut​=i=t∑T​ri​这意味着,如果agent赢了,则有:u1=u2=⋅⋅⋅=uT=+1u_{1}=u_{2}=\cdot\cdot\cdot=u_{T}=+1u1​=u2​=⋅⋅⋅=uT​=+1如果agent输了,则有:u1=u2=⋅⋅⋅=uT=−1u_{1}=u_{2}=\cdot\cdot\cdot=u_{T}=-1u1​=u2​=⋅⋅⋅=uT​=−1这样的设计意义为:只要最后能赢,就认为这局比赛的agent每一步动作都是好棋。

回顾策略梯度算法,目标是计算状态-价值函数V(s;θ)V(s;\theta)V(s;θ)关于参数θ\thetaθ的梯度,但我们可以用下面式子近似策略梯度:∂logπ(at∣st;θ)∂θ⋅Qπ(st,at)\frac{\partial log\pi(a_{t}|s_{t};\theta)}{\partial\theta}\cdot Q_{\pi}(s_{t},a_{t})∂θ∂logπ(at​∣st​;θ)​⋅Qπ​(st​,at​)其中,Qπ(st,at)Q_{\pi}(s_{t},a_{t})Qπ​(st​,at​)是动作-价值函数,其本质是折扣回报的期望:Qπ(st,at)=E[Ut∣st,at]Q_{\pi}(s_{t},a_{t})=E[U_{t}|s_{t},a_{t}]Qπ​(st​,at​)=E[Ut​∣st​,at​]因此,对于一局游戏,我们可以用观测值utu_{t}ut​(要么为+1,要么为-1)近似Qπ(st,at)Q_{\pi}(s_{t},a_{t})Qπ​(st​,at​),此时,可以进一步得到策略梯度的近似:∂logπ(at∣st;θ)∂θ⋅ut\frac{\partial log\pi(a_{t}|s_{t};\theta)}{\partial\theta}\cdot u_{t}∂θ∂logπ(at​∣st​;θ)​⋅ut​总结一下训练策略网络的步骤:

  • 用两个策略网络进行博弈直到游戏结束(Player v.s. Opponent);
  • 记录agent(Player)的轨迹:s1,a1,s2,a2,...,sT,aTs_{1},a_{1},s_{2},a_{2},...,s_{T},a_{T}s1​,a1​,s2​,a2​,...,sT​,aT​
  • 根据agent的输赢结果得到回报:u1=u2=⋅⋅⋅=uTu_{1}=u_{2}=\cdot\cdot\cdot=u_{T}u1​=u2​=⋅⋅⋅=uT​如果赢了,则全为+1,输了则全为-1;
  • 累加近似的策略梯度:gθ=∑t=1T∂logπ(at∣st;θ)∂θ⋅utg_{\theta}=\sum_{t=1}^{T}\frac{\partial log\pi(a_{t}|s_{t};\theta)}{\partial\theta}\cdot u_{t}gθ​=t=1∑T​∂θ∂logπ(at​∣st​;θ)​⋅ut​
  • 梯度上升更新Player的参数:θ=θ+β⋅gθ\theta=\theta+\beta\cdot g_{\theta}θ=θ+β⋅gθ​

使用策略网络下棋

铺垫内容

经过强化学习训练后,得到策略网络π\piπ,可以用来下棋,观测到当前的状态sts_{t}st​,随机抽样动作:at∼π(⋅∣st;θ)a_{t}\sim\pi(\cdot|s_{t};\theta)at​∼π(⋅∣st​;θ)此时的策略网络已经足够强大,但是还不能击败围棋冠军,这是因为面对围棋冠军时,策略网络的小概率不稳定性会导致走错某一步,走错一步可能就导致围棋局势发生改变。

比策略网络抽样更稳定的方法是蒙特卡洛树搜索,为了实现蒙特卡洛树搜索,还需要学习一个价值网络,这个价值网络不同于价值学习中的价值网络,这个价值网络是状态-价值网络(价值学习中的是最优动作-价值网络Q∗Q^{*}Q∗)

训练State-Value Network

先回顾状态-价值函数,已知动作-价值函数:Qπ(st,at)=E[Ut∣St=st,At=at]Q_{\pi}(s_{t},a_{t})=E[U_{t}|S_{t}=s_{t},A_{t}=a_{t}]Qπ​(st​,at​)=E[Ut​∣St​=st​,At​=at​]而状态-价值函数为:Vπ(st)=EA[Qπ(st,A)]V_{\pi}(s_{t})=E_{A}[Q_{\pi}(s_{t},A)]Vπ​(st​)=EA​[Qπ​(st​,A)]其中,如果agent赢了则ut=+1u_{t}=+1ut​=+1,否则ut=−1u_{t}=-1ut​=−1;

现在用神经网络v(s;w)v(s;w)v(s;w)近似状态-价值函数Vπ(s)V_{\pi}(s)Vπ​(s),它用于衡量当前状态的好坏。

此时发现,AlphaGo其实是两个网络的组合,它们共享卷积层,全连接一个分支用于策略网络,一个用于价值网络:

策略网络输出动作的概率分布,价值网络输出当前状态好坏程度的得分。并且要注意,策略网络和价值网络不是同时训练的,AlphaGo先训练策略网络结束后,再训练价值网络(所以不同于Actor-Critic方法的训练模式)。

State-Value Network的训练过程如下:

  • 使用两个策略网络进行博弈直到游戏结束(Player v.s. Opponent,Player是Policy Gradient训练后的策略网络,Opponent是Policy Gradient训练中随机选择的某个策略网络),如果agent(Player)赢了,则有:u1=⋅⋅⋅=uT=+1u_{1}=\cdot\cdot\cdot=u_{T}=+1u1​=⋅⋅⋅=uT​=+1否则为:u1=⋅⋅⋅=uT=−1u_{1}=\cdot\cdot\cdot=u_{T}=-1u1​=⋅⋅⋅=uT​=−1
  • 计算损失:L=∑t=1T12[v(st;w)−ut]2L=\sum_{t=1}^{T}\frac{1}{2}[v(s_{t};w)-u_{t}]^{2}L=t=1∑T​21​[v(st​;w)−ut​]2
  • 梯度下降更新参数:w=w−α⋅∂L∂ww=w-\alpha\cdot\frac{\partial L}{\partial w}w=w−α⋅∂w∂L​

有了策略网络和价值网络,AlphaGo的训练就结束了。

Monte Carlo Tree Search

蒙特卡洛树搜索不需要训练,可以直接用于下棋,前面训练的两个网络是为了帮助蒙特卡洛树搜索方法。

首先,我们思考人类在下棋时的行为:

我们发现,人在放下棋子前,总会先设想如果放在这个位置,对手会怎么走,而我下一步又该如何走。所以,我们为了提高胜算,需要让机器能够搜索未来的可能状态(即看得更长远)。

AlphaGo需要搜索未来状态,从中选择胜算最大的那个。下面先了解搜索的主要思想:

  • 1.首先选择动作aaa,该动作不是均匀随机抽样,而是按照概率分布抽样。
  • 2.然后让策略网络进行自我博弈(Player v.s. Opponent),看这个动作引起的最后结果是输还是赢;根据胜负和价值函数给该动作aaa打分;
  • 重复1和2多次,选择得分最高的动作。

蒙特卡洛树搜索的具体做法如下,每一轮模拟都分为4步,也就是AlphaGo每下一个棋子都要把以下4步重复很多次:

  • 1.Selection:根据策略网络Player的动作得分选择动作aaa,该动作不会被实际执行,被称为Imaginary action;
  • 2.Expansion:模拟对手的动作,即让策略网络Opponent做一个动作,并更新状态;
  • 3.Evaluation:根据更新的状态,计算state-value网络的得分vvv,用于计算动作的action-value;
  • 4.Back-up:使用3步中的action-value更新动作得分。

下面进一步详细描述4个步骤的细节,假设当前观测到状态sts_{t}st​:

1.Selection
首先,对任意的动作aaa计算得分:score(a)=Q(a)+η⋅π(a∣st;θ)1+N(a)score(a)=Q(a)+\eta\cdot\frac{\pi(a|s_{t};\theta)}{1+N(a)}score(a)=Q(a)+η⋅1+N(a)π(a∣st​;θ)​其中,Q(a)Q(a)Q(a)是MCTS中计算出的action-value(初始值为0),π(a∣st;θ)\pi(a|s_{t};\theta)π(a∣st​;θ)来自训练后的策略网络,N(a)N(a)N(a)是动作被选择的次数;

η\etaη是超参数需要手动调整。

如果aaa动作很容易被选中,即π(a∣st;θ)\pi(a|s_{t};\theta)π(a∣st​;θ)过大,但是N(a)N(a)N(a)也会增大,可以平衡数值,避免在sts_{t}st​下某个动作陷入重复探索导致模型不够灵活。一开始,Q(a)=0Q(a)=0Q(a)=0,动作的得分取决于策略网络,随着多次模拟,action-value Q(a)Q(a)Q(a)会占据主导地位。

根据当前得分最大者选择动作ata_{t}at​(深红):

2.Expansion
现在有了ata_{t}at​,opponent再走一步at′a'_{t}at′​将会更新状态为st+1s_{t+1}st+1​;

但是opponent的动作at′a'_{t}at′​应该抽样自:at′∼π(⋅∣st′;θ)a'_{t}\sim\pi(\cdot|s'_{t};\theta)at′​∼π(⋅∣st′​;θ)此处的状态st′s'_{t}st′​是player下棋后,opponent下棋前的状态。

对于这种设计,其实状态转移函数就与策略函数等价。

我们可以模拟新状态st+1s_{t+1}st+1​如下:


3.Evaluation
在st+1s_{t+1}st+1​的基础上,双方仅进行动作抽样来博弈直到游戏结束,该过程被称为Fast Roll out:

  • Player的动作:ak∼π(⋅∣sk;θ)a_{k}\sim\pi(\cdot|s_{k};\theta)ak​∼π(⋅∣sk​;θ);
  • Opponent的动作:ak′∼π(⋅∣sk′;θ)a'_{k}\sim\pi(\cdot|s'_{k};\theta)ak′​∼π(⋅∣sk′​;θ)。

如果最后Player赢了,则记录奖励rT=+1r_{T}=+1rT​=+1,否则为rT=−1r_{T}=-1rT​=−1,使用奖励评价状态st+1s_{t+1}st+1​:

另外,还需要用价值网络评价st+1s_{t+1}st+1​:v(st+1;w)v(s_{t+1};w)v(st+1​;w);

根据以上两项,得到状态st+1s_{t+1}st+1​的综合评价:V(st+1)=12[v(st+1;w)+rT]V(s_{t+1})=\frac{1}{2}[v(s_{t+1};w)+r_{T}]V(st+1​)=21​[v(st+1​;w)+rT​]通过Fast Roll out,可以有很多的st+1s_{t+1}st+1​,所以我们可以得到各个状态的综合评价:

因此,每个动作ata_{t}at​都对应了大量子节点V(st+1)V(s_{t+1})V(st+1​),现在我们要计算的action-value为:Q(at)=mean(V(st+1))Q(a_{t})=mean(V(s_{t+1}))Q(at​)=mean(V(st+1​))

4.Back-up
将action-value更新回对应动作ata_{t}at​的得分上:score(at)=Q(at)+η⋅π(at∣st;θ)1+N(at)score(a_{t})=Q(a_{t})+\eta\cdot\frac{\pi(a_{t}|s_{t};\theta)}{1+N(a_{t})}score(at​)=Q(at​)+η⋅1+N(at​)π(at​∣st​;θ)​

模拟结束后的动作决定

经过上面4个步骤的多次模拟,可以得到一组数据:每个动作aaa以及其被选择过的次数N(a)N(a)N(a);

因此在最终执行动作时,我们只需选择最大次数者作为ata_{t}at​即可:at=argmaxaN(a)a_{t}=argmax_{a}N(a)at​=argmaxa​N(a)

第二十八课.AlphaGo实例分析相关推荐

  1. NeHe OpenGL第二十八课:贝塞尔曲面

    NeHe OpenGL第二十八课:贝塞尔曲面 贝塞尔曲面: 这是一课关于数学运算的,没有别的内容了.来,有信心就看看它吧. 贝塞尔曲面 作者: David Nikdel ( ogapo@ithink. ...

  2. Java调用大数据接口,学习Hadoop第二十八课(java通过调用接口来操作HBase)

    上节课我们一起简单学习了HBase的一些理论,这节课我们一起学习用java调HBase的接口来操作HBase. 我们首先建一个工程,这里我们还用原始的新建一个lib包.然后我们把下载的hbase-0. ...

  3. 第二十八课:focusin与focusout,submit,oninput事件的修复

    focusin与focusout 这两个事件是IE的私有实现,能冒泡,它代表获得焦点或失去焦点的事件.现在只有Firefox不支持focusin,focusout事件.其实另外两个事件focus和bl ...

  4. 新版标准日本语中级_第二十八课

    语法   1. いや,~:いや是否定的表达方式,与いいえ类似,但いや的语气轻微.也用于否定自己刚刚说出的话.   いえ也一样,但いえ比较有礼貌,男女都可以使用,而いや多为男性使用.此外,除了否定还可以 ...

  5. HLS第二十八课(UG871,接口综合)

    接口的返回值,入口参数,都是需要用pragma约束的. 首先来回顾一下接口. a clock and reset have been added to the design: ap_clk and a ...

  6. 【问链财经-区块链基础知识系列】 第二十八课 区块链如何助力万亿规模的供应链金融蛋糕

    编者按:我国经济已由高速增长阶段转向高质量发展阶段.赊销项下的账期占压给实体经济的发展带了很大的束缚,国家近两年来多次发文鼓励和推动应收账款融资的发展.但传统应收类供应链金融模式,如保理.应收账款质押 ...

  7. python第二十八课——编码小常识

    2.内存和硬盘: 内存:计算机硬件组成部分之一,它是一个容器,用来存储数据:处理数据速度快, 存储数据量小:断电死机数据会丢失,短暂性存储数据 硬盘:计算机硬件组成部分之一,它是一个容器,用来存储数据 ...

  8. 新版标准日本语初级_第二十八课

    语法   1. 名1[人]は 名2[人]に 名3[物]を くれます:表示别人给说话人或者说话人一方的人某物.あげます.もらいます.くれます汉语都是给,但是3者之间的表达角度不同.   例如小野さんは森 ...

  9. JAVA 基础 / 第二十八课:接口与继承 / 如何设计JAVA的接口?

    2018-03-19 在设计LOL的时候,进攻类英雄有两种,一种是进行物理系攻击,一种是进行魔法系攻击.这时候,就可以使用接口来实现这个效果.  接口就像是一种约定,我们约定某些英雄是物理系英雄,那么 ...

最新文章

  1. ASP.NET中的页面指示标识
  2. Netty 高性能之道 - Recycler 对象池的复用
  3. Unix/Linux环境C编程入门教程(41) C语言库函数的文件操作详解
  4. [Android] Implementation vs API dependency
  5. 刚有个做电商的朋友在说,他们想在网上造出品牌销量很容易
  6. [转]Git 撤销操作
  7. 【C++ Primer 第10章】 10.4.1 插入迭代器
  8. 关于NRF24L01模块使用的部分个人总结
  9. 《Objective-C基础教程》学习笔记第九-十章
  10. 编译原理实验二【语法分析程序设计】
  11. 微信浏览器-公众号,实现地图定位
  12. HTML基础——图像标签(img标签)
  13. CSS设置html网页背景图片 CSS设置网页背景颜色
  14. ##gif录制软件——初识GifCam##
  15. 14、系统架构师指南 - 软件项目角色指南系列文章
  16. 员工奖金需要交税吗_定了!年终奖必须这样缴税!国家税务局终于明确。
  17. 【设计模式从青铜到王者】第二篇:UML类图与面向对象编程
  18. 这一次,F1Delta Time 大奖赛来到欧洲
  19. DNA binding motif比对算法
  20. java后台查询手机号码归属地

热门文章

  1. MySQL优化篇:锁机制
  2. vivo亿级微服务 API 网关架构实践
  3. Netflix 开源用于 Spring Boot的 GraphQL 服务框架DGS
  4. 刨根问底,Kafka消息中间件到底会不会丢消息
  5. 这才是微服务拆分的正确姿势,值得学习!
  6. 年薪75万的真实技术面试实践攻略(篇章二)
  7. 饿了么交付中心语言栈转型总结
  8. Service Worker
  9. 项目管理工具到底应该为谁服务?
  10. 19 java程序员面试宝典视频课程之正则表达式