【EasyRL強(qiáng)化學(xué)習(xí)學(xué)習(xí)筆記】01_相關(guān)原理與概述

本章筆記主要內(nèi)容

這一章的內(nèi)容,對應(yīng)磨菇書《EasyRL》第一章的內(nèi)容。首先對于關(guān)鍵詞和相關(guān)參數(shù)進(jìn)行了闡述,然后著重介紹了強(qiáng)化學(xué)習(xí)與監(jiān)督學(xué)習(xí)的區(qū)別、強(qiáng)化學(xué)習(xí)的基本原理以及Gym庫相關(guān)的兩個小實(shí)驗(yàn)例子。這一章內(nèi)容更多側(cè)重于對原理的一些理解吧,關(guān)于具體算法的內(nèi)容會在第三章往后展開,下一章討論MDP過程。

關(guān)鍵詞

  • 強(qiáng)化學(xué)習(xí)(Reinforcement learning,RL):讓智能體(agent)怎么在復(fù)雜、不確定的環(huán)境(environment)里面去最大化它能獲得的獎勵的一種工具方法。
  • 深度強(qiáng)化學(xué)習(xí)(Deep Reinforcement Learning):不需要手動設(shè)計特征,僅需要輸入狀態(tài)就可以讓系統(tǒng)直接輸出動作的一個端到端(end-to-end)的強(qiáng)化學(xué)習(xí)方法。通常使用神經(jīng)網(wǎng)絡(luò)來擬合價值函數(shù)(value function)或者策略網(wǎng)絡(luò)(policy network)。
  • 狀態(tài)(state):智能體觀測到當(dāng)前環(huán)境的部分或者全部特征。
  • 動作(action):智能體在當(dāng)前環(huán)境下基于當(dāng)前狀態(tài)做出的具體行為。
  • 動作空間(action space):在當(dāng)前的環(huán)境中,有效動作的集合被稱為動作空間。依據(jù)智能體的動作數(shù)量是否有限可以分為離散動作空間和連續(xù)動作空間:智能體的動作數(shù)量有限的動作空間稱為離散動作空間,反之則被稱為連續(xù)動作空間。
  • 獎勵(reward):當(dāng)智能體在某個狀態(tài)下完成某一動作后,從環(huán)境中獲取的反饋信號。
  • 探索(exploration):在當(dāng)前的狀態(tài)下,智能體繼續(xù)嘗試新的動作。執(zhí)行新的動作后可能得到更高的獎勵,也有可能一無所有。
  • 利用(exploitation):在當(dāng)前的狀態(tài)下,智能體繼續(xù)重復(fù)嘗試已經(jīng)試驗(yàn)過可以獲得最大獎勵的過程。
  • 基于策略(policy-based)的方法:智能體會制定一套動作策略,即確定在給定狀態(tài)下需要采取何種動作,并根據(jù)這個策略進(jìn)行操作。強(qiáng)化學(xué)習(xí)算法直接對策略進(jìn)行優(yōu)化,使制定的策略能夠獲得最大的獎勵。
  • 基于價值(valued-based)的方法:智能體不需要制定策略,它負(fù)責(zé)構(gòu)建和更新一個價值表格或者價值函數(shù),并通過這個價值表格或價值函數(shù)來執(zhí)行使得價值最大化的動作。
  • 有模型(model-based):智能體通過學(xué)習(xí)狀態(tài)的轉(zhuǎn)移來進(jìn)行決策。
  • 免模型(model-free):智能體沒有直接估計狀態(tài)的轉(zhuǎn)移,沒有得到環(huán)境的具體轉(zhuǎn)移變量,它通過學(xué)習(xí)價值函數(shù)或者策略網(wǎng)絡(luò)進(jìn)行決策。

相關(guān)參數(shù)定義

a 動作
s 狀態(tài)
r 獎勵
π 策略
π(s) 確定性策略 π 在狀態(tài) s 選取的動作
\gamma 折扣因子
G_t 時刻t 時的回報
π_θ 參數(shù) θ 對應(yīng)的策略

1 強(qiáng)化學(xué)習(xí)與監(jiān)督學(xué)習(xí)

