花了一天時間大致了解了強化學習一些經典算法,總結成如下筆記。筆記中出現不少流程圖,不是我自己畫的都標了出處。
鋪墊
1. Bellman方程
在介紹強化學習算法之前先介紹一個比較重要的概念,就是Bellman方程,該方程表示動作價值函數,即在某一個狀態下,計算出每種動作所對應的value(或者說預期的reward)。
上面公式中:
- \(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),它的表達形式其實是類似的:
上面公式中的\(\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)\)表示的是在\(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'
- 返回第二步重復執行,直到滿足限定條件
Sarsa
1. 算法總結
2.算法流程圖
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值,因為幾乎有無限種可能。那么如何解決這種問題呢?
我們以自動駕駛為例,仔細想想可以知道,車的狀態是高維表示的(例如,當前的位置,車的油耗,路況等等數據來表示當前狀態),而動作相對來說可能是低維的(為方便說明,假設速度恆定,最后的動作只有方向盤旋轉角度)。
因為我們要做的是針對某一時刻的狀態選擇最合適的動作,所以我們可以把車狀態當做高維輸入數據,車的當前時刻的動作當做是低維輸出,我們可以對二者構建一個映射關系。
上面等式的含義就是對把狀態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表達式如下:
2)訓練算法
Playing Atari with Deep Reinforcement Learning
具體的算法還涉及到很多細節,例如Experience Replay,也就是經驗池的技巧,就是如何存儲樣本及采樣問題。由於玩Atari采集的樣本是一個時間序列,樣本之間具有連續性,如果每次得到樣本就更新Q值,受樣本分布影響,效果會不好。因此,一個很直接的想法就是把樣本先存起來,然后隨機采樣如何?這就是Experience Replay的意思。按照腦科學的觀點,人的大腦也具有這樣的機制,就是在回憶中學習。那么上面的算法看起來那么長,其實就是反復試驗,然后存儲數據。接下來數據存到一定程度,就每次隨機采用數據,進行梯度下降!也就是在DQN中增強學習Q-Learning算法和深度學習的SGD訓練是同步進行的!通過Q-Learning獲取無限量的訓練樣本,然后對神經網絡進行訓練。樣本的獲取關鍵是計算y,也就是標簽。
Policy Network
一個神經網絡,輸入是狀態,輸出直接就是動作(不是Q值)。
前面三種算法都是基於價值(value)的方法,即輸入當前狀態,然后計算出每個action的價值,最后輸出價值最大的action。而policy network則是根據某種策略直接輸出action,即\(A=\pi(S,\theta)\)或者表示為
1. loss函數構造
和前面算法類似,一個比較直觀的損失函數構造方式如下
但是上面的loss函數有個問題是式子中的\(r_1,r_2,...\)都是從環境中獲取的,那么如何對策略\(\pi(\theta)\)做參數更新呢?
我們換個角度想,如果一個action得到的reward多,我們就應該加大這個action的概率,反之就減少。所以目標函數可以寫成如下形式:
其中\(x\)表示某個action,\(p(x)\)和\(f(x)\)分別表示該action的概率和對應的reward。
更一般地說,\(f(x)\)應該是對action的評價指標,我們可以用reward,當然也可以用其他的指標,如Q值等等。換句話說Policy Network的核心就是這個評價指標的選取。
我們繼續分析上面的目標函數,將目標函數對策略網絡的參數\(\theta\)做求導:
由上面的求導可知,其實目標函數也可以寫成
下圖是文獻中的截圖,總結了多種評價指標,如Q,reward,TD等。
2. 算法流程圖
下圖中的A表示策略輸出的action,P表示該action對應的概率。
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。
2. 算法流程圖
DDPG
強推這篇博文,寫的非常好:Deep Reinforcement Learning - 1. DDPG原理和算法。
2. 算法流程圖
參考: