Skip to content

Proximal Policy Optimization(PPO)筆記

Last Updated on 2025-05-05 by Clay

介紹

Proximal Policy Optimization(PPO)是一種在強化學習(Reinforcement Learning, RL)領域非常知名且效果卓越的一種策略梯度(Policy Gradient)演算法,由 OpenAI 在 2017 年提出,旨在解決傳統策略梯度方法在訓練穩定性上的一些問題。

閱讀全文: Proximal Policy Optimization(PPO)筆記

策略梯度

而所謂的策略梯度價值基礎(Value-based,如 Q-Learning 和 DQN)不同,策略本身並不是一個價值函數,而通常由另外一個神經網路表示,通常記作 \pi_{\theta}(a|s) ,表示策略函數直接輸出在狀態 s 下,採取動作 a 的機率,其中 \theta 是策略網路的參數。

而策略梯度的目標就是找到一組最佳的參數 \theta ,使得策略 \pi_{\theta} 的期望總回報(Expected Total Return)最大化。而這個期望總回報又被定義成一個目標函數(Objective Function),記作

J(\theta)=\mathbb{E}_{\tau\sim\pi_{\theta}}[R(\tau)]

在這裡:

  • \tau 代表一個軌跡(trajectory),也就是代理人(agent)遵循策略 \pi_{\theta} 與環境互動產生的一系列狀態、動作和獎勵(s_{0},a_{0},r_{1},s_{1},a_{1},r_{2},...
  • R(\tau)=\sum^{T}_{t=0}\gamma^t r_{t+1} 是該軌跡的總折扣回報(Total Discounted Return),\gamma 是所謂的折扣因子,通常為分數,隨著時間距離做出決策越遠而對獎勵影響程度衰減
  • $latex \mathbb{E}{r\sim\pi{\theta}}[…] &s=1$ 表示對所有遵循策略 \pi_{\theta} 產生的軌跡取期望值

至於實際上是怎麼讓我們想要優化的模型學習、調整參數呢?那就是使用梯度上升(Gradient Ascent)。我們需要計算根據目標函數 J(\theta) 相對於參數 \theta 的梯度 \nabla_{\theta}J(\theta) ,並沿著梯度的方向更新參數(跟梯度下降做的事情其實一樣):

\theta \leftarrow \theta+\alpha\nabla_{\theta}J(\theta)

其中 \alpha 是我們可以設定的學習率(Learning Rate)。


PPO 核心概念

傳統的策略梯度方法(例如 REINFORCE 或 A2C 的基本形式)直接計算策略梯度並更新策略網路的參數,目標是最大化期望的累積獎勵;然而,這類方法對於學習率非常敏感,如果學習率太大,策略可能會劇烈變動,導致性能崩潰;反之若是太小,則會是訓練非常緩慢。

Trust Region Policy Optimization (TRPO) 試圖解決這個問題,它透過限制新舊策略之間的 KL 散度(KL Divergence)來確保每次更新都在一個信任區域內進行,避免策略劇烈變動,但是因其計算複雜,實作較為困難。
PPO 是想要實現 TRPO 的穩定性,但使用更簡單的方法。它不像是 TRPO 那樣直接強制 KL 散度約束,而是透過修改目標函數來間接限制策略更新的幅度。


PPO-Clip

這是最常見的 PPO 型態,其核心就在於特殊的剪裁目標函數。

它首先計算了新策略 \pi_{\theta} 和舊策略 \pi_{\theta\ old} 對於某個動作 a_t 在狀態 s_t 下的機率比 r_t(\theta)

r_t(\theta)=\frac{\pi_{\theta}(a_t|s_t)}{\pi_{\theta\ old}(a_t|s_t)}

接著,PPO-Clip 計算一個優勢函數(Advantage Function)\hat A_{t} ,這個值計算了在狀態 s_t 下採取動作 a_t 相較於平均動作的好壞程度。

如果 \hat A_{t} > 0 ,表示這個動作比平均要好;反之,則表示這個動作比平均較差。
PPO-Clip 的目標函數定義如下:

L^{CLIP}(\theta)=\mathbb{E}\left[ min\left( r_t(\theta)\hat A_t,clip(r_t(\theta),1-\epsilon,1+\epsilon)\hat A \right) \right]

  • \epsilon 是一個超參數,通常設定為 0.1 或 0.2
  • \text{clip}(r_t(\theta),1-\epsilon,1+\epsilon) 的意思是將 r_t(\theta) 的值限制在 \left[ 1-\epsilon,1+\epsilon \right] 區間內
  • \min(...) 的操作是關鍵:
    • \hat A > 0 (動作是好的): 目標函數可以視為 \min(r_t(\theta)\hat A, (1+\epsilon)\hat A) ,這意味著 r_t(\theta) (新策略選擇的動作是正向的機率)增加得太多,也會被限制在 (1+\epsilon)\hat A 中,防止策略更新過度樂觀。
    • \hat A < 0 (動作是壞的): 目標函數可以視為 \min(r_t(\theta)\hat A, (1-\epsilon)\hat A) ,這意味著 r_t(\theta) (新策略選擇的動作是負面的機率)降低得太多,也會被限制在 (1-\epsilon)\hat A 中,防止策略更新過度悲觀,讓策略變化太大。

以結論來說,透過一個簡單的剪裁動作,約束了模型的策略更新幅度,提昇了訓練的穩定性。


PPO 的實現(Actor-Critic 架構)

Multiple-UAV Reinforcement Learning Algorithm Based on Improved PPO in Ray Framework

PPO 通常與 Actor-Critic 架構結合使用。簡單來說,Actor(策略網路)負責根據當前狀態 s_t 輸出動作的機率分佈 \pi_{\theta}(a_t|s_t) ,而 PPO 的目標函數就是用更新 Actor 網路的。

而 Critic(價值網路)則負責估計狀態的價值 V(s_t) ,而這個價值函數主要用來計算優勢函數 \hat A_t 。而 Critic 的學習過程主要基於時序差分學習(Temporal Difference Learning, TD Learning)的思想:

  1. 做出預測:當 Agent 處於某個狀態 s_t 時,Critic 網路根據當前自己的參數,對此狀態做出一個預測 V(s_t)
  2. 觀察實際發生的結果:Agent 根據 Actor 的策略,在 s_t 執行了 a_t 動作,環境立刻給出的獎勵 r_{t+1} ,並且此時進入了下一個狀態 s_{t+1}
  3. 此時 Critic 擁有了更即時的資訊(立即獎勵 r_{t+1} 和下一個狀態 s_{t+1} ),它需要把這真實的資訊和對未來的預測整合為一個目標值 —— TD 目標(TD Target):

Y_t=r_{t+1}+\gamma V(s_{t+1})

其中 \gamma 同樣是一個衰減、折扣參數。

  1. 計算預測誤差:Critic 比較自己最初的預測以及更可靠的 TD Target Y_t 之間的差距,計算出 TD 誤差(TD Error),記作 \delta_t

\delta_t=Y_t-V(s_t)=r_{t+1}+\gamma V(s_{t+1})-V(s_t)

接著 Critic 網路就可以通過像是均方誤差這類損失函數進行更新了。

順帶一提,Actor 和 Critic 通常會共享一部分的網路層,以提高學習效率。


總結

總結來說,PPO 是一種透過巧妙設計目標函數(特別是 PPO-Clip 中的裁剪機制)來限制策略更新幅度,從而實現穩定高效訓練的強化學習演算法。它結合了 Actor-Critic 架構,在易用性、穩定性和性能之間取得了很好的平衡,使其成為目前應用最廣泛的強化學習算法之一。

相較於 TRPO 難以實作與運算開銷較大,PPO 在實作簡單性與穩定性之間提供了一個極佳的折衷,因此廣泛應用在 Atari 遊戲、連續控制(MuJoCo)甚至 RLHF 訓練大型語言模型中,成為目前最具代表性的策略梯度方法之一。


References


Read More

Leave a Reply