学习使用 DQN 玩 Curve Fever 游戏的奖励函数
Reward function for learning to play Curve Fever game with DQN
我制作了一个简单版本的 Curve Fever,也称为 "Achtung Die Kurve"。我希望机器弄清楚如何以最佳方式玩游戏。我从使用 Google 的 Tensorflow 制作的一些 Atari 游戏示例中复制并稍微修改了现有的 DQN。
我正在努力找出合适的奖励函数。目前,我使用这个奖励设置:
- 每帧 0.1 不崩溃
- -500 每次崩溃
这是正确的方法吗?我需要调整值吗?还是我需要一种完全不同的方法?
奖励函数最好准确编码您希望代理追求的目标。在 Curve Fever 中,目标是成为最后一个活着的玩家。如果您使用的奖励功能只是奖励留在游戏中,那么最好的策略就是无限期地结束游戏。您可能希望代理尽快获胜,因此您实际上应该在每个时间步给予一个小的负奖励,并在赢得一轮时给予一些正奖励。这是一个快赢的奖励函数
-500 的奖励可以摧毁你的网络。您应该将奖励缩放到 1 到 -1 之间的值。 (还可以在 -1 和 1 或 0 和 1 之间缩放输入图像)。
只需为您的网络提供 -1 的崩溃奖励和 +1 敌人崩溃的奖励。在没有敌人的情况下,-1 的崩溃奖励就足够了。在某些情况下(比如当网络必须在两个不可避免的崩溃之间做出决定,其中一个会比另一个发生得更快时),拥有一个小的持续积极的生活奖励可能是有益的,但它也会使 Q 函数的学习更加复杂。您可以尝试有无持续奖励,看看哪种效果最好。
不可避免的崩溃的例子也说明了为什么你不应该使用一个小的负面生活奖励。在这种情况下,网络会选择最快崩溃的路径,而在这种情况下尽可能延迟崩溃将是更好的策略。
我制作了一个简单版本的 Curve Fever,也称为 "Achtung Die Kurve"。我希望机器弄清楚如何以最佳方式玩游戏。我从使用 Google 的 Tensorflow 制作的一些 Atari 游戏示例中复制并稍微修改了现有的 DQN。
我正在努力找出合适的奖励函数。目前,我使用这个奖励设置:
- 每帧 0.1 不崩溃
- -500 每次崩溃
这是正确的方法吗?我需要调整值吗?还是我需要一种完全不同的方法?
奖励函数最好准确编码您希望代理追求的目标。在 Curve Fever 中,目标是成为最后一个活着的玩家。如果您使用的奖励功能只是奖励留在游戏中,那么最好的策略就是无限期地结束游戏。您可能希望代理尽快获胜,因此您实际上应该在每个时间步给予一个小的负奖励,并在赢得一轮时给予一些正奖励。这是一个快赢的奖励函数
-500 的奖励可以摧毁你的网络。您应该将奖励缩放到 1 到 -1 之间的值。 (还可以在 -1 和 1 或 0 和 1 之间缩放输入图像)。
只需为您的网络提供 -1 的崩溃奖励和 +1 敌人崩溃的奖励。在没有敌人的情况下,-1 的崩溃奖励就足够了。在某些情况下(比如当网络必须在两个不可避免的崩溃之间做出决定,其中一个会比另一个发生得更快时),拥有一个小的持续积极的生活奖励可能是有益的,但它也会使 Q 函数的学习更加复杂。您可以尝试有无持续奖励,看看哪种效果最好。
不可避免的崩溃的例子也说明了为什么你不应该使用一个小的负面生活奖励。在这种情况下,网络会选择最快崩溃的路径,而在这种情况下尽可能延迟崩溃将是更好的策略。