从这一课开始,我们第一次真正进入 Robot Learning。
今天只解决一个核心问题:
如果我已经有很多"正确操作示范",能不能让神经网络直接学会:
\ \\text{Observation}\\rightarrow\\text{Action} \\
答案就是:
Behavior Cloning
简称:
BC
中文通常叫:
行为克隆。
1. 先不讲公式:什么叫 Behavior Cloning?
假设一个人正在操作机器人。
在某一个时刻:
机器人看到:
物体在前方
机器人状态:
机械臂当前处于某个姿态
人类操作者:
让末端向前移动一点
我们把这一次记录下来:
Observation → Human Action
然后再记录很多很多次:
Observation 1 → Action 1
Observation 2 → Action 2
Observation 3 → Action 3
...
Observation N → Action N
最后得到一个数据集。
然后让神经网络学习:
当你以后看到类似 Observation 时,也输出类似 Action。
这就是 Behavior Cloning 最核心的思想。
2. 它其实和普通监督学习非常像
如果你以前见过图像分类:
猫图片 → 猫
狗图片 → 狗
汽车图片 → 汽车
可以训练:
\ \\text{Image}\\rightarrow\\text{Class} \\
Behavior Cloning 做的事情非常类似:
Observation → Action
也就是:
\ \\text{Input}\\rightarrow\\text{Label} \\
区别只是这里的"Label"不再是:
猫
狗
汽车
而变成:
机器人应该采取的动作
所以:
BC 本质上就是把模仿机器人专家操作的问题,转换成一个监督学习问题。
这是今天最核心的一句话。
3. 什么叫 Demonstration?
现在引入第一个正式术语:
Demonstration
中文:
示范数据 / 专家示范
假设人类遥操作机械臂完成了一次:
拿起方块。
机器人整个过程可能经历:
t = 0
观察环境
→ 向物体靠近
t = 1
观察环境
→ 继续靠近
t = 2
观察环境
→ 向下移动
t = 3
观察环境
→ 关闭夹爪
t = 4
观察环境
→ 向上移动
这一整段就是一次:
Demonstration
也经常称作:
Trajectory
4. Trajectory 是什么?
Trajectory 可以写成:
\ \\tau = (o_0,a_0,o_1,a_1,\\ldots,o_T,a_T) \\
这里:
- \(\tau\):一条 trajectory;
- \(o_t\):第 \(t\) 时刻的 observation;
- \(a_t\):第 \(t\) 时刻专家执行的 action;
- \(T\):这一段轨迹的长度。
简单理解:
Trajectory 就是从任务开始到结束,按时间记录下来的一串 Observation 和 Action。
例如:
Episode 001
Frame 0
image_000.png
state_000
action_000
Frame 1
image_001.png
state_001
action_001
Frame 2
image_002.png
state_002
action_002
...
以后看真实机器人数据集时,你会经常碰到:
- Episode
- Trajectory
- Frame
- Observation
- Action
- Timestamp
这些词。
5. Demonstration 从哪里来?
最常见的是:
Human
↓
Teleoperation
↓
Robot
也就是:
人类遥操作机器人。
例如操作者通过:
- 手柄;
- 键盘;
- 主从机械臂;
- VR 控制器;
- 3D 鼠标;
- 手持控制设备;
让机器人完成任务。
同时程序不断记录:
Camera
Robot State
Action
Timestamp
最终形成训练数据。
6. 第一次认识 Robot Dataset
假设采集了 100 次抓取任务。
每一次都是一个 Episode:
Dataset
│
├── Episode 000
│ ├── Frame 000
│ ├── Frame 001
│ ├── Frame 002
│ └── ...
│
├── Episode 001
│ ├── Frame 000
│ ├── Frame 001
│ └── ...
│
└── ...
某个 Frame 中可能包含:
RGB Image
Robot State
Action
Timestamp
于是我们第一次建立:
\ (o_t,a_t) \\
训练样本。
7. BC 到底训练什么?
现在假设我们有:
\ (o_t,a_t) \\
其中 \(a_t\) 是人类专家实际执行过的动作。
我们建立一个神经网络:
\ \\pi_\\theta \\
这里多出来了:
\ \\theta \\
它表示:
神经网络里所有可以学习的参数。
例如:
- weight;
- bias;
- Transformer 参数;
- Encoder 参数。
于是模型预测:
\ \\hat a_t=\\pi_\\theta(o_t) \\
注意:
\ a_t \\
和:
\ \\hat a_t \\
不是一个东西。
\(a_t\)
这是数据集中:
专家真正执行的 Action。
我们把它叫:
Ground Truth / Expert Action
\(\hat a_t\)
这是:
当前模型预测出来的 Action。
训练的目标就是:
\ \\hat a_t\\approx a_t \\
换句话说:
模型越来越像专家。
所以叫:
Behavior Cloning
行为克隆。
8. 第一个真正的 BC 数字例子
为了简单,假设 Action 只有两个维度:
\ a_t= \[\\Delta x,\\Delta y \]
专家动作是:
\ a_t= \[0.10,-0.05 \]
但是当前神经网络预测:
\ \\hat a_t= \[0.07,-0.01 \]
那显然预测得不完全正确。
两个方向误差:
\ 0.07-0.10=-0.03 \\
以及:
\ -0.01-(-0.05)=0.04 \\
模型需要根据这些误差进行调整。
这就是:
Loss
开始出现了。
9. BC 的 Loss 是干什么的?
Loss 可以理解为:
模型到底错得有多严重。
如果输出是连续 Action,可以使用一种非常简单的损失:
\ L= \\\|\\hat a_t-a_t\\\|_2\^2 \\
初学阶段先把它看成:
\ L= (\\hat a_1-a_1)\^2+ (\\hat a_2-a_2)\^2+\\cdots \\
也就是:
每个 Action 维度的预测误差平方,然后加起来。
例如:
\ a=\[0.10,-0.05 \]
预测:
\ \\hat a=\[0.07,-0.01 \]
那么:
\ L= (0.07-0.10)\^2+ (-0.01+0.05)\^2 \\
得到:
\ L= (-0.03)\^2+(0.04)\^2 \\\ L= 0.0009+0.0016 \\\ L=0.0025 \\
Loss 越小:
模型预测的 Action 越接近专家。
10. 所以 BC 的训练过程到底是什么?
现在第一次完整建立训练链路:
Robot Dataset
↓
Observation
↓
Policy
↓
Predicted Action
↓
Compare with Expert Action
↓
Loss
↓
Backpropagation
↓
Update Parameters
数学上:
\ \\hat a_t=\\pi_\\theta(o_t) \\
计算:
\ L(\\hat a_t,a_t) \\
然后调整:
\ \\theta \\
使得 Loss 越来越小。
11. 这里第一次出现"训练"和"真正执行"的区别
这个地方非常重要。
训练时
模型拥有:
Observation
+
正确答案 Action
也就是:
\ o_t \\rightarrow \\pi_\\theta \\rightarrow \\hat a_t \\
然后拿:
\ \\hat a_t \\
跟:
\ a_t \\
比较。
因此:
模型预测
↓
和专家答案比较
↓
计算 Loss
↓
修改模型
12. 真正运行时却不一样
模型训练完成以后,真实执行:
Observation
↓
Policy
↓
Predicted Action
↓
Robot executes it
这时候没有人告诉模型:
"正确答案应该是 0.1。"
也就是说:
Training
有专家答案:
\ (o_t,a_t) \\
Inference / Rollout
只有 Observation:
\ o_t \\
模型必须自己输出:
\ \\hat a_t \\
机器人随后真的执行这个预测结果。
13. 这一点为什么特别重要?
因为训练的时候:
你只是让模型"做题"。
执行的时候:
模型给出的答案会真的改变下一道题。
这一点是机器人学习和很多普通监督学习非常不同的地方。
14. 用一个例子理解
假设专家示范时:
物体位于正前方
↓
专家向前移动 2 cm
模型学出来后预测:
向前移动 2.2 cm
只差:
\ 0.2cm \\
看起来非常小。
但是机器人真的执行以后:
它现在的位置已经和专家当时的位置不完全一样了。
于是下一帧:
\ o_{t+1} \\
也和训练数据里的专家 Observation 有一点不同。
然后模型又预测一次:
专家本来应该向左 1 cm
模型却向左 0.7 cm
再次产生误差。
于是误差可能逐渐累积。
15. 这就是 BC 最经典的问题:Distribution Shift
今天第一次认识这个词。
Distribution
可以先理解成:
数据通常出现在哪些情况、长什么样。
训练数据来自专家操作。
所以训练阶段模型看到的大多数状态是:
专家正常操作时会到达的状态。
记作:
\ p_{\\text{expert}}(o) \\
但是模型真正控制机器人以后,自己会犯错。
于是它可能到达:
专家示范里从没出现过的奇怪状态。
这时候真实运行时观察的数据分布变成:
\ p_{\\pi}(o) \\
可能与专家数据不同:
\ p_{\\pi}(o)\\neq p_{\\text{expert}}(o) \\
这就是:
Distribution Shift
分布偏移。
16. 用开车理解 Distribution Shift
假设你只教一个学生:
车永远在道路正中央的时候
方向盘应该怎么打
训练数据全是:
车在正中央
→ 小幅调整
学生一开始可能只偏了 10 cm。
但是训练数据里面根本没有:
车偏到左边 10 cm
该怎么纠正?
于是他继续操作错误。
变成:
偏 20 cm
训练数据更没有这种状态。
继续错:
偏 50 cm
最后冲出道路。
这个过程就是:
一点小错误把机器人带到了训练数据没覆盖的状态,模型在陌生状态继续犯错,最终误差越来越大。
17. BC 最大的问题并不是"训练 Loss 不够低"
这一点非常重要。
你以后很可能遇到:
Training Loss 很低
但是:
Robot Rollout 很差
这完全可能。
为什么?
因为:
训练时做得好,不代表闭环执行时做得好。
训练时模型面对的是:
\ o_t\\sim D_{\\text{expert}} \\
真正 Rollout 时:
\ o_t\\sim D_{\\pi} \\
两种数据分布可能逐渐不同。
18. 什么叫 Rollout?
又出现一个以后会非常高频的词:
Rollout
可以理解为:
让 Policy 真正连续执行一整段任务。
例如:
Reset Environment
↓
Observation
↓
Policy
↓
Action
↓
Environment Changes
↓
New Observation
↓
Policy
↓
...
↓
Success / Failure
整个过程就叫一次:
Rollout
19. Training 和 Rollout 一定要分开
这两个词以后必须条件反射地区分。
Training
目的:
更新模型参数。
会发生:
forward
loss
backward
optimizer.step()
Rollout
目的:
看这个 Policy 真正控制机器人能不能完成任务。
通常:
model predicts action
↓
action executes
↓
new observation
↓
model predicts again
Rollout 通常不会做:
loss.backward()optimizer.step()
20. 第一次认识 Offline Learning
经典 BC 通常可以先理解为:
Offline Learning
意思就是:
先把 Demonstration 收集好,再用这些固定数据训练。
流程:
收集数据
↓
保存 Dataset
↓
结束数据采集
↓
训练 Policy
↓
部署 / Rollout
训练时并不要求机器人一边跑一边产生新的数据。
所以:
BC 是最典型、最基础的 Offline Imitation Learning 方法之一。
21. Behavior Cloning 和 Imitation Learning 是一回事吗?
不是严格等价。
关系更像:
Imitation Learning
│
├── Behavior Cloning
├── DAgger
├── ...
└── 其他模仿学习方法
所以:
\ \\text{Behavior Cloning}\\subset\\text{Imitation Learning} \\
Imitation Learning 是更大的领域:
如何让智能体通过模仿专家学习行为。
BC 是里面最直接的一种:
把专家数据直接当监督学习数据训练。
22. BC 和 Reinforcement Learning 最大区别是什么?
先建立最简单的区别。
Behavior Cloning
老师直接告诉你:
这个状态下,正确动作是什么。
数据是:
\ (o_t,a_t) \\
模型模仿:
\ o_t\\rightarrow a_t \\
Reinforcement Learning
不一定告诉你正确 Action。
而是告诉你:
这个结果好不好。
例如:
抓成功
Reward = +1
抓失败
Reward = 0
然后让 Policy 自己寻找:
什么 Action 能获得更高 Reward。
所以可以粗略理解:
BC
老师给答案
RL
老师给分数
这个区别现在记住就够了。
23. 第一次建立 Tensor Shape
现在开始真正进入以后读代码时最重要的习惯。
假设:
- batch size = \(B\)
- RGB 图像大小 = \(H\times W\)
- Robot State 维度 = \(D_s\)
- Action 维度 = \(D_a\)
那么可能有:
\ I_t\\in\\mathbb{R}\^{B\\times3\\times H\\times W} \\\ s_t\\in\\mathbb{R}\^{B\\times D_s} \\\ a_t\\in\\mathbb{R}\^{B\\times D_a} \\
于是 Policy:
\ \\pi_\\theta(I_t,s_t) \\rightarrow \\hat a_t \\
输出:
\ \\hat a_t\\in\\mathbb{R}\^{B\\times D_a} \\
注意:
\(D_s\) 和 \(D_a\) 没有固定值。
以后必须根据具体 Dataset / Robot / Repository 确认。
24. 一个 Batch 到底是什么?
假设 Dataset 里有:
Sample 1
Sample 2
Sample 3
...
训练时一般不会每次只拿一个。
比如一次拿:
\ B=32 \\
个样本。
那么:
images
[B, 3, H, W]
states
[B, Ds]
actions
[B, Da]
这里的:
\ B \\
就是:
Batch Size
例如:
images.shape
=
[32, 3, 224, 224]
意思就是:
现在一次输入神经网络 32 张 RGB 图像。
224 × 224 这里只是示例,不代表具体 VLA 的实际输入尺寸。
25. 最简单的 BC 神经网络长什么样?
先不考虑图片,只假设 Observation 是一串状态:
\ o_t= \[x_1,x_2,\\ldots,x_{10} \]
也就是:
\ D_o=10 \\
Action:
\ a_t= \[a_1,a_2,a_3 \]
也就是:
\ D_a=3 \\
我们可以建立:
Observation
[10]
↓
Linear
↓
ReLU
↓
Linear
↓
Action
[3]
也就是:
\ \\mathbb{R}\^{10} \\rightarrow \\mathbb{R}\^{64} \\rightarrow \\mathbb{R}\^{3} \\
26. 第一次看一个真正最小 BC PyTorch 模型
import torchimport torch.nn as nnclass BCPolicy(nn.Module): def __init__(self): super().__init__() self.net = nn.Sequential( nn.Linear(10, 64), nn.ReLU(), nn.Linear(64, 3) ) def forward(self, obs): action = self.net(obs) return action
现在不要急着自己写。
我们逐行看。
class BCPolicy(nn.Module):
定义一个类:
BCPolicy
它继承:
nn.Module
nn.Module 是 PyTorch 神经网络模块的基础类。
因此可以把:
BCPolicy
理解成:
我们自己定义的一种神经网络。
__init__
def __init__(self):
这是初始化函数。
当你真正创建:
model = BCPolicy()
的时候,会调用它。
这里定义网络包含哪些层。
nn.Linear(10, 64)
表示:
\ 10\\rightarrow64 \\
输入:
[B, 10]
输出:
[B, 64]
nn.ReLU()
加入非线性。
以后深度学习课会更系统地解释。
nn.Linear(64, 3)
把:
[B, 64]
变成:
[B, 3]
这三个数字就是预测 Action。
27. forward() 到底在干嘛?
def forward(self, obs): action = self.net(obs) return action
输入:
obs
[B, 10]
经过:
self.net
输出:
action
[B, 3]
所以:
\ \[B,10 \rightarrow BCPolicy \rightarrow B,3 \]
这就是我们前面一直讲的:
\ \\text{Observation}\\rightarrow\\text{Action} \\
第一次真正落到代码上。
28. Training 怎么写?
训练时可能出现:
pred_action = model(obs)loss = loss_fn(pred_action, expert_action)optimizer.zero_grad()loss.backward()optimizer.step()
先只看数据流:
obs
↓
model
↓
pred_action
↓
compare with expert_action
↓
loss
↓
backward
↓
update model
对应数学:
\ \\hat a=\\pi_\\theta(o) \\
然后:
\ L(\\hat a,a) \\
再利用梯度更新:
\ \\theta \\
29. 但是机器人图片怎么办?
刚才那个模型只有:
state → action
实际 Robot Learning 往往还有:
Image
+
Robot State
于是结构可能变成:
RGB Image
↓
Vision Encoder
↓
Image Feature
\
\
Robot State → State Encoder
/
/
Fusion
↓
Policy
↓
Action
数学上:
\ z_I=f_{\\text{vision}}(I_t) \\\ z_s=f_{\\text{state}}(s_t) \\
然后融合:
\ z=\[z_I;z_s \]
最终:
\ \\hat a_t=f_{\\text{policy}}(z) \\
现在只需要知道这个结构。
后面进入 ACT、Diffusion Policy、VLA 后,模型内部会越来越复杂,但基本数据流不会凭空消失。
30. 加上语言以后呢?
继续增加:
Image
↓
Vision Encoder
↓
Vision Feature
\
Language → Language Encoder
\
Robot State → State Encoder
↓
Fusion
↓
Policy
↓
Action
于是可以写:
\ \\hat a_t = \\pi_\\theta(I_t,s_t,l) \\
你现在应该能看懂这个公式了。
这就是第一课和第二课连起来的地方。
31. VLA 和 BC 的关系终于出现了
这里非常关键。
BC 并不是 VLA 的竞争对手。
很多 Robot Policy / VLA 的训练,本质上仍然在做:
给定 Observation 和 Instruction,模仿 Dataset 中正确的 Action。
也就是说:
\ (I_t,s_t,l)\\rightarrow a_t \\
模型再复杂:
- Transformer;
- VLM;
- Action Chunk;
- Diffusion;
- Flow Matching;
都可能依然依赖大量 expert demonstration。
所以:
Behavior Cloning 是理解现代 Robot Learning 和 VLA 的地基之一。
32. 为什么不用 BC 永远解决所有问题?
因为 BC 有几个根本问题。
首先是刚才讲的:
Distribution Shift
模型犯一点错误后进入陌生状态。
其次:
数据覆盖问题
如果 Dataset 里没有:
物体摆在左上角
模型可能不知道怎么办。
还有:
Demonstration Quality
如果专家数据很差:
动作抖动
轨迹绕远
偶尔失败
操作不一致
模型也会把这些行为学进去。
所以:
BC 能学到什么,非常依赖数据。
33. 一句话概括 BC
现在应该能够自己说出:
Behavior Cloning 是一种监督式模仿学习方法,通过专家 Demonstration 中的 Observation-Action 对训练 Policy,使 Policy 在给定 Observation 时预测专家 Action。
数学上:
\ \\hat a_t=\\pi_\\theta(o_t) \\
训练:
\ \\min_\\theta \\sum_t L\\left( \\pi_\\theta(o_t), a_t \\right) \\
不要被这个公式吓到。
它只是说:
调整模型参数 \(\theta\),让模型预测 Action 和专家 Action 的差距尽可能小。
34. 今天新增的核心术语
这一课至少要真正理解下面这些词:
| 术语 | 现在应该怎么理解 |
|---|---|
| Demonstration | 专家操作机器人产生的示范数据 |
| Trajectory | 按时间排列的一整段 Observation 和 Action |
| Episode | 一次完整任务记录 |
| Behavior Cloning | 用监督学习模仿专家 Action |
| Expert Action | 数据集中专家真正执行的 Action |
| Predicted Action | Policy 当前预测的 Action |
| Loss | 衡量预测 Action 和专家 Action 有多大差距 |
| Training | 用 Loss 更新模型参数 |
| Inference | 模型根据新 Observation 预测 Action |
| Rollout | Policy 连续控制机器人完成一整段任务 |
| Distribution Shift | 运行时进入训练数据没覆盖的状态 |
| Offline Learning | 先收集固定数据,再进行训练 |
35. 把前两课合成完整链条
现在我们已经从:
Camera
+
Robot State
+
Language
前进到了:
Human Demonstration
↓
Robot Dataset
↓
Observation + Expert Action
↓
Train Policy
↓
Policy learns
Observation → Action
↓
Rollout
↓
Robot executes predicted Action
↓
New Observation
↓
Policy predicts again
这就是 Robot Learning 最基础的一条训练---执行闭环。
第二课自测
1
Behavior Cloning 为什么属于监督学习?
2
下面两个量有什么区别?
\ a_t \\
和:
\ \\hat a_t \\
3
一条:
\ \\tau=(o_0,a_0,o_1,a_1,\\ldots,o_T,a_T) \\
表示什么?
4
为什么:
Training Loss 很低
却可能:
Robot Rollout 很差
5
什么叫 Distribution Shift?请尽量不用定义,而是用"模型犯了一点错误以后发生什么"解释。
6
下面四件事应该按什么顺序发生?
Loss
Predicted Action
Observation
Expert Action
7
假设:
obs.shape = [32, 10]
action.shape = [32, 7]
请解释:
- 32 是什么?
- 10 是什么?
- 7 是什么?