- 引言
- 机器人学习的四种途径
- 模仿学习 — 看示范、跟着做
- 强化学习 — 通过试错自行学习
- 逆强化学习 — 从示范中推断奖励
- 两种方法的对比
- 结合两种方法
- 实务中的判断标准
- 用数字理解数据效率
- 策略评估方法论
- 以一个任务串起整体流程
- 陷阱与注意事项
- 结语
- 参考资料
引言
对机器人说"把咖啡杯拿起来放到别处"很容易。但这一句话的背后,隐藏着指尖力度调节、杯子位置估计、手臂轨迹规划、打滑检测等无数底层控制问题。人类从小到大摔倒、洒落无数次才把这些感觉内化于身体,而机器人从一开始就必须自己学会这一切,或是向别人学习。
机器人习得技能的方式大致可分为四类。人做示范、机器人跟着学的模仿学习;通过试错和奖励自行摸索最优行为的强化学习;在虚拟环境中积累大量经验的仿真学习;以及由人直接编写规则和轨迹的预先编程。
本文将深入探讨近来机器人学习研究的核心——模仿学习与强化学习。我们会考察这两种方法各自如何运作、分别在什么情况下擅长或不擅长、需要多少数据,以及为什么最新研究纷纷尝试将两者结合。为保证准确性,具体数值或特定系统的细节只在确凿可靠时才引用,不确定的部分则以概括性的方式陈述。
机器人学习的四种途径
先来俯瞰一下整体版图。下图展示了机器人获得行为策略(决定在某个状态下该采取什么行动的函数)的四条路径。
获得机器人策略(Policy)的路径
─────────────────────────────
(1) 预先编程 (2) 模仿学习
┌───────────────────┐ ┌───────────────────────┐
│ 人直接把规则、轨迹 │ │ 人做示范, │
│ 写成代码 │ │ 机器人从数据中学习 │
│ │ │ │
│ 例:焊接机器人的 │ │ 例:通过遥操作 │
│ 固定路径 │ │ 收集的操作示范 │
└─────────┬─────────┘ └───────────┬───────────┘
│ │
▼ ▼
┌──────────────────────────────────────────┐
│ 行为策略 π(a | s) │
│ 状态 s ──▶ 决定行动 a 的函数 │
└──────────────────────────────────────────┘
▲ ▲
│ │
┌─────────┴─────────┐ ┌───────────┴───────────┐
│ 用大量虚拟经验 │ │ 以最大化奖励信号为目标, │
│ 训练策略 │ │ 通过试错改进策略 │
│ │ │ │
│ 例:在物理引擎中 │ │ 例:不摔倒则 +奖励 │
│ 并行运行数千小时 │ │ 摔倒则 -奖励 │
└───────────────────┘ └───────────────────────┘
(3) 仿真学习 (4) 强化学习
这四种途径并非互斥。实际系统往往将多种方法组合使用——例如先在仿真中用强化学习做出初步策略,再用现实中人的示范通过模仿学习加以打磨。接下来的章节将分别详细考察模仿学习与强化学习。
模仿学习 — 看示范、跟着做
模仿学习(Imitation Learning)的基本思路很简单。让专家(通常是人)执行任务并记录为数据,机器人则从这些数据中学习"在这种状态下要做这种行动"的对应关系。关键在于不需要设计明确的奖励函数。无需用公式定义"什么是好的行为",只要给出好行为的示例即可。
收集示范数据的方法
模仿学习的成败取决于示范数据的质量与数量。收集数据的代表性方法如下。
- 遥操作(Teleoperation):人用手柄、VR 控制器,或形似机器人手臂的主控设备远程操纵机器人。此时机器人的关节角度、夹爪状态、摄像头画面会同步记录下来,形成状态-行动对。由于数据是通过机器人自身的躯体采集的,形态不匹配问题较少。
- 动作捕捉(Motion Capture):用标记点或摄像头追踪人的动作以获取轨迹。可以大量获得自然的动作,但人的身体与机器人的身体不同,直接照搬存在重定向(retargeting)难题。
- 体感示教(Kinesthetic Teaching):人直接用手握住机器人手臂移动,示范出所需轨迹。直观,但不适合大规模采集。
行为克隆 — 最基本的形式
模仿学习最简单的形式是行为克隆(Behavioral Cloning, BC)。这本质上就是监督学习。以状态为输入、专家的行动为标签,训练策略神经网络去模仿这一对应关系。
# 行为克隆的概念性训练循环(接近伪代码的示例)
import torch
import torch.nn as nn
class PolicyNet(nn.Module):
def __init__(self, obs_dim, act_dim):
super().__init__()
self.net = nn.Sequential(
nn.Linear(obs_dim, 256), nn.ReLU(),
nn.Linear(256, 256), nn.ReLU(),
nn.Linear(256, act_dim),
)
def forward(self, obs):
return self.net(obs)
policy = PolicyNet(obs_dim=32, act_dim=7)
optimizer = torch.optim.Adam(policy.parameters(), lr=1e-4)
loss_fn = nn.MSELoss()
# demo_states, demo_actions: 从专家示范中收集的状态-行动对
for states, expert_actions in dataloader:
predicted = policy(states)
loss = loss_fn(predicted, expert_actions) # 最小化与专家行动的差距
optimizer.zero_grad()
loss.backward()
optimizer.step()
行为克隆的一大优点是实现简单、训练稳定。但它有一个致命弱点,就是分布偏移(distribution shift)问题。
分布偏移与复合误差
用行为克隆训练出的策略,只在示范中出现过的状态下才表现良好。机器人实际运行时会产生微小误差,这些误差会把它带入示范中从未出现过的状态。在那样的状态下策略不知道该做什么,于是产生更大的误差。这种误差像滚雪球一样越滚越大的现象,称为复合误差(compounding error)。
示范分布(专家经过的状态)
●●●●●●●●●●●●●●●●●●●●●●▶ 目标
│
│ 出现微小误差
▼
○ ── 示范中未出现过的状态(策略生疏)
│
│ 更大的误差
▼
○ ─────── 逐渐偏离到更陌生的状态
(因复合误差导致任务失败)
DAgger — 为陌生状态做好准备
缓解这一问题的代表性技术是 DAgger(Dataset Aggregation)。核心思路是额外追问"在机器人实际访问到的状态下,专家会怎么做"。
具体步骤如下。首先用初始示范训练出一个策略。实际运行这个策略后,机器人会访问到示范中没有的新状态。这时把这些状态记录下来,让专家为"在这种状态下应该采取什么行动"打上标签。把新获得的状态-行动对并入已有数据,重新训练策略。重复这一过程,策略访问的状态分布就会逐渐与训练数据的分布趋于一致。
DAgger 迭代循环
─────────────────
[1] 用当前策略运行机器人
│
▼
[2] 收集机器人访问过的状态
│
▼
[3] 专家为这些状态标注正确行动
│
▼
[4] 汇入数据集后重新训练策略
│
└────────▶ (回到 [1])
DAgger 的代价是需要专家反复介入。人必须持续标注,成本较高。即便如此,由于它能切实缓解复合误差问题,仍被广泛使用。
强化学习 — 通过试错自行学习
强化学习(Reinforcement Learning, RL)出发点完全不同。它不给出示范,而是把"什么是好的"定义为一个叫做奖励(reward)的标量信号。机器人(智能体)与环境交互、采取行动,并因此获得奖励。目标是找到能使累积奖励(长期获得的奖励总和)最大化的策略。
核心构成要素
强化学习的交互结构可以概括如下。
强化学习的交互循环
─────────────────────────
┌────────────────────────┐
│ 智能体 │
│ (策略 π: s ──▶ a) │
└───────┬────────────────┘
│ 行动 a
▼
┌────────────────────────┐
│ 环境 │
│ (机器人 + 物理世界) │
└───────┬────────────────┘
│ 新状态 s'、奖励 r
▼
┌────────────────────────┐
│ 积累经验 (s, a, r, s') │
│ ──▶ 改进策略 π │
└────────────────────────┘
- 状态(State):机器人与环境的当前状况。关节角度、物体位置、摄像头画面等。
- 行动(Action):机器人可以采取的操作。关节扭矩、目标速度等。
- 奖励(Reward):每一时刻收到的即时评价信号。例如靠近目标给予正奖励,掉落物体给予负奖励。
- 策略(Policy):把状态映射为行动的函数。这是强化学习要改进的对象。
- 探索与利用(Exploration vs Exploitation):是重复已知较好的行动(利用),还是尝试新行动以寻找更好方案(探索),两者之间的平衡。这一平衡是强化学习的核心难题之一。
奖励设计的困难
强化学习的表现在很大程度上取决于奖励函数设计得好不好。若奖励过于稀疏(例如只有在任务完全成功时才 +1),智能体在偶然成功之前得不到任何学习信号。反之,若把奖励设计得很密集(reward shaping),学习会变快,但也可能出现智能体以设计者未曾预想的方式最大化奖励的奖励黑客(reward hacking)现象。
稀疏奖励(sparse) vs 密集奖励(dense)
─────────────────────────────────────
稀疏:......................● (仅在成功瞬间 +1)
学习信号稀少,初期探索极为困难
密集:▁▂▃▄▅▆▇█ (越接近目标数值越高)
学习更快,但设计不当会有奖励黑客风险
数据效率与安全问题
在物理机器人上直接运行强化学习面临两大障碍。
第一是数据效率。强化学习通常需要数十万到数百万次交互。若要在现实中的机器人上进行这么多次试错,会耗费巨大的时间并造成磨损。因此许多研究选择先在仿真中学习、再迁移到现实的 sim-to-real 方案。
第二是安全。在探索过程中,机器人会尝试近乎随机的行动,这可能损伤机器人自身或周围环境。在现实环境中学习时,设置安全约束或引入人类介入的安全机制是必不可少的。
逆强化学习 — 从示范中推断奖励
模仿学习与强化学习之间存在一个有趣的中间地带,那就是逆强化学习(Inverse Reinforcement Learning, IRL)。
一般的强化学习是在给定奖励函数的前提下寻找最优策略。逆强化学习则相反。给定专家的示范后,推断"这位专家究竟想要最大化什么奖励"这一隐藏的奖励函数。再用推断出的奖励重新运行强化学习,得到策略。
一般 RL vs 逆强化学习(IRL)
──────────────────────────
一般 RL: 奖励函数 ──▶ (强化学习) ──▶ 策略
IRL: 专家示范 ──▶ (奖励推断) ──▶ 奖励函数
│
▼
(强化学习) ──▶ 策略
逆强化学习之所以吸引人,是因为它不只是模仿行动,而是试图还原出行动背后所承载的"意图"这一奖励。奖励函数是对状态的一种简洁评价,因此在示范中未出现过的新情境下也更有可能泛化得更好。不过这也有其局限——能解释同一份示范的奖励函数可能不止一个(即歧义性),这使得推断从根本上就很困难。
这种方法可以看作连接模仿学习(利用示范)与强化学习(基于奖励的优化)之间的一座桥梁,在那些奖励难以手工设计的任务中尤其有用。
两种方法的对比
下表整理了目前为止考察的内容。
| 项目 | 模仿学习 | 强化学习 |
|---|---|---|
| 学习信号 | 专家示范 | 奖励函数 |
| 奖励设计 | 不需要 | 需要(核心难题) |
| 数据来源 | 人的示范 | 与环境的交互 |
| 数据效率 | 相对较高 | 相对较低 |
| 初期表现 | 快速达到示范水平 | 初期非常低 |
| 性能上限 | 大致为专家水平 | 有可能超越专家 |
| 主要弱点 | 分布偏移、复合误差 | 探索、奖励黑客、安全 |
| 代表技术 | 行为克隆、DAgger | 策略梯度、演员-评论家(actor-critic) |
用一句话概括核心对比:模仿学习数据效率高,但被示范的质量所局限;强化学习理论上可以超越示范,但需要大量经验与精细的奖励设计。
结合两种方法
近来研究的一大趋势,就是把两种方法的优点结合起来。代表性的结合方式如下。
引导启动 — 从模仿出发,用强化打磨
最直观的组合方式,是先用模仿学习初始化策略,再用强化学习加以改进。模仿学习把策略带到一个较为合理的起点后,强化学习就能跳过初期茫然的随机探索,在这个起点附近继续提升性能。示范相当于为探索指明了方向。
模仿 → 强化 引导启动
───────────────────────
随机策略 ──(模仿学习)──▶ 示范水平策略 ──(强化学习)──▶ 超越示范的策略
[ 性能 ]
高 ┤ ╭────── 强化带来的额外提升
│ ╭─────────╯
│ ╭─────────╯ ← 通过模仿快速达到
低 ┤──────────╯
└──────────────────────────────────▶ [ 学习时间 ]
离线强化学习 — 把示范数据当作强化学习来处理
离线强化学习(Offline RL)是仅利用预先收集好的固定数据集来学习策略的方法。不进行新的交互,而是利用示范或过往日志中所包含的状态-行动-奖励信息。这既能像模仿学习一样数据高效,又能像强化学习那样利用奖励信息区分数据中好的行动与坏的行动。不过要处理对数据中未出现的行动做出过高估计的问题,还需要专门的保守化技术。
VLA — 用大规模示范学习出的通用策略
2020 年代中期的一大趋势,是同时利用大规模机器人示范数据与网络上视觉-语言数据的 Vision-Language-Action(VLA)模型。这些模型本质上根植于大规模模仿学习,但从预训练的大模型那里继承了语言理解与视觉识别能力,力图实现向新任务的泛化。
- RT-2(Google DeepMind):对视觉-语言模型进行微调,使其输出离散化(discretized)的行动令牌的模型。
- Open X-Embodiment / RT-X:用多家机构、多种不同机器人收集的跨机器人数据训练,尝试实现跨越机器人形态的泛化。
- OpenVLA:用约 97万条示范训练出的 7B 规模开源模型,结合了视觉编码器(DINOv2、SigLIP)与语言模型(Llama 2)。
- π0(Physical Intelligence):采用 flow matching / diffusion 系技术生成连续、高频行动的方法。
- GR00T N1(NVIDIA):力图构建负责快速反应的 System 1(基于 diffusion)与负责慢速规划的 System 2 相结合的双重结构。
这些模型大多采用同时训练网络视觉-语言数据与机器人轨迹的联合微调(co-fine-tuning)方式,有时还会用 LoRA 之类的技术高效地适配新机器人、新任务。具体规格会因版本与实现而异,建议以各官方资料的最新信息为准。
实务中的判断标准
在实际项目中该选择哪种方法,取决于具体情况。大致的判断标准整理如下。
- 若能轻松获得高质量示范,且任务相对定型,模仿学习(尤其是行为克隆 + DAgger)是快速而稳定的起点。
- 若仿真器足够精确、奖励也能明确定义,用仿真强化学习即可在没有示范的情况下构建策略。
- 若需要超越专家水平的性能,或需要适应新情境,先用模仿初始化、再用强化学习改进的结合方式是有力选项。
- 若跨多任务的泛化能力与对语言指令的理解很重要,可以考虑基于大规模示范的 VLA 方案。
用数字理解数据效率
"模仿学习数据效率高"这句话经常被提及,但其含义值得更具体地说明一下。数据效率可以理解为达到期望性能所需的交互量。
行为克隆是监督学习,所以只要有 N 条示范,把这 N 条反复训练若干个 epoch 就够了,不需要额外的环境交互。相比之下,在线强化学习每次改进策略时都必须从环境中收集新的经验,其收集量可达数十万到数百万步。
达到既定性能所需的交互量(概念性规模)
────────────────────────────────────────
行为克隆 :收集示范后无需额外交互
(需要:N 条高质量示范)
DAgger :示范 + 反复的专家标注
(需要:N 条 + 多轮专家介入)
在线 RL :大量的环境步数
(需要:数十万至数百万步的试错)
▶ 即使达到相同的性能,"需要什么"也不同:
模仿需要的是人的示范,强化需要的是环境步数。
这里重要的洞见在于,数据效率很难用单一维度来比较。模仿学习消耗的是"人的时间"这种昂贵的资源,强化学习消耗的则是"环境步数"这种(若在仿真中则相对便宜的)资源。哪一方更有利,取决于示范获取的难易程度,以及仿真器的精确程度。
策略评估方法论
学习机器人策略固然困难,恰当地评估其表现同样困难。仅凭一个基准数字,很难判断策略的真实水平。
- 成功率(Success Rate):多次尝试中完成任务的比例。这是最基本的指标,但若初始条件变化不够充分,很容易被高估。
- 泛化评估:在训练时未见过的新物体、新背景、新光照下的成功率。用来区分策略是记住了还是真正理解了。
- 鲁棒性评估:在有意加入外部干扰或传感器噪声时,策略能撑住多久。
策略评估的层级
─────────────────
[1] 训练分布内评估 ──▶ 基础成功率
│ (相同物体、相同环境)
▼
[2] 分布外泛化评估 ──▶ 新物体、新环境
│
▼
[3] 鲁棒性评估 ──▶ 注入干扰、噪声
│
▼
[4] 长期可靠性评估 ──▶ 重复执行时性能是否保持
▶ 越靠上层,越能真实反映实际部署的适用性。
评估中常见的陷阱,是仅凭少数几次成功的场景,就误以为策略已经完成。机器人策略对初始条件极为敏感,只有在各种条件下重复统计上有意义的次数,才能得出可信的结论。
以一个任务串起整体流程
现在把前面的内容串成一个虚构的操作任务——"把桌上的物品装进箱子里"。
首先通过遥操作让人操纵机器人,收集 50 到 100 次示范。用这些示范训练出行为克隆策略后,在与示范相似的摆放情形下能大致成功。但一旦物体被放在示范中未出现过的位置,就会因复合误差而失败增多。
这时应用 DAgger。实际运行策略,收集失败的情况,让专家为这些情况标注正确行动并加入数据。经过几轮迭代,即便在陌生的摆放情形下成功率也会上升。
若还需要更高性能,可以把这个模仿策略作为初始值,在仿真中用强化学习加以打磨。若仿真器不够精确,sim-to-real 差距就会成为问题,因此还需配合域随机化(domain randomization)等技术。最后,在各种物体和光照条件下反复评估,确认泛化能力与鲁棒性之后,才考虑部署。
任务整体流水线概览
──────────────────────────
遥操作收集示范
│
▼
行为克隆得到初始策略
│
▼
用 DAgger 补强陌生情形
│
▼
(可选) 用 RL 提升性能
│
▼
在多种条件下反复评估
│
└──▶ 验证充分后即可部署
陷阱与注意事项
- 示范偏差:模仿学习会把示范中蕴含的习惯与偏见原样学去。如果示范者回避了某些情况,机器人在这些情况下也会薄弱。
- 奖励黑客:在强化学习中,若奖励未能完美反映真实目标,智能体就会找到只最大化奖励数值、而非达成目标本身的取巧方式。
- 仿真差距:在仿真中学到的策略在现实中崩溃,是常见的现象。这个问题重要到值得作为单独的主题来讨论,即 sim-to-real 迁移。
- 评估的困难:机器人策略的性能会随环境、物体、初始条件的不同而大幅变化。不应仅凭少数成功案例就断言泛化性能。
结语
在机器人学习中,模仿学习与强化学习与其说是对立的两大阵营,不如说是互补的工具。模仿学习能快速、以数据高效的方式把人的知识传递给机器人,而强化学习则让超越这些知识的改进、以及对新情境的适应成为可能。近来的 VLA 模型、离线强化学习与引导启动方式,都是在打破两者的界限、力图打造更强大策略的尝试。
下一篇文章将正式探讨本文中反复出现的仿真与现实之间的差距,即 sim-to-real 迁移问题。
参考资料
- RT-2 论文(arXiv):https://arxiv.org/abs/2307.15818
- OpenVLA 论文(arXiv):https://arxiv.org/abs/2406.09246
- Open X-Embodiment 论文(arXiv):https://arxiv.org/abs/2310.08864
- Physical Intelligence(π0 等):https://www.physicalintelligence.company/
- Open X-Embodiment 项目:https://robotics-transformer-x.github.io/
- NVIDIA Isaac / 机器人技术:https://developer.nvidia.com/isaac
- OpenAI Spinning Up(强化学习入门):https://spinningup.openai.com/
- DAgger 论文(Ross et al., AISTATS 2011):https://proceedings.mlr.press/v15/ross11a.html
현재 단락 (1/234)
对机器人说"把咖啡杯拿起来放到别处"很容易。但这一句话的背后,隐藏着指尖力度调节、杯子位置估计、手臂轨迹规划、打滑检测等无数底层控制问题。人类从小到大摔倒、洒落无数次才把这些感觉内化于身体,而机器人从...