强化学习笔记:AlphaGo(AlphaZero) ,蒙特卡洛树搜索(MCTS)

1 AlphaZero的状态

        围棋的棋盘是 19 × 19 的网格,可以在两条线交叉的地方放置棋子,一共有 361 个可以放置棋子的位置,因此动作空间是 A = {1,  · · , 361}。比如动作 a = 123 的意思是在第 123 号位置上放棋子。

  • AlphaGo Zero 使 用 19 ×19 ×17 的张量表示一个状态。
    • 张量每个切片 (Slice) 是 19 ×19 的矩阵,对应 19 ×19 的棋盘。
      • 一个 19 ×19 的矩阵可以表示棋盘上所有黑子的位置。如果一个位置上有黑子,矩阵对应的元素就是1,否则就是 0。
      • 同样的道理,用一个 19 ×19 的矩阵来表示当前棋盘上所有白子的位置。
    • 张量中一共有 17 个这样的矩阵
      • 记录最近 8 步棋盘上黑子的位置,需要 8 个矩阵。
      • 同理,还需要 8 个矩阵记录白子的位置。
      • 还另外需要一个矩阵表示该哪一方下棋;
        • 如果该下黑子,那么该矩阵元素全部等于 1
        • 如果该下白子, 那么该矩阵的元素全都等于 0

于是我们便有了类似的策略网络和价值网络 

 

 

2 蒙特卡洛树搜索 MCTS

这一小节假设此时已经训练好了策略网络和价值网络
AlphaGo 真正跟人下棋的时候,做决策的不是策略网络或者价值网络,而是蒙特卡洛树搜索 (Monte Carlo Tree Search, MCTS)
MCTS 不需要训练,可以直接做决策

2.1 基本思想

        和人类下棋类似,AlphaGo在做决策前,需要在“大脑里”做预判,确保几步以后很可能会占优势。如果只根据当前格局做判断,不往前看,是很难获胜的。

  • MCTS 的基本思想就是向前看,模拟未来可能发生的情况,从而找出当前最优的动作
    • AlphaGo 每走一步棋,都要用 MCTS 做成千上万次模拟,从而判断出哪个动作的胜算最大。

  • 做模拟的基本思想如下。
    • 假设当前有三种看起来很好的动作。每次模拟的时候 从三种动作中选出一种,然后将一局游戏进行到底,从而知晓胜负。(只是计算机做模拟 而已,不是真的跟对手下完一局。)
    • 重复成千上万次模拟,统计一下每种动作的胜负频率, 发现三种动作胜率分别是 48%56%52%
    • 那么 AlphaGo 应当执行第二种动作,因为它的胜算最大。

以上只是 MCTS 的基本想法,实际做起来有很多难点需要解决。

2.2 四个步骤

        MCTS 的每一次模拟选出一个动作 a ,执行这个动作,然后把一局游戏进行到底,用胜负来评价这个动作的好坏。
        MCTS 的每一次模拟分为四个步骤:选择 (Selection) 、扩展 (Expansion)、求值 (Evaluation) 、回溯 (Backup)

2.2.1 选择

        观测棋盘上当前的格局,找出所有空位,然后判断其中哪些位置符合围棋规则;每个符合规则的位置对应一个可行的动作。

        每一步至少有几十、甚至上百个可行的动作;假如挨个搜索和评估所有可行动作,计算量会大到无法承受。

        虽然有几十、上百个可行动作,好在只有少数几个动作有较高的胜算。第一步—— 选择——的目的就是找出胜算较高的动作,只搜索这些好的动作,忽略掉其他的动作。

那么,如何判断动作 a 的好坏呢? 

有两个指标:第一,动作 a 的胜率;第二,策略网络给 动作 a 的“评分”(选择这个动作的概率)。用下面这个分值评价 a 的好坏:
  •   η 是个需要调的超参数
  • N ( a ) 是动作 a 已经被访问过的次数。
    • 初始的时候,对于所有的 a,令 N(a) 0。
    • 动作 a 每被选中一次,我们就把 N(a) 加一:N(a) N(a) + 1 
  • Q ( a ) 是之前 N ( a ) 次模拟算出来的动作价值,主要由胜率和价值函数决定。
    • Q ( a ) 的初始值是 0
    • 动作 a 每被选中一次,就会更新一次 Q ( a ) ;如何更新会在第四步说明。
可以这样理解公式 ( 18.1 )
  • 如果动作 a 还没被选中过,那么 Q(a) N(a) 都等于零,因此可得
    • 也就是说完全由策略网络评价动作 a 的好坏。
  • 如果动作 a 已经被选中过很多次,那么 N ( a ) 就很大,导致策略网络在 score( a ) 中的权重降低。当 N ( a ) 很大的时候,有score(a) \approx Q(a)
    • 此时主要基于 Q ( a ) 判断 a 的好坏,而策略网络已经无关紧要。
  • 系数\frac{1}{1+N(a)}的另一个作用是鼓励探索,也就是让被选中次数少的动作有更多的机会被选中。假如两个动作有相近的 Q 分数和 π 分数,那么被选中次数少的动作的score 会更高。
