Behavioral Cloning
行動クローニングでは、教師あり学習でエキスパートのデモンストレーションを模倣するポリシーを学習します。仕組み、誤差が累積する理由、DAggerによる解決方法を解説します。
行動クローニング (BC) は、最も単純な模倣学習の形式です。エージェントは通常の教師あり学習で方策を訓練し、記録されたデモンストレーションの各状況でエキスパートが取った行動を予測することで、行動を学習します。学習データは観測と行動のペアで構成されます。たとえば、カメラフレームとドライバーの操舵角、あるいはロボットの関節値と遠隔操作者の指令をペアにします。方策は連続行動には回帰損失、離散行動には分類損失を使って適合させます。行動クローニングでは報酬関数が不要で、学習中に環境とやり取りする必要もありません。そのため、人間のデモンストレーションからロボット、車両、ソフトウェアのAIエージェントを学習させる際の一般的な出発点となっています。
起源と代表的な初期例#
この名称は、1990年頃にDonald Michieらが人間の制御スキルを再構築した研究に由来します。初期の最もよく知られた実証例は、Claude Sammutらが1992年に発表した「Learning to Fly」です。飛行シミュレーターを操縦する人々の制御行動を記録し、そのログから決定木型の自動操縦システムを導出しました。Carnegie Mellon大学のDean PomerleauによるALVINNは、それに先立つ1989年に、小さなニューラルネットワークがカメラ画像から試験車両を操縦できることを示していました。
NVIDIAの2016年のエンドツーエンド運転システムは、約72時間分の人間の運転データで畳み込みニューラルネットワークを訓練し、前方カメラの生ピクセルを操舵指令に直接対応付けました。ニュージャージー州モンマス郡での一般的な走行では、約98%の時間を自動で操縦しました。行動が離散的な場合、行動クローニングは画像分類です。たとえば、左、直進、右など、ドライバーが取った行動ごとにフォルダーを分けてカメラフレームで訓練したUltralytics YOLO26分類モデルは、クローニングした行動をtop-1クラスとして出力します。
誤差の累積問題#
学習中、方策が見るのはエキスパートが訪れた状態だけです。デプロイ後は閉ループで動作するため、小さなミスがデモンストレーションにほとんど現れない状態へ方策を移動させます。その状態ではさらにミスが起きやすくなり、軌跡に沿って誤差が蓄積します。学習時とデプロイ時の状態のこの不一致は、共変量シフトの一種です。Stéphane RossとDrew Bagnellは2010年に、1ステップあたりの誤差が小さくても、クローニングした方策の期待コストはタスクの時間幅の二乗に比例して増大する可能性があることを示しました。Ross、Geoffrey Gordon、Bagnellが2011年に発表したDAgger (Dataset Aggregation) は、増大を線形に抑えました。学習済み方策を動作させ、エキスパートが訪問した状態に正しい行動をラベル付けし、これまでに収集したすべてのラベルを使って方策を再訓練します。
この例では、Gymnasium CartPoleタスク向けに手作業で調整したコントローラーをクローニングします。このタスクでは、動く台車の上のポールを最大500ステップにわたって倒さずに保つ必要があります。続いて、DAggerを2ラウンド適用します。
import gymnasium as gym
import numpy as np
from sklearn.tree import DecisionTreeClassifier
env = gym.make("CartPole-v1")
expert = lambda obs: int(obs[2] + 0.5 * obs[3] > 0) # push toward the side the pole leans and falls
def rollout(policy, seed):
"""Run one episode with a policy and return the states it visited."""
obs, _ = env.reset(seed=seed)
states, done = [], False
while not done:
states.append(obs)
obs, _, terminated, truncated, _ = env.step(policy(obs))
done = terminated or truncated
return states
states = rollout(expert, seed=0) # one expert demonstration
for i in range(3):
# Behavioral cloning: fit a classifier from states to the expert's actions
clone = DecisionTreeClassifier(max_depth=5, random_state=0).fit(states, [expert(s) for s in states])
policy = lambda obs: int(clone.predict(obs[None])[0])
steps = np.mean([len(rollout(policy, seed)) for seed in range(100, 110)])
print(f"Round {i}: {len(states)} labeled states, clone balances for {steps:.0f} steps")
states += rollout(policy, seed=i + 1) # DAgger: the expert labels the states the clone visitsラウンド0は通常の行動クローニングです。500ステップすべてポールを倒さずに保つエキスパートのデモンストレーション1本で訓練すると、クローニングした方策は新しいエピソードで平均30ステップ、ポールを立てたままにできます。ラウンド1では、ラウンド0の方策が別の1エピソードで訪れた23状態にエキスパートがラベルを付けて追加し、平均ステップ数は135に上がります。ラウンド2でさらに70状態を追加すると、方策は500ステップすべてポールを保てるようになります。
デモンストレーション自体を調整する方法もあります。NVIDIAの運転システムでは、左右のカメラ画像に加えて、カメラ視点を人工的にシフト・回転させた画像を追加しました。それぞれに、2秒以内に車を車線中央へ戻すための操舵をラベル付けしました。これは復帰動作を学習させるデータ拡張の一種です。DARTは記録中にデモンストレーターの行動にノイズを加えるため、データには小さなずれを修正するエキスパートの動作が含まれます。アクションチャンク化では将来の複数の行動を一度に予測するため、誤差が累積する実質的な時間幅が短くなります。ACT方策は、バッテリーを差し込むような細かな両手作業を、10分間のデモンストレーションから80%~90%の成功率で学習しました。
マルチモーダルなデモンストレーションと最新の方策#
デモンストレーターが同じ状況で異なる方法を取る場合、たとえば障害物の左側を通る場合と右側を通る場合、回帰方策はその平均を予測しますが、それは誰も取らなかった行動かもしれません。行動クローニングで訓練されたGoogleのRT-1は、ロボットのデモンストレーション130,000件で学習したTransformerであり、各行動次元を256個のビンに離散化してトークンとして予測することで、複数のモードを表現できます。拡散方策はランダムノイズを除去して行動の完全な分布をモデル化する手法で、身体性AIの操作タスクで一般的に選ばれるようになっています。
言語モデルも同じ方法で訓練されます。大規模言語モデル (LLM)を人間が書いた回答で教師ありファインチューニングすることは、指示チューニングの中核であり、テキスト上の行動クローニングです。OpenAIのWebGPT論文では、人間のフィードバックによる強化学習 (RLHF)の前段階に対して、まさにこの名称が使われていました。
行動クローニングと関連用語の比較#
- 強化学習: 試行錯誤を通じて報酬シグナルから学び、デモンストレーターを超えることもできますが、行動クローニングにはできません。TD3+BCなどのオフラインRL手法は、学習済み方策を記録データに近づけておくために、行動クローニングの項を追加します。
- 逆強化学習: デモンストレーションを説明する報酬関数を推定し、その報酬関数を最適化します。敵対的生成模倣学習 (GAIL) は、識別器が方策の行動とエキスパートの行動を区別できなくなるまで方策を訓練します。
- 知識蒸留: 小さな生徒モデルを訓練し、より大きな教師モデルの出力に一致させます。人間ではなく訓練済み方策を対象とする行動クローニングは、方策蒸留と呼ばれます。










