強化學習方法小結


花了一天時間大致了解了強化學習一些經典算法,總結成如下筆記。筆記中出現不少流程圖,不是我自己畫的都標了出處。

鋪墊

1. Bellman方程

在介紹強化學習算法之前先介紹一個比較重要的概念,就是Bellman方程,該方程表示動作價值函數,即在某一個狀態下,計算出每種動作所對應的value(或者說預期的reward)。

\[\begin{aligned} v(s) &=\mathbb{E}\left[G_{t} | S_{t}=s\right] \\ &=\mathbb{E}\left[R_{t+1}+\lambda R_{t+2}+\lambda^{2} R_{t+3}+\ldots | S_{t}=s\right] \\ &=\mathbb{E}\left[R_{t+1}+\lambda\left(R_{t+2}+\lambda R_{t+3}+\ldots\right) | S_{t}=s\right] \\ &=\mathbb{E}\left[R_{t+1}+\lambda G_{t+1} | S_{t}=s\right] \\ &=\mathbb{E}\left[R_{t+1}+\lambda v\left(S_{t+1}\right) | S_{t}=s\right] \end{aligned} \]

上面公式中:

  • \(s\)表示一個具體的狀態值,很自然\(S_t,S_{t+1},...\)就是表示當前時刻,下一時刻和下下一時刻,...,的狀態
  • \(R_{t+1}\)表示在\(t+1\)時刻所獲得的獎勵,其他同理
  • \(G_t\)表示\(t\)時刻總的回報獎勵,因為當前時刻做的某一個決定,未來不同時刻都會有不同形式的獎勵。(或者也可以這么理解:)
  • 前面\(G_t\)代表的是當前時刻某一個動作所帶來的的獎勵,而\(v(s)\)就表示在當前時刻的一個獎勵期望,即綜合考慮所能采取的所有動作之后我們所能獲得的獎勵,我們把\(v(s)\)稱為value function

上面這個公式就是Bellman方程的基本形態。從公式上看,當前狀態的價值和下一步的價值以及當前的反饋Reward有關。它表明價值函數(Value Function)是可以通過迭代來進行計算的!!!

2. 動作價值函數

前面介紹的Bellman方程是價值函數,它直接估計的是某個狀態下所有動作的價值期望,但是如果我們能夠知道某個狀態下每個動作的價值豈不是更好?這樣我們可以選擇價值最大的那個動作去執行,所以就有了動作價值函數(action-value function),它的表達形式其實是類似的:

\[\begin{aligned} Q^{\pi}(s, a) &=\mathbb{E}\left[r_{t+1}+\lambda r_{t+2}+\lambda^{2} r_{t+3}+\ldots | s, a\right] \\ &=\mathbb{E}_{s^{\prime}}\left[r+\lambda Q^{\pi}\left(s^{\prime}, a^{\prime}\right) | s, a\right] \end{aligned} \]

上面公式中的\(\pi\)表示動作選擇策略(例如以0.1的概率隨機選擇action,以0.9的概率按照Q網絡選擇value值最大的action)

其實我們最初的目的是找到當前狀態下應該執行哪個action,但是如果我們求解出最優的\(Q^{\pi}(s, a)\),其實也就等價於找到了這個action,這種求解方法也叫value-based方法

其實還有policy-based(直接計算策略函數)model-based(估計模型,即計算出狀態轉移函數,進而求解出整個MDP(馬爾科夫過程)過程) 方法,下面主要以介紹value-based為主。

最優的動作價值函數為:

\[Q^{*}(s, a)=\max _{\pi} Q^{\pi}(s, a)= \mathbb{E}_{s^{\prime}}\left[r+\lambda \max _{a^{\prime}} Q^{*}\left(s^{\prime}, a^{\prime}\right) | s, a\right] \]

有一點要注意的是\(Q^{*}(s, a)\)表示的是在\(t\)時刻的動作價值最優值,而仔細看看上面的等式可以發現,我們還需要求解出下一個狀態\(S'\)所對應的動作價值最優解。我們還在計算當前的Q值,怎么能有下個狀態的Q值呢?所以,在實際運用時,我們會使用之前的Q值,也就是說每次我們會根據新得到的reward和原來的Q值來更新現在的Q值,具體的可以看看下面的算法介紹。

Q-Learning

1. 算法總結

2. 算法流程圖

  • 初始化環境狀態S
  • 將當前環境狀態S輸入到Q網絡(即策略網絡,保存了action和value對應關系的table),然后輸出當前狀態的動作A
  • 更新Q網絡
    • \(Q_{target}=R+\gamma \max _{a} Q\left(S^{\prime}, a\right)\)表示Q真實值,簡單理解就是我在S狀態下采取了action,從環境中獲得了R的獎勵,然后對下一時刻的Q值應該也是有影響的,這個影響因子就是\(\gamma\)。另外這次是是一個遞歸的表達式,所以也可以看出離當前時刻越遠,我所采取動作的影響力就越低。
    • \(Q_{target}-Q(S,A)\)就是常說的TD(temporal difference) error,這個error在后面的DQN中會作為損失函數。
  • 更新當前狀態為S'
  • 返回第二步重復執行,直到滿足限定條件

圖片來源:[1]

Sarsa

1. 算法總結

2.算法流程圖

圖片來源:[1]

3. 和Q-learning的區別

其實可以看到Q-learning和Sarsa的最大區別就是對Q網絡的更新策略,Sarsa使用的是使用下次狀態所采取的的動作所對應的Q值來更新Q值,而Q-learning使用下次狀態S2的最大Q值用於更新。

感性的理解就是Sarsa會探索更多的可能性,而Q-learning會鐵定心地選擇最大可能性的選擇。因此,Q-learning雖然具有學習到全局最優的能力,但是其收斂慢;而Sarsa雖然學習效果不如Q-learning,但是其收斂快,直觀簡單。因此,對於不同的問題,我們需要有所斟酌。

DQN(Deep Q-learning Network)

通過計算每一個狀態動作的價值,然后選擇價值最大的動作執行。

1. 深度學習如何和強化學習結合?

前面介紹的Q-learning和Sarsa的action和state都是在離散空間中,但是有的情境下無法用離散空間表達,而且如果真的用離散空間表達,那么空間會非常巨大,這對計算機來說會很難處理。例如自動駕駛車的state和action,我們不可能用一個表格來記錄每個state和對應action的value值,因為幾乎有無限種可能。那么如何解決這種問題呢?

我們以自動駕駛為例,仔細想想可以知道,車的狀態是高維表示的(例如,當前的位置,車的油耗,路況等等數據來表示當前狀態),而動作相對來說可能是低維的(為方便說明,假設速度恆定,最后的動作只有方向盤旋轉角度)。

因為我們要做的是針對某一時刻的狀態選擇最合適的動作,所以我們可以把車狀態當做高維輸入數據,車的當前時刻的動作當做是低維輸出,我們可以對二者構建一個映射關系。

\[\begin{array}{l}{x \rightarrow f(x | W) \rightarrow y} \\ {S \rightarrow f(S | W) \rightarrow A}\end{array} \]

上面等式的含義就是對把狀態S作為輸入數據,然后經過映射函數\(f(S|W)\)后得到一個向量\(\left[Q\left(s, a_{1}\right), Q\left(s, a_{2}\right), Q\left(s, a_{3}\right), \ldots, Q\left(s, a_{n}\right)\right]\),這個卷積神經網絡做圖像分類任務時的輸出值的含義類似,每個位置代表不同action的value,我們可以選擇value值最大的作為S狀態的action。

那么這個映射函數就可以用 "萬能" 的神經網絡代替,也就是后面要介紹的DQN了。

2. 如何訓練DQN?

1) loss函數構造

我們知道,要訓練一個神經網絡,那么我們就需要構建loss函數,而這個loss函數的構建又需要真實的label和預測的label。

預測的label很好理解,其實就是最終得到的輸出向量嘛,那么真實的label是什么呢?其實就是前面Q-learning算法中介紹到的\(Q_{target}\),所以TD error表達式如下:

\[L(w)=\mathbb{E}[\underbrace{r+\gamma \max _{a^{\prime}} Q(s^{\prime}, a^{\prime}, w)}_{\text {Target }}-Q(s, a, w))^{2}] \]

2)訓練算法

Playing Atari with Deep Reinforcement Learning

具體的算法還涉及到很多細節,例如Experience Replay,也就是經驗池的技巧,就是如何存儲樣本及采樣問題。由於玩Atari采集的樣本是一個時間序列,樣本之間具有連續性,如果每次得到樣本就更新Q值,受樣本分布影響,效果會不好。因此,一個很直接的想法就是把樣本先存起來,然后隨機采樣如何?這就是Experience Replay的意思。按照腦科學的觀點,人的大腦也具有這樣的機制,就是在回憶中學習。那么上面的算法看起來那么長,其實就是反復試驗,然后存儲數據。接下來數據存到一定程度,就每次隨機采用數據,進行梯度下降!也就是在DQN中增強學習Q-Learning算法和深度學習的SGD訓練是同步進行的!通過Q-Learning獲取無限量的訓練樣本,然后對神經網絡進行訓練。樣本的獲取關鍵是計算y,也就是標簽。

marsggbo

Policy Network

一個神經網絡,輸入是狀態,輸出直接就是動作(不是Q值)。

前面三種算法都是基於價值(value)的方法,即輸入當前狀態,然后計算出每個action的價值,最后輸出價值最大的action。而policy network則是根據某種策略直接輸出action,即\(A=\pi(S,\theta)\)或者表示為

\[A^*=\underset{A}{\operatorname{argmax}}\,\pi(A|S,\theta) \]

1. loss函數構造

和前面算法類似,一個比較直觀的損失函數構造方式如下

\[L(\theta)=\mathbb{E}\left(r_{1}+\gamma r_{2}+\gamma^{2} r_{3}+\ldots | \pi(, \theta)\right) \]

但是上面的loss函數有個問題是式子中的\(r_1,r_2,...\)都是從環境中獲取的,那么如何對策略\(\pi(\theta)\)做參數更新呢?

我們換個角度想,如果一個action得到的reward多,我們就應該加大這個action的概率,反之就減少。所以目標函數可以寫成如下形式:

\[E_x[f(x)]=\sum_xp(x)f(x) \]

其中\(x\)表示某個action,\(p(x)\)\(f(x)\)分別表示該action的概率和對應的reward。

更一般地說,\(f(x)\)應該是對action的評價指標,我們可以用reward,當然也可以用其他的指標,如Q值等等。換句話說Policy Network的核心就是這個評價指標的選取。

我們繼續分析上面的目標函數,將目標函數對策略網絡的參數\(\theta\)做求導:

\[\begin{aligned} \nabla_{\theta} E_{x}[f(x)] &=\nabla_{\theta} \sum_{x} p(x) f(x) & \text { definition of expectation } \\ &=\sum_{x} \nabla_{\theta} p(x) f(x) & \text { swap sum and gradient } \\ &=\sum_{x} p(x) \frac{\nabla_{\theta} p(x)}{p(x)} f(x) & \text { both multiply and divide by } p(x) \\ &=\sum_{x} p(x) \nabla_{\theta} \log p(x) f(x) & \text { use the fact that } \nabla_{\theta} \log (z)=\frac{1}{z} \nabla_{\theta} z \\ &=E_{x}\left[f(x) \nabla_{\theta} \log p(x)\right] & \text { definition of expectation } \end{aligned} \]

由上面的求導可知,其實目標函數也可以寫成

\[\begin{aligned} L(\theta)&=-\sum \log p(x) f(x) \\ &=-\sum \log \pi(A | S, \theta) f(A|S) \end{aligned} \]

下圖是文獻中的截圖,總結了多種評價指標,如Q,reward,TD等。

image.png

2. 算法流程圖

下圖中的A表示策略輸出的action,P表示該action對應的概率。

marsggbo

Actor-Critic

上面的policy gradient的loss函數中其實僅僅使用了環境返回的reward,而沒有用到Q值。而如果我們希望用到Q值的話就需要用到Actor-critic網絡來實現。簡單理解,policy network其實就是actor,用來輸出動作,而critic則對應評價網絡,即評估actor選擇的動作的好壞,進而引導actor下次做出更好的選擇。

Actor的更新方法和上面policy network可以一樣。

critic的評價指標我們可以用Q來表示,那么真實值就用\(Q_{target}\)表示,和前面算法一樣,可以用Q-learning或者Sarsa的思路加上環境返回的reward作為真實Q值,或者也可以直接使用reward,最后采用one step Monte Carlo來更新critic。

image.png

2. 算法流程圖

marsggbo

圖片來源:4

DDPG

強推這篇博文,寫的非常好:Deep Reinforcement Learning - 1. DDPG原理和算法


2. 算法流程圖

圖片來源:3

參考:



MARSGGBO原創


如有意合作,歡迎私戳

郵箱:marsggbo@foxmail.com


2019-12-23 11:10:15




免責聲明!

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



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