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)問題。