# Proximal Policy Optimization (PPO)
> 主要用於訓練代理(agent)在給定的環境中進行最佳決策
PPO會設法平衡學習新技巧與堅持已經學到的好技巧之間的關係 (Clip)。它不希望你的策略變化太快,這樣可以避免學到一些壞策略,這點像是教練想要確保你不會因為嘗試新動作而忘記了基本技巧。
核心思想是在保證新策略與舊策略不會差異太大的前提下,尋找一個性能更好的策略。這個特性通過一個被稱為「信賴區域(Trust region)」的概念來實現,這使得每一步更新都不會讓策略偏離太遠,從而避免了訓練過程中的不穩定現象。
PPO的目標函數 $𝐿(𝜃)$ 結合了策略的性能以及新舊策略之間的差異表示:
$$
L(\theta) = \hat{\mathbb{E}} \left[ \min\left( r(\theta) \hat{A}_t, \text{clip}(r(\theta), 1-\epsilon, 1+\epsilon) \hat{A}_t \right) \right]
$$
其中
* $\hat{\mathbb{E}}$,表示對樣本的期望值
* $r(\theta)$是機率比率 $\frac{\pi_\theta(a_t|s_t)}{\pi_{\theta_{old}}(a_t|s_t)}$,表明了在新策略下選擇動作與舊策略下選擇動作機率的比例
* $\hat{A}_t$ 是優勢函數(advantage function),用來估計在狀態 $s_t$ 下採取動作 $a_t$ 比平均更好多少
* clip 函數將 $𝑟(𝜃)$ 的值限制在 $[1-\epsilon, 1+\epsilon]$ 的範圍內,這樣就避免了過大的策略更新
## step-by-step
### **收集資料**
* 用當前策略 $\pi_{\theta_{\text{old}}}$ 與環境互動,收集一批軌跡:
$$
(s_t, a_t, r_t, s_{t+1})
$$
* 一次收集 T 個時間步(通常幾千筆)。
### **計算回報與優勢值**
* 用 GAE(Generalized Advantage Estimation)計算:
$$
A_t = \delta_t + (\gamma \lambda)\delta_{t+1} + (\gamma \lambda)^2 \delta_{t+2} + \dots
$$
其中:
$$
\delta_t = r_t + \gamma V(s_{t+1}) - V(s_t)
$$
* $V(s_t)$ 是 value network 的預測(baseline)。
---
### **3️⃣ 計算比例**
$$
r_t(\theta) = \frac{\pi_\theta(a_t|s_t)}{\pi_{\theta_{\text{old}}}(a_t|s_t)}
$$
這個 ratio 表示「新策略在相同動作下的機率比」。
### **最小化損失函數**
PPO 目標包含三個部分:
$$
L(\theta) =
\mathbb{E}_t \big[
L^{CLIP}(\theta)* c_1 (V_\theta(s_t) - V_t^{target})^2- c_2 \cdot \text{Entropy}[\pi_\theta(s_t)]
\big]
$$
* 第一項:policy loss(clipped objective)
* 第二項:value loss(讓 V 預測準確)
* 第三項:entropy bonus(鼓勵探索)
### **多次更新**
* 使用 mini-batch(例如 64)在這批資料上訓練多次(K epochs)。
* 更新策略參數 $\theta$,再設為 $\theta_{\text{old}}$ 進入下一輪。
### **重複收集與更新**
整個流程重複:
* 收集資料 → 計算 advantage → 更新策略
直到收斂或達成目標。
---
## 流程圖摘要
```py
for iteration in range(N):
# 1. Collect trajectories using old policy
trajectories = collect_data(pi_theta_old)
# 2. Compute returns and advantages
A_t, V_targets = compute_advantage(trajectories)
# 3. Optimize policy K epochs
for epoch in range(K):
r_t = pi_theta(a_t|s_t) / pi_theta_old(a_t|s_t)
L_clip = min(r_t*A_t, clip(r_t, 1-ε, 1+ε)*A_t)
loss = -L_clip + c1*value_loss + c2*entropy_bonus
update(theta)
# 4. Update old policy
theta_old ← theta
```
## Reference
* [Proximal Policy Optimization Algorithms](https://arxiv.org/pdf/1707.06347)
* [[RL] Proximal Policy Optimization(PPO)](https://hackmd.io/@YungHuiHsu/SkUb3aBX6)
* [DRL Lecture 2: Proximal Policy Optimization (PPO)](https://www.youtube.com/watch?v=OAKAZhFmYoI&t=889s)