1. 程式人生 > 實用技巧 >【RL】Vanilla Policy Gradient(VPG)

【RL】Vanilla Policy Gradient(VPG)

policy gradient的基本思想,是把總的獎勵表示為策略的函式,然後對這個函式做優化。在這一章中,我們將詳細地講解這個函式具體的形式是怎麼樣的、如何求出策略梯度,理解policy gradient這個演算法的基本框架。

關於MDP中動作與狀態是否是連續變數,一共有四種不同的組合。其中,狀態是有限分類變數的情況是不適合採用神經網路的,所以在這裡不予討論。在本章中,主要要考慮的情況是狀態 s s s為連續高維變數、動作 a a a為分類變數(有限個)的MDP。並且,設環境 P s , s ′ a P_{s, s^{\prime}}^{a} Ps,sa r 5 a r_{5}^{a}

r5a為時齊的,不隨時間的變化而變化。狀態與動作都是連續變數的MDP當然也可以用策略梯度法解決,但是由於這種方法效率不高所以平時不是很常見。

一 策略網路的構造

在策略梯度法中,我們首先要隨機初始化一個策略,然後不斷地讓策略沿著策略梯度的方向梯度更新,得到更好的策略,直到策略收斂。在實際的演算法中,我們必須把這個策略具體是什麼給先定義出來,然後才能開始更新。

在隨機且時齊的MDP中,策略是狀態到動作的對映。由於 a a a是分類變數,所以我們沒有辦法直接輸出 a a a,只能輸出一個條件分佈 π ( a ∣ s ) \pi(a \mid s) π(as)。為了擬合這個策略,我們定義一個神經網路policy net。網路的輸入是 s s

s,輸出是一個n維向量,對它進行softmax之後,得到n個不同的概率(其和為1),分別對應於最佳動作是各個 a a a的概率。設網路的引數為 w w w,則可以將網路輸出簡記為 π w ( a ∣ s ) \pi_{w}(a \mid s) πw(as),它表示在 s s s狀態下最佳動作是 a a a的條件概率。對於任何確定的 s s s,將 n n n a a a對應的 π w ( a ∣ s ) \pi_{w}(a \mid s) πw(as)相加,結果總是為1。

由於網路的輸入是高維向量,輸出是類別變數,我們可以將其與分類問題進行類比。在分類問題中,我們輸入一張高維、連續的圖片,輸出它屬於各個類別的概率;而在策略梯度中,我們輸入一個高維、連續的狀態,輸出最佳應對動作的概率。如下所示:

TODO

在分類問題中,我們可以定義loss為訓練集的label與輸出的predict向量的交叉熵。對於兩個離散概率分佈 p , q p,q p,q,其交叉熵的定義是 H ( p , q ) = − Σ i p ( i ) log ⁡ q ( i ) H(p, q)=-\Sigma_{i} p(i) \log q(i) H(p,q)=Σip(i)logq(i)。例如在上面的例子中,訓練集輸出的predict是(0.78,0.15,0.03,0.04),而訓練集的label是(1,0,0,0)。則label與predict之間的交叉熵為 − log ⁡ ( 0.78 ) -\log (0.78) log(0.78)。在訓練過程中,我們通過梯度法減少交叉熵,就意味著我們會讓第一維(“牛”對應的那個維度)的0.78變得更大,而讓後面三個維度(不是“牛”對應的維度)的0.15、0.03與0.04變得更小,這樣,我們輸出的predict向量就會更加接近label(1,0,0,0),這也意味著我們網路的準確性會更高。具體而言,我們也求出交叉熵關於網路引數 w w w的梯度,並讓 w w w沿著梯度方向下降。

分類問題是一個監督學習問題,所以訓練集中每一個輸入都有“標準答案”label供我們學習。但是現在我們討論的是強化學習,根本就沒有label,我們的目的也不是使得predict接近label,而是要使得策略能取得的期望獎勵最大。對於新的、複雜的問題,我們總是希望能夠將其化歸為我們熟悉的、簡單的問題。所以我們很自然就會想到,我們能否將強化學習問題也化歸為類似於監督學習問題的形式呢?

在這裡,我們不妨先假設我們的資料集具有 ( s , a , v ) (s, a, v) (s,a,v)形式。其中的 v v v代表在 s s s處採取動作 a a a得到的“後果”。這裡的 v v v可以近似理解為 A π ( s , a ) A_{\pi}(s, a) Aπ(s,a) V π ( s , a ) V_{\pi}(s, a) Vπ(s,a)(事實上還是有所不同,這一點在Actor-Critic的中會詳細介紹)。我們可以粗略地想象,當某 ( s , a , v ) (s, a, v) (s,a,v)中的 v v v比0大的時候,就說明 s s s處採取 a a a是好的,我們就應該增加 π ( a ∣ s ) \pi(a \mid s) π(as);而當 v v v比0小的時候,說明在 s s s處採取 a a a是不好的,我們應該減少 π ( a ∣ s ) \pi(a \mid s) π(as)。當 v v v很大的時候,則說明在 s s s處採取 a a a是特別好的,我們應該以比較大的力度去增加 π ( a ∣ s ) \pi(a \mid s) π(as)。換句話說,設 a a a是一個n維的one-hot向量label,網路輸出是一個n維的向量predict,則我們應該根據 v v v是否大於0決定讓predict遠離還是接近label,而我們應該根據 v v v的絕對值大小決定這種遠離或者接近的“力度”,即優化時候的步長。這樣一來,我們就可以把強化學習問題化歸成和監督學習差不多的形式。

TODO

我們還可以進一步將二者做如下對比:分類問題中,我們所追求的是“真理”。不妨將輸入的影象記為s,將輸出的類別記為a。我們想象每一條訓練集 ( s , a ) (s, a) (s,a)都有一個“權重”,但這些“權重”都是正的並且取值統統取值為1。這是因為“真理”只有0和1的分別,沒有折中委婉之處。對於每一條資料集 ( s , a , 1 ) (s, a,1) (s,a,1),我們都要更新網路引數 w w w,使得其輸出的predict能夠更加接近label,並且這種修改的力度是完全一樣的。這是由於“真理”是非此即彼的、沒有折中的,並且它對於每一條訓練集都是平等的;而對於策略網路,我們追求的不是“正確”而是“利益”。這個“利益”就是由 v v v來衡量的。不同的 ( s , a ) (s, a) (s,a)所對應的“權重” v v v是不一樣的,有正的也有負的,有大的也有小的。對於每一條資料集 ( s , a , v ) (s, a,v) (s,a,v),我們要根據 v v v是正負性決定到底是讓predict(即預測各個動作為最佳動作的概率)去接近還是去遠離label(即這個 a a a對應的one-hot向量),因為追求“利益”其實意味著趨利避害;並且,我們會根據 v v v的大小去決定這種接近或遠離的“力度”,是應該邁著大步去靠近,還是踱著碎步輕輕地接近。這是因為“利益”大的時候,我們追求的動力就大,“利益”小的時候,我們追求的動力就小。

從這個角度而言,我們可以認為分類網路是在用“權重相同的訓練集”去訓練,而策略網路則是在用“帶有不同權重的訓練集”去訓練。只要我們能夠找出衡量 ( s , a ) (s, a) (s,a)好壞的標準 v v v,得到 ( s , a , v ) (s, a, v) (s,a,v)形式的資料,就可以把訓練策略網路的過程看成“帶權重的監督學習”。但是,我們如何找出這個 v v v呢?找出 v v v之後具體應該按照什麼公式訓練呢?下面,我們要詳細地根據定義推匯出policy gradient的表示式。

二 策略梯度的計算

本節將要推匯出策略梯度的公式,並且講述計算它的方法。假設策略網路的引數為 w w w,則可以將策略記為 π w \pi_w πw

