資訊內(nèi)容
使用Python的OpenAI Gym對(duì)Deep Q-Learning的實(shí)操介紹(附學(xué)習(xí)資源)

翻譯 | 張睿毅
校對(duì) | 吳金笛
來源 | 數(shù)據(jù)派THU(ID:DatapiTHU)
導(dǎo)言
我一直對(duì)游戲著迷。在緊湊的時(shí)間線下執(zhí)行一個(gè)動(dòng)作似乎有無限的選擇——這是一個(gè)令人興奮的體驗(yàn)。沒有什么比這更好的了。
所以當(dāng)我讀到DeepMind提出的不可思議的算法(如AlphaGo和AlphaStar)時(shí),我被吸引了。我想學(xué)習(xí)如何在我自己的機(jī)器上制造這些系統(tǒng)。這讓我進(jìn)入了深度強(qiáng)化學(xué)習(xí)(Deep?RL)的世界。
即使你不喜歡玩游戲,深度強(qiáng)化學(xué)習(xí)也很重要。只用看當(dāng)前使用深度強(qiáng)化學(xué)習(xí)進(jìn)行研究的各種功能就知道了:

那工業(yè)級(jí)應(yīng)用程序呢?這里有兩個(gè)最常見的深度強(qiáng)化學(xué)習(xí)用例:
-
谷歌云自動(dòng)機(jī)器學(xué)習(xí)(Google’s Cloud AutoML)
-
臉書Horizon平臺(tái)(Facebook's Horizon Platform)
深度強(qiáng)化學(xué)習(xí)的范圍是巨大的。現(xiàn)在是一個(gè)進(jìn)入這個(gè)領(lǐng)域并并以此作為職業(yè)的好時(shí)機(jī)。
在這篇文章中,我的目標(biāo)是幫助您邁出第一步,進(jìn)入深度強(qiáng)化學(xué)習(xí)的世界。我們將使用強(qiáng)化學(xué)習(xí)中最流行的算法之一,Deep?Q-Learning,來了解強(qiáng)化學(xué)習(xí)是怎樣工作的。錦上添花的是什么呢?我們將使用Python在一個(gè)很棒的案例研究中實(shí)現(xiàn)我們的所有學(xué)習(xí)。
目錄
一、Q-Learning之路
二、為什么要做“深度”Q-Learning?
三、Deep?Q-Learning的簡(jiǎn)介
四、與深度學(xué)習(xí)相比,深度強(qiáng)化學(xué)習(xí)面臨的挑戰(zhàn)
-
4.1?目標(biāo)網(wǎng)絡(luò)
-
4.2?經(jīng)驗(yàn)回放
五、使用Keras?&?Gym?在Python中實(shí)現(xiàn)Deep?Q-Learning
一、Q-Learning之路
在正式深度強(qiáng)化學(xué)習(xí)之前,您應(yīng)該了解一些概念。別擔(dān)心,我已經(jīng)為你安排好了。
我以前寫過很多關(guān)于強(qiáng)化學(xué)習(xí)的文章,介紹了多臂抽獎(jiǎng)問題、動(dòng)態(tài)編程、蒙特卡羅學(xué)習(xí)和時(shí)間差分等概念。我建議按以下順序?yàn)g覽這些指南:
-
強(qiáng)化學(xué)習(xí)的基礎(chǔ)學(xué)習(xí):使用動(dòng)態(tài)編程的基于模型的規(guī)劃
https://www.analyticsvidhya.com/blog/2018/09/reinforcement-learning-model-based-planning-dynamic-programming/?
-
強(qiáng)化學(xué)習(xí)指南:從零開始用Python解決多臂抽獎(jiǎng)問題
https://www.analyticsvidhya.com/blog/2018/09/reinforcement-multi-armed-bandit-scratch-python/?utm_source=blog&utm_medium=introduction-deep-q-learning-python
-
強(qiáng)化學(xué)習(xí):通過OpenAI?GymToolkit介紹蒙特卡洛學(xué)習(xí)
https://www.analyticsvidhya.com/blog/2018/11/reinforcement-learning-introduction-monte-carlo-learning-openai-gym/?utm_source=blog&utm_medium=introduction-deep-q-learning-python?
-
蒙特卡羅樹搜索簡(jiǎn)介:DeepMind的AlphaGo背后的游戲改變算法
https://www.analyticsvidhya.com/blog/2019/01/monte-carlo-tree-search-introduction-algorithm-deepmind-alphago/?
-
強(qiáng)化學(xué)習(xí)的基礎(chǔ):時(shí)間差(TD)學(xué)習(xí)介紹
https://www.analyticsvidhya.com/blog/2019/03/reinforcement-learning-temporal-difference-learning/?utm_source=blog&utm_medium=introduction-deep-q-learning-python
這些文章足以從一開始就獲得基本強(qiáng)化學(xué)習(xí)的詳細(xì)概述。
但是,請(qǐng)注意,以上鏈接的文章絕不是讀者理解Deep?Q-Learning的先決條件。在探究什么是Deep?Q-Learning及其實(shí)現(xiàn)細(xì)節(jié)之前,我們將快速回顧一下基本的強(qiáng)化學(xué)習(xí)概念。
-
強(qiáng)化學(xué)習(xí)代理環(huán)境
強(qiáng)化學(xué)習(xí)任務(wù)是訓(xùn)練與環(huán)境交互的代理。代理通過執(zhí)行操作到達(dá)不同的場(chǎng)景,稱為狀態(tài)。行動(dòng)會(huì)帶來正面和負(fù)面的回報(bào)。
代理只有一個(gè)目的,那就是最大限度地提高一段經(jīng)歷的總回報(bào)。這個(gè)經(jīng)歷是環(huán)境中第一個(gè)狀態(tài)和最后一個(gè)或最終狀態(tài)之間發(fā)生的任何事情。我們加強(qiáng)了代理的學(xué)習(xí),以經(jīng)驗(yàn)來執(zhí)行最佳的行動(dòng)。這是戰(zhàn)略或原則。

