上次我们说到用深度学习来做斗地主游戏AI的一个实验项目,这次我们来说说技术实现层面的一些问题。
对于这样一个应用场景来说,我们是可以把它当做类似于图片分类的场景去做的。玩家的手牌、牌池里的牌、上下家打出的牌,这些都可以向量化成为用来描述盘面信息的输入向量。或者简单理解成,用这些向量来画一幅图片,图片的内容就是盘面描述。
既然是图片,显然我们可以考虑使用卷积网络来进行处理,设计合适的卷积核来做特征提取,并通过训练来得到合适卷积核参数。
玩过卷积网络的人应该不会陌生,它通过一层一层的卷积核把一个图片进行逐层扫描处理,并在后端输出相应的预测结果。在这样一个训练场景中,我们可以认为一个赢家在短暂的牌局中,每一步都是一个“正样本”——即在当前的牌局情况下,赢家的出牌是一个“好”的出牌样例。那么这个“好”的出牌样例可以作为预测的对象。
每一轮的牌局都不相同,每一轮的出牌内容也不相同,这样就形成了用不同轮的牌局画像信息作为输入,每一轮的赢家出牌作为输出的多个训练样本。
在这个输入的向量中,我们用一个7*15的矩阵来表示其内容,其中:
第一行:代表玩家现在的手牌状态;
第二行:代表玩家上轮出牌记录;
第三行:代表上家上轮出牌记录;
第四行:代表下家上轮出牌记录;
第五行:代表玩家的所有出牌记录;
第六行:代表上家的所有出牌记录;
第七行:代表下家的所有出牌记录;
每一行的15个向量维度分别指A~K以及小王大王的牌数量。
在通过卷积网络后,会形成一个55维的向量:
前面的13个就是A~K各有4个独热维度5种状态,分别表示出0张牌、1张牌……4张牌。后面的三个维度分别指是否出小王,是否出大王,是否过牌。
一旦这种方式确定以后,就可以采用传统的交叉熵损失函数进行训练了,这点和图片的分类预测差别不大。
当训练结束后,在工作时,输入就是盘面信息向量,那么输出的预测值就是机器人认为的最优的出牌策略。这里有个小技巧,就是输出的向量会产生一个排列组合,在这个排列组合中要过滤掉那些不符合规则以及手牌当前不满足的出牌方案,其余的才是真的可以出的牌,选那个precision最高的方案就可以了。
好了,这就是卷积网络打斗地主的一种解决方案。相信未来在众多的方案中会有更多的优秀模型脱颖而出。