11

如何看待AI杀入斗地主领域,快手DouZero击败344个AI排名第一?未来人类斗地主能斗过AI...

 3 years ago
source link: https://www.zhihu.com/question/470431274
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client
如何看待AI杀入斗地主领域,快手DouZero击败344个AI排名第一?未来人类斗地主能斗过AI吗? - 知乎
Demo试运行(在线版本)
本地无GUI版本试运行

2016年AlphaGo的横空出世,让人开始认识到,人工智能的水平已经可以在很多领域超越人类了。接着2017年,AlphaZero接踵而来,不同于AlphaGo的是,AlphaZero可以从零开始,通过强化学习,在试错过程完成数百万盘自我对弈, 并且可以掌握五子棋,围棋等多种棋类。除此之外,这些年的棋牌AI应用还包括麻将AI Suphx等等。

前面说到的AI可以分为两类:

  • 一类完全信息动态博弈(例如下围棋,井字旗等等)
  • 一种是非完全信息动态博弈(例如打麻将)

人工智能在非完全信息博弈要完全战胜人类,难度很大。在我之前被日报收录的一篇回答 《人工智能已在哪些领域超越了人类的表现? 》里说到,对于非完全信息场内大量的隐藏信息无法看到。过高的随机性影响了算法模型的训练。除了麻将,我们熟悉的斗地主也是属于非完全信息博弈。现在,非完全信息动态博弈的AI又新增一员,DouZero,一个由快手开发的斗地主AI。开发斗地主AI是有难度的,毕竟属于是非完全信息博弈,同时,比起麻将,斗地主又涉及合作,两个农民在不知道对方手牌的情况下进行协作,增加了判别难度。带着好奇心,我看了下DouZero的论文。

DouZero: Mastering DouDizhu with Self-Play Deep Reinforcement Learning​arxiv.org

论文解读

首先必须说,DouZero并不是第一个斗地主AI。之前也有人尝试做了些斗地主AI或者通用牌类AI,有的是基于策略的,有的是基于有监督算法的,也有基于强化学习的,作者在论文里也提到了一些,例如DeltaDou, RLCard等等。DouZero的创新点是什么?论文里给出了答案:「DouZero 不需要任何领域知识或基础动态知识」。DouZero的方法是从零开始通过自我对局来学习(为了对比,项目也提供了通过人类数据训练的模型)。估计这就是叫DouZero而不是什么AlphaDou,因为思路上和AlphaZero一样,所以叫DouZero也许是向AlphaZero致敬吧。

我看了下论文,大概总结下其内容。

摘要是论文的概括。在摘要里,介绍了斗地主的挑战主要是在竞争、合作与非完全信息博弈上,于是团队提出了DouZero,通过深度神经网络、动作编码(action encoding)和平行角色(parallel actors)来增强蒙特卡洛方法。训练的话,采用了一个带4片GPU的服务器,只训练了几天,就可以在botzone上面打败了344个其他斗地主AI,成功登上榜首。

知道了大致的思路后,我们来看看具体的方法。

首先是动作编码。DouZero将所有的牌型编码成 15x4 的由 0和1 组成的矩阵。其中每一列代表一种牌,每一行代表对应牌的数量。

神经网络的话,架构如下:

至于平行角色是什么?DouZero采用多演员(actor)的架构,在单个 GPU 服务器上,用了 45 个actor同时产生数据,最终数据汇集到一个中央训练器进行训练。

传统强化学习使用蒙特卡罗方法。所谓的蒙特卡罗方法就是一种随机模拟,即通过不断的重复实验来估计真实价值。而在DouZero中,引入了Deep Monte-Carlo (DMC)方法。所谓DMC,就是用神经网络替换Q表,并使用均方误差 (MSE) 更新Q网络。

文章第五章给出了很翔实的实验结果。

首先是DouZero与其他斗地主AI的对比,其中WP>0.5(也就是胜率过半)或者ADP>0(得分为正)的都用黑体标出来了。可以看到,DouZero可以说是横扫了其他斗地主AI。

训练速度上,DouZero只要训练两天,胜率就能SL模型(用人类数据训练的模型)。训练10天以上,胜率和得分都能超过DeltaDou,另一个斗地主AI。

论文中还展示了在botzone的比赛数据,可以看到,DouZero基本是所向披靡的。

当然,任何论文都不是完美的。作者也在文章最末尾说了六点可能的下一步工作,包括尝试用ResNet等CNN网络来代替LSTM,在强化学习中尝试Off-Policy学习,尝试农民之间的协作等等。

Demo试运行(在线版本)

DouZero是不是真的这么聪明?让我这个人类玩家试试吧。

一共玩了15局,其中5局作为地主,5局作为地主商家,5局作为地主下家。胜率如下:

之所以我要每个角色都试几遍,是因为每个角色的难度不同,你也可以从上图看出,作为地主上家或者下家时容易赢些。为啥?因为?因为你作为农民,还有一个AI帮助你,而你作为地主,则要单挑两个AI。

当我作为地主时,一盘都没赢过,感觉到了两个AI来吊打我的「屈辱」。即使我把它们的牌翻开来看着打,我依然赢不了。我感觉DouZero的打法是具有全局性的,而不是着眼于当下胜率最大化,但农民之间确实如论文说的,农民之间协作确实缺少了点,有的时候我看到,明明两个农民之间,上家放水下家会赢得更快,结果上家偏要出牌。

其中一局DouZero打得非常精彩,这里给大家展示下过程。为了展示AI的决策过程,我显示了AI的手牌。

首先,我拿到的手牌是非常好的,我连续出了两个三带一(分别是3334和6667)

这个时候DouZero获胜几率已经小于50%了。我乘胜追击,再来一个三带一(88810),这时候,咦,DouZero的获胜概率反而升到了79.55%了,难度我一手好牌打坏了?

DouZero综合考虑后,决定不出,于是我打对5,貌似DouZero的获胜概率降低了点。

出了几个对子后,我手牌变成这样:

虽然看起来我的牌很少,我仅剩3张牌,而对面分别剩11和13张牌。但这个时候,对面或者概率变成了100%,我获胜概率已经是0了。最后结果,我还是输了,而且是只剩一张牌那种。

这一局把我给弄服了。给我感觉,DouZero出牌是毫无情绪的(确实也没有),即使你比它手牌少很多,它也是有信心能赢你。

当然,以我的战绩来评价打斗地主水平也许有失公允,毕竟我不是职业选手,水平确实很一般,希望以后能看到斗地主高手当地主战胜DouZero。

本地无GUI版本试运行

由于在线版本性能有限(尽管我还是输了),于是在clone github repo在本地试试。由于没有本地GPU环境,不敢学官方那样用4块GPU训练几天,只好用官方提供的预训练模型。

官方代码地址:https://github.com/kwai/DouZero, 预训练模型下载地址可以在中文文档里找到。

官方提供了三种模型类型分别是:

  • SL (baselines/sl/): 基于人类数据进行深度学习的预训练模型
  • DouZero-ADP (baselines/douzero_ADP/): 以平均分数差异(Average Difference Points, ADP)为目标训练的Douzero智能体
  • DouZero-WP (baselines/douzero_WP/): 以胜率(Winning Percentage, WP)为目标训练的Douzero智能体,

每种模型分别对应地主,地主上家,地主下家三个位置,共27种组合。如果再加上随机的,RLCard的,组合就更多了。

当然,在命令行下打牌要人类参与就太难了,我们可以运行代码里的evalute.py,来设定三方采用的模型,然后让它们之间对针很多局。这里定个小目标,打它一万局。运行方法就不赘述了,在官方文档里讲得很详细了。

其中,比较值得关注的是DouZero智能体与RLCard智能体的对决。读者也许还不了解RLCard,这里简单介绍下。RLCard是一个开源的卡牌游戏强化学习工具包,如果DouZero能战胜RLCard,那说明DouZero比RLCard「更智能」。

首先是地主采用RLCard,两个农民采用DouZero-ADP,局数是10000局,

python3 evaluate.py --landlord rlcard --landlord_up baselines/douzero_ADP/landlord_up.ckpt --landlord_down baselines/douzero_ADP/landlord_down.ckpt

地主VS农民的胜率比是0.131 : 0.869,可以看到,DouZero-ADP完爆RLCard,得分比为-2.4564 : 2.4564

试试采用DouZero-WP,看看效果

python3 evaluate.py --landlord rlcard --landlord_up baselines/douzero_WP/landlord_up.ckpt --landlord_down baselines/douzero_WP/landlord_down.ckpt

过几分钟,10000局对战就完成了。可以看到,胜率比为0.1024:0.8976,更悬殊了;平均分数差距稍有缩小。

那么,以子之矛,刺子之盾呢?我试试三方都采用DouZero-WP

python3 evaluate.py --landlord baselines/douzero_WP/landlord.ckpt --landlord_up baselines/douzero_WP/landlord_up.ckpt --landlord_down baselines/douzero_WP/landlord_down.ckpt

胜率是农民高一些,看来地主不好当啊。

由于组合太多,这里就不一一试验并展示了。大家也可以试试其他AI组合的对战结果,也许能从中发现一些有趣的发现。

总结

研究了一天,感觉DouZero还是令人惊喜的。

首先是项目上令人惊喜。这是一个有论文有代码的项目,非常友好。提供的代码也是能轻易运行的,并且运行速度不错,我用MacBook Pro跑预训练模型,对战10000局也就三分钟的事。虽然我的条件无法拿出4块GPU训练几天,但这对于实验室来说不算难,有条件的可以用实验室的GPU试试。

其次,效果上也是令人信服。实际对战效果,例如胜率,得分等等,除开牌局的随机性,可以说和论文里描述的基本一致,效果还是不错的。怪不得能杀进botzone天梯第一。

DouZero团队也提出了下一步的优化方法,这里也期待更强的新版本斗地主AI诞生。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK