tinyzero
轻松训练类似AlphaZero的智能体,适用于任何你想要的环境!
使用方法
确保已安装Python 3.8或更高版本。之后,运行pip install -r requirements.txt
来安装必要的依赖项。
然后,要在现有环境之一上训练智能体,运行:
python3 tictactoe/two_dim/train.py
其中tictactoe/two_dim
是你想要训练的环境名称。
在训练脚本内,你可以更改参数,如回合数、模拟次数,并启用wandb日志记录。
同样,要评估训练好的智能体,运行:
python3 tictactoe/two_dim/eval.py
添加环境
要添加新环境,你可以参考每个现有示例中的game.py
文件。
你添加的环境应实现以下方法:
reset()
:将环境重置为初始状态step(action)
:执行动作并相应修改环境状态get_legal_actions()
:返回合法动作列表undo_last_action()
:撤销上一个执行的动作to_observation()
:将环境当前状态作为观察(numpy数组)返回,用作模型输入get_result()
:返回游戏结果(例如,如果第一个玩家赢了返回1,第二个玩家赢了返回-1,平局返回0,游戏未结束返回None)get_first_person_result()
:从当前玩家角度返回游戏结果(例如,如果当前玩家赢了返回1,对手赢了返回-1,平局返回0,游戏未结束返回None)swap_result(result)
:交换游戏结果(例如,如果结果是1,应变为-1,反之亦然)。这是为了涵盖所有可能的游戏类型(单人、双人、零和、非零和等)
添加模型
要添加新模型,你可以参考models.py
中的现有示例。
你添加的模型应实现以下方法:
__call__
:接收观察作为输入,返回一个值和一个策略value_forward(observation)
:接收观察作为输入,返回一个值policy_forward(observation)
:接收观察作为输入,返回动作分布(策略)
后两种方法用于加速MCTS。
AlphaZero智能体计算策略损失为模型产生的分布与MCTS给出的分布之间的Kulback-Leibler散度。因此,__call__
方法返回的策略应为对数形式。另一方面,policy_forward
方法返回的策略应表示概率分布。
添加新智能体
由于搜索树调用值函数和策略函数的方式,可以使用或训练任何实现它们的智能体。要添加新智能体,你可以参考agents.py
中的现有示例。
你添加的智能体应实现以下方法:
value_fn(game)
:接收游戏作为输入,返回一个值(浮点数)policy_fn(game)
:接收游戏作为输入,返回一个策略(Numpy数组)
MCTS不直接使用任何其他方法,因此它们是可选的,取决于你想要实现的智能体。例如,AlphaZeroAgent
由AlphaZeroAgentTrainer
类扩展,后者添加了在每个回合后训练模型的方法。
在Google Colab中训练
要在Google Colab中训练,首先安装wandb
:
!pip install wandb
然后克隆仓库:
!git clone https://github.com/s-casci/tinyzero.git
在其中一个环境上训练(选择GPU运行时以加快训练速度):
!cd tinyzero; python3 tictactoe/two_dim/train.py
并进行评估:
!cd tinyzero; python3 tictactoe/two_dim/eval.py