本文為 AI 研習社編譯的技術博客,原標題 :
An introduction to Deep Q-Learning: let’s play Doom
作者 | Thomas Simonini
翻譯 | 斯蒂芬•二狗子
校對 | 醬番梨 整理 | 菠蘿妹
原文鏈接:
https://medium.freecodecamp.org/an-introduction-to-deep-q-learning-lets-play-doom-54d02d8017d8
深度強化學習從入門到大師:以Doom為例一文帶你讀懂深度Q學習(第三部分)
本文是Tensorflow深度強化學習課程的一部分。點擊這裡查看教學大綱。
上一次,我們學習了Q-Learning:一種算法,它生成一個Q表,Agent用它來查找給定狀態時採取的最佳動作。
但正如我們所看到的,狀態空間是大型環境時,生成和更新Q表可能會失效。
本文是關於深度強化學習的一系列博客文章的第三部分。有關更多信息和更多資源,請查看 課程的教學大綱。
今天,我們將創建一個Deep Q神經網絡。我們通過一個神經網絡實現,而不是使用Q表,該神經網絡獲取智能體的狀態併為該狀態的每個動作計算Q值。
多虧了這個模型,我們將能夠創建一個學習如何玩Doom的智能體 !
我們的DQN智能體
在本文中,您將學習:
什麼是Deep Q-Learning(DQL)?
使用DQL的最佳策略是什麼?
如何處理時間限制問題
為什麼我們使用經驗回放
DQL背後的數學是什麼?
如何在Tensorflow中實現它
為Q-Learning添加“深度”
在 上一篇文章中,我們通過Q學習算法創建了一個扮演Frozen Lake的智能體。
我們實現了Q-learning函數來創建和更新Q表。根據到當前的狀態,可以將此視為“作弊表”,以幫助我們找到行動的最大預期未來獎勵。這是一個很好的策略 - 但是,這種方法不可擴展。
想象一下我們今天要做的事情。我們將創建一個學習翫Doom的智能體。
Doom是一個擁有巨大狀態空間(數百萬不同state)的大環境。為該環境創建和更新Q表的效率可想而知。
在這種情況下,最好的想法是創建一個神經網絡 ,這個網絡在給定狀態的情況下 ,將近似每個動作的不同Q值。
Deep Q-Learning是如何工作的?
深度Q學習的架構:
這看起來很複雜,但我會逐步解釋這個架構。
我們的深度Q學習神經網絡以四個圖像幀的堆疊作為輸入。它們通過其網絡,並在給定狀態下為每個可能的動作輸出Q值向量。我們需要採用此向量的最大Q值來找到我們最好的行動。
一開始,智能體的表現非常糟糕。但隨著時間的推移,它開始將 圖像幀(狀態)與最佳動作聯繫起來。
預處理部分
預處理是重要的一步。我們希望降低狀態的複雜性,以減少培訓所需的計算時間。
首先,我們可以對每個state進行灰度化。顏色不會添加重要信息(在我們的例子中,我們只需要找到敵人並殺死他,我們不需要顏色來找到他)。這是一個重要的節省,因為我們將三種顏色通道(RGB)減少到1(灰度)。
然後,我們裁剪圖像。在我們的例子中,看到屋頂並不是真的有用。
然後我們減小每幀圖的大小,並將四個子幀疊加在一起。
時間限制的問題
Arthur Juliani 在他的文章中對這個主題給出了一個很棒的解釋 。他有一個聰明的主意:使用 LSTM神經網絡 來處理。
但是,我認為初學者使用堆疊圖像會更好。
您可能問的第一個問題是我們為什麼要將圖像幀疊加在一起?
我們將幀堆疊在一起,因為它有助於我們處理時間限制(temporal limitation)的問題。
讓我們舉一個例子,在 Pong 遊戲中。當你看到這個圖片時:
你能告訴我球在哪裡嗎?
不能,因為一幀圖片不足以產生運動感!
但是,如果我再添加三個幀怎麼辦?在這裡你可以看到球向右移動。
這對我們的Doom智能體來說是一樣的。如果我們一次只給他一幀圖片,它就不知道該如何行動了。如果不能確定物體移動的位置和速度,它怎麼能做出正確的決定呢?
使用卷積網絡
幀由三個卷積層處理。這些圖層允許您利用圖像中的空間關係。但是,因為幀堆疊在一起,您可以利用這些幀的一些空間屬性。
如果你不熟悉卷積,請仔細閱讀 Adam Geitgey 的 文章 。
每個卷積層將使用 ELU 作為激活函數。ELU已被證明是卷積層的較好 激活函數。
我們設定一個具有ELU激活函數的完全連接層和一個輸出層(具有線性激活函數的完全連接層),其輸出為每個動作的Q值估計。
經驗回放:更有效地利用觀察到的體驗
經驗回放將幫助我們處理兩件事:
避免忘記以前的經歷。
減少經驗之間的相關性。
我將解釋這兩個概念。
這部分和插圖的靈感來自Udacity的Deep Learning Foundations Nanodegree的Deep Q Learning章節中的重要解釋 。
避免忘記以前的經歷
我們有一個很大的問題:權重的可變性,因為行動和狀態之間存在高度相關性。
請記住在第一篇文章(強化學習簡介)中,我們談到了強化學習過程:
在每個時間步,得到一個元組(state, action, reward, new_state)。從(這個元組)中學習,然後扔掉這個經驗。
問題是將智能體與環境相互作用的得到序列樣本輸入到神經網絡進行訓練過程中。 神經網絡往往會忘記以前的經歷,因為它的參數會被新的經驗覆蓋。
例如,當前超級瑪麗的的第一關,然後是第二關(這個環境是完全不同的),我們的智能體就會忘記如何在第一關中進行行動。
通過學習如何在水中玩,我們的智能體會忘記如何在第一關發揮
因此,通過多次學習,可以更有效地利用以前的經驗。
我們的解決方案:創建一個“replay buffer”存盤。在智能體與環境交互時存儲經驗元組,然後我們用小批量元組數據a small batch of tuple來訓練神經網絡。
“replay buffer”可以看成一個文件夾,其中每個工作表都是經驗元組。通過智能體與環境交互來產生。然後你拿其中的一些隨機表來訓練神經網絡
這可以防止網絡只學習智能體當前的經驗。
減少經驗之間的相關性
我們還有另一個問題 - 我們知道每個行動都會影響下一個狀態。行動過程得到了一個序列的經驗元組,這些元組可能會高度相關。
如果按序列順序訓練網絡,這種相關性會影響我們的智能體。
通過在replay buffer隨機抽取,我們可以打破這種相關性。可以防止動作值發生振盪或發散。
通過一個例子來理解它會更容易。假設我們玩第一人稱射擊遊戲,怪物不斷出現左邊或右邊。智能體的目標是射擊怪物。它有兩個槍和兩個動作:向左射擊或向右射擊。
該表表示Q值近似值
我們學習有序的經驗。假設我們知道如果我們射擊怪物,下一個怪物來自同一方向的概率是70%。在我們的例子中,這是我們的經驗元組之間的相關性。
開始訓練吧。智能體看到了右邊的怪物,並用右槍射擊它。這是對的!
然後下一個怪物也來自右邊(概率為70%),智能體將使用右槍射擊。再次命中,這很好!
等等......
紅槍是採取的行動
問題是,這種方法增加了在整個狀態空間使用右槍的權重值。
我們可以看到怪物在左邊並用右槍射擊的Q值是正的(即使它不合理)
如果網絡沒有看到很多左邊的例子(因為只有30%可能來自左邊), 智能體 只會選擇右邊而不管怪物來自哪裡。這根本不合理。
即使怪物出現在左側,我們的經紀人也會用右槍射擊
我們有兩個並行的策略來處理這個問題。
首先,在與環境交互的時必須停止學習。我們應該嘗試探索不同的東西並隨意玩一下來探索狀態空間。我們可以將這些經驗保存在replay buffer中。
然後,可以回放這些經歷並從中學習。之後,繼續玩返回更新值函數。
因此,我們將有一套更好的樣本。通過這些示例能夠概括遊戲的真實模式,以任何順序回放。
這有助於避免被固定在狀態空間的一個區域上。這可以防止反覆強化相同的動作。
這種方法可以看作是監督學習的一種形式。
我們將在以後的文章中看到我們也可以使用“優先級經驗回放”。這讓我們可以更頻繁地向神經網絡呈現罕見或“重要”的元組。
我們的深度Q-Learning算法
首先是一點點數學:
記得,我們使用Bellman方程更新給定狀態和動作的Q值:
在我們的例子中,更新的神經網絡權重以減少錯誤。
時序差分誤差(或TD誤差)是通過Q_target(來自下一個狀態的最大可能值)和Q_value(我們當前預測的Q值)之間的差來計算的。
Initialize Doom Environment E
Initialize replay Memory M with capacity N (= finite capacity)
Initialize the DQN weights w
for episode in max_episode:
s = Environment state
for steps in max_steps:
Choose action a from state s using epsilon greedy.
Take action a, get r (reward) and s' (next state)
Store experience tuple > in M
s = s' (state = new_state)
Get random minibatch of exp tuples from M
Set Q_target = reward(s,a) + γmaxQ(s')
Update w = α(Q_target - Q_value) * ∇w Q_value
此算法中有兩個過程:
我們對執行操作的環境進行採樣,並將觀察存儲在回放內存中的經驗元組。
選擇小批量的元組隨機梯度下降(batch SGD)進行學習。
讓我們實現我們的Deep Q神經網絡
我們製作了一個視頻,用Tensorflow實現了一個深度Q學習agent,學習翫Atari Space Invaders?️?。
使用 Tensorflow 和Space Invaders進行深度Q學習 - (教程)
現在我們知道它是如何工作的,我們將逐步實現我們的Deep Q神經網絡。代碼的每個步驟和每個部分都直接在下面鏈接的Jupyter筆記本中解釋。
您可以在Deep Reinforcement Learning Course repo 中訪問它:
https://gist.github.com/simoninithomas/7611db5d8a6f3edde269e18b97fa4d0c#file-deep-q-learning-with-doom-ipynb
就這樣!您剛剛創建了一個學習翫Doom的智能體。真棒!
不要忘記自己實現代碼的每個部分。嘗試修改我給你的代碼非常重要。嘗試添加epochs,更改架構architecture,,添加固定的Q值,更改學習率,使用更難的環境(例如Health Gathering)......等等。玩得開心!
在下一篇文章中,我將討論Deep Q-learning的最新改進:
Fixed Q-values
Prioritized Experience Replay
Double DQN
Dueling Networks
但是下次我們將通過訓練一個扮演毀滅戰士的智能體來研究策略梯度,將通過收集“health”來嘗試在惡劣的環境中生存。
想要繼續查看該篇文章相關鏈接和參考文獻?
長按鏈接點擊打開或點擊底部【深度強化學習從入門到大師:以Doom為例一文帶你讀懂深度Q學習(第三部分】:
https://ai.yanxishe.com/page/TextTranslation/1395
AI研習社每日更新精彩內容,觀看更多精彩內容:雷鋒網雷鋒網雷鋒網
用PyTorch來做物體檢測和追蹤
用 Python 做機器學習不得不收藏的重要庫
初學者怎樣使用Keras進行遷移學習
一文帶你讀懂 WaveNet:谷歌助手的聲音合成器
等你來譯:
強化學習:通往基於情感的行為系統
如何用Keras來構建LSTM模型,並且調參
高級DQNs:利用深度強化學習翫吃豆人遊戲
用於深度強化學習的結構化控制網絡 (ICML 論文講解)
閱讀更多 雷鋒網 的文章