在本節(jié)中,主要會去討論強(qiáng)化學(xué)習(xí)與機(jī)器學(xué)習(xí)中的監(jiān)督學(xué)習(xí)的區(qū)別,以此來深化對強(qiáng)化學(xué)習(xí)的定義、特征等基本概念的理解。

1.1 簡單介紹

在監(jiān)督學(xué)習(xí)中,過程大概如下:第一,輸入的數(shù)據(jù)/標(biāo)注的數(shù)據(jù)都應(yīng)該是沒有關(guān)聯(lián)的。如果輸入的數(shù)據(jù)有關(guān)聯(lián),學(xué)習(xí)器是不好學(xué)習(xí)的;第二,我們告訴學(xué)習(xí)器正確的標(biāo)簽是什么,這樣它可以通過正確的標(biāo)簽來修正自己的預(yù)測,比如某個圖片明明是個汽車,卻誤認(rèn)為是飛機(jī),那我們立馬告訴它這是錯誤的;第三,我們根據(jù)錯誤寫一個損失函數(shù)(loss function),通過反向傳播(back propagation)來訓(xùn)練神經(jīng)網(wǎng)絡(luò)。

那么在強(qiáng)化學(xué)習(xí)中,上述的前兩個假設(shè)基本都不成立。智能體觀測到的狀態(tài)不是獨(dú)立同分布的,也就是說我們得到的數(shù)據(jù)很可能是有關(guān)聯(lián)的,比如是相關(guān)的時間序列數(shù)據(jù)等。另外,強(qiáng)化學(xué)習(xí)中不會立刻得到反饋,比如你玩一個游戲,它并不會直接告訴你哪個動作、哪個策略是正確的。

這邊存在一個延遲獎勵(delayed reward)的過程。玩雅達(dá)利游戲的過程中,我們從第 1 步開始,采取一個動作,比如我們把木板往右移,接到球。第 2 步我們又做出動作,得到的訓(xùn)練數(shù)據(jù)是一個玩游戲的序列。比如現(xiàn)在是在第 3 步,我們把這個序列放進(jìn)網(wǎng)絡(luò),希望網(wǎng)絡(luò)可以輸出一個動作,即在當(dāng)前的狀態(tài)應(yīng)該輸出往右移或者往左移。這里有個問題,我們沒有標(biāo)簽來說明現(xiàn)在這個動作是正確還是錯誤的,必須等到游戲結(jié)束才可能知道,這個游戲可能 10s 后才結(jié)束。現(xiàn)在這個動作到底對最后游戲是否能贏有無幫助,我們其實(shí)是不清楚的。這里我們就面臨延遲獎勵的問題,延遲獎勵使得訓(xùn)練網(wǎng)絡(luò)非常困難。

[圖片上傳失敗...(image-9da1dd-1650897932337)]

1.2 二者區(qū)別

  • 強(qiáng)化學(xué)習(xí)輸入的樣本是序列數(shù)據(jù),而不像監(jiān)督學(xué)習(xí)里面樣本都是獨(dú)立的。

  • 學(xué)習(xí)器并沒有告訴我們每一步正確的動作應(yīng)該是什么,學(xué)習(xí)器需要自己去發(fā)現(xiàn)哪些動作可以帶來最多的獎勵,只能通過不停地嘗試來發(fā)現(xiàn)最有利的動作。

  • 智能體獲得自己能力的過程,其實(shí)是不斷地試錯探索的過程。探索(exploration)和利用(exploitation)是強(qiáng)化學(xué)習(xí)里面非常核心的問題。因此,我們需要在探索和利用之間進(jìn)行權(quán)衡,這也是在監(jiān)督學(xué)習(xí)里面沒有的情況。

  • 在強(qiáng)化學(xué)習(xí)過程中,沒有非常強(qiáng)的監(jiān)督者(supervisor),只有獎勵信號,并且獎勵信號是延遲的,即環(huán)境會在很久以后告訴我們之前我們采取的動作到底是不是有效的。或許正因?yàn)槲覀儧]有得到即時反饋,所以智能體使用強(qiáng)化學(xué)習(xí)來學(xué)習(xí)就非常困難。當(dāng)我們采取一個動作后,如果我們使用監(jiān)督學(xué)習(xí),我們就可以立刻獲得一個指導(dǎo),比如,我們現(xiàn)在采取了一個錯誤的動作,正確的動作應(yīng)該是什么。而在強(qiáng)化學(xué)習(xí)里面,環(huán)境可能會告訴我們這個動作是錯誤的,但是它并沒有告訴我們正確的動作是什么。而且更困難的是,它可能是在一兩分鐘過后告訴我們這個動作是錯誤的。

1.3 強(qiáng)化學(xué)習(xí)特征

通過與監(jiān)督學(xué)習(xí)的比較,我們可以總結(jié)出關(guān)于強(qiáng)化學(xué)習(xí)的一些特征:

  • 強(qiáng)化學(xué)習(xí)會試錯探索,它通過探索環(huán)境來獲取對環(huán)境的理解。
  • 強(qiáng)化學(xué)習(xí)智能體會從環(huán)境里面獲得延遲的獎勵。
  • 在強(qiáng)化學(xué)習(xí)的訓(xùn)練過程中,時間非常重要。因?yàn)槲覀兊玫降氖?strong>有時間關(guān)聯(lián)的數(shù)據(jù)。而不是獨(dú)立同分布的數(shù)據(jù)。
  • 智能體的動作會影響它隨后得到的數(shù)據(jù),這一點(diǎn)是非常重要的。在訓(xùn)練智能體的過程中,很多時候我們也是通過正在學(xué)習(xí)的智能體與環(huán)境交互來得到數(shù)據(jù)的。所以如果在訓(xùn)練過程中,智能體不能保持穩(wěn)定,就會使我們采集到的數(shù)據(jù)非常糟糕。我們通過數(shù)據(jù)來訓(xùn)練智能體,如果數(shù)據(jù)有問題,整個訓(xùn)練過程就會失敗。所以在強(qiáng)化學(xué)習(xí)里面一個非常重要的問題就是,怎么讓智能體獲得獎勵信一直穩(wěn)定地提升并最終保持穩(wěn)定。

1.4 強(qiáng)化學(xué)習(xí)發(fā)展

標(biāo)準(zhǔn)強(qiáng)化學(xué)習(xí):設(shè)計特征,然后訓(xùn)練價值函數(shù)的過程。標(biāo)準(zhǔn)強(qiáng)化學(xué)習(xí)先設(shè)計很多特征,這些特征可以描述現(xiàn)在整個狀態(tài)。得到這些特征后,我們就可以通過訓(xùn)練一個分類網(wǎng)絡(luò)或者分別訓(xùn)練一個價值估計函數(shù)來采取動作。

深度強(qiáng)化學(xué)習(xí):自從我們有了深度學(xué)習(xí),有了神經(jīng)網(wǎng)絡(luò),就可以把智能體玩游戲的過程改進(jìn)成一個端到端訓(xùn)練的過程。我們不需要設(shè)計特征,直接輸入狀態(tài)就可以輸出動作。我們可以用一個神經(jīng)網(wǎng)絡(luò)來擬合價值函數(shù)或策略網(wǎng)絡(luò),省去特征工程的過程。

2 強(qiáng)化學(xué)習(xí)基本原理

在本節(jié)中,我們會去介紹強(qiáng)化學(xué)習(xí)中的智能體及其分類、環(huán)境 、獎勵、動作、策略、價值函數(shù)、模型以及序列決策過程,這部分可以說是強(qiáng)化學(xué)習(xí)最根本的核心原理部分。

2.1 動作

不同的環(huán)境可能存在不同種類的動作。在給定的環(huán)境中,有效動作的集合經(jīng)常被稱為動作空間

  • 離散動作空間:智能體的動作數(shù)量是有限的。
  • 連續(xù)動作空間:智能體的動作有無數(shù)可能,動作是實(shí)值的向量。
  • 舉例:機(jī)器人路徑規(guī)劃問題中,若機(jī)器人的移動方式只有前后左右四種方式的話那么為離散動作空間;若機(jī)器人可以向任意角度任意方向移動,則動作空間為連續(xù)空間。

2.2 獎勵

  • 獎勵是由環(huán)境給的一種標(biāo)量的反饋信號,這種信號可顯示智能體在某一步采取某個策略的表現(xiàn)如何。
  • 強(qiáng)化學(xué)習(xí)的目的就是最大化智能體可以獲得的獎勵,智能體在環(huán)境里面存在的目的就是最大化它的期望的累積獎勵

2.3 狀態(tài)與觀測

在與環(huán)境的交互過程中,智能體會獲得很多觀測。

狀態(tài)是對當(dāng)前環(huán)境的完整描述,不會隱藏環(huán)境的信息。觀測是對狀態(tài)的部分描述,可能會遺漏一些信息。

當(dāng)智能體能夠觀察到環(huán)境的所有狀態(tài)時,我們稱這個環(huán)境是完全可測的,此時強(qiáng)化學(xué)習(xí)可以建模為馬爾可夫決策過程的問題。(關(guān)于馬爾科夫決策我們將在下一章學(xué)習(xí))

但是智能體經(jīng)常得到的觀測不是所有狀態(tài),例如在玩雅達(dá)利游戲時,觀測到的只是當(dāng)前電視上面這一幀的信息,我們并沒有得到游戲內(nèi)部里面所有的運(yùn)作狀態(tài)。此時我們稱環(huán)境是部分可測的。那么建模過程就轉(zhuǎn)化為部分可觀測馬爾可夫決策過程。該過程依舊具有馬爾可夫性質(zhì)。部分可觀測馬爾可夫決策過程可以用一個七元組描述:(S, A, T, R, ?, O, γ)。其中 S 表示狀態(tài)空間,為隱變量,A 為動作空間,T(s′|s, a) 為狀態(tài)轉(zhuǎn)移概率,R 為獎勵函數(shù),?(o|s, a) 為觀測概率,O 為觀測空間,γ 為折扣因子。

2.4 策略、價值函數(shù)與模型

2.4.1 策略

智能體利用策略來選取下一步的動作。策略是一個函數(shù),它能夠把輸入的狀態(tài)變成動作。策略可分為兩種:隨機(jī)性策略確定性策略

  • 隨機(jī)性策略

    輸入一個狀態(tài) s,輸出一個概率。這個概率是智能體所有動作的概率,然后對這個概率分布進(jìn)行采樣,可得到智能體將采取的動作。比如可能是有 0.7 的概率往左,0.3 的概率往右,那么通過采樣就可以得到智能體將采取的動作,即π 函數(shù),公式表達(dá)為:
    π(a|s) = p (a_t = a|s_t = s)

  • 確定性策略

    智能體直接采取最有可能的動作,即:
    a^? = arg_a maxπ(a | s)

強(qiáng)化學(xué)習(xí)大多采用隨機(jī)策略,這樣可以更好地探索環(huán)境:隨機(jī)性策略的動作具有多樣性,這一點(diǎn)在多智能體強(qiáng)化學(xué)習(xí)中很重要。如果采用確定性策略的智能體總是對同樣的狀態(tài)采取相同的動作,這樣就會顯得太呆了一些,容易被對手預(yù)測到策略。

2.4.2 價值函數(shù)

價值函數(shù)的值是對未來獎勵的預(yù)測,我們用它來評估狀態(tài)的好壞。價值函數(shù)里面有一個折扣因子γ **。

為什么要有折扣因子呢?因?yàn)槲覀兿M茉诙虝r間內(nèi)獲取更多的價值。比如我們現(xiàn)在獲得1000元和20天后獲得1000元,我們肯定希望現(xiàn)在就獲得這筆錢,因?yàn)槲覀冞€可以存到一些穩(wěn)定利息的理財產(chǎn)品里面(當(dāng)然存基金的情況就另說了受市場波動太大)。

  • 因此我們定義價值函數(shù)為:

V_π(s) = E_π [G_t | s_t = s] = E_π[\sum^∞_{k=0}γ_kr_{t+k+1}| s_t = s] , 對于所有的s ∈ S

價值函數(shù)也可以稱為V函數(shù)。期望 E_π 的下標(biāo)是 π 函數(shù),π 函數(shù)的值可反映在我們使用策略 π 的時候,到底可以得到多少獎勵。即從某個狀態(tài),按照策略,走到最終狀態(tài)很多很多次;最終獲得獎勵總和的平均值。

  • 另一種價值函數(shù):Q函數(shù)。Q函數(shù)中包含兩個變量:狀態(tài)和動作。其定義為:
    Q_π(s,a) = E_π [G_t | s_t = s,a_t = a] = E_π[\sum^∞_{k=0}γ_kr_{t+k+1}| s_t = s,a_t = a]

在Q函數(shù)中,我們未來可以獲得獎勵的期望取決于當(dāng)前的狀態(tài)和當(dāng)前的動作。Q 函數(shù)是強(qiáng)化學(xué)習(xí)算法里面要學(xué)習(xí)的一個函數(shù)。與V值不同,Q值和策略并沒有直接相關(guān),而與環(huán)境的狀態(tài)轉(zhuǎn)移概率相關(guān),而環(huán)境的狀態(tài)轉(zhuǎn)移概率是不變的。

2.4.3 模型

模型決定的是下一步的狀態(tài),下一步狀態(tài)取決于當(dāng)前的狀態(tài)以及當(dāng)前采取的動作。它由狀態(tài)轉(zhuǎn)移概率和獎勵函數(shù)兩個部分組成。狀態(tài)轉(zhuǎn)移概率即:
p_{s s^{\prime}}^{a}=p\left(s_{t+1}=s^{\prime} \mid s_{t}=s, a_{t}=a\right)
獎勵函數(shù)是指我們在當(dāng)前狀態(tài)采取了某個動作可以得到多少的獎勵,即:
R(s, a)=\mathbb{E}\left[r_{t+1} \mid s_{t}=s, a_{t}=a\right]
當(dāng)我們有了策略、價值函數(shù)和模型 3 個組成部分后,就形成了一個馬爾可夫決策過程

2.5 智能體與環(huán)境

智能體一直在與所處的環(huán)境進(jìn)行交互。智能體把它的動作輸出給環(huán)境,環(huán)境取得這個動作后會進(jìn)行下一步,把下一步的觀測與這個動作帶來的獎勵返還給智能體。這樣的交互會產(chǎn)生很多觀測,智能體的目的是從這些觀測之中學(xué)到能最大化獎勵的策略。

2.5.1 根據(jù)學(xué)習(xí)對象分類

  • 基于價值的智能體

    基于價值的強(qiáng)化學(xué)習(xí)方法中,智能體不需要制定策略,它維護(hù)一個價值表格或價值函數(shù),并通過這個價值表格或價值函數(shù)來擇選價值最大的動作。

    應(yīng)用范圍:只能應(yīng)用在離散環(huán)境下(如下棋)

    主要算法:Q-Learning算法、Sarsa算法

  • 基于策略的智能體

    在基于策略的強(qiáng)化學(xué)習(xí)方法中,智能體會制定一套動作策略(確定在給定狀態(tài)下需要采取何種動作),并根據(jù)這個策略進(jìn)行操作。強(qiáng)化學(xué)習(xí)算法直接對策略進(jìn)行優(yōu)化,使制定的策略能夠獲得最大的獎勵。

    應(yīng)用范圍:無限制

    主要算法:策略梯度算法、蒙特卡洛算法

  • 二者結(jié)合:演員-評判家(Actor-Critic)

    同時使用策略和價值評估來做出決策。其中,智能體會根據(jù)策略做出動作,而價值函數(shù)會對做出的動作給出價值,這樣可以在原有的策略梯度算法的基礎(chǔ)上加速學(xué)習(xí)過程,取得更好的效果。

2.5.2 根據(jù)是否有學(xué)習(xí)環(huán)境模型分類

  • 有模型:通過學(xué)習(xí)狀態(tài)的轉(zhuǎn)移來采取動作。

    當(dāng)智能體知道狀態(tài)轉(zhuǎn)移函數(shù) P(s_{t+1}|s_t, a_t) 和獎勵函數(shù)后R(s_t, a_t),它就能知道在某一狀態(tài)下執(zhí)行某一動作后能帶來的獎勵和環(huán)境的下一狀態(tài),這樣智能體就不需要在真實(shí)環(huán)境中采取動作,直接在虛擬世界中學(xué)習(xí)和規(guī)劃策略即可。具體流程如下圖:

    [圖片上傳失敗...(image-bdc381-1650897932337)]

  • 免模型:通過學(xué)習(xí)價值函數(shù)和策略函數(shù)進(jìn)行決策。

    在大多數(shù)實(shí)際過程中,智能體并不是那么容易就能知曉馬爾可夫決策過程中的所有元素的。通常情況下,狀態(tài)轉(zhuǎn)移函數(shù)和獎勵函數(shù)很難估計,甚至連環(huán)境中的狀態(tài)都可能是未知的。

    免模型強(qiáng)化學(xué)習(xí)沒有對真實(shí)環(huán)境進(jìn)行建模,智能體只能在真實(shí)環(huán)境中通過一定的策略來執(zhí)行動作,等待獎勵和狀態(tài)遷移,然后根據(jù)這些反饋信息來更新動作策略,這樣反復(fù)迭代直到學(xué)習(xí)到最優(yōu)策略。

  • 總結(jié)

    1. 有模型強(qiáng)化學(xué)習(xí)相比免模型強(qiáng)化學(xué)習(xí)僅僅多出一個步驟,即對真實(shí)環(huán)境進(jìn)行建模。

    2. 在實(shí)際應(yīng)用中,如果不清楚該用有模型強(qiáng)化學(xué)習(xí)還是免模型強(qiáng)化學(xué)習(xí),可以先思考在智能體執(zhí)行動作前,是否能對下一步的狀態(tài)和獎勵進(jìn)行預(yù)測,如果能,就能夠?qū)Νh(huán)境進(jìn)行建模,從而采用有模型學(xué)習(xí)。

    3. 目前,大部分深度強(qiáng)化學(xué)習(xí)方法都采用了免模型強(qiáng)化學(xué)習(xí)。

      在目前的強(qiáng)化學(xué)習(xí)研究中,大部分情況下環(huán)境都是靜態(tài)的、可描述的,智能體的狀態(tài)是離散的、可觀察的(如雅達(dá)利游戲平臺),這種相對簡單、確定的問題并不需要評估狀態(tài)轉(zhuǎn)移函數(shù)和獎勵函數(shù),可直接采用免模型強(qiáng)化學(xué)習(xí),使用大量的樣本進(jìn)行訓(xùn)練就能獲得較好的效果。

2.7 探索與利用

在強(qiáng)化學(xué)習(xí)中,探索和利用是兩個很核心的問題。

探索就是通過試錯來理解采取的動作到底可不可以帶來好的獎勵。利用是指我們直接采取已知的可以帶來很好獎勵的動作。所以這里就面臨一個權(quán)衡問題,即怎么通過犧牲一些短期的獎勵來理解動作,從而學(xué)習(xí)到更好的策略。

以玩游戲?yàn)槔檬侵肝覀兛偸遣扇∧骋环N策略。比如,我們玩《拳皇》游戲的時候,采取的策略可能是蹲在角落,然后一直出腳。這個策略很可能可以奏效,但可能遇到特定的對手就會失效。探索是指我們可能嘗試一些新的招式,有可能我們會放出“大招”來,這樣就可能“一招斃命”。

3 一些實(shí)驗(yàn)例子

在這一節(jié)中,我將會使用 python 3.7 + pytorch 1.7 來實(shí)現(xiàn)書中的一些例子,使用工具為pycharm。

3.1 Gym庫的安裝

打開pycharm后在編輯器下方點(diǎn)擊Terminal,輸入 pip install gym ,如下圖所示。

[圖片上傳失敗...(image-d9054d-1650897932337)]

安裝完成后,輸入一段測試代碼測試是否安裝成功,具體代碼如下:

import gym
env = gym.make('MountainCar-v0')
for i_episode in range(10):
    observation = env.reset()
    for t in range(50):
        env.render()
        print(observation)
        action = env.action_space.sample()
        observation, reward, done, info = env.step(action)
    if done:
        print("Episode finished after {} timesteps".format(t+1))
        break
