強化學習 (RL) - PPO

強化學習 (RL) - PPO

徹底終結 Policy Gradient 的不穩定!本篇將介紹 OpenAI 提出的 PPO 演算法,它是當代強化學習的霸主,更是訓練 ChatGPT (RLHF) 的核心基石。我們將使用 Stable-Baselines3 快速實作。


前言:PG 的痛點與 PPO 的誕生

在昨天的文章中,我們見識到了 Policy Gradient (PG) 的威力與致命傷:高變異性 (High Variance)。因為它全靠機率抽樣,只要運氣不好抽錯動作,辛苦建立的策略就會瞬間崩盤,導致分數像心電圖一樣劇烈震盪(例如上一秒還有 37 分,下一秒直接暴跌到 -100 分)。

為了解決這個問題,OpenAI 在 2017 年提出了 PPO (Proximal Policy Optimization,近端策略優化)。 PPO 出現後,幾乎統治了強化學習領域。它不僅是控制機器人、玩遊戲的首選,更是訓練 ChatGPT (RLHF, 透過人類回饋增強學習) 最核心的大腦演算法!

今天,我們就來揭開這套「霸主級」演算法的面紗。


案例:登陸月球 (LunarLander)

我們同樣挑戰:LunarLander-v3

LunarLander

(圖片來源:Gymnasium 官網)

PPO 訓練架構圖

Loading Diagram...

PPO 為什麼這麼穩?(兩大秘密武器)

PPO 其實是融合了 DQN 的「價值判斷」與 PG 的「策略機率」,並加上了「安全煞車系統」。

1. Actor-Critic (雙網路架構)

PPO 通常建立在 Actor-Critic 架構上:

  • Actor (演員):也就是原本的 Policy Net,負責「看畫面、決定動作機率」。
  • Critic (影評人):類似 DQN 的 Value Net,負責「看畫面、預測這局最終能拿多少分」。

運作方式:Actor 每做一個動作,Critic 就會根據結果給出評價(這叫 Advantage 優勢函數)。如果 Critic 覺得這個動作「比預期中更好」,Actor 就會增加該動作的機率;反之則減少。這比 PG 只能「玩完一局盲目檢討」要精準得多!

2. Clip 截斷機制 (安全煞車系統)

這是 PPO 的靈魂!在 PG 中,如果某個動作得了超高分,神經網路會過度興奮,把該動作的機率一次調高太多,導致「走火入魔」忘記其他技巧。 PPO 加入了 Clip (截斷) 數學公式,它強制規定:

「無論這個動作有多好,每次更新策略的幅度,最多只能在舊策略的 0.8 到 1.2 倍之間(變動不超過 20%)。」

這就像學騎腳踏車,PPO 不允許你一次把重心偏移 90 度,而是規定每次只能微調。這種「穩紮穩打、步步為營」的機制,徹底消除了 PG 突然崩盤的風險。

** 實戰舉例:PPO 雙網路怎麼合作降落?**

  1. 環境狀態 (State):小艇現在歪了 30 度,正在快速往下掉。
  2. Actor (演員):看看畫面,給出機率:「我覺得這時候噴『右引擎』的勝率最高 (60%)」。
  3. Critic (影評人):看看畫面,給出預測:「以我目前的經驗,在歪 30 度的情況下,這局最後大概只能拿 50 分」。
  4. 執行動作 (Action):根據 Actor 的機率丟骰子,執行了噴「右引擎」。
  5. 環境回饋 (Reward):噴了引擎後小艇完美回正了!這步拿到了加分,而且進入了一個更安全的新狀態。
  6. 計算優勢 (Advantage):系統結算後發現,這一連串下來最後拿了 80 分。Critic 一看:「咦?實際拿了 80 分,比我當初預期的 50 分還高了 +30 分 (這就是 Advantage 優勢)!代表 Actor 剛才噴右引擎這步是一步好棋!」
  7. Clip 截斷 (安全煞車):因為表現比預期好,系統準備大幅提高「噴右引擎」的機率(原本可能想一口氣暴力調到 99%)。但 Clip 機制立刻介入攔截:「慢著!不管多成功,一次最多只能變動 20%,調到 72% 就好。」

