---
# System prepended metadata

title: Proximal Policy Optimization (PPO)

---

# 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)