env.close()

如下圖所示,當(dāng)發(fā)現(xiàn)得到一個一直在動的小車,即為安裝成功:

[圖片上傳失敗...(image-9eb5e3-1650897932337)]

3.2 例1:CartPol_v0(平衡車)

如下圖所示,我們先去定義相關(guān)的動作、觀測(狀態(tài))以及獎勵函數(shù):

[圖片上傳失敗...(image-ab1653-1650897932337)]

Gym庫中的相關(guān)參數(shù)含義:

  • env.reset():初始化回合

  • env.render():顯示環(huán)境中的物體圖像

  • env.action_space.sample():在該游戲的所有動作空間里隨機(jī)選擇一個作為輸出。在這個例子中,動作只有兩個:一左一右,輸出值即為0或者1。

  • env.step() 方法有 4 個返回值:observation、reward、done、info

    observation(object)是狀態(tài)信息,是在游戲中觀測到的屏幕像素值或者盤面狀態(tài)描述信息。
    reward(float)是獎勵值,即動作提交以后能夠獲得的獎勵值。
    done(boolean)表示游戲是否已經(jīng)完成。如果完成了,就需要重置并開始一個新的回合。
    info(dict)是一些比較原始的用于診斷和調(diào)試的信息,或許對訓(xùn)練有幫助。不過,OpenAI 團(tuán)隊(duì)在評價你提交的機(jī)器人時,是不允許使用這些信息的。

  • env.observation_space:表示環(huán)境env的觀測空間

  • env.action_space:表示動作空間

在每個訓(xùn)練中都要使用的返回值有 observation、reward、done。特別是observation會由于模型的結(jié)構(gòu)不同而發(fā)生變化。下面是CartPol_v0的完整代碼:

import gym
env = gym.make('CartPole-v0')  # 引入gym庫中例子構(gòu)建實(shí)驗(yàn)環(huán)境
env.reset()  # 重置一個回合

# 訓(xùn)練1000個回合
for _ in range(1000):
    env.render()  # 顯示圖形界面
    action = env.action_space.sample()  # 從動作空間中隨機(jī)選擇一個工作
    observation, reward, done, info = env.step(action)  # 用于提交具體的動作并獲得反饋
    print(observation) # 輸出觀測值
    env.close()  # 關(guān)閉環(huán)境

運(yùn)行結(jié)果:

[圖片上傳失敗...(image-114856-1650897932337)]

是的,你沒看錯!我按照書里的代碼運(yùn)行之后報錯了,然后我就求助百度,但我搜這個問題并沒有搜到很直觀的解決方案,于是我去翻了翻OpenAI的源碼是可以運(yùn)行,OpenAI的源碼如下:

import gym
env = gym.make('CartPole-v0')
env.reset()
for _ in range(1000):
    env.render()
    env.step(env.action_space.sample()) # take a random action
env.close()

對比之后我發(fā)現(xiàn)可能問題出在觀測值上,于是我又翻了翻相關(guān)的源碼,找到了有觀測值的源碼:

import gym
env = gym.make('CartPole-v0')
for i_episode in range(20):
    observation = env.reset()
    for t in range(100):
        env.render()
        print(observation)
        action = env.action_space.sample()
        observation, reward, done, info = env.step(action)
        if done:
            print("Episode finished after {} timesteps".format(t+1))
            break
env.close()

所以我的錯誤應(yīng)該是在每次回合開始前沒有對觀測信息初始化。我的理解是:在 Gym仿真中,每一次回合開始,需要先執(zhí)行 reset() 函數(shù),返回初始觀測信息,然后根據(jù)done的狀態(tài),來決定是否進(jìn)行下一次回合。所以更恰當(dāng)?shù)姆椒ㄊ亲袷豥one的標(biāo)志。這里特別感謝這位老師的講解,對該例子進(jìn)行了詳實(shí)的介紹:OpenAI Gym 經(jīng)典控制環(huán)境介紹——CartPole(倒立擺)_思緒無限的博客-CSDN博客_cartpole-v0

以下是調(diào)試成功后的輸出界面:

[圖片上傳失敗...(image-a041de-1650897932337)]

