當前位置:
首頁 > 知識 > 用基於 TensorFlow 的強化學習在 Doom 中訓練 Agent

用基於 TensorFlow 的強化學習在 Doom 中訓練 Agent

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

深度強化學習需要更新大量梯度。有些深度學習的工具 ,比如 TensorFlow(https://www.tensorflow.org/) 在計算這些梯度的時候格外有用。 深度強化學習也需要可視化狀態來表現得更抽象,在這方面,卷積神經網路表現最好。在這篇雷鋒網譯文中, 我們將會用到 Python, TensorFlow 和強化學習庫 Gym(https://github.com/openai/gym) 來解決 3D 遊戲 Doom 里醫藥包收集的環境,想獲得全部版本的代碼和需要安裝的依賴,請訪問我們的 GitHub (http://t.cn/RQIvaN8)和這篇文章的 Jupyter Notebook(http://t.cn/RQIvaN8)。

翻譯 / 林立宏 文加圖

校對 / Julia

整理 / 凡江

環境探測

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

圖 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函數(http://t.cn/RQIPRc7)。稀疏意味著我們的行為標籤是單個整數,而 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 合作完成。)

CCF ADL 系列又一誠意課程

兩位全球計算機領域 Top 10 大神加盟

——韓家煒 & Philip S Yu

共 13 位專家,覆蓋計算機學科研究熱點

新人福利

關注 AI 研習社(okweiwu),回復1領取

【超過 1000G 神經網路 / AI / 大數據,教程,論文】

強化學習在生成對抗網路文本生成中扮演的角色(Role of RL in Text Generation by GAN)


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 AI研習社 的精彩文章:

進入微軟亞洲研究院是一個怎麼樣的面試流程?需要做好哪些準備?

TAG:AI研習社 |