动手写一个 DQN 的棋牌 AI
导语:深度强化学习是学术界研制游戏 AI 的主流算法。这篇文章我们将用深度强化学习早期代表算法 DQN 算法探索棋牌 AI。
1. 深度强化学习和DQN 算法
机器学习分为三个部分:表示、目标和优化。深度学习 (Deep Learning, DL) 属于表示范畴,能够自动抽取事物的特征,将之表达成计算机能理解数据。强化学习 (Reinforcement Learning, RL) 则属于目标范畴,能够用设定奖励函数和自动探索将模型训练到期望的目标。深度强化学习 (Deep Reinforcement Learning,DRL) 是将深度学习与强化学习结合起来的算法,利用深度学习强大的特征抽取表示能力,利用强化学习的目标能力,从而实现更通用的人工智能。
Deep Q Network (DQN) 是深度学习和传统强化学习算法 Q-Learning 的方法,是深度强化学习早期代表算法之一。Q-Learning 算法其实是状态-动作价值版本的时差学习 (Temporal Difference, TD) 算法。Q-Learning 利用马尔科夫性质,只利用了下一步信息。Q-Learning 让系统按照策略指引进行探索,在探索每一步都进行状态价值的更新,更新公式如下所示。
(1)
s 为当前状态,a 是当前采取的动作,s’ 为下一步状态,a’ 是下一个状态采取的动作,r 是系统获得的奖励,αα\\alpha 是学习率,γγ\\gamma 是衰减因子。在深度学习时代,深度学习和 Q-Learning 的结合,再加上 replay-memory、doubble-network 的技巧,便诞生了 DQN。
2. 棋类游戏和七鬼五二三
棋牌游戏是棋类游戏和牌类游戏的统称。棋类游戏和牌类游戏不同,它们有各自鲜明的特点。棋类游戏是明牌,专业说法是完全信息游戏,典型的棋类游戏有中国象棋、国际象棋和围棋等。牌类游戏是暗牌,专业说法是非完全信息游戏,典型的牌类游戏有斗地主、七鬼五二三、桥牌和德州扑克等。
这次我们要用的游戏是七鬼五二三。在中国各地的七鬼五二三有不同的版本,我们在非完美信息游戏 AI 环境 —— RoomAI 实现的七鬼五二三游戏采用了一位同事(哈大王)家乡的版本:多人使用一副或者多副扑克,一开始随机每人五张牌,牌的大小排列——7、大王、小王、5、2、3、A、K、Q、J、10、9、8、6、4;游戏分为两个阶段,准备阶段和出牌阶段;在准备阶段,玩家出了几张牌补回几张牌.(手上确认一直都是5张牌);在出牌阶段,先打完手上牌的玩家获胜。
RoomAI 是非完美信息游戏 AI 环境。在 RoomAI 中,选手获得游戏环境给出的信息,当前选手选择合适的动作,游戏环境根据该动作推进游戏逻辑;重复上述过程,直到分出胜负;整个过程如下所示。
近年来,人工智能在棋牌游戏 AI 领域进步神速。1997 年,国际象棋首先被计算机系统深蓝攻陷; 2016 年 3 月,棋类游戏的巅峰围棋被计算机系统 AlphaGo 攻破;不想不满一年,2017 年 1 月,计算机系统 Libratus 攻克了德州扑克。连围棋都被攻克了,完全信息的棋类游戏没有什么学术价值了,但非完全信息的牌类游戏还有一些问题值得我们探究。虽然 Libratus 在德州扑克中超越了人类,但只是两位选手对局情况。如果是多人对局的德州,我们就没有办法使用 CRM 了,需要设计不同的算法框架。按照 Tuomas Sandholm 教授本人的观点,那就是一个 “totally different story”。更进一步的情况,某些牌类游戏不仅允许多人对局,还允许或者要求某些选手之间合作。比如,斗地主有三位选手,两位农民对战一位地主。再比如桥牌和四国军棋,两位选手组成一队,两队进行对局。这些情况也是现有没有考虑过的问题。
3. DQN 算法求解七鬼五二三
我们在非完美信息游戏 AI 环境 —— RoomAI 提供的三个玩家的七鬼五二三游戏上开发 DQN 算法,进行实验。为了简单起见,我们只在三个玩家的七鬼五二三开发我们的 AI, 得到的模型不适用于其他个数的七鬼五二三游戏。在 RoomAI 上实现 DQN 时,有两点需要特别注意。1) DQN 算法接收的数据为 s,a,r,s’,其中 s’ 为 s 的下一个状态。但是因为要支持非完美信息游戏,当前玩家出了一个动作之后,当前玩家不知道下一个玩家面对的信息。因此 s’ 只能是当前玩家下一次面对的信息。中间其他玩家的反应可以认为是系统的组成部分。2) DQN 算法接收的数据为 s,a,r,s’,在动作空间固定的情况下,就可以根据公式 1 更新模型。但是在 RoomAI 中,当前玩家的可选动作空间不是固定的。因此需要接受数据 s,a,r,s’,A’,其中 A’ 表示当前玩家可选动作空间,由 RoomAI 的 API 提供。实现一个七鬼五二三的 AI 需要三步。
3.1 第一步,网络结构
动手写一个棋牌 AI 的第一步就是确定网络结构。我们实现的 DQN 如下所示:当前状态 s 和可选动作 a, 分别经过 CNN 网络转换成向量,然后将两个向量拼接起来,最后通过 DNN 得到一个实数值 Q(s,a)。
3.2 第二步,特征工程
第二步是确定特征。我们需要抽取状态和动作的特征。状态特征是 15 * 5 大小的 8 层图片,15 * 5 中每行对应一个点数和每列代表一个花色,花色一共有 4 个正常花色和大小王的虚拟花色。8 层中其中有 4 层是准备阶段启用,另外 4 层是出牌阶段启用。4 层分别是当前的手牌,玩家历史中打出去的牌,上家历史中打出去的牌,下家历史中打出去的牌。动作特征则是 15 * 5 大小的 2 层图片,其中 1 层准备阶段启用,另外 1 层是出牌阶段启用,每层都是牌。
3.2 第三步,奖励函数
第三步是确定奖励函数。这里我们使用了一个很简单的奖励函数:游戏没有结束,奖励等于 -1; 游戏结束了,按照游戏给出的评分计算奖励;RoomAI 给三人的七鬼五二三游戏的评分是,唯一的胜利者 2 分,另外两个失败者得 -1 分。
我们已经将相关的代码放到RoomAI 的 model zoo,感兴趣的同学可以参考。
4. 实验结果和分析
为了进行实验,我们简单设置了两个基线方法:1)简单规则方法和2)随机出牌方法。简单规则方法比随机出牌的方法好一些。根据我们的实验,两人对局的情况下,简单规则方法赢得随机出牌方法的比例是 91.3 %。训练时,三方都是我们的模型,同时进行训练。评价时,一方是我们的模型,另外两方是基线方法。下图就是实验的结果,其中横坐标表示迭代次数(迭代一次相当于跑了 10 局),纵坐标是我们模型胜率。在三个能力相当的模型随机模拟,每个玩家的胜率应该是 33.33..%。即超过 33.33…%,就比相应的基线方法要好。
从上图的结果来看,DQN 的方法能够学习到比随机出牌和简单规则好的 AI。但这些 AI 并没有太强,毕竟这两个基线不是很强。因为我们只是用了最简单的 DQN,网络结构也没有经过优化,特征也没有精细地挑选。如果要进一步加强 AI 的能力,需要更多的工作。这个工作就是验证下 RoomAI 框架能不能支持 AI 的开发,后续就不继续这方面的工作,而是转向其他算法框架解决棋牌 AI 问题。
总体结论:DQN 能学习到一个相对比较好的 AI,但要得到一个比较强大的 AI 还需要更多特征、网络结构和训练目标的优化。
5. 结论
深度强化学习是学术界研制游戏 AI 的主流算法。这篇文章我们将用深度强化学习早期代表算法 DQN 算法探索棋牌 AI。我们利用非完美信息游戏环境 RoomAI 提供的七鬼五二三游戏上,用 DQN 开发 AI。实验表明,DQN 能够取得一定的效果。本文相关代码可以在 Github 上找到,欢迎喜欢的同学们 star。
![](https://jkboy.com/wp-content/uploads/2021/10/Pasted-11.png)