0
本文作者: AI研習社-譯站 | 2018-01-16 11:48 |
雷鋒網(wǎng):本文原標題Reinforcement learning with TensorFlow,作者為Justin Francis,全文由雷鋒字幕組編譯。
翻譯/ 林立宏 文加圖
校對/ Julia
整理/ 凡江
深度強化學習(或者增強學習)是一個很難掌握的一個領域。在眾多各式各樣縮寫名詞和學習模型中,我們始終還是很難找到最好的解決強化學習問題的方法。強化學習理論并不是最近才出現(xiàn)的。實際上,一部分強化學習理論可以追溯到1950年代中期。如果你是強化學習的純新手,我建議你先看看我前面的文章《介紹強化學習和OpenAI Gym》來學習強化學習的基礎知識。
深度強化學習需要更新大量梯度。有些深度學習的工具 ,比如TensorFlow在計算這些梯度的時候格外有用。 深度強化學習也需要可視化狀態(tài)來表現(xiàn)得更抽象,在這方面,卷積神經(jīng)網(wǎng)絡表現(xiàn)最好。在這篇雷鋒網(wǎng)譯文中, 我們將會用到Python, TensorFlow和強化學習庫Gym來解決3D游戲Doom(《毀滅戰(zhàn)士》)里醫(yī)藥包收集的環(huán)境,想獲得全部版本的代碼和需要安裝的依賴,請訪問我們的GitHub倉庫和這篇文章的Jupyter Notebook。
環(huán)境探測
在這個環(huán)境中,玩家將扮演一個站在強腐蝕性水中的人,需要找到一條收集醫(yī)藥包并且安全離開的道路。
圖1. 環(huán)境, Justin Francis提供
我們能夠解決這個問題的一種強化學習方法是——結合基準算法的強化學習。這種強化會簡單點,它僅僅需要來自當前環(huán)境行為下的狀態(tài)和獎勵數(shù)據(jù)。強化也被稱為一種策略梯度方法,因為它僅僅評估和更新了智能體的策略。策略是當前狀態(tài)下智能體會表現(xiàn)出的行為。 例如,在游戲pong(類似于打乒乓球)中, 一個簡單的策略是: 如果這個球以一定的角度移動,那么最好的行為是對應這個角度移動擋板。除了用卷積神經(jīng)網(wǎng)絡來評估給定狀態(tài)下的最好的策略,我們也用到相同的網(wǎng)絡根據(jù)給定狀態(tài)來評估價值或者預測長期的獎勵 。
首先,我們會用Gym定義我們的環(huán)境
在讓Agent學習之前,我們看這個是觀察一個隨機挑選的Agent的基準,很明顯我們還有很多需要學習的地方。
圖 2. 隨機代理, Justin Francis提供
設置我們的學習環(huán)境
強化學習被認為是學習中的蒙特卡洛方法,這意味著這個Agent將會在整個行為過程中收集數(shù)據(jù)并且在行為結束后開始計算。在我們的例子中,我們將會收集多種行為來訓練它。我們將會把我們的環(huán)境訓練數(shù)據(jù)初始化為空,然后逐步添加我們的訓練數(shù)據(jù)。
接下來我們定義一些訓練我們的神經(jīng)網(wǎng)絡過程中將會用到的超參數(shù)。
Alpha 是我們的學習率, gamma 是獎勵折扣率。獎勵折扣是在給定智能體獎勵歷史的情況下評估未來可能的獎勵的一種方法。如果獎勵折扣率趨向于0,那么Agent只需要關注當前的獎勵而不需要去考慮未來的獎勵。我們可以寫一個簡單的函數(shù)來評估某個行為下的一系列獎勵,下面是代碼:
計算獎勵:
你可以看到這些高折扣率的,由于后面有大的獎勵,中間的大的負獎勵就被忽視了。我們還可以給我們的折扣獎勵添加正規(guī)化,來確保我們的獎勵范圍保持在一定范圍內(nèi)。這在解決doom環(huán)境中非常重要的。
給定狀態(tài)下我們的價值函數(shù)會一直將不斷地試圖接近折扣獎勵。
建立卷積神經(jīng)網(wǎng)絡
下一步,我們將建立卷積神經(jīng)網(wǎng)絡來接收狀態(tài),然后輸出對應動作的可能性和狀態(tài)值。我們會有三個可以選擇的動作:向前、后左和向右。這個近似策略的設置和圖像分類器是一樣的,但是不同的是輸入代表的是一個類的置信度,我們輸出會表示一個特定動作的置信度。對比于大的圖像分類模型,使用了增強學習,簡單的神經(jīng)網(wǎng)絡會更好。
我們會使用convnet ,和之前使用的著名DQN算法是類似的,我們的神經(jīng)網(wǎng)絡會輸入一個壓縮大小為84X84像素的圖像,輸出一個16卷積4跨度的8X8內(nèi)核,跟隨32個卷積4跨度的8X8內(nèi)核,以一個完全連接的256層級的神經(jīng)元結束。對于卷積層,我們會使用 VALID 填充,會極大縮小圖像的大小。
我們的近似策略和我們的值策略,都會使用同樣的卷積神經(jīng)元網(wǎng)絡去計算他們的值。
在深度學習中,權重初始化是非常重要的,tf.layers默認會使用glorot uniform intializer,就是我們熟知的xavier初始化,來初始化權重。如果你用了太大的偏差來初始化權重的話,Agent會有有偏差,如果用了太小的偏差表現(xiàn)的極為隨機。理想的狀況是一開始的表現(xiàn)為隨機,然后慢慢改變權重的值去最大化獎勵。在增強學習中,這被稱為勘探和開采,是因為初始的時候Agent會表現(xiàn)為隨機探索環(huán)境,然后隨著每個的更新他會把可能的行為慢慢朝向能夠獲得好的獎勵的動作去靠。
計算和提高性能
現(xiàn)在我們建立了模型,但是我們要怎樣讓它開始學習呢?解決方法很簡單。我們想要改變神經(jīng)網(wǎng)絡的權重來提高我們采取動作的置信度,改變多少則是基于如何準確估量我們的價值的基礎上??傮w上,我們需要最小化我們的損失。
在TensorFlow上面實現(xiàn),計算我們的策略損失可以使用 sparse_softmax_cross_entropy 函數(shù)。稀疏意味著我們的行為標簽是單個整數(shù),而logits是我們最終的未激活的策略輸出。這個函數(shù)計算了softmax和log 損失。這使得執(zhí)行的動作的置信度接近1,損失接近0。
然后,我們將交叉熵損失乘以貼現(xiàn)獎勵與我們的價值近似值的差值。 我們使用常見的平均誤差損失來計算我們的價值損失。然后我們把損失加在一起來計算我們的總損失。
訓練Agent
我們現(xiàn)在已經(jīng)準備好去訓練Agent了。我們使用當前的狀態(tài)輸入到神經(jīng)網(wǎng)絡中,通過調用tf.multinomial 函數(shù)獲取我們的動作,然后指定該動作并保留狀態(tài),動作和未來的獎勵。我們存儲新的state2作為我們當前的狀態(tài),重復這樣的步驟直到該場景的結束。然后我們加上狀態(tài),動作和獎勵數(shù)據(jù)到一個新的列表中,然后我們會用這些輸入到網(wǎng)絡中,用于評估批次。
根據(jù)我們的初始權重初始化,我們的Agent最終應該以大約200個訓練循環(huán)解決環(huán)境,平均獎勵1200。OpenAI的解決這個環(huán)境的標準是在超過100次試驗中能獲取1000的獎勵。允許Agent進一步訓練,平均能達到1700,但似乎沒有擊敗這個平均值。這是我的Agent經(jīng)過1000次訓練循環(huán):
圖 3. 1,000遍后,Justin Francis提供
為了更好的測試Agent的置信度,在給定任意幀圖像你需要將狀態(tài)輸入到神經(jīng)網(wǎng)絡中并觀察輸出。這里,當遇到墻的時候,Agent有90%的置信度這個需要采取向右是最好的動作,當接下來的圖像在右邊時候,Agent有61%的置信度得到向前是最好的動作。
圖4. 狀態(tài)比較,Justin Francis提供
仔細思考一下,你可能會認為,61%的信心似乎是一個明顯的好動作,這并不是那么好,那你就是對的了。我懷疑我們的Agent主要是學會了避免墻壁,而且由于Agent只收到幸存的獎勵,它不是專門試圖拿起醫(yī)藥包。隨手撿起醫(yī)藥包,使得生存時間更長。在某些方面,我不會認為這個Agent是完全智能的。Agent也幾乎無視了左轉。Agent用了一個簡單的策略,它已經(jīng)會自我學習,還挺有效的。
圖 5. 損失和獎勵比較,Justin Francis提供
深入一步
現(xiàn)在,我希望你理解了策略梯度方法的基礎知識。更優(yōu)的Actor-Critic方法、 A3C 或者 PPO,這些都是推動策略梯度方法進步的基石。增強模型不考慮狀態(tài)轉換,操作值或TD錯誤,也可以用于處理信用分配的問題。要解決這些問題,需要多個神經(jīng)網(wǎng)絡和更多的智能訓練數(shù)據(jù)。還有很多方式可以用來提高性能,比如調整超參數(shù)。通過一些小的修改,你可以使用相同的網(wǎng)絡去解決更多的Atari游戲問題。去試試吧,看看效果如何!
雷鋒網(wǎng)(原作者注:這篇文章是由O'Reilly 和 TensorFlow. See our statement of editorial independence 合作完成。)
原址:https://www.oreilly.com/ideas/reinforcement-learning-with-tensorflow
雷峰網(wǎng)原創(chuàng)文章,未經(jīng)授權禁止轉載。詳情見轉載須知。