強化學習入門第四講 時間差分方法


強化學習入門第四講 時間差分方法

上一節我們已經講了無模型強化學習最基本的方法蒙特卡羅方法。本節,我們講另外一個無模型的方法時間差分的方法。

圖4.1 強化學習算法分類

 

時間差分(TD)方法是強化學習理論中最核心的內容,是強化學習領域最重要的成果,沒有之一。與動態規划的方法和蒙特卡羅的方法比,時間差分的方法主要不同點在值函數估計上面。

 

圖4.2 動態規划方法計算值函數

\[ V\left(S_t\right)\gets E_{\pi}\left[R_{t+1}+\gamma V\left(S_{t+1}\right)\right]=\sum_a{\pi\left(a|S_t\right)\sum_{s',r}{p\left(s',r|S_t,a\right)\left[r+\gamma V\left(s'\right)\right]}} \] (4.1)

方程(4.1)給出了值函數估計的計算公式,從公式中可以看到,DP方法計算值函數時用到了當前狀態s的所有后繼狀態s’處的值函數。值函數的計算用到了bootstapping的方法。所謂bootstrpping本意是指自舉,此處是指當前值函數的計算用到了后繼狀態的值函數。即用后繼狀態的值函數估計當前值函數。特別注意,此處后繼的狀態是由模型公式\[ p\left(s',r|S_t,a\right) \]

計算得到的。由模型公式和動作集,可以計算狀態s所有的后繼狀態s’。當沒有模型時,后繼狀態無法全部得到,只能通過試驗和采樣的方法每次試驗得到一個后繼狀態s’。

無模型時,我們可以采用蒙特卡羅的方法利用經驗平均來估計當前狀態的值函數。其計算值函數示意圖如圖4.3所示。

圖4.3 蒙特卡羅方法計算值函數

 

蒙特卡羅方法利用經驗平均估計狀態的值函數,所謂的經驗是指一次試驗,而一次試驗要等到終止狀態出現才結束,如圖4.3所示。公式(4.2)中的G_t是狀態S_t后直到終止狀態所有回報的返回值。

\[ V\left(S_t\right)\gets V\left(S_t\right)+\alpha\left(G_t-V\left(S_t\right)\right) \] (4.2)

相比於動態規划的方法,蒙特卡羅的方法需要等到每次試驗結束,所以學習速度慢,學習效率不高。從兩者的比較我們很自然地會想,能不能借鑒動態規划中boot’strapping的方法,在不等到試驗結束時就估計當前的值函數呢?

答案是肯定的,這就是時間差分方法的精髓。時間差分方法結合了蒙特卡羅的采樣方法(即做試驗)和動態規划方法的bootstrapping(利用后繼狀態的值函數估計當前值函數),其示意圖如圖4.4所示。

 

圖4.4 時間差分方法計算值函數

 

TD方法更新值函數的公式為(4.3):

\[ V\left(S_t\right)\gets V\left(S_t\right)+\alpha\left(R_{t+1}+\gamma V\left(S_{t+1}\right)-V\left(S_t\right)\right) \] (4.3)

其中\[ R_{t+1}+\gamma V\left(S_{t+1}\right) \]稱為TD目標,與(4.2)中的G_t相對應,兩者不同之處是TD目標利用了bootstrapping方法估計當前值函數。\[ \delta_t=R_{t+1}+\gamma V\left(S_{t+1}\right)-V\left(S_t\right) \] 稱為TD偏差。

下面我們從原始公式給出動態規划(DP),蒙特卡羅方法(MC),和時間差分方法(TD)的不同之處。

 

圖4.5 DP,MC和TD方法的異同

 

圖4.5給出了三種方法估計值函數時的異同點。從圖中可以看到,蒙特卡羅的方法使用的是值函數最原始的定義,該方法利用所有回報的累積和估計值函數。DP方法和TD方法則利用一步預測方法計算當前狀態值函數。其共同點是利用了bootstrapping方法,不同的是,DP方法利用模型計算后繼狀態,而TD方法利用試驗得到后繼狀態。

從統計學的角度來看,蒙特卡羅方法(MC方法)和時間差分方法(TD方法)都是利用樣本去估計值函數的方法,哪種估計方法更好呢?既然是統計方法,我們就可以從期望和方差兩個指標對兩種方法進行對比。

首先蒙特卡羅方法:

蒙特卡羅方法中的返回值\[ G_t=R_{t+1}+\gamma R_{t+2}+\cdots +\gamma^{T-1}R_T \] ,其期望便是值函數的定義,因此蒙特卡羅方法是無偏估計。但是,蒙特卡羅方法每次得到的G_t 值要等到最終狀態出現,在這個過程中要經歷很多隨機的狀態和動作,因此每次得到的G_t隨機性很大,所以盡管期望等於真值,但方差無窮大。

其次,時間差分方法:

時間差分方法的TD目標為R_{t+1}+\gamma V\left(S_{t+1}\right),若V\left(S_{t+1}\right) 采用真實值,則TD估計也是無偏估計,然而在試驗中V\left(S_{t+1}\right) 用的也是估計值,因此時間差分估計方法屬於有偏估計。然而,跟蒙特卡羅方法相比,時間差分方法只用到了一步隨機狀態和動作,因此TD目標的隨機性比蒙特卡羅方法中的G_t 要小,因此其方差也比蒙特卡羅方法的方差小。

圖4.6 on-policy Sarsa強化學習算法

 

如圖4.6為同策略Sarsa強化學習算法,主要注意的是方框中代碼表示同策略中的行動策略和評估的策略都是 \varepsilon 貪婪策略。與蒙特卡羅方法不同的是,值函數更新不同。

圖4.7 off-policy Qlearning

如圖4.7為異策略的Qlearning方法。與Sarsa方法的不同之處在於,Qlearning方法是異策略。即行動策略采用 \varepsilon 貪婪策略,而目標策略采用貪婪策略。

從圖4.4我們看到,在更新當前值函數時,用到了下一個狀態的值函數。那么我們可以以此推理,能不能利用后繼第二個狀態的值函數來更新當前狀態的值函數呢?

答案是肯定的,那么如何利用公式計算呢?

我們用G_{t}^{\left(1\right)}=R_{t+1}+\gamma V\left(S_{t+1}\right) 表示TD目標,則利用第二步值函數來估計當前值函數可表示為:G_{t}^{\left(2\right)}=R_{t+1}+\gamma R_{t+2}+\gamma^2V\left(S_{t+1}\right) 以此類推,利用第n步的值函數更新當前值函數可表示為:

G_{t}^{\left(n\right)}=R_{t+1}+\gamma R_{t+2}+\cdots +\gamma^{n-1}R_{t+n}+\gamma^nV\left(S_{t+n}\right)

圖4.8 n步預測估計值函數

如圖4.8所示為利用n步值函數估計當前值函數的示意圖。我們再審視一下剛剛的結論:可以利用n步值函數來估計當前值函數,也就是說當前值函數有n種估計方法。

哪種估計值更接近真實值呢?

我們不知道,但是我們是不是可以對這n個估計值利用加權的方法進行融合一下呢?這就是TD\left(\lambda\right)的方法。

我們在G_{t}^{\left(n\right)}前乘以加權因子\left(1-\lambda\right)\lambda^{n-1},為什么要乘這個加權呢?這是因為:

G_{t}^{\lambda}=\left(1-\lambda\right)G_{t}^{\left(1\right)}+\left(1-\lambda\right)\lambda G_{t}^{\left(2\right)}+\cdots +\left(1-\lambda\right)\lambda^{n-1}G_{t}^{\left(n\right)} \\ \approx\left[\left(1-\lambda\right)+\left(1-\lambda\right)\lambda +\cdots +\left(1-\lambda\right)\lambda^{n-1}\right]V\left(S_t\right) \\ =V\left(S_t\right) (4.4)

利用G_{t}^{\lambda}來更新當前狀態的值函數的方法稱為TD\left(\lambda\right)的方法。對於TD\left(\lambda\right) 的理解一般可以從兩個視角進行解讀。

第一個視角是前向視角,該視角也是TD\left(\lambda\right)的定義。

圖4.9 TD\left(\lambda\right)的前向視角

如圖4.9所示為TD\left(\lambda\right)方法的前向視角解釋。假設一個人坐在狀態流上拿着望遠鏡看向前方,前方是那些將來的狀態。當估計當前狀態的值函數時,TD\left(\lambda\right)的定義中可以看到,它需要用來將來時刻的值函數。也就是說,TD\left(\lambda\right)前向觀點通過觀看將來狀態的值函數來估計當前的值函數。

\[ V\left(S_t\right)\gets V\left(S_t\right)+\alpha\left(G_{t}^{\left(\lambda\right)}-V\left(S_t\right)\right) \] (4.4)

其中\[ G_{t}^{\lambda}=\left(1-\lambda\right)\sum_{n=1}^{\infty}{\lambda^{n-1}}G_{t}^{\left(n\right)} \] ,而\[ G_{t}^{\left(n\right)}=R_{t+1}+\gamma R_{t+2}+\cdots +\gamma^{n-1}R_{t+n}+\gamma^nV\left(S_{t+n}\right) \]

利用TD\left(\lambda\right)的前向觀點估計值函數時,G_{t}^{\lambda} 的計算用到了將來時刻的值函數,因此需要等到整個試驗結束之后。這跟蒙塔卡羅方法相似。那么有沒有一種更新方法不需要等到試驗結束就可以更新當前狀態的值函數呢?

有,這種增量式的更新方法需要利用TD\left(\lambda\right)的后向觀點。

圖4.10 TD\left(\lambda\right)的后向觀點

如圖4.10為TD\left(\lambda\right)后向觀點示意圖,人騎坐在狀態流上,手里拿着話筒,面朝已經經歷過的狀態流,獲得當前回報並利用下一個狀態的值函數得到TD偏差后,此人會向已經經歷過的狀態喊話,告訴這些已經經歷過的狀態處的值函數需要利用當前時刻的TD偏差進行更新。此時過往的每個狀態值函數更新的大小應該跟距離當前狀態的步數有關。假設當前狀態為s_t,TD偏差為\delta_t ,那么s_{t-1}處的值函數更新應該乘以一個衰減因子\gamma\lambda,狀態s_{t-2} 處的值函數更新應該乘以\left(\gamma\lambda\right)^2 ,以此類推。

TD\left(\lambda\right)更新過程為:

(1) 
首先計算當前狀態的TD偏差:\delta_t=R_{t+1}+\gamma V\left(S_{t+1}\right)-V\left(S_t\right)

(2) 
更新適合度軌跡:\[ E_t\left(s\right)=\left\{\begin{array}{l} \gamma\lambda E_{t-1},\ if\ s\ne s_t\\ \gamma\lambda E_{t-1}+1,\ if\ s=s_t\\ \end{array}\right. \]

(3) 
對於狀態空間中的每個狀態s, 更新值函數:V\left(s\right)\gets V\left(s\right)+\alpha\delta_tE_t\left(s\right)

其中E_t\left(s\right)稱為適合度軌跡。

注意:現在我們比較一下TD\left(\lambda\right)的前向觀點和后向觀點的異同:

(1) 
前向觀點需要等到一次試驗之后再更新當前狀態的值函數;而后向觀點不需要等到值函數結束后再更新值函數,而是每一步都在更新值函數,是增量式方法。

(2) 
前向觀點在一次試驗結束后更新值函數時,更新完當前狀態的值函數后,此狀態的值函數就不再改變。而后向觀點,在每一步計算完當前的TD誤差后,其他狀態的值函數需要利用當前狀態的TD誤差進行更新。

(3) 
在一次試驗結束后,前向觀點和后向觀點每個狀態的值函數的更新總量是相等的,都是G_{t}^{\lambda}

為了說明前向觀點和后向觀點的等價性,我們從公式上對其進行嚴格地證明。

首先,當\lambda =0 時,只有當前狀態值更新,此時等價於之前說的TD方法。所以TD方法又稱為TD(0)方法.

其次,當\lambda =1時,狀態s值函數總的更新與蒙特卡羅方法相同:\[ \begin{array}{l} \delta_t+\gamma\delta_{t+1}+\gamma^2\delta_{t+2}+\cdots +\gamma^{T-1-t}\delta_{T-1}\\ =R_{t+1}+\gamma V\left(S_{t+1}\right)-V\left(S_t\right)\\ +\gamma R_{t+2}+\gamma^2V\left(S_{t+2}\right)-\gamma V\left(S_{t+1}\right)\\ +\gamma^2R_{t+3}+\gamma^3V\left(S_{t+3}\right)-\gamma^2V\left(S_{t+2}\right)\\ \vdots\\ +\gamma^{T-1-t}R_T+\gamma^{T-t}V\left(S_T\right)-\gamma^{T-1-t}V\left(S_{T-1}\right)\\ \end{array} \]

對於一般的\lambda,前向觀點等於后向觀點:\[\begin{array}{l} G_t^\lambda - V\left( {{S_t}} \right) = \\ - V\left( {{S_t}} \right) + \left( {1 - \lambda } \right){\lambda ^0}\left( {{R_{t + 1}} + \gamma V\left( {{S_{t + 1}}} \right)} \right)\\ + \left( {1 - \lambda } \right){\lambda ^1}\left( {{R_{t + 1}} + \gamma {R_{t + 2}} + {\gamma ^2}V\left( {{S_{t + 2}}} \right)} \right)\\ + \left( {1 - \lambda } \right){\lambda ^2}\left( {{R_{t + 1}} + \gamma {R_{t + 2}} + {\gamma ^2}{R_{t + 3}} + {\gamma ^3}V\left( {{S_{t + 2}}} \right)} \right) + \cdots \end{array}\]

\[\begin{array}{l} {\rm{ = }} - V\left( {{S_t}} \right) + {\left( {\gamma \lambda } \right)^0}\left( {{R_{t + 1}} + \gamma V\left( {{S_{t + 1}}} \right) - \gamma \lambda V\left( {{S_{t + 1}}} \right)} \right)\\ + {\left( {\gamma \lambda } \right)^1}\left( {{R_{t + 2}} + \gamma V\left( {{S_{t + 2}}} \right) - \gamma \lambda V\left( {{S_{t + 2}}} \right)} \right)\\ + {\left( {\gamma \lambda } \right)^2}\left( {{R_{t + 3}} + \gamma V\left( {{S_{t + 3}}} \right) - \gamma \lambda V\left( {{S_{t + 3}}} \right)} \right) + \cdots \end{array}\]

\[\begin{array}{l} {\rm{ = }}{\left( {\gamma \lambda } \right)^0}\left( {{R_{t + 1}} + \gamma V\left( {{S_{t + 1}}} \right) - V\left( {{S_t}} \right)} \right)\\ {\rm{ + }}{\left( {\gamma \lambda } \right)^1}\left( {{R_{t + 2}} + \gamma V\left( {{S_{t + 2}}} \right) - V\left( {{S_{t + 1}}} \right)} \right)\\ {\rm{ + }}{\left( {\gamma \lambda } \right)^2}\left( {{R_{t + 3}} + \gamma V\left( {{S_{t + 3}}} \right) - V\left( {{S_{t + 2}}} \right)} \right) + \cdots \end{array}\]

\[{\rm{ = }}{\delta _t} + \gamma \lambda {\delta _{t + 1}} + {\left( {\gamma \lambda } \right)^2}{\delta _{t + 2}} + \cdots \]

注意,所謂等價是指更新總量相等。

最后,我們給出Sarsa\left(\lambda\right)算法的偽代碼:

圖4.11 Sarsa算法的偽代碼

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM