天天看點

2.政策梯度(Policy Gradient)+Gradient Ascent目錄簡介基本思路符号目标函數 J ( θ ) J(\theta) J(θ)Gradient AscentTip1:Add a BaselineTip2:Assign Suitable Credit總結

目錄

深度強化學習目錄

簡介

政策梯度,顧名思義,就是優化政策的梯度。我們之前講了Policy-based和Value-based,而Policy-based方法就是直接訓練政策的一組參數。如何訓練?政策梯度就是一種方法。

基本思路

要訓練一個Policy-based的方法,其實隻需要三步。

  • 第一步,用一個神經網絡作為政策自身,神經網絡的參數為 θ \theta θ。
  • 第二步,設定一個Loss function,告訴神經網絡什麼樣的政策是好的。
  • 第三步,得到最佳政策。

符号

  • τ \tau τ:一輪遊戲中的具體過程(trajectory), τ = { s 1 , a 1 , r 1 , s 2 , a 2 , r 2 , … , s T , a T , r T } \tau=\{s_1,a_1,r_1,s_2,a_2,r_2,\ldots,s_T,a_T,r_T\} τ={s1​,a1​,r1​,s2​,a2​,r2​,…,sT​,aT​,rT​},是狀态-行為-獎賞的時間序列。
  • p ( τ ∣ θ ) p(\tau \vert \theta) p(τ∣θ):參數為 θ \theta θ時,采取過程 τ \tau τ的機率。
  • τ n \tau^n τn:根據 p ( τ ∣ θ ) p(\tau \vert \theta) p(τ∣θ)采樣出來的過程 τ \tau τ,上标 n n n代表是采樣第 n n n次的得到的過程。
  • R θ R_\theta Rθ​:參數為 θ \theta θ時在一輪遊戲中的累積獎賞, R θ = ∑ r t R_\theta=\sum r_t Rθ​=∑rt​。
  • R ( τ ) R(\tau) R(τ):遊戲過程中所擷取的獎賞的總和, R ( τ ) = ∑ t = 1 T r t R(\tau)=\sum_{t=1}^{T} r_t R(τ)=∑t=1T​rt​
  • π θ \pi_\theta πθ​:使用參數 θ \theta θ的政策 π \pi π。由于我們采取神經網絡,是以實際上政策 π \pi π和參數 θ \theta θ是基本可以看作綁定在一起的。

目标函數 J ( θ ) J(\theta) J(θ)

第一步沒什麼好說的,輸入狀态,輸出對每一個動作的選取機率,這就是神經網絡,至于具體用CNN還是ResNet之類的,看實際情況來決定,我們先來說說Loss function。

損失函數,就是衡量神經網絡的輸出 y ^ \hat{y} y^​,和最終目标 y y y之間的差距大小。但是強化學習并沒有那個給定的“最終目标”,他不會告訴你在s狀态下采取行為a是最優解,他隻會給你這個行為的reward。是以,這裡我們使用的不是“損失函數”,而是目标函數 J ( θ ) = R ˉ θ = E [ R θ ] = ∑ τ R ( τ ) P ( τ ∣ θ ) J(\theta)=\bar{R}_\theta=\mathbb{E}[R_\theta]=\sum_\tau R(\tau)P(\tau \vert \theta) J(θ)=Rˉθ​=E[Rθ​]=∑τ​R(τ)P(τ∣θ)。

我們的目标是最大化這個目标函數。

Gradient Ascent

關于gradient decent和gradient ascent的差別比較好了解,梯度下降是為了最小化,而梯度上升是為了最大化,是以我們這裡選擇梯度上升,進而得到最佳的參數 θ ⋆ \theta^\star θ⋆:

θ ⋆ = a r g max ⁡ θ R ˉ θ \theta^\star=arg\max_\theta{\bar{R}_\theta} θ⋆=argθmax​Rˉθ​

怎麼實作梯度上升呢?很簡單:

  • 選取一個初始值 θ 0 \theta^0 θ0
  • θ 1 ← θ 0 + η ∇ R ˉ θ 0 \theta^1\leftarrow \theta^0+\eta \nabla{\bar{R}_{\theta^0}} θ1←θ0+η∇Rˉθ0​
  • θ 2 ← θ 1 + η ∇ R ˉ θ 1 \theta^2\leftarrow \theta^1+\eta \nabla{\bar{R}_{\theta^1}} θ2←θ1+η∇Rˉθ1​
  • … \ldots …

這其中, ∇ R ˉ θ \nabla{\bar{R}_{\theta}} ∇Rˉθ​就是 R ˉ θ \bar{R}_{\theta} Rˉθ​的梯度,是一個向量,且向量中每一項是 R ˉ θ \bar{R}_{\theta} Rˉθ​對 θ i \theta_i θi​分量的偏微分 ∂ R ˉ θ ∂ θ i \frac{\partial \bar{R}_{\theta}}{\partial \theta_i} ∂θi​∂Rˉθ​​。

但如果直接這樣對每一項取偏微分,實際運算壓力太大了,是以我們作出轉換。

∇ R ˉ θ = ∇ ( ∑ τ R ( τ ) P ( τ ∣ θ ) ) = ∑ τ R ( τ ) ∇ P ( τ ∣ θ ) = ∑ τ R ( τ ) P ( τ ∣ θ ) ∇ P ( τ ∣ θ ) P ( τ ∣ θ ) = ∑ τ R ( τ ) P ( τ ∣ θ ) ∇ l o g P ( τ ∣ θ ) \begin{aligned} \nabla{\bar{R}_{\theta}}&=\nabla{(\sum_\tau {R(\tau)P(\tau \vert \theta)})}\\ &=\sum_\tau {R(\tau)\nabla P(\tau \vert \theta)}\\ &=\sum_\tau {R(\tau)P(\tau \vert \theta) \frac{\nabla P(\tau \vert \theta)}{P(\tau \vert \theta)}}\\ &=\sum_\tau {R(\tau)P(\tau \vert \theta)\nabla logP(\tau \vert \theta)}\\ \end{aligned} ∇Rˉθ​​=∇(τ∑​R(τ)P(τ∣θ))=τ∑​R(τ)∇P(τ∣θ)=τ∑​R(τ)P(τ∣θ)P(τ∣θ)∇P(τ∣θ)​=τ∑​R(τ)P(τ∣θ)∇logP(τ∣θ)​

這其中,第二步是由于 R ( τ ) R(\tau) R(τ)與 θ \theta θ無關,是以梯度可以移到裡面去。而第三步到第四步的轉換是簡單的高數基礎,即對數函數的微分等于其函數的倒數乘上函數内部的微分。又因為有求和符号和機率P,是以可以由機率分布的形式轉換成均值的形式,于是我們得到了公式2.1: ∇ R ˉ θ ≈ 1 N ∑ n = 1 N R ( τ n ) ∇ l o g P ( τ ∣ θ ) (2.1) \nabla{\bar{R}_{\theta}}\approx \frac{1}{N}\sum_{n=1}^{N} {R(\tau^n)\nabla logP(\tau \vert \theta)}\tag {2.1} ∇Rˉθ​≈N1​n=1∑N​R(τn)∇logP(τ∣θ)(2.1)

那麼接下來,我們來看看 ∇ l o g P ( τ ∣ θ ) \nabla logP(\tau \vert \theta) ∇logP(τ∣θ)等于什麼。

由于 τ = { s 1 , a 1 , r 1 , s 2 , a 2 , r 2 , … , s T , a T , r T } \tau=\{s_1,a_1,r_1,s_2,a_2,r_2,\ldots,s_T,a_T,r_T\} τ={s1​,a1​,r1​,s2​,a2​,r2​,…,sT​,aT​,rT​},是以有: P ( τ ∣ θ ) = p ( s 1 ) p ( a 1 ∣ s 1 , θ ) p ( r 1 , s 2 ∣ a 1 , s 1 ) p ( a 2 ∣ s 2 , θ ) … P(\tau \vert \theta)=p(s_1)p(a_1\vert s_1,\theta)p(r_1,s_2\vert a_1,s_1 )p(a_2\vert s_2,\theta)\ldots P(τ∣θ)=p(s1​)p(a1​∣s1​,θ)p(r1​,s2​∣a1​,s1​)p(a2​∣s2​,θ)…

