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