讓我們舉一個(gè)非常流行的PubG游戲的例子:
-
士兵是這里與環(huán)境互動(dòng)的代理;
-
狀態(tài)就是我們?cè)谄聊簧峡吹降膬?nèi)容;
-
一段經(jīng)歷是一個(gè)完整的游戲;
-
動(dòng)作包括向前、向后、向左、向右、跳躍、躲避、射擊等;
-
獎(jiǎng)勵(lì)是根據(jù)這些行動(dòng)的結(jié)果確定的。如果士兵能夠殺死敵人,那就獲得一個(gè)正面的回報(bào),而被敵人射殺是一個(gè)負(fù)面的回報(bào)。
現(xiàn)在,為了殺死敵人或得到正面的回報(bào),需要一系列的行動(dòng)。這就是延遲或延遲獎(jiǎng)勵(lì)的概念開始發(fā)揮作用的地方。強(qiáng)化學(xué)習(xí)的關(guān)鍵是學(xué)習(xí)執(zhí)行這些序列并最大化回報(bào)。
-
馬爾科夫決策過程(MDP)
需要注意的一點(diǎn)是,環(huán)境中的每個(gè)狀態(tài)都是其先前狀態(tài)的結(jié)果,而先前狀態(tài)又是其先前狀態(tài)的結(jié)果。然而,存儲(chǔ)所有這些信息,即使是在短時(shí)間的經(jīng)歷中,也變得不可行。
為了解決這一問題,我們假設(shè)每個(gè)狀態(tài)都遵循馬爾可夫?qū)傩?,即每個(gè)狀態(tài)僅依賴于先前的狀態(tài)以及從該狀態(tài)到當(dāng)前狀態(tài)的轉(zhuǎn)換??纯聪旅娴拿詫m,以更好地了解這項(xiàng)工作背后的思想:

現(xiàn)在,有兩個(gè)場(chǎng)景具有兩個(gè)不同的起點(diǎn),代理通過不同的路徑到達(dá)相同的倒數(shù)第二狀態(tài)?,F(xiàn)在,不管代理通過什么路徑到達(dá)紅色狀態(tài)。走出迷宮并到達(dá)最后一個(gè)狀態(tài)的下一步是向右走。顯然,我們只需要紅色/倒數(shù)第二狀態(tài)的信息就可以找到下一個(gè)最佳的行為,這正是馬爾可夫?qū)傩运凳镜摹?
-
Q?學(xué)習(xí)
假設(shè)我們知道每一步行動(dòng)的預(yù)期回報(bào)。這基本上就像是給代理的一張備忘單!我們的代理會(huì)確切知道該采取什么行動(dòng)。
它將執(zhí)行最終產(chǎn)生最大總獎(jiǎng)勵(lì)的動(dòng)作序列??偦貓?bào)也稱為Q值,我們將把我們的策略公式化為:

上述方程表明,在狀態(tài)s和執(zhí)行動(dòng)作a產(chǎn)生的Q值是立即獎(jiǎng)勵(lì)r(s,?a)加上下一狀態(tài)s’ 可能的最高Q值。這里的gamma是折現(xiàn)系數(shù),它控制著未來獎(jiǎng)勵(lì)的貢獻(xiàn)。
q(s’,?a)又取決于q(s”,?a),該q(s”,?a)將具有伽馬平方系數(shù)。因此,Q值取決于未來狀態(tài)的Q值,如下所示:

調(diào)整gamma的值將減少或增加未來獎(jiǎng)勵(lì)的貢獻(xiàn)。
由于這是一個(gè)遞歸方程,我們可以從對(duì)所有Q值進(jìn)行任意假設(shè)開始。根據(jù)經(jīng)驗(yàn),它將收斂到最優(yōu)策略。在實(shí)際情況下,這是作為更新實(shí)現(xiàn)的:

其中alpha是學(xué)習(xí)速率或步長(zhǎng)。這就決定了新獲取的信息在多大程度上會(huì)覆蓋舊信息。
二、為什么選擇“深度”Q-Learning
Q-Learning是一個(gè)簡(jiǎn)單但功能強(qiáng)大的算法,可以為我們的代理提供一個(gè)備忘單,有助于代理準(zhǔn)確地確定要執(zhí)行的操作。
但如果這張備忘單太長(zhǎng)怎么辦?設(shè)想一個(gè)有10000個(gè)狀態(tài)的環(huán)境,每個(gè)狀態(tài)有1000個(gè)行動(dòng)。這將創(chuàng)建一個(gè)包含1000萬個(gè)單元格的表。事情很快就會(huì)失控!
很明顯,我們不能從已經(jīng)探索過的狀態(tài)中推斷出新狀態(tài)的Q值。這有兩個(gè)問題:
-
首先,保存和更新該表所需的內(nèi)存量將隨著狀態(tài)數(shù)的增加而增加。
-
第二,探索每個(gè)狀態(tài)創(chuàng)建所需Q表所需的時(shí)間量是不現(xiàn)實(shí)的。
這里有一個(gè)想法——如果我們用機(jī)器學(xué)習(xí)模型(比如神經(jīng)網(wǎng)絡(luò))來估計(jì)這些Q值會(huì)怎么樣?好吧,這就是DeepMind算法背后的想法,它使得谷歌以5億美元收購DeepMind!
三、Deep?Q-Learning的簡(jiǎn)介
在深度Q學(xué)習(xí)中,我們使用神經(jīng)網(wǎng)絡(luò)來近似Q值函數(shù)。狀態(tài)作為輸入,所有可能動(dòng)作的Q值作為輸出生成。Q-Learning和深度Q-Learning之間的比較如下:

那么,使用深度Q學(xué)習(xí)網(wǎng)絡(luò)(DQNs)強(qiáng)化學(xué)習(xí)的步驟是什么?
-
所有過去的經(jīng)驗(yàn)都由用戶存儲(chǔ)在內(nèi)存中。
-
下一步動(dòng)作由Q網(wǎng)絡(luò)的最大輸出決定。
-
這里的損失函數(shù)是預(yù)測(cè)的Q值和目標(biāo)Q值–Q*的均方誤差。
這基本上是一個(gè)回歸問題。然而,我們不知道這里的目標(biāo)或?qū)嶋H價(jià)值,因?yàn)槲覀冋谔幚硪粋€(gè)強(qiáng)化學(xué)習(xí)問題?;氐接韶悹柭匠虒?dǎo)出的Q值更新方程。我們有:

綠色部分表示目標(biāo)。我們可以說,它是在預(yù)測(cè)自己的價(jià)值,但由于R是無偏的真實(shí)回報(bào),網(wǎng)絡(luò)將使用反向傳播更新其梯度,最終收斂。
四、與深度學(xué)習(xí)相比,深度強(qiáng)化學(xué)習(xí)面臨的挑戰(zhàn)
到目前為止,這一切看起來都很棒。我們了解了神經(jīng)網(wǎng)絡(luò)如何幫助代理學(xué)習(xí)最佳行動(dòng)。然而,當(dāng)我們將深度強(qiáng)化學(xué)習(xí)與深度學(xué)習(xí)(DL)進(jìn)行比較時(shí),存在一個(gè)挑戰(zhàn):
-
非固定或不穩(wěn)定目標(biāo)
讓我們回到深度Q學(xué)習(xí)的偽代碼:

正如您在上面的代碼中看到的,目標(biāo)在每次迭代中都在不斷地變化。在深度學(xué)習(xí)中,目標(biāo)變量不變,因此訓(xùn)練是穩(wěn)定的,這對(duì)強(qiáng)化學(xué)習(xí)來說則不然。
綜上所述,我們經(jīng)常依賴于政策或價(jià)值函數(shù)來加強(qiáng)學(xué)習(xí),以獲取行動(dòng)樣本。然而,隨著我們不斷學(xué)習(xí)要探索什么,這種情況經(jīng)常發(fā)生變化。當(dāng)我們玩游戲時(shí),我們會(huì)更多地了解狀態(tài)和行為的基本真值,因此輸出也在變化。
因此,我們嘗試學(xué)習(xí)映射不斷變化的輸入和輸出。但是解決辦法是什么呢?
4.1 目標(biāo)網(wǎng)絡(luò)
由于同一個(gè)網(wǎng)絡(luò)正在計(jì)算預(yù)測(cè)值和目標(biāo)值,這兩者之間可能存在很大的差異。因此,我們可以使用兩個(gè)神經(jīng)網(wǎng)絡(luò)來代替使用1個(gè)神經(jīng)網(wǎng)絡(luò)來學(xué)習(xí)。
我們可以使用單獨(dú)的網(wǎng)絡(luò)來估計(jì)目標(biāo)。該目標(biāo)網(wǎng)絡(luò)與函數(shù)逼近器具有相同的結(jié)構(gòu),但參數(shù)是固定的。對(duì)于每個(gè)C迭代(超參數(shù)),預(yù)測(cè)網(wǎng)絡(luò)中的參數(shù)都會(huì)復(fù)制到目標(biāo)網(wǎng)絡(luò)中。這將導(dǎo)致更穩(wěn)定的訓(xùn)練,因?yàn)樗3帜繕?biāo)功能不變(在一段時(shí)間之內(nèi)):

