1

pytorch神經網絡的典型骨架有一個forward()方法,然後我們根據正向傳遞的輸出計算損失,並在該損失上調用backward()來更新梯度。如果我的損失是外部確定的(例如通過在RL環境中運行模擬)會怎樣?我仍然可以這樣利用這種典型結構嗎?有沒有辦法在pytorch中使用外部丟失函數?

  • 這可能有點愚蠢,因爲我們不再確切知道每個輸出元素有多少影響損失,但也許有一些我不知道的詭計。否則,我不確定神經網絡如何與其他RL算法結合使用。

謝謝!

回答

1

在這種情況下,我最容易從損失計算中抽象出正向通行證(您的策略?)。這是因爲(如您所知),在大多數情況下,您需要從您的環境中獲取狀態,然後計算一個動作(本質上是正向傳球),然後將該動作反饋迴環境以獲得獎勵/損失來自你的環境。

當然,一旦計算出一個行動來計算結果損失,你可以在正向通行證內調用你的環境。但爲什麼要麻煩?一旦你在你的環境中採取了幾個步驟,直到你獲得獎勵/損失,它將變得更加複雜(儘管可能)。

我建議你看看下面的RL例子政策梯度openAI健身房內的應用程序:https://github.com/pytorch/examples/blob/master/reinforcement_learning/reinforce.py#L43

的基本思路是:

  • 創建策略(作爲nn.module)該狀態處於一個狀態並返回 隨機策略
  • 將策略的計算和策略的採樣從策略包裝到一個函數中。
  • 重複調用此函數以採取步驟通過您的環境,記錄行動和獎勵。
  • 一集完成後,註冊獎勵並僅執行反向傳播和漸變更新。

雖然這個例子是特定於REINFORCE的,但是構造代碼的一般思想適用於其他RL算法。另外,你會在同一個回購中找到另外兩個例子。

希望這會有所幫助。

相關問題