本文首發於:行者AI
Policy Optimization(策略優化)是強化學習中的一大類算法,其基本思路區別於Value-based的算法。因此,很多教科書都將model-free RL分成兩大類,Policy Optimization和Value-based。本系列博客將會參考OpenAI發布的入門教程Spinning Up [1],Spinning Up系列是入門Policy Optimization的非常好的教材,特別適合初學者。Policy Gradient(策略梯度,簡稱PG)算法是策略優化中的核心概念,本章我們就將從最簡單的PG推導開始,一步步揭開策略優化算法的神秘面紗。
1. 直觀理解
如果用一句話來表達策略梯度的直觀解釋,那就是“如果動作使得最終回報變大,那么增加這個動作出現的概率,反之,減少這個動作出現的概率”。這句話表達了兩個含義:
- 我們考慮的是動作對於回報的影響,沒有考慮狀態或者其他因素。
- 我們調整的是動作出現的概率,而沒有給某個動作打分,這區別於Value-based類的算法。
2. 策略梯度推導
本節我們將一步步推導出策略梯度的基礎公式,這一小節非常重要,理解了推導過程,就基本上理解了策略梯度的核心思想。所以,一定要耐心的把這一小節的內容全部看懂,最好能夠達到自行推導的地步。
- 最大化回報函數
我們用參數化的神經網絡表示我們的策略\(\pi_\theta\),那我們的目標,就可以表示為調整\(\theta\),使得期望回報最大,用公式表示:
在公式(1)中,\(\tau\)表示從開始到結束的一條完整路徑。通常,對於最大化問題,我們可以使用梯度上升算法來找到最大值。
為了能夠一步步得到最優參數,我們需要得到\(\nabla_{\theta} J\left(\pi_{\theta}\right)\),然后利用梯度上升算法即可,核心思想就是這么簡單。
- 策略梯度
關鍵是求取最終的回報函數\(J(\pi_\theta)\)關於\(\theta\)的梯度,這個就是策略梯度(policy gradient),通過優化策略梯度來求解RL問題的算法就叫做策略梯度算法,我們常見的PPO,TRPO都是屬於策略梯度算法。下面我們的目標就是把公式(2)逐步展開,公式(2)中最核心的部分就是\(\nabla_{\theta} J\left(\pi_{\theta}\right)\),這也是這篇博客最核心的地方。
在以上的推導中,用到了log求導技巧:\(\log x\)關於\(x\)的導數是\(\frac{1}{x}\)。因此,我們可以得到以下的公式:
所以,才有公式(5)到公式(6),接下來我們把公式(7)進一步展開,主要是把\(\nabla_{\theta} \log P(\tau \mid \theta)\)展開。先來看看\(P(\tau \mid \theta)\)
加入log,化乘法為加法:
計算log函數的梯度,並且約去一些常量:
因此,結合公式(7)和公式(9),我們得到了最終的表達式
公式(10)就是PG算法的核心表達式了,從這個公式中可以看出,我們要求取的策略梯度其實是一個期望,具體工程實現可以采用蒙特卡羅的思想來求取期望,也就是采樣求均值來近似表示期望。我們收集一系列的\(\mathcal{D}=\left\{\tau_{i}\right\}_{i=1, \ldots, N}\) ,其中每一條軌跡都是由agent采用策略\(\pi_{\theta}\)與環境交互采樣得到的,那策略梯度可以表示為:
其中,\(|\mathcal{D}|\)表示采樣的軌跡的數量。現在,我們完成了詳細的策略梯度的推導過程,長舒一口氣,接下來的工作就比較輕松了,就是在公式(10)的基礎上修修改改了。
再進行簡單修改之前,我們再總結一下公式(10),畢竟這個公式是PG算法最核心的公式:
- 對比我們常見的監督學習算法,我們都會定義loss函數,然后loss函數對參數求導,使用梯度下降算法不斷使得loss最小。對於PG算法,我們的“loss函數”其實是期望回報的對數,而我們的目標是使得期望回報最大,所以這里使用了梯度上升算法。
- 一般的監督學習算法中,訓練樣本和測試樣本的分布是同分布的,loss函數是從固定分布的樣本上求出來的,與我們想要優化的參數是獨立的。然而,對於PG算法,我們會有基於現有策略的采樣的過程,策略不同,采樣得到的樣本不同,導致最終計算出來的loss也存在較大差異,這就使得網絡很容易過擬合,后面我也會講到更加高級的Actor-Critic框架,利用對抗的思路,解決這一問題。
- 對於一般的監督學習,loss越小越好,loss也是一個非常有效的評價訓練是否完成的指標。然后對於PG算法,這里的“loss函數”意義不大,主要是因為這里的期望回報僅僅作用於當前策略生成的數據集。所以,並不是說loss降下來,模型就表現的更好。
- 我們可以將公式中的\(R(\tau)\)看做是\(log\pi_\theta(a_t \mid s_t)\)的權重,當獎勵較小時,就說明在\(s_t\)下采取動作\(a_t\)的效果不好,減少\(s_t\)狀態下\(a_t\)出現的概率,反之,獎勵較大則增加動作出現概率,從而達到選取最合適的動作的目的。
3. 改進回報函數
我們繼續觀察公式(10),對於公式中的\(R(\tau)\),表示整個軌跡的回報,其實並不合理。對於一條軌跡中的所有動作,均采用相同的回報,就相當於對於軌跡中的每一個動作都賦予相同的權重。顯然,動作序列中的動作有好有壞,都采取相同的回報,無法達到獎懲的目的,那我們該怎么表示某個狀態下,執行某個動作的回報呢?
一種比較直觀思路是,當前的動作將會影響后續的狀態,並且獲得即時獎勵(reward),那么我們只需要使用折扣累計回報來表示當前動作的回報就行了,用公式表示為:
這在spinning up中叫做reward to go,所以,公式(10)可以表示為:
當然,使用reward to go的權重分配還是相當初級,我們可以使用更加高級的權重分配方式,進一步減少回報分配的方差,限於篇幅原因,我們后續再聊。
4. 總結
本章我們花了大量的篇幅推導了策略梯度(PG)的核心公式,得到了關鍵表達式(10),理解該公式對於我們后續理解整個PG算法族非常有幫助,希望大家能夠認真的理解這一公式推導過程。
PS:更多技術干貨,快關注【公眾號 | xingzhe_ai】,與行者一起討論吧!
OpenAI Spinning Up https://spinningup.openai.com/ ↩︎