3.2 Q-Learning(1989)與 ε-greedy、表格方法的極限#
前言:從「評估策略」躍升到「學最優策略」#
TD(λ) 解決了評估(給定策略學 \(v^\pi\) ),但學完 \(v^\pi\) 還是不能直接行動——要選動作得靠 \(P(s'|s,a)\) (第 2.1 節的難題),或得知道「如果換成貪婪策略,價值會變成什麼」。1989 年,Chris Watkins 在劍橋的博士論文中提出 Q-Learning:直接學 Q 函數 \(q^*(s,a)\) ——「這一步先做 \(a\) ,之後永遠貪婪」的價值。它有一個驚人性質:完全 off-policy——不論你當下的行為策略多爛(探索用什麼都行),只要每個 \((s,a)\) 被嘗試無窮多次, \(Q\) 會收斂到 \(q^*\) ,與探索方式無關。這一性質把「探索」與「學習」徹底解耦,配合 ε-greedy 成為之後三十年 RL 的主力工具:TD-Gammon(6.1)、DQN(4.1)的核心更新就是它。本節講清 Q-Learning 的數學、ε-greedy 的探索原理、表格方法的樣本與維度極限——後者正是把本書推向第 4 章深度方法的直接壓力。
歷史背景:Watkins、Sutton 與一場關鍵的博士生答辯#
1989 年,Sutton 在劍橋一場研討會上講 TD 學習;台下博士生 Chris Watkins 當場意識到:如果把 TD 的預測目標從 \(v\) 換成 \(q\) ,並在更新中對下一狀態取 max,就能繞過「需要知道模型才能改進策略」的瓶頸。他的 1989 年博士論文《Learning from Delayed Rewards》系統地提出了 Q-Learning 並證明其收斂性(Watkins & Dayan 1992 在《Machine Learning》正式發表)。這是 RL 史上最戲劇性的「理論即刻催生演算法」案例之一。同一時期,控制理論界(Bertsekas, Tsitsiklis)用非同步隨機逼近證明了同一演算法;Sutton 與 Barto 1998 的教科書《Reinforcement Learning: An Introduction》把整條線整合成標準框架。之後 1992 年 Tesauro 的 TD-Gammon 證明「TD+神經網路」能贏世界級棋手,但這條線在 1992-2013 年間陷入二十年的沉寂——不是理論不對,而是(1)表格與淺層網路的表達力不夠,(2)沒有標準化的環境基準讓方法可以比較與累積,(3)計算力不足。這三個缺口的填補分別是 DQN(第 4 章)、Gym(第 4 章)與 GPU——理解本節末尾的「極限」,就理解了 2013 年爆發的全部前因。
數學:Q-Learning 的更新與收斂#
更新規則#
每步觀察 \((s_t, a_t, r_{t+1}, s_{t+1})\) ,執行:
與 TD(0) 的差別一目了然:左邊更新的是 \(Q\) 而非 \(V\) ;右邊把「下一步的策略價值 \(V(s_{t+1})\) 」換成「下一步取 max 的 Q 值」。max 就是「假設下一步起永遠最優」——這正是 Bellman 最優方程(第 2.2 節)的右端!所以 Q-Learning 的更新是「把 Bellman 最優方程當作學習目標」:目標的期望不動點就是 \(q^*\) 。
為何 off-policy 可行(關鍵證明骨架)#
令行為策略(探索用)為 \(b(a|s)\) (任何保證 \(\pi_{\text{greedy}}(a|s) > 0\) 的策略皆可)。更新在給定 \(s_{t+1}\) 條件下的期望為:
注意:行為策略 \(b\) 沒有出現在期望式中(它只決定「你去了哪裡」,不決定「目標是什麼」)。因此 \(Q\) 的期望動力學與行為策略無關,收縮映射 \(T^*Q = r + \gamma P \max Q\) 的不動點唯一且是 \(q^*\) 。加上 Robbins-Monro 步長條件與「所有 \((s,a)\) 無窮次拜訪」,得機率 1 收斂到 \(q^*\) (Watkins & Dayan 1992)。對比第 3.1 節:TD(λ) 評估的是「你實際走的那個策略」,而 Q-Learning 評估的是「貪婪化之後的最優策略」——max 讓更新目標脫離了行為策略的綁架。
貪婪化與 ε-greedy#
有了 \(Q\) ,行動策略自然是貪婪: \(a = \arg\max_a Q(s,a)\) 。但純貪婪沒有探索(第 1.2 節差異三),標準解法 ε-greedy:
ε-greedy 的理論缺陷:它在所有狀態、對所有非最優動作花同樣的探索力度——已確認很差的動作還一直試。多臂老虎機理論給出更聰明的答案 UCB(Upper Confidence Bound, Auer et al. 2002):
其中 \(N(s,a)\) 是該動作被嘗試次數:越少試過的動作,樂觀加分越大。這把「不確定性」變成「吸引力」,遺憾界為對數而非線性。記住這個式子——2016 年 AlphaGo 的 PUCT 公式 \(U(s,a) = Q(s,a) + c_{puct} P(s,a)\frac{\sqrt{\sum_b N}}{1+N(s,a)}\) 就是 UCB 加上先驗(網路的策略輸出 \(P\) )的版本(第 6.2 節)。
flowchart TD
A[TD(λ) 1988: 評估 v^π] -->|問題: 無法直接選動作| B[需要模型或策略改進]
B --> C[Watkins 1989: Q-Learning]
C --> D["更新目標 = Bellman 最優方程<br>Q ← Q + α[r + γ max_a' Q(s') - Q]"]
D --> E[off-policy: 探索與學習解耦]
E --> F[ε-greedy: 簡單但線性 regret]
E --> G[UCB: 不確定性當樂觀加分<br>→ PUCT → AlphaGo 第6章]
D --> H[表格 Q 的極限: 維度災難]
H --> I[DQN 2013: 神經網路近似 Q<br>第4章]程式碼:表格 Q-Learning 解 FrozenLake#
# pip install gymnasium numpy
import gymnasium as gym
import numpy as np
env = gym.make("FrozenLake-v1", is_slippery=True)
S, A, GAMMA = env.observation_space.n, env.action_space.n, 0.99
Q = np.zeros((S, A)) # 表格: 16×4
EPISODES = 20000
for ep in range(EPISODES):
obs, _ = env.reset(seed=ep)
done = False
while not done:
# ε-greedy: 探索率線性衰減 1.0 → 0.05
eps = max(0.05, 1.0 - ep / 10000)
if np.random.random() < eps:
a = env.action_space.sample()
else:
a = int(np.argmax(Q[obs])) # 打破平手可加微小雜訊
ns, r, term, trunc, _ = env.step(a)
# 核心: Bellman 最優方程當學習目標 (off-policy)
target = r + GAMMA * np.max(Q[ns]) * (not term)
Q[obs, a] += 0.1 * (target - Q[obs, a])
obs, done = ns, term or trunc
pi = np.argmax(Q, axis=1)
# 檢驗: 貪婪策略的實際勝率
env2 = gym.make("FrozenLake-v1", is_slippery=True)
wins = 0
for ep in range(1000):
obs, _ = env2.reset(seed=10_000 + ep); done = False
while not done:
obs, r, term, trunc, _ = env2.step(int(pi[obs]))
done = term or trunc
if term: wins += (r == 1.0)
print(f"學得策略 1000 回合勝率: {wins/1000:.1%} (動態規劃最優約 65-70%)")
print("學到的 Q 表 (前 4 狀態):")
print(np.round(Q[:4], 3))
觀察要點:(1)學得的勝率應接近(但可能略低於)第 2.2 節動態規劃的結果——我們全程沒看過 \(P\) 與 \(R\) ,只靠採樣就逼近了規劃的答案;(2)探索率必須從高衰減:初期高 ε 才能找到路徑,後期低 ε 才能精修;(3)(not term) 處理終止狀態——終點的「未來價值」必須為 0,否則 \(q^*\) 的定義會被破壞(常見 bug)。
表格方法的極限:三重天花板#
- 維度災難:表格大小 \(= |\mathcal{S}| \times |\mathcal{A}|\) 。FrozenLake 是 \(16 \times 4\) ,輕鬆;Atari 畫面是 \(2^{210 \times 160 \times 3}\) 量級的狀態空間,表格直接不可行。即便離散化,維度一高,「見過的狀態」占比趨近 0——泛化成為生死問題。
- 樣本效率:收斂條件要求「所有 \((s,a)\) 無窮次拜訪」。實際中多数 \((s,a)\) 永遠見不到幾次;表格無法把經驗從「相鄰狀態」借過來(狀態 14 的教訓救不了狀態 15)。函數近似的意義正是共享表示。
- 沒有標準環境:1990 年代每篇論文用自製環境,結果無法比較、無法累積。1998 年 Sutton & Barto 教科書催生了共同語言,但要等到 2016 年 OpenAI Gym(第 4 章)提供標準化 API(
reset/step/space),深度 RL 才能以可比較、可複現的方式快速疊代。本書程式碼全程使用 Gymnasium API,正是踩在這個標準化遺產上。
這三個天花板在 1989-2013 年間都存在,逐一被破解的順序是:Gym(標準化)→ DQN(神經網路近似 Q)→ GPU 算力。第 4 章我們將看到:DQN 幾乎原封不動地保留了 Q-Learning 的更新式,只是把「查表 \(Q(s,a)\) 」換成「神經網路前向傳播」——但僅僅這一步替換,就引爆了致命三要素(自舉 + 函數近似 + off-policy),迫使經驗回放與目標網路誕生。
本節重點#
- Q-Learning(Watkins 1989)直接學 \(q^*\) :更新式 \(Q \leftarrow Q + \alpha[r + \gamma \max_{a'} Q(s') - Q]\) 就是把 Bellman 最優方程當學習目標。
- off-policy 是它的超能力:max 使更新目標不受行為策略影響,探索(怎麼走)與學習(目標是什麼)解耦;配合「所有 (s,a) 無窮次拜訪」條件,機率 1 收斂到 \(q^*\) 。
- ε-greedy 簡單但對所有非最優動作一視同仁(線性 regret);UCB 把不確定性轉為樂觀加分(對數 regret),其思路經 PUCT 進化成 AlphaGo 的樹搜尋核心。
- 表格方法的三重天花板:維度災難、無泛化的樣本效率、缺乏標準環境基準——1989-2013 的沉寂正是等這三題被破解。
- Q-Learning 的數學骨架(Bellman 最優方程 + 收縮映射 + 隨機逼近)自 1957-1989 一路未變;2013 年 DQN 的革命不在理論,而在「用神經網路承載這條方程」以及随之而來的穩定性工程。
思考問題#
- Q-Learning 收斂條件要求每個 \((s,a)\) 被拜訪無窮多次。在「探索必須穿過狹窄通道才能到達大片區域」的環境中,ε-greedy 為何可能永遠到不了?你會怎麼改進探索?
- 把程式中
eps的衰減改成「保持 0.2 不變」與「0.9 快速衰減」,比較最終勝率。請解釋兩種失敗模式(探索不足 vs. 永遠被隨機動作干擾)。 - 第 2.2 節說最優策略存在且確定性;本節 Q-Learning 學的正是 \(q^*\) 。那為什麼實務中學到的 \(\arg\max Q\) 常常在「兩個相近動作」間不穩定?這對後續(第 5 章)「直接學隨機策略」的動機有何啟示?
- UCB 公式中 \(\sqrt{\ln N(s)/N(s,a)}\) 在 \(N(s,a)=0\) 時無窮大。請說明這「無窮樂觀」的意義,以及它與嬰兒「什麼都往嘴裡塞」行為的類比。
- 若把 FrozenLake 狀態空間放大到 100×100,表格 Q-Learning 需要多少次有效拜訪才可能收斂?請估算並說明為何「函數近似共享表示」是唯一出路。