複合誤差陷阱
監督式學習假設訓練與測試資料來自同一個分布。行為克隆卻悄悄違反了這個假設。訓練時,狀態取自專家的行為;部署時,狀態卻取自學習者自己的行為——而學習者並不完美,於是它會造訪專家絕不會去的狀態。
每一個微小的動作誤差都會把代理人從專家路徑稍微推開一點。這讓它落入一個稍微陌生的狀態,其預測就稍差,於是又被推得更遠,如此循環。在序列決策問題中,每步誤差率 ε 可能讓整段長度為 T 的歷程的總期望錯誤膨脹到約 ε·T²——是二次方而非線性。一個在保留影格上看似 99% 準確的策略,仍可能直接把車開出路面。
智能体—环境强化学习循环示意图:智能体执行动作,环境返回新状态和奖励,如此循环往复。
為它正名:共變量偏移
這個現象的精確名稱是共變量偏移(covariate shift):輸入分布(狀態,即共變量)在訓練與測試之間不同,但「給定狀態下的正確動作」這個條件關係維持不變。行為克隆最佳化的是錯的期望值——專家狀態分布下的平均損失——而我們真正在意的,是學習者狀態分布下的損失。
协变量偏移:学习者访问的状态分布与专家不同,而每个状态对应的正确动作保持不变。
這樣看來,修正之道在原理上顯而易見:從學習者的狀態分布取得訓練資料。但這裡有個雞生蛋的難題——我們需要學習者所造訪狀態的專家標籤,而專家自然只會造訪它自己的狀態。我們需要一個方法去問專家:「在我誤打誤撞進來的這個狀態下,你會怎麼做?」
DAgger:不斷追問專家
DAgger(Dataset Aggregation,資料集聚合)把這個迴圈閉合起來。先用當前的學習者產生軌跡,接著對它造訪過的每一個狀態,向專家詢問它原本會採取的動作。把這些新標註的狀態加進一個不斷成長的資料集再重新訓練,然後反覆進行。由於新狀態來自學習者,你終於是在「未來真正會被測試」的那個分布上訓練了。
- 從一個策略開始(例如先做一輪行為克隆),並令聚合資料集 D = 原始示範。
- 在環境中執行當前策略,蒐集它實際造訪到的狀態。
- 對每個造訪到的狀態,向專家詢問正確動作,並把這些 (狀態, 專家動作) 對加進 D。
- 在整個聚合後的 D 上重新訓練策略,接著從第 2 步重複。
D = expert_demos # initial aggregated dataset
policy = train_bc(D)
for i in range(num_iterations):
states = rollout(policy) # learner's OWN state distribution
labels = [expert.action(s) for s in states] # query the expert here
D = D + list(zip(states, labels)) # AGGREGATE, never discard
policy = train_bc(D) # refit on everything seen so far代價與注意事項
DAgger 用「訓練時與專家的互動」換取資料。當專家是一個演算法時(例如你想把一個緩慢的規劃器蒸餾成快速的反應式策略),這很便宜;但當專家是人類時,代價就高昂又彆扭,因為人得為學習者闖進去的脫離情境狀態貼標籤——有時那些狀態危險、有時根本毫無道理。
DAgger 也繼承了行為克隆的上限:它最多只能追上它所查詢的專家,而一個帶雜訊或次優的專家會封死效能。儘管如此,DAgger 仍是處理共變量偏移的經典解法,也是更豐富方案的基石——這些方案把模仿與獎勵結合起來,我們會在示範引導式強化學習中看到。
DAgger 为何更优:行为克隆与专家的差距会随时间跨度 T 二次增长,而 DAgger 使其保持线性。