1. 程式人生 > >強化學習(RLAI)讀書筆記第十二章資格跡(Eligibility Traces)

強化學習(RLAI)讀書筆記第十二章資格跡(Eligibility Traces)

資格跡是強化學習演算法中的一個基本機制。比如很流行的TD(\lambda)其中的\lambda指的就是資格跡的使用。基本上所有的TD演算法都能夠和資格跡進行組合從而得到一個更通用的演算法。資格跡把TD和MC方法統一了起來。當TD演算法和資格跡進行組合使用時,得到了一組從一步TD延伸到MC演算法的演算法家族。一般中間部分的演算法效果比兩端的好。資格跡同樣提供了一種線上continuing形式的問題上使用MC演算法的實現方式。

之前第七章使用n步TD法已經組合過了TD法和MC方法,但是資格跡的方式更加的優雅而且有很大的計算優勢。這個機制使用了一個短期記憶的向量,資格跡z_{t}\in R^{d},與長期的權重w平行。大致的思想是當w的某個分量參與了一個估計值的計算,那麼z的相對應的部分就增大,之後慢慢減小。當對應的z分量減小為0之前有一個不為零的TD error,那麼w對應的部分就會進行更新。而資格跡消減的係數為\lambda

資格跡相對於n步TD演算法的計算優勢在於只需要一個資格跡向量而不需要像n步演算法一樣要儲存過去n個狀態的特徵向量。而學習的過程也連續而均勻均勻分佈而不是延遲到獲得episode末尾的反饋值為止。另外,學習過程可以每一步都進行從而立馬就會影響到下一狀態的行為而不是等到n步之後才能更新。

有些演算法需要等待之後狀態的返回值來進行學習,比如MC演算法和n步TD演算法。這種基於從被更新狀態往前觀察的機制叫做forward views。forward views一般都實現起來比較複雜因為需要考慮當前無法獲得的之後狀態的反饋值。而這一章我們介紹的演算法將要能夠使用當前的TD error並且通過資格跡使用先前訪問過的狀態來獲得和forward views幾乎一樣的更新。這種形式叫做backward views。

像往常一樣先介紹狀態值函式估計,然後延伸到動作值函式和control演算法。主要關注線性函式逼近,因為它使用了資格跡的結果會變得更好。線性的結果也可以應用到表格型和狀態整合裡去。

12.1 The \lambda-return

第七章定義了n步反饋為前n個獎勵加上第n步狀態的估計值,每一項都加上discounted係數,也就是:

現在考慮更新目標不僅僅是一個n步反饋值,而是不同的n的n步反饋的平均值。比如一個兩步反饋的一半加上一個四步反饋的一半組合成的一個新的反饋值。任意的n步反饋的集合可以通過這種形式進行平均,只要最終的係數和為1。合成的反饋值能夠和單個的n步反饋一樣處理TD error因此能夠作為一個保證演算法收斂的更新目標。這種平均的形式能夠得到一系列新的演算法。比如可以通過將一步TD的反饋和無窮步反饋MC反饋進行平均得到一種新的組合TD演算法和MC演算法的方式。理論上甚至可以將基於模型得到的DP反饋和實際經驗得到的反饋進行簡單的結合。

這種平均更簡單的更新分量的更新叫做複合更新。它的backup diagrams如右圖。一個複合更新只能夠等待它的分量中最長的部分更新得到結果之後才能夠進行計算。比如右圖中的兩個更新必須等待t+4的那個更新得到了之後才能計算平均的複合更新。所以使用的時候應該限制最長n步反饋的n,防止每次更新需要過長的等待時間。

TD(\lambda)演算法可以被理解為一種特殊的平均n步更新的形式。這個平均包括了所有的n步更新,每一個的更新的係數都正比於\lambda,而所有的係數之和為1;。得到的平均之後的反饋值叫做\lambda-return:

下圖顯示了每一步反饋值的係數:

對於episode形式的反饋,我們可以將前面的反饋同最後一步的反饋分開,即為:

這個形式使得在係數為1的時候更加清楚反饋就是MC形式的反饋。而對於係數為0的時候反饋即為一步TD的反饋。

練習12.1

G_{t}^{\lambda} = (1-\lambda)\sum_{n=1}^{\infty}\lambda^{n-1}(R_{t+1}+\gamma G_{t+1:t+n})\\=R_{t+1}+(1-\lambda)\sum_{n=1}^{\infty}\gamma \lambda^{n-1}G_{t+1:t+n}\\=R_{t+1}+\gamma(1-\lambda)\lambda\sum_{n=2}^{\infty}\lambda^{n-1-1}G_{t+1:t+n-1+1}+\gamma(1-\lambda)\widehat{v}(S_{t+1},w_{t})\\=R_{t+1}+\gamma(1-\lambda)\lambda\sum_{n=1}^{\infty}\lambda^{n-1}G_{t+1:t+n+1}+\gamma(1-\lambda)\widehat{v}(S_{t+1},w_{t})\\=R_{t+1}+\lambda\gamma G_{t+1}^{\lambda}+\gamma(1-\lambda)\widehat{v}(S_{t+1},w_{t})

練習12.2

\tau_{\lambda}=1-log_{\lambda}2

現在準備定義一個基於\lambda-return的學習演算法:the offline \lambda-return algorithm。作為一個線下演算法,在遍歷episode的時候不會改變係數w的值,等到episode結尾,一整個序列的更新都根據之前的半梯度法來進行係數的更新:

這個\lambda-return給我們提供了一種能夠和n步自舉相比較的從MC平穩過度到one-step TD演算法的另一種方式。目前我們採用的方法叫做一個學習演算法的理論視角或者叫做forward views。每次訪問一個狀態,都需要觀察未來狀態的反饋並且考慮將它們進行組合。每次更新完一個狀態我們都會往後前進一步,然後再也不會關心前面的狀態。

12.2 TD(\lambda)

TD(\lambda)是強化學習演算法中最古老也是應用最廣的演算法之一。則是第一個展示使用了資格跡的更偏理論的forward view和更適合計算的backward view的關係的演算法。這裡我們展示這個演算法對於offline \lambda-return演算法的近似。

TD(\lambda)相對於offline \lambda-return演算法有三大改進:第一,這個演算法能夠在每一個狀態對於權重向量進行更新而不是等到一個episode結束之後一起更新。第二,計算過程是均勻分佈的而不是集中在episode的最後。第三,能夠應用於continuing形式的問題而不僅僅是episodic形式。這一節介紹一個半梯度帶函式近似版本的TD(\lambda)演算法。

資格跡是個和權重向量一樣長的向量的短時記憶,一般比一整個episode持續的時間要短。它能夠幫助學習過程中對於權重的更新,而權重會決定值函式的估計值。在TD(\lambda)中資格跡在開始時初始化為0,而隨著時間步驟不斷增加,之後乘以係數\gamma \lambda來進行衰減:

資格跡能夠跟蹤那些對於最近的狀態值有所貢獻的權重向量的分量(考慮到線性逼近中對於值函式的梯度就是特徵向量x,因此資格跡可以看做是過往輸入的特徵向量的加權和)。TD error為:

TD(\lambda)演算法中權重向量每一步的更新都正比於TD error和資格跡向量:

TD(\lambda)演算法是往回看的。每次我們觀察當前的TD error然後將它往回分配到每一個先前的狀態中。分配是根據先前的那個狀態對於當前的資格跡的貢獻度。可以看做是站在當前狀態往回看,如上圖。當\lambda=0的時候演算法變為一步半梯度TD更新。在這裡,只有當前狀態的前一個狀態會被當前TD error改變。而對於更大的\lambda來說,更多的過往狀態會被改變,但是距離當前狀態更遠的狀態就會被當前TD error改變的更少因為相對應的資格跡的部分更小。

\lambda=1時演算法可以看作是MC演算法的一種更通用的實現方式而且更有實用性。有兩個優點:一、這時MC也能用於discounted continuing形式的任務。二、能夠實現為增量式和線上形式。

線性TD(\lambda)被證明當步長係數滿足2.7的情況下能夠在on-policy形勢下收斂。對於discounted形式,收斂得上限為:

練習12.3

G_{t}^{\lambda}-\widehat{v}(s_{t},w_{t})=R_{t+1}+\gamma\lambda G_{t+1}^{\lambda}+\gamma(1-\lambda)\widehat{v}(S_{t+1},w_{t})-\widehat{v}(s_{t},w_{t})\\=\delta_{t}+\gamma\lambda(G_{t+1}^{\lambda}-\widehat{v}(S_{t+1},w_{t}))\\=\sum_{n=0}^{\infty}(\gamma\lambda)^{n}\delta_{t+n}

練習12.4

z_{t}=\gamma\lambda z_{t-1}+\bigtriangledown \widehat{v}(s_{t},w_{t})\\ =\sum_{n=1}^{t}(\gamma\lambda)^{t-n}\bigtriangledown \widehat{v}(s_{n},w_{n})(1)

\sum_{t=0}^{T-1}\alpha \delta_{t}z_{t} = \sum_{t=0}^{T-1}\alpha\delta_{t}\[\sum_{n=1}^{t}(\gamma\lambda)^{t-n}\bigtriangledown \widehat{v}(s_{n},w_{n})\] (2)

\sum_{t=0}^{T-1}\alpha\[G_{t}^{\lambda}-v(s_{t},w_{t})\]\bigtriangledown \widehat{v}(s_{t},w_{t})\\=\sum_{t=0}^{T-1}\alpha\[\sum_{n=0}^{T-t-1}(\gamma\lambda)^{n}\delta_{t+n}\]\bigtriangledown \widehat{v}(s_{t},w_{t})(3)

(2)式和(3)式相等,交換求和順序即可(不過不會寫嘻嘻)。

 

12.3 n-step Truncated \lambda-return Methods

offline \lambda-return演算法是一種很重要的理想演算法,但是它的應用有限因為需要使用直到episode結束才能夠進行計算的\lambda-return。而且在continuing形式的問題裡,\lambda-return是無法得到的。但是對於很多步之後的反饋值起始依賴很小,因為權重係數在不斷的下降。綜合考慮可以定義一種truncated \lambda-return,只返回從t步開始h步之後的反饋的加權和,即:

truncated \lambda-return帶來了一組類似於第七章n步自舉的n步 \lambda-return演算法。其中係數的更新為:

 

12.4 Redoing Updates: Online \lambda-return Algorithm

在truncated TD(\lambda)演算法中選擇n引入了一組矛盾。n應該足夠大因此演算法才能夠足夠接近的擬合offline \lambda-return演算法。但是n又需要足夠小這樣更新才能足夠快的計算並且儘快影響當前動作。我們能夠同時獲得這兩個優點,但是需要付出更多計算複雜度的代價。

方法是,每一個時間步驟當產生了一個新的資料,就從頭開始重新計算所有的更新目標。因為每次考慮了新的資料,因此新的更新目標會比前一次的更好。也就是說更新總是相當於一個n步truncated \lambda-return,但是隻是每次都計算到當前的時間終點為止。不斷的計算當前能夠計算得到最優的\lambda-return,然後把它用來作為更新目標來更新權重向量。

這個理論上的演算法需要遍歷一個episode的所有狀態很多次,每次都產生了一個不同的權重向量序列。h表示當前時間t開始計算的視野長度,那麼所有產生的權重向量為:

因此更新的公式總結為:

這個更新公式同權重向量w_{t}\doteq w_{t}^{t}一起定義了一個online \lambda-return 演算法。

這個online \lambda-return演算法是完全的線上行駛,在每個時間步驟t計算當前係數w_{t}。最重要的缺點就是計算複雜度太高,每個時間步都需要將當前步驟之前每一個部分都遍歷一次。online形式的演算法比offline形式的更復雜,因為offline的演算法每次遍歷每個狀態的時候只有到結束狀態才會進行更新。但online形式演算法的結果更好,不僅是在offline不進行更新的計算過程中比其效果好,在最終計算結束後的結果上也更好。

 

12.5 True Online TD(\lambda)

上一節介紹的online \lambda-return演算法是目前表現最好的TD演算法。這是一個使用online TD(\lambda)只能近似的理想演算法。目前展示的online \lambda-return演算法還很複雜,可以將它從forward view轉換為backward的形式得到一種能夠高效計算的演算法也就是true online TD(\lambda)演算法。這個演算法叫做true online TD(\lambda)演算法因為它比普通的TD(\lambda)更接近理想的線上形式的\lambda-return演算法。

推導太過複雜就不在這說。可以將online \lambda-return演算法計算的權重向量列出來即:

上面的三角形中的一列是一個時間步驟中演算法計算得到的係數序列。我們實際上只需要每一行最後一個係數向量,因此新的策略就是找到一個直接有效的方式來根據上一行最後一個係數向量得到當前的係數向量。因此線上性情況下我們得出了一個true online TD(\lambda)演算法:

演算法已經被證明能夠得出和online TD(\lambda)演算法完全一樣的權重向量序列。但是這個演算法需要的計算量更少。演算法的空間需求是和傳統的TD(\lambda)演算法一樣,但是每一步的計算量增大了大概50%.因此每一步的計算複雜度依然是O(d)。

用在true online TD(\lambda)演算法中的資格跡叫做dutch trace,用來區分之前TD(\lambda)演算法中使用的accumulating trace。之前的研究中還有一個經常使用的資格跡叫做replacing trace,只用於表格形式的問題或者在像tile coding中產生的特徵一樣的二進位制特徵向量的問題。replacing trace是定義在特徵向量的每一個分量上的,取決於其為0或者1:

現在我們把replacing traces看作是dutch traces的粗糙逼近。dutch trace通常比replacing trace表現的更好而且有更清楚的理論解釋。accumulating traces依然保留在那些無法使用dutch trace的非線性函式逼近的情形下。

 

12.6 Dutch Traces in Monte Carlo Learning

儘管資格跡緊密的和TD學習演算法結合在一起,但實際上他們和TD並沒有關係。實際上資格跡甚至可以直接用在MC演算法中。之前展示了forward view的線性MC演算法可以用來推匯出一個等價而且計算更簡單的backward-view形式的使用dutch traces的演算法。這是本書中唯一顯示說明forward-view 和 backward-view 等價的例子。

具體演算法略過。

主要是說明資格跡和TD沒關係。而且可以應用在任何的想要高效學習長期的函式估計的情形下。

12.7 Sarsa(\lambda)

只需要很小的變動就可以將這章前面講的演算法應用到帶資格跡的動作值函式方法中。首先要改變n步反饋,將其中的v改為q:

這樣我們就可以構造一個動作值函式形式的truncated \lambda-return。所以動作值函式形式的offline \lambda-return演算法時需要用q替代v:

這個形式的backup diagrams和TD(\lambda)的相同。

而動作值函式形式帶資格跡的TD演算法,叫做Sarsa(\lambda)使用forward view的形式逼近上述形式的演算法。它的更新形式和TD(\lambda)演算法相同:

線性函式近似形式的使用二進位制特徵的帶accumulating trace或者replacing trace的Sarsa(\lambda)演算法虛擬碼如下:

同樣有一個動作值函式形式的理想狀態的TD演算法,也就是online \lambda-return演算法。以及動作值函式形式的true online TD(\lambda)。只需要把對應的值函式改為q,狀態特徵值改為對應狀態動作的形式即可。

最後還有一個truncated版本的Sarsa(\lambda)演算法,它在與多層ANN合用的時候能夠作為一個高效的model-free的control演算法。

12.8 Variable \lambda and \gamma

快要接近對於基本的TD演算法的介紹的結尾了。為了介紹最後一個通用形式的演算法,先要把使用常數引數的自舉和discounting泛化為使用依賴於狀態和動作的形式。也就是每個時間步驟都有一個不同\lambda\gamma,即\lambda_{t}\gamma_{t}。也就是讓它們變成對於狀態和動作的函式。

介紹函式\gamma,termination function。這個函式改變了反饋的形式,而反饋是我們強化學習任務中需要估計的最重要的變數。於是現在我們把反饋表示為:

為了保證結果是有限值,需要保證\prod_{k=t}^{\infty}\gamma_{k}=0。這種形式的好處是episodic型的任務不需要在單獨提出起始狀態和結束狀態。結束狀態變成了一個\gamma(s)=0並且轉移到起始狀態的狀態。因此這種形式統一了episodic和discounted-continuing。

對於自舉的變數的泛化並不是像discounting一樣是對於問題的改變,而是對於解決策略的改變。這個泛化影響了\lambda-return。新的基於狀態的\lambda-return可以寫為:

這裡每個\lambda都有一個狀態s作為下標。這個等式表明\lambda-return可以有下一刻的獎勵值加上第二項。第二項有可能為0,第二項裡有兩個部分,每部分的值有其自舉的程度決定。 基於動作的\lambda-return可以寫為Sarsa形式:

或者expected Sarsa的形式:

其中

12.10 Watkins's Q(\lambda) to Tree-Backup(\lambda)

過去的一些年以及有不少將Q-learning與資格跡組合起來的演算法。最初的像Watkins‘s Q(\lambda)。這個演算法只要是選擇的是greedy動作就正常的衰退資格跡,否則就把第一個非greedy動作之後的資格跡置為0。第六章中我們將expected Sarsa和q-learning統一了起來。第七章中我們有介紹了n步 expected Sarsa和n步Tree Backup。現在展示一個資格跡版本的tree backup,叫做Tree-Backup(\lambda)或者TB(\lambda)。這可以論證是Q-learning演算法的繼承者,因為保留了不需要使用Importance sampling的特性。

TB(\lambda)演算法的思想是很直接的。就像是普通的TD(\lambda),這個演算法就將每個長度的Treebackup組合起來。可以得到他們的遞迴形式:

同樣他也能夠近似寫為TD error的和的形式:

同樣需要更新資格跡,不過增加了一個動作概率:

和w的更新一起定義了TB(\lambda)的演算法。就像所有的半梯度法一樣,這個演算法不保證在使用函式近似的off-policy情形下保持穩定。為了保持穩定,需要結合下一節的演算法。

12.11 Stable Off-policy Methods with Traces

一些使用了資格跡在off-policy的情況下能夠保證演算法穩定。這裡介紹四種在本書介紹的標準概念裡最重要的四個演算法,包括了通用形式的自舉和discounting函式。所有的演算法都使用了線性函式逼近,不過對於非線性函式逼近的拓展也可以在論文中找到。

這四個演算法是:一,GTD(\lambda),是TDC演算法的資格跡形式。TDC演算法是雙狀態值的Gradient-TD演算法的改進版。二,GQ演算法,是Gradient-TD演算法的帶資格跡的動作值函式版本。三,HTD(\lambda)演算法是GTD(\lambda)和TD(\lambda)演算法的狀態值函式形式的混合。四,Emphatic TD(\lambda)演算法,是一步Emphatic-TD演算法到資格跡的延伸。

 

12.12 Implementation Issues

首先表格形式的演算法看起來似乎比一步演算法更難應用資格跡。簡單的實現就需要在每個時間對每個狀態更新它的值函式估計和資格跡。這對於傳統的順序計算計算機來說實現起來很有問題。還好引數\lambda和引數\gamma以及大部分狀態的資格跡分量都接近0,只有那些擁有明顯大於0的資格跡的狀態需要被更新來逼近演算法。

實際上在傳統計算機上實現的演算法可能只會跟蹤那些有明顯大於0的資格跡的狀態。這樣就能夠在表格型演算法中應用資格跡。當函式逼近方法使用了之後,不使用資格跡的計算優勢就會變小。因此表格演算法對於資格跡的計算複雜度來說是最壞的場景。

 

12.13 Conclusions

資格跡與TD error的結合提供了一個高效增量形式的在MC和TD演算法之間轉換和選擇的方式。第七章介紹的n步演算法也能做到,但是資格跡方法更加通用,學習速度更快而且共不同計算複雜度的選擇。這一章主要介紹了優雅新興的資格跡方法的理論解釋。這個方法能夠用於on-policy和off-policy,也能適應變化的自舉和discounting。這個理論的一方面是true online方法,它能夠精確複製計算量特別大的理論演算法的結果,而且保留了傳統TD演算法計算的親和力。另一方面是對於從更易理解的forward-view的方法到更容易計算的backward-view方法的轉換推導。

第五章提到MC演算法可以在非馬爾科夫的任務中有優勢,因為它不使用自舉。因為資格跡方法使得TD演算法更像MC演算法,因此帶資格跡的TD也能夠得到這種優勢。如果想用TD演算法的一些特性而任務又是部分非馬爾科夫的,就可以選擇使用資格跡形式的TD。

通過調整\lambda我們可以將資格跡方法放置到MC到一步TD方法之間的任一個位置。對於應該把它放在哪還沒有理論解釋,但是經驗告訴我們對於步驟比較長的任務使用資格跡比不使用效果更好。在兩個方法中間的位置取得的效果一般比較好。雖然現在還不能夠非常清楚地使用這個方法。

使用資格跡方法需要比一步TD方法更多的計算量,但是它能夠帶來更快的學習速度。一般將資格跡用在資料比較稀疏而且不能重複的過程中,經常用在online的應用。而對於產生資料方便的時候經常不使用資格跡。