1. 程式人生 > >【李巨集毅深度強化學習2018】P2 Proximal Policy Optimization (PPO)

【李巨集毅深度強化學習2018】P2 Proximal Policy Optimization (PPO)

                         第二講 Proximal Policy Optimization(PPO)

視訊地址:https://www.bilibili.com/video/av24724071

課件地址:http://speech.ee.ntu.edu.tw/~tlkagk/courses_MLDS18.html

第一講:【李巨集毅深度強化學習2018】P1 Policy Gradient(Review)

兩種策略:on-policy 和 off-policy:

所謂 on-policy 指我們學習的 agent(即actor) 和與環境互動的 agent 是相同的,即 agent 一邊和環境互動,一邊學習

off-policy 指我們學習的 agent 與環境互動的 agent 是不同的,即 agent 通過看別人玩遊戲來學習

注:RL中的 actor/agent 概念和 policy 概念其實有時候會指代同一個東西。因為 policy 即是 actor 要學習的策略,並在是在學習以後用來生成 action 的依據。actor/policy 都可以代表一個網路/函式,一個用來生成 action 的網路/函式。所以下文有時對二者不加以嚴格區分。

 

off-policy 方法,利用 q 分佈計算 p 分佈下的期望:

上一講提到的 policy gradient 是指 on-policy 的方法,即跟環境互動的 policy 與要 learn 的 policy 是同一個

整個 actor 網路的目標是學習引數 \theta 生成 【能使 reward R_\theta 最大的 action】。為了使 \bar{R_\theta} 最大化,我們需要做gradient ascent。而 \nabla \bar{R_\theta}  是上一講提到的做 gradient ascent 時需要計算的梯度。

E_{\tau \sim p_\theta(\tau)} 意味著如果更新引數後,要重新 sample 一堆 trajectory \tau

,之前的 trajectory 全部不能用了。所以 policy gradient 會花很多時間做sample,因為 sample 一堆 data 後只夠做一次引數更新。

而 off-policy 的好處就是,我們可以用另一個 \theta ' 對應的 policy \pi_{\theta '} 來和環境互動,而用其收集到的資料來訓練,這樣可以把 \pi_{\theta '} 收集到的資料重複利用。

現在介紹 Importance Sampling 的思想

E_{x \sim p}[f(x)] 代表從分佈 p 中取樣本 x 送入函式 f(x) 並求期望,這可以近似於 sample N 個 x^i,然後帶入 f(x) 求平均,即E_{x \sim p}[f(x)]\approx \frac{1}{N}\sum_{i=1}^{N}f(x^i)。現在假設我們不能從分佈 p 中 sample 資料,只能從分佈 q 中 sample,這樣不能直接套上述近似。而要用:E_{x \sim p}[f(x)]=\int f(x)p(x)dx = \int f(x)\frac{p(x)}{q(x)}q(x)dx = E_{x \sim q}[f(x)\frac{p(x)}{q(x)}]

\int f(x)p(x)dx 就是從 p 中 sample 的期望,現在要改為分佈 q,所以同時乘 q 除 q,最後多出一項即為 importance weight,代表分佈 p 和分佈 q 間的差異。

 

 

Importance Sampling 存在的問題:

E_{x \sim p}[f(x)] = E_{x \sim q}[f(x)\frac{p(x)}{q(x)}] 成立,但是二者的方差(variance)不同,多出來的一項在上圖用紅框圈出。所以如果對於兩個分佈p、q sample 得足夠多,那麼可以用上述公式算期望,但是如果 sample 得不多,二者的方差又相差很大,那麼這樣算就有問題。

這幅圖具體說明了上述問題:藍線代表 p 的分佈,綠線代表 q 分佈,紅線代表 f(x) 函式,現在我們要從 p、q 分佈中 sample 出 x ,投到 f(x) 中計算。可以看出 p、q 分佈對於 f(x) 的計算而言差別是很大的,因為在藍線附近 sample 到的 x 丟到 f(x) 中算出來的是負值,而綠線附近 sample 到的 x 丟到 f(x) 中算出的是正值。

現在我們關注右邊E_{x \sim q}[f(x)\frac{p(x)}{q(x)}]  這項,如果對 q 分佈 sample 得不夠多,只在紅線右邊得到 6 個綠點,那麼 p(x)q(x)f(x) 都是正的,E_{x \sim q}[f(x)\frac{p(x)}{q(x)}]  恆為正;但是如果 sample 到紅線左邊的 1 個綠點(概率很小),則f(x)為負,同時 f(x) 乘上的 importance weight \frac{p(x)}{q(x)} 是一個很大的正值,這樣會得到一個比較大的負值,對期望起到平衡作用,期望有可能變成負的。所以我們要求  \theta , \theta'  要比較接近。

現在 off-policy 就是讓 p_{\theta'}(\tau) 給  p_{\theta}(\tau) 做示範,即從 p_{\theta'}(\tau) 的分佈 sample 資料,同時用 importance weight 做修正。

 

使用 off-policy,使用梯度做引數更新時要注意的點:

用 off-policy 要注意的一點就是原來 advantage function中  A^\theta (s_t,a_t)=R(\tau^n)-b (見第一講) 的 \theta 也要改為 \theta',因為現在是 \pi_{\theta'} 在和環境互動。

我們估計 \frac{p_\theta(s_t)}{p_{\theta'} (s_t)} =1,因為猜測 state 的出現與 \theta 關係不大,況且這一項本來就無法計算,因為state出現的概率我們是不能控制或估計的。

由此可以得到新的目標函式 J^{\theta'}(\theta)=E_{(s_t,a_t)\sim \pi_{\theta'}}[\frac{p_\theta(a_t|s_t)}{p_{\theta'}(a_t|s_t)}A^{\theta'}(s_t,a_t)] 。上標 \theta' 代表跟環境互動的是 \theta' , \theta 是要更新的引數。

\frac{p_\theta(a_t|s_t)}{p_{\theta'}(a_t|s_t)} 可以直接算,A^{\theta'}(s_t,a_t) 可以根據 sample 到的資料計算。

 

PPO / TRPO 演算法:

 

我們之前提到要求  \theta , \theta'  比較接近,所以提出了 PPO 演算法,在目標函式 J^{\theta'}(\theta) 後加了一個約束KL散度 \beta KL(\theta,\theta'),來保證  \theta , \theta'  的相似性,這個約束就像深度學習中的正則化項。TRPO也是同樣的思想,但是很難計算,建議就用PPO。

KL散度在意的是actor行為上的差距而不是引數上的差距。

TODO

\beta 其實和學習率有點類似,需要手動設定。我們可以設定兩個閾值 KL_{max} 和 KL_{min} ,如果算出來的 KL散度\beta KL(\theta,\theta') 大於 KL_{max} ,說明  \theta , \theta^k  相差太大,需要加大\beta ,加大懲罰。反之則減小\beta ,減小懲罰。

 

PPO / PPO2 的目標函式公式:

還有一種PPO2,是PPO的簡化。PPO2原始的公式為:

裡面是對 \frac{p_\theta(a_t|s_t)}{p_{\theta^k}(a_t|s_t)}A^{\theta^k}(s_t,a_t) 和 clip(\frac{p_\theta(a_t|s_t)}{p_{\theta^k}(a_t|s_t)},1-\varepsilon ,1+\varepsilon )A^{\theta^k}(s_t,a_t) 取最小值 min。

clip(\frac{p_\theta(a_t|s_t)}{p_{\theta^k}(a_t|s_t)},1-\varepsilon ,1+\varepsilon )A^{\theta^k}(s_t,a_t) 中 clip 函式的意思是如果 \frac{p_\theta(a_t|s_t)}{p_{\theta^k}(a_t|s_t)} 小於 1-\varepsilon,則取 1-\varepsilon;若 \frac{p_\theta(a_t|s_t)}{p_{\theta^k}(a_t|s_t)} 大於 1+\varepsilon 則取 1+\varepsilon ;若介於兩者之間,則取 \frac{p_\theta(a_t|s_t)}{p_{\theta^k}(a_t|s_t)} 。clip函式的影象為:

其中橫軸為 \frac{p_\theta(a_t|s_t)}{p_{\theta^k}(a_t|s_t)}

現在綜合考慮 min 中的兩項,第二項對應上圖藍色的折線,第一項對應下圖綠色的斜線,若A>0,則取下圖左邊紅線部分,若A<0則取下圖右邊紅色部分。

 

這個式子其實就是讓 \theta 和 \theta^k 不要差距太大。如果A(advantage function)>0,代表當前的action是好的,所以我們希望 p_\theta(a_t|s_t) 越大越好(即橫軸代表的 \frac{p_\theta(a_t|s_t)}{p_{\theta^k}(a_t|s_t)} 增大),但是 p_\theta(a_t|s_t) 和 p_{\theta^k}(a_t|s_t) 二者不能相差太多,所以設了一個上界 1+\varepsilon (上圖左邊);A<0,則說明當前的按傳統不好,所以希望 p_\theta(a_t|s_t)​​​​​​​ 越小越好,但同樣要設一個下界 1-\varepsilon​​​​​​​​​​​​​​ 。

 

PPO / PPO2 等方法的實驗效果:

上圖給出了PPO在不同任務上的表現(紫色的線)