4.2 經(jīng)驗(yàn)回放
要執(zhí)行經(jīng)驗(yàn)回放,我們存儲(chǔ)代理的經(jīng)驗(yàn)?–?et=(st,at,rt,st+1)
上面的陳述是什么意思?在模擬或?qū)嶋H經(jīng)驗(yàn)中,系統(tǒng)不會(huì)在狀態(tài)/動(dòng)作對(duì)上運(yùn)行Q-Learning,而是將為[狀態(tài)、動(dòng)作、獎(jiǎng)勵(lì)、下一個(gè)狀態(tài)]發(fā)現(xiàn)的數(shù)據(jù)存儲(chǔ)在一個(gè)大表中。
讓我們用一個(gè)例子來理解這一點(diǎn)。
假設(shè)我們?cè)噲D構(gòu)建一個(gè)視頻游戲機(jī)器人,其中游戲的每一幀表示不同的狀態(tài)。在訓(xùn)練過程中,我們可以從最后100000幀中隨機(jī)抽取64幀來訓(xùn)練我們的網(wǎng)絡(luò)。這將使我們得到一個(gè)子集,其中樣本之間的相關(guān)性較低,也將提供更好的采樣效率。
-
結(jié)合到一起
到目前為止我們學(xué)到的概念是什么?它們結(jié)合在一起,形成了用于在Atari游戲中實(shí)現(xiàn)人類級(jí)性能的深度Q學(xué)習(xí)算法(僅使用游戲的視頻幀)。

我在下面列出了Deep?Q-Network(DQN)中涉及的步驟:
-
對(duì)游戲畫面(狀態(tài)S)進(jìn)行預(yù)處理并反饋給DQN,DQN將返回狀態(tài)下所有可能動(dòng)作的Q值
-
使用epsilon貪婪策略選擇操作。用概率epsilon,我們選擇一個(gè)隨機(jī)動(dòng)作a并且概率為1-epsilon,我們選擇一個(gè)最大Q值的動(dòng)作,例如a=argmax(Q(s, a,?w))
-
在s狀態(tài)下執(zhí)行此操作并移動(dòng)到新的s狀態(tài)以獲得獎(jiǎng)勵(lì)。此狀態(tài)s'是下一個(gè)游戲屏幕的預(yù)處理圖像。我們將此轉(zhuǎn)換存儲(chǔ)在重播緩沖區(qū)中,如
-
接下來,從重放緩沖區(qū)中隨機(jī)抽取若干批轉(zhuǎn)換并計(jì)算損失。
-
已知:
,即目標(biāo)Q與預(yù)測(cè)Q的平方差。
-
根據(jù)我們的實(shí)際網(wǎng)絡(luò)參數(shù)進(jìn)行梯度下降,以盡量減少損失。
-
每次C迭代后,將我們的實(shí)際網(wǎng)絡(luò)權(quán)重復(fù)制到目標(biāo)網(wǎng)絡(luò)權(quán)重
-
對(duì)m個(gè)經(jīng)歷重復(fù)這些步驟
五、使用Keras?&?OpenAI?Gym?通過Python實(shí)現(xiàn)Deep?Q-Learning
好吧,這樣我們對(duì)深度Q學(xué)習(xí)的理論方面有了很好的了解?,F(xiàn)在就開始行動(dòng)怎么樣?沒錯(cuò)——讓我們啟動(dòng)我們的python?notebook吧!
我們會(huì)創(chuàng)造一個(gè)可以玩CartPole的代理。我們也可以使用Atari游戲,但是訓(xùn)練一個(gè)代理來玩需要一段時(shí)間(從幾個(gè)小時(shí)到一天)。我們的方法背后的思想將保持不變,所以你可以在你的機(jī)器上的Atari游戲上嘗試這個(gè)。

