本文介紹增強學習和自適應控制。
在監督學習中,算法是要輸出盡量模仿訓練集中的標簽 y,標簽給每個輸入 x 一個清楚的正確答案。與此不同,對於許多序列決策和控制問題,就很難對算法給出這種明確的監督。例如,如果要造一個四足機器人,並編程讓它行走,起初我們並不知道讓它行走的正確行動,所以也不知道怎么模仿學習算法給出明確的監督。
在增強學習框架中,我給算法一個回報函數,告訴學習代理執行得好壞。在四足行走的機器人例子中,當機器人往前走時,回報函數就給予正反饋,退后或者摔倒就給予負反饋。學習算法的工作就是弄清楚怎么隨着時間選擇動作,以使總回報最大。
增強學習的應用非常廣泛,如無人機、運動機器人、蜂窩電話網絡路由、市場策略選擇、工業控制和高效的頁面排序。我們對增強學習的研究將從 MDP 馬爾科夫決策過程開始,形式化增強學習遇到的問題。
1、馬爾可夫決策過程
一個馬爾可夫決策過程是元組 (S,A,{Psa},γ,R),其中:
- S 是狀態集合。(例如,在無人機飛行中,S 可以是直升機所有可能的位置和方向)
- A 是動作集合。(例如,直升機操縱桿能夠轉動的所有方向)
- Psa 是狀態轉換概率。對每一個狀態 s∈S 和動作 a∈A,Psa 是在狀態空間上的分布。簡單地說,Psa 給定的是,當在狀態 s 采取行動 a,我們會變成哪種狀態的分布概率。
- γ 是折扣因子。
- R:S×A—>R 是回報函數。(回報有時寫成只有狀態 S 的函數,R:S—>R)
MDP 執行的動態過程如下:從狀態 s0 開始,在 MDP 中選擇一些動作 a0∈A 來執行,作為選擇的結果,根據 s1~Ps0a0, MDP 的狀態隨機切換到后繼狀態 s1,然后再選擇另外一個動作 a1,作為動作的結果,根據 s2~Ps1a1,狀態再次切換,然后選擇 a2,等等。周期性的,這個過程可表示如下:

訪問狀態序列 s0,s1,...,並執行動作 a0,a1,...,總回報為:

或者,如果回報僅僅是狀態的函數,那么總回報可寫作:

對大部分應用來說,我們會使用更簡單的狀態回報 R(s),雖然狀態動作回報 R(s,a) 的泛化也沒有特別的困難。
增強學習的目標是隨着時間選擇動作以最大化總回報的期望值:
時間點 t 的回報通過乘以因子 γt 打了折扣,所以為使期望最大,我們希望正回報來得越早越好,負回報盡量往后面去。在經濟應用中,R(·) 是掙錢的總金額,γ 自然可以解釋為利率(今天的一英鎊比明天的一英鎊值錢)。
一個策略是一些從狀態到動作的映射函數 π:S—>A。無論何時,我們在狀態 s 執行了動作 a=π(s),就說在執行策略 π。定義 π 的值函數為:

V(s) 是從狀態 s 開始,根據策略 π 采取行動,最終的折扣回報期望和。
給定固定策略 π,它的值函數 Vπ 滿足 Bellman 方程:

也就是說,從 s 開始的折扣回報 Vπ(s) 的期望和由兩部分組成:第一,從狀態 s 開始的立即回報 R(s),第二,未來折扣回報的期望和。仔細檢查第二項,和式可寫為:

這是從狀態 s' 開始的折扣回報的期望和,s' 符合分布 Psπ(s),也就是從狀態 s 執行第一個動作 π(s) 后的狀態分布,所以,第二項給的是在 MDP 中第一步后的折扣回報的期望和。
Bellman 方程能用於高效解出 Vπ,特別是在一個有限狀態 MDP(|S|<∞),可以為每個狀態寫下這個方程 Vπ(s),這給定了一個有 |S| 個變量(每個狀態都有個未知的 Vπ(S))的 |S| 個線性方程的集合,可以有效解出 Vπ(s)。
定義最優值函數:
也就是能使用策略得到的最好的折扣回報期望和。還有另一個版本的 Bellman 方程。

第一項跟之前一樣是立即回報,第二項是執行動作 a 后的折扣回報未來期望和的最大值。要特別注意,這里的 max 是要從所有動作中選擇回報最大的動作,而 max 后面的 γ 乘以求和項就是執行某動作后的回報期望。要確保你理解了上式的含義。
定義策略 π*:S—>A 如下:

π*(s) 給出了能使總回報最大的行動 a。
事實上,對每一個狀態和每一個策略有:

第一個等式是說 Vπ*,π* 的值函數,等於對每個狀態 s 來說的最優值函數 V*。第二個不等式是說,π* 的值至少跟其它策略一樣大。換句話說,π* 就是最優策略。
注意到 π* 有一個有趣的屬性,對所有的狀態它都是個最優策略。特別的,並不是說,如果從 s 開始就有針對那個狀態的最優策略,如果從其它的 s' 開始就有針對 s' 的其它最優策略。特別的,同樣的策略 π* 對所有的狀態都能獲得最大值,這意味着我們可以使用同樣的策略 π*,而不管 MDP 的初始狀態是什么。
2、值迭代和策略迭代
現在介紹兩種解決有限狀態 MDP 的高效算法,這里只考慮有限狀態和動作空間的 MDP。
第一個算法,值迭代,如下:

這個算法可以看作是使用 Bellman 方程重復更新估計值函數。這里 R(s) 是回報函數,V(s) 是值函數,注意這兩者的區別,有助於理解該算法。
有兩種方法執行算法內環的更新,第一種是,先對每一個狀態 s 計算新值 V(s),並覆蓋舊值,這被稱為同步更新;另一種是異步更新,以一定順序循環遍歷狀態,一次更新一個值。
不管是同步更新還是異步更新,值函數 V 都會收斂到 V*,找到 V* 后,就能夠使用上面介紹過的如下方程找到最優策略。

除了值迭代,還有一種尋找最優策略的算法,策略迭代:

所以,內循環重復地為當前策略計算值函數,然后使用當前值函數更新策略。注意到步驟 (a) 可以通過解之前描述的 Bellman 方程來完成,在策略固定的情況下,它是一個有 |S| 個變量的 |S| 個線性方程的集合。

在算法的有限次迭代后,V 將收斂到 V*,π 將收斂到 π*。
值迭代和策略迭代都是解 MDP 的標准算法,關於哪個算法更好沒有一致的看法。對於小的 MDPs,策略迭代經常很快,很少迭代就能收斂;但對於有大量狀態空間的 MDPs 來說,解 MDPs 會涉及大量線性方程,就比較困難,這種情況使用值迭代更好,由於這個原因,實際中值迭代會比策略迭代用得多。
3、為 MDP 學習一個模型
目前為止,我們討論了 MDPs 和它的算法,假定狀態轉換矩陣和回報是已知的,在許多現實問題中,並不知道狀態轉換矩陣和清晰的回報,但可以從數據中估計出來。(通常 S,A 和 γ 是知道的)
例如,在倒立擺問題中,在 MDP 中有一些嘗試:

這里 si(j) 表示我們在時間點 i 嘗試 j 時所處的狀態, ai(j) 是在那個狀態采取的相應動作。實際上,上面的每一次嘗試都可以一直運行直到 MDP 終止,或者運行一個很大但是有限的時間步。
有了這些在 MDP 中嘗試的經驗,我們就很容易推導出狀態轉換矩陣的最大似然估計。

如果上面的比率是 0/0,也就是說從沒在狀態 s 采取動作 a,那就簡單估計 Psa(s') 為 1/|S|,也就是估計 Psa 在所有狀態上均勻分布。
使用類似的過程,如果 R 是未知的,我們也可以估計狀態 s 的期望立即回報 R(s) 為在狀態 s 觀察到的平均回報。
從 MDP 中學習到一個模型后,就可以使用值迭代或者策略迭代來解 MDP,該 MDP 使用的是估計轉換概率和回報。例如,結合模型學習和值迭代,這是一個可能的算法,在狀態轉換矩陣未知的 MDP 中學習。

注意到針對這個算法,有一個簡單的優化能使它運行得更快。在使用值迭代的內循環中,如果不初始化 V=0,而是用算法上一輪迭代使用的結果,就會為值迭代提供一個更好的起始點,使它更快收斂。
4、連續狀態 MDPs
目前為止,我們討論的都是有限狀態的 MDPs。現在討論無限狀態的 MDPs 算法,例如,一輛汽車的狀態可以表示為 (x,y,θ,x.,y.,θ.),(x,y) 是位置,方向 θ,x 和 y 方向的速度 x. 和 y.,θ 的角速度為 θ.。所以,S=R6 是一個無限狀態的集合,因為對於一輛車有無限個位置和方向。類似的,PS4 中的倒立擺的狀態為 (x,θ,x',θ'),θ 是桿的角度。直升機在 3D 空間中的狀態為 (x,y,z,Φ,θ,Ψ,x',y',z',Φ',θ',Ψ'),其中翻滾角 Φ,俯仰角 θ 和偏航角 Ψ 指定了飛機的 3D 方向。
下面我們討論狀態空間 S=Rn 的情況,並描述解 MDPs 的方法。
4.1 離散化
或許解連續狀態 MDP 最簡單的方法就是離散化狀態空間,然后使用之前介紹的值迭代或策略迭代算法。
例如,如果是 2d 的狀態,那么就可以用表格來離散化狀態空間:

這里每一個表格單元代表一個分離的離散狀態 \(\overline{s}\) ,我們可以通過離散狀態 \((\overline{S},A,\{P_{\overline{s}a}\},γ,R)\) 來近似連續狀態的 MDP,其中 \( \overline{S}\) 是離散狀態的集合,\( P_{\overline{s}a}\) 是離散狀態的狀態轉換矩陣。我們可以使用值迭代或策略迭代來解出離散狀態 MDP \((\overline{S},A,\{P_{\overline{s}a}\},γ,R)\) 的 \( V^{*}(\overline{s})\) 和 \( \pi ^{*}( \overline{s}) \),當我們實際的系統在連續值狀態 s∈S,需要選擇一個動作來執行,我們就計算相應的離散狀態 \( \overline{x}\),然后執行動作 \( \pi ^{*}( \overline{s}) \)。
這種離散化可以解決很多問題,但是有兩個弊端。
首先,它用的是一種比較簡單的方法來表示 V* 和 π*,特別是,它假定值函數在離散區間取的是常量(值函數在每個表格中是分段常量)。
為了更好地理解這種表示的限制,看一個監督學習問題,用一個函數來擬合這些數據:

很清楚,線性回歸在這個問題上會做得很好,但如果在 x 軸上離散化,然后使用分段函數來對應每一個區間,擬合的數據會像這樣。

這種分段常量表示對很多平滑函數都不是一個好的選擇,它會導致輸入不再平滑,在不同的表格中沒有泛化能力,使用這種表示,我們也需要一種好的離散化(非常小的表格單元)來得到一種好的近似。
這種表示的第二個弊端被稱為維度詛咒。假設 S=Rn,我們要把 n 個狀態的維度都離散化為 k 個值,那么離散狀態的總數目為 kn。這種狀態維度的指數增長非常快,不適用於大型問題。例如有 10d 個狀態,每個狀態變量離散化為 100 個值,就有 10010=1020 個離散狀態,這對於當代的桌面電腦來說還是太龐大了。
一般來說,離散化對於 1d 和 2d 問題工作得很好(有簡單和快速執行的好處)。或許聰明加上小心選擇離散化方法,在頂多 4d 問題上都能工作很好。如果你極其聰明,加一點運氣,你可以用到 6d 問題上。但是,它很少能運行在比那更高維問題上。
4.2 值函數近似
這里介紹一種在連續狀態 MDPs 尋找策略的可選方法,直接近似於 V*,而不是用離散化。這種方法被稱為值函數近似,已經被成功用到很多增強學習問題中。
4.2.1 使用模型或模擬器
為實現值函數近似算法,我們假定對於 MDP 有一個模型,或者模擬器。非正式地解釋,模擬器是個黑盒子,把連續值狀態 st 和動作 at 作為輸入,輸出下一個狀態 st+1,根據的是狀態轉換概率 \( P_{s_{t}a_{t}}\):

有許多方法得到這樣的模型,一種是使用物理模擬,例如,PS4 中的倒立擺的模擬器就是使用物理法則來計算桿在時間點 t+1 的位置和方向,給定了當前時間點 t 的狀態和要采取的動作 a,假定知道系統的所有參數,如桿的長度、質量等等;也可使用現成的模擬軟件包,把輸入當作一個數學系統的完整物理描述,當前狀態 st 和動作 at,計算下一個狀態 st+1。
還有一個可選的方法是從 MDP 收集的數據中學習模型。例如,假設我們在 MDP 中重復執行動作執行了 m 次嘗試(trial),每次嘗試 T 個時間步。做這些嘗試可以隨機選擇動作,執行一些特定的策略,或通過其它方法來選擇動作。然后就可以觀察到如下 m 個狀態序列。

現在用學習算法來預測 st+1,把它作為 st 和 at 的函數。
例如,可以選擇線性模型的形式:
$$s_{t+1}=As_{t}+Ba_{t}$$
使用類似於線性回歸的算法。這里模型的參數是矩陣 A 和 B,使用 m 次嘗試的數據來估計它們:
這跟參數的極大似然估計有關。
學習到 A 和 B 之后,一個選擇是建立確定性的模型,給定輸入 st 和 at,就確定了 st+1。另一個選擇是建立隨機性的模型,st+1 是輸入的隨機函數。

這里 εt 是一個噪聲項,通常建模為 εt~N(0,Σ),協方差矩陣 Σ 也可以直接從數據中估計。
這里我們把下一個狀態 st+1 作為當前狀態和動作的線性函數,當然,非線性函數也是可能的,比如可以學到模型 st+1=AΦs(st)+BΦa(at),Φs 和 Φa 是狀態和動作的非特性映射,可以使用非線性學習算法,如局部權重線性回歸,把 st+1 作為 st 和 at 的函數來估計。這些方法也可以用來建立 MDP 的確定性或隨機性模擬器。
4.2.2 擬合值函數
這里介紹一種趨近連續狀態 MDP 的值函數的擬合值迭代算法。假定問題有連續狀態空間 S=Rn,但動作空間 A 是很小和離散的。
同之前介紹的離散狀態的值迭代類似,我們執行如下更新:

這里把和換成了積分,表示這是在連續狀態空間下。
擬合值迭代的主要思想是,在有限的狀態采樣中 s(1),...,s(m),趨近執行這一步。 特別的,我們使用監督學習算法——線性回歸來近似值函數,作為狀態的線性或非線性函數:
$$V(s)=\theta ^{T}\phi (s)$$
這里,Φ 是一些狀態的近似特征映射。
對於 m 個狀態的有限采樣的每一個狀態,擬合值迭代將首先計算量值 y(i),將是 \( R(s)+\gamma max_{a}E_{s^{'}~P_{sa}}[V(s^{'})]\) 的近似,也就是上面方程的右邊部分,然后我們將使用學習算法來得到接近 \( R(s)+\gamma max_{a}E_{s^{'}~P_{sa}}[V(s^{'})]\) 的 V(s)(或者換句話說,獲得 V(s) 以接近 y(i))。
詳細算法如下:

上面所寫的擬合值函數使用線性回歸算法以使 V(s(i)) 趨近 y(i)。算法的那一步完全可以類比標准的監督學習問題,有一個訓練集 (x(1),y(1)),(x(2),y(2)),...,(x(m),y(m)),要學習一個函數從 x 映射到 y,唯一的不同是這里的 s 扮演着 x 的角色,雖然上面的描述使用了線性回歸,但明顯其它的回歸算法(如局部權重線性回歸)也可以使用。
不像離散狀態的值迭代,擬合值迭代不能證明會一直收斂,不過實際中經常是收斂的,或近似收斂。同時也注意到,如果我們使用 MDP 的確定性模擬器,那么擬合值迭代就能通過在算法中設置 k=1 來簡化,這是因為方程 \( R(s)+\gamma \mathop{max}\limits_{a}E_{s^{'}~P_{sa}}[V(s^{'})]\) 變成了一個確定性分布的期望。否則,在上面的算法中,我不得不作 k 次采樣並平均,以近似期望(見上面偽代碼中 q(a) 的定義)。
最后,擬合值迭代算法輸出了 V,它是對 V* 的近似。這隱含定義了我們的策略。特別的,當系統在狀態 s,需要選擇一個動作,我們會這樣選擇:
$$arg \mathop{max}\limits_{a}E_{s^{'}~P_{sa}}[V(s^{'})]$$
這個計算近似過程類似於擬合值迭代的內循環,對每一個動作,都取 \( s_{1}^{'}\) ,...,\( s_{k}^{'}\) ~\( P_{sa}\) 以近似期望(如果模擬器是確定性的,可以設 k=1)。
在實際中,經常有其它的方法來近似這一步,例如,一個通用的例子是,如果模擬器的形式為 st+1=f(st,at)+ε,其中 f 是狀態的確定性函數(比如 f(st,at)=Ast+Bat),ε 是零均值高斯噪聲。在這種情況下,可以選擇動作:
$$arg \mathop{max}\limits_{a}V(f(s,a))$$
換句話說,這里設置 εt=0(例如,忽略模擬器的噪聲),設置 k=1。等同的,這能夠使用如下近似從方程 \(arg \mathop{max}\limits_{a}E_{s^{'}~P_{sa}}[V(s^{'})]\) 推導。

這里期望是指 s'~Psa,噪聲項 εt 很小,這通常是一個合理的近似。
盡管如此,對於不使用這些近似的問題,不得不使用模型采樣 k|A| 個狀態,以近似上面的期望,這會是很高的計算復雜度。
參考資料:
[1] http://cs229.stanford.edu/notes/cs229-notes12.pdf
