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