0
本文作者: AI研習(xí)社-譯站 | 2019-01-14 10:47 |
本文為 AI 研習(xí)社編譯的技術(shù)博客,原標題 :
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
深度強化學(xué)習(xí)從入門到大師:以Doom為例一文帶你讀懂深度Q學(xué)習(xí)(第三部分)
本文是Tensorflow深度強化學(xué)習(xí)課程的一部分。點擊這里查看教學(xué)大綱。
上一次,我們學(xué)習(xí)了Q-Learning:一種算法,它生成一個Q表,Agent用它來查找給定狀態(tài)時采取的最佳動作。
但正如我們所看到的,狀態(tài)空間是大型環(huán)境時,生成和更新Q表可能會失效。
本文是關(guān)于深度強化學(xué)習(xí)的一系列博客文章的第三部分。有關(guān)更多信息和更多資源,請查看 課程的教學(xué)大綱。
今天,我們將創(chuàng)建一個Deep Q神經(jīng)網(wǎng)絡(luò)。我們通過一個神經(jīng)網(wǎng)絡(luò)實現(xiàn),而不是使用Q表,該神經(jīng)網(wǎng)絡(luò)獲取智能體的狀態(tài)并為該狀態(tài)的每個動作計算Q值。
多虧了這個模型,我們將能夠創(chuàng)建一個學(xué)習(xí)如何玩Doom的智能體 !
我們的DQN智能體
在本文中,您將學(xué)習(xí):
什么是Deep Q-Learning(DQL)?
使用DQL的最佳策略是什么?
如何處理時間限制問題
為什么我們使用經(jīng)驗回放
DQL背后的數(shù)學(xué)是什么?
如何在Tensorflow中實現(xiàn)它
在 上一篇文章中,我們通過Q學(xué)習(xí)算法創(chuàng)建了一個扮演Frozen Lake的智能體。
我們實現(xiàn)了Q-learning函數(shù)來創(chuàng)建和更新Q表。根據(jù)到當前的狀態(tài),可以將此視為“作弊表”,以幫助我們找到行動的最大預(yù)期未來獎勵。這是一個很好的策略 - 但是,這種方法不可擴展。
想象一下我們今天要做的事情。我們將創(chuàng)建一個學(xué)習(xí)玩Doom的智能體。
Doom是一個擁有巨大狀態(tài)空間(數(shù)百萬不同state)的大環(huán)境。為該環(huán)境創(chuàng)建和更新Q表的效率可想而知。
在這種情況下,最好的想法是創(chuàng)建一個神經(jīng)網(wǎng)絡(luò) ,這個網(wǎng)絡(luò)在給定狀態(tài)的情況下 ,將近似每個動作的不同Q值。
深度Q學(xué)習(xí)的架構(gòu):
這看起來很復(fù)雜,但我會逐步解釋這個架構(gòu)。
我們的深度Q學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)以四個圖像幀的堆疊作為輸入。它們通過其網(wǎng)絡(luò),并在給定狀態(tài)下為每個可能的動作輸出Q值向量。我們需要采用此向量的最大Q值來找到我們最好的行動。
一開始,智能體的表現(xiàn)非常糟糕。但隨著時間的推移,它開始將 圖像幀(狀態(tài))與最佳動作聯(lián)系起來。
預(yù)處理部分
預(yù)處理是重要的一步。我們希望降低狀態(tài)的復(fù)雜性,以減少培訓(xùn)所需的計算時間。
首先,我們可以對每個state進行灰度化。顏色不會添加重要信息(在我們的例子中,我們只需要找到敵人并殺死他,我們不需要顏色來找到他)。這是一個重要的節(jié)省,因為我們將三種顏色通道(RGB)減少到1(灰度)。
然后,我們裁剪圖像。在我們的例子中,看到屋頂并不是真的有用。
然后我們減小每幀圖的大小,并將四個子幀疊加在一起。
時間限制的問題
Arthur Juliani 在他的文章中對這個主題給出了一個很棒的解釋 。他有一個聰明的主意:使用 LSTM神經(jīng)網(wǎng)絡(luò) 來處理。
但是,我認為初學(xué)者使用堆疊圖像會更好。
您可能問的第一個問題是我們?yōu)槭裁匆獙D像幀疊加在一起?
我們將幀堆疊在一起,因為它有助于我們處理時間限制(temporal limitation)的問題。
讓我們舉一個例子,在 Pong 游戲中。當你看到這個圖片時:
你能告訴我球在哪里嗎?
不能,因為一幀圖片不足以產(chǎn)生運動感!
但是,如果我再添加三個幀怎么辦?在這里你可以看到球向右移動。
這對我們的Doom智能體來說是一樣的。如果我們一次只給他一幀圖片,它就不知道該如何行動了。如果不能確定物體移動的位置和速度,它怎么能做出正確的決定呢?
使用卷積網(wǎng)絡(luò)
幀由三個卷積層處理。這些圖層允許您利用圖像中的空間關(guān)系。但是,因為幀堆疊在一起,您可以利用這些幀的一些空間屬性。
如果你不熟悉卷積,請仔細閱讀 Adam Geitgey 的 文章 。
每個卷積層將使用 ELU 作為激活函數(shù)。ELU已被證明是卷積層的較好 激活函數(shù)。
我們設(shè)定一個具有ELU激活函數(shù)的完全連接層和一個輸出層(具有線性激活函數(shù)的完全連接層),其輸出為每個動作的Q值估計。
經(jīng)驗回放:更有效地利用觀察到的體驗
經(jīng)驗回放將幫助我們處理兩件事:
避免忘記以前的經(jīng)歷。
減少經(jīng)驗之間的相關(guān)性。
我將解釋這兩個概念。
這部分和插圖的靈感來自Udacity的Deep Learning Foundations Nanodegree的Deep Q Learning章節(jié)中的重要解釋 。
避免忘記以前的經(jīng)歷
我們有一個很大的問題:權(quán)重的可變性,因為行動和狀態(tài)之間存在高度相關(guān)性。
請記住在第一篇文章(強化學(xué)習(xí)簡介)中,我們談到了強化學(xué)習(xí)過程:
在每個時間步,得到一個元組(state, action, reward, new_state)。從(這個元組)中學(xué)習(xí),然后扔掉這個經(jīng)驗。
問題是將智能體與環(huán)境相互作用的得到序列樣本輸入到神經(jīng)網(wǎng)絡(luò)進行訓(xùn)練過程中。 神經(jīng)網(wǎng)絡(luò)往往會忘記以前的經(jīng)歷,因為它的參數(shù)會被新的經(jīng)驗覆蓋。
例如,當前超級瑪麗的的第一關(guān),然后是第二關(guān)(這個環(huán)境是完全不同的),我們的智能體就會忘記如何在第一關(guān)中進行行動。
通過學(xué)習(xí)如何在水中玩,我們的智能體會忘記如何在第一關(guān)發(fā)揮
因此,通過多次學(xué)習(xí),可以更有效地利用以前的經(jīng)驗。
我們的解決方案:創(chuàng)建一個“replay buffer”存盤。在智能體與環(huán)境交互時存儲經(jīng)驗元組,然后我們用小批量元組數(shù)據(jù)a small batch of tuple來訓(xùn)練神經(jīng)網(wǎng)絡(luò)。
“replay buffer”可以看成一個文件夾,其中每個工作表都是經(jīng)驗元組。通過智能體與環(huán)境交互來產(chǎn)生。然后你拿其中的一些隨機表來訓(xùn)練神經(jīng)網(wǎng)絡(luò)
這可以防止網(wǎng)絡(luò)只學(xué)習(xí)智能體當前的經(jīng)驗。
減少經(jīng)驗之間的相關(guān)性
我們還有另一個問題 - 我們知道每個行動都會影響下一個狀態(tài)。行動過程得到了一個序列的經(jīng)驗元組,這些元組可能會高度相關(guān)。
如果按序列順序訓(xùn)練網(wǎng)絡(luò),這種相關(guān)性會影響我們的智能體。
通過在replay buffer隨機抽取,我們可以打破這種相關(guān)性。可以防止動作值發(fā)生振蕩或發(fā)散。
通過一個例子來理解它會更容易。假設(shè)我們玩第一人稱射擊游戲,怪物不斷出現(xiàn)左邊或右邊。智能體的目標是射擊怪物。它有兩個槍和兩個動作:向左射擊或向右射擊。
該表表示Q值近似值
我們學(xué)習(xí)有序的經(jīng)驗。假設(shè)我們知道如果我們射擊怪物,下一個怪物來自同一方向的概率是70%。在我們的例子中,這是我們的經(jīng)驗元組之間的相關(guān)性。
開始訓(xùn)練吧。智能體看到了右邊的怪物,并用右槍射擊它。這是對的!
然后下一個怪物也來自右邊(概率為70%),智能體將使用右槍射擊。再次命中,這很好!
等等......
紅槍是采取的行動
問題是,這種方法增加了在整個狀態(tài)空間使用右槍的權(quán)重值。
我們可以看到怪物在左邊并用右槍射擊的Q值是正的(即使它不合理)
如果網(wǎng)絡(luò)沒有看到很多左邊的例子(因為只有30%可能來自左邊), 智能體 只會選擇右邊而不管怪物來自哪里。這根本不合理。
即使怪物出現(xiàn)在左側(cè),我們的經(jīng)紀人也會用右槍射擊
我們有兩個并行的策略來處理這個問題。
首先,在與環(huán)境交互的時必須停止學(xué)習(xí)。我們應(yīng)該嘗試探索不同的東西并隨意玩一下來探索狀態(tài)空間。我們可以將這些經(jīng)驗保存在replay buffer中。
然后,可以回放這些經(jīng)歷并從中學(xué)習(xí)。之后,繼續(xù)玩返回更新值函數(shù)。
因此,我們將有一套更好的樣本。通過這些示例能夠概括游戲的真實模式,以任何順序回放。
這有助于避免被固定在狀態(tài)空間的一個區(qū)域上。這可以防止反復(fù)強化相同的動作。
這種方法可以看作是監(jiān)督學(xué)習(xí)的一種形式。
我們將在以后的文章中看到我們也可以使用“優(yōu)先級經(jīng)驗回放”。這讓我們可以更頻繁地向神經(jīng)網(wǎng)絡(luò)呈現(xiàn)罕見或“重要”的元組。
首先是一點點數(shù)學(xué):
記得,我們使用Bellman方程更新給定狀態(tài)和動作的Q值:
在我們的例子中,更新的神經(jīng)網(wǎng)絡(luò)權(quán)重以減少錯誤。
時序差分誤差(或TD誤差)是通過Q_target(來自下一個狀態(tài)的最大可能值)和Q_value(我們當前預(yù)測的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 <s, a, r, s'> 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
此算法中有兩個過程:
我們對執(zhí)行操作的環(huán)境進行采樣,并將觀察存儲在回放內(nèi)存中的經(jīng)驗元組。
選擇小批量的元組隨機梯度下降(batch SGD)進行學(xué)習(xí)。
我們制作了一個視頻,用Tensorflow實現(xiàn)了一個深度Q學(xué)習(xí)agent,學(xué)習(xí)玩Atari Space Invaders???。
使用 Tensorflow 和Space Invaders進行深度Q學(xué)習(xí) - (教程)
現(xiàn)在我們知道它是如何工作的,我們將逐步實現(xiàn)我們的Deep Q神經(jīng)網(wǎng)絡(luò)。代碼的每個步驟和每個部分都直接在下面鏈接的Jupyter筆記本中解釋。
您可以在Deep Reinforcement Learning Course repo 中訪問它:
https://gist.github.com/simoninithomas/7611db5d8a6f3edde269e18b97fa4d0c#file-deep-q-learning-with-doom-ipynb
就這樣!您剛剛創(chuàng)建了一個學(xué)習(xí)玩Doom的智能體。真棒!
不要忘記自己實現(xiàn)代碼的每個部分。嘗試修改我給你的代碼非常重要。嘗試添加epochs,更改架構(gòu)architecture,,添加固定的Q值,更改學(xué)習(xí)率,使用更難的環(huán)境(例如Health Gathering)......等等。玩得開心!
在下一篇文章中,我將討論Deep Q-learning的最新改進:
Fixed Q-values
Prioritized Experience Replay
Double DQN
Dueling Networks
但是下次我們將通過訓(xùn)練一個扮演毀滅戰(zhàn)士的智能體來研究策略梯度,將通過收集“health”來嘗試在惡劣的環(huán)境中生存。
想要繼續(xù)查看該篇文章相關(guān)鏈接和參考文獻?
長按鏈接點擊打開或點擊底部【深度強化學(xué)習(xí)從入門到大師:以Doom為例一文帶你讀懂深度Q學(xué)習(xí)(第三部分】:
https://ai.yanxishe.com/page/TextTranslation/1395
AI研習(xí)社每日更新精彩內(nèi)容,觀看更多精彩內(nèi)容:雷鋒網(wǎng)雷鋒網(wǎng)雷鋒網(wǎng)
等你來譯:
雷峰網(wǎng)原創(chuàng)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。