2016-11-05 112 views
14

我一直在嘗試使用'深度Q學習'來構建模型,其中我有大量的操作(2908)。在使用標準DQN: (https://www.cs.toronto.edu/~vmnih/docs/dqn.pdf)取得了一些有限的成功之後,我決定做更多的研究,因爲我認爲行動空間太大而無法進行有效的探索。Keras中的策略梯度

我這時才發現本文: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後端來做? (上面的例子使用張量流)。

任何幫助將是偉大的!

+0

你見過https://github.com/matthiasplappert/keras-rl? –

+0

不投入狀態動作對的一個原因是,如果您有大量動作需要很長時間。相反,讓網絡一次預測所有行爲的價值,然後做出你的行動選擇通常很有用 – user3235916

回答

3

TL; DR

  1. 瞭解如何實現使用Keras.backend自定義的損失函數和梯度。你將需要它來獲得更高級的算法,並且一旦你掌握了它,它實際上會容易得多
  2. 一個CartPole使用keras.backend的例子可能是https://gist.github.com/kkweon/c8d1caabaf7b43317bc8825c226045d2(儘管它的後端使用了Tensorflow,但它應該非常相似,如果不相同)

問題

玩遊戲時

代理需要一個策略,基本上是一個狀態映射成對於每個動作的概率的策略的功能。所以,代理人將根據其政策選擇一項行動。

即,政策= F(州)

當培訓,

政策梯度沒有損失函數。相反,它試圖最大化獎勵的預期回報。並且,我們需要計算log(action_prob)*的優勢

  1. 優勢是獎勵功能。
    • 優點= F(獎勵)
  2. action_prob是狀態和ACTION_TAKEN的函數。例如,我們需要知道我們採取了哪些操作,以便我們可以更新參數以增加/減少所採取操作的概率。
    • action_prob =總和(策略* action_onehot)= F(狀態,ACTION_TAKEN)

我假設像這樣

  • 政策= [0.1,0.9]
  • action_onehot = action_taken = [0,1]
  • then action_prob = sum(policy * action_onehot)= 0.9

摘要

我們需要兩個功能

  • 更新功能:F(州,ACTION_TAKEN,獎勵)
  • 選擇動作函數:f(州)

你已經知道實現它不像典型的分類問題那麼簡單,只需要model.compile(...) - > model.fit(X,y)

然而,

  • 爲了充分利用Keras,你應該熟悉定義自定義損失函數和梯度。這與前者的作者基本上是一樣的。

  • 你應該閱讀Keras功能API的更多文檔和keras.backend

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

  • 前者被稱爲DDPG這實際上是從常規的政策梯度
  • 後者一個我看到的是完全不同的一個傳統的加固是基於Kapathy的政策梯度例如政策梯度(pg.py)。但是,它非常簡單,例如它只能假設一個動作。這就是爲什麼它可能以某種方式使用model.fit(...)來實現。

參考