為什麼要模仿,而不是探索?
傳統的強化學習透過反覆試誤來學習,並由獎勵訊號引導。但在許多實際問題中,獎勵很難明確寫下來(開車「開得好」的獎勵到底是什麼?),而純粹的探索又緩慢且危險。模仿學習(imitation learning)同時繞過了這兩個難題:你不給代理人獎勵,而是給它示範(demonstrations)——也就是專家執行任務的錄製範例——並要求它表現得像專家一樣。
對比監督學習、無監督學習與強化學習的示意圖。
這種重新框架很有威力。人類「示範」一項技能的能力,遠勝於為它「設計獎勵」。外科醫師、堆高機駕駛或電玩高手都能隨時產出出色的軌跡,但他們誰也無法交給你一個乾淨俐落的獎勵函數。
行為克隆:把控制當成監督式學習
行為克隆(behavioral cloning, BC)是最直接的模仿方式。你把每一個示範過的狀態與其動作配成一對,訓練一個策略 π(a | s) 從狀態預測專家的動作——就像分類器從輸入預測標籤一樣。強化學習問題就此化約為普通的監督式學習。
具體來說:輸入是狀態,標籤是專家的動作,而損失函數則依動作型別而定——離散動作用交叉熵(cross-entropy),連續動作用均方誤差(mean-squared error)。整個訓練過程完全不需要模擬器、獎勵,甚至一步環境互動都不用。
監督學習迴路:資料輸入模型,預測與標籤透過損失比較,然後更新模型。
# Behavioral cloning: pure supervised learning on (state, action) pairs
dataset = [(s, a) for trajectory in expert_demos
for (s, a) in trajectory]
for epoch in range(num_epochs):
for (states, actions) in batches(dataset):
pred = policy(states) # predicted action distribution
loss = action_loss(pred, actions) # cross-entropy or MSE
loss.backward()
optimizer.step()最精簡的步驟
- 蒐集示範。錄製專家在環境中的行為,把每一組 (狀態, 動作) 對存下來。讓狀態的涵蓋範圍更廣,比重複同一個狀態更有價值。
- 選定策略族。挑一個把狀態映射到動作分布的網路,並對應動作空間(離散動作用 softmax,連續控制用高斯分布)。
- 用最大概似擬合。最小化預測動作與示範動作之間的監督式損失,並搭配標準技巧:打亂順序、切驗證集、提早停止。
- 部署並觀察。把策略放到環境中執行,留意它在哪些地方偏離了類似專家的狀態——這個失敗模式正是下一篇的主題。
行為克隆透過最大似然擬合策略——最大化策略下每個專家動作的對數機率。
行為克隆的亮點——以及它的盲點
行為克隆是極佳的基準線:它快速、穩定、不需要與環境互動,而且往往能提供一個強健的起始策略,之後再用強化學習微調。這正是離線強化學習實務者總會保留一條 BC 基準線做比較的原因。當示範充足、且部署時遇到的狀態與訓練時相似,行為克隆幾乎難以超越。
它的盲點微妙卻致命:策略只在專家造訪過的狀態上受過訓練。學習者一旦犯下小錯,就會落入專家從未示範過的狀態,因而手足無措、犯下更大的錯——錯誤就此滾雪球般累積。下一篇我們會拆解這個複合誤差(compounding error)問題。