結果:Actor 乖乖把機率調高到 72%,Critic 也修正了自己的預測眼光。既學到了好招,又不會因為太興奮而走火入魔忘記其他技巧!


實戰:Stable-Baselines3

PPO 底層的數學公式與優勢函數 (GAE) 手刻起來非常複雜且容易有 Bug。因此在業界,我們通常直接使用最強的強化學習套件:Stable-Baselines3 (SB3)

只要短短幾行程式碼,就能載入 PPO 模型並開始訓練登陸月球 (LunarLander)!

import gymnasium as gym
from stable_baselines3 import PPO

# 1. 建立 LunarLander 環境
env = gym.make("LunarLander-v3")

# 2. 建立 PPO 模型 (MlpPolicy 代表使用全連接層神經網路)
model = PPO("MlpPolicy", env, verbose=1)

# 3. 開始訓練 (訓練 100,000 步)
model.learn(total_timesteps=100000)

# 4. 儲存模型
model.save("ppo_lunarlander")

就是這麼簡單!SB3 把所有複雜的 Actor-Critic 網路建構、Clip 計算都封裝好了,讓開發者能專注在訓練與應用上。


訓練日誌解析:看懂 PPO 的專業指標

執行訓練後,你會在終端機看到類似下方這樣充滿專業名詞的日誌:

------------------------------------------
| rollout/                |              |
|    ep_len_mean          | 601          |
|    ep_rew_mean          | 2.64         |
| time/                   |              |
|    total_timesteps      | 100352       |
| train/                  |              |
|    clip_fraction        | 0.0261       |
|    explained_variance   | 0.721        |
|    learning_rate        | 0.0003       |
|    loss                 | 54.9         |
|    value_loss           | 55.3         |
------------------------------------------

身為專業的 AI 工程師,你需要看懂以下幾個關鍵指標:

  • ep_rew_mean (平均回報):最直觀的分數。這裡看到訓練到 10 萬步時,平均分數已經從負數慢慢爬回正數(2.64分),代表小艇開始掌握初步的降落訣竅。
  • clip_fraction:有多少比例的更新觸發了「Clip 截斷」機制。這裡的 0.0261,代表大約有 2.6% 的策略更新企圖跨大步,但被 PPO 的安全煞車成功攔截了。
  • explained_variance:Critic (影評人) 預測分數的準確度。這個值越接近 1 越好!這邊是 0.721,代表 Critic 已經能相當準確地評估局勢,從而給予 Actor 正確的指導方向。

成果對比:PG vs PPO 穩定度對決

最後,我們把訓練分數畫成圖表。藍線是原始的單局分數,紅線則是平滑後的趨勢線

PPO LunarLander Performance

(PPO 訓練成效圖:紅色為平滑趨勢線)

  • 真正的滿分:LunarLander 官方設定的「完美解決」分數大約落在 200 分左右。
  • 終極穩定度 (紅線):回想昨天 PG 那個動不動就從正分暴跌回 -400 分的「瘋狂心電圖」。看看 PPO 的紅色趨勢線,它是一條極度平滑、穩穩往上爬升,最終穩穩突破 150 分邁向滿分線的完美斜線
  • 這就是 PPO 的價值:它確保神經網路「只要學會了降落技巧,就不會輕易忘記」。

總結

PPO 透過 Actor-Critic 雙網路 提升評估精準度,再透過 Clip 截斷機制 確保步伐穩定,完美解決了傳統 Policy Gradient 的高變異性問題。這套「穩紮穩打」的哲學,讓它成為了目前訓練複雜 AI (包含 ChatGPT) 最可靠的選擇。

下一關,我們終於要踏入一個全新的領域:XAI (可解釋 AI) — 既然 AI 這麼強大,我們該如何看穿它的「黑盒子」,知道它到底為什麼會這樣判斷?這是邁向資深工程師的必修課!