注:微软研究院的Suphx团队已经对论文进行了详细的解读,这里只是我自己读原论文算法部分的记录,以及对Suphx团队在4月9日的直播中的Q&A部分的摘要。
Suphx(Super Phoenix)是一个主攻4人日本麻将的AI,主要基于深度强化学习进行训练,除此之外还应用了全局奖励预测(global reward predictction)、先知教练(oracle guiding)以及运行时策略适应(run-time policy adaption)等新技术,在最大的日本麻将在线对战平台天凤(tenhou.net)上超过了99%的人类玩家。
麻将是一个不完全信息多人游戏,它的复杂规则、计分方式和隐藏信息使它变成一个充满挑战的AI研究项目:
为了解决这些问题,Suphx使用了5个深度卷积神经网络:舍牌模型(Discard model)、立直模型(Riichi model)、吃模型(Chow model)、碰模型(Pong model)和杠模型(Kong model),每个模型的功能如下表所示:
模型 | 功能 |
---|---|
舍牌模型 | 在通常情况下决定要舍哪张牌 |
立直模型 | 决定是否立直 |
吃模型 | 决定是否吃以及怎么吃 |
碰模型 | 决定是否碰 |
杠模型 | 决定是否杠 |
这些网络先用专业选手的牌谱进行训练,然后被用在深度强化学习中作为策略进行自我对局(self-play)。除此之外还有一个基于规则的模型来决定是否和牌。完整的决策流程见下图:
日本麻将中总共有34张不同的牌,所以Suphx中使用多个 34 × 1 34 \times 1 34×1的通道来表示场上的状态,比如手牌可以用四个通道来编码,如下图所示:
类似的,副露、宝牌以及舍牌顺序也通过这种方式进行编码。分类特征(categorical feature)用全为 0 0 0或 1 1 1的多个通道来编码。整数特征(integer feature)则会被区间化,然后每个区间用全为 0 0 0或 1 1 1的通道来编码。
除了这些直接可见的状态之外,作者还设计了look-ahead特征用来表示打出某一张牌后赢牌向听数和分数,例如使用一个特征来表示打出某张牌后能否在进3张牌后和出12000点。由于日麻中总共有89种面子和34种对子,能和的牌型数量非常多,所以作者没有考虑对手的行为(例如通过舍牌判断是否在做混一色/清一色),只是用深度优先搜索来计算自己和出各种牌型的概率。在这种简化之下,总共构建出100多种look-ahead特征,每种特征都用一个34维的向量来表示。
除了输入和输出维度之外,所有模型的网络结构都差不多,具体结构和维度如下图下表所示。在吃、碰、杠模型中,除了状态特征和look-ahead特征以外,还有对哪些牌吃、碰、杠的信息。另外,这些模型都是没有池化层的,因为每个通道中的每一列都有自己的含义,所以池化之后会导致信息损失。
各模型输入输出维度:
模型 | 输入维度 | 输出维度 |
---|---|---|
舍牌模型 | 34 × 838 34 \times 838 34×838 | 34 34 34 |
立直模型 | 34 × 838 34 \times 838 34×838 | 2 2 2 |
吃模型 | 34 × 958 34 \times 958 34×958 | 2 2 2 |
碰模型 | 34 × 958 34 \times 958 34×958 | 2 2 2 |
杠模型 | 34 × 958 34 \times 958 34×958 | 2 2 2 |
Suphx的学习过程分为三个阶段:
下面详细介绍Suphx中提出的几个算法。
在麻将中,每一场游戏通常由许多局组成,比如天凤中的一场游戏包含8-12局。在每一局游戏的结束后,和牌的选手会获得正分,其他选手则为0分或负分,而在每一场游戏的最后,选手在这场游戏中的每一局的得分会被加起来得到最终得分,并以此计算排名。然而以每一局的得分或者游戏的最终得分来作为强化学习的训练信号都不太合适,因为:
因此为了给强化学习的训练提供一个更有效的训练信号,需要在每一局去估算这场游戏的最终得分。作者提出了一个全局奖励预测器 Φ \Phi Φ来通过这一局以及本场游戏之前所有局的信息来预测最终得分,以此作为强化学习训练信号。在Suphx中, Φ \Phi Φ是一个两层的门控循环单元( G R U \mathtt{GRU} GRU)接两层全连接层构成的循环神经网络,如下图所示:
Φ \Phi Φ的训练数据来自天凤顶尖选手的对局记录,它的训练目标是最小化如下所示的均方误差:
min 1 N ∑ i = 1 N 1 K i ∑ j = 1 K i ( Φ ( x i 1 , x i 2 , ⋯ , x i j ) − R i ) 2 , \min\frac{1}{N}\sum^{N}_{i=1}\frac{1}{K_i}\sum^{K_i}_{j=1}\left(\Phi(x^1_i, x^2_i, \cdots, x^j_i)-R_i\right)^2, minN1i=1∑NKi1j=1∑Ki(Φ(xi1,xi2,⋯,xij)−Ri)2,
其中 N N N是训练数据中的游戏场数, R i R_i Ri是第 i i i场游戏的最终得分, K i K_i Ki是第 i i i场游戏的局数, x i k x_i^k xik是第 i i i场游戏的第 k k k局的特征,包括这一局的分数、此时的累积分数、庄家的位置、本场棒和立直棒。
当 Φ \Phi Φ训练好后,对于有 K K K局的self-play,第 k k k局就会用 Φ ( x k ) − Φ ( x k − 1 ) \Phi(x^k)-\Phi(x^{k-1}) Φ(xk)−Φ(xk−1)作为强化学习训练的奖励。
在麻将中有非常多的隐藏信息,在这种情况下用强化学习来学习策略会非常慢。为了加速训练,作者使用了一个可以获取完全信息的先知智能体(oracle agent)。完全信息包括:
对于一个通常智能体(normal agent,指没有完全信息的agent)来说,只有前三项是可见的。
由于拥有完全信息,oracle agent可以通过强化学习很快精通麻将,问题是怎么让oracle agent来加速normal agent的训练。在这里普通的知识蒸馏(knowledge distillation)的效果并不好,因为一个没有完全信息的normal agent很难去模仿oracle agent的行为。在Suphx中采用的方式是先用完全信息进行训练oracle agent,然后通过drop out的方式逐渐减少完全信息中的特征,慢慢地让oracle agent转变为normal agent。在oracle agent完全转变为normal agent后,还会进行一定轮次的训练。此时学习率会降到之前的 1 / 10 1/10 1/10,并且会拒绝重要性大于某个阈值的state-action对。如果不添加这两个限制,后续的训练就会不稳定,性能也不会获得提升。
在麻将中,人类会在拿到不同的手牌的时候使用不同的策略,比如会在拿到好的起手的时候打得更激进来赢得更多分数,在拿到不太好的起手的时候打得保守一点来避免更大的损失。所以如果可以把离线训练的策略针对起手做一定的适应,那么就很可能可以获得更好的表现。跟围棋或星际争霸不同,蒙特卡洛树搜索(Monte-Carlo tree search,MCTS)在麻将上的表现并不好,因此作者提出了一种新的方法,名为参数化蒙特卡洛策略适应(parametric Monte-Carlo policy adaption,pMCPA)。
当一局麻将开始,agent摸了初始手牌之后,对离线训练的策略按以下方式进行调整:
根据作者的研究, K K K不需要非常大, p M C P A \mathtt{pMCPA} pMCPA也不需要记录本局游戏的统计信息。因为 p M C P A \mathtt{pMCPA} pMCPA是参数化的方法,所以通过 K K K次模拟更新过的策略可以对未见过的状态进行估计,也就是说这种在线适应方法对模型在有限次模拟中学到的知识的泛化有帮助。
详细的训练过程、损失函数定义以及实验结果请参考原论文。
作者团队在4月9日的直播(https://www.bilibili.com/video/BV11z411b7jk )中对论文的技术细节进行了补充,下面是Q&A部分的摘要:
Li, Junjie, et al. “Suphx: Mastering Mahjong with Deep Reinforcement Learning.” ArXiv Preprint ArXiv:2003.13590, 2020. https://arxiv.org/abs/2003.13590
微软中国视频中心, “4月9日直播丨揭秘微软超级麻将AI Suphx背后的技术!”, 2020. https://www.bilibili.com/video/BV11z411b7jk