路缘石的政策梯度

2024-05-20 15:46:39 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

我是不是把自己弄糊涂了?我应该只是通过提供一个输入输出对来训练网络,然后使用标准的“fit”,还是必须做一些特殊的事情?如果是后者,我该如何使用Theano后端呢?(以上示例使用TensorFlow)。


Tags: httpsorg模型网络标准pdfwwwdqn
0条回答
网友
1楼 · 发布于 2024-05-20 15:46:39

TL;博士

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

问题

播放时,

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

即,政策=f(州)

训练时,

策略梯度没有损失函数。相反,它试图最大化预期回报的奖励。我们需要计算对数梯度(action-prob)*advantage

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

我想是这样的

  • 策略=[0.1,0.9]
  • action\u onehot=采取的操作=[0,1]
  • 则action_prob=sum(policy*action_onehot)=0.9

摘要

我们需要两个功能

  • 更新功能:f(状态、采取的行动、奖励)
  • 选择动作功能:f(状态)

您已经知道,像典型的分类问题一样,实现起来并不容易,在这些问题中,您可以只对model.compile(…)->;model.fit(X,y)

然而

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

  • 您应该阅读更多关于Keras函数API和Keras.backend的文档

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

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

参考文献

网友
2楼 · 发布于 2024-05-20 15:46:39

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

  1. 在vanilla实现中,计算策略网络w.r.t.奖励的梯度,并直接沿梯度方向更新权重。这将要求您执行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. Make a custom loss function in keras

相关问题 更多 >