我一直在尝试用“深度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.html和https://oshearesearch.com/index.php/2016/06/14/kerlym-a-deep-reinforcement-learning-toolbox-in-keras/中实现了策略渐变,但是我很困惑它们是如何实现的。在前者中(当我阅读论文时),似乎不是为actor网络提供一个输入和输出对,而是为所有权重提供梯度,然后使用网络来更新它,而在后者中,它们只是计算一个输入-输出对。
我是不是把自己弄糊涂了?我应该只是通过提供一个输入输出对来训练网络,然后使用标准的“fit”,还是必须做一些特殊的事情?如果是后者,我该如何使用Theano后端呢?(以上示例使用TensorFlow)。
TL;博士
问题
播放时,
代理需要一个策略,该策略基本上是一个函数,它将一个状态映射到一个策略中,该策略是每个操作的概率。因此,代理将根据其策略选择操作。
即,政策=f(州)
训练时,
策略梯度没有损失函数。相反,它试图最大化预期回报的奖励。我们需要计算对数梯度(action-prob)*advantage
我想是这样的
摘要
我们需要两个功能
您已经知道,像典型的分类问题一样,实现起来并不容易,在这些问题中,您可以只对model.compile(…)->;model.fit(X,y)
然而
为了充分利用路缘石,您应该熟悉定义自定义损失函数和梯度。这与前一篇文章的作者所采取的方法基本相同。
您应该阅读更多关于Keras函数API和Keras.backend的文档
另外,政策梯度有很多种。
参考文献
您遇到的看似冲突的实现都是有效的实现。它们是两种实现策略梯度的等效方法。
在vanilla实现中,计算策略网络w.r.t.奖励的梯度,并直接沿梯度方向更新权重。这将要求您执行Mo K描述的步骤。
第二个选项对于像keras/tensorflow这样的autodiff框架来说是一个更方便的实现。其思想是实现一个输入-输出(状态-动作)函数,类似于有监督学习,但有一个损失函数,其梯度与策略梯度相同。对于softmax策略,这仅仅意味着预测“真实行动”,并将(交叉熵)损失与观察到的回报/优势相乘。Aleksis Pirinen对此有一些有用的注释[1]。
Keras中选项2的修正损失函数如下:
其中“action”是事件的真实动作(y),action-probs是预测概率(y*)。这是基于另一个stackoverflow问题[2]。
参考资料
相关问题 更多 >
编程相关推荐