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

看著學:行為克隆

當你手上有示範資料卻沒有獎勵函數時,最簡單的做法就是把控制問題當成監督式學習。這就是行為克隆。

為什麼要模仿,而不是探索?

傳統的強化學習透過反覆試誤來學習,並由獎勵訊號引導。但在許多實際問題中,獎勵很難明確寫下來(開車「開得好」的獎勵到底是什麼?),而純粹的探索又緩慢且危險。模仿學習(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()
行為克隆其實就是分類/回歸——把所有軌跡攤平成一個帶標籤的大型資料集。

最精簡的步驟

  1. 蒐集示範。錄製專家在環境中的行為,把每一組 (狀態, 動作) 對存下來。讓狀態的涵蓋範圍更廣,比重複同一個狀態更有價值。
  2. 選定策略族。挑一個把狀態映射到動作分布的網路,並對應動作空間(離散動作用 softmax,連續控制用高斯分布)。
  3. 用最大概似擬合。最小化預測動作與示範動作之間的監督式損失,並搭配標準技巧:打亂順序、切驗證集、提早停止。
  4. 部署並觀察。把策略放到環境中執行,留意它在哪些地方偏離了類似專家的狀態——這個失敗模式正是下一篇的主題。
\theta^{\star} = \arg\max_{\theta} \sum_{(s,a)\in\mathcal{D}} \log \pi_{\theta}(a \mid s)

行為克隆透過最大似然擬合策略——最大化策略下每個專家動作的對數機率。

行為克隆的亮點——以及它的盲點

行為克隆是極佳的基準線:它快速、穩定、不需要與環境互動,而且往往能提供一個強健的起始策略,之後再用強化學習微調。這正是離線強化學習實務者總會保留一條 BC 基準線做比較的原因。當示範充足、且部署時遇到的狀態與訓練時相似,行為克隆幾乎難以超越。

它的盲點微妙卻致命:策略只在專家造訪過的狀態上受過訓練。學習者一旦犯下小錯,就會落入專家從未示範過的狀態,因而手足無措、犯下更大的錯——錯誤就此滾雪球般累積。下一篇我們會拆解這個複合誤差(compounding error)問題。