在這裡,我們首先引入“軌道”的概念:設Agent從初始狀態開始,不斷地採取動作,進入下一個狀態,又進一步採取動作,進入再下一個狀態……這個連續的過程可以被記為 ( s 0 , a 0 , r 0 , s 1 , a 1 , r 1 , s 2 , a 2 , r 2 , … , s n , a n , r n ) \left(s_{0}, a_{0}, r_{0}, s_{1}, a_{1}, r_{1}, s_{2}, a_{2}, r_{2}, \ldots, s_{n}, a_{n}, r_{n}\right) (s0,a0,r0,s1,a1,r1,s2,a2,r2,,sn,an,rn)(此處的 s i , a i , r i {s}_{i}, {a}_{i}, {r}_{i} si,ai,ri分別表示在第 i i i個回合中的狀態、動作與獎勵),我們將其稱為“軌道”,記錄為 τ \tau τ

我們可以想象,在不同的 w w w下,軌道 τ \tau τ有不同的分佈,即 P π w ( τ ) P_{\pi_{w}}(\tau) Pπw(τ)。由於神經網路結構確定後, π w \pi_w πw是由 w w w決定的,我們將其記為 P w ( τ ) P_{w}(\tau) Pw(τ),它代表在我們選擇策略 π w \pi_w πw時,某一個具體的軌道出現的概率。

舉個簡單的例子,如果一條 τ \tau τ ( s 0 , a 0 , r 0 , s 1 , a 1 , r 1 , s 2 , a 2 , r 2 ) \left(s_{0}, a_{0}, r_{0}, s_{1}, a_{1}, r_{1}, s_{2}, a_{2}, r_{2}\right) (s0,a0,r0,s1,a1,r1,s2,a2,r2),則我們用策略 π w \pi_w πw走出軌道 τ \tau τ的概率應該是每一步中 s i s_i si作出 a i a_i ai決策的條件概率、產生 r i r_i ri的概率,以及進入下一個 s i + 1 s_{i+1} si+1的概率的聯合乘積。即:
P w ( τ ) = P ( s 0 ) π w ( a 0 ∣ s 0 ) P ( r 0 ∣ s 0 , a 0 ) P s 0 , s 1 a 0 π w ( a 1 ∣ s 1 ) P ( r 1 ∣ s 1 , a 1 ) P s 1 , s 2 a 1 π w ( a 2 ∣ s 2 ) P ( r 2 ∣ s 2 , a 2 ) P_{w}(\tau)=P\left(s_{0}\right) \pi_{w}\left(a_{0} \mid s_{0}\right) P\left(r_{0} \mid s_{0}, a_{0}\right) P_{s_{0}, s_{1}}^{a_{0}} \pi_{w}\left(a_{1} \mid s_{1}\right) P\left(r_{1} \mid s_{1}, a_{1}\right) P_{s_{1}, s_{2}}^{a_{1}} \pi_{w}\left(a_{2} \mid s_{2}\right) P\left(r_{2} \mid s_{2}, a_{2}\right) Pw(τ)=P(s0)πw(a0s0)P(r0s0,a0)Ps0,s1a0πw(a1s1)P(r1s1,a1)Ps1,s2a1πw(a2s2)P(r2s2,a2)
這其中, P ( s 0 ) P\left(s_{0}\right) P(s0)表示初始狀態的分佈,一般這是給定的。由於轉移概率 P s , 5 ′ a P_{s, 5^{\prime}}^{a} Ps,5a與獎勵的分佈 P ( r ∣ s , a ) P(r \mid s, a) P(rs,a)都是給定的,所以,軌道的分散式 P w ( τ ) P_{w}(\tau) Pw(τ)中,只有 π w ( a i ∣ s i ) \pi_{w}\left(a_{i} \mid s_{i}\right) πw(aisi)的部分是會隨著引數 w w w的變化而變化的。

