




















Abstract: 本文介绍强化学习的一个具体例子,Tic-Tac-Toe,作为一种下棋类游戏,Tic-Tac-Toe规则简单,而且问题规模小,容易进行深入分析,了解强化学习在具体例子中的执行过程,进而了解强化学习的性质和特点。
Keywords: 强化学习,强化学习举例,Tic-Tac-Toe
今天我们来讲一个很有趣的例子,英文名字叫”Tic-Tac-Toe” 中文名字有翻译成“井字棋”或者什么的,我们这里为了方便就称之为“井字棋”,叫井字棋的原因是因为其棋盘是个“井”字形的,玩法简单,但是这个玩的过程可以使用强化学习的方法来学习,这个简单的棋可以让我们从各个细节审视强化学习的特点,有点,缺点,以及一些小技巧。
Tic-Tac-Toe的规则描述如下:
下图来自Wikipedia:“井字棋”

上面的棋局,使用 ‘x’ 的一方率先完成连成一行的准则,故执’x’一方获胜。
下面这个视频是我在Google上找到的一个小程序录的一段视频。
可见,在高级的情况下,双方(我和AI)基本都没法获胜,也就是平局会大量出现,原因是,我们对这种棋的技巧掌握的都很熟练,无法在现行环境(规则)下战胜对方,通过这个观察我们也能发现,在规则相对简单的游戏(“博弈”)中,平局会大量出现。
那么问题就要来了,我们 - 也就是人,在这种简单的规则下,多以平局收场,那么这怎么训练agent呢?如果每局训练总是平局,agent就不知道往什么方向走了。这里我们就要做出一些修改,我们让与我们agent下棋的人或者另一个agent不那么高级,换句话说,我们在简单规则下,降低规则执行者的能力,进而模拟出更高级的博弈(所谓更高级的博弈,无非是我们能力不足才会觉得当前环境,或者规则很困难)。
在后面的训练里,agent会将平局和失败都当做失败来处理,agent的目标明确,就是胜利。
这个棋局太简单,但是在如此简单的规则下,传统方法(非学习方法)都有诸多问题:
上面3中方法中,1和2对解决问题基本没有帮助,3有帮助。3和我们后面会介绍的很多强化学习方法有着非常相似的思路。
进化方法 中讲解了进化方法的缺点,就是没有使用agent和环境之间的交互信息来改变agent。而这里如果把进化方法直接使用到“井字棋”中,其表策略(policy)的特点是:直接search全部可能的位置,找到获胜概率最大的位置,然后下棋。也就是,策略要考虑到当前盘面( $3\times 3$ 的棋盘上 x和o的分布)并给出获胜概率最大的下棋位置。而这个概率的获得就需要和对手多次下棋,记录,学习出来的。有了这些信息,agent就知道接下来一步或者接下来很多步应该怎么走。
一个典型的进化方法就是在“策略空间”的 hill-climb ,这种方法的策略是逐渐找出能提高表现的策略(并不是一下找到最优的方法,而是像爬山一样,每一步都找到一个能提高agent表现的方案,一步一步的向上爬)。
遗传方法就更加直接暴力了,直接直接评估大量的策略(policies),去除不合格的,留下好的,然后产生新一代的,以此迭代,直到问题解决。
解决“井字棋”问题,理论上存在很多种不同的优化方法。
上面我们说了进化方法在井字棋中使用,下面我们就要看看另一个方向的方法 —— 评价函数(value Function)的方法了。
我们列一个表,这个表中的每个格子对应一种状态(state),整张表就对应井字棋的全部情况,这个表的每一项都对应一个概率值,这个概率值表示当前状态下最后获胜的期望,注意两点,一个是当前的状态,第二是最终获胜的期望。这个期望,我们就把其当做评价函数的结果,value —— value值。这个表就是我们的评价函数(Value Function)了.
在井字棋中,这个表就包含下一步棋应该怎么走的评估。通过当前状态,我们可以缩小下一步可能出现的状态范围,然后比较所有可能的状态,如果A状态比B状态有更高的获胜期望,那么我们认为A状态比B状态好,所以我们倾向于把棋子走到A状态显示的位置。
对于这个状态表,假设我们执x,那么如果某状态中包含x在一行或者一列或者对角线,那么这个状态的获胜期望是1,相反,如果o在一行或者一列或者对角线,那么这个状态的获胜期望是0;同样,如果对应状态是棋盘下满,而没有获胜方,这时候期望同样是0 。除了上述这些情况,其他状态的初始化值都是0.5,即有一半的可能性会获胜。
当我们有了这张表(上面的评价函数)我们就有了制胜法宝,但是具体执行也是有不同方案的,我们可以查找最大value的状态,然后执行贪心(greedily)选择,这是使得获胜期望最大的策略,也就是完全执行表(value function)中的指示,这个被称为exploitation。
但是我们有时候(偶尔,occasionally)在某些步骤中不选择最大value的状态,而是选择随机状态,因为这种方式可能带我们到一个前所未见的state下。
上面两段描述的评价函数,以及状态表在井字棋中可以表现为下图:

在下棋的过程中,我们不断修改已有value function对于井字棋,也就是上面我们提到的那张表,我们的目标是试图使其更加准确,为了达到这个目的,我们增加了一步“返回”(back up) 过程(上图中的红色箭头),这个过程在每一步贪心选择后执行,这一步执行的实质是通过当前状态值(value)来适当修改上一步状态的value,使它更接近现在状态的值(评价函数的结果,value),比如图中的红箭头就是让e的值(评价函数的结果,value)更接近g的值(评价函数的结果,value)。
上面的数学表达为,让 $s$ 为贪心选择之前的状态的值(评价函数的结果,value), $s’$ 为贪心选择后的值(评价函数的结果,value),然后我们的back up更新 $s$ 值,方式是:
$$
V(s)\leftarrow V(s)+\alpha[V(s’)-V(s)]
$$
其中 $\alpha$ 是一个小的正小数,叫做“步长”(step-size)参数,这个参数影响学习速率(the rate of learning)注意这里rate是速率的意思,而不是比率的意思,所以学习率这种翻译,我觉得欠妥。
这种基于 $[V(s’)-V(s)]$ 的变化方式(update rule)被称为“时序差分学习”(temporal-difference learning),字面解释:基于两个不同时间点的值(评价函数的结果,value)的差值的方法,这个解释基本能反应这类方法的特点。
这类方法是我们后面要重点学习。
上述方法对于这个任务可以非常出色的得出不错的结果,例如,在步长参数(step-size)被精确递减后,这个算法对于固定的对手是收敛的,每一步都能给出胜算最高的走法。也就是说,这个方法对于一个固定的对手给出了最优策略。这里的一个关键就是 步长参数(step-size) 的调整,如果这个参数不调整,那么最后的结果也会收敛,但是速度会慢很多。
上面这些细节也佐证了我们前面提到的:“进化方法”和“评价函数学习法”的区别:
总之,进化方法和“评价函数学习法”都是在搜索policy的空间,但是“评价函数学习法”搜索起来更高效,因为他利用了更多的有效信息。
这个小小的游戏基本展现了强化学习的所有特性:
虽然RL的这几个有点很是吸引人,但是这不能掩盖其某些缺点:
井字棋的搜索范围很小,现在alpha go所面对搜索空间比井字棋大到不知道哪去了~,1992年的时候就有学者研究了比井字棋更复杂的游戏,空间大概规模是 $10^{20}$ 他们使用了神经网络作为模型,结合上面的方法得出了很好的结果,具体我们在后面16章学习。
强化学习面对如此巨大的policy空间的行为,主要取决于他对之前学习的信息的理解程度,理解的越好,其行为就更加可靠,反之则不可靠。
在井字棋游戏中,RL的agent只知道游戏规则毫无游戏经验或者先验知识,先验知识是锦上添花的元素,也就是,有或者没有这个要靠缘分,就算没有我们也要解决问题,而如果有,那么我们可以利用先验知识节省大量时间,或者大幅度提高结果。RL处理先验知识有多种方式,并且对学习结果。
我们目前处理的情况都是当前环境对agent有明确的反馈,且state明确,在有些问题中state可能是隐藏的或者有大量重复的state这种情况过于复杂,不在我们初级范围内。
Model同样是强化学习中的一个组成要素:当我们的RL(agent)学习应该怎么样应对不同的状况的时候,他需要思考的就是环境会怎么对他的action进行反应,有些问题确实如此,环境对action的反应就是一个模型,但是有的问题可能比这要更复杂一些,他们有的时候什么模型都没有,不知道环境会做出什么样的反应,面对这样的问题RL也有解决方案。同样的,有模型可以帮助RL更快的学习。
但是我们的井字棋就没有这个model,原因是对手怎么下棋是不可能有模型的,这就是个 Model-Free system。存在精确模型的系统由于模型被精确的使用,所以做起来相对简单,但是有的时候建立模型的过程会成为这个问题的瓶颈,本书中我们会讨论一些Model-Free的问题,同时组合这些问题成为更复杂的系统。
本文通过研究Tic-Tac-Toe这个小游戏,从实际应用的角度分析了RL的各个方面,基本涵盖了大部分主要内容,后面我们进入第二章,开始分析具体算法,欢迎大家关注。
Sutton R S, Barto A G. Reinforcement learning: An introduction[J]. 2011.
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。