第一章 强化学习介绍
Reinforement Learning
Reinforcement Learning
強化學(xué)習(xí)討論的問題是一個 智能體(agent) 怎么在一個復(fù)雜不確定的環(huán)境(environment)里面去極大化它能獲得的獎勵。示意圖由兩部分組成:agent 和 environment。在強化學(xué)習(xí)過程中,agent 跟 environment 一直在交互。Agent 在環(huán)境里面獲取到狀態(tài),agent 會利用這個狀態(tài)輸出一個 action,一個決策。然后這個決策會放到環(huán)境之中去,環(huán)境會通過這個 agent 采取的決策,輸出下一個狀態(tài)以及當前的這個決策得到的獎勵。Agent 的目的就是為了盡可能多地從環(huán)境中獲取獎勵。
?
我們可以把強化學(xué)習(xí)跟監(jiān)督學(xué)習(xí)做一個對比。上圖說的是 supervised learning。舉個圖片分類的例子,監(jiān)督學(xué)習(xí)就是說我們有一大堆標定的數(shù)據(jù),比如車、飛機、凳子這些標定的圖片,這些圖片都要滿足 i.i.d 分布,就是它們之間是沒有關(guān)聯(lián)的一個分布。然后我們訓(xùn)練一個分類器,比如說右邊這個神經(jīng)網(wǎng)絡(luò)。為了分辨出這個圖片是車輛還是飛機,訓(xùn)練過程中,我們把真實的 label 給了這個網(wǎng)絡(luò)。當這個網(wǎng)絡(luò)做出一個錯誤的預(yù)測,比如現(xiàn)在輸入了這個汽車的圖片,它預(yù)測出來是飛機。我們就會直接告訴它,你這個預(yù)測是錯誤的,正確的 label 應(yīng)該是車。然后我們把這個錯誤寫成一個損失函數(shù)(loss function),通過 Backpropagation 來訓(xùn)練這個網(wǎng)絡(luò)。所以在監(jiān)督學(xué)習(xí)過程中,有兩個假設(shè),
-
輸入的數(shù)據(jù),標定的數(shù)據(jù),它都是沒有關(guān)聯(lián)的,盡可能沒有關(guān)聯(lián)。因為如果有關(guān)聯(lián)的話,這個網(wǎng)絡(luò)是不好學(xué)習(xí)的。
-
我們告訴這個 learner 正確的標簽是什么,這樣它可以通過正確的標簽來修正自己的這個預(yù)測。
?
在強化學(xué)習(xí)里面,這兩點其實都不滿足。舉一個 Atari Breakout 游戲的例子,這是一個打磚塊的游戲,控制木板,然后把這個球反彈到上面來消除這些磚塊。
-
在游戲過程中,大家可以發(fā)現(xiàn)這個 agent 得到的觀測不是個 i.i.d 的分布,上一幀下一幀其實有非常強的連續(xù)性。
-
另外一點,在玩游戲的過程中,你并沒有立刻獲得這個反饋。比如你現(xiàn)在把這個木板往右移,那么只會使得這個球往上或者往左上去一點,你并不會得到立刻的反饋。所以強化學(xué)習(xí)這么困難的原因是沒有得到很好的反饋,然后你依然希望這個 agent 在這個環(huán)境里面學(xué)習(xí)。
?
強化學(xué)習(xí)的訓(xùn)練數(shù)據(jù)就是這樣一個玩游戲的過程。你從第一步開始,采取一個決策,比如說你把這個往右移,接到這個球了。第二步你又做出決策,得到的 training data 是一個玩游戲的序列。
比如現(xiàn)在是在第三步,你把這個序列放進去,你希望這個網(wǎng)絡(luò)可以輸出一個決策,在當前的這個狀態(tài)應(yīng)該輸出往右移或者往左移。這里有個問題,就是我們沒有標簽來說明你現(xiàn)在這個動作是正確還是錯誤,必須等到這個游戲結(jié)束可能,這個游戲可能十秒過后才結(jié)束。現(xiàn)在這個動作往左往右到底是不是對最后游戲的結(jié)束能贏有幫助,其實是不清楚的的。這里就面臨一個延遲獎勵(Delayed Reward),所以就使得訓(xùn)練這個網(wǎng)絡(luò)非常困難。
?
我們對比下強化學(xué)習(xí)和監(jiān)督學(xué)習(xí)。
-
首先強化學(xué)習(xí)輸入的序列的數(shù)據(jù)并不是像 supervised learning 里面這些樣本都是獨立的。
-
另外一點是 learner 并沒有被告訴你每一步正確的行為應(yīng)該是什么。Learner 不得不自己去發(fā)現(xiàn)哪些行為可以使得它最后得到這個獎勵,只能通過不停地嘗試來發(fā)現(xiàn)最有利的 action。
-
這里還有一點是 agent 獲得自己能力的過程中,其實是通過不斷地試錯(trial-and-error exploration)。Exploration 和 exploitation 是強化學(xué)習(xí)里面非常核心的一個問題。Exploration 是說你會去嘗試一些新的行為,這些新的行為有可能會使你得到更高的獎勵,也有可能使你一無所有。Exploitation 說的是你就是就采取你已知的可以獲得最大獎勵的行為,你就重復(fù)執(zhí)行這個 action 就可以了,因為你已經(jīng)知道可以獲得一定的獎勵。因此,我們需要在 exploration 和 exploitation 之間取得一個權(quán)衡,這也是在監(jiān)督學(xué)習(xí)里面沒有的情況。
-
在強化學(xué)習(xí)過程中,沒有非常強的 supervisor,只有一個獎勵信號(reward signal),就是環(huán)境會在很久以后告訴你之前你采取的行為到底是不是有效的。Agent 在這個強化學(xué)習(xí)里面學(xué)習(xí)的話就非常困難,因為你沒有得到即時反饋。當你采取一個行為過后,如果是監(jiān)督學(xué)習(xí),你就立刻可以獲得一個指引,就說你現(xiàn)在做出了一個錯誤的決定,那么正確的決定應(yīng)該是誰。而在強化學(xué)習(xí)里面,環(huán)境可能會告訴你這個行為是錯誤的,但是它并沒有告訴你正確的行為是什么。而且更困難的是,它可能是在一兩分鐘過后告訴你錯誤,它再告訴你之前的行為到底行不行。所以這也是強化學(xué)習(xí)和監(jiān)督學(xué)習(xí)不同的地方。
通過跟監(jiān)督學(xué)習(xí)比較,我們可以總結(jié)出這個強化學(xué)習(xí)的一些特征。
-
首先它是有這個 trial-and-error exploration,它需要通過探索環(huán)境來獲取對這個環(huán)境的理解。
-
第二點是強化學(xué)習(xí) agent 會從環(huán)境里面獲得延遲的獎勵。
-
第三點是在強化學(xué)習(xí)的訓(xùn)練過程中,時間非常重要。因為你得到的數(shù)據(jù)都是有這個時間關(guān)聯(lián)的,而不是這個 i.i.d 分布的。在機器學(xué)習(xí)中,如果觀測數(shù)據(jù)有非常強的關(guān)聯(lián),其實會使得這個訓(xùn)練非常不穩(wěn)定。這也是為什么在監(jiān)督學(xué)習(xí)中,我們希望 data 盡量是 i.i.d 了,這樣就可以消除數(shù)據(jù)之間的相關(guān)性。
-
第四點是這個 agent 的行為會影響它隨后得到的數(shù)據(jù),這一點是非常重要的。在我們訓(xùn)練 agent 的過程中,很多時候我們也是通過正在學(xué)習(xí)的這個 agent 去跟環(huán)境交互來得到數(shù)據(jù)。所以如果在訓(xùn)練過程中,這個 agent 的模型很快死掉了,那會使得我們采集到的數(shù)據(jù)是非常糟糕的,這樣整個訓(xùn)練過程就失敗了。所以在強化學(xué)習(xí)里面一個非常重要的問題就是怎么讓這個 agent 的行為一直穩(wěn)定地提升。
?
為什么我們關(guān)注這個強化學(xué)習(xí),其中非常重要的一點就是強化學(xué)習(xí)得到的這個模型可以取得超人類的結(jié)果。監(jiān)督學(xué)習(xí)獲取的這些監(jiān)督數(shù)據(jù),其實是讓人來標定的。比如說 ImageNet,這些圖片都是人類標定的。那么我們就可以確定這個算法的 upper bound(上限),人類的這個標定結(jié)果決定了它永遠不可能超越人類。但是對于強化學(xué)習(xí),它在環(huán)境里面自己探索,有非常大的潛力,它可以獲得超越人的能力的這個表現(xiàn),比如說 AlphaGo,谷歌 DeepMind 的 AlphaGo 這樣一個強化學(xué)習(xí)的算法可以把人類最強的棋手都打敗。
?
這里給大家舉一些在現(xiàn)實生活中強化學(xué)習(xí)的例子。
-
國際象棋是一個強化學(xué)習(xí)的過程,因為這個棋手就是在做出一個選擇來跟對方對戰(zhàn)。
-
在自然界中,羚羊其實也是在做一個強化學(xué)習(xí),它剛剛出生的時候,可能都不知道怎么站立,然后它通過 trial- and-error 的一個嘗試,三十分鐘過后,它就可以跑到每小時 36 公里,很快地適應(yīng)了這個環(huán)境。
-
你也可以把股票交易看成一個強化學(xué)習(xí)的問題,就怎么去買賣來使你的收益極大化。
-
玩雅達利游戲或者一些電腦游戲,也是一個強化學(xué)習(xí)的過程。
?
上圖是強化學(xué)習(xí)的一個經(jīng)典例子,就是雅達利的一個叫 Pong 的游戲。這個游戲就是把這個球拍到左邊,然后左邊這個選手需要把這個球拍到右邊。訓(xùn)練好的一個強化學(xué)習(xí) agent 和正常的選手有區(qū)別,強化學(xué)習(xí)的 agent 會一直在做這種無意義的一些振動,而正常的選手不會出現(xiàn)這樣的行為。
?
在這個 pong 的游戲里面,決策其實就是兩個動作:往上或者往下。如果強化學(xué)習(xí)是通過學(xué)習(xí)一個 policy network 來分類的話,其實就是輸入當前幀的圖片,然后 policy network 就會輸出所有決策的可能性。
在這種情況下面,對于監(jiān)督學(xué)習(xí)的話,我們就可以直接告訴這個 agent 正確的 label 是什么。在這種游戲情況下面,我們并不知道它的正確的標簽是什么。
在強化學(xué)習(xí)里面,我們是通過讓它嘗試去玩這個游戲,然后直到游戲結(jié)束過后,再去說你前面的一系列動作到底是正確還是錯誤。
上圖的過程是 rollout 的一個過程。Rollout 的意思是從當前幀去生成很多局的游戲。然后這個很多局就通過是你當前的這個網(wǎng)絡(luò)去跟這個環(huán)境交互,你就會得到一堆這個觀測。你可以把每一個觀測看成一個軌跡(trajectory),軌跡的話就是當前幀以及它采取的策略,每一步的這個策略都有。最后結(jié)束過后,你會知道你到底有沒有把這個球擊到對方區(qū)域,對方?jīng)]有接住,你是贏了還是輸了。我們可以通過觀測序列以及 Eventual Reward 來訓(xùn)練這個 agent ,使它盡可能地采取最后可以獲得這個 Eventual Reward 的過程。
強化學(xué)習(xí)是有一定的歷史的,只是最近大家把強化學(xué)習(xí)跟深度學(xué)習(xí)結(jié)合起來,就形成了深度強化學(xué)習(xí)(Deep Reinforcemet Learning)。這里做一個類比,把它類比于這個傳統(tǒng)的計算機視覺以及深度計算機視覺。
-
傳統(tǒng)的計算機視覺由兩個過程組成。你給一張圖,我們先要提取它的特征,用一些設(shè)計好的 feature,比如說 HOG、DPM。提取這些 feature 后,我們再單獨訓(xùn)練一個分類器。這個分類器可以是 SVM、Boosting,然后就可以辨別這張圖片是狗還是貓。
-
2012 年過后,我們有了卷積神經(jīng)網(wǎng)絡(luò),大家就把特征提取以及分類兩者合到一塊兒去了,就是訓(xùn)練一個神經(jīng)網(wǎng)絡(luò)。這個神經(jīng)網(wǎng)絡(luò)既可以做特征提取,也可以做分類。它可以實現(xiàn)這種端到端的一個訓(xùn)練,它里面的參數(shù)可以在每一個階段都得到極大的優(yōu)化,這樣就得到了一個非常重要的突破。
?
我們可以把神經(jīng)網(wǎng)絡(luò)放到強化學(xué)習(xí)里面。
-
之前的強化學(xué)習(xí),比如 TD-Gammon 玩 backgammon 這個游戲,它其實是設(shè)計特征,然后通過訓(xùn)練價值函數(shù)的一個過程,就是它先設(shè)計了很多手工的特征,這個手工特征可以描述現(xiàn)在整個狀態(tài)。得到這些特征過后,它就可以通過訓(xùn)練一個分類網(wǎng)絡(luò)或者分別訓(xùn)練一個價值估計函數(shù)來做出決策。
-
現(xiàn)在我們有了深度學(xué)習(xí),有了神經(jīng)網(wǎng)絡(luò),那么大家也把這個過程改進成一個 end-to-end training 的過程。你直接輸入這個狀態(tài),我們不需要去手工地設(shè)計這個特征,就可以讓它直接輸出 action。那么就可以用一個神經(jīng)網(wǎng)絡(luò)來擬合我們這里的 value function 或 policy network,省去 了 feature engineering 的過程。
?
為什么強化學(xué)習(xí)在這幾年就用到各種應(yīng)用中去,比如玩游戲以及機器人的一些應(yīng)用,并且取得了可以擊敗人類最好棋手的一個結(jié)果。
這由幾點組成:
-
我們有了更多的計算能力,有了更多的 GPU,可以更快地做更多的 trial-and-error 的嘗試。
-
通過這種不同嘗試使得 agent 在這個環(huán)境里面獲得很多信息,然后可以在這個環(huán)境里面取得很大的獎勵。
-
我們有了這個端到端的一個訓(xùn)練,可以把特征提取和價值估計或者決策一塊來優(yōu)化,這樣就可以得到了一個更強的決策網(wǎng)絡(luò)。
接下來給大家再看一些強化學(xué)習(xí)里面比較有意思的例子。
-
第一個例子是 DeepMind 研發(fā)的一個走路的 agent。這個 agent 往前走一步,你就會得到一個 reward。這個 agent 有不同的這個形態(tài),可以學(xué)到很多有意思的功能。比如怎么跨越這個障礙物,就像那個蜘蛛那樣的 agent 。怎么跨越障礙物,像這個人有雙腿一樣, 這個 agent 往前走。以及像這個人形 的agent,怎么在一個曲折的道路上面往前走。這個結(jié)果也是非常有意思,這個人形 agent 會把手舉得非常高,因為它這個手的功能就是為了使它身體保持平衡,這樣它就可以更快地在這個環(huán)境里面往前跑,而且這里你也可以增加這個環(huán)境的難度,加入一些擾動,這個 agent 就會變得更魯棒。
-
第二個例子是機械臂抓取。因為這個機械臂的應(yīng)用自動去強化學(xué)習(xí)需要大量的這個 rollout,所以它這里就有好多機械臂。然后分布式系統(tǒng)可以讓這個機械臂嘗試抓取不同的物體。你發(fā)現(xiàn)這個盤子里面物體的形狀、形態(tài)其實都是不同的,這樣就可以讓這個機械臂學(xué)到一個統(tǒng)一的行為。然后在不同的抓取物下面都可以采取最優(yōu)的一個抓取特征。你的這個抓取的物件形態(tài)存在很多不同,一些傳統(tǒng)的這個抓取算法就沒法把所有物體都抓起來,因為你對每一個物體都需要做一個建模,這樣的話就是非常花時間。但是通過強化學(xué)習(xí),你就可以學(xué)到一個統(tǒng)一的抓取算法,在不同物體上它都可以適用。
-
第三個例子是 OpenAI 做的一個機械臂翻魔方。這里它們 18 年的時候先設(shè)計了這個手指的一個機械臂,讓它可以通過翻動手指,使得手中的這個木塊達到一個預(yù)定的設(shè)定。人的手指其實非常精細,怎么使得這個機械手臂也具有這樣靈活的能力就一直是個問題。它們通過這個強化學(xué)習(xí)在一個虛擬環(huán)境里面先訓(xùn)練,讓 agent 能翻到特定的這個方向,再把它應(yīng)用到真實的手臂之中。這在強化學(xué)習(xí)里面是一個比較常用的做法,就是你先在虛擬環(huán)境里面得到一個很好的 agent,然后再把它使用到真實的這個機器人中。因為真實的機械手臂通常都是非常容易壞,而且非常貴,你沒法大批量地購買。2019年對手臂進一步改進了,這個手臂可以玩魔方了。這個結(jié)果也非常有意思,到后面,這個魔方就被恢復(fù)成了個六面都是一樣的結(jié)構(gòu)了。
-
第四個例子是一個穿衣服的 agent ,就是訓(xùn)練這個 agent 穿衣服。因為很多時候你要在電影或者一些動畫實現(xiàn)這個人穿衣的這種場景,通過手寫執(zhí)行命令讓機器人穿衣服其實非常困難。很多時候穿衣服也是一個非常精細的操作,那么它們這個工作就是訓(xùn)練這個強化學(xué)習(xí) agent,然后就可以實現(xiàn)這個穿衣功能。這里你還可以加入一些擾動,然后 agent 可以抗擾動。可能有這種 failure case, agent 就穿不進去,就卡在這個地方。
Introduction to Sequential Decision Making
Agent and Environment
接下來我們講序列決策(Sequential Decision Making)過程。強化學(xué)習(xí)研究的問題是 agent 跟環(huán)境交互,上圖左邊畫的是一個 agent,agent 一直在跟環(huán)境進行交互。這個 agent 把它輸出的動作給環(huán)境,環(huán)境取得這個動作過后,會進行到下一步,然后會把下一步的觀測跟它上一步是否得到獎勵返還給 agent。通過這樣的交互過程會產(chǎn)生很多觀測,agent 就是為了從這些觀測之中學(xué)到能極大化獎勵的策略。
Reward
獎勵是由環(huán)境給的一個反饋信號,這個信號指定了這個 agent 在某一步采取了某個策略是否得到獎勵。強化學(xué)習(xí)的目的就是為了極大化 agent 可以獲得的獎勵,agent 在這個環(huán)境里面存在的目的就是為了極大它的期望積累的獎勵。
?
這里給大家舉一些獎勵的例子。不同的環(huán)境,獎勵也是不同的。
-
比如說一個下象棋的選手,它的目的其實就為了贏棋。獎勵是說在最后棋局結(jié)束的時候,他知道會得到一個正獎勵或者負獎勵。
-
羚羊站立也是一個強化學(xué)習(xí)過程,它得到的獎勵就是它是否可以最后跟它媽媽一塊離開或者它被吃掉。
-
在股票管理里面,獎勵定義由你的股票獲取的收益跟損失決定。
-
在玩雅達利游戲的時候,獎勵就是你有沒有在增加游戲的分數(shù),獎勵本身的稀疏程度決定了這個游戲的難度。
Sequential Decision Making
?
在一個強化學(xué)習(xí)環(huán)境里面,agent 的目的就是選取一系列的動作來極大化它的獎勵,所以這些采取的動作必須有長期的影響。但在這個過程里面,它的獎勵其實是被延遲了,就是說你現(xiàn)在采取的某一步?jīng)Q策可能要等到時間很久過后才知道這一步到底產(chǎn)生了什么樣的影響。
這里一個示意圖就是我們玩這個 Atari 的 Pong 游戲,你可能只有到最后游戲結(jié)束過后,才知道這個球到底有沒有擊打過去。中間你采取的 up 或 down 行為,并不會直接產(chǎn)生獎勵。強化學(xué)習(xí)里面一個重要的課題就是近期獎勵和遠期獎勵的一個 trade-off。怎么讓 agent 取得更多的長期獎勵是強化學(xué)習(xí)的問題。
在跟環(huán)境的交互過程中,agent 會獲得很多觀測。在每一個觀測會采取一個動作,它也會得到一個獎勵。所以歷史是觀測、行為、獎勵的序列:
Agent 在采取當前動作的時候會依賴于它之前得到的這個歷史,所以你可以把整個游戲的狀態(tài)看成關(guān)于這個歷史的函數(shù):
Q: 狀態(tài)和觀測有什么關(guān)系?
A: 狀態(tài)(state) $s$ 是對世界的完整描述,不會隱藏世界的信息。觀測(observation) $o$ 是對狀態(tài)的部分描述,可能會遺漏一些信息。
在 deep RL 中,我們幾乎總是用一個實值的向量、矩陣或者更高階的張量來表示狀態(tài)和觀測。舉個例子,我們可以用 RGB 像素值的矩陣來表示一個視覺的觀測,我們可以用機器人關(guān)節(jié)的角度和速度來表示一個機器人的狀態(tài)。
在 agent 的內(nèi)部也有一個函數(shù)來更新這個狀態(tài)。當 agent 的狀態(tài)跟環(huán)境的狀態(tài)等價的時候,我們就說這個環(huán)境是 full observability,就是全部可以觀測。換句話說,當 agent 能夠觀察到環(huán)境的所有狀態(tài)時,我們稱這個環(huán)境是完全可觀測的(fully observed)。
但是有一種情況是 agent 得到的觀測并不能包含所有環(huán)境運作的狀態(tài),因為在這個強化學(xué)習(xí)的設(shè)定里面,環(huán)境的狀態(tài)才是真正的所有狀態(tài)。比如 agent 在玩這個 black jack 這個游戲,它能看到的其實是牌面上的牌。或者在玩雅達利游戲的時候,觀測到的只是當前電視上面這一幀的信息,你并沒有得到游戲內(nèi)部里面所有的運作狀態(tài)。也就是說當 agent 只能看到部分的觀測,我們就稱這個環(huán)境是部分可觀測的(partially observed)。在這種情況下面,強化學(xué)習(xí)通常被建模成一個 POMDP 的問題。
部分可觀測馬爾可夫決策過程(Partially Observable Markov Decision Processes, POMDP)是一個馬爾可夫決策過程的泛化。POMDP 依然具有馬爾可夫性質(zhì),但是假設(shè)智能體無法感知環(huán)境的狀態(tài) $s$,只能知道部分觀測值 $o$。比如在自動駕駛中,智能體只能感知傳感器采集的有限的環(huán)境信息。
POMDP 可以用一個 7 元組描述:$(S,A,T,R,\Omega,O,\gamma)$,其中 $S$ 表示狀態(tài)空間,為隱變量,$A$ 為動作空間,$T(s'|s,a)$ 為狀態(tài)轉(zhuǎn)移概率,$R$ 為獎勵函數(shù),$\Omega(o|s,a)$ 為觀測概率,$O$ 為觀測空間,$\gamma$ 為折扣系數(shù)。
Action Spaces
不同的環(huán)境允許不同種類的動作。在給定的環(huán)境中,有效動作的集合經(jīng)常被稱為動作空間(action space)。像 Atari 和 Go 這樣的環(huán)境有離散動作空間(discrete action spaces),在這個動作空間里,agent 的動作數(shù)量是有限的。在其他環(huán)境,比如在物理世界中控制一個 agent,在這個環(huán)境中就有連續(xù)動作空間(continuous action spaces) 。在連續(xù)空間中,動作是實值的向量。
例如,
-
走迷宮機器人如果只有東南西北這 4 種移動方式,則其為離散動作空間;
-
如果機器人向 $360^{\circ}$ 中的任意角度都可以移動,則為連續(xù)動作空間。
Major Components of an RL Agent
對于一個強化學(xué)習(xí) agent,它有如下組成成分:
-
首先 agent 有一個 policy function,agent 會用這個函數(shù)來選取下一步的動作。
-
然后它也可能生成一個價值函數(shù)(value function)。我們用價值函數(shù)來對當前狀態(tài)進行估價,它就是說你進入現(xiàn)在這個狀態(tài),可以對你后面的收益帶來多大的影響。當這個價值函數(shù)大的時候,說明你進入這個狀態(tài)越有利。
-
另外一個組成成分是模型(model)。模型表示了 agent 對這個環(huán)境的狀態(tài)進行了理解,它決定了這個世界是如何進行的。
Policy
我們深入看這三個組成成分的一些細節(jié)。
Policy 決定了這個 agent 的行為,它其實是一個函數(shù),把輸入的狀態(tài)變成行為。這里有兩種 policy:
-
一種是 stochastic policy(隨機性策略),它就是 $\pi$ 函數(shù) $\pi(a | s)=P\left[A{t}=a | S{t}=s\right]$ 。當你輸入一個狀態(tài) $s$ 的時候,輸出是一個概率。這個概率就是你所有行為的一個概率,然后你可以進一步對這個概率分布進行采樣,得到真實的你采取的行為。比如說這個概率可能是有 70% 的概率往左,30% 的概率往右,那么你通過采樣就可以得到一個 action。
-
一種是 deterministic policy(確定性策略),就是說你這里有可能只是采取它的極大化,采取最有可能的動作。你現(xiàn)在這個概率就是事先決定好的。
從 Atari 游戲來看的話,policy function 的輸入就是游戲的一幀,它的輸出決定你是往左走或者是往右走。
通常情況下,強化學(xué)習(xí)一般使用隨機性策略。隨機性策略有很多優(yōu)點:
-
在學(xué)習(xí)時可以通過引入一定隨機性來更好地探索環(huán)境;
-
隨機性策略的動作具有多樣性,這一點在多個智能體博弈時也非常重要。采用確定性策略的智能體總是對同樣的環(huán)境做出相同的動作,會導(dǎo)致它的策略很容易被對手預(yù)測。
Value Function
價值函數(shù)是未來獎勵的一個預(yù)測,用來評估狀態(tài)的好壞。
價值函數(shù)里面有一個 discount factor,我們希望盡可能在短的時間里面得到盡可能多的獎勵。如果我們說十天過后,我給你 100 塊錢,跟我現(xiàn)在給你 100 塊錢,你肯定更希望我現(xiàn)在就給你 100 塊錢,因為你可以把這 100 塊錢存在銀行里面,你就會有一些利息。所以我們就通過把這個 discount factor 放到價值函數(shù)的定義里面,價值函數(shù)的定義其實是一個期望。這里有一個期望 $\mathbb{E}_{\pi}$,這里有個小角標是 $\pi$ 函數(shù),這個 $\pi$ 函數(shù)就是說在我們已知某一個 policy function 的時候,到底可以得到多少的獎勵。
我們還有一種價值函數(shù):Q 函數(shù)。Q 函數(shù)里面包含兩個變量:狀態(tài)和動作。所以你未來可以獲得多少的獎勵,它的這個期望取決于你當前的狀態(tài)和當前的行為。這個 Q 函數(shù)是強化學(xué)習(xí)算法里面要學(xué)習(xí)的一個函數(shù)。因為當我們得到這個 Q 函數(shù)后,進入某一種狀態(tài),它最優(yōu)的行為就可以通過這個 Q 函數(shù)來得到。
Model
第三個組成部分是模型,模型決定了下一個狀態(tài)會是什么樣的,就是說下一步的狀態(tài)取決于你當前的狀態(tài)以及你當前采取的行為。它由兩個部分組成,
-
一個是 probability,它這個轉(zhuǎn)移狀態(tài)之間是怎么轉(zhuǎn)移的。
-
另外是這個獎勵函數(shù),當你在當前狀態(tài)采取了某一個行為,可以得到多大的獎勵。
?
當我們有了這三個成分過后,就形成了一個 Markov Decision Process。這個決策過程可視化了狀態(tài)之間的轉(zhuǎn)移以及采取的行為。
?
這里我們來看一個走迷宮的例子,這個例子要求 agent 從 start 開始,然后到達 goal 的位置。這里設(shè)定的獎勵是每走一步,你就會得到一個負的獎勵。這里可以采取的動作是往上下左右走。當前狀態(tài)用現(xiàn)在 agent 所在的位置來描述。
我們可以用不同的強化學(xué)習(xí)算法來解這個環(huán)境,如果我們采取的是 Policy-based RL,當我們學(xué)習(xí)好了這個環(huán)境過后,在每一個狀態(tài),我們就會得到一個最佳的行為。比如說現(xiàn)在在第一格開始的時候,我們知道它最佳行為是往右走,然后第二格的時候,得到的最佳策略是往上走,第三格是往右走。通過這個最佳的策略,我們就可以最快地到達終點。
如果換成 value-based RL 這個算法,利用價值函數(shù)來作為導(dǎo)向,我們就會得到另外一種表征。這里就表征了你每一個狀態(tài)會返回一個價值,比如說你在 start 位置的時候,價值是 -16,因為你最快可以 16 步到達終點。因為每走一步會減一,所以你這里的價值是 -16。當我們快接近最后終點的時候,這個數(shù)字變得越來越大。在拐角的時候,比如要現(xiàn)在在第二格 -15。然后 agent 會看上下,它看到上面值變大了,變成 -14 了,它下面是 -16,那么這個 agent 肯定就會采取一個往上走的策略。所以通過這個學(xué)習(xí)的值的不同,我們可以抽取出現(xiàn)在最佳的策略。
Types of RL Agents
根據(jù)強化學(xué)習(xí) agent 的不同,我們可以把 agent 進行歸類。
-
基于價值函數(shù)的 agent。這一類 agent 顯式地學(xué)習(xí)的是價值函數(shù),隱式地學(xué)習(xí)了它的策略。因為這個策略是從我們學(xué)到的價值函數(shù)里面推算出來的。
-
基于策略的 agent,它直接去學(xué)習(xí) policy,就是說你直接給它一個 state,它就會輸出這個動作的概率。在這個 policy-based agent 里面并沒有去學(xué)習(xí)它的價值函數(shù)。
-
把 value-based 和 policy-based 結(jié)合起來就有了 Actor-Critic agent。這一類 agent 就把它的策略函數(shù)和價值函數(shù)都學(xué)習(xí)了,然后通過兩者的交互得到一個最佳的行為。
Q: 基于策略迭代和基于價值迭代的強化學(xué)習(xí)方法有什么區(qū)別?
A: 對于一個狀態(tài)轉(zhuǎn)移概率已知的馬爾可夫決策過程,我們可以使用動態(tài)規(guī)劃算法來求解;從決策方式來看,強化學(xué)習(xí)又可以劃分為基于策略迭代的方法和基于價值迭代的方法。決策方式是智能體在給定狀態(tài)下從動作集合中選擇一個動作的依據(jù),它是靜態(tài)的,不隨狀態(tài)變化而變化。
在基于策略迭代的強化學(xué)習(xí)方法中,智能體會制定一套動作策略(確定在給定狀態(tài)下需要采取何種動作),并根據(jù)這個策略進行操作。強化學(xué)習(xí)算法直接對策略進行優(yōu)化,使制定的策略能夠獲得最大的獎勵。
而在基于價值迭代的強化學(xué)習(xí)方法中,智能體不需要制定顯式的策略,它維護一個價值表格或價值函數(shù),并通過這個價值表格或價值函數(shù)來選取價值最大的動作。基于價值迭代的方法只能應(yīng)用在不連續(xù)的、離散的環(huán)境下(如圍棋或某些游戲領(lǐng)域),對于行為集合規(guī)模龐大、動作連續(xù)的場景(如機器人控制領(lǐng)域),其很難學(xué)習(xí)到較好的結(jié)果(此時基于策略迭代的方法能夠根據(jù)設(shè)定的策略來選擇連續(xù)的動作)。
基于價值迭代的強化學(xué)習(xí)算法有 Q-learning、 Sarsa 等,而基于策略迭代的強化學(xué)習(xí)算法有策略梯度算法等。此外, Actor-Critic 算法同時使用策略和價值評估來做出決策,其中,智能體會根據(jù)策略做出動作,而價值函數(shù)會對做出的動作給出價值,這樣可以在原有的策略梯度算法的基礎(chǔ)上加速學(xué)習(xí)過程,取得更好的效果。
另外,我們是可以通過 agent 到底有沒有學(xué)習(xí)這個環(huán)境模型來分類。
-
第一種是 model-based(有模型) RL agent,它通過學(xué)習(xí)這個狀態(tài)的轉(zhuǎn)移來采取措施。
-
另外一種是 model-free(免模型) RL agent,它沒有去直接估計這個狀態(tài)的轉(zhuǎn)移,也沒有得到環(huán)境的具體轉(zhuǎn)移變量。它通過學(xué)習(xí) value function 和 policy function 進行決策。這種 model-free 的模型里面沒有一個環(huán)境轉(zhuǎn)移的一個模型。
我們可以用馬爾可夫決策過程來定義強化學(xué)習(xí)任務(wù),并表示為四元組 $<S,A,P,R>$,即狀態(tài)集合、動作集合、狀態(tài)轉(zhuǎn)移函數(shù)和獎勵函數(shù)。如果這四元組中所有元素均已知,且狀態(tài)集合和動作集合在有限步數(shù)內(nèi)是有限集,則機器可以對真實環(huán)境進行建模,構(gòu)建一個虛擬世界來模擬真實環(huán)境的狀態(tài)和交互反應(yī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),這樣智能體就不需要在真實環(huán)境中采取動作,直接在虛擬世界中學(xué)習(xí)和規(guī)劃策略即可。這種學(xué)習(xí)方法稱為有模型學(xué)習(xí)。
?
上圖是有模型強化學(xué)習(xí)的流程圖。
然而在實際應(yīng)用中,智能體并不是那么容易就能知曉 MDP 中的所有元素的。通常情況下,狀態(tài)轉(zhuǎn)移函數(shù)和獎勵函數(shù)很難估計,甚至連環(huán)境中的狀態(tài)都可能是未知的,這時就需要采用免模型學(xué)習(xí)。免模型學(xué)習(xí)沒有對真實環(huán)境進行建模,智能體只能在真實環(huán)境中通過一定的策略來執(zhí)行動作,等待獎勵和狀態(tài)遷移,然后根據(jù)這些反饋信息來更新行為策略,這樣反復(fù)迭代直到學(xué)習(xí)到最優(yōu)策略。
Q: 有模型強化學(xué)習(xí)和免模型強化學(xué)習(xí)有什么區(qū)別?
A: 針對是否需要對真實環(huán)境建模,強化學(xué)習(xí)可以分為有模型學(xué)習(xí)和免模型學(xué)習(xí)。
-
有模型學(xué)習(xí)是指根據(jù)環(huán)境中的經(jīng)驗,構(gòu)建一個虛擬世界,同時在真實環(huán)境和虛擬世界中學(xué)習(xí);
-
免模型學(xué)習(xí)是指不對環(huán)境進行建模,直接與真實環(huán)境進行交互來學(xué)習(xí)到最優(yōu)策略。
總的來說,有模型學(xué)習(xí)相比于免模型學(xué)習(xí)僅僅多出一個步驟,即對真實環(huán)境進行建模。因此,一些有模型的強化學(xué)習(xí)方法,也可以在免模型的強化學(xué)習(xí)方法中使用。在實際應(yīng)用中,如果不清楚該用有模型強化學(xué)習(xí)還是免模型強化學(xué)習(xí),可以先思考一下,在智能體執(zhí)行動作前,是否能對下一步的狀態(tài)和獎勵進行預(yù)測,如果可以,就能夠?qū)Νh(huán)境進行建模,從而采用有模型學(xué)習(xí)。
免模型學(xué)習(xí)通常屬于數(shù)據(jù)驅(qū)動型方法,需要大量的采樣來估計狀態(tài)、動作及獎勵函數(shù),從而優(yōu)化動作策略。例如,在 Atari 平臺上的 Space Invader 游戲中,免模型的深度強化學(xué)習(xí)需要大約 2 億幀游戲畫面才能學(xué)到比較理想的效果。相比之下,有模型學(xué)習(xí)可以在一定程度上緩解訓(xùn)練數(shù)據(jù)匱乏的問題,因為智能體可以在虛擬世界中行訓(xùn)練。
免模型學(xué)習(xí)的泛化性要優(yōu)于有模型學(xué)習(xí),原因是有模型學(xué)習(xí)算需要對真實環(huán)境進行建模,并且虛擬世界與真實環(huán)境之間可能還有差異,這限制了有模型學(xué)習(xí)算法的泛化性。
有模型的強化學(xué)習(xí)方法可以對環(huán)境建模,使得該類方法具有獨特魅力,即“想象能力”。在免模型學(xué)習(xí)中,智能體只能一步一步地采取策略,等待真實環(huán)境的反饋;而有模型學(xué)習(xí)可以在虛擬世界中預(yù)測出所有將要發(fā)生的事,并采取對自己最有利的策略。
目前,大部分深度強化學(xué)習(xí)方法都采用了免模型學(xué)習(xí),這是因為:
-
免模型學(xué)習(xí)更為簡單直觀且有豐富的開源資料,像 DQN、AlphaGo 系列等都采用免模型學(xué)習(xí);
-
在目前的強化學(xué)習(xí)研究中,大部分情況下環(huán)境都是靜態(tài)的、可描述的,智能體的狀態(tài)是離散的、可觀察的(如 Atari 游戲平臺),這種相對簡單確定的問題并不需要評估狀態(tài)轉(zhuǎn)移函數(shù)和獎勵函數(shù),直接采用免模型學(xué)習(xí),使用大量的樣本進行訓(xùn)練就能獲得較好的效果。
?
把幾類模型放到同一個 pie chart 里面。三個組成部分:value function、policy、model。按一個 agent 具不具有三者中的兩者或者一者可以把它分成很多類。
Learning and Planning
Learning 和 Planning 是序列決策的兩個基本問題。
Reinforcement Learning
?
在 reinforcement learning 中,環(huán)境初始時是未知的,agent 不知道環(huán)境如何工作,agent 通過不斷地與環(huán)境交互,逐漸改進策略。
Planning
?
在 plannning 中,環(huán)境是已知的,我們被告知了整個環(huán)境的運作規(guī)則的詳細信息。Agent 能夠計算出一個完美的模型,并且在不需要與環(huán)境進行任何交互的時候進行計算。Agent 不需要實時地與環(huán)境交互就能知道未來環(huán)境,只需要知道當前的狀態(tài),就能夠開始思考,來尋找最優(yōu)解。
在這個游戲中,規(guī)則是制定的,我們知道選擇 left 之后環(huán)境將會產(chǎn)生什么變化。我們完全可以通過已知的變化規(guī)則,來在內(nèi)部進行模擬整個決策過程,無需與環(huán)境交互。
一個常用的強化學(xué)習(xí)問題解決思路是,先學(xué)習(xí)環(huán)境如何工作,也就是了解環(huán)境工作的方式,即學(xué)習(xí)得到一個模型,然后利用這個模型進行規(guī)劃。
Exploration and Exploitation
在強化學(xué)習(xí)里面,Exploration 和Exploitation 是兩個很核心的問題。
-
Exploration 是說我們怎么去探索這個環(huán)境,通過嘗試不同的行為來得到一個最佳的策略,得到最大獎勵的策略。
-
Exploitation 是說我們不去嘗試新的東西,就采取已知的可以得到很大獎勵的行為。
因為在剛開始的時候強化學(xué)習(xí) agent 不知道它采取了某個行為會發(fā)生什么,所以它只能通過試錯去探索。所以 Exploration 就是在試錯來理解采取的這個行為到底可不可以得到好的獎勵。Exploitation 是說我們直接采取已知的可以得到很好獎勵的行為。所以這里就面臨一個 trade-off,怎么通過犧牲一些短期的 reward 來獲得行為的理解。
這里我給大家舉一些例子來說明 Exploration 和 Exploitation 的定義。
-
以選擇餐館為例,
-
Exploitation 是說我們直接去你最喜歡的餐館,因為你去過這個餐館很多次了,所以你知道這里面的菜都非常可口。
-
Exploration 是說你把手機拿出來,你直接搜索一個新的餐館,然后去嘗試它到底好不好吃。這里的結(jié)果就是有可能這個新的餐館非常不滿意,你就這個錢就浪費了。
-
-
以做廣告為例,
-
Exploitation 就是說我們直接采取最優(yōu)的這個廣告策略。
-
Exploration 就是說我們換一種廣告方式,然后看這個新的廣告策略到底可不可以得到獎勵。
-
-
以挖油為例,
-
Exploitation 就是說我們直接在已知的地方挖油,我們就可以確保挖到油。
-
Exploration 就是說我們在一個新的地方挖油,就有很大的概率,你可能不能發(fā)現(xiàn)任何油,但也可能有比較小的概率可以發(fā)現(xiàn)一個非常大的油田。
-
-
以玩游戲為例,
-
Exploitation 就是說你總是采取某一種策略。比如說,你可能打街霸,你采取的策略可能是蹲在角落,然后一直觸腳。這個策略很可能可以奏效,但可能遇到特定的對手就失效。
-
Exploration 就是說你可能嘗試一些新的招式,有可能你會發(fā)出大招來,這樣就可能一招斃命。
-
K-armed Bandit
?
與一般監(jiān)督學(xué)習(xí)不同,強化學(xué)習(xí)任務(wù)的最終獎賞是在多步動作之后才能觀察到,這里我們不妨先考慮比較簡單的情形:最大化單步獎賞,即僅考慮一步操作。需注意的是,即便在這樣的簡化情形下,強化學(xué)習(xí)仍與監(jiān)督學(xué)習(xí)有顯著不同,因為機器需通過嘗試來發(fā)現(xiàn)各個動作產(chǎn)生的結(jié)果,而沒有訓(xùn)練數(shù)據(jù)告訴機器應(yīng)當做哪個動作。
想要最大化單步獎賞需考慮兩個方面:一是需知道每個動作帶來的獎賞,二是要執(zhí)行獎賞最大的動作。若每個動作對應(yīng)的獎賞是一個確定值,那么嘗試遍所有的動作便能找出獎賞最大的動作。然而,更一般的情形是,一個動作的獎賞值是來自于一個概率分布,僅通過一次嘗試并不能確切地獲得平均獎賞值。
實際上,單步強化學(xué)習(xí)任務(wù)對應(yīng)了一個理論模型,即K-臂賭博機(K-armed bandit)。K-臂賭博機也被稱為 多臂賭博機(Multi-armed bandit)。如上圖所示,K-搖臂賭博機有 K 個搖臂,賭徒在投入一個硬幣后可選擇按下其中一個搖臂,每個搖臂以一定的概率吐出硬幣,但這個概率賭徒并不知道。賭徒的目標是通過一定的策略最大化自己的獎賞,即獲得最多的硬幣。
-
若僅為獲知每個搖臂的期望獎賞,則可采用僅探索(exploration-only)法:將所有的嘗試機會平均分配給每個搖臂(即輪流按下每個搖臂),最后以每個搖臂各自的平均吐幣概率作為其獎賞期望的近似估計。
-
若僅為執(zhí)行獎賞最大的動作,則可采用僅利用(exploitation-only)法:按下目前最優(yōu)的(即到目前為止平均獎賞最大的)搖臂,若有多個搖臂同為最優(yōu),則從中隨機選取一個。
顯然,僅探索法能很好地估計每個搖臂的獎賞,卻會失去很多選擇最優(yōu)搖臂的機會;僅利用法則相反,它沒有很好地估計搖臂期望獎賞,很可能經(jīng)常選不到最優(yōu)搖臂。因此,這兩種方法都難以使最終的累積獎賞最大化。
事實上,探索(即估計搖臂的優(yōu)劣)和利用(即選擇當前最優(yōu)搖臂)這兩者是矛盾的,因為嘗試次數(shù)(即總投幣數(shù))有限,加強了一方則會自然削弱另一方,這就是強化學(xué)習(xí)所面臨的探索-利用窘境(Exploration-Exploitation dilemma)。顯然,想要累積獎賞最大,則必須在探索與利用之間達成較好的折中。
Experiment with Reinforcement Learning
接下來進入一個實踐環(huán)節(jié)。強化學(xué)習(xí)是一個理論跟實踐結(jié)合的機器學(xué)習(xí)分支,需要去推導(dǎo)很多算法公式。然后去理解它算法背后的一些數(shù)學(xué)原理。另外一方面,上機實踐通過實現(xiàn)算法,在很多實驗環(huán)境里面去探索這個算法是不是可以得到預(yù)期效果也是一個非常重要的過程。
?
我會在網(wǎng)頁上面公布一些代碼,會利用 Python 和深度學(xué)習(xí)的一些包(主要是用 PyTorch 為主),然后在這個鏈接里面,我其實已經(jīng)公布了一些 RL 相關(guān)的代碼。
?
你可以直接調(diào)用現(xiàn)有的包來實踐。現(xiàn)在有很多深度學(xué)習(xí)的包可以用,熟練使用這里面的兩三種,其實已經(jīng)可以實現(xiàn)非常多的功能。所以你并不需要從頭去去造輪子,就直接調(diào)用它里面的函數(shù)去實現(xiàn)你想實現(xiàn)的功能。
?
OpenAI 是一個非盈利的人工智能研究公司。Open AI 公布了非常多的學(xué)習(xí)資源以及這個算法資源,他們之所以叫 Open AI,就是他們把所有開發(fā)的算法都 open source 出來。
Gym
?
OpenAI Gym 是一個環(huán)境仿真庫,里面包含了很多現(xiàn)有的環(huán)境。針對不同的場景,我們可以選擇不同的環(huán)境,
-
離散控制場景(輸出的動作是可數(shù)的,比如 Pong 游戲中輸出的向上或向下動作):一般使用 Atari 環(huán)境評估
-
連續(xù)控制場景(輸出的動作是不可數(shù)的,比如機器人走路時不僅有方向,還要角度,角度就是不可數(shù)的,是一個連續(xù)的量 ):一般使用 mujoco 環(huán)境評估
Gym Retro 是對 Gym 環(huán)境的進一步擴展,包含了更多的一些游戲。
我們可以通過 pip 來安裝 Gym:
pip install gym在 Python 環(huán)境中導(dǎo)入Gym,如果不報錯,就可以認為 Gym 安裝成功。
$python >>>import gym?
強化學(xué)習(xí)的這個交互就是由 agent 跟環(huán)境進行交互。所以算法的 interface 也是用這個來表示。比如說我們現(xiàn)在安裝了 OpenAI Gym。那我們這里就可以直接調(diào)入 Taxi-v2 的環(huán)境,就建立了這個環(huán)境。初始化這個環(huán)境過后,就可以進行交互了。Agent 得到這個觀測過后,它就會輸出一個 action。然后這個 action 會被這個環(huán)境拿進去執(zhí)行這個 step,然后環(huán)境就會往前走一步,然后返回新的 observation 和 reward 以及一個 flag variable 就決定你這個游戲是不是結(jié)束了。幾行代碼就實現(xiàn)了強化學(xué)習(xí)里面的 framework。
在 OpenAI Gym 里面有很經(jīng)典的控制類游戲。
-
比如說 Acrobot,就是把這個兩節(jié)鐵杖,然后甩了立起來。
-
CartPole 是通過控制一個平板,讓這個木棍立起來。
-
MountainCar 是通過前后移動這個車,讓它到達這個旗子的位置。
大家可以點這個鏈接看一看這些環(huán)境。在剛開始測試強化學(xué)習(xí)的時候,可以選擇這些簡單環(huán)境,因為這些環(huán)境可以在一兩分鐘之內(nèi)見到一個效果。
?
這里我們看一下 CartPole 的這個環(huán)境。對于這個環(huán)境,有兩個動作,Cart 往左移還是往右移。這里得到了觀測:這個車當前的位置,Cart 當前的往左往右移的速度,這個桿的角度以及它的桿的最高點的速度。
如果 observation 越詳細,就可以更好地描述當前這個所有的狀態(tài)。這里有 reward 的定義,如果能多保留一步,你就會得到一個獎勵,所以你需要在盡可能多的時間存活來得到更多的獎勵。當這個桿的角度大于某一個角度(沒能保持平衡)或者這個車已經(jīng)出到外面的時候,游戲就結(jié)束了,你就輸了。所以這個 agent 的目的就是為了控制木棍,讓它盡可能地保持平衡以及盡可能保持在這個環(huán)境的中央。
import gym ?# 導(dǎo)入 Gym 的 Python 接口環(huán)境包 env = gym.make('CartPole-v0') ?# 構(gòu)建實驗環(huán)境 env.reset() ?# 重置一個 episode for _ in range(1000):env.render() ?# 顯示圖形界面action = env.action_space.sample() # 從動作空間中隨機選取一個動作env.step(action) # 用于提交動作,括號內(nèi)是具體的動作 env.close() # 關(guān)閉環(huán)境注意:如果繪制了實驗的圖形界面窗口,那么關(guān)閉該窗口的最佳方式是調(diào)用env.close()。試圖直接關(guān)閉圖形界面窗口可能會導(dǎo)致內(nèi)存不能釋放,甚至?xí)?dǎo)致死機。
當你執(zhí)行這段代碼時,可能會很失望,因為機器人會完全無視那根本該立起來的桿子,駕駛著小車朝某個方向一通跑,直到不見蹤影。這是因為我們還沒開始訓(xùn)練機器人。
Gym 中的小游戲,大部分都可以用一個普通的實數(shù)或者向量來充當動作。打印 env.action_space.sample() 的返回值,能看到輸出為 1 或者 0。
env.action_space.sample()的含義是,在該游戲的所有動作空間里隨機選擇一個作為輸出。在這個例子中,意思就是,動作只有兩個:0 和 1,一左一右。
env.step()這個方法的作用不止于此,它還有四個返回值,分別是observation、reward、done、info。
-
observation(object)是狀態(tài)信息,是在游戲中觀測到的屏幕像素值或者盤面狀態(tài)描述信息。
-
reward(float)是獎勵值,即 action 提交以后能夠獲得的獎勵值。這個獎勵值因游戲的不同而不同,但總體原則是,對完成游戲有幫助的動作會獲得比較高的獎勵值。
-
done(boolean)表示游戲是否已經(jīng)完成。如果完成了,就需要重置游戲并開始一個新的Episode。
-
info(dict)是一些比較原始的用于診斷和調(diào)試的信息,或許對訓(xùn)練有幫助。不過,OpenAI團隊在評價你提交的機器人時,是不允許使用這些信息的。
在每個訓(xùn)練中都要使用的返回值有 observation、reward、done。但 observation 的結(jié)構(gòu)會由于游戲的不同而發(fā)生變化。以 CartPole-v0 小游戲為例,我們修改下代碼:
import gym ? env = gym.make('CartPole-v0') ? env.reset() ? for _ in range(1000):env.render() ?action = env.action_space.sample() observation, reward, done, info = env.step(action)print(observation) env.close()輸出:
[ 0.01653398 0.19114579 0.02013859 -0.28050058] [ 0.0203569 -0.00425755 0.01452858 0.01846535] [ 0.02027175 -0.19958481 0.01489789 0.31569658] ......從輸出可以看出這是一個四維的 Observation。在其他游戲中會有維度很多的情況。
env.step()完成了一個完整的 $S \to A \to R \to S'$ 過程。我們只要不斷觀測這樣的過程,并讓機器在其中用相應(yīng)的算法完成訓(xùn)練,就能得到一個高質(zhì)量的強化學(xué)習(xí)模型。
想要查看當前 Gym 庫已經(jīng)注冊了哪些環(huán)境,可以使用以下代碼:
from gym import envs env_specs = envs.registry.all() envs_ids = [env_spec.id for env_spec in env_specs] print(envs_ids)每個環(huán)境都定義了自己的觀測空間和動作空間。環(huán)境 env 的觀測空間用env.observation_space表示,動作空間用 env.action_space表示。觀測空間和動作空間既可以是離散空間(即取值是有限個離散的值),也可以是連續(xù)空間(即取值是連續(xù)的)。在 Gym 庫中,離散空間一般用gym.spaces.Discrete類表示,連續(xù)空間用gym.spaces.Box類表示。
例如,環(huán)境'MountainCar-v0'的觀測空間是Box(2,),表示觀測可以用 2 個 float 值表示;環(huán)境'MountainCar-v0'的動作空間是Dicrete(3),表示動作取值自{0,1,2}。對于離散空間,gym.spaces.Discrete類實例的成員 n 表示有幾個可能的取值;對于連續(xù)空間,Box類實例的成員 low 和 high 表示每個浮點數(shù)的取值范圍。
MountainCar-v0 Example
接下來,我們通過一個例子來學(xué)習(xí)如何與 Gym 庫進行交互。我們選取 小車上山(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))輸出:
觀測空間 = Box(2,) 動作空間 = Discrete(3) 觀測范圍 = [-1.2 -0.07] ~ [0.6 0.07] 動作數(shù) = 3由輸出可知,觀測空間是形狀為 (2,) 的浮點型 np.array,動作空間是取 {0,1,2} 的 int 型數(shù)值。
接下來考慮智能體。智能體往往是我們自己實現(xiàn)的。我們可以實現(xiàn)一個智能體類:BespokeAgent類,代碼如下所示:
class BespokeAgent:def __init__(self, env):passdef decide(self, observation): # 決策position, velocity = observationlb = 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.07if lb < velocity < ub:action = 2else:action = 0return action # 返回動作 ?def learn(self, *args): # 學(xué)習(xí)passagent = BespokeAgent(env)智能體的 decide() 方法實現(xiàn)了決策功能,而 learn() 方法實現(xiàn)了學(xué)習(xí)功能。BespokeAgent類是一個比較簡單的類,它只能根據(jù)給定的數(shù)學(xué)表達式進行決策,并且不能有效學(xué)習(xí)。所以它并不是一個真正意義上的強化學(xué)習(xí)智能體類。但是,用于演示智能體和環(huán)境的交互已經(jīng)足夠了。
接下來我們試圖讓智能體與環(huán)境交互,代碼如下所示:
def play_montecarlo(env, agent, render=False, train=False):episode_reward = 0. # 記錄回合總獎勵,初始化為0observation = env.reset() # 重置游戲環(huán)境,開始新回合while True: # 不斷循環(huán),直到回合結(jié)束if render: # 判斷是否顯示env.render() # 顯示圖形界面,圖形界面可以用 env.close() 語句關(guān)閉action = agent.decide(observation)next_observation, reward, done, _ = env.step(action) # 執(zhí)行動作episode_reward += reward # 收集回合獎勵if train: # 判斷是否訓(xùn)練智能體agent.learn(observation, action, reward, done) # 學(xué)習(xí)if done: # 回合結(jié)束,跳出循環(huán)breakobservation = next_observationreturn episode_reward # 返回回合總獎勵上面代碼中的 play_montecarlo 函數(shù)可以讓智能體和環(huán)境交互一個回合。這個函數(shù)有 4 個參數(shù):
-
env 是環(huán)境類
-
agent 是智能體類
-
render是 bool 類型變量,指示在運行過程中是否要圖形化顯示。如果函數(shù)參數(shù) render為 True,那么在交互過程中會調(diào)用 env.render() 以顯示圖形化界面,而這個界面可以通過調(diào)用 env.close() 關(guān)閉。
-
train是 bool 類型的變量,指示在運行過程中是否訓(xùn)練智能體。在訓(xùn)練過程中應(yīng)當設(shè)置為 True,以調(diào)用 agent.learn() 函數(shù);在測試過程中應(yīng)當設(shè)置為 False,使得智能體不變。
這個函數(shù)有一個返回值 episode_reward,是 float 類型的數(shù)值,表示智能體與環(huán)境交互一個回合的回合總獎勵。
接下來,我們使用下列代碼讓智能體和環(huán)境交互一個回合,并在交互過程中圖形化顯示,可用 env.close() 語句關(guān)閉圖形化界面。
env.seed(0) # 設(shè)置隨機數(shù)種子,只是為了讓結(jié)果可以精確復(fù)現(xiàn),一般情況下可刪去 episode_reward = play_montecarlo(env, agent, render=True) print('回合獎勵 = {}'.format(episode_reward)) env.close() # 此語句可關(guān)閉圖形界面輸出:
回合獎勵 = -105.0為了系統(tǒng)評估智能體的性能,下列代碼求出了連續(xù)交互 100 回合的平均回合獎勵。
episode_rewards = [play_montecarlo(env, agent) for _ in range(100)] print('平均回合獎勵 = {}'.format(np.mean(episode_rewards)))輸出:
平均回合獎勵 = -102.61小車上山環(huán)境有一個參考的回合獎勵值 -110,如果當連續(xù) 100 個回合的平均回合獎勵大于 -110,則認為這個任務(wù)被解決了。BespokeAgent 類對應(yīng)的策略的平均回合獎勵大概就在 -110 左右。
測試 agent 在 Gym 庫中某個任務(wù)的性能時,學(xué)術(shù)界一般最關(guān)心 100 個回合的平均回合獎勵。至于為什么是 100 個回合而不是其他回合數(shù)(比如 128 個回合),完全是習(xí)慣使然,沒有什么特別的原因。對于有些環(huán)境,還會指定一個參考的回合獎勵值,當連續(xù) 100 個回合的獎勵大于指定的值時,就認為這個任務(wù)被解決了。但是,并不是所有的任務(wù)都指定了這樣的值。對于沒有指定值的任務(wù),就無所謂任務(wù)被解決了或者沒有被解決。
總結(jié)一下 Gym 的用法:使用 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)的官方文檔,大家可以閱讀文檔來學(xué)習(xí) Gym。
References
-
百面深度學(xué)習(xí)
-
強化學(xué)習(xí):原理與Python實現(xiàn)
-
白話強化學(xué)習(xí)與PyTorch
-
OpenAI Spinning Up
-
神經(jīng)網(wǎng)絡(luò)與深度學(xué)習(xí)
-
機器學(xué)習(xí)
-
強化學(xué)習(xí)基礎(chǔ) David Silver 筆記
-
David Silver 強化學(xué)習(xí)公開課中文講解及實踐
-
UCL Course on RL(David Silver)
1 Keywords
-
強化學(xué)習(xí)(Reinforcement Learning):Agent可以在與復(fù)雜且不確定的Environment進行交互時,嘗試使所獲得的Reward最大化的計算算法。
-
Action: Environment接收到的Agent當前狀態(tài)的輸出。
-
State:Agent從Environment中獲取到的狀態(tài)。
-
Reward:Agent從Environment中獲取的反饋信號,這個信號指定了Agent在某一步采取了某個策略以后是否得到獎勵。
-
Exploration:在當前的情況下,繼續(xù)嘗試新的Action,其有可能會使你得到更高的這個獎勵,也有可能使你一無所有。
-
Exploitation:在當前的情況下,繼續(xù)嘗試已知的可以獲得最大Reward的過程,即重復(fù)執(zhí)行這個 Action 就可以了。
-
深度強化學(xué)習(xí)(Deep Reinforcement Learning):不需要手工設(shè)計特征,僅需要輸入State讓系統(tǒng)直接輸出Action的一個end-to-end training的強化學(xué)習(xí)方法。通常使用神經(jīng)網(wǎng)絡(luò)來擬合 value function 或者 policy network。
-
Full observability、fully observed和partially observed:當Agent的狀態(tài)跟Environment的狀態(tài)等價的時候,我們就說現(xiàn)在Environment是full observability(全部可觀測),當Agent能夠觀察到Environment的所有狀態(tài)時,我們稱這個環(huán)境是fully observed(完全可觀測)。一般我們的Agent不能觀察到Environment的所有狀態(tài)時,我們稱這個環(huán)境是partially observed(部分可觀測)。
-
POMDP(Partially Observable Markov Decision Processes):部分可觀測馬爾可夫決策過程,即馬爾可夫決策過程的泛化。POMDP 依然具有馬爾可夫性質(zhì),但是假設(shè)智能體無法感知環(huán)境的狀態(tài) $s$,只能知道部分觀測值 $o$。
-
Action space(discrete action spaces and continuous action spaces):在給定的Environment中,有效動作的集合經(jīng)常被稱為動作空間(Action space),Agent的動作數(shù)量是有限的動作空間為離散動作空間(discrete action spaces),反之,稱為連續(xù)動作空間(continuous action spaces)。
-
policy-based(基于策略的):Agent會制定一套動作策略(確定在給定狀態(tài)下需要采取何種動作),并根據(jù)這個策略進行操作。強化學(xué)習(xí)算法直接對策略進行優(yōu)化,使制定的策略能夠獲得最大的獎勵。
-
valued-based(基于價值的):Agent不需要制定顯式的策略,它維護一個價值表格或價值函數(shù),并通過這個價值表格或價值函數(shù)來選取價值最大的動作。
-
model-based(有模型結(jié)構(gòu)):Agent通過學(xué)習(xí)狀態(tài)的轉(zhuǎn)移來采取措施。
-
model-free(無模型結(jié)構(gòu)):Agent沒有去直接估計狀態(tài)的轉(zhuǎn)移,也沒有得到Environment的具體轉(zhuǎn)移變量。它通過學(xué)習(xí) value function 和 policy function 進行決策。
2 Questions
-
強化學(xué)習(xí)的基本結(jié)構(gòu)是什么?
答:本質(zhì)上是Agent和Environment間的交互。具體地,當Agent在Environment中得到當前時刻的State,Agent會基于此狀態(tài)輸出一個Action。然后這個Action會加入到Environment中去并輸出下一個State和當前的這個Action得到的Reward。Agent在Environment里面存在的目的就是為了極大它的期望積累的Reward。
-
強化學(xué)習(xí)相對于監(jiān)督學(xué)習(xí)為什么訓(xùn)練會更加困難?(強化學(xué)習(xí)的特征)
答:
-
強化學(xué)習(xí)處理的多是序列數(shù)據(jù),其很難像監(jiān)督學(xué)習(xí)的樣本一樣滿足IID(獨立同分布)條件。
-
強化學(xué)習(xí)有獎勵的延遲(Delay Reward),即在Agent的action作用在Environment中時,Environment對于Agent的State的獎勵的延遲(Delayed Reward),使得反饋不及時。
-
相比于監(jiān)督學(xué)習(xí)有正確的label,可以通過其修正自己的預(yù)測,強化學(xué)習(xí)相當于一個“試錯”的過程,其完全根據(jù)Environment的“反饋”更新對自己最有利的Action。
-
強化學(xué)習(xí)的基本特征有哪些?
答:
-
有trial-and-error exploration的過程,即需要通過探索Environment來獲取對這個Environment的理解。
-
強化學(xué)習(xí)的Agent會從Environment里面獲得延遲的Reward。
-
強化學(xué)習(xí)的訓(xùn)練過程中時間非常重要,因為數(shù)據(jù)都是有時間關(guān)聯(lián)的,而不是像監(jiān)督學(xué)習(xí)一樣是IID分布的。
-
強化學(xué)習(xí)中Agent的Action會影響它隨后得到的反饋。
-
近幾年強化學(xué)習(xí)發(fā)展迅速的原因?
答:
-
算力(GPU、TPU)的提升,我們可以更快地做更多的 trial-and-error 的嘗試來使得Agent在Environment里面獲得很多信息,取得更大的Reward。
-
我們有了深度強化學(xué)習(xí)這樣一個端到端的訓(xùn)練方法,可以把特征提取和價值估計或者決策一起優(yōu)化,這樣就可以得到一個更強的決策網(wǎng)絡(luò)。
-
狀態(tài)和觀測有什么關(guān)系?
答:狀態(tài)(state)是對世界的完整描述,不會隱藏世界的信息。觀測(observation)是對狀態(tài)的部分描述,可能會遺漏一些信息。在深度強化學(xué)習(xí)中,我們幾乎總是用一個實值向量、矩陣或者更高階的張量來表示狀態(tài)和觀測。
-
對于一個強化學(xué)習(xí) Agent,它由什么組成?
答:
-
策略函數(shù)(policy function),Agent會用這個函數(shù)來選取它下一步的動作,包括隨機性策略(stochastic policy)和確定性策略(deterministic policy)。
-
價值函數(shù)(value function),我們用價值函數(shù)來對當前狀態(tài)進行評估,即進入現(xiàn)在的狀態(tài),到底可以對你后面的收益帶來多大的影響。當這個價值函數(shù)大的時候,說明你進入這個狀態(tài)越有利。
-
模型(model),其表示了 Agent 對這個Environment的狀態(tài)進行的理解,它決定了這個系統(tǒng)是如何進行的。
-
根據(jù)強化學(xué)習(xí) Agent 的不同,我們可以將其分為哪幾類?
答:
-
基于價值函數(shù)的Agent。 顯式學(xué)習(xí)的就是價值函數(shù),隱式的學(xué)習(xí)了它的策略。因為這個策略是從我們學(xué)到的價值函數(shù)里面推算出來的。
-
基于策略的Agent。它直接去學(xué)習(xí) policy,就是說你直接給它一個 state,它就會輸出這個動作的概率。然后在這個 policy-based agent 里面并沒有去學(xué)習(xí)它的價值函數(shù)。
-
然后另外還有一種 Agent 是把這兩者結(jié)合。把 value-based 和 policy-based 結(jié)合起來就有了 Actor-Critic agent。這一類 Agent 就把它的策略函數(shù)和價值函數(shù)都學(xué)習(xí)了,然后通過兩者的交互得到一個更佳的狀態(tài)。
-
基于策略迭代和基于價值迭代的強化學(xué)習(xí)方法有什么區(qū)別?
答:
-
基于策略迭代的強化學(xué)習(xí)方法,agent會制定一套動作策略(確定在給定狀態(tài)下需要采取何種動作),并根據(jù)這個策略進行操作。強化學(xué)習(xí)算法直接對策略進行優(yōu)化,使制定的策略能夠獲得最大的獎勵;基于價值迭代的強化學(xué)習(xí)方法,agent不需要制定顯式的策略,它維護一個價值表格或價值函數(shù),并通過這個價值表格或價值函數(shù)來選取價值最大的動作。
-
基于價值迭代的方法只能應(yīng)用在不連續(xù)的、離散的環(huán)境下(如圍棋或某些游戲領(lǐng)域),對于行為集合規(guī)模龐大、動作連續(xù)的場景(如機器人控制領(lǐng)域),其很難學(xué)習(xí)到較好的結(jié)果(此時基于策略迭代的方法能夠根據(jù)設(shè)定的策略來選擇連續(xù)的動作);
-
基于價值迭代的強化學(xué)習(xí)算法有 Q-learning、 Sarsa 等,而基于策略迭代的強化學(xué)習(xí)算法有策略梯度算法等。
-
此外, Actor-Critic 算法同時使用策略和價值評估來做出決策,其中,智能體會根據(jù)策略做出動作,而價值函數(shù)會對做出的動作給出價值,這樣可以在原有的策略梯度算法的基礎(chǔ)上加速學(xué)習(xí)過程,取得更好的效果。
-
有模型(model-based)學(xué)習(xí)和免模型(model-free)學(xué)習(xí)有什么區(qū)別?
答:針對是否需要對真實環(huán)境建模,強化學(xué)習(xí)可以分為有模型學(xué)習(xí)和免模型學(xué)習(xí)。 有模型學(xué)習(xí)是指根據(jù)環(huán)境中的經(jīng)驗,構(gòu)建一個虛擬世界,同時在真實環(huán)境和虛擬世界中學(xué)習(xí);免模型學(xué)習(xí)是指不對環(huán)境進行建模,直接與真實環(huán)境進行交互來學(xué)習(xí)到最優(yōu)策略。總的來說,有模型學(xué)習(xí)相比于免模型學(xué)習(xí)僅僅多出一個步驟,即對真實環(huán)境進行建模。免模型學(xué)習(xí)通常屬于數(shù)據(jù)驅(qū)動型方法,需要大量的采樣來估計狀態(tài)、動作及獎勵函數(shù),從而優(yōu)化動作策略。免模型學(xué)習(xí)的泛化性要優(yōu)于有模型學(xué)習(xí),原因是有模型學(xué)習(xí)算需要對真實環(huán)境進行建模,并且虛擬世界與真實環(huán)境之間可能還有差異,這限制了有模型學(xué)習(xí)算法的泛化性。
-
強化學(xué)習(xí)的通俗理解
答:environment 跟 reward function 不是我們可以控制的,environment 跟 reward function 是在開始學(xué)習(xí)之前,就已經(jīng)事先給定的。我們唯一能做的事情是調(diào)整 actor 里面的 policy,使得 actor 可以得到最大的 reward。Actor 里面會有一個 policy, 這個 policy 決定了actor 的行為。Policy 就是給一個外界的輸入,然后它會輸出 actor 現(xiàn)在應(yīng)該要執(zhí)行的行為。
總結(jié)
以上是生活随笔為你收集整理的第一章 强化学习介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DeepFM在贝壳房源详情页推荐场景的实
- 下一篇: VS code配置Ninja使用MSVC