5

我正在尝试为乒乓球游戏实现深度 q 学习算法。我已经使用表格作为 Q 函数实现了 Q 学习。它工作得很好,并学会了如何在 10 分钟内击败幼稚的 AI。但我无法使用神经网络作为 Q 函数逼近器使其工作。

我想知道我是否走在正确的轨道上,所以这里总结一下我正在做的事情:

  • 我将当前状态、采取的行动和奖励作为当前体验存储在回放内存中
  • 我使用多层感知器作为 Q 函数,具有 1 个隐藏层和 512 个隐藏单元。对于输入 -> 隐藏层,我使用的是 sigmoid 激活函数。对于隐藏层 -> 输出层,我使用的是线性激活函数
  • 状态由球员和球的位置以及球的速度来表示。位置被重新映射到更小的状态空间。
  • 我正在使用 epsilon-greedy 方法来探索 epsilon 逐渐下降到 0 的状态空间。
  • 学习时,随机选择一批 32 个后续经验。然后我计算所有当前状态和动作 Q(s, a) 的目标 q 值。

    forall Experience e in batch if e == endOfEpisode target = e.getReward else target = e.getReward + discountFactor*qMaxPostState end

现在我有一组 32 个目标 Q 值,我正在使用批量梯度下降用这些值训练神经网络。我只是在做 1 个训练步骤。我应该做多少?

我正在用 Java 编程并使用 Encog 进行多层感知器实现。问题是训练很慢,性能很弱。我想我错过了一些东西,但不知道是什么。我希望至少有一个不错的结果,因为表格方法没有问题。

4

2 回答 2

2

我使用多层感知器作为 Q 函数,具有 1 个隐藏层和 512 个隐藏单元。

可能太大了。取决于您的输入/输出维度和问题。你少尝试了吗?

健全性检查

网络可能学习必要的功能吗?

收集地面实况输入/输出。以有监督的方式拟合网络。它是否提供所需的输出?

一个常见的错误是最后一个激活函数有问题。大多数时候,你会想要一个线性激活函数(就像你一样)。然后你希望网络尽可能小,因为 RL 非常不稳定:你可以在不工作的地方运行 99 次,在正常工作的地方运行 1 次。

我探索够了吗?

检查你探索了多少。也许你需要更多的探索,尤其是在开始的时候?

也可以看看

于 2018-03-26T09:06:23.690 回答
2
  • 尝试在隐藏层中使用 ReLu(或更好的 Leaky ReLu)单元,并在输出中使用 Linear-Activision。
  • 尝试更改优化器,有时带有适当学习率衰减的 SGD 会有所帮助。有时亚当工作正常。
  • 减少隐藏单元的数量。这可能太多了。
  • 调整学习率。你拥有的单位越多,学习率的影响就越大,因为输出是之前所有神经元的加权和。
  • 尝试使用球的本地位置含义:ballY - paddleY。这可以极大地帮助,因为它将数据减少到: 高于或低于标志区分的桨。请记住:如果您使用本地位置,则不需要玩家的桨位置,并且敌人的桨位置也必须是本地的。
  • 您可以将先前的状态作为附加输入,而不是速度。网络可以计算这两个步骤之间的差异。
于 2019-03-06T11:43:36.047 回答