1. 程式人生 > 實用技巧 >強化學習 4 —— 時序差分法(TD)解決無模型預測與控制問題

強化學習 4 —— 時序差分法(TD)解決無模型預測與控制問題

在上篇文章強化學習——蒙特卡洛 (MC) 取樣法的預測與控制中我們討論了 Model Free 情況下的策略評估問題,主要介紹了蒙特卡洛(MC)取樣法的預測與控制問題,這次我們介紹另外一種方法——時序差分法(TD)

一、時序差分取樣法(TD)

對於MC取樣法,如果我們沒有完整的狀態序列,那麼就無法使用蒙特卡羅法求解了。當獲取不到完整狀態序列時, 可以使用時序差分法(Temporal-Difference, TD)。

1、TD 簡介

對於蒙特卡洛取樣法計算狀態收益的方法是:

\[G_t = R_{t+1} + \gamma R_{t+2} + \gamma^2R_{t+3}+\cdots \gamma^{T-t-1}R_T \]

而對於時序差分法來說,我們沒有完整的狀態序列,只有部分的狀態序列,那麼如何可以近似求出某個狀態的收穫呢?回顧貝爾曼方程:

\[v_\pi(s) = E_\pi[R_{t+1} + \gamma v_\pi(S_{t+1}) | S_t = s] \]

我們可以用 \(R_{t+1} + \gamma v_\pi(S_{t+1})\) 近似代替 \(G_t\) ,此時有:

\[\color{red}{v(S_t) \leftarrow v(S_t) + \alpha(R_{t+1} + \gamma v(S_{t+1})-v(S_t))} \]

  • 一般把 \(R_{t+1} + \gamma v(S_{t+1})\)

    叫做 TD Target

  • 把叫做 \(R_{t+1} + \gamma v(S_{t+1})-v(S_t)\) TD Error

  • 把 用 TD Target 近似的代替 Gt 的過程稱為 引導(Bootstraping)

這樣一來,這樣我們只需要兩個連續的狀態與對應的獎勵,就可以嘗試求解強化學習問題了。

2、n步時序差分

在上面我們用 $ R_{t+1} + \gamma v_\pi(S_{t+1})$ 近似代替 \(G_t\) 。即向前一步來近似收穫 \(G_t\),那我們能不能向前兩步呢?當然是可以的,此時 \(G_t\) 近似為:

\[G_t^{(2)} = R_{t+1} + \gamma R_{t+2}+\cdots + \gamma^2V(S_{t+2}) \]

近似價值函式 \(v(S_t)\) 為:

\[v(S_t) \leftarrow v(S_t) + \alpha(R_{t+1} + \gamma R_{t+2} + \gamma v(S_{t+2})-v(S_t)) \]

從兩步,到三步,再到n步,我們可以歸納出n步時序差分收穫 \(G_t^{(n)}\)的表示式為:

\[G_t^{(2)} = R_{t+1} + \gamma R_{t+2}+\cdots + \gamma^{n-1}R_{t+n} + \gamma^nV(S_{t+n}) \]

往前走兩步時,對應的演算法叫 TD(2) ,往前走三步時,對應的演算法叫 (TD3) 。當n越來越大,趨於無窮,或者說趨於使用完整的狀態序列時,n步時序差分就等價於蒙特卡羅法了。特別的對於往前走一步的演算法,我們叫 TD(0)。

3、TD小結

TD 對比 MC:

  • TD在知道結果之前就可以學習,也可以在沒有結果時學習,還可以在持續進行的環境中學習,而MC則要等到最後結果才能學習,時序差分法可以更快速靈活的更新狀態的價值估計。
  • TD在更新狀態價值時使用的是TD 目標值,即基於即時獎勵和下一狀態的預估價值來替代當前狀態在狀態序列結束時可能得到的收穫,是當前狀態價值的有偏估計,而MC則使用實際的收穫來更新狀態價值,是某一策略下狀態價值的無偏估計,這點 MC 優於 TD。
  • 雖然TD得到的價值是有偏估計,但是其方差卻比MC得到的方差要低,且對初始值敏感,通常比MC更加高效。

二、TD 解決控制問題

我們知道,TD對比MC有很多優勢,比如TD有更低方差,可以學習不完整的序列。所以我們可以在策略控制迴圈中使用TD來代替MC。因此現在主流的強化學習求解方法都是基於TD的,下面我們就介紹兩種最常用的演算法,分別是 Sarsa 和 Q-Learning

1、Sarsa:

對於一個動作序列如下圖所示:

在迭代的時候,我們基於 \(\epsilon\) -貪婪法在當前狀態 \(S_t\) 選擇一個動作 \(A_t\), 然後會進入到下一個 狀態 \(S_{t+1}\),同時獲得獎勵 \(R_{t+1}\),在新的狀態 \(S_{t+1}\) 我們同樣基於 \(\epsilon\)-貪婪法選擇一個動作 \(A_{t+1}\),然後用它來更新我們的價值函式,更新公式如下:

\[A(S_t, A_t) \leftarrow A(S_t, A_t) + \alpha \left[R_{t+1} + \gamma Q(S_{t+1}, A_{t+1}) - A(S_t, A_t)\right] \]

  • 注意:這裡我們選擇的動作 \(A_{t+1}\),就是下一步要執行的動作,這點是和Q-Learning演算法的最大不同

  • TD Target \(\delta_t = R_{t+1} + \gamma Q(S_{t+1}, A_{t+1})\)

  • 在每一個 非終止狀態 \(S_t\) 都要更新

  • 進行一次更新,我們要獲取5個數據,\(<S_t, A_t, R_{t+1}, S_{t+1}, A_{t+1}>\) ,這也是演算法名字 Sarsa 的由來

Sarsa演算法流程如下

n-step Sarsa

上面的 Sarsa 演算法是我們每向前走一步就更新,其實可以 類比 TD,可以向前走多步然後進行更新,就叫 n-step Sarsa

\[Q(S_t, A_t) \leftarrow Q(S_t, A_t) + \alpha(q_t^{(n)} - Q(S_t, A_t)) \]

其中 \(q_{(n)}\) 為:

\[q_t^{(n)} = R_{t+1} + \gamma R_{t+2} + \cdots + \gamma^{n-1}R_{t+n} + \gamma^nQ(S_{t+n}, A_{t+n}) \]

2、On-policy 和 Off-policy

比如上面的 Sarsa 演算法就是一個 On-Policy 演算法。從更新公式可以看出,Sarsa 演算法的探索使用 \(\epsilon-\)貪婪法,而更新value 的動作也是帶有 \(\epsilon\) 的探索。也就是說探索和更新 \(V(s)\) 是用的同一種策略 \(\pi\) ,我們就叫 同策略學習(On-Policy Learning)。

而另外一個重要的方法就是Off-Policy Learning ,也就是異策略學習。在異策略學習演算法中,我們有兩個不同的策略,一個策略 \(\pi\) 是獲取最優的 \(V(s)\) (比如使用貪心法),我們稱為 target policy。而另外一個 策略 \(\mu\) 是為了生成不同的軌跡,同時擁有更多的探索性(比如 \(\epsilon-\)貪婪法),我們稱為 behavior policy

強化學習過程主要是探索利用 的問題。如何更好的探索環境以採集軌跡,以及如何利用採集到的軌跡經驗。Off Policy 其實就是把探索和優化 一分為二,優化的時候我只追求最大化,二不用像 On Policy 那樣還要考慮 epsilon 探索,所以Off Policy 的優點就是可以更大程度上保證達到全域性最優解。

如上圖所示,就是一個 Off policy 很好的比喻。海盜更具有冒險精神,他可以把與風浪(環境)中獲得的軌跡(或者經驗)保留下來,然後其的小白就可以利用這些經驗來學習如何更好的在海上航行。對於 On-policy,每次更新之後,策略都會發生變化,所以之前產生的 互動資料已經沒有價值了,我們要廢棄掉,再重新產生新的互動資料。而Off Policy 在這方面就有著優勢,他可以反覆的利用以前過往的資料,因為他的目標策略和行為策略是分離的。而 Q-Learning 就是一個 Off-Policy 演算法。

3、Q-Learning

對於Q-Learning,我們會使用 \(\epsilon-\)貪婪法來選擇新的動作,這部分和SARSA完全相同。但是對於價值函式的更新,Q-Learning使用的是貪婪法,而不是SARSA的 \(\epsilon-\)貪婪法。這一點就是SARSA和Q-Learning本質的區別。

首先我們基於狀態 \(S_t\),用 \(\epsilon-\)貪婪法選擇到動作 \(A_t\), 然後執行動作 \(A_t\),得到獎勵\(R_{t}\),並進入狀態\(S_{t+1}\),對於 Q-Learning,它基於狀態 \(S_{t+1}\) 沒有用 \(\epsilon-\)貪婪法選擇到動作 \(A'\), 而是使用貪心策略選擇 \(A'\) 。也就是選擇使\(Q(S_{t+1}, a)\) 最大的 \(a\) 來作為 \(A'\) 來更新價值函式。對應到上圖中就是在圖下方的三個黑圓圈動作中選擇一個使\(Q(S', a)\) 最大的動作作為 \(A'\)注意: 此時選擇的動作只會參與價值函式的更新,不會真正的執行。

  • 對於 behavior policy \(\mu\) 使用 \(\epsilon-\) 貪心策略
  • 對於 target policy \(\pi\) 使用貪心策略選取

\[\pi(S_{t+1}) = argmax_{a'} \; Q(S_{t+1}, a') \]

因此 Q-Learning Target :

\[R_{t+1} + \gamma Q(S_{t+1}, A') = R_{t+1} + \gamma Q(S_{t+1}, argmax \; Q(S_{t+1}, a')) \\ = R_{t+1} + \gamma \; max_{a'} Q(S_{t+1}, a') \]

Q-Learning 的更新式子如下:

\[Q(S_t, A_t) \leftarrow Q(S_t, A_t) + \alpha[R_{t+1} + \gamma \; max_aQ(S_{t+1}, a) - Q(S_t, A_t)] \]

Q-Learning 演算法

4、Sarsa VS Q-learning

作為時序差分法控制演算法的兩個經典的演算法,他們各自有特點。

Q-Learning直接學習的是最優策略,而Sarsa在學習最優策略的同時還在做探索。這導致我們在學習最優策略的時候,如果用Sarsa,為了保證收斂,需要制定一個策略,使 \(\epsilon-\)貪婪法的超引數 \(\epsilon\) 在迭代的過程中逐漸變小。Q-Learning沒有這個煩惱。

另外一個就是Q-Learning直接學習最優策略,但是最優策略會依賴於訓練中產生的一系列資料,所以受樣本資料的影響較大,因此受到訓練資料方差的影響很大,甚至會影響Q函式的收斂。Q-Learning的深度強化學習版Deep Q-Learning也有這個問題。

在學習過程中,Sarsa在收斂的過程中鼓勵探索,這樣學習過程會比較平滑,不至於過於激進,而 Q-Learning 是直接選擇最優的動作,相比於 Sarsa 演算法更激進。

比如在 Cliff Walk 問題中,如下所示,Sarsa 演算法會走藍色的安全線,而激進的 Q-Learning 演算法則會選擇紅色的最優路線。(其中灰色部分是懸崖)

關於 Sarsa 和 Q-Learning 演算法的程式碼詳解可以看下一篇文章強化學習——Sarsa 和 Q-Learning 演算法實戰

三、DP、MC、TD的對比

1 有無 Bootstrapping 和 Sampling

Bootstrapping Sampling
DP Yes
MC Yes
TD Yes Yes

2、DP 和 TD

3 對於三種演算法的直觀理解

  • DP
  • MC
  • TD

3 三種演算法之間的關係

上圖是強化學習方法空間的一個橫切面,突出兩個重要維度:更新的深度和寬度

這兩個維度是與改善價值函式的更新操作的型別聯絡在一起的。水平方向代表的是:使用取樣更新(基於一個取樣序列)還是期望更新(基於可能序列的分佈)。期望更新需要一個概率分佈模型,取樣更新只需要一個取樣模型即可。

垂直方向對應的是更新的深度,也是“自舉(bootstrap)”的程度。從單步時序差分更新到蒙特卡洛更新。中間部分包括了基於 n 步更新的方法(例如基於資格跡的 \(\lambda\) 更新)

可以看到,動態規劃在圖示空間的右上方,因為動態規劃屬於單步期望更新。右下角是期望更新的一個極端情況,每次更新都會遍歷雖有可能情況直到到達最後的終止狀態(或者在持續任務中,折扣因子的類乘導致之後的收益對當前回報不再有影響為止)。這是啟發式搜尋中的一中情況。

—— 《強化學習》第二版 Sutton

至此,傳統的強化學習基本理論就介紹完了,下一篇是SARSA 和Q-Learning演算法的程式碼介紹。當然本系列部落格比較基本,若想更深入瞭解可以讀 Sutton 的《強化學習》這本手,這本書英文電子版雲盤地址 提取碼: hn77。

最近這幾年,隨著神經網路的興起,基於神經網路的強化學習發展的如火如荼,出現了許多新的有意思的演算法,當然也更加的強大。所以接下來的文章都是介紹 神經網路 + 強化學習,也就是深度強化學習(DRL)。我這枚菜鳥也會盡自己最大所能,給大家講解清楚,還請大家不要走開,多多關注!