在強化學習(二)馬爾科夫決策過程(MDP)中,我們討論了用馬爾科夫假設來簡化強化學習模型的複雜度,這一篇我們在馬爾科夫假設和貝爾曼方程的基礎上討論使用動態規劃(Dynamic Programming, DP)來求解強化學習的問題。
動態規劃這一篇對應Sutton書的第四章和UCL強化學習課程的第三講。
1. 動態規劃和強化學習問題的聯絡
對於動態規劃,相信大家都很熟悉,很多使用演算法的地方都會用到。就算是機器學習相關的演算法,使用動態規劃的也很多,比如之前講到的隱馬爾科夫模型HMM(二)前向後向演算法評估觀察序列概率,隱馬爾科夫模型HMM(四)維特比演算法解碼隱藏狀態序列, 都是動態規劃的典型例子。
動態規劃的關鍵點有兩個:一是問題的最優解可以由若干小問題的最優解構成,即通過尋找子問題的最優解來得到問題的最優解。第二是可以找到子問題狀態之間的遞推關係,通過較小的子問題狀態遞推出較大的子問題的狀態。而強化學習的問題恰好是滿足這兩個條件的。
我們先看看強化學習的兩個基本問題。
第一個問題是預測,即給定強化學習的6個要素:狀態集$S$, 動作集$A$, 模型狀態轉化概率矩陣$P$, 即時獎勵$R$,衰減因子$\gamma$, 給定策略$\pi$, 求解該策略的狀態價值函式$v(\pi)$
第二個問題是控制,也就是求解最優的價值函式和策略。給定強化學習的5個要素:狀態集$S$, 動作集$A$, 模型狀態轉化概率矩陣$P$, 即時獎勵$R$,衰減因子$\gamma$, 求解最優的狀態價值函式$v_{*}$和最優策略$\pi_{*}$
那麼如何找到動態規劃和強化學習這兩個問題的關係呢?
回憶一下上一篇強化學習(二)馬爾科夫決策過程(MDP)中狀態價值函式的貝爾曼方程:$$v_{\pi}(s) = \sum\limits_{a \in A} \pi(a|s)(R_s^a + \gamma \sum\limits_{s' \in S}P_{ss'}^av_{\pi}(s'))$$
從這個式子我們可以看出,我們可以定義出子問題求解每個狀態的狀態價值函式,同時這個式子又是一個遞推的式子, 意味著利用它,我們可以使用上一個迭代週期內的狀態價值來計算更新當前迭代週期某狀態$s$的狀態價值。可見,使用動態規劃來求解強化學習問題是比較自然的。
2. 策略評估求解預測問題
首先,我們來看如何使用動態規劃來求解強化學習的預測問題,即求解給定策略的狀態價值函式的問題。這個問題的求解過程我們通常叫做策略評估(Policy Evaluation)。
策略評估的基本思路是從任意一個狀態價值函式開始,依據給定的策略,結合貝爾曼期望方程、狀態轉移概率和獎勵同步迭代更新狀態價值函式,直至其收斂,得到該策略下最終的狀態價值函式。
假設我們在第$k$輪迭代已經計算出了所有的狀態的狀態價值,那麼在第$k+1$輪我們可以利用第$k$輪計算出的狀態價值計算出第$k+1$輪的狀態價值。這是通過貝爾曼方程來完成的,即:$$v_{k+1}(s) = \sum\limits_{a \in A} \pi(a|s)(R_s^a + \gamma \sum\limits_{s' \in S}P_{ss'}^av_{k}(s'))$$
和上一節的式子唯一的區別是由於我們的策略$\pi$已經給定,我們不再寫出,對應加上了迭代輪數的下標。我們每一輪可以對計算得到的新的狀態價值函式再次進行迭代,直至狀態價值的值改變很小(收斂),那麼我們就得出了預測問題的解,即給定策略的狀態價值函式$v(\pi)$。
下面我們用一個具體的例子來說明策略評估的過程。
3. 策略評估求解例項
這是一個經典的Grid World的例子。我們有一個4x4的16宮格。只有左上和右下的格子是終止格子。該位置的價值固定為0,個體如果到達了該2個格子,則停止移動,此後每輪獎勵都是0。個體在16宮格其他格的每次移動,得到的即時獎勵$R$都是-1。注意個體每次只能移動一個格子,且只能上下左右4種移動選擇,不能斜著走, 如果在邊界格往外走,則會直接移動回到之前的邊界格。衰減因子我們定義為$\gamma=1$。由於這裡每次移動,下一格都是固定的,因此所有可行的的狀態轉化概率$P=1$。這裡給定的策略是隨機策略,即每個格子裡有25%的概率向周圍的4個格子移動。
首先我們初始化所有格子的狀態價值為0,如上圖$k=0$的時候。現在我們開始策略迭代了。由於終止格子的價值固定為0,我們可以不將其加入迭代過程。在$k=1$的時候,我們利用上面的貝爾曼方程先計算第二行第一個格子的價值:$$v_1^{(21)} = \frac{1}{4}[(-1+0) +(-1+0)+(-1+0)+(-1+0)] = -1$$
第二行第二個格子的價值是:$$v_1^{(22)} = \frac{1}{4}[(-1+0) +(-1+0)+(-1+0)+(-1+0)] = -1$$
其他的格子都是類似的,第一輪的狀態價值迭代的結果如上圖$k=1$的時候。現在我們第一輪迭代完了。開始動態規劃迭代第二輪了。還是看第二行第一個格子的價值:$$v_2^{(21)} = \frac{1}{4}[(-1+0) +(-1-1)+(-1-1)+(-1-1)] = -1.75$$
第二行第二個格子的價值是:$$v_2^{(22)} = \frac{1}{4}[(-1-1) +(-1-1)+(-1-1)+(-1-1)] = -2$$
最終得到的結果是上圖$k=2$的時候。第三輪的迭代如下:
$$v_3^{(21)} = \frac{1}{4}[(-1-1.7) +(-1-2)+(-1-2)+(-1+0)] = -2.425$$$$v_3^{(22)} = \frac{1}{4}[(-1-1.7) +(-1-1.7)+(-1-2)+(-1-2)] = -2.85$$
最終得到的結果是上圖$k=3$的時候。就這樣一直迭代下去,直到每個格子的策略價值改變很小為止。這時我們就得到了所有格子的基於隨機策略的狀態價值。
可以看到,動態規劃的策略評估計算過程並不複雜,但是如果我們的問題是一個非常複雜的模型的話,這個計算量還是非常大的。
4. 策略迭代求解控制問題
上面我們將了使用策略評估求解控制問題,現在我們再來看如何使用動態規劃求解強化學習的第二個問題控制問題。一種可行的方法就是根據我們之前基於任意一個給定策略評估得到的狀態價值來及時調整我們的動作策略,這個方法我們叫做策略迭代(Policy Iteration)。
如何調整呢?最簡單的方法就是貪婪法。考慮一種如下的貪婪策略:個體在某個狀態下選擇的行為是其能夠到達後續所有可能的狀態中狀態價值最大的那個狀態。還是以第三節的例子為例,如上面的圖右邊。當我們計算出最終的狀態價值後,我們發現,第二行第一個格子周圍的價值分別是0,-18,-20,此時我們用貪婪法,則我們調整行動策略為向狀態價值為0的方向移動,而不是隨機移動。也就是圖中箭頭向上。而此時第二行第二個格子周圍的價值分別是-14,-14,-20, -20。那麼我們整行動策略為向狀態價值為-14的方向移動,也就是圖中的向左向上。
如果用一副圖來表示策略迭代的過程的話,如下圖:
在策略迭代過程中,我們迴圈進行兩部分工作,第一步是使用當前策略$\pi_{*}$評估計算當前策略的最終狀態價值$v_{*}$,第二步是根據狀態價值$v_{*}$根據一定的方法(比如貪婪法)更新策略$\pi_{*}$,接著回到第一步,一直迭代下去,最終得到收斂的策略$\pi_{*}$和狀態價值$v_{*}$。
5. 價值迭代求解控制問題
觀察第三節的圖發現,我們如果用貪婪法調整動作策略,那麼當$k=3$的時候,我們就已經得到了最優的動作策略。而不用一直迭代到狀態價值收斂才去調整策略。那麼此時我們的策略迭代優化為價值迭代。
還是以第三節的例子為例,如上面的圖右邊。比如當$k=2$時,第二行第一個格子周圍的價值分別是0,-2,-2,此時我們用貪婪法,則我們調整行動策略為向狀態價值為0的方向移動,而不是隨機移動。也就是圖中箭頭向上。而此時第二行第二個格子周圍的價值分別是-1.7,-1.7,-2, -2。那麼我們整行動策略為向狀態價值為-1.7的方向移動,也就是圖中的向左向上。
和上一節相比,我們沒有等到狀態價值收斂才調整策略,而是隨著狀態價值的迭代及時調整策略, 這樣可以大大減少迭代次數。此時我們的狀態價值的更新方法也和策略迭代不同。現在的貝爾曼方程迭代式子如下:$$v_{k+1}(s) = \max_{a \in A}(R_s^a + \gamma \sum\limits_{s' \in S}P_{ss'}^av_{k}(s'))$$
可見由於策略調整,我們現在價值每次更新傾向於貪婪法選擇的最優策略對應的後續狀態價值,這樣收斂更快。
6. 非同步動態規劃演算法
在前幾節我們講的都是同步動態規劃演算法,即每輪迭代我會計算出所有的狀態價值並儲存起來,在下一輪中,我們使用這些儲存起來的狀態價值來計算新一輪的狀態價值。
另一種動態規劃求解是非同步動態規劃演算法,在這些演算法裡,每一次迭代並不對所有狀態的價值進行更新,而是依據一定的原則有選擇性的更新部分狀態的價值,這類演算法有自己的一些獨特優勢,當然有額會有一些額外的代價。
常見的非同步動態規劃演算法有三種:
第一種是原位動態規劃 (in-place dynamic programming), 此時我們不會另外儲存一份上一輪計算出的狀態價值。而是即時計算即時更新。這樣可以減少儲存的狀態價值的數量,節約記憶體。代價是收斂速度可能稍慢。
第二種是優先順序動態規劃 (prioritised sweeping):該演算法對每一個狀態進行優先順序分級,優先順序越高的狀態其狀態價值優先得到更新。通常使用貝爾曼誤差來評估狀態的優先順序,貝爾曼誤差即新狀態價值與前次計算得到的狀態價值差的絕對值。這樣可以加快收斂速度,代價是需要維護一個優先順序佇列。
第三種是實時動態規劃 (real-time dynamic programming):實時動態規劃直接使用個體與環境互動產生的實際經歷來更新狀態價值,對於那些個體實際經歷過的狀態進行價值更新。這樣個體經常訪問過的狀態將得到較高頻次的價值更新,而與個體關係不密切、個體較少訪問到的狀態其價值得到更新的機會就較少。收斂速度可能稍慢。
7. 動態規劃求解強化學習問題小結
動態規劃是我們講到的第一個系統求解強化學習預測和控制問題的方法。它的演算法思路比較簡單,主要就是利用貝爾曼方程來迭代更新狀態價值,用貪婪法之類的方法迭代更新最優策略。
動態規劃演算法使用全寬度(full-width)的回溯機制來進行狀態價值的更新,也就是說,無論是同步還是非同步動態規劃,在每一次回溯更新某一個狀態的價值時,都要回溯到該狀態的所有可能的後續狀態,並利用貝爾曼方程更新該狀態的價值。這種全寬度的價值更新方式對於狀態數較少的強化學習問題還是比較有效的,但是當問題規模很大的時候,動態規劃演算法將會因貝爾曼維度災難而無法使用。因此我們還需要尋找其他的針對複雜問題的強化學習問題求解方法。
下一篇我們討論用蒙特卡羅方法來求解強化學習預測和控制問題的方法。
(歡迎轉載,轉載請註明出處。歡迎溝通交流: liujianping-ok@163.com)