AI時代系列(3) 機器學習三部曲: 📘 第三部:《強化學習 —— AI 的決策與進化》
52/100 第六週:📌 策略梯度與 Actor-Critic 架構
52.REINFORCE 演算法 ✍ 使用樣本策略估計梯度方向!
________________________________________
🎯 單元導讀
上一單元我們學到,策略梯度法不估 Q 值,而是直接學一個 策略 π(a|s;θ),讓智慧體學會「如何選擇動作」。
而最經典、最基本的策略梯度實作,就是 REINFORCE 演算法。
它的核心思想是:
「從實際觀察到的行為結果中,反向推回去調整策略方向。」
我們將透過樣本路徑(episode)來估算出正確的策略方向,逐步改進行為選擇!
________________________________________
🧠 一、REINFORCE 的公式與核心機制
REINFORCE 是一種 蒙地卡羅策略梯度演算法,其更新公式為:
∇θ J(θ) ≈ E[ ∇θ log π(a|s;θ) * G_t ]
其中:
• log π(a|s;θ):該動作在策略中的對數機率
• G_t:從時間步 t 開始累積的回報(reward-to-go)
這表示:
如果某個動作最後導致了高回報 → 增強它的機率
如果某個動作導致低回報 → 減少它的機率
這就像你在遊戲裡嘗試不同戰術,根據最終勝利與否來微調下一次的選擇傾向。
________________________________________
🔁 二、REINFORCE 的完整訓練流程
步驟 說明
1️⃣ 初始化策略網路 π(a
2️⃣ 跑出一整個 episode:收集 (s₀, a₀, r₁, ..., s_T)
3️⃣ 計算每一時間點的 G_t(未折扣或折扣累積回報)
4️⃣ 對每一步計算 `∇θ log π(a
5️⃣ 加總所有梯度並執行梯度上升:θ ← θ + α * ∇θ J(θ)
________________________________________
🧪 三、簡易 PyTorch 實作(CartPole 範例)
python
# 策略網路(softmax 輸出動作機率)
class PolicyNet(nn.Module):
def __init__(self, state_dim, action_dim):
super().__init__()
self.net = nn.Sequential(
nn.Linear(state_dim, 128),
nn.ReLU(),
nn.Linear(128, action_dim),
nn.Softmax(dim=-1)
)
def forward(self, state):
return self.net(state)
# 計算 reward-to-go
def compute_returns(rewards, gamma=0.99):
G = 0
returns = []
for r in reversed(rewards):
G = r + gamma * G
returns.insert(0, G)
return returns
PolicyNet 定義了一個策略網路,透過兩層全連接層與 Softmax 輸出動作機率分布,直接學習策略 π(a∣s);而 compute_returns() 則計算每個時間步的「reward-to-go」,即從當前時間步起累積的折扣回報,用於強化學習中衡量每個動作的長期價值,協助訓練策略網路提升整體回報。
________________________________________
📌 四、REINFORCE 的優點與限制
優點 說明
✅ 簡單直接 算法直覺、易實作、理論清晰
✅ 適合連續動作空間 因為輸出為機率分布,可支援連續輸出
✅ 可用任何策略參數化架構 如 CNN、RNN、Transformer…
限制 說明
⚠️ 方差大 每次更新都基於整集 episode,穩定性低
⚠️ 無法即時更新 必須等完整 episode 結束後才能計算 G_t
⚠️ 收斂慢 學習速率 α 與 baseline 技巧需小心調整
________________________________________
🔍 五、改進方向:REINFORCE + baseline
為了解決方差大的問題,可以使用「基準線」(baseline) 改進更新公式:
∇θ J(θ) ≈ ∇θ log π(a|s) * (G_t - b(s))
其中 b(s) 通常是該狀態的價值估計 V(s)。這樣可讓策略更新只針對「比平均好」的部分放大學習。
這也是之後 Actor-Critic 方法的前身。
________________________________________
📸 六、應用範例(實務場景)
應用 說明
遊戲玩者 從遊戲回合勝負中強化整體行為策略(如打牌、圍棋)
模擬操作 模擬每一次完整作業後調整策略,如機器臂抓取任務
NLP 生成 對生成的句子整體給分後回傳強化訊號(如對話品質評分)
________________________________________
🧩 七、問題與思考 💭
1️⃣ 如果使用 REINFORCE 來訓練一個文字生成模型,回報會是什麼?如何定義?
👉
在文字生成任務中(如對話、摘要、寫詩),回報可以設計成任務特定的評價指標,例如 BLEU 分數(翻譯品質)、ROUGE 分數(摘要品質)、讀者喜好分數、是否符合主題等。每次完整生成一段文字(完整 episode)後,計算整體表現作為該 episode 的回報,然後用 REINFORCE 來增強那些能帶來高回報的生成行為。
________________________________________
2️⃣ 為什麼方差大會導致學習變慢?如何用 baseline 來處理這問題?
👉
方差大代表每次學到的梯度方向波動很大,不穩定,容易讓學習像走「鋸齒路線」,導致收斂速度變慢甚至震盪。引入 baseline(例如:當前狀態的 V(s) 估計值)可以減去回報的平均水準,讓更新只針對「比預期好或壞的部分」進行調整,這樣能顯著降低梯度估計的方差,提升學習穩定性,加速收斂。
公式觀念:
原始: ∇θ log π(a|s) * G
加入 baseline 後: ∇θ log π(a|s) * (G - baseline)
________________________________________
3️⃣ 你在人生中有沒有「打一場仗才知道對錯」的經驗?像不像跑完整回合才知道怎麼調整策略?
👉
例如:參加一場重大考試、主導一個專案、創業、或初次面試新公司,過程中每個決策當下都不知道效果,要到整個事件結束後才有完整回饋(分數、成敗、客戶反應等)。這正像 REINFORCE 的學習邏輯 —— 先執行完整回合(episode),再根據整體回報來調整策略,讓以後面對類似情境時更有經驗、更有勝算。
______________________________________
✅ 八、小結與啟示
• REINFORCE 是最基礎的策略梯度法:直接使用樣本來更新策略
• 每次策略更新依賴整個 episode 的結果,容易有方差問題
• 搭配 baseline 能顯著穩定訓練
• 它是 Actor-Critic 等先進方法的奠基基礎