3.3 例2:MountainCar_v0(小車上山)

在本節(jié)中,我們學(xué)習(xí)一下如何自己去定義一個智能體和Gym庫進(jìn)行交互。我們選取MountainCar_v0作為例子。

首先我們來看看這個例子的觀測空間和動作空間,如下圖所示:

# 查看該任務(wù)的觀測空間和動作空間
import gym
env = gym.make('MountainCar-v0')
print('觀測空間 = {}'. format(env.observation_space))
print('動作空間 = {}'. format(env.action_space))
print('觀測范圍 = {} ~ {}'. format(env.observation_space.low, env.observation_space.high))
print('動作數(shù) = {}'. format(env.action_space.n))

輸出結(jié)果為:

[圖片上傳失敗...(image-1084e5-1650897932337)]

由輸出可知,觀測空間形狀為(2,)的浮點(diǎn)型,動作空間是取0,1,2的int型數(shù)值。

在下面的代碼中,定義了一個智能體類,其中的decision方法實(shí)現(xiàn)了決策功能,learn()方法實(shí)現(xiàn)了學(xué)習(xí)功能。之后讓智能體與環(huán)境進(jìn)行交互,并進(jìn)行圖形的界面顯示,并得到20回合的平均回合獎勵。在下面的代碼中進(jìn)行比較詳細(xì)的注釋,具體代碼如下:

import gym
env = gym.make('MountainCar-v0')

# 定義一個智能體與環(huán)境進(jìn)行交互
class Agent:
    def __init__(self, env):
        pass  # 占位作用,讓代碼完整

    # 簡單定義智能體的決策,用于演示智能體與環(huán)境的交互
    def decision(self, observation):
        # 定義傳入觀測值的參數(shù)
        position, speed = observation
        # 用兩個算式用來決定動作的選擇
        lb = min(-0.09 * (position + 0.25) ** 2 + 0.03, 0.3 * (position + 0.9) ** 4 - 0.008)
        ub = -0.07 * (position + 0.38) ** 2 + 0.07
        if lb < speed < ub:
            action = 2
        else:
            action = 0
        return action  # 返回動作

    # 定義智能體的學(xué)習(xí)功能
    def learn(self, *args):
        pass
    
# 將Agent函數(shù)傳給agent參數(shù)
agent = Agent(env)

# 定義函數(shù)讓智能體和環(huán)境進(jìn)行交互
def play_car(env, agent, render=False, train=False):
    Reward = 0  # 定義回合總獎勵,初始化為0
    observation = env.reset()
    while True:
        if render:  # 判斷圖形顯示
            env.render()
        action = agent.decision(observation)  # 傳入智能體的動作
        next_observation, reward, done, _ = env.step(action) # 執(zhí)行動作
        Reward += reward  # 收集回合獎勵
        if train:  # 判斷是否訓(xùn)練智能體
            agent.learn(observation, action, reward, done)
        if done:  # 回合結(jié)束,調(diào)出循環(huán)
            break
        observation = next_observation
    return Reward
    env.close()

# 計算20回合的平均回合獎勵
sum_Reward = 0 # 收集回合總獎勵
for i in range(20):
    Reward = play_car(env,agent, render = True) # 調(diào)用play_car函數(shù)
    sum_Reward += Reward
    print('每回合獎勵 = {}'.format(Reward))
    # print('回合獎勵加和 = {}'.format(sum_Reward))
avg_Reward = sum_Reward/20
print('平均回合獎勵 = {}'.format(avg_Reward))

輸出結(jié)果:

[圖片上傳失敗...(image-d47c08-1650897932337)]

EasyRL編者對 Gym 庫的用法進(jìn)行總結(jié):使用 env=gym.make(環(huán)境名) 取出環(huán)境,使用 env.reset() 初始化環(huán)境,使用 env.step(動作) 執(zhí)行一步環(huán)境,使用 env.render() 顯示環(huán)境,使用 env.close() 關(guān)閉環(huán)境。Gym庫有對應(yīng)的官方文檔(https://gym.openai.com/docs/),讀者可以閱讀文檔來學(xué)習(xí) Gym 庫。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容