對於一般的 τ \tau τ,可以將其表示為環境概率與決策概率的連乘形式:
P w ( τ ) = Π i = 0 n π w ( a i ∣ s i ) Π i = 0 n − 1 P s i , s i + 1 a i Π i = 0 n P ( r i ∣ s i , a i ) P_{w}(\tau)=\Pi_{i=0}^{n} \pi_{w}\left(a_{i} \mid s_{i}\right) \Pi_{i=0}^{n-1} P_{s_{i}, s_{i+1}}^{a_{i}} \Pi_{i=0}^{n} P\left(r_{i} \mid s_{i}, a_{i}\right) Pw(τ)=Πi=0nπw(aisi)Πi=0n1Psi,si+1aiΠi=0nP(risi,ai)
以上是一條很重要的公式,即“軌道 τ \tau τ關於 w w w分佈的公式”。我們可以看出,軌道分佈中受到 w w w影響的只有“主觀決策”對應的第一部分,即 Π i = 0 n π w ( a i ∣ s i ) \Pi_{i=0}^{n} \pi_{w}\left(a_{i} \mid s_{i}\right) Πi=0nπw(aisi),而其他兩部分都是由“客觀環境”所決定的。

我們這裡假設目標是極大化獎勵總和,即最大化的目標是 r ( τ ) = Σ t r t r(\tau)=\Sigma_{t} r_{t} r(τ)=Σtrt,而非隨著時間衰減的效用 Σ t γ t r t \Sigma_{t} \gamma^{t} r_{t} Σtγtrt(也可以理解為預設 γ = 1 \gamma=1 γ=1)。有人或許會認為,這種設定是不太合乎情理的,因為為了保證目標的期望有限,我們應該引入小於1的衰減因子 γ \gamma γ(如果設定時間上限,又會導致策略非時齊,也不太好)。在DQN中一直預設 γ < 1 \gamma < 1 γ<1。但是為什麼在policy gradient中,許多資料都預設 γ = 1 \gamma = 1 γ=1呢?原因如下:

我們說過,基於策略是一大類的強化學習的演算法,VPG只是其中最簡單的一種。在後面我們將會看到,如果設定 γ = 1 \gamma = 1 γ=1,這可以使得VPG與Actor-Critic演算法等價(這也意味著 ( s , a , v ) (s,a,v) (s,a,v)形式的資料集中,代表 ( s , a ) (s,a) (s,a)的“後果”的 v v v等於 Q π ( s , a ) Q_{\pi}(s, a) Qπ(s,a) A π ( s , a ) A_{\pi}(s, a) Aπ(s,a));如果設定 γ < 1 \gamma<1 γ<1,則會和Actor-Critic有所差別(這意味著 v v v會變成別的東西)。這一點在探究Actor-Critic演算法的時候,就可以從公式中看出其中的緣由。正是由於這個原因,所以絕大多數policy gradient的材料中會設定 γ < 1 \gamma<1 γ<1,使得我們對基於策略的方法能夠有一個比較一致的理解,並且也使得後面推導的公式會相對簡單。在這種設定下,我們要最大化的目標為 r ( τ ) r(\tau) r(τ),即 Σ t r t \Sigma_{t} r_{t} Σtrt。但事實上,即使設定 γ < 1 \gamma<1 γ<1,仍然可以按照下面的思路推匯出類似的公式。

