JOVANA
Explore Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

把離策略學對:重要性抽樣、最大化偏差與雙 Q 學習

從一個策略的資料去學另一個策略——並修正最大值運算子偷偷帶入的微妙高估。

離策略帶來什麼、又要付什麼代價

離策略學習把兩個策略分開:產生資料的行為(behaviour)策略(常刻意帶探索性),以及你真正想評估或改進的目標(target)策略(常是貪婪的那個)。回報很大——你可以一邊探索一邊學最佳策略、重用舊策略甚至人類收集的資料,並從單一串經驗同時學習多個目標策略。

代價是你的資料是依錯誤的策略分佈的。如果行為策略採取了一個目標策略很少採取的動作,這段經驗相對於目標策略實際會產生的,就被過度代表了。天真地平均它會得到有偏差的答案。修正這個不一致正是重要性抽樣(importance sampling)的工作。

蒙地卡羅的重要性抽樣

重要性抽樣為每個觀察到的回報重新加權,依據的是目標策略相對於行為策略產生那條軌跡的可能性高或低多少。權重是沿著軌跡各動作的比值 π(aₜ|sₜ) / b(aₜ|sₜ) 的乘積。把每個回報乘上它的比值再平均,你就還原出目標策略價值的無偏估計。

\rho_{t:T-1} = \prod_{k=t}^{T-1} \frac{\pi(A_k \mid S_k)}{b(A_k \mid S_k)}

重要性采样比率按目标策略 π 相对于行为策略 b 产生该轨迹的可能性大小,对回报进行重新加权。

有兩種風味。普通(ordinary)重要性抽樣(除以回合數)是無偏的,但變異數可能極大、甚至無限——一條長軌跡的比值是許多因子的乘積,可能爆炸。加權(weighted)重要性抽樣(除以權重總和)略有偏差,但變異數低得多,實務上幾乎總是首選。

為何 Q 學習無需重要性抽樣就是離策略

一個自然的問題:Q 學習是離策略的,但你在它的更新裡從沒看到重要性抽樣比值。為什麼?因為 Q 學習直接以 max_b Q(s′, b)——貪婪目標動作的價值——來自助,而不是以一整條抽樣軌跡的回報。目標策略是確定性的(貪婪),所以單步目標不需要重新加權;行為策略只影響你拜訪哪些狀態,不影響你自助的價值。

网格世界上的交互式 Q 学习:由于更新自举于 max_b Q(s′,b),它无需重要性采样比率即可离策略地学习贪心目标策略。

交互式网格世界:智能体学习每个格子的 Q 值并收敛到最优路径。

這正是單步、自助式的離策略方法如此方便的原因——而且在標準的隨機近似條件下(每個狀態-動作配對被拜訪無限多次、步長適當),表格式 Q 學習可被證明收斂到最佳動作價值。但那個方便的最大值藏著一個瑕疵。

最大化偏差

最大化偏差(maximization bias)是一種微妙、系統性的高估。Q 學習的目標對有雜訊的估計動作價值取最大值。陷阱在這裡:數個有雜訊估計的最大值,平均而言大於它們真實值的最大值,因為最大值運算子會偏好挑中那個剛好高估的估計。同時用一個最大值來最佳動作又評估它,會讓那股向上的雜訊直接漏進目標。

Sutton 與 Barto 的小型 MDP 把這點呈現得很生動:一個其中每個動作真實期望值都為零的狀態,在 Q 學習下會長時間看起來是正的,誘使策略偏向它。更深層的元兇是單一估計量被用於兩個耦合的角色——選擇與評估。

雙 Q 學習,以及它通往何處

雙 Q 學習(double Q-learning)藉由保留兩張獨立的動作價值表 Q₁ 與 Q₂ 來打破這個耦合。每次更新你隨機挑一張來更新;你用那張表選出貪婪動作,卻用另一張表來評估它:Q₁(s, a) ← … + α·(r + γ·Q₂(s′, argmax_b Q₁(s′, b)) − Q₁(s, a))。因為負責選擇的表與負責評估的表在統計上獨立,向上的選擇雜訊不再餵養自己,高估也就大致消失。

Q_1(S,A) \leftarrow Q_1(S,A) + \alpha\!\left[R + \gamma\, Q_2\!\left(S',\, \operatorname*{arg\,max}_{a} Q_1(S',a)\right) - Q_1(S,A)\right]

双 Q 学习将动作选择与价值评估解耦:一张表用于选择动作(对 Q₁ 取 argmax),另一张表用于评估它(Q₂),从而消除大部分最大化偏差。

# Double Q-learning: select with one table, evaluate with the other
if random() < 0.5:
    a_star  = argmax(Q1[s_next])             # select using Q1
    target  = r + gamma * Q2[s_next, a_star] # evaluate using Q2
    Q1[s, a] += alpha * (target - Q1[s, a])
else:
    a_star  = argmax(Q2[s_next])             # roles swapped
    target  = r + gamma * Q1[s_next, a_star]
    Q2[s, a] += alpha * (target - Q2[s, a])
# act using Q1 + Q2 (e.g. epsilon-greedy on their sum)
把選擇與評估解耦,去除了大部分的最大化偏差。

你現在擁有完整的蒙地卡羅與時間差分工具箱:從回報或從自助的單步目標學價值、用 TD(λ) 橫跨整個光譜、用 SarsaQ 學習期望 Sarsa把預測變成控制,並用重要性抽樣與偏差修正的更新安全地離策略學習。這些正是幾乎所有現代強化學習所立足的主力。