資訊內(nèi)容
使用Python的OpenAI Gym對Deep Q-Learning的實(shí)操介紹(附學(xué)習(xí)資源)
翻譯 | 張睿毅
校對 | 吳金笛
來源 | 數(shù)據(jù)派THU(ID:DatapiTHU)
導(dǎo)言
我一直對游戲著迷。在緊湊的時間線下執(zhí)行一個動作似乎有無限的選擇——這是一個令人興奮的體驗(yàn)。沒有什么比這更好的了。
所以當(dāng)我讀到DeepMind提出的不可思議的算法(如AlphaGo和AlphaStar)時,我被吸引了。我想學(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è)級應(yīng)用程序呢?這里有兩個最常見的深度強(qiáng)化學(xué)習(xí)用例:
-
谷歌云自動機(jī)器學(xué)習(xí)(Google’s Cloud AutoML)
-
臉書Horizon平臺(Facebook's Horizon Platform)
深度強(qiáng)化學(xué)習(xí)的范圍是巨大的?,F(xiàn)在是一個進(jìn)入這個領(lǐng)域并并以此作為職業(yè)的好時機(jī)。
在這篇文章中,我的目標(biāo)是幫助您邁出第一步,進(jìn)入深度強(qiáng)化學(xué)習(xí)的世界。我們將使用強(qiáng)化學(xué)習(xí)中最流行的算法之一,Deep?Q-Learning,來了解強(qiáng)化學(xué)習(xí)是怎樣工作的。錦上添花的是什么呢?我們將使用Python在一個很棒的案例研究中實(shí)現(xiàn)我們的所有學(xué)習(xí)。
目錄
一、Q-Learning之路
二、為什么要做“深度”Q-Learning?
三、Deep?Q-Learning的簡介
四、與深度學(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í)的文章,介紹了多臂抽獎問題、動態(tài)編程、蒙特卡羅學(xué)習(xí)和時間差分等概念。我建議按以下順序?yàn)g覽這些指南:
-
強(qiáng)化學(xué)習(xí)的基礎(chǔ)學(xué)習(xí):使用動態(tài)編程的基于模型的規(guī)劃
https://www.analyticsvidhya.com/blog/2018/09/reinforcement-learning-model-based-planning-dynamic-programming/?
-
強(qiáng)化學(xué)習(xí)指南:從零開始用Python解決多臂抽獎問題
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?
-
蒙特卡羅樹搜索簡介:DeepMind的AlphaGo背后的游戲改變算法
https://www.analyticsvidhya.com/blog/2019/01/monte-carlo-tree-search-introduction-algorithm-deepmind-alphago/?
-
強(qiáng)化學(xué)習(xí)的基礎(chǔ):時間差(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ì)概述。
但是,請注意,以上鏈接的文章絕不是讀者理解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á)不同的場景,稱為狀態(tài)。行動會帶來正面和負(fù)面的回報(bào)。
代理只有一個目的,那就是最大限度地提高一段經(jīng)歷的總回報(bào)。這個經(jīng)歷是環(huán)境中第一個狀態(tài)和最后一個或最終狀態(tài)之間發(fā)生的任何事情。我們加強(qiáng)了代理的學(xué)習(xí),以經(jīng)驗(yàn)來執(zhí)行最佳的行動。這是戰(zhàn)略或原則。
讓我們舉一個非常流行的PubG游戲的例子:
-
士兵是這里與環(huán)境互動的代理;
-
狀態(tài)就是我們在屏幕上看到的內(nèi)容;
-
一段經(jīng)歷是一個完整的游戲;
-
動作包括向前、向后、向左、向右、跳躍、躲避、射擊等;
-
獎勵是根據(jù)這些行動的結(jié)果確定的。如果士兵能夠殺死敵人,那就獲得一個正面的回報(bào),而被敵人射殺是一個負(fù)面的回報(bào)。
現(xiàn)在,為了殺死敵人或得到正面的回報(bào),需要一系列的行動。這就是延遲或延遲獎勵的概念開始發(fā)揮作用的地方。強(qiáng)化學(xué)習(xí)的關(guān)鍵是學(xué)習(xí)執(zhí)行這些序列并最大化回報(bào)。
-
馬爾科夫決策過程(MDP)
需要注意的一點(diǎn)是,環(huán)境中的每個狀態(tài)都是其先前狀態(tài)的結(jié)果,而先前狀態(tài)又是其先前狀態(tài)的結(jié)果。然而,存儲所有這些信息,即使是在短時間的經(jīng)歷中,也變得不可行。
為了解決這一問題,我們假設(shè)每個狀態(tài)都遵循馬爾可夫?qū)傩?,即每個狀態(tài)僅依賴于先前的狀態(tài)以及從該狀態(tài)到當(dāng)前狀態(tài)的轉(zhuǎn)換??纯聪旅娴拿詫m,以更好地了解這項(xiàng)工作背后的思想:
現(xiàn)在,有兩個場景具有兩個不同的起點(diǎn),代理通過不同的路徑到達(dá)相同的倒數(shù)第二狀態(tài)?,F(xiàn)在,不管代理通過什么路徑到達(dá)紅色狀態(tài)。走出迷宮并到達(dá)最后一個狀態(tài)的下一步是向右走。顯然,我們只需要紅色/倒數(shù)第二狀態(tài)的信息就可以找到下一個最佳的行為,這正是馬爾可夫?qū)傩运凳镜摹?
-
Q?學(xué)習(xí)
假設(shè)我們知道每一步行動的預(yù)期回報(bào)。這基本上就像是給代理的一張備忘單!我們的代理會確切知道該采取什么行動。
它將執(zhí)行最終產(chǎn)生最大總獎勵的動作序列。總回報(bào)也稱為Q值,我們將把我們的策略公式化為:
上述方程表明,在狀態(tài)s和執(zhí)行動作a產(chǎn)生的Q值是立即獎勵r(s,?a)加上下一狀態(tài)s’ 可能的最高Q值。這里的gamma是折現(xiàn)系數(shù),它控制著未來獎勵的貢獻(xiàn)。
q(s’,?a)又取決于q(s”,?a),該q(s”,?a)將具有伽馬平方系數(shù)。因此,Q值取決于未來狀態(tài)的Q值,如下所示:
調(diào)整gamma的值將減少或增加未來獎勵的貢獻(xiàn)。
由于這是一個遞歸方程,我們可以從對所有Q值進(jìn)行任意假設(shè)開始。根據(jù)經(jīng)驗(yàn),它將收斂到最優(yōu)策略。在實(shí)際情況下,這是作為更新實(shí)現(xiàn)的:
其中alpha是學(xué)習(xí)速率或步長。這就決定了新獲取的信息在多大程度上會覆蓋舊信息。
二、為什么選擇“深度”Q-Learning
Q-Learning是一個簡單但功能強(qiáng)大的算法,可以為我們的代理提供一個備忘單,有助于代理準(zhǔn)確地確定要執(zhí)行的操作。
但如果這張備忘單太長怎么辦?設(shè)想一個有10000個狀態(tài)的環(huán)境,每個狀態(tài)有1000個行動。這將創(chuàng)建一個包含1000萬個單元格的表。事情很快就會失控!
很明顯,我們不能從已經(jīng)探索過的狀態(tài)中推斷出新狀態(tài)的Q值。這有兩個問題:
-
首先,保存和更新該表所需的內(nèi)存量將隨著狀態(tài)數(shù)的增加而增加。
-
第二,探索每個狀態(tài)創(chuàng)建所需Q表所需的時間量是不現(xiàn)實(shí)的。
這里有一個想法——如果我們用機(jī)器學(xué)習(xí)模型(比如神經(jīng)網(wǎng)絡(luò))來估計(jì)這些Q值會怎么樣?好吧,這就是DeepMind算法背后的想法,它使得谷歌以5億美元收購DeepMind!
三、Deep?Q-Learning的簡介
在深度Q學(xué)習(xí)中,我們使用神經(jīng)網(wǎng)絡(luò)來近似Q值函數(shù)。狀態(tài)作為輸入,所有可能動作的Q值作為輸出生成。Q-Learning和深度Q-Learning之間的比較如下:
那么,使用深度Q學(xué)習(xí)網(wǎng)絡(luò)(DQNs)強(qiáng)化學(xué)習(xí)的步驟是什么?
-
所有過去的經(jīng)驗(yàn)都由用戶存儲在內(nèi)存中。
-
下一步動作由Q網(wǎng)絡(luò)的最大輸出決定。
-
這里的損失函數(shù)是預(yù)測的Q值和目標(biāo)Q值–Q*的均方誤差。
這基本上是一個回歸問題。然而,我們不知道這里的目標(biāo)或?qū)嶋H價值,因?yàn)槲覀冋谔幚硪粋€強(qiáng)化學(xué)習(xí)問題?;氐接韶悹柭匠虒?dǎo)出的Q值更新方程。我們有:
綠色部分表示目標(biāo)。我們可以說,它是在預(yù)測自己的價值,但由于R是無偏的真實(shí)回報(bào),網(wǎng)絡(luò)將使用反向傳播更新其梯度,最終收斂。
四、與深度學(xué)習(xí)相比,深度強(qiáng)化學(xué)習(xí)面臨的挑戰(zhàn)
到目前為止,這一切看起來都很棒。我們了解了神經(jīng)網(wǎng)絡(luò)如何幫助代理學(xué)習(xí)最佳行動。然而,當(dāng)我們將深度強(qiáng)化學(xué)習(xí)與深度學(xué)習(xí)(DL)進(jìn)行比較時,存在一個挑戰(zhàn):
-
非固定或不穩(wěn)定目標(biāo)
讓我們回到深度Q學(xué)習(xí)的偽代碼:
正如您在上面的代碼中看到的,目標(biāo)在每次迭代中都在不斷地變化。在深度學(xué)習(xí)中,目標(biāo)變量不變,因此訓(xùn)練是穩(wěn)定的,這對強(qiáng)化學(xué)習(xí)來說則不然。
綜上所述,我們經(jīng)常依賴于政策或價值函數(shù)來加強(qiáng)學(xué)習(xí),以獲取行動樣本。然而,隨著我們不斷學(xué)習(xí)要探索什么,這種情況經(jīng)常發(fā)生變化。當(dāng)我們玩游戲時,我們會更多地了解狀態(tài)和行為的基本真值,因此輸出也在變化。
因此,我們嘗試學(xué)習(xí)映射不斷變化的輸入和輸出。但是解決辦法是什么呢?
4.1 目標(biāo)網(wǎng)絡(luò)
由于同一個網(wǎng)絡(luò)正在計(jì)算預(yù)測值和目標(biāo)值,這兩者之間可能存在很大的差異。因此,我們可以使用兩個神經(jīng)網(wǎng)絡(luò)來代替使用1個神經(jīng)網(wǎng)絡(luò)來學(xué)習(xí)。
我們可以使用單獨(dú)的網(wǎng)絡(luò)來估計(jì)目標(biāo)。該目標(biāo)網(wǎng)絡(luò)與函數(shù)逼近器具有相同的結(jié)構(gòu),但參數(shù)是固定的。對于每個C迭代(超參數(shù)),預(yù)測網(wǎng)絡(luò)中的參數(shù)都會復(fù)制到目標(biāo)網(wǎng)絡(luò)中。這將導(dǎo)致更穩(wěn)定的訓(xùn)練,因?yàn)樗3帜繕?biāo)功能不變(在一段時間之內(nèi)):
4.2 經(jīng)驗(yàn)回放
要執(zhí)行經(jīng)驗(yàn)回放,我們存儲代理的經(jīng)驗(yàn)?–?et=(st,at,rt,st+1)
上面的陳述是什么意思?在模擬或?qū)嶋H經(jīng)驗(yàn)中,系統(tǒng)不會在狀態(tài)/動作對上運(yùn)行Q-Learning,而是將為[狀態(tài)、動作、獎勵、下一個狀態(tài)]發(fā)現(xiàn)的數(shù)據(jù)存儲在一個大表中。
讓我們用一個例子來理解這一點(diǎn)。
假設(shè)我們試圖構(gòu)建一個視頻游戲機(jī)器人,其中游戲的每一幀表示不同的狀態(tài)。在訓(xùn)練過程中,我們可以從最后100000幀中隨機(jī)抽取64幀來訓(xùn)練我們的網(wǎng)絡(luò)。這將使我們得到一個子集,其中樣本之間的相關(guān)性較低,也將提供更好的采樣效率。
-
結(jié)合到一起
到目前為止我們學(xué)到的概念是什么?它們結(jié)合在一起,形成了用于在Atari游戲中實(shí)現(xiàn)人類級性能的深度Q學(xué)習(xí)算法(僅使用游戲的視頻幀)。
我在下面列出了Deep?Q-Network(DQN)中涉及的步驟:
-
對游戲畫面(狀態(tài)S)進(jìn)行預(yù)處理并反饋給DQN,DQN將返回狀態(tài)下所有可能動作的Q值
-
使用epsilon貪婪策略選擇操作。用概率epsilon,我們選擇一個隨機(jī)動作a并且概率為1-epsilon,我們選擇一個最大Q值的動作,例如a=argmax(Q(s, a,?w))
-
在s狀態(tài)下執(zhí)行此操作并移動到新的s狀態(tài)以獲得獎勵。此狀態(tài)s'是下一個游戲屏幕的預(yù)處理圖像。我們將此轉(zhuǎn)換存儲在重播緩沖區(qū)中,如
-
接下來,從重放緩沖區(qū)中隨機(jī)抽取若干批轉(zhuǎn)換并計(jì)算損失。
-
已知:
,即目標(biāo)Q與預(yù)測Q的平方差。
-
根據(jù)我們的實(shí)際網(wǎng)絡(luò)參數(shù)進(jìn)行梯度下降,以盡量減少損失。
-
每次C迭代后,將我們的實(shí)際網(wǎng)絡(luò)權(quán)重復(fù)制到目標(biāo)網(wǎng)絡(luò)權(quán)重
-
對m個經(jīng)歷重復(fù)這些步驟
五、使用Keras?&?OpenAI?Gym?通過Python實(shí)現(xiàn)Deep?Q-Learning
好吧,這樣我們對深度Q學(xué)習(xí)的理論方面有了很好的了解?,F(xiàn)在就開始行動怎么樣?沒錯——讓我們啟動我們的python?notebook吧!
我們會創(chuàng)造一個可以玩CartPole的代理。我們也可以使用Atari游戲,但是訓(xùn)練一個代理來玩需要一段時間(從幾個小時到一天)。我們的方法背后的思想將保持不變,所以你可以在你的機(jī)器上的Atari游戲上嘗試這個。
CartPole是OpenAI?gym(游戲模擬器)中最簡單的環(huán)境之一。正如你在上面的動畫中看到的,CartPole的目標(biāo)是平衡一個桿,這個桿與一個運(yùn)動車頂部的接合處相連。
這里有四種由狀態(tài)給出的信息(如桿的角度和推車的位置),而不是像素信息。代理可以通過執(zhí)行一系列0或1操作來移動車,將車向左或向右推。
我們將在這里使用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)造一個非常簡單的單一隱含層神經(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鎯ξ覀兯鶊?zhí)行的操作的結(jié)果以及每個操作獲得的獎勵。
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)練具象化展示出來,但這會大大降低訓(xùn)練的速度。?dqn.fit(env, nb_steps=5000, visualize=True, verbose=2)
測試我們的強(qiáng)化學(xué)習(xí)模型:
dqn.test(env,?nb_episodes=5,?visualize=True)
這將是我們模型的輸出:
不錯!祝賀您建立了第一個深度Q學(xué)習(xí)模型。
最后幾點(diǎn)
Openai Gym提供了幾種將DQN融合到Atari游戲中的環(huán)境。那些處理過計(jì)算機(jī)視覺問題的人可能會直觀地理解這一點(diǎn),因?yàn)檫@些問題的輸入在每個時間步驟都是游戲的直接幀,因此該模型由基于卷積神經(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之外的至少一個環(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)載請聯(lián)系原作者)
◆
聲明:本文章由網(wǎng)友投稿作為教育分享用途,如有侵權(quán)原作者可通過郵件及時和我們聯(lián)系刪除
