Behavioral Cloning
行为克隆通过监督学习训练策略,使其模仿专家演示。本文介绍其工作原理、误差累积的原因,以及 DAgger 如何解决这一问题。
行为克隆(BC)是最简单的模仿学习形式:智能体通过训练策略来学习行动,具体做法是使用普通的监督学习,预测记录演示中专家在每种情境下采取的动作。训练数据由观察-动作对组成,例如将摄像头画面与驾驶员的转向角配对,或将机器人的关节读数与遥操作员的指令配对;对于连续动作,策略使用回归损失进行拟合,对于离散动作,则使用分类损失。行为克隆不需要奖励函数,也不需要在训练期间与环境交互,因此通常用于根据人类演示来训练机器人、车辆和软件 AI 智能体。
起源与经典示例#
这一名称源自 Donald Michie 及其同事在 1990 年前后重建人类控制技能的研究。最著名的早期演示是 Claude Sammut 及其同事 1992 年的“Learning to Fly”:他们记录人们驾驶飞行模拟器时的控制动作,并根据这些记录生成决策树自动驾驶仪。Carnegie Mellon 的 Dean Pomerleau 早在 1989 年就通过 ALVINN 展示了小型神经网络可以根据摄像头图像控制测试车辆。
NVIDIA 在 2016 年推出的端到端驾驶系统使用约 72 小时的人类驾驶数据训练卷积神经网络,将前向摄像头的原始像素直接映射为转向指令;在新泽西州蒙茅斯县的一次典型驾驶中,该系统约有 98% 的时间能够自主转向。对于离散动作,行为克隆就是图像分类:在摄像头画面上训练的 Ultralytics YOLO26 分类模型,将图像按驾驶员采取的动作分别放入文件夹,例如左转、直行和右转,然后输出克隆动作作为 top-1 类别。
误差累积问题#
训练期间,策略只会看到专家访问过的状态。部署时,策略以闭环方式行动,因此每个小错误都会让它进入一个与演示中状态略有不同的状态,在该状态下它更可能再次出错,错误也会沿着轨迹不断累积。训练状态与部署状态之间的这种不匹配称为协变量偏移。Stéphane Ross 和 Drew Bagnell 在 2010 年指出,即使策略每一步的错误都很小,克隆策略的预期成本仍可能随任务时域的平方增长。Ross、Geoffrey Gordon 和 Bagnell 于 2011 年提出的 DAgger(数据集聚合)将增长降低为线性:先由学习得到的策略行动,再由专家为策略访问过的状态标注正确动作,最后使用迄今收集的所有标签重新训练策略。
这个示例克隆一个为 Gymnasium CartPole任务手动调优的控制器。该任务要求在移动小车上平衡杆子,最多持续 500 步;随后,示例会进行两轮 DAgger:
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 步演示上训练;专家在这段演示中将杆子平衡了 500 步,但克隆策略在新回合中平均只能维持 30 步。第 1 轮加入克隆策略在另一个回合中访问的 23 个状态,并由专家为这些状态标注;平均步数因此升至 135。第 2 轮再加入 70 个这样的状态后,克隆策略便能将杆子平衡整整 500 步。
其他改进方法会调整演示本身。NVIDIA 的驾驶系统加入了左侧和右侧摄像头拍摄的图像,以及摄像头视角的合成平移和旋转;每张图像都标注了在两秒内让汽车回到车道中央所需的转向操作。这是一种数据增强,可以教会系统如何恢复。DART 在记录演示时向演示者的动作注入噪声,因此数据中会包含专家纠正小幅偏差的过程。动作分块会一次预测多个未来动作,从而缩短错误累积的有效时域;ACT 策略仅凭 10 分钟的演示,就能以 80% 到 90% 的成功率完成精细的双手任务,例如插入电池。
多模态演示与现代策略#
如果演示者以不同方式解决同一种情境,例如从障碍物左侧或右侧通过,回归策略就会预测这些动作的平均值,而这个平均值可能不是任何人实际采取过的动作。Google 的 RT-1 是一个通过行为克隆在 130,000 次机器人演示上训练的Transformer,它将每个动作维度离散为 256 个区间,并将这些区间作为词元进行预测,因此能够表示多种动作模式。扩散策略通过对随机噪声进行去噪来建模完整的动作分布,现已成为具身 AI操作任务中的常见选择。
语言模型也以同样的方式训练。使用人工撰写的答案对大型语言模型(LLM)进行监督式微调,这是指令微调的核心,也就是对文本进行行为克隆;OpenAI 的 WebGPT 论文正是用这个名称来指代基于人类反馈的强化学习(RLHF)之前的阶段。










