【问题标题】:Q-learning using neural networks使用神经网络的 Q 学习
【发布时间】:2016-09-26 00:44:52
【问题描述】:

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

【问题讨论】:

    标签: neural-network artificial-intelligence deep-learning encog q-learning


    【解决方案1】:

    我正在使用多层感知器作为 Q 函数,其中包含 1 个隐藏层和 512 个隐藏单元。

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

    健全性检查

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

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

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

    我的探索足够了吗?

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

    另见

    【讨论】:

    • 我想我已经尝试了几种配置,但我没有运行少于 100 个隐藏单元的运行。也许这值得一试?此外,在解决这类问题时,硬件有多重要?这些小问题是否足够简单,可以在 GPU 上进行训练,或者我是否需要高端 GPU 才能解决这个特定问题?我认为在这种情况下,我是在 Intel I7 上进行训练的,在这种情况下,是不是我训练的时间不够长,因为没有 GPU 的时间太长了?
    【解决方案2】:
    • 尝试在隐藏层中使用 ReLu(或更好的 Leaky ReLu)单元,并在输出中使用 Linear-Activision。
    • 尝试更改优化器,有时带有适当学习率衰减的 SGD 会有所帮助。 有时 ADAM 可以正常工作。
    • 减少隐藏单元的数量。可能太多了。
    • 调整学习率。您拥有的单位越多,学习率的影响就越大,因为输出是之前所有神经元的加权和。
    • 尝试使用球的本地位置含义:ballY - paddleY。这可以极大地帮助,因为它将数据减少到: 高于或低于标志区分的桨。请记住:如果使用本地位置,则不需要玩家的桨位置,而敌人的桨位置也必须是本地的。
    • 您可以将先前的状态作为附加输入,而不是速度。 网络可以计算这两个步骤之间的差异。

    【讨论】:

      猜你喜欢
      • 2017-02-28
      • 1970-01-01
      • 2013-08-15
      • 2016-07-11
      • 1970-01-01
      • 2016-05-25
      • 2019-03-15
      • 2011-08-17
      • 2020-10-29
      相关资源
      最近更新 更多