強化學習(三)用動態規劃(DP)求解

    在強化學習(二)馬爾科夫決策過程(MDP)中,咱們討論了用馬爾科夫假設來簡化強化學習模型的複雜度,這一篇咱們在馬爾科夫假設和貝爾曼方程的基礎上討論使用動態規劃(Dynamic Programming, DP)來求解強化學習的問題。html

    動態規劃這一篇對應Sutton書的第四章和UCL強化學習課程的第三講。算法

1. 動態規劃和強化學習問題的聯繫

    對於動態規劃,相信你們都很熟悉,不少使用算法的地方都會用到。就算是機器學習相關的算法,使用動態規劃的也不少,好比以前講到的隱馬爾科夫模型HMM(二)前向後向算法評估觀察序列機率隱馬爾科夫模型HMM(四)維特比算法解碼隱藏狀態序列, 都是動態規劃的典型例子。機器學習

    動態規劃的關鍵點有兩個:一是問題的最優解能夠由若干小問題的最優解構成,即經過尋找子問題的最優解來獲得問題的最優解。第二是能夠找到子問題狀態之間的遞推關係,經過較小的子問題狀態遞推出較大的子問題的狀態。而強化學習的問題剛好是知足這兩個條件的。異步

    咱們先看看強化學習的兩個基本問題。函數

    第一個問題是預測,即給定強化學習的6個要素:狀態集$S$, 動做集$A$, 模型狀態轉化機率矩陣$P$, 即時獎勵$R$,衰減因子$\gamma$,  給定策略$\pi$, 求解該策略的狀態價值函數$v(\pi)$post

    第二個問題是控制,也就是求解最優的價值函數和策略。給定強化學習的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'))$$lua

    從這個式子咱們能夠看出,咱們能夠定義出子問題求解每一個狀態的狀態價值函數,同時這個式子又是一個遞推的式子, 意味着利用它,咱們可使用上一個迭代週期內的狀態價值來計算更新當前迭代週期某狀態$s$的狀態價值。可見,使用動態規劃來求解強化學習問題是比較天然的。htm

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)     

相關文章
相關標籤/搜索