尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

VLA 系统学习第 2 课:Behavior Cloning——机器人究竟怎么从示范中学动作?

VLA 系统学习第 2 课:Behavior Cloning——机器人究竟怎么从示范中学动作? 从这一课开始我们第一次真正进入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也经常称作Trajectory4. 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 ...以后看真实机器人数据集时你会经常碰到EpisodeTrajectoryFrameObservationActionTimestamp这些词。5. Demonstration 从哪里来最常见的是Human ↓ Teleoperation ↓ Robot也就是人类遥操作机器人。例如操作者通过手柄键盘主从机械臂VR 控制器3D 鼠标手持控制设备让机器人完成任务。同时程序不断记录Camera Robot State Action Timestamp最终形成训练数据。6. 第一次认识 Robot Dataset假设采集了 100 次抓取任务。每一次都是一个 EpisodeDataset │ ├── 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 \]它表示神经网络里所有可以学习的参数。例如weightbiasTransformer 参数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.010.05)^2 \]得到\[ L (-0.03)^2(0.04)^2 \]\[ L 0.00090.0016 \]\[ L0.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_{t1} \]也和训练数据里的专家 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整个过程就叫一次Rollout19. Training 和 Rollout 一定要分开这两个词以后必须条件反射地区分。Training目的更新模型参数。会发生forward loss backward optimizer.step()Rollout目的看这个 Policy 真正控制机器人能不能完成任务。通常model predicts action ↓ action executes ↓ new observation ↓ model predicts againRollout 通常不会做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 ...训练时一般不会每次只拿一个。比如一次拿\[ B32 \]个样本。那么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_o10 \]Action\[ a_t [a_1,a_2,a_3] \]也就是\[ D_a3 \]我们可以建立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.Modulenn.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_If_{\text{vision}}(I_t) \]\[ z_sf_{\text{state}}(s_t) \]然后融合\[ z[z_I;z_s] \]最终\[ \hat a_tf_{\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 \]模型再复杂TransformerVLMAction ChunkDiffusionFlow 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 和 ActionEpisode一次完整任务记录Behavior Cloning用监督学习模仿专家 ActionExpert Action数据集中专家真正执行的 ActionPredicted ActionPolicy 当前预测的 ActionLoss衡量预测 Action 和专家 Action 有多大差距Training用 Loss 更新模型参数Inference模型根据新 Observation 预测 ActionRolloutPolicy 连续控制机器人完成一整段任务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 最基础的一条训练—执行闭环。第二课自测1Behavior 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 Action7假设obs.shape [32, 10] action.shape [32, 7]请解释32 是什么10 是什么7 是什么
返回列表