動態規划是強化學習里面最基礎的部分,其核心思想----通用策略迭代(Generalized Policy Iteration,GPI)。
首先強調一點,動態規划(Dynamic Programming)要求一個完全已知的環境模型,所謂完全已知,就是MDP的五元組全部已知,當然了,主要還是指狀態轉移概率已知。這種學習方式就是有模型學習(Model-based learning)。
這里我的疑問還是兩個。
1.動態規划和前面的有什么聯系?
答:強化學習前面已經說過,是一種序列決策問題,一開始不清楚環境的工作方式,不知道執行什么動作是對的,什么是錯的,然后就只好不斷的在環境試錯,進而發現一個好的策略。同樣,規划(planning)也屬於序列決策問題,不同的是規划的環境是已知的,比如游戲的規則已知等,那么agent就不需要靠與環境的交互來獲取下一個狀態了,而是知道自己執行某個動作后的狀態是什么,然后再優化自己的策略。這兩者是不一樣的。
動態規划可以將一個復雜問題分為一系列簡單的子問題,一旦解決了這些簡單的子問題,再將這些子問題的解結合起來就變成復雜問題的解了,並且同時將它們的解保存起來,如果下次遇到相同的子問題,就不用重新計算了。動態規划本質上就是一種環境模型已知的規划方法(planning)。
2.動態規划到底是干什么的?
動態規划的“動態”,指的是某個問題由序列化狀態組成,狀態的轉換是step-by-step進行的。因此,可以step-by-step解決問題。“規划”就是優化子問題。上一節我們提到,通過Bellman方程MDP被遞歸的切分成子問題,同時它有值函數,保存了每一個子問題的解,因此它能通過動態規划來求解。針對MDP,切分成的子問題就是在每個狀態下應該選擇的action是什么,MDP的子問題是以一種遞歸的方式存在,這一時刻的子問題取決於上一時刻的子問題選擇了哪個action。
動態規划簡單說可以分為兩部分,一是預測(prediction),也就是已知MDP的狀態、動作、獎勵、轉移概率、折扣因子和策略,求出每一個狀態下的值函數,也就是每個狀態下能獲得的reward是多少。第二就是控制,什么意思呢,就是在前面的狀態、動作等等都已知,但策略未知的情況下,計算出最優的值函數,並且借此計算出最優的策略。動態規划的目的就是完成上面的兩件事。適用於動態規划的問題,一般狀態轉移矩陣都是已知的,簡單說就是環境模型已知了,這個時候就可以看做planning問題了。
那么,動態規划解決問題的方法呢,就是GPI,也就是策略迭代、策略評估、策略迭代、策略評估.....知道策略收斂至最優。
1.策略迭代Policy Iteration
怎么迭代呢?先有值,然后改進,再估計值,再改進.....這就是迭代。具體說就是:
策略評估policy evaluation:基於當前的policy計算出每個狀態的值函數。
策略改進policy improvement:基於當前的值函數,利用貪心算法找到當前最優的policy。
迭代公式為:\[{v_{k + 1}}(s) = \sum\limits_{a \in A} {{\rm{\pi }}(a|s)(R_s^a + \gamma \sum\limits_{s' \in S} {P_{ss'}^a{v_k}(s')} )} \]
用語言描述上式就是:對於一次迭代,狀態s的價值等於前一次迭代該狀態的即時獎勵與所有s的下一個可能狀態s’的價值與其概率成績的和。
矩陣形式表示就是:\[{{\bf{v}}^{k + 1}} = {{\bf{R}}^{\rm{\pi }}} + \gamma {{\bf{P}}^{\rm{\pi }}}{{\bf{v}}^k}\]
下面以grid world為例來說明上面式子是如何運用的:
已知條件:
狀態空間S:如圖所示,S1-S14均為非終止狀態,ST為終止狀態,就是灰色方格所示兩個位置。
動作空間A:{上,下,左,右}對於任何非終止狀態可以進行四個方向的動作。
轉移概率P:任何試圖離開方格世界的動作,其位置將不會發生變化,也就是所謂的在邊界執行向外的動作時,位置不變,其余條件下將以1的概率轉移到動作指定的狀態。(這里肯定是概率為1了,因為規則指制定的很明確,動作會直接跳轉下一個位置。但其他MDP問題則不一定啊,比如執行一個動作后,可能會面臨多個狀態,這時候對於執行完動作后下一個可能的狀態就會有一個概率)。
即時獎勵R:任何在非終止狀態間的轉移得到的即時獎勵均為-1,進入終止狀態的即時獎勵為0.
衰減系數γ:1.
當前策略π:Agent初始采取隨機行動策略,在任何一個非終止狀態下有均等的幾率采取任一方向的移動動作。
問題:評估在這個方格世界里給定的策略。
這個問題就等同於:求解該方格世界在給定策略下的狀態價值問題,也就是求解在給定策略下該方格世界里每一個狀態的價值。


上面介紹的就是值迭代的全部過程,通過已知的模型,對全局狀態對應的值函數進行迭代更新,在不需要實際一次一次嘗試的情況下,只根據模擬運算迭代,就可以借助值函數評估,利用貪婪策略獲得執行動作的最優策略,如果迭代次數足夠多的情況下,可以得到一個近似收斂的全部狀態的值函數表,就像上圖最后一個所示。
上面是一個基本的策略評估過程,沒有進行策略改進,主要是因為這個問題太簡單了,策略在第3次迭代就已經收斂到最優狀態了,沒有必要進行策略改進了。
但實際上,更多的問題在長時間的值迭代后,策略收斂並不明顯,這個時候,我們該怎么做呢?先狀態值函數估計一段時間,然后看看策略怎么樣,根據各個狀態的值函數,給出一個相對比初始隨機要好一點的策略,然后根據這個策略再次進行值函數評估,經過一段時間迭代后,繼續調整策略,如此反復,直至最終策略收斂。這就是策略迭代的思想。
根據上面的內容,總結一下,什么是策略迭代呢?策略迭代就是在當前策略上迭代計算v值,再根據v值貪婪地更新策略,如此反復多次,最終得到最優策略π*和最優狀態價值函數V*。這里需要說明一下,貪婪的意思就是指僅采用某個動作,這個動作使得狀態價值得到最大的行為。下面放上那兩個經典的示意圖。

上圖已經清晰地說明了策略迭代的含義,那么,問題來了,很多時候,策略的更新收斂速度會比狀態價值函數值的收斂速度快很多,那么這個時候,還有必要一定要迭代計算直到狀態價值得到收斂嗎?因為這個時候策略早已經收斂了啊,繼續迭代值函數是不是一種資源浪費呢?
答:當然沒有必要繼續迭代了,我們需要的就是最優策略,至於狀態的最優值函數,則根據需求確定是否繼續迭代,以及迭代到什么程度。當不需要持續迭代至最優價值函數時,我們可以設置一些條件提前終止迭代,比如設定一個e,比較兩次迭代的價值函數平方差,小於e即可;此外,還可以直接設置迭代次數;或者說每迭代一次就更新一次策略。這就是修飾過的策略迭代,英文是Modified Policy Iteration.
2.價值迭代Value Iteration
有了策略迭代,就肯定有價值迭代了。先介紹一下基本定理。
優化原則:一個最優策略可以被分解為兩部分,一部分從狀態s到下一個s’采取了最優行為A*,另一部分就是在狀態s’時遵循一個最優策略。
定理:一個策略能夠使得狀態s獲得最優價值,當且僅當:對於從狀態s可以到達的任何狀態s’,該策略能夠使得狀態s’的價值是最優價值:\[{v_*}(s) \leftarrow \mathop {\max }\limits_{a \in A} R_s^a + \gamma \sum\limits_{s'} {P_{ss'}^a{v_*}(s')} \]
確定性價值迭代
在前一個定理的基礎上,如果我們清楚地知道我們期望的最終(goal)狀態的位置以及反推需要明確的狀態間關系,那么可以認為是一個確定性的價值迭代。此時,我們可以把問題分解成一些列的子問題,從最終目標狀態開始分析,逐漸往回推,直至推至所有狀態。
價值迭代,從初始狀態價值開始同步迭代計算,最終收斂,整個過程中沒有遵循任何策略。與策略迭代不同,在值迭代過程中,算法不會給出明確的策略,迭代過程其間得到的價值函數,不對應任何策略。價值迭代雖然不需要策略參與,但仍然需要知道狀態之間的轉移概率,也就是需要知道模型。
最后,再說回來,動態規划的兩個問題:預測和控制。預測問題就是在給定策略下迭代計算各個狀態的價值函數,控制問題就是通過策略迭代,先給定或隨機策略下計算狀態價值函數,根據狀態函數貪婪更新策略,多次反復找到最優策略。此外,單純的價值迭代,全程沒有策略參與也能獲得最優策略,但需要知道狀態轉移矩陣,即狀態s在行為a后到達的所有后續狀態及概率。
接下來,說一下復雜度問題,使用狀態價值函數或者行為價值函數兩種價值迭代的算法時間復雜度都較大,為O(mn2)或者O(m2n2).一種改進方案是使用異步動態規划,其他方法即放棄使用動態規划。
3.動態規划的一些擴展
異步動態規划
a.原位動態規划(In-place dynamic programming):直接原地更新下一個狀態的v值,而不像同步迭代那樣需要額外存儲新的v值。在這種情況下,按何種次序更新狀態價值有時候會比較有意義。
![]()
b.重要狀態有先更新(Priortised Sweeping):對那些重要的狀態有先更新。這個時候可以使用Bellman error來確定哪些狀態是比較重要的。Bellman error反映的是當前狀態價值與更新后的狀態價值差的絕對值。Bellman error越大,越有必要優先更新。對那些Bellman error較大的狀態進行備份,這種算法使用優先級隊列能夠較得到有效的實現。

c.real-time programming:更新那些僅與個體關系密切的狀態,同時使用個體的經驗來知道更新狀態的選擇。有些狀態雖然理論上存在,但在現實中幾乎不會出現,利用已有現實經驗。

采樣更新Sample Backups
動態規划使用full-width backups。意味着使用DP算法,對於每一次狀態更新,都要考慮到其所有后繼狀態及所有可能的行為,同時還要使用MDP中的狀態轉移矩陣、獎勵函數(信息)。DP解決MDP問題的這一特點決定了其對中等規模(百萬級別的狀態數)的問題較為有效,對於更大規模的問題,會帶來Bellman維度災難。因此在面對大規模MDP問題是,需要尋找更加實際可操作的算法,主要的思想是Sample Backups,后續會詳細介紹。這類算法的優點是不需要完整掌握MDP的條件(例如獎勵機制、狀態轉移矩陣等),通過Sampling(舉樣)可以打破維度災難,反向更新狀態函數的開銷是常數級別的,與狀態數無關。
近似動態規划(Approximate Dynamic Programming)
使用其他技術手段(例如神經網絡)建立一個參數較少、消耗計算資源較少、同時雖然不完全精確但卻能夠用的近似價值函數。

本節內容主要還是以理解基本概念為主,在實際中很少用動態規划來解決大規模強化學習問題。但ADP用來發文章,尤其是控制領域,近幾年來還是非常好的。
參考文獻
[1]. Reinforcement learning: an introduction.2017 Draft.
[2].http://www.cnblogs.com/steven-yang/p/6493328.html
[3].http://blog.csdn.net/zz_1215/article/details/44138843
[4].http://chenrudan.github.io/blog/2016/06/17/reinforcementlearninglesssion3.html
