machine-learning - 玩 Atari Breakout 时,简单策略梯度 (REINFORCE) 会过度拟合某个操作

标签 machine-learning deep-learning conv-neural-network pytorch reinforcement-learning

独立代码: https://colab.research.google.com/drive/1HYEXMpicymPUySkhGOaCJdJ3pN4RzXYd

问题:我正在尝试使用 CNN 来玩 Atari 像素突破游戏(Breakout-V0 OpenAI 健身房)。我正在尝试使用 PyTorch 中实现的简单策略梯度算法来执行此操作。这个游戏中有四种可能的 Action [<NO-OP>, <FIRE> (play), <LEFT>, <RIGHT>] .

预期结果:我希望政策能学会玩<NO-OP>, <LEFT>, <RIGHT>概率大致相同,并且只玩 <FIRE>在游戏的第一帧。

实际结果:大约 4 次权重更新后,网络以接近 100% 的概率预测一个 Action 。这意味着梯度消失并且策略永远不会恢复。

我尝试过的:

  1. 仅在游戏开始时进行随机操作(采取遵循政策的越来越贪婪的操作)。您可以在笔记本中修改它。
  2. 我只奖励了一个 Action ,只是为了向自己证明它学会了只执行该一个 Action 。确实如此,所以我认为我可以排除任何 PyTorch 特定的实现错误。
  3. 对损失引入熵惩罚,以抑制对操作的高度信心。

我的理解是,没有必要明确引入随机操作,因为 action = categorical.sample()做这个。如果一种行为占据主导地位,但不会带来奖励,则应随后予以劝阻。

我的想法是我的训练批处理有偏差,因此采取行动 <RIGHT>例如,每集的奖励多于惩罚,因此可能性不断增加。我本以为在游戏开始时采取完全随机的行动并且慢慢地开始听取政策会解决这个问题,但在我的实验中,它没有。

我真的很困惑为什么这不起作用。非常感谢任何可以提供帮助的人。昨天我尝试与 RL 博士一起调试这个问题 5 个小时,但没有任何进展。

额外问题:

  1. 玩游戏常见吗? 1000 个 rollout,然后从这个 rollout 缓冲区中随机采样一批来学习?我对政策梯度的理解是,政策在每一集之后都会更新。
  2. 我的想法是否正确:在策略梯度中,您只能通过从中选择操作的神经元进行反向传播,但梯度会通过 softmax 分布到所有网络权重?

最佳答案

我们在使用 VPG( Vanilla 策略梯度)训练 Breakout 时遇到了类似的问题。解决方案是对以下内容强制熵损失

不确定您是否意识到这一点,但请使用 Atari wrapper来自 Deepmind

Q 1 : 玩游戏常见吗? 1000 个 rollout,然后从这个 rollout 缓冲区中随机采样一批来学习?我对政策梯度的理解是,政策在每一集之后都会更新。

A 1:实际上,最好在 single batch. 中批量处理多个剧集。

问题 2:我的想法是否正确,在策略梯度中,您仅通过从中选择操作的神经元进行反向传播,但梯度通过 softmax 分布到所有网络权重?

A 2:根据预期奖励,抑制或鼓励选择特定行动的可能性,并且模型背景该信息

关于machine-learning - 玩 Atari Breakout 时,简单策略梯度 (REINFORCE) 会过度拟合某个操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58956125/

相关文章:

java - 如果一个或多个属性具有特定值,则删除 Weka 实例

matlab - matlab中的PCA选择前n个组件

machine-learning - 什么是 f1-score 以及它的值表示什么?

r - 错误 `row.names<-.data.frame` (`*tmp*` ,值 = c(NA_real_, NA_real_

python - HuggingFace Transformers For Text Generation with CTRL with Google Colab's free GPU

tensorflow - 如何查看测试生成器中的图像以查看预测是否正确

for-loop - 在 torch7 中初始化张量的快速方法

python - 卷积层和输入数据上的 Keras 错误

python-3.x - 值错误 : Negative dimension size caused by subtracting 3 from 1 for 'conv1d_1/convolution/Conv2D

python - 在 tf.nn.conv2d 中使用权重初始化器