23

我一直在尝试使用“深度 Q 学习”构建一个模型,其中我有大量的动作 (2908)。在使用标准 DQN 取得了一些有限的成功后:( https://www.cs.toronto.edu/~vmnih/docs/dqn.pdf ),我决定做更多的研究,因为我认为行动空间太大而无法做到有效探索。

然后我发现了这篇论文:https ://arxiv.org/pdf/1512.07679.pdf ,他们使用了演员-评论家模型和策略梯度,然后我发现了:https ://arxiv.org/pdf/1602.01783.pdf他们使用策略梯度来获得比 DQN 整体更好的结果。

我发现了一些他们在 Keras 中实施策略梯度的网站,https ://yanpanlau.github.io/2016/10/11/Torcs-Keras.html和https://oshearesearch.com/index.php/ 2016/06/14/kerlym-a-deep-reinforcement-learning-toolbox-in-keras/但是我很困惑它们是如何实现的。在前者中(当我阅读论文时),似乎不是为参与者网络提供输入和输出对,而是为所有权重提供梯度,然后使用网络对其进行更新,而在后者中他们只是计算一个输入-输出对。

我只是把自己弄糊涂了吗?我只是应该通过提供输入-输出对并使用标准的“拟合”来训练网络,还是我必须做一些特别的事情?如果是后者,我该如何使用 Theano 后端呢?(上面的例子使用 TensorFlow)。

4

2 回答 2

10

TL;博士

  1. 了解如何使用 Keras.backend 实现自定义损失函数和梯度。您将需要它来获得更高级的算法,一旦掌握了它,它实际上会容易得多
  2. 使用 keras.backend 的一个 CartPole 示例可能是https://gist.github.com/kkweon/c8d1caabaf7b43317bc8825c226045d2(虽然它的后端使用了 Tensorflow,但如果不一样应该非常相似)

问题

玩的时候,

代理需要一个策略,该策略基本上是将状态映射到策略的函数,该策略是每个动作的概率。因此,代理将根据其策略选择一个动作。

即,策略 = f(状态)

训练时,

Policy Gradient 没有损失函数。相反,它试图最大化奖励的预期回报。而且,我们需要计算 log(action_prob) * 优势的梯度

  1. 优势是奖励的函数。
    • 优势 = f(奖励)
  2. action_prob 是 states 和 action_taken 的函数。例如,我们需要知道我们采取了哪些行动,以便我们可以更新参数以增加/减少我们采取行动的概率。
    • action_prob = sum(policy * action_onehot) = f(states, action_taken)

我假设这样的事情

  • 政策 = [0.1, 0.9]
  • action_onehot = action_taken = [0, 1]
  • 然后 action_prob = sum(policy * action_onehot) = 0.9

概括

我们需要两个函数

  • 更新函数:f(state, action_taken, reward)
  • 选择动作函数:f(state)

您已经知道,像典型的分类问题那样实现并不容易,您只需 model.compile(...) -> model.fit(X, y)

然而,

  • 为了充分利用 Keras,您应该熟悉定义自定义损失函数和梯度。这与前一篇的作者所采用的方法基本相同。

  • 您应该阅读更多有关 Keras 功能 API 和 keras.backend 的文档

另外,策略梯度有很多种。

  • 前者称为 DDPG,实际上与常规策略梯度有很大不同
  • 我看到的后一个是基于 Kapathy 的策略梯度示例的传统 REINFORCE 策略梯度 (pg.py)。但它非常简单,例如它只假设一个动作。这就是为什么它可以使用 model.fit(...) 以某种方式实现。

参考

于 2017-05-18T08:48:37.597 回答
4

您遇到的看似冲突的实现都是有效的实现。它们是两种实现策略梯度的等效方式。

  1. 在 vanilla 实现中,您计算​​策略网络 wrt 奖励的梯度,并直接更新梯度方向的权重。这将要求您执行 Mo K 描述的步骤。

  2. 对于像 keras/tensorflow 这样的 autodiff 框架,第二个选项可以说是更方便的实现。这个想法是实现一个输入-输出(状态-动作)函数,如监督学习,但使用梯度与策略梯度相同的损失函数。对于 softmax 策略,这仅仅意味着预测“真实动作”并将(交叉熵)损失与观察到的回报/优势相乘。Aleksis Pirinen 对此有一些有用的注释 [1]。

Keras 中选项 2 的修改后的损失函数如下所示:

import keras.backend as K

def policy_gradient_loss(Returns):
    def modified_crossentropy(action,action_probs):
        cost = K.categorical_crossentropy(action,action_probs,from_logits=False,axis=1 * Returns)
        return K.mean(cost)
    return modified_crossentropy

其中'action'是情节的真实动作(y),action_probs是预测概率(y*)。这是基于另一个 stackoverflow 问题 [2]。

参考

  1. https://aleksispi.github.io/assets/pg_autodiff.pdf
  2. 在 keras 中制作自定义损失函数
于 2019-07-04T19:31:51.553 回答