我一直在尝试使用“深度Q-Learning”来构建模型。我有很多动作(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)。
答案 0 :(得分:6)
代理需要一个策略,该策略基本上是一个将状态映射到策略的函数,该策略是每个操作的概率。因此,代理商将根据其政策选择一项行动。
,即policy = f(state)
Policy Gradient没有丢失功能。相反,它试图最大化预期的奖励回报。而且,我们需要计算log(action_prob)* advantage
的渐变我假设这样的事情
我们需要两个功能
您已经知道它不容易像典型的分类问题一样实现,您可以只使用model.compile(...) - > model.fit(X,y)
然而,
为了充分利用Keras,您应该熟悉定义自定义丢失函数和渐变。这与前者的作者基本相同。
您应该阅读更多关于Keras功能API和keras.backend的文档
另外,有很多种政策梯度。
答案 1 :(得分:0)
您遇到的看似冲突的实现可能都是有效的实现。区别在于,某些实现手动应用策略梯度,而其他实现则利用自动区分框架。
但是,如果与使用自动差异框架(Theano / tensorflow)的Keras一起使用,最方便的方法是提供损失函数而不是梯度。引用(1):
“在Autodiff框架中,通常不会 提供例如形式的显式梯度估计(2),但是 相反,应该提供损失函数。”
一些自动差异实现以与监督学习问题匹配的方式重新构造了策略梯度算法。粗略地描述,这个想法是使用“真实行为”作为“伪造标签”,并以其梯度为策略梯度的方式构造损失函数。对于离散的动作空间,这是通过将softmax-crossentropy损失乘以将来的奖励来实现的。
正如Karpathy所说(2):
政策梯度与有两个监督学习的情况完全相同 略有不同:1)我们没有正确的标签y,例如“假冒 标签”,我们替换了我们刚从政策中采样的操作 当它看到x和2)时,我们对每个示例的损失进行调制 基于最终结果,我们要 增加有效措施的对数概率,并降低该概率 对于那些没有的人。
Stanford的幻灯片(3)提供了有关使用autodiff框架以及伪代码的策略梯度实现的其他说明:
# Given:
# actions - (N*T) x Da tensor of actions
# states - (N*T) x Ds tensor of states
# rew_to_go – (N*T) x 1 tensor of estimated reward to go
# Build the graph:
logits = policy.predictions(states) # This should return (N*T) x Da tensor of action logits
negative_likelihoods = tf.nn.softmax_cross_entropy_with_logits(labels=actions, logits=logits)
weighted_negative_likelihoods = tf.multiply(negative_likelihoods, rew_to_go)
loss = tf.reduce_mean(weighted_negative_likelihoods)
gradients = loss.gradients(loss, variables)
参考