浅谈基于游戏AI的机器学习(一)

2,623 阅读4分钟

背景

这一个学期参加了学校的 Java 课程,任务是用 Java 建一个可以玩的 Patchwork(一个德国的棋类游戏)。同时,也涉及到要建一个可以和玩家互殴,啊不,对战的AI角色。借此机会,我对游戏中的机器学习、增强学习进行了一些了解与尝试。了解了早期 AlphaGo 版本(是的,在快做完 AI 的时候,ZERO 的论文出来了……)的大概运行原理及算法,在这里与大家分享。
这里是游戏介绍,可能需要梯子

关于游戏里的 AI

开始的时候对于如何设计 AI 并没有太多的头绪,老师也只是提示可以用 Reinforcement Learning,也就是增强学习,或者 Minimax-Tree 及 Alphabeta prunning(AlphaBeta 剪枝)。这算是对于很多简单游戏比较有效的一种决策方式。不过,Patchwork 这个游戏虽然没有围棋的搜索空间那么大,却也大约达到了 2^30 左右的大小,简单的树搜索是和剪枝是明显不能够达到很好的决策效果的。

偶然间,我在 StackOverflow 看到了这个回答。简而言之,就是说很多游戏的 AI 并不一定使用的是机器学习方法来完成的,而是选择了成本相对较小的有限状态机,以 CS 为栗子,一个通用型的 AI 可以这样设计:我们将 AI 按状态进行设计,每个状态里面去封装一些动作。这样,简单一些的话我们可以有:巡逻,警戒,战斗,逃跑四个状态。对于这些状态,我们可以设计出相应 AI 需要做的事情,比如射击,躲避,跑路等等。同时,我们还需要设计好 state transaction,也就是状态转换的判断标准。例如听到周围有脚步声的时候,AI 从巡逻状态变为警戒状态;血量低于1/3的时候,AI 由战斗状态切换为逃跑。这样一来,一个简单而有效的 AI 就设计好了,它的代码量和计算量显然要比机器学习得到的 AI 要少很多,而且看起来也不会太蠢。这,是不需要机器学习相关算法时的 AI 设计方法之一。

接着,我们回到我所做的 Patchwork 这个游戏上。在通常解决问题之前,我们往往需要对这个问题进行分类,或者说,模型匹配,才能决定使用哪种算法。
信息完善程度来说,Patchwork 是一个信息完全的游戏,相似的是大部分棋类游戏都是信息完全的游戏,而与之相反的是牌类游戏,一般来说是信息不完全的,即玩家不能够完全了解整个游戏的所有状态信息。
增强学习的角度来说,我认为这是一个非模型(modeless)的游戏,即没有清晰确定的反馈在最初阶段。这一点会在后面展开。

从游戏到机器学习

这里有一个转化对于初次接触人工智能相关的人们来说很重要,就是如何将游戏,博弈转化为可以使用机器进行计算的东西。

  1. 局面 -> 状态(State) -> 树节点(Node)
    局面即游戏每一回合的局面,而状态则指游戏棋盘上的状态,这里还有两个玩家的状态(所持的纽扣数量,特殊纽扣数量等)。局面是一个笼统的概念,而状态,则是可以用数字表示的东西。树节点,则是进一步抽象化之后,所得到的数据结构的一部分。
  2. 下棋 -> 决策(action) -> 树枝(Branch)
    每一次的决策之后,玩家实际上进行的是一次状态的转换,例如 A(0) 代表得 0 分, A(1) 代表得 1 分,小明下了一步棋之后得了一分(某个未知的棋类游戏),那么他实际上发生的变化是从状态 A(0) 变为了 A(1)。使得状态转移的称为决策,而从一个树节点访问至另一个树节点,需要的是经过一个树枝。

这样,我们就完成了从游戏,博弈到树的转化。而获得一个游戏的胜利,也对应到了如何搜索到相应的叶子节点。所以简而言之,很多博弈的问题实际上是如何高效地搜索这颗树。

*:对于还记得离散数学的盆友们,我认为这可以看作是马尔科夫决策链(或者马尔科夫决策过程 Markov Decision Process)会更好理解,由于是单向无环图,所以变成了树,本质上也是图搜索问题。

**:接下来的几篇我会尽量简单的概括我所浏览到的增强学习知识点,AlphaGo 的技巧,蒙特卡洛方法及蒙特卡洛树搜索是什么,他们为何在与神经网络结合后表现出了更强大的决策能力