其中不含 θ \theta θ的項都是由環境environment提供的機率,不需要考慮。又因為對于不含 θ \theta θ的項作出 l o g log log(連乘變求和)再偏微分後全部是0,是以有: ∇ l o g P ( τ ∣ θ ) = ∑ t = 1 T ∇ l o g p ( a t ∣ s t , θ ) (2.2) \nabla logP(\tau \vert \theta)=\sum_{t=1}^T \nabla logp(a_t\vert s_t,\theta) \tag{2.2} ∇logP(τ∣θ)=t=1∑T​∇logp(at​∣st​,θ)(2.2)

結合公式2.1和2.2,我們可以得到公式(約等于符号直接寫成等号了): ∇ R ˉ θ = 1 N ∑ n = 1 N ∑ t = 1 T n R ( τ n ) ∇ l o g p ( a t n ∣ s t n , θ ) \nabla{\bar{R}_{\theta}}=\frac{1}{N}\sum_{n=1}^{N} \sum_{t=1}^{T_n}{R(\tau^n) \nabla logp(a_t^n\vert s_t^n,\theta)} ∇Rˉθ​=N1​n=1∑N​t=1∑Tn​​R(τn)∇logp(atn​∣stn​,θ)

其中, T n T_n Tn​代表第n輪遊戲所持續的時間,上标n代表第n輪遊戲的a和s。

再次回顧疊代式 θ n e w ← θ o l d + η ∇ R ˉ θ o l d \theta^{new}\leftarrow \theta^{old}+\eta \nabla{\bar{R}_{\theta^{old}}} θnew←θold+η∇Rˉθold​,我們會發現 θ \theta θ的優化會使得某輪遊戲中的所有行動a在對應狀态s下出現的機率提升或降低。這是由于我們式子中的reward是 R ( τ n ) R(\tau^n) R(τn),是第n輪遊戲的整體收益。如果 R ( τ n ) > 0 R(\tau^n)>0 R(τn)>0,那麼 p ( a t n ∣ s t n , θ ) p(a_t^n\vert s_t^n,\theta) p(atn​∣stn​,θ)就會增大;反之就會減小。

這是很直覺也很管用的。假設我們計算的reward不再是一整輪遊戲而是某個具體的動作,比如說打飛機遊戲可以向左、向右、開火,而learning出來的結果是開火獲得了reward,那最後學出來的政策可能就隻會開火,而不會左右移動了。

而缺點在于,他增大或降低的是所有行為的機率,是以需要很多的訓練量,足夠的資料量才能保證訓練結果可靠,否則會出現很多不可信的“備援操作”。實際應用中,就是神經網絡要訓練很久。

至此為止,Policy Gradient基本就講完了,下面還有兩個可以優化的tip。

Tip1:Add a Baseline

在實際操作過程中,可能會出現所有 R θ R_\theta Rθ​都為正的情況,這是根據遊戲設計而定的,這就會出現一些問題。

比如說,某遊戲一共有三個動作 a 1 , a 2 , a 3 a_1,a_2,a_3 a1​,a2​,a3​,并且我們已知在狀态s下這三個動作增加的reward的關系是 r a 1 < r a 2 < r a 3 r_{a_1}<r_{a_2}<r_{a_3} ra1​​<ra2​​<ra3​​。如果在資料采樣的過程中,這三個動作都采樣到了,那當然沒關系,三個動作的p都會提升,且 a 3 a_3 a3​提升的幅度最大,進而導緻其他兩個動作的機率相應減小;但假設 a 3 a_3 a3​沒有采樣到, a 1 , a 2 a_1,a_2 a1​,a2​采樣到了,那麼 a 1 , a 2 a_1,a_2 a1​,a2​的機率必然提升(因為 R θ R_\theta Rθ​總為正),而 a 3 a_3 a3​的機率必然下降。