在策略 π w \pi_w πw下,設我們的期望效用為 J J J,則 J J J應該是一個關於無窮維策略 π \pi π的泛函 J ( π ) J(\pi) J(π)。由於策略是神經網路,所以策略 π w \pi_w πw事實上由神經網路的高維引數 w w w決定的,所以我們可以認為 j j j是關於 w w w的有限維函式 J ( w ) J(w) J(w)。利用 r ( τ ) r(\tau) r(τ) P w ( τ ) P_w(\tau) Pw(τ),我們可以將期望效用 J J J寫成如下的形式:
J ( w ) = ∫ τ P w ( τ ) r ( τ ) d τ J(w)=\int_{\tau} P_{w}(\tau) r(\tau) d \tau J(w)=τPw(τ)r(τ)dτ
這個積分式的意思是,對於所有可能的軌道 τ \tau τ,將其發生的概率 P w ( τ ) P_{w}(\tau) Pw(τ)與其對應的獎勵 r ( τ ) r(\tau) r(τ)相乘並求積分。顯然,這個積分式表示的意思是(在引數 w w w下)Agent獲得的獎勵總和的期望,即:
J ( w ) = E w ( r ( τ ) ) J(w)=E_{w}(r(\tau)) J(w)=Ew(r(τ))
我們想求的“策略梯度”就是 ∇ w J ( w ) \nabla_{w} J(w) wJ(w)。在這裡,積分與梯度符號顯然可以交換次序。並且,由於只有 P w ( τ ) P_{w}(\tau) Pw(τ)含有 w w w,而 r ( τ ) r(\tau) r(τ)不含 w w w,所以:
∇ w J ( w ) = ∫ τ ( ∇ w P w ( τ ) ) r ( τ ) d τ \nabla_{w} J(w)=\int_{\tau}\left(\nabla_{w} P_{w}(\tau)\right) r(\tau) d \tau wJ(w)=τ(wPw(τ))r(τ)dτ
我們注意到,上式有一個 ∇ w P w ( τ ) \nabla_{w} P_{w}(\tau) wPw(τ)的部分。我們可以利用上面的第一個公式將 P w ( τ ) P_{w}(\tau) Pw(τ)展開,並且進一步化簡。但是,這樣化簡得到的表示式比較複雜,很難計算。我們應該尋找一種更加“聰明”的方法,使得我們能更加方便地計算 ∇ w J ( w ) \nabla_{w} J(w) wJ(w)

注意到,上面的 ∇ w J ( w ) \nabla_{w} J(w) wJ(w)仍然是一個積分式,積分的下標是 τ \tau τ。所以我們很自然地希望將其表示為 ∫ τ P w ( τ ) ∇ w f ( τ ) d τ \int_{\tau} P_{w}(\tau) \nabla_{w} f(\tau) d \tau τPw(τ)wf(τ)dτ的形式,其中的 f f f是某個函式。根據期望的定義,這個積分的結果就是 E w [ ∇ w f ( τ ) ] E_{w}\left[\nabla_{w} f(\tau)\right] Ew[wf(τ)]。這樣的形式更加簡便,並且也更容易計算——只要我們用當前的策略與環境互動取樣很多 τ \tau τ,並計算出梯度 ∇ w f ( τ ) \nabla_{w} f(\tau) wf(τ)的均值,就能將其作為 ∇ w J ( w ) \nabla_{w} J(w) wJ(w)的一個估計(因為在這種情況下,軌道 τ \tau τ是服從 P w ( τ ) P_w(\tau) Pw(τ)分佈的)。為此,我們利用如下的恆等式:
P w ( τ ) ∇ w log ⁡ P w ( τ ) = P w ( τ ) ∇ w P w ( τ ) P w ( τ ) = ∇ w P w ( τ ) P_{w}(\tau) \nabla_{w} \log P_{w}(\tau)=P_{w}(\tau) \frac{\nabla_{w} P_{w}(\tau)}{P_{w}(\tau)}=\nabla_{w} P_{w}(\tau) Pw(τ)wlogPw(τ)=Pw(τ)Pw(τ)wPw(τ)=wPw(τ)
現在,將其代入之前我們關於 ∇ w J ( w ) \nabla_{w} J(w) wJ(w)的式子中,可以得到:
∇ w J ( w ) = ∫ γ ( ∇ w P w ( τ ) ) r ( τ ) d τ = ∫ γ P w ( τ ) ∇ w log ⁡ ( P w ( τ ) ) r ( τ ) d τ = E w [ ∇ w log ⁡ ( P w ( τ ) ) r ( τ ) ] \nabla_{w} J(w)=\int_{\gamma}\left(\nabla_{w} P_{w}(\tau)\right) r(\tau) d \tau=\int_{\gamma} P_{w}(\tau) \nabla_{w} \log \left(P_{w}(\tau)\right) r(\tau) d \tau=E_{w}\left[\nabla_{w} \log \left(P_{w}(\tau)\right) r(\tau)\right] wJ(w)=γ(wPw(τ))r(τ)dτ=γPw(τ)wlog(Pw(τ))r(τ)dτ=Ew[wlog(Pw(τ))r(τ)]
上面的式子讓策略梯度化為了期望的形式,這已經足夠簡單。但是,這式子中 ∇ w log ⁡ ( P w ( τ ) ) \nabla_{w} \log (P_{w}(\tau)) wlog(Pw(τ))這個部分還是讓我們難免有些“摸不著頭腦”。所以,我們要將上面第一條公式代入以展開 P w ( τ ) P_w(\tau) Pw(τ),化簡 ∇ w log ⁡ ( P w ( τ ) ) \nabla_{w} \log (P_{w}(\tau)) wlog(Pw(τ))

我們說過, P w ( τ ) P_w(\tau) Pw(τ)可以展開成為一系列連乘的形式,其中與 w w w有關的部分只有 Π i = 1 n π w ( a i ∣ s i ) \Pi_{i=1}^{n} \pi_{w}\left(a_{i} \mid s_{i}\right) Πi=1nπw(aisi)。取了 log ⁡ \log log之後連乘變成求和的形式,即 log ⁡ ( P w ( τ ) ) \log (P_{w}(\tau)) log(Pw(τ))中所有與 w w w有關的部分為 Σ i = 1 n log ⁡ ( π w ( a i ∣ s i ) ) \Sigma_{i=1}^{n} \log \left(\pi_{w}\left(a_{i} \mid s_{i}\right)\right) Σi=1nlog(πw(aisi))。而由於我們要求的是 ∇ w log ⁡ ( P w ( τ ) ) \nabla_{w} \log (P_{w}(\tau)) wlog(Pw(τ)),所以只用考慮與 w w w有關的部分。我們可以得到:
∇ w log ⁡ ( P w ( τ ) ) = Σ i = 1 n ∇ w log ⁡ π w ( a i ∣ s i ) \nabla_{w} \log \left(P_{w}(\tau)\right)=\Sigma_{i=1}^{n} \nabla_{w} \log \pi_{w}(a_{i} \mid s_{i}) wlog(Pw(τ))=Σi=1nwlogπw(aisi)
將這個等式代入 ∇ w J ( w ) \nabla_{w} J(w) wJ(w)中,我們終於可以得到我們想要的結果。以下便是我們經過漫長的推導之後得到的最終結果:
∇ w J ( w ) = E w [ ( Σ i = 1 n ∇ w log ⁡ π w ( a i ∣ s i ) ) r ( τ ) ] \nabla_{w} J(w)=E_{w}[(\Sigma_{i=1}^{n} \nabla_{w} \log \pi_{w}\left(a_{i} \mid s_{i}\right))r(\tau)] wJ(w)=Ew[(Σi=1nwlogπw(aisi))r(τ)]
或簡記為:
∇ w J ( w ) = E w [ ∇ w log ⁡ ( P w ( τ ) ) r ( τ ) ] \nabla_{w} J(w)=E_{w}\left[\nabla_{w} \log \left(P_{w}(\tau)\right) r(\tau)\right] wJ(w)=Ew[wlog(Pw(τ))r(τ)]
這就是策略梯度的表示式。結合這個表示式,我們就可以得到策略梯度法的基本框架。下面,我們來詳細地講解一下整個演算法是如何進行的。

三 策略梯度演算法

首先,我們要定義一個策略網路,並隨機初始化網路引數。與其他的深度學習問題類似,我們要根據問題的複雜程度來設計網路的層數、每一層的神經元個數,以使得其能夠與問題複雜度相匹配的擬合能力。當然,這個過程可能需要多次除錯。然後,我們進行很多步如下的迭代,直到網路引數收斂。

TODO
在這裡插入圖片描述