训练AlphaZero时如何在PyTorch中进行反向传播?

问题描述 投票:0回答:1

我正在尝试为 Connect Four 实现我的 AlphaZero 版本。我已经使用 PyTorch 实现了一个卷积网络,并且可以从给定棋盘状态的模型中获取(随机)值和策略输出。现在我想模拟一些游戏并使用它们训练模型。然而,我遇到了一个问题: 据我了解,训练基本上包括两个步骤:一个步骤是使用自我对弈来收集游戏数据,然后是使用收集到的数据通过反向传播来训练模型。 在自我对弈步骤中,网络用于获得对位置的评估以及如何选择下一步行动的策略。然后使用 MCTS 算法版本改进该策略。 游戏结束后,所有动作和结果都会被保存。

为了简单起见,假设我只玩一款游戏,然后想要更新模型。如果我保存 MCTS 策略和网络策略,我现在可以计算损失。但我无法通过模型进行反向传播,因为前向传播发生在收集步骤期间。理论上,我可以再次通过模型转发相同的位置,但这听起来不仅效率低下,而且由于我的架构使用了 dropout 层,我什至不会得到相同的结果。 那么如何在 PyTorch 中解决这个问题呢?我可以以某种方式将模型与用于创建策略的 dropout 配置一起保存吗?然后我至少可以再次向前移动位置,然后使用反向传播,即使效率很低。

python deep-learning pytorch reinforcement-learning backpropagation
1个回答
0
投票

一般来说,在训练期间使用从自我对弈到反向传播的梯度并不是一种惯例(出于多种原因)。为以后的反向传播存储梯度是相当低效的。另外,自我对弈中还存在探索噪音。 RL 训练阶段重新运行是正常的。

在自我对弈中,您可能会使用

eval mode
来保持策略一致。 Dropout仅用于出于正则化目的的训练。从某种意义上说,退出可能有助于探索,但我认为更合适的探索是使用参数噪声

我不知道 AlphaZero,但恕我直言,存储丢失噪声没有什么意义。如果您想这样做,请使用重播缓冲区来存储您使用 register_forward_hook 捕获的放置激活。

© www.soinside.com 2019 - 2024. All rights reserved.