OpenSpiel框架介绍与使用

最近在了解用PyTorch做DQN,让机器学习玩Flappy Bird的知识。在准备实践的时候,想到了几年前自己用过DeepMind开源的工具玩老游戏,于是去看看DeepMind有没有推出什么新东西。

去年9月左右,他们开源了一个名为OpenSpiel的框架,定义为A Framework for Reinforcement Learning in Games,而且在内置算法中我们可以找到DQN和Q-learning。

GitHub地址:open_spiel

我们这里在Windows Subsystem for Linux中成功安装,官方给的文档中似乎没有讲清楚(文档就是让你来看源码),那我们就来讲解一下tic_tac_toe_dqn_vs_tabular.py。从简介可以知道程序先让DQN与Tabular Q-Learning互相比试井字棋进行训练,之后在和真人进行比试。除开源码中辅助输出的函数,我们把目光聚焦到主要的代码。

首先程序初始化了一些变量,定义了训练的epoch,玩家数量,隐藏层size,记忆步数的大小等。然后非常方便地定义了DQN和Q-learning:

1
2
3
4
5
6
7
8
9
10
11
with tf.Session() as sess:
dqn_agent = dqn.DQN(
sess,
player_id=0,
state_representation_size=state_size,
num_actions=num_actions,
hidden_layers_sizes=hidden_layers_sizes,
replay_buffer_capacity=replay_buffer_capacity)
tabular_q_agent = tabular_qlearner.QLearner(
player_id=1, num_actions=num_actions)
agents = [dqn_agent, tabular_q_agent]

我们知道,在自己搭建DQN的时候,还要定义衰减率、退火时间步等超参数,但是在这里并不用考虑这些,实际上你需要做的已经大概完成了。放个Q-learning迭代公式~

$ \Delta Q(s_{t}, a_{t}) = \alpha (r_{t} + \gamma max_{ {a}’ }Q(s_{t+1}, {a}’)-Q(s_{t}, a_{t})) $

在训练完成之后,程序将当前训练后的agent与随机agent计算Mean episode rewards。在对战的过程中,会输出机器下一步走的probs,可以发现已经和真人玩家想法相差无几。

你可以在文档中看到支持的全部游戏和全部算法,当然你也可以自己编写游戏,或者尝试自己搭建DQN来玩玩,网上利用DQN玩Flappy Bird的源码有很多框架的版本,覆盖了TensorFlow、PyTorch、PaddlePaddle等,整体架构也算比较简单的。因为OpenSpiel最终给出的C++和Python解决方案已经非常简单,所以没有必要给出太详细的文档,相信读者花点时间了解一下相关知识就能够自己写一个出来。

玩井字棋去了~

  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 许可协议。转载需要标明作者,并以超链接的方式指向原文。
  • Copyrights © 2020 Kevin Li
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~