AI時代系列(3) 機器學習三部曲: 📘 第三部:《強化學習 —— AI 的決策與進化》
60/100 第六週:📌 策略梯度與 Actor-Critic 架構
60.小結與測驗:策略學習的力量 🔁 優雅又高效的決策者!
第六週的單元聚焦於「策略梯度與 Actor-Critic 架構」,帶領學習者從基礎到實務完整掌握強化學習的核心思路。從 策略梯度方法 與 REINFORCE 的入門概念出發,了解其與 Q-Learning 的差異,再逐步引入 Actor-Critic 架構、優勢函數 與 Baseline 技術,用以提升學習效率與穩定性。進一步延伸至 A2C 方法 與 熵正則化,展現如何在探索與收斂間取得平衡。最後透過 LunarLander 實作,將理論落地於經典環境,並在小結與測驗中統整整週的核心觀念,幫助學習者將抽象的數學公式轉化為實際的 AI 決策能力。
________________________________________
🧠 本章重點回顧
單元 核心概念
51. 策略梯度方法 → 直接對策略本身求梯度,而非值函數
52. REINFORCE 演算法 → 使用整集回報來更新策略,簡單但方差高
53. 與 Q-Learning 比較 → 策略方法對連續空間更友善,值方法適合離散問題
54. Actor-Critic 架構 → 演員(Actor)選動作,評論員(Critic)估值回饋
55. 優勢函數 → 測量某動作比預期好多少,提升策略學習效率
56. Baseline 技術 → 減少 REINFORCE 的高方差問題,提高穩定性
57. A2C 方法 → 同步 Actor & Critic 訓練的穩定策略梯度法
58. 熵正則化 → 鼓勵策略保持多樣性,避免過早收斂
59. LunarLander 實作 → 將理論應用於模擬太空火箭降落任務
60. 小結與測驗 → 整合策略學習的重要理念與應用場景
________________________________________
🧪 單選測驗
1️⃣ 以下何者是策略梯度方法的主要優點?
A. 必須離線訓練
B. 適合離散動作空間
✅ C. 可直接處理連續動作空間
D. 不需使用神經網路
📘 解析:策略梯度方法可直接學習連續策略,如角度、力道等。
________________________________________
2️⃣ REINFORCE 方法的最大缺點是什麼?
A. 無法使用策略梯度
✅ B. 方差太高
C. 無法處理連續動作
D. 需要模型轉移機率
📘 解析:REINFORCE 雖簡單,但只依賴整集回報,導致方差較大。
________________________________________
3️⃣ Actor-Critic 方法中,Critic 的功能是?
A. 選擇動作
✅ B. 評估行動價值
C. 儲存經驗回放
D. 增加探索機率
📘 解析:Critic 負責根據估計的價值函數提供 Actor 更新方向。
________________________________________
4️⃣ 優勢函數 A(s, a) 的意義是?
A. 回報減去學習率
B. 策略的機率差值
✅ C. 動作比平均值好多少
D. 狀態的期望回報
📘 解析:A(s, a) = Q(s, a) - V(s),用來衡量某動作比預期好多少。
_______________________________________
5️⃣ 熵正則化的主要目的為何?
A. 快速收斂策略
B. 增加學習率
✅ C. 鼓勵策略探索
D. 減少批次大小
📘 解析:增加策略的不確定性,避免陷入固定動作選擇。
________________________________________
✍️ 簡答題
1️⃣ 請簡述 Actor-Critic 架構中 Actor 與 Critic 的分工。
🔹 答:Actor 負責根據策略選擇動作,Critic 則負責評估該動作在該狀態下的價值,用來指導 Actor 更新策略。
________________________________________
2️⃣ 在策略學習中為何要加入 baseline?其數學與實務意義為何?
🔹 答:Baseline 是一個參考值(如 V(s)),用來減少梯度更新的方差,讓學習更穩定。數學上將回報 G 減去 baseline 後,仍保持無偏估計,卻降低波動。
________________________________________
3️⃣ A2C 相較於單一 Agent 的 Actor-Critic 有何優勢?
🔹 答:A2C 使用多個 worker 並行收集樣本,然後同步更新,有助於提升穩定性與收斂速度,並降低樣本間的相關性。
一個簡易實例:使用策略梯度(Policy Gradient)控制機器人跳躍穿越陷阱,以幫助你了解策略學習如何應用在離散選擇且不適合用 Q 表估計的環境。
________________________________________
🎯 實作案例:策略學習讓「跳跳機器人」跨越陷阱
🧾 環境設定(簡化版):
• 一條長度為 5 的道路,終點為第 4 格
• 有一個陷阱在第 2 格
• 可選行動:
o 0:往前走一格
o 1:跳過一格(可能越過陷阱)
• 起始在位置 0,目標是抵達第 4 格
• 若踩到陷阱 → reward = -10
• 若成功到達終點 → reward = +10
• 其他步驟 reward = -0.1
________________________________________
🧠 使用 Policy Gradient 訓練機器人
python
import numpy as np
import torch
import torch.nn as nn
import torch.optim as optim
# 簡化環境
class JumpEnv:
def __init__(self):
self.goal = 4
self.trap = 2
self.reset()
def reset(self):
self.pos = 0
return np.array([self.pos], dtype=np.float32)
def step(self, action):
if action == 0:
self.pos += 1
elif action == 1:
self.pos += 2
self.pos = min(self.pos, self.goal)
done = self.pos == self.goal or self.pos == self.trap
if self.pos == self.goal:
reward = 10
elif self.pos == self.trap:
reward = -10
else:
reward = -0.1
return np.array([self.pos], dtype=np.float32), reward, done, {}
# Policy Model
class PolicyNet(nn.Module):
def __init__(self):
super().__init__()
self.net = nn.Sequential(
nn.Linear(1, 16),
nn.ReLU(),
nn.Linear(16, 2),
nn.Softmax(dim=-1)
)
def forward(self, x):
return self.net(x)
env = JumpEnv()
policy = PolicyNet()
optimizer = optim.Adam(policy.parameters(), lr=0.01)
gamma = 0.99
total_rewards = []
for episode in range(300):
state = env.reset()
log_probs = []
rewards = []
done = False
total_reward = 0
while not done:
state_tensor = torch.FloatTensor(state).unsqueeze(0)
probs = policy(state_tensor)
dist = torch.distributions.Categorical(probs)
action = dist.sample()
log_prob = dist.log_prob(action)
next_state, reward, done, _ = env.step(action.item())
log_probs.append(log_prob)
rewards.append(reward)
state = next_state
total_reward += reward
# 計算折扣報酬
R = 0
returns = []
for r in reversed(rewards):
R = r + gamma * R
returns.insert(0, R)
returns = torch.tensor(returns)
loss = -torch.stack(log_probs) * returns
loss = loss.sum()
optimizer.zero_grad()
loss.backward()
optimizer.step()
total_rewards.append(total_reward)
# 畫出學習成效
import matplotlib.pyplot as plt
plt.plot(total_rewards)
plt.xlabel("Episode")
plt.ylabel("Total Reward")
plt.title("Policy Gradient on Jumping Robot Environment")
plt.show()
這段程式實作了一個簡化版的跳躍環境 JumpEnv,智能體在每回合中透過 PolicyNet 策略網路決定往前跳一步或跳兩步,目標是到達終點並避開陷阱。訓練使用基本的 REINFORCE 策略梯度演算法,在每回合結束後計算折扣回報,將回報乘上對應的 log 機率作為損失,透過反向傳播更新策略網路,逐步提升選擇高回報行為的機率。最後繪製每回合總報酬,觀察訓練成效隨集數穩定上升。
________________________________________
🔍 說明:
• 無法用 Q 表學習,因為每次跳(+2)和走(+1)的風險不易估計
• 策略學習直接訓練「選擇哪個動作」
• 隨訓練次數,模型會自動學會在陷阱前跳過
________________________________________
這個簡化例子非常適合說明「行為學習(Policy-based methods)在不連續場景的優勢」。
🚀 四、實作建議與延伸應用
這個「跳跳機器人」策略學習案例雖簡單,卻精準展現了策略梯度法在決策學習上的威力。相較於傳統 Q-learning 難以處理的跳步風險與動作選擇,本案例直接學習從當前狀態到動作的映射,讓機器人逐漸學會在陷阱前跳躍、在安全處前進。透過不斷訓練,策略會自我優化,達成從經驗中學到最佳決策。延伸應用上,不僅可透過引入熵正則化鼓勵探索、導入 Actor-Critic 架構降低方差,也可類比至無人機導航、自駕車避障、機器手臂控制等實際場景。這類策略學習方法是深入理解強化學習並邁向先進演算法(如 A2C、PPO)的重要起點。
________________________________________
✅ 五、小結與啟示:
• 策略梯度方法是解決連續動作與複雜策略問題的強大工具。
• Actor-Critic 結合了策略學習與值函數的優點,學習更高效穩定。
• 加入 Advantage、Baseline 與 Entropy 正則化能顯著提升表現。
• 本章奠定了進入進階演算法(如 PPO、DDPG)的基礎,也是實作 AI 控制系統的重要起點。