CartPole是OpenAI?gym(游戲模擬器)中最簡(jiǎn)單的環(huán)境之一。正如你在上面的動(dòng)畫中看到的,CartPole的目標(biāo)是平衡一個(gè)桿,這個(gè)桿與一個(gè)運(yùn)動(dòng)車頂部的接合處相連。
這里有四種由狀態(tài)給出的信息(如桿的角度和推車的位置),而不是像素信息。代理可以通過執(zhí)行一系列0或1操作來移動(dòng)車,將車向左或向右推。
我們將在這里使用Keras-rl庫,它允許我們實(shí)現(xiàn)深度Q學(xué)習(xí)。
第一步:安裝keras-rl庫
從終端運(yùn)行以下代碼塊:
git clone https://github.com/matthiasplappert/keras-rl.gitcd keras-rlpython setup.py install
第二步:?安裝Cartpole環(huán)境的依賴項(xiàng)
假設(shè)你已安裝pip,你需要安裝以下庫:
pip?install?h5pypip install gym
第三步:開始吧!
首先,我們導(dǎo)入必需的模塊:
import?numpy?as?npimport?gym
from?keras.models?import?Sequentialfrom?keras.layers?import?Dense,?Activation,?Flattenfrom?keras.optimizers?import?Adamfrom?rl.agents.dqn?import?DQNAgentfrom?rl.policy?import?EpsGreedyQPolicyfrom
rl.memory import SequentialMemory
之后,設(shè)置相關(guān)參數(shù):
ENV_NAME?=?'CartPole-v0'#?Get?the?environment?and?extract?the?number?of?actions?available?in?the?Cartpole?problemenv?=?gym.make(ENV_NAME)np.random.seed(123)env.seed(123)nb_actions = env.action_space.n
下一步,我們構(gòu)造一個(gè)非常簡(jiǎn)單的單一隱含層神經(jīng)網(wǎng)絡(luò)模型:
model?=?Sequential()model.add(Flatten(input_shape=(1,)?+?env.observation_space.shape))model.add(Dense(16))model.add(Activation('relu'))model.add(Dense(nb_actions))model.add(Activation('linear'))print(model.summary())
現(xiàn)在,配置和編譯我們的代理。我們將把我們的策略設(shè)置為epsilon greedy,把我們的內(nèi)存設(shè)置為順序內(nèi)存,因?yàn)槲覀兿M鎯?chǔ)我們所執(zhí)行的操作的結(jié)果以及每個(gè)操作獲得的獎(jiǎng)勵(lì)。
policy?=?EpsGreedyQPolicy()memory?=?SequentialMemory(limit=50000,?window_length=1)dqn?=?DQNAgent(model=model,?nb_actions=nb_actions,?memory=memory,?nb_steps_warmup=10,target_model_update=1e-2,?policy=policy)dqn.compile(Adam(lr=1e-3),?metrics=['mae'])#好吧,現(xiàn)在該學(xué)點(diǎn)東西了!我們把這里的訓(xùn)練具象化展示出來,但這會(huì)大大降低訓(xùn)練的速度。?dqn.fit(env, nb_steps=5000, visualize=True, verbose=2)
測(cè)試我們的強(qiáng)化學(xué)習(xí)模型:
dqn.test(env,?nb_episodes=5,?visualize=True)
這將是我們模型的輸出:

不錯(cuò)!祝賀您建立了第一個(gè)深度Q學(xué)習(xí)模型。
最后幾點(diǎn)
Openai Gym提供了幾種將DQN融合到Atari游戲中的環(huán)境。那些處理過計(jì)算機(jī)視覺問題的人可能會(huì)直觀地理解這一點(diǎn),因?yàn)檫@些問題的輸入在每個(gè)時(shí)間步驟都是游戲的直接幀,因此該模型由基于卷積神經(jīng)網(wǎng)絡(luò)的體系結(jié)構(gòu)組成。
有一些更先進(jìn)的深度強(qiáng)化學(xué)習(xí)技術(shù),如雙DQN網(wǎng)絡(luò),雙DQN和優(yōu)先經(jīng)驗(yàn)回放,可以進(jìn)一步改善學(xué)習(xí)過程。這些技巧讓我們用更少的片段獲得更好的分?jǐn)?shù)。我將在以后的文章中介紹這些概念。
我建議您在Cartpole之外的至少一個(gè)環(huán)境中嘗試DQN算法,以練習(xí)和理解如何調(diào)整模型以獲得最佳結(jié)果。
原文標(biāo)題:
A Hands-On Introduction to Deep Q-Learning using OpenAI Gym in Python
原文鏈接:
https://www.analyticsvidhya.com/blog/2019/04/introduction-deep-q-learning-python/?
(*本文僅代表作者觀點(diǎn),轉(zhuǎn)載請(qǐng)聯(lián)系原作者)
◆
聲明:本文章由網(wǎng)友投稿作為教育分享用途,如有侵權(quán)原作者可通過郵件及時(shí)和我們聯(lián)系刪除
