Keras的政策梯度

时间:2016-11-05 12:56:41

标签: python deep-learning theano keras q-learning

我一直在尝试使用“深度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.htmlhttps://oshearesearch.com/index.php/2016/06/14/kerlym-a-deep-reinforcement-learning-toolbox-in-keras/实施了政策渐变的网站,但我对它们的实施方式感到困惑。在前者(当我阅读论文时)似乎不是为演员网络提供输入和输出对,而是为所有权重提供渐变,然后使用网络来更新它,而在后者中他们只计算输入 - 输出对。

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

2 个答案:

答案 0 :(得分:6)

TL; DR

  1. 了解如何使用Keras.backend实现自定义丢失函数和渐变。你需要它来获得更高级的算法,而且一旦掌握了它,它就会变得更加容易
  2. 使用keras.backend的一个CartPole示例可能是https://gist.github.com/kkweon/c8d1caabaf7b43317bc8825c226045d2(虽然它的后端使用了Tensorflow,但如果不相同则它应该非常相似)
  3. 问题

    播放时,

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

    ,即policy = f(state)

    培训时,

    Policy Gradient没有丢失功能。相反,它试图最大化预期的奖励回报。而且,我们需要计算log(action_prob)* advantage

    的渐变
    1. 优势是奖励的功能。
      • advantage = f(奖励)
    2. action_prob是状态和action_taken的函数。例如,我们需要知道我们采取了哪些操作,以便我们可以更新参数以增加/减少我们采取的操作的概率。
      • action_prob = sum(policy * action_onehot)= f(states,action_taken)
    3. 我假设这样的事情

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

      摘要

      我们需要两个功能

      • 更新功能:f(状态,动作,奖励)
      • 选择动作功能:f(状态)

      您已经知道它不容易像典型的分类问题一样实现,您可以只使用model.compile(...) - > model.fit(X,y)

      然而,

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

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

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

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

      参考

答案 1 :(得分:0)

您遇到的看似冲突的实现可能都是有效的实现。区别在于,某些实现手动应用策略梯度,而其他实现则利用自动区分框架。

  • 在像REINFORCE这样的典型策略梯度算法中, 确实计算出政策网络的梯度到 奖励,然后使用此渐变更新权重。这将需要您执行Mo K描述的步骤。
  • 但是,如果与使用自动差异框架(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)

参考

  1. https://aleksispi.github.io/assets/pg_autodiff.pdf
  2. http://karpathy.github.io/2016/05/31/rl/
  3. https://web.stanford.edu/class/cs20si/lectures/CS20_intro_to_RL.pdf