我正在尝试为乒乓球游戏实现深度 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 进行多层感知器实现。问题是训练很慢,性能很弱。我想我错过了一些东西,但不知道是什么。我希望至少有一个不错的结果,因为表格方法没有问题。