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