深度強化學習:通過異步優勢動作評價 (A3C) 算法玩 CartPole

本教程由深度學習中文社區(dl.tustcs.com)發佈,實驗代碼關注我後私信"A3C"獲取.

引言

在本教程中,我們將學習如何使用深度強化學習來訓練模型,使其能夠在簡單的 CartPole 遊戲中獲勝。我們會使用 tf.keras 和 OpenAI Gym 並通過被稱為異步優勢動作評價 (A3C) 的技術來訓練智能體。強化學習一直以來備受矚目,但它到底是什麼呢?強化學習是機器學習的一個領域,其中的智能體需要在環境中執行特定操作,從而使獎勵最大化或獲得某些獎勵。

在此過程中,我們會積累關於下列概念的實際經驗,並培養對這些概念的理解:

  • Eager Execution — Eager Execution 是一個由運行定義的命令式接口。一旦用戶從 Python 中調用此接口,便可立即執行運算。這讓 TensorFlow 的入門變得更加簡單,並讓研發變得更加直觀。
  • 模型子類化 — 模型子類化讓用戶可以通過將 tf.keras 模型子類化並定義自己的正向傳遞,來構建可完全自定義的模型。在啟用 Eager Execution 時,模型子類化特別有用,因為用戶可以命令式地寫入正向傳遞。
  • 自定義訓練循環

注:tf.keras 模型鏈接

https://www.tensorflow.org/api_docs/python/tf/keras/Model

我們會按照以下基本工作流程來進行介紹:

  • 構建主智能體監控器
  • 構建工作器智能體
  • 執行 A3C 算法
  • 訓練智能體
  • 直觀呈現訓練表現

CartPole 是什麼?

Cartpole 是一個遊戲,其中有一根杆子通過非驅動關節與小車相連,而小車會沿著無摩擦軌道移動。系統會隨機對起始狀態(小車位置、小車移動速度、杆子角度,以及杆子頂端的擺動速度)進行初始化(介於 +/-0.05 之間)。我們通過對小車施加 +1 或 -1 的力度來控制系統(向左或向右移動)。杆子一開始是豎直的,而我們的目標是阻止杆子倒下。當杆子保持豎直時,系統在每個時步都會提供 +1 的獎勵。如果杆子與垂直方向的夾角大於 15 度,或者小車偏離中心超過 2.4 個單位距離,則遊戲結束。

深度強化學習:通過異步優勢動作評價 (A3C) 算法玩 CartPole

建立Baseline

要正確判斷您模型的實際表現和您用於評估模型的指標,建立基線通常是非常有用的方法。例如,當您看到返回的分數很高時,您的模型似乎運行良好,但實際上高分或許不能反映算法的好壞或隨機操作的結果。在分類示例中,我們可以簡單分析類別分佈及預測最常見的類別,以建立基線表現。但是,如何建立強化學習的基線呢?為此我們將創建一個隨機智能體,使其在我們的環境中只執行隨機操作。

對於 CartPole 遊戲,我們在 4000 次遊戲中平均每次獲得大約 20 個獎勵。要運行隨機智能體,請運行所提供的 py 文件:python a3c_cartpole.py — algorithm=random — max-eps=4000。

何為異步優勢動作評價算法?

異步優勢動作評價真是晦澀難懂啊!我們首先拆分這個算法的名稱,然後再分析算法本身背後的機制。

  • 異步:此為異步算法,可以並行訓練多個工作器智能體,其中每個智能體都有自己的模型和環境副本。由於能夠並行訓練更多工作器,我們的算法可以加快訓練速度;此外,由於每個工作器的經驗都是獨立的,智能體可獲得更多樣化的訓練經驗。
  • 優勢:優勢不但是衡量操作優劣的指標,也是判斷結果好壞的因素。這使算法可以側重於缺少網絡預測的方面。直觀地說,這讓我們可以衡量在指定時步執行操作 a 而非採用策略 π 的優勢。
  • 動作評價:此算法的動作評價方面使用的架構可以共享策略和值函數之間的層。

但它有何工作原理呢?

大體來看,A3C 算法使用異步更新協議,會根據固定時步長度的經驗來運作。此算法會使用這些時間段來計算獎勵的估計量和優勢函數。每個工作器都會執行下列工作流程週期:

  • 提取全局網絡參數
  • 通過採用最少(t_max,進入終止狀態的步數)步數的本地策略與環境交互。
  • 計算值和策略損失
  • 從損失中獲取梯度
  • 使用梯度更新全局網絡
  • 重複步驟

藉助此訓練配置,我們有望看到智能體的數量直線上升。但是,您的機器能夠支持的智能體數量受到可用 CPU 核心數量的限制。此外,A3C 甚至可以擴展到多個機器,並且某些更新的研究(如 IMPALA)還支持更進一步擴展。但增加更多機器可能會對速度和性能帶來不利影響。

複習策略和值函數

如果您已經熟知策略梯度,那麼我建議您跳過這個部分。否則,如果您不知道何為策略/值,或者只是想快速複習一下,就請繼續閱讀吧!

策略的概念是指在指定某些輸入狀態的情況下,用參數表示操作的概率分佈。我們通過創建網絡來完成此操作,該網絡會考慮遊戲的狀態,並決定我們應該做什麼。同樣地,當智能體在玩遊戲時,每當它看到某個狀態(或類似狀態)時,它都會計算在指定輸入狀態下每種可用操作的概率,然後根據此概率分佈對操作進行抽樣。為了更正規地探究數學運算,我們將策略梯度作為更一般的記分函數梯度估計量的特例。一般案例以 Ex p(x | ) [f(x)] 的形式表達,換言之,在我們的案例中,獎勵(或優勢)函數的期望值為 f, 而在某些策略網絡下則為 p。然後,使用對數求導技巧,我們得知如何更新網絡參數,從而使操作樣本獲得更高的獎勵,並以 ∇ Ex[f(x)] =Ex[f(x) ∇ log p(x)] 結束。簡單來說,這個公式解釋了根據獎勵函數 f,我們梯度方向中的移位 θ 會如何使分數最大化。

值函數會從本質上判斷某個狀態的好壞。在形式上,當遊戲以狀態 s 開始並採用策略 p 時,值函數會定義預計的獎勵總數。這便是與算法名稱中的 “評價” 相關的部分。智能體會使用估算值(評價)來更新策略(動作)。

執行

首先,我們定義要使用的模型種類。主智能體會擁有全局網絡,且每個本地工作器智能體在自己的進程中都會擁有此網絡的副本。我們會使用模型子類化對模型進行實例化。雖然模型子類化會使進程更冗長,但卻為我們提供了最大的靈活性。

深度強化學習:通過異步優勢動作評價 (A3C) 算法玩 CartPole

正如您從我們的正向傳遞中看到的,我們的模型會採用輸入和返回策略概率的分對數和值。

主智能體 — 主線程

讓我們看看運算的控制中心。主智能體擁有一個共享優化器,可以更新其全局網絡。該智能體會對全局網絡進行實例化,每個工作器智能體及我們用於更新智能體的優化器都會更新。研究表明,A3C 對各種學習率都具有很高的適應性,但針對 CartPole 遊戲,我們會使用學習率為 5e-4 的 AdamOptimizer。

深度強化學習:通過異步優勢動作評價 (A3C) 算法玩 CartPole

主智能體會運行訓練函數來啟動每個智能體並對其進行實例化。主智能體負責對每個智能體進行協調和監管。各個智能體會異步運行。(嚴格來說,這不是真正的異步,因為在 Python 中,由於 GIL(全局解釋器鎖)的存在,單一 Python 進程無法並行運行多個線程(利用多個核心),但可以同時運行多個線程(在 I/O 密集型運算期間進行上下文切換)。為了簡要清晰地舉例說明,我們使用線程執行指令)。

深度強化學習:通過異步優勢動作評價 (A3C) 算法玩 CartPole

存儲分類 — 保留我們的經驗

此外,為了更容易追蹤訓練,我們還會實行存儲分類。該分類會簡單地提供相關功能,以追蹤我們在每一步出現的操作、獎勵和狀態。

深度強化學習:通過異步優勢動作評價 (A3C) 算法玩 CartPole

現在,我們來了解算法的關鍵:工作器智能體。工作器智能體繼承自線程類,而且我們會替換來自線程的運行方法。這使我們可以達成 A3C 的第一個 A,即異步。首先,我們對本地模型進行實例化並設置特定的訓練參數。

深度強化學習:通過異步優勢動作評價 (A3C) 算法玩 CartPole

運行算法

下一步是執行運行函數。這實際上會運行我們的算法。我們會運行指定全局最多遊戲次數的所有線程。這就是 A3C 的第三個 A(動作)在發揮作用。我們的智能體會根據策略函數 “行動”,在操作由 “評價” 評判時變為動作,即我們的值函數。這部分的代碼看起來可能很密集,但真正發揮的作用不多。在每次遊戲中,代碼僅發揮以下作用:

  • 獲取我們基於當前框架的策略(操作概率分佈)
  • 按步驟執行根據策略選擇的操作
  • 如果智能體已採取固定數量的步驟 (args.update_freq) 或智能體已達到終止狀態(已結束),則:a.使用本地模型計算的梯度更新全局模型
  • 重複步驟

如何計算損失?

工作器智能體會計算損失,以獲得有關其全部網絡參數的梯度。這是 A3C 的最後一個 A(優勢)在發揮作用。然後,這些損失會應用於全局網絡。損失的計算方法如下:

  • 值損失: L=∑(R — V(s))²
  • 策略損失: L = -log((s)) * A(s)

其中 R 為折扣獎勵,V 為值函數(在輸入狀態下), 為策略函數(也在輸入狀態下),而 A 為優勢函數。由於我們不能直接使用 A3C 來確定 Q 的值,我們會使用折扣獎勵來估算 Q 的值。

就是這樣!工作器智能體會重複以下流程:將網絡參數重置為全局網絡中的所有參數,並反覆與其環境互動、計算損失,然後將梯度應用於全局網絡。您可以通過運行以下命令來訓練您的算法:python a3c_cartpole.py — train。

測試算法

我們通過啟動新環境和僅採用已訓練模型的策略輸出來測試算法。這會呈現我們的環境和我們模型的策略分佈中的示例。

對模型進行訓練後,您可以使用以下命令運行算法:python a3c_cartpole.py。

要檢驗我們移動的平均得分:

深度強化學習:通過異步優勢動作評價 (A3C) 算法玩 CartPole

我們需要查看分數 >200 的範圍內的分數。遊戲得到 “解決” 的定義是在超過 100 次連續試驗中獲得 195.0 的平均獎勵。

在新環境中的示例表現如下:

深度強化學習:通過異步優勢動作評價 (A3C) 算法玩 CartPole

關鍵知識點

我們的學習內容:

  • 我們通過執行 A3C 解決了 CartPole!
  • 我們通過使用 Eager Execution、模型子類化及自定義訓練循環達到了這一目的。
  • Eager 是開發訓練循環的簡單方法,由於我們能夠直接打印和調試張量,該方法使編碼更加簡單清楚。
  • 我們學習了使用策略和值網絡進行強化學習的基礎知識,然後我們綜合運用這些知識來執行 A3C。
  • 我們使用 tf. 梯度應用優化的更新規則,以反覆更新全局網絡。

實驗代碼關注我頭條號後私信"A3C"獲取


分享到:


相關文章: