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