国标麻将 AI 报告

序言

国标麻将是麻将的一种玩法,其规则为中国国家体育总局于 1998 年 7 月所制定,其后在众多国际及国内麻将竞赛中应用。国标麻将为了增加竞技性、减少随机成分,将番种增加至 81 种,并设置为 8 番起和。

由于麻将的随机成分大,且往往具有赌博性质,麻将竞技的普及程度远不如棋类比赛,目前对麻将 AI 的设计的研究也不充分,且以日本麻将为主。

我们从专家系统和深度学习两个角度出发,设计了两个不同的国标麻将 AI,分析了国标麻将 AI 设计的难点。

国标麻将

近年来对博弈游戏的人工智能研究取得了很大进展,尤其在 Atari 游戏和围棋(Go)中,强化学习崭露头角。游戏 AI 对机器学习的研究起到了很大的推动作用。但是这些游戏抽象的模型过于简单,与现实生活中的问题相差较远,很难有更大的作用。

相比之下,麻将给游戏 AI 设计带来了新的挑战:

  • 麻将是 Multi-agent 游戏,非 1v1
  • 麻将是非完全信息博弈,牌堆和其他玩家的手牌不可见
  • 麻将游戏的状态数远大于其他牌类游戏

随时间推移,在世界范围内有各种不同的麻将变体,其中日本麻将比较流行,这里我们研究的是规则有一些区别的国标麻将。

从人类的角度出发,国标麻将可分为两个策略:进攻与防守。

进攻是指玩家以尽快和牌为目标的游戏策略;而防守需要对对手进行建模,评估对手的状态,避免打出可能给对手带来收益的手牌。我们总结国标麻将 AI 需要的能力如下:

  1. 根据当前的手牌状态,决定之后游戏的策略、和牌的目标

    这是国标麻将 AI 设计中最难的一点。给定当前状态,AI 需要决定和牌目标。麻将有很大的的状态空间,AI 可以以一定规则进行搜索并以概率最大(或期望收益最高)的和牌牌型为目标决策。但由于国标麻将 8 番起和的限制和对手行为的不确定性,准确的概率估计变得很难。这个能力比较像 AI 的大局观,对整体局势的把握,对游戏最终目标的估计。

  2. 选择打出的手牌

    打出手牌是一局游戏中出现次数最多的行为,选择打出的手牌也是最基础的能力。这个能力是 AI 的即时决策,AI 应该在(1)的宏观指导下完成即时的决策。

  3. 对吃、碰、杠的选择

    麻将的摸牌比较随机,无法预料会得到什么牌。相比之下, 对吃、碰、杠的选择更加可控,在对手打出需要的牌时,正确地做出选择很重要。与(2)相同,这也是 AI 的即时决策。

  4. 评估对手

    由于防守需要,AI 必须估计对手的状态,推测对手可能需要的牌,并避免打出这些牌。这一点是麻将防守能力的体现。国标麻将败者的负收益至少是-8(非点炮),这使得和牌的收益更高,而即使没有点炮也需要付出代价。所以国标麻将中进攻所处的地位更高,防守能力更不重要。

专家系统

在设计基于学习方法的 AI 前,我们先编写了简单的基于规则的 AI 作为 baseline.

这个 AI 没有考虑防守,宏观策略由一个手牌估值函数确定,选择打出手牌、吃、碰、杠都基于这个估值函数。估值函数表示手牌与构成四个顺子或刻子和一对将牌的接近程度。

将 42 种牌分别编码到一个整数,靠近的牌的编码距离为 1.然后可以将手牌编码为 3k+23k+23k+2 个整数。

假设手牌为s0,s1,s2,..,s3k+1s_0,s_1,s_2,..,s_{3k+1}s0​,s1​,s2​,..,s3k+1​,估值函数fff定义如下:

f(S)=maxπΣi=0k−1g(sπ(3i),sπ(3i+1),sπ(3i+2))+h(sπ(3k),sπ(3k+1))f(S) = max_{\pi}\Sigma_{i=0}^{k-1}g(s_{\pi(3i)},s_{\pi(3i+1)},s_{\pi(3i+2)})+h(s_{\pi(3k)},s_{\pi(3k+1)}) f(S)=maxπ​Σi=0k−1​g(sπ(3i)​,sπ(3i+1)​,sπ(3i+2)​)+h(sπ(3k)​,sπ(3k+1)​)

其中π\piπ是一个排列

g(a,a+1,a+2)=g(a,a,a)=3g(a,a+1,b)=g(a,a+2,b)=0h(a,b)=1a==bg(a,a+1,a+2)=g(a,a,a)=3 \\ g(a,a+1,b)=g(a,a+2,b)=0\\ h(a,b)=1_{a==b} g(a,a+1,a+2)=g(a,a,a)=3g(a,a+1,b)=g(a,a+2,b)=0h(a,b)=1a==b​

估值函数fff将手牌每 3 张分成一组,对顺子和刻子有 3 分的奖励,对可能形成顺子的牌奖励两分,剩余的两张牌形成一堆将牌则奖励 2 分。

对估值函数的计算就是一个约束优化问题,我们采用了随机初始化然后局部贪心的求解方法,而且输入规模比较小,求最优解的效率很高。具体算法可见代码。

这样

可以和牌⇔f(S)=3k+2可以和牌\Leftrightarrow f(S)=3k+2 可以和牌⇔f(S)=3k+2

从之前探讨的麻将 AI 能力的角度来看:

  1. 对局势的评价由估值函数反映,和牌目标为与使fff最大化的划分最接近的和牌牌型
  2. 选择打出手牌由估值函数决定,AI 从对ggg和hhh没有贡献的牌中选择一张打出
  3. 对吃、碰、杠的选择同样由估值函数决定,如果动作可以增大估值函数,那么进行操作
  4. 该 AI 没有对防守的考虑

总的来说,这个 AI 的规则就是向和牌一步贪心,在凑牌型方面效果还不错。但是 AI 的弱点也比较明显:没有考虑 8 番起和。这经常导致牌型够和但是番数不够的情况。另一点是没有考虑防守,可能容易点炮。

在这些约束下,这个简单的专家系统的 AI 表现并不好是可以预见的,但是这个工作给了我们一个 baseline–基于这个简单规则的 AI 的大致水平。

深度学习

由于我们本身并不擅长国标麻将,对国标麻将的理解基本不超过规则,之后我们采取了深度学习的方法训练一个 Agent.我们利用人类对局数据进行监督学习,使 AI 在不同情况下做出正确的决策。深度学习得到的模型没有我们认为的干预,只要提取的特征、训练数据和模型强度是充分大的,AI 就会具有应该的进攻和防守能力。

数据采集

我们选取了助教提供的 50 万局人类玩家的对战数据,对局的质量未知,通过只选取其中和牌人的行为序列,可以使数据质量有一些保证。对每个对局,我们按时序恢复了对局情况,记录和牌人的每一个决策和决策时的可观测状态。

特征提取

麻将对局中,玩家的可观测状态有:自己的手牌,四个玩家的副露(即进行吃、碰或明杠后展示出来的牌),以及所有玩家打出过的牌。我们认为,相比之下,行为的时许带来的影响并不大(存在一定影响),为了简化输入,便没有考虑时序信息。所以只需对这些数据进行统计。

对于手牌、副露和打出的牌,我们都用一个 34 维的向量统计每张牌(不考虑花牌)的对应数目,这样得到 9 个 34 维的向量。为了强化吃、碰、杠的信息,我们增加了每个玩家已经进行的吃、碰、杠操作数,共 3∗4=123*4=123∗4=12 维。再加上上一个玩家打出的牌(进行吃、碰、杠决策时需要使用)的 one-hot 表示,输入一共 352 维。

模型设计

我们对打牌、吃、碰、杠各设计了一个分类器,打牌的操作是选择一张牌打出,所以是 34 分类器(然后过滤自己没有的牌),碰和杠都是 2 分类器,而选择吃时吃的牌的相对位置有 3 种,所以吃是 4 分类器。

对于暗杠和补杠,我们发现人类对局中通常会在可以杠时留一段时间再杠,这样会产生不平衡的 0-1label,所以我们决定这部分使用自定义规则决策。

模型的结构是简单的多层前馈神经网络(FFN)。由于输入维数比较小,为了避免过拟合,最开始我们采用的网络较小,参数比较少。之后加入了过拟合的措施后,我们增大了网络,效果有一些提升。

模型细节

这里只描述打牌模型的结构,其他几个模型结构相似,只是参数更少。

我们的模型结构与下图相似(各层大小略有不同):

为防止过拟合,受到罗睿轩同学的启发,我们采用 Batch Normalization 和 Dropout(0.3)。

  • 模型结构:318 -> 1024 -> 1024 -> 1024 -> 1024 -> 1024 -> 100 -> 34
  • 代价函数:CrossEntropy
  • 优化器:AdamOptimizer(lr=0.001, betas=(0.9, 0.999))
  • Batchsize:1024
  • Epochs:400

最后在训练集上的准确率为 70.3%,在测试集上的拟合结果为 69%,拟合效果良好。

其他工作

在这些工作完成后,考虑到杠的训练数据较少,我们又尝试了迁移学习,将打牌模型的前几层权重迁移到杠模型中,但结果并没有显著提升。

实验结果

基于专家系统的 AI 在天梯表现惨淡,偶尔能和几盘,经常点炮。

最初训练出的的深度学习模型(模型小,参数少)表现稍好,但也不佳。下图是模拟赛 7 中的截图。我们的 AI 排在 23 名和 25 名,这个 AI 在 11 次模拟赛中平均得分为-206,基本处于最后几名。

在分析了一些对局之后,我们认为 AI 的总体表现尚可,大多数时候的决策都是合理的,因此我们认为目前的方法是正确的,训练集和提取的特征有效,缺陷在于决策准确率还不够高。

之后我们增加了防止过拟合的方法,增大了模型,在测试集上的准确率提升了 2.5%。但这 2.5% 的提升,在后来的比赛中发挥了明显的效果,在 44 人的最终比赛中获得了 16 名:

这再次验证了我们的想法,人类对局数据是有效的,如果能较好地拟合人类玩家的决策,AI 的水平也会有一些提升。

Python实现基于专家系统和深度学习国际麻将AI相关推荐

  1. python 旧照片_DeOldify黑白旧照片着色神器:基于NoGAN的深度学习来实现旧照着色还原...

    我们特别感谢DeOldify的开发者jantic,该项目处于持续维护状态,参与贡献人数已有25人,使用一种NoGAN的神经网络来训练,最终使得复原的照片毛刺几乎完全消失.人物皮肤更为自然,效果逼近真实 ...

  2. 使用RTX3080显卡搭建基于Pycharm+Python+Cuda+cuDNN+TensorFlow的深度学习开发环境

    本文链接:https://blog.csdn.net/tjhyx2012/article/details/112955582 作为一名新手,也是出于兴趣,我通过查找有关资料,使用RTX3080显卡搭建 ...

  3. python实现人脸口罩检测(基于opencv和深度学习两种方法)

    人脸口罩检测GUI系统(基于opencv和深度学习两种方法对比) 由于疫情的影响,人脸口罩检测系统的开发成为很多人争相开发的一种算法.很多公司或者个人都开源了他们很多的代码或者SDK.大家在GitHu ...

  4. 语义分割:基于openCV和深度学习(二)

    语义分割:基于openCV和深度学习(二) Semantic segmentation in images with OpenCV 开始吧-打开segment.py归档并插入以下代码: Semanti ...

  5. 语义分割:基于openCV和深度学习(一)

    语义分割:基于openCV和深度学习(一) Semantic segmentation with OpenCV and deep learning 介绍如何使用OpenCV.深度学习和ENet架构执行 ...

  6. 基于keras的深度学习基本概念讲解

    基于keras的深度学习基本概念讲解 Tensorflow1.0正式发布,谷歌首届Tensorflow开发者大会在山景召开,深度学习迎来新的高潮和狂欢.随着深度学习框架的普及和推广,会有越来越多人加入 ...

  7. 基于AI的计算机视觉识别在Java项目中的使用(三) —— 搭建基于Docker的深度学习训练环境

    深度学习在哪里? 我们已然生活在数字时代,一天24小时我们被数字包围.我们生活中的方方面面都在使用数字来表达.传递.存储.我们无时无刻不在接收数字信息,而又无时无刻不在生产数字信息. 在数字世界中,可 ...

  8. 基于机器学习与深度学习的金融风控贷款违约预测

    基于机器学习与深度学习的金融风控贷款违约预测 目录 一.赛题分析 1. 任务分析 2. 数据属性 3. 评价指标 4. 问题归类 5. 整体思路 二.数据可视化分析 1. 总体数据分析 2. 数值型数 ...

  9. python中如何移动图形工作站_六招教你用Python分分钟构建好玩的深度学习应用

    原标题:六招教你用Python分分钟构建好玩的深度学习应用 导读]深度学习是近来数据科学中研究和讨论最多的话题.得益于深度学习的发展,数据科学在近期得到了重大突破,深度学习也因此得到了很多关注.据预测 ...

最新文章

  1. python与php8-python和php对比
  2. 为什么开了数据不能上网_Doinb和LCK选手双排为什么不能开语音?Doinb深夜道出实情...
  3. 好看的按钮组件_一个能决定命运的按钮,你敢来挑战吗?
  4. 如何从开始掌控会议?
  5. Android 第十六课 使用LitePal查询数据
  6. JS之Date对象和获取系统当前时间
  7. 学习-【前端】-angularjs基本框架以及向服务器发送请求的方法
  8. MYSQL之数据库高级SQL语句详细操作步骤详情介绍
  9. 视频教程-计算机二级(VB)-计算机等级考试
  10. c语言练习之路4之浙大版《C语言程序设计实验与习题指导(第3版)》题目集
  11. 终端上网行为管理开源框架(柏晓技术deskvideosys)
  12. Hexo主题修改Next.Mist
  13. OpenVINO常用PythonAPI详解与演示
  14. houdini 求出曲线的法向 切线以及副法线
  15. 友盟第三方QQ登录分享
  16. 04-再探JavaScript
  17. 图片文字制作视差效果
  18. Pikachu靶场-SQL注入-搜索型注入过关步骤
  19. 智慧交管大屏可视化决策系统
  20. srm供应商关系管理系统

热门文章

  1. 如何压缩jpg文件大小?jpg照片怎么压缩大小?
  2. 有些企业为什么喜欢在香港上市?
  3. python房地产成本管理软件_房地产项目成本测算软件
  4. VScode安装Svn插件
  5. VS2017 VisualSVN过期用不了问题
  6. 关于取消计算机系统集成资质,系统集成资质取消了吗
  7. Fedora32 安装搜狗拼音中文输入法/安装 + FCITX 输入法 Rime/拼音
  8. vue echarts使用map地图 引入china.js报错Cannot read property ‘echarts’ of undefined
  9. c语言单招试题,高职单招数学模拟试题
  10. (一)基于Session的认证方式