MCTS 根据公式 ( 18.1 ) 算出所有动作的分数 score( a ) 。 MCTS 选择分数最高的动作。
18.4 的例子中有 3 个可行动作,分数分别为 0 . 4 0 . 3 0 . 5
第三个动作分数最高,会被选中。——>这一轮模拟会执行这个动作(只是模拟而已,不是 AlphaGo 真的走一步棋)。

 

 2.2.2 扩展

把第一步选中的动作记作 a t ,它只是个假想的动作, 只在“模拟器”中执行,而不是 AlphaGo 真正执行的动作。
AlphaGo 需要考虑这样一个问题:假如它执行动作 a t ,那么对手会执行什么动作呢?
AlphaGo 可以“推己及人”:如果 AlphaGo 认为几个动作很好,对手也会这么认为。
所以 AlphaGo 用策略网络模拟对手, 根据策略网络随机抽样一个动作:

 此处的状态 s是站在对手的角度观测到的棋盘上的格局,动作 at 是(假想)对手选择的动作。

18.5 的例子中对手有四种可行动作, AlphaGo 用策略网络算出每个动作的概率值,然后根据概率值随机抽样一个对手的动作,记作 a t 。假设根据概率值 0 . 1 , 0 . 3 , 0 . 2 , 0. 4 做随机抽样,选中第二种动作

从 AlphaGo 的角度来看,对手的动作就是 AlphaGo 新的状态。

 

AlphaGo 需要在模拟中跟对 手将一局游戏进行下去,所以需要一个模拟器(即环境)。
在模拟器中,AlphaGo 每执行一个动作a_k,模拟器就会返回一个新的状态s_{k+1}

想要搭建一个好的模 拟器,关键在于使用正确的状态 转移函数 p(s_{k+1}|s_k,a_k);如果状态转移函数与事实偏离太远,那么用模拟器做 MCTS 是毫无意义的。
AlphaGo 模拟器利用了 围棋游戏的对称性:AlphaGo 的策略, 在对手看来是状态转移函数;对
手的策略,在 AlphaGo 看来是状态转移函数。
最理想的情况下,模拟器的状态转移函数是对手的真实策略;
然而 AlphaGo 并不知道对手的真实策略。
AlphaGo 退而求其次,用 AlphaGo 自己训练出的策略网络 π 代替对手的策略,作为模拟器的状态转移函数。

 

2.2.3 求值

从状态s_{k+1}开始,双方都用策略网络 π 做决策,在 模拟器中交替落子,直到分出胜负。
当这局游戏结束时,可以观测到奖励 r 。如果 AlphaGo 胜利,则 r = +1 ,否则 r = 1

 

回顾一下,棋盘上真实的状态是s_t,AlphaGo 在模拟器中执行动作 a_t,然后模拟器中的对手执行动作a'_t,带来新的状态s_{t+1}。状态 s_{t+1}越好,则这局游戏胜算越大。
  • 如果 AlphaGo 赢得这局模拟 (r = +1),则说明s_{t+1}可能很好;如果输了 (r = 1)则说明s_{t+1}可能不好。因此,奖励 r 以反映出s_{t+1} 的好坏。
  • 还可以用价值网络 v 评价状态s_{t+1}的好坏。价值 v(s_{t+1}; w) 越大,则说明状s_{t+1}越好。

奖励 r 是模拟获得的胜负,是对s_{t+1}很可靠的评价,但是随机性太大。
价值网络的评估 v (s_{t+1}; w )没有 r 可靠,但是价值网络更稳定、 随机性小。
——>AlphaGo 的解决方案是把奖励 r 与 价值网络的输出 v(s_{t+1}; w)取平均,作为对状态s_{t+1}的评价

 

 2.2.4 回溯

第三 步——求值——算出了第 t + 1 步某一个状态的价值,记作 V (s_{t+1})
每一次 模拟都会得出这样一个价值,并且记录下来。
模拟会重复很多次,于是第 t + 1 步每一种状态下面可以有多条记 录;如图 18.8 所示。

 

t 步的动作 at 下面有多个可能的状态(子节点),每个状态下面有若干条记录。把 a t 下面所有的记录取平均,记作价值 Q( a t),它可以反映出动作 a t 的好坏。
在图 18.8 中, a t 下面一共有 12 条记录, Q( a t) 是 12 条记录的均值。
给定棋盘上的真实状态 s t ,有多个动作 a 可供选择。对于所有的 a ,价值 Q ( a ) 的初始值是零。
动作 a 每被选中一次(成为 a t ),它下面就会多一条记录,我们就对 Q ( a ) 做一次更新。

2.3 MCTS决策

 

上一小节讲解了单次模拟的四个步骤,注意,这只是单次模拟而已。 MCTS 想要真正做出一个决策(即往真正的棋盘上落一个棋子),需要做成千上万次模拟。在做了无数次模拟之后,MCTS 做出真正的决策:
此时 AlphaGo 才会真正往棋盘上放一个棋子。
为什么要依据 N ( a ) 来做决策呢?
在每一次模拟中,MCTS 找出所有可行的动作{a}, 计算它们的分数 score( a ) ,然后选择其中分数最高的动作,然后在模拟器里执行。
如果某 个动作 a 在模拟中胜率很大,那么它的价值 Q ( a ) 就会很大,它的分数 score( a ) 会很高,
于是它被选中的几率就大。
也就是说如果某个动作 a 很好,它被选中的次数 N ( a ) 就会 大。

 当观测到棋盘上当前状态 stMCTS 做成千上万次模拟,记录每个动作 a 被选中的次数 N(a),最终做出决策 at = argmaxa N(a)

到了下一时刻,状态变成了s_{t+1}MCTS 把所有动作 a Q(a)N(a) 全都初始化为零,然后从头开始做模拟,而不能利用上一次的结果。

【个人推测,是很难有和St中模拟的一模一样state的了,因为哪怕你当前棋谱是一样的,过去几个片段的棋谱也不可能一样】

 

AlphaGo 下棋非常“暴力”:每走一步棋之前,它先在“脑海里”模拟几千、几万局, 它可以预知它每一种动作带来的后果,对手最有可能做出的反应都在 AlphaGo 的算计之内。

 3 训练策略和价值网络

3.1 AlphaGo 2016 版本的训练

  • AlphaGo 2016 版的训练分为三步:
    • 第一,随机初始化策略网络 π(a|s; θ) 之后,用行为克隆 (Behavior Cloning) 从人类棋谱中学习策略网络;
    • 第二,让两个策略网络自我博弈, REINFORCE 算法改进策略网络;
    • 第三,基于已经训练好的策略网络,训练价值网络 v(s; w)

!!AlphaGo 没有使用MCTS!!

3.1.1 行为克隆

        一开始的时候,策略网络的参数都是随机初始化的。假如此时直接让两个策略网络自我博弈,它们会做出纯随机的动作。它们得随机摸索很多很多次,才能做出合理的动作。假如一上来就用 REINFORCE 学习策略网络,最初随机摸索的过 程要花很久。

        AlphaGo 用行为克隆训练策略网络 π(a|s; θ)模仿学习笔记:行为克隆_UQI-LIUWJ的博客-CSDN博客_行为克隆

··        设361维的向量

         是策略网络的输出

        设\bar{a_k}是对动作 a_k的 One-Hot 编码。

        函数H(\bar{a_k},f_k)是交叉熵,衡量\bar{a_k}和fk的差别。

        行为克隆可以描述为

       这可以想象成分类问题,用梯度下降实现 

 

行为克隆得到的策略网络模仿 高手的动作,可以做出比较合理的决策。它在实战中可以打败业余玩家,但是打不过职业玩家。(因为没有exploration)

为了克服行为克隆的缺点,还需要继续用强化学习训练策略网络。在行为克隆之后再做强化学习改进策略网络,可以击败只用行为克隆的策略网络,胜算是 80%

3.1.2 REINFORCE 训练策略网络

  • AlphaGo 让策略网络 做自我博弈,用胜负作为奖励,更新策略网络。
    • 博弈的双方是两个策略网络,一个叫做 “玩家”,用最新的参数,记作 θnow
    • 另一个叫做“对手”,它的参数是从过时的参数中随机选出来的,记作 θold
    • “对手”的作用相当于模拟器(环境)的状态转移函数,只是陪玩。
    • 训练的过程中,只更新“玩家”的参数,不更新“对手”的参数。

 

        让“玩家”和“对手”博弈,将一局游戏进行到底,假设走了 n 步。游戏没结束的时候,奖励全都是零:
         游戏结束的时候,如果“玩家”赢了,奖励是 r_n= +1 ,于是所有的回报都是 +1:

        

         游戏结束的时候, 如果“玩家”输了,奖励是 r_n= = 1,于是所有的回报都是 - 1:
        

 

回顾一下REINFORCE的参数更新公式 

3.1.3 训练价值网络

 价值网络 v(s; w) 是对状态价值函数V_\pi(s)的近似,用于评估状态 s 的好坏。

在完成第二步——训练策略网络 π——之后,用 π 辅助训练 v

虽然 此处有一个策略网络 π 和一个价值网络 v但这不属于 Actor-Critic 方法:此处先训练 π,再训练 v,用 π 辅助训练 v;而 Actor-Critic 则是同时训练 π v,用 v 辅助训练 π

        让训练好的策略网络做自我博弈,记录状态—回报二元组(s_k,u_k),存到一个数组里。
        自我博弈需要重复非常多次,把最终得到的数据集记作 \{(s_k,u_k)\}_{k=1}^m
        根据定义, V_\pi(s)是对回报的期望
        

        而  价值网络 v(s; w) 是对状态价值函数V_\pi(s)的近似,所以我们希望用v(s;w)来拟合uk 

于是我们定义回归问题

这也可以用梯度下降实现 

 3.2 AlphaGo Zero 版本的训练

AlphaGo Zero 2016 版本的最大区别在于训练策略网络 π ( a | s ; θ ) 方式。
训练 π 的时候,不再从人类棋谱学习,也不用 REINFORCE 方法,而是向 MCTS 学习。
其实可以把 AlphaGo Zero 训练 π 的方法看做是模仿学习,被模仿对象是 MCTS

3.2.1 自我博弈

MCTS 控制两个玩家对弈。每走一步棋, MCTS 需要做成千上万次模拟,并记录下每个动作被选中的次数 N ( a )

 

设当前是 t 时刻,真实棋盘上当前状态是 s t
现在执行 MCTS ,完成很多次模拟,得到 361 个整数(每种动作被选中的次数):

 

对这些 N 做归一化,得到的 361 个数,它们相加等于 1 ;把这 361 个数记作 361 维的向量:
设这局游戏走了 n 步之后游戏分出胜负;奖励r_n要么等于 +1 ,要么等于 1 ,取决于游 戏的胜负

在游戏结束的时候,得到回报u_1=\cdots=u_n=r_n。记录下这些数据:

 

用这些数据更新策略网络 π 和价值网络 v ;对 π v 的更新同时进行。

3.2.2 更新策略网络

 把 MCTS 的决策作为目标,让 π 去模仿。这是行为克隆,被模仿的对象是MCTS。

我们希望 π 做出的决策

尽量接近pt,也就是希望交叉熵H(p_t,f_t)尽量小

定义优化问题:
用梯度下降更新参数:

 

3.2.3 更新策略网络

训练价值网络的方法与 AlphaGo 2016 版本基本一样,都是让 v ( s t ; w ) 拟合回报 u t

 

 3.2.4 整体训练流程

 

随机初始化策略网络参数 θ 和价值网络参数 w 。然后让 MCTS 自我博 弈,玩很多局游戏;每完成一局游戏,更新一次 θ w。训练的具体流程就是重复下面 三个步骤直到收敛:

 

  • 11
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
基于蒙特卡洛树搜索 (Monte Carlo Tree Search, MCTS) 算法是一种用于决策问题的启发式搜索算法。MCTS 在不完全信息和高复杂度的问题中具有很好的效果。下面将介绍 MCTS 算法的 Java 版实现。 MCTS 算法的主要流程如下: 1. 创建一个根节点,表示当前的游戏状态。 2. 重复以下步骤,直到时间或迭代次数达到上限: a. 选择最有价值的子节点。从根节点开始,递归地选择子节点,直到找到一个未完全探索的节点。 b. 扩展选择的节点。根据游戏规则,生成该节点所有的合法子节点,并将其加入到树中。 c. 随机模拟选择节点的子节点。从扩展的子节点中随机选择一个,并进行模拟。直到游戏结束,得到一个模拟结果。 d. 更新选择节点和其祖先节点的价值。根据模拟结果,更新选择节点及其祖先节点的胜利次数和访问次数。 3. 选择最优的子节点作为下一步的决策。 在 MCTS 的实现中,主要涉及以下几个关键的类和方法: 1. Node 类:表示搜索树的节点,包含节点的游戏状态、访问次数和胜利次数等信息。 2. Selection 方法:通过选择最有价值的子节点来进行节点的选择。 3. Expansion 方法:扩展选中的节点,生成其所有合法的子节点。 4. Simulation 方法:随机模拟选中节点的子节点进行游戏,得到模拟结果。 5. Backpropagation 方法:根据模拟结果,更新节点和其祖先节点的访问次数和胜利次数。 6. BestChild 方法:选择最优的子节点作为下一步的决策。 通过以上关键步骤和方法的结合,可以实现 MCTS 算法的 Java 版本。使用该版本,可以在不完全信息和高复杂度问题上进行决策。例如,在棋类游戏中,MCTS 算法可以从当前局面搜索出最有希望的下一步,并进行决策。 总结而言,基于蒙特卡洛树搜索 (MCTS) 算法的 Java 版实现,通过节点的选择、扩展、模拟和回溯等关键步骤,可以用于解决复杂的决策问题。这种算法在游戏、人工智能等领域具有广泛的应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UQI-LIUWJ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值