Keras的政策梯度

sim*_*eon 18 python q-learning theano deep-learning keras

我一直在尝试使用"深度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).

Mo *_*o K 7

TL; DR

  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(状态,动作,奖励)
  • 选择动作功能:f(状态)

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

然而,

  • 为了充分利用Keras,您应该习惯于定义自定义丢失函数和渐变.这与前者的作者基本相同.

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

此外,还有许多种政策梯度.

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

参考