基於動態規劃的強化學習演算法
學習「強化學習」(基於這本教材,強烈推薦)時的一些總結,在此記錄一下。
在馬爾可夫決策過程 環境模型已知(也就是狀態轉移函式P、獎勵函式r已知)的情況下,我們可以透過 「動態規劃」 求得馬爾可夫決策過程的最優策略 \(\pi^*\) 。
1. 動態規劃
對於做過演算法題目的同學而言,這個詞應該並不陌生,比較經典的「揹包問題」就是需要利用「動態規劃」。動態規劃的思想是:將當前問題分解為子問題,求解並記錄子問題的答案,最後從中獲得目標解。它通常用於求解「最優」性質的問題。
而求解馬爾可夫決策過程最優策略的動態規劃演算法主要有兩種:
- 策略迭代
- 價值迭代
2. 策略迭代
「策略迭代」 分為「策略評估」和「策略提升」兩部分。
策略評估
策略評估會先設定一個初始狀態價值函式 \(V^0\),再透過「動態規劃」不斷更新策略的狀態價值函式 \(V^{k+1} \leftarrow V^k\),當最大的「 \(V^{k+1}(s)\) 與上次的 \(V^k(s)\) 的差距」非常小( \(<\theta\))時,就結束迭代。
策略評估的迭代公式可以看作是「貝爾曼期望方程」+「動態規劃」。我們可以看看兩者的不同:
光說這些還是不容易理解的,我們用例項演示一遍吧。同樣以教材中的「懸崖環境」為例:
假設現在有這麼一個 \(5 \times 4\) 區域的懸崖,我們的目標是要找出從起點到終點的最優策略。我們把每個格子都當成一個狀態,也就是說,只要智慧體移動了一個格子,就轉換了一次狀態;並且智慧體只能「上下左右」地走(如果將走出範圍,就當作原地踏步,即「走到自身格子」),每走一步都是一個動作且往不同方向走的機率是相同的。走到懸崖的獎勵我們設為-100,走到正常位置的獎勵設為-1,走到終點就直接結束(相當於獎勵是0),那麼我們可以整理出獎勵函式 \(r(s, a)\):
-
可能會有的疑惑:\(r(s, a)\) 不是 由狀態與動作一起決定 的嗎,這裡怎麼把 \(r(s, a)\) 直接放在狀態上了?
答:這其實是種簡化的表達方式,我們應該這麼看:這裡的 \(r(s, a)\) 指 從其它狀態(格子)以任意方向走到當前狀態(格子)的 \(r(s, a)\),只不過因為它們都相同(因為設定的這個環境比較特殊),所以寫在了一起。比如下面這個紅色小旗所在格子位置上的 \(r(s, a)\) 其實是它周圍格子走到該格子的 \(r(s, a)\):
- 我們先讓初始 \(V^0\) 全為0,判定迭代結束的小閾值 \(\theta = 0.01\),為了方便,讓折扣因子 \(\gamma = 1\),而且由於走一步僅能到達一個狀態,所以讓所有的狀態轉移機率都為1 :
-
根據迭代公式,開始迭代 \(V^1\),先以起點的 \(V\) 開始:
\[ \begin{aligned} V^1(起) &= \frac{1}{4} \times ((-1) + 1 \times 1 \times(V^0(起上))) + \frac{1}{4} \times ((-1) + 1 \times 1 \times(V^0(起下))) \\ &+ \frac{1}{4} \times ((-1) + 1 \times 1 \times(V^0(起左))) + \frac{1}{4} \times ((-100) + 1 \times 1 \times(V^0(起右))) \\ &= \frac{1}{4} \times ((-1) + 1 \times 1 \times(0)) + \frac{1}{4} \times ((-1) + 1 \times 1 \times(0)) \\ &+ \frac{1}{4} \times ((-1) + 1 \times 1 \times(0)) + \frac{1}{4} \times ((-100) + 1 \times 1 \times(0)) \\ & = -25.75\\ \end{aligned} \]每個狀態(格子)都計算完後,就得到了完整的新的 \(V^1\):
-
然後進行評估,發現 \(max\{|V^1(s) - V^0(s)|\} = 25.75 > \theta\),還得繼續迭代
-
重複與2相同的步驟,根據 \(V^1\) 求出 \(V^2\),又可以得到:
-
……
總之,在經過多輪的重複迭代後,我們取得了收斂的 \(V\),這時就進入到了 「策略提升」 環節。
策略提升
接下來就是調整策略 \(\pi\) 了,我們可以直接貪心地在每一個狀態選擇動作價值最大的動作,也就是:
根據這個調整方式,來看看最終策略提升得到的新的 \(\pi^1\):
然而,這還沒有結束,如果不滿足 \(\pi^{k-1} = \pi^k\),那麼還需要繼續進行策略迭代。如果滿足了,那麼此時的 \(\pi^k\) 就是最優策略、 \(V^k\) 就是最優價值。在這裡顯然 $ \pi^0 \neq \pi^1$,所以要繼續。
總結
最後,綜合「策略評估」和「策略提升」,得到策略迭代演算法(教材中的):
3. 價值迭代
「策略迭代演算法」似乎計算量大了些,既要進行不斷迭代 \(V\) ,還要迭代 \(\pi\),有計算量比較小的演算法嗎? 「價值迭代演算法」 可能可以滿足你的需求,它雖說也要進行 \(V\) 迭代,但卻只用一輪,而後就直接「蓋棺定論」將更改後得到的 \(\pi\) 作為「最優策略」了。
它可以看作是:「貝爾曼最優方程」+ 「動態規劃」。
可以直接來對比下「策略迭代」與「價值迭代」:
紅色框表示的是「\(V\)迭代」,在這部分不同的是,「價值迭代」直接選取最大狀態價值而不是「策略迭代」的期望狀態價值;藍色框表示的是「\(\pi\)迭代」,「價值迭代」沒有對「策略」進一步進行迭代 (所以才叫「價值迭代」嘛
雖然很簡單,但同樣我們也來實操一遍「價值迭代」,同樣用到剛剛的「懸崖」環境:
-
初始化就不提了,直接根據迭代公式,開始迭代 \(V^1\),先以起點的 \(V\) 開始:
\[ \begin{aligned} V^1(起) &= max\{((-1) + 1 \times 1 \times(V^0(起上))),((-1) + 1 \times 1 \times(V^0(起下))), \\ & ((-1) + 1 \times 1 \times(V^0(起左))),((-100) + 1 \times 1 \times(V^0(起右)))\}\\ &= max\{((-1) + 1 \times 1 \times(0)),((-1) + 1 \times 1 \times(0)), \\ & ((-1) + 1 \times 1 \times(0)),((-100) + 1 \times 1 \times(0))\} \\ & = max\{-1, -1, -1, -100\}\\ & = -1\\ \end{aligned} \]每個狀態(格子)都計算完後,就得到了完整的新的 \(V^1\):
-
同樣評估一下是否 \(max\{|V^1(s) - V^0(s)|\} > \theta\) ,如有則繼續迭代。這裡經過7次迭代就達到判定閾值了:
-
最後同樣選取最大動作價值,來更新策略即可。如果動作中有多個「最大動作價值」的動作,則給予等機率。
4. 總結
策略迭代在理論上能更好地收斂到最優策略,但有著比較大的計算量;價值迭代可以透過較少的計算就收斂,但不像策略迭代那樣有嚴格的收斂性保證(可以看看這個數學證明)。只能說各有優劣,具體用哪個還得看實際情況。