而我们需要训练的策略参数是 p =“在X,Y位置,向D方向走的概率”。这个问题已经变得无比复杂。很显然,在只知道 X,Y坐标的信息的情况下,阿尔西斯无法区分“打开开关前的交叉点”和“打开开关后的交叉点”这两个状态的区别,从而任何“决定性”的策略都不会成功。我们也很容易找到一个最优的策略,由于数学知识不够,x 和 y 的值稍后补充:
这两个问题会使得寻找“最优策略”陷入困境。万幸的是,在本文中,我们并不是要找到“最优策略”,而是介绍几个简单的训练人类专家水平 AI 的方法,这些方法计算量较小,具有可操作性,可以用在实际的游戏设计中。
四、决策方案
刚刚的例子里,我们直接采取了“在 X 位置,以概率 p 向 D 方向移动”的策略。这是一种随机策略,同样,也可以有决定性的策略:“在 X 位置,向 D 方向移动”,此时的策略参数就是 D。这两个决策方案,其实都是决策树。我对决策树的知识了解很少,但是决策树的直观表现就是,在不同的条件下进行(单向的)跳转,最终跳转到某个“终止”节点,并且返回此节点对应的行动。决策树里每一个跳转的条件,都可能附带有参数,这些参数是可以进行训练的,从而获得最好的决策方案。
显然,决策树需要很多的“专家知识”来编写,而且不同结构的决策树,对应的 AI 行动风格、最终训练结果也不一样,甚至达不到期望的水平。尽管如此,对于简单的问题,决策树无论是设计还是训练都非常的简单,是一个很好的模型。
还有一种模型是“值函数”(Value Function)。值函数会对读取到的 Features 进行评估,并且给出一个数值来表示 Features 的价值。不仅如此,值函数还可以综合当前可以采取的行动,进行评估,给出“在当前状态下,采取某一个行动”的价值 Q(State, Action) 。自然,有一个合适的值函数可以直接给出行动的参考:直接选择值函数最大的行动,或者,以更高的概率选择值函数最大的行动。
首先我们要设计好一个实际的 reward 反馈,通常大家就是简单的这么一写,这样试图获得更高分数的 AI 就是试图达到更高的成功率,并降低失败率。
1. 达到成功的终止状态给(+1)
2. 达到失败的终止状态给(-1)
实际上,上面这种简单的 reward 已经足够了。试图以精细调整 reward 而控制 AI 训练结果都是不理智的行为。对于游戏设计者,应该可以脱离RMXP的原始系统,只保留决策和演化的部分用于训练。这样会快很多。
六、训练决策树
决策树中的参数可以是离散的或者是连续的。首先随机初始化这些参数,对于离散的参数,可以先随机取一个值;对于连续的参数,大致设一个覆盖范围,用高斯分布来随机取值 x = N(x0, σ)。如果参数设计的合适,离散的参数也可以用高斯分布来随机取值,下面就假设所有的参数 x 都可以用高斯分布 N(x0, σ) 取值。