【機器學習筆記】強化學習概述


作者:老董
鏈接:https://zhuanlan.zhihu.com/p/34298295
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

目前關於強化學習(RL)的論述和公開課程已經很多了,雖然已經有了不少深入了解的文章,但是我覺得為了能夠更好地理解RL並對其開展研究,還是需要暫時挪開放大鏡,給予其一個宏觀地了解。

所以本文我希望從實際問題的角度入手,逐漸地將相關的概念都串起來。盡可能從概念而不是理論上去理解---做到既知樹木又見森林。所以本文合適對RL有過了解但對整體概念還有點模糊的同學看,比如筆者~ 。

同時也因為概念性的理解,所以若有什么地方講得不夠緊湊或不合理的還請多多包涵。

 

參考資料

主要參考:《Reinforcement Learning- An Introduction》第二版 Complete Draft ---若無特別說明,下文中所指的書即為本書

Edx公開課:BerkeleyX - CS188x_1

知乎:David Silver強化學習公開課中文講解及實踐

知乎:強化學習知識大講堂專欄

知乎:DQN從入門到放棄系列文章

 

3個問題

要想理解一個東西,尤其是理論性的。需要回答3個問題:
1. 這東西是什么?(What)
2. 為什么需要這東西?(Why)
3. 如何使用這個東西?(How)

 

RL是什么?

給定一個任務,RL就是一種通過和(可能未知的)環境不斷地交互進而習得最優策略(Ploicy)的針對計算機(Agent)的一種學習方法。

 

為何需要RL?

在任務中的某個狀態下,傳統的搜索策略需要一層層的往下搜索,需要消耗不少時間來計算該狀態下的(近似)最優操作,而RL可以直接習得一個從狀態到操作的映射---這個映射可以是個函數,也可以是個存儲狀態和操作的查詢表。所以RL在實時任務中總是能更快,也更節省內存地得到最優操作(action)。

另外,很多時候並不清楚任務的環境是如何和操作交互的。這個時候需要實際的探險,這個時候只能依賴RL這種“有探險精神”的方法,不斷地在實際交互中更新信息---這也就是為什么RL叫“強化學習”(又名:增強學習)。

最后,RL由於是直接從環境中進行學習,其習得的策略能更好的反應最近獲得的經驗,即若環境發生了改變,RL也能通過學習很快適應,而不用像搜索那樣重新人為的對環境進行建模修正。

所以需要RL的理由是:
1. 比傳統搜索更快;
2. 可以處理未知環境的任務;
3. 經驗主義,能更好地適應不斷變化的環境;

 

如何使用RL?

哦,這是個非常龐大的問題,因為這實際在問RL到底是怎么一個思考流程的,也是RL的核心問題。筆者會在下個章節詳細講述,但這里我們還是需要了解下RL的基本結構和構成要素:

  • 狀態( S )---一個任務中可以有很多個狀態,且我們設每個狀態在時間上是等距的;
  • 操作( A )---針對每一個狀態,應該有至少1個操作可選;
  • 回饋( R )---針對每一個狀態,環境會在下一個狀態直接給予一個數值回饋,這個值越高,說明該狀態越值得青睞;
  • 策略( \pi )---給定一個狀態,經過π的處理,總是能產生唯一一個操作a,即a=π(s),π可以是個查詢表,也可以是個函數;

以上就是RL中最基本的4大要素。總的來說,RL的思考流程就是:給定一個任務,agent會每隔固定的時間time step(以下簡稱step)得到一個狀態,此時agent需要根據預先設定的操作集合中選擇一個操作並實施,然后任務環境會對此做出反應,然后在下個step中agent又會獲得下個step的狀態和本step的回饋; 所以簡單的說,每個step agent干2件事:

  1. 獲取本step的狀態和上個step的回饋;
  2. 給出本step的操作並與環境交互;
流程圖,摘自書中第3.1節

另外,為了能夠習得最優策略,agent還會基於獲得的信息更新策略;這個更新可能是直接在和環境的交互中完成的,即線上(online)更新,也可能是在本次(episode)任務結束后線下(offline)更新的,當然可以同時線上線下更新。

注意:所有的操作都是僅僅基於本step獲取到的信息來完成的。換言之,在RL中的一個基本思想是認為只需要當前step的狀態信息即可給出一個合理的操作,而和本step之前的信息無關----這種認為未來的發展只和當下有關的特性叫馬爾可夫性。而由具有這種特性組成的狀態所組成的時間序列就叫馬爾科夫過程(Markov Process)。再加上每個狀態需要執行的操作(決策),整個過程就是馬爾科夫決策過程(Markov Decisioon Process,簡稱MDP)。可以認為現在的RL多數情況都是在建立在MDP的思想上的。

所以如何使用RL?

1. 給定一個任務;
2. 給定一個操作集合A;
3. 設計一個回饋函數R;
4. 設計一個方法,讓agent可以基於信息來更新策略;
5. 給定一個初始策略π;
6. 讓agent在環境中不斷地通過策略和環境交互並吸收新的信息及更新策略;

那么現在就有個很自然的問題---怎樣才能找到最優策略呢?

 

最優策略

在考慮如何尋找最優策略前,首先需要知道針對策略,怎么評價策略的優劣。

所謂沒有比較就沒有傷害,本質上評價策略的優劣就是比較兩個或以上策略哪個更好。那怎么比較呢?

假設現在讓agent玩象棋,定義agent下的棋為操作,初始局面或對方落子后的每一個局面為一個狀態,直到將死對方為勝利,否則失敗。若現在有兩個策略 \pi\pi' ,它們都勝利了。那能說兩個策略一樣好嗎?當然我們可以這樣去定義,但是經驗告訴我們,往往一個任務中並不是每個操作都是最優的。即極有可能同一個策略會在不同的棋局任務中有不同的結果,這樣顯然就無法比較不同策略的優劣了。

可以想象,雖然有點極端---若有一個策略 \pi ,其每個狀態下的操作的結果都能優於另一個策略 \pi' 對應狀態下的結果,那顯然可以說策略 \pi 更優。為何?通俗的理解就是:不管站在狀態哪個角度, \pi 的表現總是比 \pi' 好,那總的來說當然 \pi 更好咯。

這里需要先給出個在RL中經常用到的兩個概念:

  1. v_{\pi}(s)指在給定策略 \pi 下,狀態 s 在該策略下的期望回報(return,注意不是回饋reward);
  2. q_\pi(s,a) 指在給定策略 \pi 下,狀態 s 在該策略下執行了操作a后的期望回報;

兩者的區別在於前者表示的是一種期望回報,而后者則是在給定具體的操作 a 下的期望回報。

回到剛剛的策略話題。那么即對所有 s ,若滿足 q_\pi(s,a)\geq q_{\pi'}(s,a) ,則有 \pi>\pi' 。那么自然所謂得最優策略 \pi 應該滿足:

 q_(s,a)\doteq\max_\pi q_\pi (s,a) \tag{1} \

v*(s)\doteq \max_\pi v_{\pi}(s) \tag{2}

這里以式1為例,我們會很自然地問:給定一個狀態 s ,怎么定義一個操作 a 的好壞?

之前說過,針對每個狀態,回饋 R 越高越好。也就是針對每一個狀態,會對其有一個即時反饋,即回饋 R 。但是這個 R 只是針對某一個狀態的即時反饋,顯然作為一個理性的agent,應該有長遠的眼光。若只針對 R 來選擇針對每個狀態的操作就太短視了。既然一個任務只有等到結束時(暫不考慮連續任務/continuing task)才能知道是否完成,則要評估某時刻 t 的狀態 S_t 的估值,合理的做法是將該狀態之后所有的回饋全部考慮進來:

 G_t = R_{t+1}+ R_{t+2}+...+ R_{T}

而考慮到時間因素,那么應該再增加一個折扣因子,越往后折扣的越多。即:

 G_t = R_{t+1}+ \gamma R_{t+2}+\gamma^2R_{t+2}...=\sum^{\infty}_{k=0}\gamma^kR_{t+k+1}

這種考慮所有后續結果的回饋就是期望回報(return),簡稱回報。另外由於實際任務中往往一個操作后有很多不同的狀態(注:每個狀態都會一個固定的反饋 R ),所以其中的 R 需要考慮后續的狀態轉移概率,即針對狀態 s_t 的回饋 R_{t+1} 有:

R_{t+1}=\sum_{s_{t+1},r_{t+1}}p(s_{t+1},r_{t+1}|s_{t},a_t)r_{t+1}

所以針對某個特定的狀態和操作--- q(s_t,a_t) 有:

\begin{eqnarray} q(s_t,a_t) &=& \sum_{s_{t+1},r_{t+1}}p(s_{t+1},r_{t+1}|s_{t},a_t)r_{t+1}+\sum_{s_{t+2},r_{t+2}}p(_{t+2},r_{t+2}|s_{t+1},a_{t+1})r_{t+2}+...\\&+&\sum_{s_{T},r_{T}}p(s_{T},r_{T}|s_{T-1},a_{T-1})r_{T} \end{eqnarray}

同時,由於任務中的每個狀態操作對(以下簡稱 Q)的估值都是這種形式,所以可遞歸地寫成:

q(s_t,a_t) = \sum_{s_{t+1},r_{t+1}}p(s_{t+1},r_{t+1}|s_{t},a_t)[r_{t+1}+ \gamma q(s_{t+1},a_{t+1})]

這里我們發現,后續使用的狀態估值是用的一個特定的操作 a_{t+1} ,而每個狀態下所選擇的操作又都是跟着策略走的,即所求的值應該是基於某個特定的策略,比如 \pi 。所以該公式應該加上策略標志:

q_\pi(s_t,a_t) = \sum_{s_{t+1},r_{t+1}}p(s_{t+1},r_{t+1}|s_{t},a_t)[r_{t+1}+ \gamma q_\pi(s_{t+1},a_{t+1})]

上式是直接考慮每個 Q的估值;若只考慮每個狀態的整體估值,那么同樣的思路,可得:

v_\pi(s_t)=\sum_a \pi(a|s_t)\sum_{s_{t+1},r_{t+1}}p(s_{t+1},r_{t+1}|s_{t},a_t)[r_{t+1}+ \gamma v_\pi(s_{t+1})]

上面兩個式子就是RL中經典的狀態估值公式了,其有個很學術的名字叫貝爾曼(Bellman)方程。同時根據最優策略的定義,其每個狀態的估值都應滿足:

v_*(s_t)=\max_a\sum_{s_{t+1},r_{t+1}}p(s_{t+1},r_{t+1}|s_{t},a_t)[r_{t+1}+ \gamma v_*(s_{t+1})] \\ q_*(s_t,a_t) = \sum_{s_{t+1},r_{t+1}}p(s_{t+1},r_{t+1}|s_{t},a_t)[r_{t+1}+ \gamma\max_{a_{t+1}}q_*(s_{t+1},a_{t+1})]

上面這2個公式就是所謂的最優貝爾曼方程了。

最后為了表述方便,我們去除表示當前step的下標 t ,並用 ' 代替 t+1 ,就有了針對狀態值的(最優)貝爾曼方程:

\begin{eqnarray} v_\pi(s)&=&\sum_a \pi(a|s)\sum_{s',r'}p(s',r'|s,a)[r'+ \gamma v_\pi(s')] \tag{3} \\ v_*(s)&=&\max_a\sum_{s',r'}p(s',r'|s,a)[r'+ \gamma v_*(s')] \tag{4} \end{eqnarray}

以及針對 Q的(最優)貝爾曼方程:

\begin{eqnarray} q_\pi(s,a) & = &\sum_{s',r'}p(s',r'|s,a)[r'+ \gamma\sum_{a'}\pi(a'|s') q_\pi(s',a')] \tag{5} \\ q_*(s,a) &= &\sum_{s',r'}p(s',r'|s,a)[r'+ \gamma\max_{a'}q_*(s',a')] \tag{6} \end{eqnarray}

記住這4個公式!其涵蓋了RL中所有基本元素。講白了,找最優策略就是找可以滿足最優貝爾曼方程的策略!

 

如何尋找最優策略

概念清楚了后,接下來要解決的就是如何尋找了。如上所述,最優策略就是能滿足最優貝爾曼方程的策略,可具體怎么找呢?

思路:給定一個策略,不斷地更新該策略,使其接近最優策略。

我們知道,若兩個策略滿足其中一個策略 \pi 的每個狀態(或 Q,以下略)的估值都要優於或等於另一個策 \pi' ,我們就說 \pi \geq \pi' 。換言之, \pi 更好。

若現在針對某個 \pi ,我們找到了一個新的策略 \pi' ,其只針對原策略中的一個狀態進行了改進,使其狀態估值比原策略更好,那也可以說 \pi' \geq \pi ---why? 書中(P63)作者用了大量公式從理論證明了。但筆者認為這個可以很直觀地理解---若其他狀態因為這個狀態的改進而受到影響,那么由於整個狀態估值都是由加乘法組成的,所以對於新策略的每個狀態估值,只會更優不會更差,因此有 \pi' \geq \pi

現在很清楚了,只要不斷地更新策略,哪怕每次只改進一個狀態的操作,那么長此以往,也定能找到最優策略 \pi*

 

3大主流尋策法

尋策法1: 動態規划

現在假設一個最完美的設定:給定一個任務,我們知道關於該任務的所有狀態下的的回饋、轉移概率和每個狀態可用的操作集合。現需找到最優策略,具體該怎么做呢? 一種普遍的做法是“策略迭代”法:

策略迭代:摘自書中第4.3節

策略迭代的思路:
1. 初始化;
2. 首先給定一個策略,不斷地迭代使得最后能夠得到關於該策略下各個狀態的估值;
3. 有了估值,就可以着手針對每個狀態來更新策略了;

而我們知道,哪怕就是改進一個狀態的操作也可以提升整個策略,而改進了策略后,自然地新策略的估值需要重新評估。所以第2和3步需要周而復始的循環直到發現某個策略足夠穩定(沒有改進的空間了),那就說明我們找到了最優策略。

但上述這種做法有個問題---其每次更新策略估值時把每個狀態都更新了n多遍,感覺有點浪費時間。因為我們更新狀態估值的真正目的只是為了通過比較某狀態下各操作的回報差異,進而根據貝爾曼方程選擇針對不同狀態選擇最優操作,所以每個狀態的估值也許並不需要絕對精確。基於這種思想就催生了“值迭代”法:

值迭代:摘自書中第4.4節

“值迭代”的基本思想是:

雖然起初通過max更新的最優策略下的估值是基於不完整的狀態信息的,但每個狀態總是有一個最優操作的。那么通過不斷地迭代更新,總是有機會能先找到某個狀態下的最優操作,保證其足夠平穩(即該狀態下的操作不會隨着迭代經常變)。然后就能以點破面,找到更多周邊的平穩的最優估值。久而久之,平穩的狀態會越來越多,最后也就能找到最優策略了。

可喜的是,不管是策略迭代又或是值迭代的可收斂想法是可從理論上證明的,但證明的原理好像不同。分別是通過“單調有界”和“巴拿赫不動點”定理證明的(這個筆者並不很清楚)。

那么具體那種能更快收斂呢?目前沒有理論的證明,但經驗上值迭代總是能更快地收斂。而不管是策略迭代還是值迭代又或者其他變種,這種通過估值和改進策略的方法統一為GPI,如圖:

 

GPI:摘自書中第4.6節

注:上述給出GPI法都是站在對狀態估值的角度,同樣思路也可以給出基於 Q值的策略迭代和值迭代算法(此略)。而不管是策略迭代還是值迭代,都需要對所有狀態進行遍歷。這很低效,所以就有了針對性的異步動態規划的技術---比如,可以只對一些比較重要的狀態進行先行遍歷(參考書中P69之4.5節)。

可以認為在RL中,MDP框架給出了agent看待任務(環境)的視角,而GPI框架則告訴了agent如何對任務進行分析並學習的基本思想。而這類基於狀態和轉移概率”動態地去規划”策略的方法叫做動態規划(DP)法(更具體地說是采用了GPI框架的DP法)。

可見,DP法是一類線下(off-line)學習法,即其不需要真的和環境交互就能學到最優策略。而由於DP法中值的更新用到了后續狀態v(s'),我們說這種做法叫自舉(bootstrapping)。DP法在理論上總是能保證找到最優策略,但這類方法有個很理想假設:即開頭說的我們知道關於該任務的所有狀態下的的回饋,和轉移概率和每個狀態可用的操作集合。換言之,我們對任務的環境(模型)完全可知。然而真實的情況真的有那么好嗎?即便如此,若任務狀態空間很大,又如何保證學習效率呢?

 

尋策法2: 蒙特卡洛法

為了解決實際任務種多數是不知道模型的問題,所以需要開發一種可以不依賴模型的方法來獲取信息。可以想象,最直接的方法是“開荒”---直接讓agent在任務中根據真實反饋來獲取必要信息。於是就有了蒙特卡洛(MC)法。

MC法基本思想: 通過在實際任務中的交互,記錄下每個實際遇到的狀態的回饋。然后通過n個回合(episode)的任務后,對每個遇到的狀態求算數平均---即為狀態的估值。 由於同一個狀態可以在一個回合中多次碰到,所以根據是否考慮所有的同狀態,可以分為first-visit和every-visit兩種模式,2種方法各有利弊。

注意,由於MC法中沒有狀態轉移概率,所以若只是對狀態v(s)估值,在尋策時無法找到某個狀態的最優操作,所以這里只有對 Q值估計才有意義。
而又因為MC法中沒有狀態轉移概率,所以為了找到最優策略,必需盡可能多的在實際任務種遍歷到足夠多的 Q,即需要足夠多的Exploration。 因為這個約束,就引出了一個在無模型(轉移概率)尋策法(比如MC)中所特有的問題:

因為對環境的無知,所以為了收集資料需要探索Exploration,所以就不能改進策略。但根據GPI思想,為了找到最有策略又需要改進策略,而這個會導致某個狀態下(基於當前基本是不完整所以不合理的估值)偏愛某個特定的操作,即Exploitation,而忽視其他操作,這樣就無法收集到足夠的資料。

那怎么去權衡Exploration-Exploitation呢?這就引出了RL無模型法中的另一個重要概念:在策(on-policy)和離策(off-policy)

在策(on-policy): 既然既要改進策略又需要保證探索,那么就設計一個策略(如 ε-soft策中的ε-greedy策略),使得其有比較大的概率在任務中利用目前探索到的最優操作,而以比較小的概率隨機選擇一個其他操作來探索。這樣就保證了Exploration-Exploitation的平衡,如下圖:

 

在策版本的MC算法:摘自書中第5.4節

可以證明若采用的ε-soft策略(即保證每個操作都有可能被選擇),經過足夠多的迭代,其可保證找到ε-soft空間下的下的最優策略---書中p83 5.4節。

離策(off-policy): 既然既需Exploration也需要Exploitation,那為什么不設計兩個策略呢?一個專門負責實際探索,一個專門負責尋找最優策略。

這里負責實施的策略叫做行為策略(behavior policy)設為b,負責學習的策略為目標策略(target policy)設為π。而由於π本身並沒有樣本,需要從b策略產生的樣本回報來估算,所以需要通過兩個策略的關系來推測---由此引入統計學中的重要性采樣:

 

重要性采樣:摘自書中第5.5節

這個參數 \rho 就是用來調整某個樣本回報G的系數。可見,該參數意義就是若目標策略π選擇某個操作的概率大於b選擇該操作的概率,那么應該放大G的效果,反之則應該縮小。而總體上為了計算估值有2種方式,一種是通過普通加權平均的普通模式:

 

普通加權:摘自書中第5.5節

另一種就是考慮各個回合不同權重的經典加權模式:

 

經典加權:摘自書中第5.6節

這里使用大寫的 V(s) 代表狀態 s 的“估值”,下文的 Q(s,a) 同理也是估值。

由於分母不同,可見普通模式有高方差但低偏差(即樣本足夠真實但泛化性較差),而加權模式則相反。就實際情況而言,加權模式效果會比較好,而普通模式則極有可能因為高方差而無法收斂。不過根據書中說法,在函數擬合中普通模式也是有用武之地的。
注意:為了保證這個p系數是有意義的,必需保證π中的每個會被選擇的操作都有一定可能被b所選擇。

 

離策版MC法:摘自書中第5.7節

上圖就是off-policy的MC法了。這里特別注意看下對 Q值更新這一句。我們知道若是求算術平均的話可以寫作:

\begin{eqnarray} Q_{n+1}&=& {1\over n}\sum_{i=1}^n G_i\\&=&{1\over n}(G_n+(n-1){1\over n-1}\sum_{i=1}^{n-1} G_i)\\&=&{1\over n}(G_n+(n-1)Q_n)\\&=&Q_n+{1\over n}(G_n-Q_n) \end {eqnarray}

這里的 Q_{n+1} 指的是給定某個特定狀態 s 和操作 a ,第 n+1 回合的估值。可見,所謂的算數平均 Q_{n+1} 就等價於是之前求的算術平均值 Q_n 加上最新獲得樣本回報 G_nQ_n 的差異。這個直觀上也很好理解---一個新的估值總是建立在之前的經驗上的,然后具體要修正的部分取決於新樣本和經驗上的差異。當每個樣本所占的權重是一樣的時候,這個差異所占的比例應該是 1\over n 。 類似地,對於經典加權平均的版本,可得:

\begin{eqnarray} Q_{n+1}&=&Q_n+{W_n\over C_n}[G_n-Q_n], \space\space n\geq 1 \\&其中&\\ C_{n+1}&=& C_n+W_{n+1} \end{eqnarray}

按照算術平均的概念,這個 1\over n 會越來越大,即新的樣本所含的話語權會越來越小。可見在RL中這種設定並不合理,所以使用加權模式的做法更好。

而更一般地,我們可以將該差異的比例值抽象為 \alpha 。由於其決定了對新樣本的學習程度,我們也管它叫學習率,所以該估值就有了更一般的形式: Q_{n+1}=Q_n+\alpha(G_n-Q_n)
這種形式的更新由於不需要像傳統做法那樣將每個樣本的值都存放在內存中,所以是一個很有效率的做法---被稱為遞增法(Incremental Implementation)。

總的來說, \rm MC 法不管是哪種形式,其總算是給出了一種基於無模型的方法,可操作性比 \rm DP 法更強。但作為一個線下學習方法,其只有等到每個回合結束后才能對策略進行更新,效率不高。那該怎么克服這個問題呢?

 

尋策法3:時間差法(Temporal Difference)

為了克服MC法只有等到回合結束才能更新的弊端,而同時又要保證無模型的前提。自然會想:真的有必要等到回合結束后才能夠更新估值嗎?

為了便於說明,我們將之前提到的遞增式估值公式寫成如下形式:

Q_{n+1}(s,a)=Q_n(s,a)+\alpha[G_n-Q_n(s,a)]

這里為了不用等到回合結束才能更新估值,我們對 G_n 做下改造,其中的s’代表同一回合中的下一step的狀態, a' 泛指該 s' 狀態下的某一操作:

G_n=r+Q(s',a')

上式直接將當前狀態的回饋和下一狀態的估值結合在一起作為本狀態的回報 G_n ,這種方法叫做TD法。

那么這種方法靠譜嗎?幸運的是,有理論證明在保證學習率足夠小的情況下,TD法的估值是可以收斂的。至於其和MC法孰優孰劣,目前雖無理論證明,但是一般情況下TD法總是能比MC法更快收斂。(這類方法是目前RL界的主流,務必記住)

同樣的因和MC法一樣都是無模型法,所以會有在策和離策2種情況:

 

sarsa算法:摘自書中第6.4節

上圖就是在策形式的TD法了,一般叫sarsa。下圖是離策版本的TD法,一般叫Q-learning:

Q-learning算法:摘自書中第6.5節

注意,在Q-learning中其Q值的估算是直接用到下個狀態在目標策略π下的估值,因此,這里不需要像MC的離策版那樣使用重要性采樣系數。

可以通過Cliff Walking任務來比較下Sarsa和Q-Learning思想上的區別:

 

sarsar和Q-learning差異,cliff-walking演示:摘自書中第6.5節

可見:Sarsa因為會根據e-greedy(非最優)的策略操作來學習估值並實戰應用,所以在這類框架下,其找到的“最優”策略會為了規避e-greedy策略本身的探索風險而繞遠路,但相應的其在訓練中的平均得分較高;相反Q-Learning因為在后台是學習的最優策略的估值,則基於此agent在實際交互中最后所選擇的操作會因為e-greedy策略中探索因子而收到影響,所以得分並不高。 一句話:Sarsa要面子不要里子,Q-Learning要里子不要面子。

關於Q-learning這一部分內容可以參考這個視頻:Active Reinforcement Learning -- Q-Learning

一般來說,人們傾向於使用Q-Learning這類離策學習方法,因為其只要結果收斂,則找到的一定是最優策略。但問題正在於離策法的收斂性不能絕對保證,這也是目前RL中比較熱門的研究課題。

 

尋策法總結

到目前為止,我們已經討論了3大類RL尋策方法,分別是需要模型的DP法、不需要模型的線下學習MC法及不需要模型且可以在線學習的TD法。這些方法的屬性大致如下:

 

各類方法對比圖

讓Agent學會舉一反三:函數擬合(Function Approximation)

前面講述的所有方法都有個共同點---通過將每個狀態(或 Q值)值保存下來,然后不斷更新---即查表法。不難理解,現實中碰到的很多任務其狀態空間非常的大,所以若是像之前講述的根據每一個狀態進行估值(即查表法),顯然不現實。所以必須有一種辦法可以通過已觀測到的狀態來泛化推測其他還未曾觀測到的狀態估值。

我們知道人從來不可能遇到同一條河流2次,但我們依然可以對過往的現實進行總結並將總結的規律利用到未來。原理正在於雖然同樣的狀態理論上是不可能再次碰到的,但狀態與狀態間總是有相似性的,其規律是共通的----鑒於該思想,我們可以采用函數擬合(Function Approximation)來對為曾見過的狀態給予一個較合理的估值。

(這里的內容若你對機器學習中的監督學習比較熟悉的話會比較好理解)

類似於機器學習領域的監督學習,既然要擬合,那就要知道輸入、輸出以及優化的目標函數是什么。在RL中,輸入的是狀態,輸出的是該狀態的估值, Q值的情況類似。若使用常見的均方誤差作為優化目標,以w為參數,整個更新(學習)過程的公式就是:

\begin{eqnarray} w_{t+1}&=&w_t-{1\over 2}\alpha\nabla\left[v_\pi(S_t)-\hat v(S_t,w_t)\right]^2\\ &=&w_t+\alpha[v_\pi(S_t)-\hat v(S_t,w_t)]\nabla \hat v(S_t,w_t) \end{eqnarray}

 

所以,MC版的函數擬合算法就是:

 

帶函數擬合的MC算法:摘自書中第9.3節

但注意到,MC法中的“真標簽”可以寫成從某一time step到該回合結束后的整體回報 G_t,這是無偏的---梯度下降法這樣用沒問題。然而TD法這種需要在線學習的方法,我們只能將 v_\pi(S_t) 替換成對狀態 S_t 的估值,即:

w_{t+1}=w_t+\alpha[{U(S_t)}-\hat v(S_t,w_t)]\nabla \hat v(S_t,w_t)

那么利用基於bootstrapping的 \rm TD 法就可以寫成:

 

帶函數擬合的基本TD算法:摘自書中第9.3節

這種在真標簽中也使用了估值的梯度下降法叫“半梯度下降法”(semi-gradient descent)。

注意:這種方法不一定能保證收斂。

sarsa:

 

帶函數擬合的sarsa算法:摘自書中第10.1節

Q-learning:

從sarsa到Q-Learning只需將w的更新那句更改為:

w\leftarrow w+\alpha[R+\gamma arg\max_a \hat q(S',a,w)-\hat q(S,A,w)] \nabla\hat q(S,A,w)

常用的擬合模型

應該說但凡是可以在監督學習中使用的模型,都可以被用在RL中作為擬合的模型。最簡單的不外乎是線性回歸。復雜一點的有神經網絡。其他類型的模型詳見書中第9章的第9.4~9.9小節。

 

函數擬合法的收斂性

對監督學習有所了解的應該知道,收斂的保證需要訓練樣本滿足IID(即獨立同分布),或至少是近似IID。因此在RL的訓練中,但凡滿足以下全部3點的,則一定不收斂,否則可保證最終收斂:

  • 使用了函數擬合而不是表格法來訓練(增加了不可收斂的隱患);
  • 真標簽中使用了函數估值bootstapping(違反樣本的獨立性要求);
  • 使用了off-policy(違反樣本的同分布性要求);

上述三點的原話可參考書中第11.3節。

 

換個角度思考問題:策略梯度法(Policy Gradient)

考慮這樣一個問題:有一個開車任務需要agent學習,操作集是關於方向盤的旋轉角度的離散集合。那么很自然地,我們會知道當車輛需要經過一個左轉彎道時,若最優操作是左轉45°,那么左轉46°或44°的結果應該是差不大多的。然而,基於之前所討論的學習方法會有個很大的問題:e-greedy的策略極有可能會給出45°為最優操作,而其他所有操作均為同樣糟糕(概率)的操作。這種結果(尤其是在部分可觀測環境的任務中)明顯是不合理的。那么要怎么規避呢?

策略梯度法(以下簡稱:PG法)是另一種RL中的學習方法。相較於之前的方法需要知道每個狀態(或 Q值),PG法的思路是直接從指定狀態得到操作集的概率分布,然后根據分布選擇相應操作。可見計算概率分布的方式先天的解決了上述開車問題,這是PG法的一個優勢。而PG法的另一個優勢在於真實世界的很多任務的操作空間不是離散分布的,借助於PG法,可以讓agent更快的學習到相似操作的概率!。

由於是學習概率分布,所以一般來說PG法需要用到函數擬合來學習策略參數 \theta

J(\theta)=v_{\pi_\theta}(s_0)\tag{7}

\theta_{t+1}=\theta_t+\alpha{\widehat{ \nabla J(\theta_t)}} \tag{8}

 

式7的 J(\theta) 表示始於狀態  s_0的策略 \pi_\theta 的整體表現。而最終的目標就是通過式8學習到能使得整體表現越來越好的策略參數 \theta 。可見整個更新過程就是一個梯度上升法。現在問題是這個所謂的表現 J(\theta) 在理論上應該怎么表示呢?

可以證明,若服從策略 \pi 的狀態分布為 \mu(s) ,則衡量策略整體表現的 J(\theta) 是正比例於 \sum_s\mu(s)\sum_aq_\pi(s,a)\nabla_\theta\pi(a|s,\theta) 的(證明詳見書中p269)。那么有:

\begin{eqnarray} J(\theta)&\propto&\sum_s\mu(s)\sum_aq_\pi(s,a)\nabla_\theta\pi(a|s,\theta), \\&=&\mathbb E_\pi\left[\sum_aq_\pi(s_t,a)\nabla_\theta\pi(a|s,\theta)\right], \tag{9.1} \\&=&\mathbb E_\pi\left[\sum_a \pi(a|S_t,\theta)q_\pi(s_t,a){\nabla_\theta\pi(a|s,\theta)\over \pi(a|S_t,\theta) }\right], \\&=&\mathbb E_\pi\left[q_\pi(S_t,A_t) {\nabla_\theta\pi(A_t|S_t,\theta)\over \pi(A_t|S_t,\theta) } \right], \\&=&\mathbb E_\pi\left[G_t{\nabla_\theta\pi(A_t|S_t,\theta)\over \pi(A_t|S_t,\theta) } \right],\tag{9.2} \\&=&\mathbb E_\pi\left[G_t\nabla_\theta {\rm ln}\,\pi(A_t|S_t,\theta)\right].\tag{9.3} \end{eqnarray}

上述公式就是一個從總體到樣本的過程。首先是式9.1這里去掉了狀態的分布,然后式9.2則是更進一步去掉了狀態 S_t 下的操作分布 a ,取而代之的是樣本 A_t ,以及最后的簡化形式9.3。之所以這么做的目的正在於RL的學習往往是基於不斷增加的樣本的,所以只有樣本化的公式才有意義。所以PG法的參數更新公式是:

 

\begin{eqnarray} \theta_{t+1}=\theta_t+\alpha G_t\nabla_\theta {\rm ln}\,\pi(A_t|S_t,\theta_t) \end{eqnarray}

 

REINFORCE算法

利用上述這種更新方法來更新參數的PG法叫做 \rm REINFORCE 法,也是最基本的一種方法。但這種方法的方差很大,因其更新的幅度完全某回合中依賴於 t 時刻到結束時候的真實樣本回報 G_t 。所以更常見的一種做法是引入一個基准線(baseline) b(s) ,於是有:

\theta_{t+1}=\theta_t+\alpha (G_t-b(S_t))\nabla_\theta {\rm ln}\,\pi(A_t|S_t,\theta_t)

至於這 b(s) 是什么,這取決於算法的設計。但一般的做法是取 b(s)=\hat v(s) ,如此一來 Gt-b(St)=Gt-\hat v(St) 。易得,這種情況下參數的更新主要取決於狀態 S_tA_t 相對於狀態均值的優勢。該值大於0,則代表有優勢---則更新后的參數會增加該操作的概率。小於0,則代表有劣勢---澤更新后的參數會減少該操作的概率。

 

帶有基准的REINFORCE算法:摘自書中第13.5節

根據書中的說法,可憑借經驗對 \alpha^w 取值,但 \alpha^\theta 的取值則需要針對策略的參數和回饋大小來認真設計。

另外,雖然PG法需要2組參數來分別應對狀態值和策略,但實際上這2組參數並不要求完全獨立。比如若使用神經網絡,那么可以設計2個輸出---一個針對策略的概率分布,另一個是針對狀態的估值,並共享一部分的參數。

Actor-Critic算法

REINFORCE法在更新時依然需要每回合的真實回報 G_t ,即這是一個線下學習的方法。那么相應的,使用狀態估值作為基准線的線上學習法的更新公式為: \begin{eqnarray} \theta_{t+1}&=&\theta_t+\alpha (G_{t:t+1}-b(S_t))\nabla_\theta {\rm ln}\,\pi(A_t|S_t,\theta_t)\\ &=&\theta_t+\alpha \left(R_{t+1}+\gamma\hat v(S_{t+1},{\rm w})-\hat v(S_{t+1},{\rm w})\right)\nabla_\theta {\rm ln}\,\pi(A_t|S_t,\theta_t)\\ \end{eqnarray}

關於Actor-Critic法的成功案例可以參考熱門的A3C算法

 

后記

筆記記錄到目前為止,基本是已經把RL中所有的核心概念都梳理了一遍。當然還有細節沒有講,比如TD估值的時候可以從單純的考慮下一step的估值到考慮下n個step的估值,即TD(N)(書中第7章)。甚至更進一步,調整agent觀察的角度,反向地去更新估值---即資格跡(eligibility trace)(書中第12章,參考1參考2參考3)。這些內容之所以不細說,一是為了結構簡介,二是筆者也未完全掌握,所以就不細說了 。

另外,筆者在學習RL的時候為了整理思路,也畫了一個思維導圖。目前還在完善中,可能有點亂。But anyway,希望能夠幫助到大家~


免責聲明!

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



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