當前位置:
首頁 > 知識 > 入門必看 | 深度Q-learning簡介【RL系列】

入門必看 | 深度Q-learning簡介【RL系列】

下載方式


方式一


公眾號後天回復「20180803」


作者 | Robbie Allen



編譯 | 專知

整理 | Sanglei, Shengsheng


添加微信:MLAPython



(姓名-單位-方向)


即可加入機器學習交流群





 今天,我們將構建一個深度Q網路,為環境中的agent實現一個可以獲取環境狀態信息以及近似Q-value的神經網路。



        多虧這個模型,我們才可以使用agent打Doom遊戲。


在這篇文章中,你將學到:





    • 什麼是深度Q學習(DQL)。



    • DQL中的最好策略是什麼?



    • 如何解決Temporal limitation問題?



    • 為什麼我們使用經驗回放?



    • DQL背後的數學理論是什麼?



    • 如何通過tensorflow實現?





在Q-learning中加入「Deep」


我們基於Q-learning方法構建了一個可以玩Frozen Lake遊戲的agent。當時實現了Q-learing方法並可以更新Q-table。以此表作為「備忘錄」來幫助我們找到當給定環境狀態時,在未來獲得最佳獎勵的行為。這是一個好策略,但卻擴展性很低。




今天,我們將創建一個可以玩Doom的agent。Doom內的環境非常巨大(百萬級的狀態集)。創建Q-table並更新它們非常不易。

最好的做法是,構建一個神經網路,以近似得出各個狀態下行為的Q-values。




如何令深度Q學習工作呢?




這看起來非常複雜,但我們將一步一步完成解釋。

我們的深度Q神經網路的每次輸入是4幀圖片,輸出為各環境下的每個可選行為的Q-values向量。我們需要找到向量中最大的Q-value,以幫我們做出最好的行為決策。




開始,agent的錯誤很多,但一段時間後,就可以將每幀畫面(環境)與最好的行為關聯起來





預處理部分





預處理是非常重要的一步,我們希望減少狀態的複雜度,以幫助減少訓練過程所需的計算時間。




首先,我們將每幀圖像轉換為灰度圖,因為在我們的例子中,色彩並沒有提供很多的重要信息。之後,我們將每幀圖片切分,在例子中,屋頂的價值並不大。最後,減少幀的大小,並將每四幀分為一組。




Temporal limitation問題



關於這個問題,Arthur Juliani在他的文章中給出了詳細的解釋。他提出了一個想法,通過LSTM神經網路解決這一問題。但是,我認為對於初學者來說,將多個幀分成一組的方法更加合適。




你也許會問,為什麼需要將每幀圖片分為一組?這是由於可以幫我們解決temporal limitation問題。具體例子如下,在Pong遊戲中,當你看到這一幀:






你能告訴我這個球會往哪去嗎?當然不行,因為只有一幀圖片是無法做出判斷的。但是如果增加幾幀信息,就可以很清晰的知道球正朝右邊運動。




對於我們的Doom agent來說,道理相同,如果一次只輸入一幀,則無法知道運動細節,也就則無法做出正確的決策了。






使用卷積神經網路


這些幀圖片將使用三個卷積層進行處理。這些網路層可以允許agent發現圖片之間的空間關係。




如果你對卷積方法不是很了解,那麼可以閱讀如下文章。




每個卷積層將使用ELU作為激活函數。在網路中,我們採用一個使用激活函數為ELU的全連接層、一個輸出層(採用線性激活函數的全連接層)來為每個行為計算Q-value值。




經驗回放:給觀察經驗帶來更大的效率


經驗回放可以幫我們解決兩個問題:





    • 避免遺忘之前的經驗。



    • 減少經驗之間的相關性




我將解釋這兩種概念。這部分的靈感來自於Udacity中深度學習基礎的深度Q學習章節。




1、避免遺忘之前的經驗


這裡遇到各大問題:由於環境與行為間的高相關性,權重是可變化的。







在每一個時間步中,我們都會接受一個元祖(狀態、行為、反饋、新狀態),模型從中學習並獲得經驗。




我們的問題是在與環境的交互過程中獲得了連續樣本,並且它傾向於忘記之前的經驗。例如,如果我們完成了第一級到第二級的行為,隨著時間的推移,agent將傾向於忘記它是如何從第一級運動到第二級的。





在多個時間點使用之前的行為,將有助於學習進程變得更加高效。




我們的解決辦法是,創建一個「回放緩存」,其中存儲的經驗元祖將於環境進行交互,之後我們採樣到部分樣本,輸入至神經網路中。


 





2、減少經驗間的相關性


此處有另一個問題,我們知道每個行為都會對下一個狀態產生影響。輸出一組經驗元組序列,有可能存在很高的相關性。如果我們在序列順序上進行訓練,有可能會使agent被相關性所影響。




通過對經驗回放的隨機採樣,可以破壞這種相關性。以預防agent災難性的震蕩於消散。




可以通過例子來簡單理解一下,首先,我們使用第一個射手,對面是一個怪獸,可以從左運動到右。我們有兩把槍於兩個可選動作,向左開槍與向右開槍。



我們通過經驗學習,如果擊中怪獸,怪獸從相同方向過來的概率為70%,在這個例子中,這就是我們經驗元組的相關性。




開始訓練,agent看到怪獸在右邊,並且使用右邊的搶開槍,正確!然後,下一個怪獸也從右邊經過(70%概率),並且agent同樣朝右開槍,再一次答對了!




 


問題在於這個方法增加了朝右開槍的評估值。


 



如果agent無法看到足夠多的左邊的例子(30%概率),那麼agent將認為朝右開槍始終是對的,而不關心其他的因素。



我們有兩種平行策略去解決這一問題。




首先,必須停止從環境的交互中學習,開始嘗試不同的方法,採用些隨機發現的狀態空間。並將結果保存至回放緩存中。




之後,可以調用這些經驗,並從其中學習,返回並更新值函數。




最後,將獲得一組更好的樣例,可以從其中獲得更好的泛化模式。




這會避免agent陷於狀態空間的某個區域之中,防止某個行為的循環強化。




這個方法可以認為是一種監督學習,在未來的文章中,我們可以看到使用優先經驗回放概念的想法,這將使神經網路更頻繁的獲得「重要」或「稀有」的動作樣本。




深度Q學習演算法


首先,我們需要了解下數學公式:回憶下Q函數的更新方法(Bellman equation):



在此次例子中,我們希望更新網路的權重以減少誤差。




誤差(TD誤差)通過計算Q_target(下一個時刻的最大可能值)與當前狀態下預測得到的Q-value間的差值來獲得。


 





在演算法中,出現了兩種處理過程。


1、

對環境採樣,並且將觀察到的信息存儲於回放緩存中。


2、

隨機選取一組小batch,並使用梯度下降方法進行迭代學習。




實現深度Q學習


此處有一個作者製作的視頻【8】,基於tensorflow創建一個會玩Atari Space Invaders的agent。




現在我們知道強化學習是如何工作的了,我們將一步步實現我們自己的深度Q學習模型。每一步的代碼都可以在下文中的Jupyter上面查看。



全部文檔及代碼見鏈接【9】。


 


















以上便是深度Q學習構建的全部內容了。在下一章中,將介紹深度Q學習的各類變體。




  • Fixed Q-values



  • Prioritized Experience Replay



  • Double DQN



  • Dueling Networks




[1] https://medium.freecodecamp.org/diving-deeper-into-reinforcement-learning-with-q-learning-c18d0db58efe


[2] https://simoninithomas.github.io/Deep_reinforcement_learning_Course/ 


[3] https://medium.com/@awjuliani


[4] https://medium.com/emergent-future/simple-reinforcement-learning-with-tensorflow-part-8-asynchronous-actor-critic-agents-a3c-c88f72a5e9f2


[5] http://colah.github.io/posts/2015-08-Understanding-LSTMs/


[6] https://medium.com/@ageitgey/machine-learning-is-fun-part-3-deep-learning-and-convolutional-neural-networks-f40359318721


[7] https://mp.weixin.qq.com/s?__biz=MzU2OTA0NzE2NA==&mid=2247491116&idx=1&sn=74dbd582e6fd0e5a9bd54c28187195dd&chksm=fc85ff3fcbf27629bdd356e0439258ea52f0cacd8390cce24b3c5d516684e2af296b7b2ebccf#rd


[8] https://youtu.be/gCJyVX98KJ4 


[9] https://github.com/simoninithomas/Deep_reinforcement_learning_Course/tree/master/DQN/doom 




原文鏈接:


https://medium.freecodecamp.org/an-introduction-to-deep-q-learning-lets-play-doom-54d02d8017d8






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

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

TAG: |