基於TensorFlow的強化學習,在《毀滅戰士》遊戲裡訓練Agent

  雷鋒網:本文原標題Reinforcement learning with TensorFlow,作者為Justin Francis,全文由雷鋒字幕組編譯。

  翻譯/ 林立宏 文加圖

  校對/ Julia

  整理/ 凡江

  深度強化學習(或者增強學習)是一個很難掌握的一個領域。在眾多各式各樣縮寫名詞和學習模型中,我們始終還是很難找到最好的解決強化學習問題的方法。強化學習理論並不是最近才出現的。實際上,一部分強化學習理論可以追溯到1950年代中期。如果你是強化學習的純新手,我建議你先看看我前面的文章《介紹強化學習和OpenAI Gym》來學習強化學習的基礎知識。

  深度強化學習需要更新大量梯度。有些深度學習的工具 ,比如TensorFlow在計算這些梯度的時候格外有用。 深度強化學習也需要可視化狀態來表現得更抽象,在這方面,卷積神經網絡表現最好。在這篇雷鋒網譯文中, 我們將會用到Python, TensorFlow和強化學習庫Gym來解決3D遊戲Doom(《毀滅戰士》)裡醫藥包收集的環境,想獲得全部版本的代碼和需要安裝的依賴,請訪問我們的GitHub倉庫和這篇文章的Jupyter Notebook。

  環境探測

  在這個環境中,玩家將扮演一個站在強腐蝕性水中的人,需要找到一條收集醫藥包並且安全離開的道路。

  圖1. 環境, Justin Francis提供

  我們能夠解決這個問題的一種強化學習方法是——結合基準算法的強化學習。這種強化會簡單點,它僅僅需要來自當前環境行為下的狀態和獎勵數據。強化也被稱為一種策略梯度方法,因為它僅僅評估和更新了智能體的策略。策略是當前狀態下智能體會表現出的行為。 例如,在遊戲pong(類似於打乒乓球)中, 一個簡單的策略是: 如果這個球以一定的角度移動,那麼最好的行為是對應這個角度移動擋板。除了用卷積神經網絡來評估給定狀態下的最好的策略,我們也用到相同的網絡根據給定狀態來評估價值或者預測長期的獎勵 。

  首先,我們會用Gym定義我們的環境

  在讓Agent學習之前,我們看這個是觀察一個隨機挑選的Agent的基準,很明顯我們還有很多需要學習的地方。

  圖 2.隨機代理, Justin Francis提供

  設置我們的學習環境

  強化學習被認為是學習中的蒙特卡洛方法,這意味著這個Agent將會在整個行為過程中收集數據並且在行為結束後開始計算。在我們的例子中,我們將會收集多種行為來訓練它。我們將會把我們的環境訓練數據初始化為空,然後逐步添加我們的訓練數據。

  接下來我們定義一些訓練我們的神經網絡過程中將會用到的超參數。

  Alpha 是我們的學習率, gamma 是獎勵折扣率。獎勵折扣是在給定智能體獎勵歷史的情況下評估未來可能的獎勵的一種方法。如果獎勵折扣率趨向於0,那麼Agent只需要關注當前的獎勵而不需要去考慮未來的獎勵。我們可以寫一個簡單的函數來評估某個行為下的一系列獎勵,下面是代碼:

  計算獎勵:

  你可以看到這些高折扣率的,由於後面有大的獎勵,中間的大的負獎勵就被忽視了。我們還可以給我們的折扣獎勵添加正規化,來確保我們的獎勵範圍保持在一定範圍內。這在解決doom環境中非常重要的。

  給定狀態下我們的價值函數會一直將不斷地試圖接近折扣獎勵。

  建立卷積神經網絡

  下一步,我們將建立卷積神經網絡來接收狀態,然後輸出對應動作的可能性和狀態值。我們會有三個可以選擇的動作:向前、後左和向右。這個近似策略的設置和圖像分類器是一樣的,但是不同的是輸入代表的是一個類的置信度,我們輸出會表示一個特定動作的置信度。對比於大的圖像分類模型,使用了增強學習,簡單的神經網絡會更好。

  我們會使用convnet ,和之前使用的著名DQN算法是類似的,我們的神經網絡會輸入一個壓縮大小為84X84像素的圖像,輸出一個16卷積4跨度的8X8內核,跟隨32個卷積4跨度的8X8內核,以一個完全連接的256層級的神經元結束。對於卷積層,我們會使用 VALID 填充,會極大縮小圖像的大小。

  我們的近似策略和我們的值策略,都會使用同樣的卷積神經元網絡去計算他們的值。

  在深度學習中,權重初始化是非常重要的,tf.layers默認會使用glorot uniform intializer,就是我們熟知的xavier初始化,來初始化權重。如果你用了太大的偏差來初始化權重的話,Agent會有有偏差,如果用了太小的偏差表現的極為隨機。理想的狀況是一開始的表現為隨機,然後慢慢改變權重的值去最大化獎勵。在增強學習中,這被稱為勘探和開採,是因為初始的時候Agent會表現為隨機探索環境,然後隨著每個的更新他會把可能的行為慢慢朝向能夠獲得好的獎勵的動作去靠。

  計算和提高性能

  現在我們建立了模型,但是我們要怎樣讓它開始學習呢?解決方法很簡單。我們想要改變神經網絡的權重來提高我們採取動作的置信度,改變多少則是基於如何準確估量我們的價值的基礎上。總體上,我們需要最小化我們的損失。

  在TensorFlow上面實現,計算我們的策略損失可以使用 sparse_softmax_cross_entropy 函數。稀疏意味著我們的行為標籤是單個整數,而logits是我們最終的未激活的策略輸出。這個函數計算了softmax和log 損失。這使得執行的動作的置信度接近1,損失接近0。

  然後,我們將交叉熵損失乘以貼現獎勵與我們的價值近似值的差值。 我們使用常見的平均誤差損失來計算我們的價值損失。然後我們把損失加在一起來計算我們的總損失。

  訓練Agent

  我們現在已經準備好去訓練Agent了。我們使用當前的狀態輸入到神經網絡中,通過調用tf.multinomial 函數獲取我們的動作,然後指定該動作並保留狀態,動作和未來的獎勵。我們存儲新的state2作為我們當前的狀態,重複這樣的步驟直到該場景的結束。然後我們加上狀態,動作和獎勵數據到一個新的列表中,然後我們會用這些輸入到網絡中,用於評估批次。

  根據我們的初始權重初始化,我們的Agent最終應該以大約200個訓練循環解決環境,平均獎勵1200。OpenAI的解決這個環境的標準是在超過100次試驗中能獲取1000的獎勵。允許Agent進一步訓練,平均能達到1700,但似乎沒有擊敗這個平均值。這是我的Agent經過1000次訓練循環:

  圖 3. 1,000遍後,Justin Francis提供

  為了更好的測試Agent的置信度,在給定任意幀圖像你需要將狀態輸入到神經網絡中並觀察輸出。這裡,當遇到牆的時候,Agent有90%的置信度這個需要採取向右是最好的動作,當接下來的圖像在右邊時候,Agent有61%的置信度得到向前是最好的動作。

  圖4. 狀態比較,Justin Francis提供

  仔細思考一下,你可能會認為,61%的信心似乎是一個明顯的好動作,這並不是那麼好,那你就是對的了。我懷疑我們的Agent主要是學會了避免牆壁,而且由於Agent只收到倖存的獎勵,它不是專門試圖拿起醫藥包。隨手撿起醫藥包,使得生存時間更長。在某些方面,我不會認為這個Agent是完全智能的。Agent也幾乎無視了左轉。Agent用了一個簡單的策略,它已經會自我學習,還挺有效的。

  圖 5. 損失和獎勵比較,Justin Francis提供

  深入一步

  現在,我希望你理解了策略梯度方法的基礎知識。更優的Actor-Critic方法、 A3C 或者 PPO,這些都是推動策略梯度方法進步的基石。增強模型不考慮狀態轉換,操作值或TD錯誤,也可以用於處理信用分配的問題。要解決這些問題,需要多個神經網絡和更多的智能訓練數據。還有很多方式可以用來提高性能,比如調整超參數。通過一些小的修改,你可以使用相同的網絡去解決更多的Atari遊戲問題。去試試吧,看看效果如何!

  雷鋒網(原作者注:這篇文章是由O'Reilly 和 TensorFlow. See our statement of editorial independence 合作完成。)

  原址:https://www.oreilly.com/ideas/reinforcement-learning-with-tensorflow

《更多精彩内容,按讚追蹤Gooread·精選!》
喜歡這篇文章嗎?立刻分享出去讓更多人知道~

    相關閱讀


您可能感興趣