是以,我們希望保證 R θ R_\theta Rθ​能有正有負,是以公式變為: ∇ R ˉ θ = 1 N ∑ n = 1 N ∑ t = 1 T n ( R ( τ n ) − b ) ∇ l o g p ( a t n ∣ s t n , θ ) \nabla{\bar{R}_{\theta}}=\frac{1}{N}\sum_{n=1}^{N} \sum_{t=1}^{T_n}{(R(\tau^n)-b) \nabla logp(a_t^n\vert s_t^n,\theta)} ∇Rˉθ​=N1​n=1∑N​t=1∑Tn​​(R(τn)−b)∇logp(atn​∣stn​,θ)

其中,b就是baseline, b ≈ E [ R ( τ n ) ] b\approx \mathbb{E}[R(\tau^n)] b≈E[R(τn)]。

Tip2:Assign Suitable Credit

之前也說過了,我們是根據一整輪遊戲的結果來對所有 τ \tau τ上的行為,而非針對行為a本身。這是不公平的,顯然。有可能有一些行為是好的,但是其他行為是差的,進而導緻了不好的結果。雖然經過大數量的采樣可以基本保證好的行為得到正的獎賞,但我們可以考慮直接對行為進行獎賞或懲罰。

怎麼做呢?想法也很簡單。我們不再考慮整盤遊戲的 R ( τ n ) R(\tau^n) R(τn),而是從行為所在的時間點開始的累積獎賞 ∑ t ′ = t T n r t ′ n \sum_{t'=t}^{T_n}r_{t'}^n ∑t′=tTn​​rt′n​。又考慮到未來的獎賞受此時行為的影響較小,我們考慮添加一個折扣參數 γ \gamma γ,于是改為 ∑ t ′ = t T n γ t ′ − t r t ′ n \sum_{t'=t}^{T_n}\gamma^{t'-t} r_{t'}^n ∑t′=tTn​​γt′−trt′n​,這裡 γ \gamma γ上的 ( t ′ − t ) (t'-t) (t′−t)不是上标,而是幂次數。當然了, γ < 1 \gamma<1 γ<1。

于是我們得到公式:

∇ R ˉ θ = 1 N ∑ n = 1 N ∑ t = 1 T n ( ∑ t ′ = t T n γ t ′ − t r t ′ n − b ) ∇ l o g p ( a t n ∣ s t n , θ ) \nabla{\bar{R}_{\theta}}=\frac{1}{N}\sum_{n=1}^{N} \sum_{t=1}^{T_n}{(\sum_{t'=t}^{T_n}\gamma^{t'-t} r_{t'}^n-b) \nabla logp(a_t^n\vert s_t^n,\theta)} ∇Rˉθ​=N1​n=1∑N​t=1∑Tn​​(t′=t∑Tn​​γt′−trt′n​−b)∇logp(atn​∣stn​,θ)

這樣看起來太冗長了。我們定義優勢函數 A θ ( s t , a t ) = ∑ t ′ = t T n γ t ′ − t r t ′ n − b A^\theta (s_t,a_t)=\sum_{t'=t}^{T_n}\gamma^{t'-t} r_{t'}^n-b Aθ(st​,at​)=∑t′=tTn​​γt′−trt′n​−b,上标 θ \theta θ表示我們是用 π θ \pi_\theta πθ​的政策模型來對環境做出互動。

是以,最終公式為:

∇ R ˉ θ = 1 N ∑ n = 1 N ∑ t = 1 T n A θ ( s t , a t ) ∇ l o g p ( a t n ∣ s t n , θ ) (2.3) \nabla{\bar{R}_{\theta}}=\frac{1}{N}\sum_{n=1}^{N} \sum_{t=1}^{T_n}{A^\theta (s_t,a_t) \nabla logp(a_t^n\vert s_t^n,\theta)} \tag{2.3} ∇Rˉθ​=N1​n=1∑N​t=1∑Tn​​Aθ(st​,at​)∇logp(atn​∣stn​,θ)(2.3)

總結

政策梯度的目的就是最大化 R θ R_\theta Rθ​的期望值,常用的方法是采用神經網絡,以梯度上升的方式來進行優化。

政策梯度的缺點在于每一次參數更新完都要重新用更新完的模型去采樣,然後再次更新,非常慢。有關這一點的優化我們會在之後進行讨論。

繼續閱讀