Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

引言

这本书是一条面向具身智能与 VLA(Vision-Language-Action)的系统学习路径,目标是把你从“能看懂概念”带到“能复现系统、能做实验、能写出自己的项目报告”。

这本书解决什么问题

  1. 如何补齐数学、深度学习、机器人、系统工程的知识断层。
  2. 如何把论文公式转成可运行代码,并在仿真/真实机器人中验证。
  3. 如何从“学习者”过渡到“研究者/工程师”。

适合读者

  1. 机器人、自动化、计算机、控制相关专业学生。
  2. 已有机器学习基础,希望转向具身智能方向的工程师。
  3. 需要系统化 VLA 知识框架的科研入门读者。

建议先修

  1. 线性代数、概率统计、微积分基础。
  2. Python 基础与 numpy / pytorch 入门。
  3. 对 ROS / 仿真平台有初步概念(不会也可边学边补)。

三条阅读路线

  1. 两周速读路线:0 -> 1.1/1.2/1.3 -> 2.1/2.4 -> 5.1/5.3 -> 6.1 -> 8.1/8.4 -> 10.1 -> 11.1
  2. 八周系统路线:按章节顺序阅读 0 -> 12,每章完成“本章小结与自测”。
  3. 项目驱动路线:先看 /Users/yang/Desktop/mdbook/src/Project_Roadmap.md,按目标项目反推章节。

阅读与实践方法

  1. 每章先读“学习导航”,明确目标与前置知识。
  2. 公式密集段落按“符号定义 -> 维度检查 -> 代码实现”三步走。
  3. 每章至少完成一个“公式到代码”最小示例。
  4. 每学完一个大章节(如第 2、5、8、10 章)做一次小型复盘笔记。

配套索引

  1. 符号表:/Users/yang/Desktop/mdbook/src/Notation.md
  2. 术语表:/Users/yang/Desktop/mdbook/src/Glossary.md
  3. 项目阅读索引:/Users/yang/Desktop/mdbook/src/Project_Roadmap.md

使用指南

推荐使用方式

  1. 先读 /Users/yang/Desktop/mdbook/src/Introduction.md,选定你的阅读路线。
  2. 每周固定两次“阅读 + 复现”时段,不只看概念。
  3. 用“章内自测题”检查是否真正理解,而不是只看懂文字。

最小学习闭环

  1. 读一个小节。
  2. 手写一次核心公式的符号含义。
  3. 跑通一个最小代码片段。
  4. 用自己的话总结成 5 句话。

常见失败模式

  1. 只看论文综述,不做代码。
  2. 只调工程参数,不回到理论。
  3. 不做实验记录,导致无法复现。

你应当产出的中间成果

  1. 一份个人符号表(可直接基于本书符号表增补)。
  2. 一份项目日志(建议按日期记录假设、实验、结论)。
  3. 一个可演示的最小 VLA 项目(仿真优先)。

符号表(Notation)

本表汇总全书最常见符号,便于跨章节阅读时快速查找。

符号含义常见章节
$\mathbf{x}, \mathbf{y}$向量1.1, 2.1
$A, B, W$矩阵 / 权重矩阵1.1, 2.x
$|\mathbf{x}|$向量范数1.1
$A^\top$矩阵转置1.1
$A^{-1}$矩阵逆1.1, 6.1
$\lambda$特征值 / 系数1.1, 5.x
$\sigma$奇异值 / 标准差1.1, 1.2
$\mu$均值 / 策略参数符号1.2, 5.2
$\Sigma$协方差矩阵1.2
$\mathbb{E}[\cdot]$期望1.2, 5.x
$\mathrm{Var}(X)$方差1.2
$P(A\mid B)$条件概率1.2
$D_{KL}(P|Q)$KL 散度1.2, 9.x
$\theta$模型参数1.3, 2.x, 9.x
$L(\theta)$损失函数1.3, 2.x
$\nabla_\theta L$对参数的梯度1.3, 2.x
$H$Hessian 矩阵1.3
$\eta$学习率1.3, 2.2
$f_\theta(\cdot)$参数化模型1.4, 2.x
$Q, K, V$Attention 的 Query/Key/Value2.4, 8.x
$d_{\text{model}}$Transformer 隐藏维度2.4, 2.5
$\pi_\theta(a\mid s)$策略函数5.x, 9.x
$V^\pi(s)$状态价值函数5.1, 5.2
$Q^\pi(s,a)$动作价值函数5.1, 5.2
$A^\pi(s,a)$优势函数5.2
$\gamma$折扣因子5.1, 5.2
$r_t$时刻 $t$ 的奖励5.x
$G_t$折扣回报5.x
$s_t, a_t, o_t$状态、动作、观测5.x, 8.x, 9.x
$\tau$轨迹(trajectory)5.x, 7.x, 9.x
$q, \dot{q}, \ddot{q}$关节位置、速度、加速度6.1, 6.2
$M(q), C(q,\dot{q}), G(q)$机器人动力学项6.2
$J(q)$雅可比矩阵6.1, 6.2
$T, R, \mathbf{p}$齐次变换、旋转、平移6.1
$x$语言指令 / 文本条件4.x, 8.x
$I$图像输入3.x, 8.x
$c$条件变量(任务/机器人)8.x, 9.x
$\mathcal{D}$数据集1.4, 7.x, 9.x
$\mathcal{L}_{\text{BC}}$行为克隆损失5.3, 9.2
$\mathcal{L}_{\text{RL}}$强化学习损失5.2, 9.3
$\alpha$权重系数 / 熵温度5.2, 9.x
$\epsilon$小常数 / PPO clip 范围2.2, 5.2
mAP / IoU检测评测指标3.1, 10.2
SR / SPL任务成功率与路径效率指标10.2

使用建议

  1. 遇到不认识的符号,先查本表,再回到章节上下文确认定义。
  2. 同一符号在不同章节可能含义不同(如 $\alpha$、$\lambda$),以本节定义为准。
  3. 复现实验时建议在代码注释中复用本表术语,减少沟通歧义。

术语表(Glossary)

数学与机器学习

术语简述
线性变换保持加法与数乘结构的映射。
特征分解将矩阵表示为特征向量与特征值结构。
SVD任意矩阵分解为 $U\Sigma V^\top$ 的方法。
概率分布随机变量取值规律的数学描述。
最大似然估计(MLE)选择使观测数据概率最大的参数。
最大后验估计(MAP)在 MLE 基础上引入先验后的参数估计。
交叉熵衡量预测分布与真实分布差异的损失。
梯度下降沿负梯度方向迭代优化参数。
正则化通过额外约束抑制过拟合。

深度学习与多模态

术语简述
Backbone负责提取通用特征的主干网络。
Self-Attention序列内部位置间的加权信息聚合。
Cross-Attention由一模态查询另一模态特征的注意力。
Tokenization将连续输入离散化为 token 序列。
Prompt用于条件化模型行为的输入前缀。
LoRA低秩适配微调方法,参数高效。
QLoRA低比特量化 + LoRA 的大模型微调方案。
蒸馏(Distillation)用大模型监督小模型学习。
对齐(Alignment)让模型行为符合任务和人类偏好。

强化学习与模仿学习

术语简述
MDP强化学习的标准问题建模框架。
策略(Policy)状态到动作的映射。
价值函数衡量状态或状态动作长期收益的函数。
优势函数当前动作相对平均动作的收益增量。
Off-policy用与当前策略不同的数据更新策略。
On-policy用当前策略采样数据更新策略。
行为克隆(BC)直接模仿专家动作。
DAgger迭代采样并聚合专家标注缓解分布偏移。
RLHF利用人类反馈对策略进行对齐。

机器人与系统工程

术语简述
正运动学(FK)从关节空间计算末端位姿。
逆运动学(IK)从末端位姿求解关节配置。
雅可比矩阵描述关节速度到末端速度的线性映射。
阻抗控制控制末端力与位移动态关系的控制策略。
Teleoperation人远程控制机器人采集示范。
Sim2Real从仿真迁移到真实机器人的过程。
Safety Filter在线过滤危险动作的安全机制。
MLOps面向训练、部署、监控的工程体系。
Ablation Study通过模块删除/替换分析贡献的实验。

VLA 专项

术语简述
VLA统一视觉、语言、动作的决策模型。
Instruction Conditioning用语言指令条件化策略输出。
Action Head将中间特征解码为动作的输出模块。
历史上下文编码将过去观测与动作用于当前决策。
多机器人共享一个模型适配多硬件形态的训练范式。
课程式训练(Curriculum)按难度调度训练任务与数据。

使用建议

  1. 阅读时先看“术语定义”,再看“具体公式/代码实现”。
  2. 在项目文档里复用这些术语,减少团队沟通成本。
  3. 术语与符号联合使用时,优先参考 /Users/yang/Desktop/mdbook/src/Notation.md

项目驱动阅读索引

如果你希望“边学边做”,可按下面项目路径选择章节,而不是线性通读全书。

路径 A:两周最小可运行 VLA(仿真优先)

  1. 目标:完成一个“图像 + 文本指令 -> 动作”的最小闭环 demo。
  2. 必读章节:0.1 -> 1.1 -> 2.1 -> 2.4 -> 5.3 -> 6.1 -> 7.1 -> 8.1 -> 8.4 -> 11.1
  3. 交付物:
  4. 能运行的训练脚本。
  5. 一段演示视频。
  6. 一页实验记录(成功率、失败案例、下一步改进)。

路径 B:强化学习微调路线

  1. 目标:在已有 BC 策略基础上做 RL 微调并对比效果。
  2. 必读章节:1.2 -> 1.3 -> 5.1 -> 5.2 -> 5.4 -> 9.3 -> 10.2 -> 10.3
  3. 交付物:
  4. BC vs RL 的指标对比表。
  5. 奖励设计文档。
  6. 至少一个失败案例复盘。

路径 C:系统部署与评测路线

  1. 目标:把模型接入机器人软件栈并建立评测协议。
  2. 必读章节:6.2 -> 6.4 -> 9.4 -> 10.1 -> 10.2 -> 10.3 -> 10.4 -> 11.2
  3. 交付物:
  4. 延迟预算表与部署架构图。
  5. 安全策略清单(限幅、急停、回退机制)。
  6. 一次完整评测报告。

路径 D:论文复现与研究入门路线

  1. 目标:完成一篇 VLA 论文的小规模复现并写技术报告。
  2. 必读章节:0.2 -> 1.4 -> 2.2 -> 4.3 -> 8.5 -> 9.1 -> 11.2 -> 11.3 -> 11.4
  3. 交付物:
  4. 可复现实验配置。
  5. 论文-代码映射表。
  6. 一份 6-10 页复现实验报告。

路径 E:长期能力建设(3-6 个月)

  1. 目标:形成“理论 + 工程 + 研究表达”的稳定能力结构。
  2. 必读章节:全书按 0 -> 12 顺序学习;每章完成“本章小结与自测”。
  3. 每月里程碑:
  4. 第 1 月:数学、深度学习、机器人基础。
  5. 第 2 月:VLA 架构与训练范式。
  6. 第 3 月:部署评测与研究报告。

项目执行模板

每个项目都建议固定输出下面四项:

  1. 假设:你认为哪个改动会提升什么指标。
  2. 实验:你实际改了什么、如何跑。
  3. 结果:核心指标和关键可视化。
  4. 结论:下一轮要保留/放弃什么。

机器人领域期刊

Journal name2023 JIFJIF QuartileJIF Rank标题翻译中科院分区接受率审稿时间缩写收录link
IEEE-CAA Journal of Automatica Sinica15.3Q11/84IEEE-CAA 自动化学报Q1https://ieeexplore.ieee.org/xpl/RecentIssue.jsp?punumber=6570654
IEEE Transactions on Industrial Informatics11.7Q12/84IEEE 工业信息学学报Q1SP-175https://ieeexplore.ieee.org/xpl/aboutJournal.jsp?punumber=9424
Annual Review of Control Robotics and Autonomous Systems11.2Q13/84控制机器人与自主系统年度回顾Q1https://www.annualreviews.org/content/journals/control
IEEE Transactions on Cybernetics9.4Q14/84IEEE 控制论学报Q1SP-140https://ieeexplore.ieee.org/xpl/RecentIssue.jsp?punumber=6221036
IEEE Transactions on Systems Man Cybernetics-Systems8.6Q15/84IEEE 系统人机控制论-系统学报Q1SP-190https://www.ieee.org/membership-catalog/productdetail/showProductDetailPage.html?product=PER127-PRT
IEEE TRANSACTIONS ON INDUSTRIAL ELECTRONICS7.5Q16/84IEEE 工业电子学报Q1SP-180https://ieeexplore.ieee.org/xpl/RecentIssue.jsp?punumber=41
ENGINEERING APPLICATIONS OF ARTIFICIAL INTELLIGENCE7.5Q16/84人工智能工程应用Q117%SA-210http://www.elsevier.com/wps/find/journaldescription.cws_home/975/description
ANNUAL REVIEWS IN CONTROL7.3Q18/84控制年度回顾Q219%SA-105https://www.sciencedirect.com/journal/annual-reviews-in-control
Advanced Intelligent Systems6.8Q19/84先进智能系统Q336%SA-109https://onlinelibrary.wiley.com/journal/26404567
ISA TRANSACTIONS6.3Q111/84ISA 学报Q1http://www.isa.org/Content/NavigationMenu/Products_and_Services/Publishing/ISA_Transactions2/ISA_Transactions.htm
IEEE TRANSACTIONS ON AUTOMATIC CONTROL6.2Q112/84IEEE 自动控制学报Q1SP-153http://ieeexplore.ieee.org/xpl/RecentIssue.jsp?punumber=9
IEEE-ASME TRANSACTIONS ON MECHATRONICS6.1Q113/84IEEE-ASME 机电一体化学报Q1SP-177http://ieeexplore.ieee.org/xpl/RecentIssue.jsp?reload=true&punumber=3516
IEEE ROBOTICS & AUTOMATION MAGAZINE6.1Q113/84IEEE 机器人与自动化杂志Q2**https://www.annualreviews.org/content/journals/control
IEEE Transactions on Automation Science and Engineering5.9Q115/84IEEE 自动化科学与工程学报Q2SP-105http://ieeexplore.ieee.org/xpl/RecentIssue.jsp?punumber=8856
CONTROL ENGINEERING PRACTICE5.4Q117/84控制工程实践Q214%SA-145https://www.sciencedirect.com/journal/control-engineering-practice
IEEE TRANSACTIONS ON CONTROL SYSTEMS TECHNOLOGY4.9Q118/84IEEE 控制系统技术学报Q2SP-254http://ieeexplore.ieee.org/xpl/RecentIssue.jsp?punumber=87
INTERNATIONAL JOURNAL OF SYSTEMS SCIENCE4.9Q118/84国际系统科学杂志Q423%SF-68http://www.tandfonline.com/toc/tsys20/current
AUTOMATICA4.8Q120/84AUTOMATICAQ2*SA-388https://www.journals.elsevier.com/automatica
JOURNAL OF MACHINE LEARNING RESEARCH4.3Q121/84机器学习研究杂志Q316%SA-250http://jmlr.org/
ROBOTICS AND AUTONOMOUS SYSTEMS4.3Q121/84机器人与自主系统Q221%SA-231http://www.journals.elsevier.com/robotics-and-autonomous-systems/
IEEE Transactions on Control of Network Systems4.0Q223/84IEEE 网络系统控制学报Q3SP-186https://ieeexplore.ieee.org/xpl/RecentIssue.jsp?punumber=6509490
INTERNATIONAL JOURNAL OF ADAPTIVE CONTROL AND SIGNAL PROCESSING3.9Q224/84国际自适应控制与信号处理Q412%SA-174https://onlinelibrary.wiley.com/journal/10991115
IEEE CONTROL SYSTEMS MAGAZINE3.9Q224/84IEEE 控制系统杂志Q3http://ieeexplore.ieee.org/xpl/RecentIssue.jsp?punumber=5488303
Nonlinear Analysis-Hybrid Systems3.7Q226/84非线性分析-混合系统Q1https://www.sciencedirect.com/journal/nonlinear-analysis-hybrid-systems/about/aims-and-scope
CHEMOMETRICS AND INTELLIGENT LABORATORY SYSTEMS3.7Q226/84化学计量学与智能实验室系统Q219%SA-111https://www.sciencedirect.com/journal/chemometrics-and-intelligent-laboratory-systems
JOURNAL OF THE FRANKLIN INSTITUTE-ENGINEERING AND APPLIED MATHEMATICS3.7Q226/84富兰克林研究所杂志-工程与应用数学Q226%http://www.journals.elsevier.com/journal-of-the-franklin-institute/
International Journal of Fuzzy Systems3.6Q230/84国际模糊系统杂志Q3*SF-5https://link.springer.com/journal/40815
JOURNAL OF PROCESS CONTROL3.3Q231/84过程控制杂志Q215%SA-126http://www.journals.elsevier.com/journal-of-process-control/
INTERNATIONAL JOURNAL OF ROBUST AND NONLINEAR CONTROL3.2Q232/84国际鲁棒与非线性控制杂志Q328%SA-187https://onlinelibrary.wiley.com/journal/10991239
MECHATRONICS3.1Q234/84机电一体化Q214%SA-249http://www.journals.elsevier.com/mechatronics/
INTERNATIONAL JOURNAL OF ADVANCED MANUFACTURING TECHNOLOGY2.9Q236/84国际先进制造技术杂志Q3*SF-7https://www.springer.com/170
ASIAN JOURNAL OF CONTROL2.7Q237/84亚洲控制杂志Q427%SA-264https://onlinelibrary.wiley.com/journal/19346093
EUROPEAN JOURNAL OF CONTROL2.5Q238/84欧洲控制杂志Q325%SA-198https://www.sciencedirect.com/journal/european-journal-of-control
INTERNATIONAL JOURNAL OF CONTROL AUTOMATION AND SYSTEMS2.5Q238/84国际控制自动化与系统杂志Q3*SF-25IJCAShttps://www.springer.com/12555
SIAM JOURNAL ON CONTROL AND OPTIMIZATION2.2Q241/84SIAM 控制与优化杂志Q2**https://www.siam.org/publications/siam-journals/siam-journal-on-control-and-optimization/
IET Control Theory and Applications2.2Q241/84IET 控制理论与应用Q448%SA-159https://onlinelibrary.wiley.com/journal/17518652
SYSTEMS & CONTROL LETTERS2.1Q344/84系统与控制快报Q327%SA-193https://www.sciencedirect.com/journal/systems-and-control-letters
International Journal of Computers Communications & Control2.0Q345/84国际计算机通信与控制杂志Q4**https://univagora.ro/jour/index.php/ijccc/about
OPTIMAL CONTROL APPLICATIONS & METHODS2.0Q345/84最优控制应用与方法Q49%SA-173http://onlinelibrary.wiley.com/journal/10.1002/(ISSN)1099-1514
AUTONOMOUS AGENTS AND MULTI-AGENT SYSTEMS2.0Q345/84自主代理与多智能体系统Q3*SF-12https://link.springer.com/journal/10458
Information Technology and Control2.0Q345/84信息技术与控制Q4**https://itc.ktu.lt/index.php/ITC
JOURNAL OF CHEMOMETRICS1.9Q349/84化学计量学杂志Q425%SA-116https://onlinelibrary.wiley.com/journal/1099128X
ASSEMBLY AUTOMATION1.9Q349/84装配自动化Q4http://www.emeraldinsight.com/loi/aa
Journal of Systems Engineering and Electronics1.9Q349/84系统工程与电子学杂志Q4**https://ieeexplore.ieee.org/xpl/RecentIssue.jsp?punumber=5971804
MATHEMATICS OF CONTROL SIGNALS AND SYSTEMS1.8Q352/84控制信号与系统数学Q4*SF-4https://www.springer.com/498
Automatika1.7Q354/84AutomatikaQ46%SA-198https://automatika.korema.hr/index.php/automatika
JOURNAL OF DYNAMIC SYSTEMS MEASUREMENT AND CONTROL-TRANSACTIONS OF THE ASME1.7Q354/84动态系统测量与控制杂志-ASME 会刊Q4https://dynamicsystems.asmedigitalcollection.asme.org/journal.aspx
TRANSACTIONS OF THE INSTITUTE OF MEASUREMENT AND CONTROL1.7Q354/84测量与控制学会会刊Q4http://tim.sagepub.com/
IMA JOURNAL OF MATHEMATICAL CONTROL AND INFORMATION1.6Q358/84IMA 数学控制与信息杂志Q4https://academic.oup.com/imamci/
International Journal of Applied Mathematics and Computer Science1.6Q358/84国际应用数学与计算机科学杂志Q4http://www.amcs.uz.zgora.pl/
INTERNATIONAL JOURNAL OF CONTROL1.6Q358/84国际控制杂志Q4https://www.tandfonline.com/loi/tcon20
DISCRETE EVENT DYNAMIC SYSTEMS-THEORY AND APPLICATIONS1.4Q464/84离散事件动态系统-理论与应用Q4https://www.springer.com/10626
PROCEEDINGS OF THE INSTITUTION OF MECHANICAL ENGINEERS PART I-JOURNAL OF SYSTEMS AND CONTROL ENGINEERING1.4Q464/84机械工程师学会会刊 第一部分-系统与控制工程杂志Q4http://www.sagepub.com/journals/Journal202033
ESAIM-CONTROL OPTIMISATION AND CALCULUS OF VARIATIONS1.3Q466/84ESAIM-控制优化与变分法Q3http://www.esaim-cocv.org/
MEASUREMENT & CONTROL1.3Q466/84测量与控制Q4http://mac.sagepub.com/
Archives of Control Sciences1.2Q469/84控制科学档案Q4http://acs.polsl.pl/
Studies in Informatics and Control1.2Q469/84信息学与控制研究Q4http://sic.ici.ro/
Revista Iberoamericana de Automatica e Informatica Industrial1.1Q471/84伊比利亚工业自动化与信息学杂志Q4https://www.sciencedirect.com/journal/revista-iberoamericana-de-automatica-e-informatica-industrial-riai
INTERNATIONAL JOURNAL OF ROBOTICS & AUTOMATION0.8Q475/84国际机器人与自动化杂志Q4http://www.actapress.com/Content_of_Journal.aspx?JournalID=147
MODELING IDENTIFICATION AND CONTROL0.7Q476/84建模、识别与控制Q4http://www.itk.ntnu.no/publikasjoner/mic/mic.html
AT-Automatisierungstechnik0.7Q476/84AT-自动化技术Q4http://www.degruyter.com/view/j/auto
JOURNAL OF DYNAMICAL AND CONTROL SYSTEMS0.6Q478/84动态与控制系统杂志Q4https://link.springer.com/journal/10883
AUTOMATION AND REMOTE CONTROL0.6Q478/84自动化与远程控制Q4https://link.springer.com/journal/10513
Control Engineering and Applied Informatics0.4Q482/84控制工程与应用信息学Q4http://www.ceai.srait.ro/index.php?journal=ceai
Robotic Intelligence and AutomationN/AN/AN/A机器人智能与自动化

工程机械领域期刊

自动化与控制系统领域期刊

0.1 VLA 与具身智能的基本概念

0.1.1 具身智能(Embodied Intelligence)的定义与核心问题

学习导航

  • 本章主题:0.1.1 具身智能(Embodied Intelligence)的定义与核心问题
  • 前置知识:基础 Python 与高中数学即可。
  • 建议用时:54-74 分钟
  • 阅读顺序:先看概念框架,再看公式/代码,最后做自测。

0.1.1.1 具身智能的基本定义

从直观上看,“具身智能”就是有身体的智能: 智能体不再只是云端的一段代码,而是附着在某种物理载体上——机械臂、轮式底盘、四足机器人、无人机、甚至未来的类人机器人——通过传感器感知环境,再通过执行器对环境施加影响。(MDPI)

比起纯软件 AI,具身智能至少多了三个关键要素:

+物理身体(Body):带有质量、尺寸、关节、摩擦和磨损的实体,而不是抽象的“向量空间”。 +传感器(Sensing):摄像头、深度相机、IMU、力/力矩传感器、激光雷达、触觉皮肤等,用来把物理世界转成数据流。 +执行器(Actuation):电机、关节驱动器、轮子、喷气系统等,将决策转换成真实的力和运动。

一个具身智能体(embodied agent)通常被定义为:

具有物理形态,能够通过传感器感知环境,通过执行器对环境施加作用,并通过这种闭环交互产生、学习和体现智能行为的系统。(MDPI)

在本书中,“具身智能”主要指机器人具身智能:我们关注的不是抽象哲学讨论,而是如何让具体机器人——机械臂、移动平台、类人机器人——在现实世界里完成各种任务。

图 1-1(占位):具身智能基本构成示意 建议绘制一个方框图:中间是“智能体”,内部有“感知模块”“决策模块”“控制模块”;左侧箭头为来自环境的传感器输入(图像、力觉等),右侧箭头为输出到环境的动作(关节力矩、末端轨迹等),整体构成一个闭环。


0.1.1.2 核心问题:感知–认知–行动的闭环

具身智能最核心的,不是“用了什么模型”,而是感知–认知–行动(Perception–Cognition–Action)的闭环如何建立和运行。

1.感知(Perception)

  • 将环境中的光、声、力等物理信号,转换成离散的数字观测:图像、点云、关节编码器读数等。
  • 还需要做状态估计:例如从多帧图像中估计物体的 3D 姿态、机器人自身的位姿等。 2.认知 / 决策(Cognition / Decision-making)
  • 在高层上理解“现在发生了什么”、“我在哪里”、“目标是什么”、“可能会发生什么”。
  • 典型会涉及任务理解(来自语言指令)、场景语义理解、路径与动作规划、风险评估等。 3.行动 / 控制(Action / Control)
  • 将高层决策转化成低层可执行的控制命令:关节目标位置、速度、力矩,或者末端位姿增量等。
  • 同时要满足物理约束:电机极限、加速度上限、避免碰撞和自碰等。

关键在于,这是一个实时在线的闭环过程:机器人一边动作,一边观测新的环境状态,并不断根据反馈调整策略。闭环带来几类核心挑战:

+实时性:感知、决策、控制的整体时延必须足够小,才能防止“看到的是刚刚的世界,操作的是此刻的机器”。 +适应性:世界在不断变化,物体位置会变化、光照会变化、地面可能不平整,策略必须能适应分布偏移。 +安全性:误判和延迟直接对应物理风险——撞到人、打翻物体、损坏设备——安全约束必须成为一等公民,而不是事后补丁。

图 1-2(占位):感知–认知–行动闭环流程图 建议以时间轴画出:感知模块从环境读取信息 → 认知模块产生决策 → 控制模块输出动作 → 环境状态改变 → 再次感知,如同一个循环控制系统。

在纯软件 AI 中,模型错误最多导致“答错题”;在具身智能中,同样的错误会变成“砸到人”。这也是为什么具身智能研究必须同时考虑智能性工程可控性


0.1.1.3 具身智能的典型实例

为了让概念不那么抽象,这里列举几个日常能见到或正在快速出现的具身智能系统:

1.自主移动机器人

  • 仓储物流中的 AGV / AMR(自动引导车 / 自主移动机器人),需要在复杂仓库内自主导航、避障、搬运货物。
  • 外卖配送机器人、无人配送车,需要在室外环境中应对行人、车辆和路况变化。 2.家庭服务机器人
  • 扫地机器人是最早大规模商业化的具身智能产品之一:通过简单传感器和策略完成地面覆盖、避障和回充。
  • 新一代“家庭助手”机器人(如具备机械臂和视觉系统的家务机器人)正在尝试完成叠衣服、收拾桌面、做简单烹饪等任务。(卫报) 3.工业协作机器人(Cobot)
  • 在制造业中与人协作的机械臂,需要在安全约束下完成装配、搬运等任务,同时感知人的位置与意图。 4.自动驾驶与无人机
  • 自动驾驶车辆通过多种传感器感知道路环境,在速度、转向和制动之间做出实时决策。
  • 无人机在城市或灾害场景中执行巡检、救援任务,对风场、障碍物和通信质量都有感知与适应需求。

这些系统的共同点是:

必须把“看懂世界”和“在世界中行动”结合起来。

本书在后续章节会从数学基础、机器学习到 VLA 架构,逐步展开“如何让这些具身系统更聪明、更通用”的技术路径。


0.1.2 从 CV / NLP 到 VLM,再到 VLA 的发展脉络

具身智能的崛起,并不是凭空出现,而是建立在过去十多年CV(计算机视觉)NLP(自然语言处理)多模态学习的连续突破之上。

0.1.2.1 CV(计算机视觉)的演进:从特征工程到深度视觉

在深度学习普及之前,视觉主要依赖手工特征(如 SIFT、HOG) + 传统分类器(如 SVM、随机森林)来完成图像识别和检测。

2012 年,AlexNet 在 ImageNet 图像分类竞赛上以巨大优势夺冠,被普遍认为是深度学习在视觉领域的“分水岭事件”:它证明了在大规模数据和 GPU 支持下,多层卷积网络可以远远超越传统方法。(维基百科)

此后几十个经典视觉任务迅速被深度网络主导:

  • 图像分类:ResNet、DenseNet 等结构极大提升了识别精度。
  • 目标检测:R-CNN 系列、YOLO 等方法能在自然场景中定位并分类多个物体。
  • 图像分割:U-Net、Mask R-CNN 等结构让像素级理解成为现实。

再往后,视觉 Transformer(ViT)等架构开始出现,将 Transformer 引入图像领域,用全局自注意力替代或补充卷积。本书第 3 章会更系统地介绍这些视觉表示,但在这里需要记住一件事:

现代机器人视觉基本都站在深度视觉的肩膀上。

没有这波视觉革命,就没有今天 VLM 和 VLA 的数据基础与网络骨干。


0.1.2.2 NLP(自然语言处理)的演进:从统计到大语言模型

NLP 的发展路径与视觉类似,也经历了从“手工 + 统计”到“神经网络 + 大模型”的演变:

1.统计时代

  • 以 n-gram 语言模型、HMM、CRF 和统计机器翻译为代表,主要依靠共现统计和概率图模型。
  • 这一阶段的模型难以捕捉长距离依赖,对上下文理解有限。 2.神经网络时代
  • 词向量(word2vec、GloVe)将离散单词映射到连续向量空间,为神经网络建模语言准备了输入表示。
  • RNN / LSTM / GRU 等序列模型开始用于机器翻译、语言建模和问答。 3.Transformer 与大语言模型时代
  • 2017 年提出的 Transformer 架构完全基于自注意力机制,抛弃了循环结构,实现了更高并行度和更长程依赖建模能力。(arXiv)
  • 随着算力和数据规模的扩张,BERT、GPT 等大规模预训练语言模型出现;GPT-3 等模型以数百亿到千亿参数规模,在多种语言任务上展现出强大的生成与推理能力。(aryaxai.com)
  • 2022 年开始,ChatGPT 等对话式系统的出现,让公众第一次直观感受到“语言模型几乎可以扮演一个通用文本助手”。(HatchWorks AI)

对机器人来说,这意味着:

我们第一次拥有能够“理解人类复杂指令、推理意图并生成多步计划”的通用语言模块。

这也为后续“用自然语言给机器人下任务”奠定了基础。


0.1.2.3 VLM(视觉–语言模型)的兴起:跨模态对齐的第一步

有了强大的视觉和语言模型,下一步自然问题是:能不能让模型同时理解图像和文本?

视觉–语言模型(VLM)正是回答这一问题的代表。以 CLIP 为例:(维基百科)

  • 使用双编码器结构:一个图像编码器(通常是 CNN/ViT),一个文本编码器(通常是 Transformer)。
  • 在海量图文对(image–text pairs)上进行对比学习:
    • 让配对的图像–文本向量在特征空间中更接近;
    • 让不匹配的图像–文本向量更远。
  • 训练完成后,可以实现:
    • 图文检索(以文找图、以图找文);
    • 零样本分类(用文字描述类别,无需额外标注即可做图像分类);
    • 图像内容粗粒度描述等。

其他 VLM(如 Flamingo、PaLI-X、BLIP 系列等)进一步加入生成能力和更复杂的跨模态推理,但共同点是:

VLM 让模型第一次在“屏幕世界”中同时理解图像和文本。

然而 VLM 主要还是“看图说话”或“用文字回答关于图像的问题”,它们不直接输出物理世界中的动作。在机器人语境中,这种能力更适合作为“理解任务和场景的上层模块”。

图 1-3(占位):从 CV / NLP → VLM → VLA 的演进谱系 建议画一条时间箭头:左边是单模态 CV / NLP,中间是 VLM(图像 + 文本对齐),右边是 VLA(图像 + 文本 + 动作轨迹),以示范模态的逐步扩张。


0.1.2.4 VLA(视觉–语言–动作)的出现:走向物理世界的关键一步

VLM 解决了“看图 + 理解语言”的问题,但还缺少一个关键环节:如何把这种理解转化为机器人动作?

这正是 VLA(Vision–Language–Action)模型的出发点。根据近年的综述与定义,VLA 通常指:(维基百科)

输入:视觉观测(单帧图像或视频) + 语言指令 输出:可以直接在机器人上执行的低层动作(如末端 6-DoF 运动 + 手爪开合),通常以离散化的动作 token 或连续控制向量形式表示。

典型的 VLA 架构一般分两步:

1.视觉–语言编码

  • 复用一个预训练的 VLM 或多模态大模型,将图像和指令编码到统一的隐空间中。 2.动作解码
  • 在大量“(图像,指令,动作轨迹)”三元组示教数据上进行微调,学习从隐空间表示到具体机器人动作序列的映射。

Google DeepMind 的 RT-2 被广泛认为是确立 VLA 概念的重要工作之一:它在大规模互联网图文预训练基础上,利用真实机器人示教数据微调,使机器人具备“把网页学来的知识迁移到现实操作”的初步能力,例如理解“扔垃圾”“收拾桌面”等语义指令。(arXiv)

此后,包括 Octo、OpenVLA、Gemini Robotics 等在内的一系列 VLA 模型陆续提出,支持更多机器人平台、更复杂任务以及更高频实时控制。(arXiv)

从研究路线看:

+CV / NLP:在各自模态里学会“看得懂 / 听得懂”。 +VLM:在屏幕世界中学会“把看到的”和“说出来的”对齐。 +VLA:在物理世界中学会“在理解之上行动”。

本书第 8 章会从架构角度系统展开 VLA 的设计,这里把它放在历史脉络中,作为一个过渡和总览。


0.1.3 VLA 在通用机器人与通用智能中的角色定位

有了 VLA 这个概念,还需要思考:它在更大版图中的位置是什么? 也就是:VLA 对“通用机器人”和“通用人工智能(AGI)”意味着什么?

0.1.3.1 通用机器人的愿景:从专用工具到通用助手

传统工业机器人通常是“专用工具”:

  • 工作空间固定(如生产线某一工位)。
  • 任务高度确定(重复装配、焊接、搬运)。
  • 编程方式偏底层(示教器逐点示教、手工编程轨迹)。

而所谓“通用机器人”(general-purpose robot)的愿景是:

+任务多样:能在不同环境下完成清理、搬运、整理、协作等多种任务。 +指令自然:人类用日常语言描述目标,而不是写程序或给出复杂坐标。 +适应变化:面对新物体、新布局、新任务组合时,依然能凭借已有知识和少量演示快速适应。(arXiv)

在这样的系统中,VLA 模型被视作机器人的“通用大脑候选”

  • 通过视觉–语言–动作统一建模,从原始摄像头图像、自然语言指令直接生成低层控制命令。
  • 同一模型可以在多个机器人平台和任务上共享,只需要对输入输出做适配。

当然,现实系统中 VLA 往往不会“单独统治一切”,而是与传统导航、运动规划、安全控制模块共同工作——这部分将在第 10 章详细展开。


0.1.3.2 VLA 模型的作用:把“人类友好指令”转成“机器人可执行行动”

从系统架构上看,VLA 模型扮演的是**“从语义到控制”的桥梁**角色:

1.在输入侧

  • 语言侧:接收用户的自然语言描述,例如“把桌上的五本书按大小从左到右排好”。
  • 视觉侧:接收当前场景的相机图像或视频,理解桌子、书本的位置、姿态、遮挡等信息。 2.在内部表示侧
  • 将“文本目标”和“视觉场景”映射到统一隐空间,形成对“当前状态 + 目标”的综合理解。
  • 这种表示既包含语义抽象(例如“按大小排序”),也包含几何约束(书本的位置、可抓取区域)。(维基百科) 3.在输出侧
  • 生成连续时间下的一系列动作:接近目标书本、调整姿态、闭合手爪、移动到目标位置、松开等。
  • 在更高层,可以输出子任务序列或动作原语,由下层控制器进一步实现。

相比传统“人写规则 + 手工调参”的机器人系统,VLA 带来的变化主要有三点:

+指令接口更自然:用户不用会编程,只需像与人类助手沟通一样给任务。 +任务泛化能力更强:通过在多任务、多场景数据上的统一训练,模型有机会学习到跨任务共性的技能。(arXiv) +与大语言模型深度结合:可以直接利用 LLM 的规划和推理能力,生成步骤,再由 VLA 承接落地为动作(本书第 4、8 章会详细展开这种接口)。


0.1.3.3 里程碑意义:VLA 作为通往 AGI 的实践路径之一

“通用人工智能(AGI)”是一个仍然带有争议的概念,但有一个共识正在形成:

如果一种智能从来不与现实世界交互,只在文本或比特空间中“自言自语”,那么它的能力终究是受限的。

具身智能和 VLA 提供了一条**“从虚拟走向物理”的实践路径**:

1.在物理世界中检验理解与推理

  • 语言模型在对话中会出现幻觉,但当它驱动机器人执行任务时,错误会有非常具体的表现(抓错物体、路径碰撞等),这迫使我们设计更严谨的评测和训练范式。(arXiv) 2.让模型在长时间、长尺度上积累经验
  • 通用机器人需要在长期部署中持续适应环境变化,这与 AGI 中“终身学习、持续学习”的目标高度一致。
  • 新一代 VLA 研究已开始引入世界模型、长序列记忆等模块,尝试让机器人能在内部模拟未来并规划行动。(arXiv) 3.统一多模态、多机器人、多任务的基础模型
  • 最新的 VLA 系统(如 Gemini Robotics、Helix 等)强调一个模型可以驱动多种机器人形态(机械臂、双臂、类人等),并执行多种任务,向“具身基础模型”方向演进。(Reuters)

从这个角度看,VLA 的意义远不只是“让机器人更好用”:

  • 对机器人学,它是通向“通用机器人助手”的关键一环;
  • 对人工智能整体,它是把大模型能力从虚拟世界映射到物理世界的桥梁,为讨论“真正有用的 AGI”提供了具体实验平台。

图 1-4(占位):VLA 在“AGI 版图”中的位置示意图 建议画一个同心圆或多层结构:最内层为“感知–控制”,外层为“多模态大模型”,再外一层为“具身基础模型 / VLA”,最外层为“AGI 应用场景”,展示 VLA 处于“多模态智能”和“物理世界”交汇处。


小结与后续衔接

在本节中,我们完成了三件事:

  1. 给出了具身智能的工作定义,并强调了感知–认知–行动闭环和安全约束。
  2. 从历史脉络梳理了从CV / NLP → VLM → VLA的技术演进。
  3. 讨论了VLA 在通用机器人和 AGI 中的角色,把它放在更大的技术版图中定位。

本章小结与自测

三行小结

  1. 本章定位了具身智能与 VLA 的学习全景与能力目标。
  2. 重点不在记忆术语,而在建立“理论-代码-实验”的闭环。
  3. 完成本章后应能为后续学习制定可执行计划。

检查题

  1. 用你自己的话总结本章最核心的一个公式/机制。
  2. 给出一个“如果要落地到项目里,你会怎么用”的具体例子。

常见误区

  1. 只读不做,停留在概念层。
  2. 目标过大,没有阶段里程碑。
  3. 不记录过程,无法复盘。

公式到代码(最小示例)

# 学习计划最小示例
weekly_hours = 8
focus = ["math", "dl", "robotics"]
plan = {k: weekly_hours // len(focus) for k in focus}
print(plan)

本章外部参考(集中)

  1. MDPI
  2. 卫报
  3. 维基百科
  4. arXiv
  5. aryaxai.com
  6. HatchWorks AI
  7. 维基百科
  8. 维基百科
  9. arXiv
  10. arXiv
  11. Reuters

0.2 研究生阶段需要具备的能力画像

0.2.1 “能读懂论文”的能力:理论、公式与实验理解

学习导航

  • 本章主题:0.2.1 “能读懂论文”的能力:理论、公式与实验理解
  • 前置知识:基础 Python 与高中数学即可。
  • 建议用时:94-114 分钟
  • 阅读顺序:先看概念框架,再看公式/代码,最后做自测。

在具身智能/VLA 领域,读论文的最终目标不是“看完”,而是能做到三件事: 1)判断这篇工作值不值得你投入时间; 2)真正搞懂它的理论与实现; 3)知道该如何在自己的系统里使用、改造甚至超越它。

很多计算机科学教育都推荐类似的“多遍阅读法”,例如 Keshav 提出的“三遍读论文”方法:第一遍抓大意,第二遍扣细节,第三遍才考虑完全复现与质疑。(ACM Digital Library) 下面三个小节,分别从理论、公式和实验三个维度,把“能读懂论文”变成一套可训练的具体能力。


0.2.1.1 理论基础

“理论基础”在这里不只是指你上过哪些课,而是:你能否把论文中的新概念,准确地挂在自己已有的知识框架上。

一个典型的具身智能/VLA 论文,往往同时包含:

  • 深度学习表征(视觉 backbone、Transformer 等)
  • 强化学习/模仿学习或决策理论
  • 控制与机器人学(运动学、动力学、控制结构)
  • 少量概率与优化理论(损失函数、收敛性说明等)

对应的“能读懂”,至少包括以下几个层次:

1.识别“这是哪一类方法”。 读方法部分时,先粗暴分类:

  • 这是 RL/IL 为主的策略学习,还是纯行为克隆?
  • 视觉部分是 CNN、ViT 还是直接用预训练 CLIP/VLM?
  • 动作是在关节空间优化,还是末端空间规划? 这些大类标签可以帮你快速把论文挂到自己脑中的“地图”上,知道该召回哪一块理论。 2.找出论文依赖的“旧理论”与“新假设”。 每篇论文都有“建在谁的肩膀上”和“自己新加的一小块砖”,
  • 旧理论:如 Bellman 方程、策略梯度、Transformer、自注意力、阻抗控制等,后文会在对应章节系统展开。
  • 新假设:例如“视觉编码器已经有足够语义能力”“仿真环境与现实差距可以通过域随机化弥补”等。 读方法时要刻意标注:哪些是教科书级别的东西,哪些是作者自己特有的设定。 3.在脑中重画“模块框图”。 对具身智能论文,最实用的做法是自己画一个简化版框图:
  • 输入:多帧图像 + 语言指令 + 机器人状态;
  • 中间:视觉编码、语言编码、融合模块、策略 head;
  • 输出:动作表示(轨迹、关节增量、动作 token 等)。 这一步大幅降低你对符号和细节的恐惧感,帮助你把复杂理论收束成几个可理解的模块。

【图片占位】 图 1-2-1:典型 VLA 论文整体结构示意图 输入模态、模型模块、训练目标、输出动作,用方框图体现,并标出理论依赖(RL / IL / 控制 / 表征学习)。

4.用“你自己的话”复述论文的核心思想。 读完方法部分后,尝试用 2–3 句话,向一个“只懂基础 ML,不懂机器人”的同学解释这篇论文在做什么。这是检验你理论理解是否到位的最好自测。


0.2.1.2 公式推演理解

许多同学看到密密麻麻的公式会条件反射:“这我不行”。实际上,绝大多数机器人学习与 VLA 论文中的公式,都可以归结为几类“常见套路”:

+“期望 + 损失”型公式:例如行为克隆、策略梯度、多模态对比学习等。 +“贝尔曼方程”型递推公式:在强化学习与世界模型中频繁出现。 +“几何与坐标变换”型公式:在相机标定、手眼标定、运动学里用到。

“能读懂公式”,不等于能完整重做所有推导,而是至少要做到:

1.逐个符号对齐语义。 建议自己养成习惯:

  • 打印论文或在平板上阅读时,把所有出现的符号单独列一张表:\( s, a, o, x, z, \theta, \phi, \pi, f, g,\dots \)
  • 标注其物理或语义含义(例如:\( s \) 是机器人 + 环境状态,\( o \) 是观测,\( a \) 是动作,\( \theta \) 是策略参数)。 许多困惑来自于“同一个字母在不同论文里代表不同概念”,你要主动做 disambiguation。 2.做“维度检查”和极端情形检查。 当你看到类似

\[ \mathcal{L}(\theta) = \mathbb{E}_{(o,a)\sim \mathcal{D}}[-\log \pi_\theta(a|o)] \]

快速检查:

  • \( \mathcal{L} \) 是标量;
  • 期望外面是损失,内部是对数概率;
  • 特殊情况:如果只有单步动作,这就退化为普通分类交叉熵。 通过极端/退化情形帮助你把公式和熟悉的机器学习形态对齐。

3.只在关键一步上“重推”公式。 真正值得你亲手推导的往往是那些和算法结构直接对应的公式,比如:

  • 策略梯度的推导如何引出“log π × 回报”的形式;

  • 对比学习损失如何引出相似度的 softmax;

  • 世界模型中 ELBO(证据下界)如何对应到重建和 KL 散度两项。 这些推导是后续你修改损失函数、做 variant 时的基础。 4.在代码里“找回”公式。 很多论文里的公式,在开源实现中通常会直接变成几行 PyTorch 代码。 通过比对代码与公式:

  • 你可以验证自己是否读对了符号;

  • 也会发现一些作者没有在论文中写清楚的 trick(如归一化、clip、mask)。 这种“从公式回到实现”的能力,对之后复现与做新工作非常重要。

【图片占位】 图 1-2-2:从论文公式到代码实现的对照示意图 左边为损失函数数学表达式,右边为对应的伪代码 / PyTorch 代码片段,用箭头将对应项连线。


0.2.1.3 实验解析

在机器学习与机器人领域,实验不是“装饰”,而是论证正确性的主体。近几年顶会也越来越强调可复现性和实验规范,例如 JMLR 等期刊对 ML 研究的复现性提出了系统建议,涉及代码、数据、随机性控制等方面。(机器学习研究期刊)

你在读实验时,至少要具备以下几个能力:

1.读懂实验设置:任务、环境与基准。 具身智能论文的实验通常包括:

  • 仿真环境(例如 Mujoco、Isaac Gym)中的操作任务;
  • 真实机器人平台(机械臂型号、末端执行器、相机布局等);
  • 标准基准任务或自建任务(如抓取成功率、开门、收纳等)。 你要能回答:“作者到底在什么条件下测试了什么能力?” 2.理解评价指标与统计意义。
  • 在操作任务中,最常见的指标是成功率(%)、平均完成时间、路径长度等;
  • 还会看到标准差、置信区间或箱线图,表示多次试验的波动性。 你需要关注:
  • 差异是 5% 还是 30%?
  • 是否有足够的重复次数支撑这个差异?
  • 是否只在一两个特定场景好看,而在更难场景无优势? 3.学会阅读消融实验(ablation study)。 消融实验是理解论文“真贡献”的关键:
  • 比如:“没有语言条件”“没有历史轨迹”“不用预训练视觉”时性能下降多少?
  • 哪个模块/损失/训练阶段对结果最关键? 读消融实验时,可以逆向思考:**如果你删掉这个模块,系统会怎样退化?**这会帮助你在未来复现时决定“哪些可以简化,哪些必须保留”。 4.关注复现条件与实验细节。 近年的复现性研究指出,即便有代码和数据,能否复现结果仍高度依赖环境、超参数与随机性控制等。(arXiv) 阅读实验部分时,建议刻意寻找:
  • 是否公开了代码和模型?
  • 是否说明了关键超参数(学习率、batch size、训练步数);
  • 是否陈述了硬件配置和训练时间;
  • 是否提到种子、不同随机初始化下的稳定性。 5.用“是否值得复现”来检验理解程度。 读完一篇论文的实验部分,你可以给自己几个问题:
  • 我能画出一个简化版的实验流程图吗?
  • 如果让我做第一次复现,我知道从哪开始(仿真/真实平台/哪个任务)吗?
  • 有哪些细节我还不确定,需要翻代码或附录确认?

【图片占位】 图 1-2-3:具身智能论文实验结构示意图 展示环境设置、数据采集、训练、评估指标、可视化结果等模块之间的关系。


0.2.2 “能复现系统”的能力:代码阅读、调试与工程落地

在具身智能/VLA 方向,“只看懂论文不写一行代码”的价值非常有限。你真正能站稳脚跟的标志,是可以根据论文与开源资源,把一个系统在自己的环境中跑起来,并根据需要进行修改和调优。这既是科研能力,也是工程能力。

近年来,ML 社区围绕“可复现性”(reproducibility)形成了越来越细致的标准,包括代码公开、依赖管理、实验脚本与数据版本化等。(机器学习研究期刊) 本小节不讲具体语言语法,而是谈“编程功底”“代码阅读”“工程实践”三个层次的能力画像。


0.2.2.1 编程功底

在本书涉及的方向,你至少需要具备以下层面的编程能力:

1.工具链熟练度,而非“背 API”。

  • Python(用于深度学习、数据处理、脚本);
  • 至少了解一种深度学习框架(PyTorch/TensorFlow,以 PyTorch 为主);
  • 基本 Linux 命令、Shell 脚本、git 版本控制。 “熟练”的含义是:你看到陌生项目时,能通过查官方文档和搜索,在合理时间内完成环境搭建与小修改,而不是全部记住函数签名。 2.理解“从数据到模型”的最小 pipeline。 理想状态:你能从零写出一个小型项目,包括:
  • 数据加载(Dataset/DataLoader);
  • 模型定义(一个包含前向传播的类);
  • 训练循环(前向、计算 loss、backward、optimizer.step);
  • 日志与模型保存。 本书后续关于深度学习与 RL 的章节会反复使用类似的结构,这里你只需意识到:有能力写出这样一个最小 pipeline,是复现任何论文的起点。 3.基本的调试意识。
  • 能使用断点、打印张量维度和统计信息;
  • 遇到 NaN、显存溢出、梯度为 0 或爆炸时,知道从哪些方向排查;
  • 知道如何简化问题(先在更小的数据/更简单的模型上跑通)。

0.2.2.2 代码阅读

现实情况是:越来越多的机器人与 VLA 论文会提供 GitHub 仓库,仓库中的 README 和脚本组织,对复现至关重要。(Medium)

“能读懂代码”,至少包括:

1.先读文档和 README,而不是直接打开源码。 一个规范的 ML 项目 README 通常会包含:(Medium)

  • 依赖与环境(Python 版本、依赖库、CUDA 等);
  • 数据准备方式(数据下载脚本、预处理脚本);
  • 训练与评估命令;
  • 预训练模型权重位置以及预期结果。 你应该从这里倒推出整套 pipeline,再去对应地找脚本与模块文件。 2.识别“主干脚本”和“关键模块”。 在一个典型的项目中:
  • train.py / main.py:训练主流程;
  • model/networks/:模型结构定义;
  • data/datasets/:数据加载相关;
  • configs/ 或 YAML 文件:实验配置;
  • scripts/:批量运行或复现实验的脚本。 你的目标是先弄清“执行顺序”和“数据流向”,而不是一开始就试图看懂每一个函数。 3.将论文结构与代码结构对齐。
  • 论文中每一个重要模块,都应该能在代码里找到对应类或函数(例如 VisualEncoder, PolicyNetwork, WorldModel 等);
  • 你可以在注释或笔记中记录:论文图中的 Block A ≈ module_a.py 中的某个类。 当你需要做修改(替换视觉 backbone、改损失函数)时,这个对齐表会非常重要。 4.最小复现:先复现“作者写在 README 里的结果”。 在试图“改论文”之前,先按 README 的说明跑一遍官方实验,看看结果是否接近论文中的主表或主曲线。如果复现差异太大,优先检查:
  • 数据是否下载完全、预处理一致;
  • 配置文件是否和论文默认设置相同;
  • 随机种子与 GPU 数量是否影响结果。

【图片占位】 图 1-2-4:典型深度学习/机器人项目目录结构示意图 展示 configs/、data/、models/、train.py、eval.py 等,并用箭头表示主执行路径。


0.2.2.3 工程实践

“能复现系统”最终落点,是你能把算法放进真实或仿真机器人系统中运行,这比在 GPU 上跑一个离线脚本要复杂得多。

你需要逐步培养以下几个层次的能力:

1.把算法变成“服务”或“模块”。 不管底层是 PyTorch 还是 TensorFlow,最终在机器人系统中,它需要:

  • 有清晰的输入输出接口(例如订阅图像话题、发布关节命令);
  • 能够以指定频率运行(例如每秒 5–10 次推理);
  • 遇到错误时能优雅失败(给出安全动作、记录日志,而不是整个系统崩溃)。 这要求你理解后续章节中 ROS/系统架构相关内容,但在这里要意识到:工程落地 ≠ 把 python script.py 设为开机自启这么简单。 2.考虑资源与环境差异。 实际机器人常用的嵌入式设备算力有限,因此:
  • 在服务器上训练好的大模型,可能无法直接部署;
  • 需要考虑模型剪枝、量化、蒸馏等方法(对应后文部署章节);
  • 环境差异(仿真 vs 真实,实验室 vs 实际场景)也会导致性能偏差,需要你通过参数调整和少量再训练来修补。 3.建立日志与监控习惯。 复现系统时,必须要有“可观察性”:
  • 记录关键指标:成功率、失败类型、延迟、资源占用;
  • 在异常情况下保留数据(传感器记录、模型输出、系统状态),方便事后分析;
  • 对机器人任务,最好能录像或用可视化工具记录轨迹。 4.把安全性放在一开始考虑。 在具身系统中,“跑不起来”只是麻烦,“跑错了”则可能砸坏硬件甚至伤人。 因此,在第一次部署任何新策略时,建议:
  • 限制速度和力矩;
  • 设定物理安全区域和急停策略;
  • 尽量先在仿真中测试极端情况。

【图片占位】 图 1-2-5:从论文到代码到机器人系统的落地流程图 论文 → 开源代码 → 本地复现 → 仿真集成 → 真实机器人部署,各阶段的输入输出与关注点。


0.2.3 “能提出新 idea”的能力:问题抽象与研究选题

对于研究生来说,前两个能力(读论文、复现系统)让你“站在前沿门口”;能提出新 idea 并验证它,则让你真正走进科研。

在具身智能和 VLA 这样快速发展的领域,好的 idea 往往来自于: 1)对现有系统的深入使用与质疑; 2)对跨领域知识的迁移; 3)对“实验失败”的认真分析。

本节从“问题抽象 → 创新发散 → 评估筛选”三个阶段,构建一套选题思路。部分方法可以和后面关于综述、基准与科研进阶的小节互相印证。(richardmathewsii.substack.com)


0.2.3.1 问题抽象

问题抽象的核心,是从具体的、零碎的失败现象中提炼出“具有普遍意义的明确问题”。

以一个简单示例:你在仿真中训练了一个抓取策略,转到真实机械臂后成功率大幅下降。你可以按以下层次抽象:

1.现象级描述

模型在仿真中成功率 90%,现实中只有 20%,尤其在光照变化或物体纹理复杂时表现很差。

2.归因假设 可能的解释包括:

  • 视觉分布偏移(sim2real gap);
  • 机械臂控制延迟与噪声;
  • 数据集中未覆盖现实场景的多样性。 3.抽象成一般问题
  • 更高层表述可以是:

“如何提高视觉驱动抓取策略在真实环境中的鲁棒性?”

  • 再进一步:

“如何在有限真实数据下弥合仿真与现实视觉分布之间的差异?”

4.形式化技术问题

  • 例如:给定仿真数据分布 \( \mathcal{D}_{sim} \) 和少量真实数据 \( \mathcal{D}_{real} \),如何设计一种自监督或对比学习目标,使得视觉编码器在 \( \mathcal{D}_{real} \) 上表现良好?

这个过程的关键是:从一次具体 Bug 出发,反复问“这代表了什么更普遍的问题?” 在具身智能领域,常见的抽象问题包括:

  • 分布偏移(domain shift):仿真 vs 现实、新物体、新布局;
  • 信号稀疏(sparse reward):任务成功信号难以获取;
  • 多模态不一致:语言指令与视觉观测的对应不完美;
  • 控制约束:高层策略与低层控制器不匹配等。

0.2.3.2 创新发散

有了清晰的问题,并不意味着立刻有好 idea。创新发散阶段的目标,是系统性地列出候选思路,而不是“灵光一闪靠运气”。

可以采用一个简单的“多维头脑风暴”框架,把候选想法按下列维度展开:

1.数据维度

  • 是否可以引入新的数据形式(多视角、触觉、语言反馈);
  • 是否可以用自监督、合成数据或互联网数据降低真实数据需求;
  • 是否可以重新组织数据(课程学习、难度递增等)。 2.模型/架构维度
  • 视觉 backbone 是否可以替换为更适合机器人任务的架构;
  • VLA 中的融合方式(early/late/mid fusion,cross-attention)是否有更合理的变体;
  • 是否存在更适合长序列决策的结构(世界模型、层级策略等)。 3.目标函数/训练范式维度
  • 损失函数是否可以加入安全约束、能耗惩罚、稳定性正则等;
  • RL/IL/VLA 预训练三者的配比能否重新设计;
  • 是否可以引入人类偏好或语言反馈(RLHF-style)指导策略。(科学杂志) 4.系统与工程维度
  • 是否可以通过更好的仿真工具或更稳健的控制接口,让学习更稳定;
  • 是否可以设计新的评测协议,使得某类能力更显性,从而反过来驱动算法设计。

在这个阶段,不要过早否定想法。建议把想法全部粗略记录下来,再进入下一步筛选。

【图片占位】 图 1-2-6:从问题到多维创新发散的示意图 中心为抽象问题,向外沿“数据 / 模型 / 目标 / 系统”四个方向发散出候选思路。


0.2.3.3 评估筛选

真正能成为你研究课题的 idea,通常需要通过三重筛选:可行性、创新性、影响力。高校和研究机构在说明研究生培养目标时,也常强调这种平衡:硕士项目侧重在有限时间内完成一个清晰、可行的课题;博士项目则在此基础上追求更高的原创性和影响力。(德克萨斯大学计算机科学系)

你可以采用一个简单的“三角评估”:

1.可行性(Feasibility)

  • 你是否有必要的资源?(机器人平台、仿真环境、数据采集条件);
  • 所需实现工作量是否在 1–2 学期内可以完成?
  • 理论与实现是否在你或团队的技能范围内? 2.创新性(Novelty)
  • 在最近的 survey 和顶会论文中,是否已经有人做过非常相似的事情?(richardmathewsii.substack.com)
  • 你的 idea 是否只是简单堆砌几种已有方法,还是引入了新的视角或组合方式?
  • 如果别人看你的方法,会不会说“这就是某某方法的直接套用”? 3.影响力(Impact)
  • 这个问题是否对社区有普遍意义,而不仅仅是你实验室的某个工程小痛点?
  • 你的工作能否在一个合理的基准或真实应用场景中展示清晰收益?
  • 即使结果不如预期,这项探索本身是否能提供有价值的负结果或经验总结?

筛选结果不必完美,但至少要确保:

在可行性和创新性上都不为 0,影响力有潜力。

最终形成题目时,建议从最小可行问题入手:给大问题加上限定条件(特定任务、特定场景、特定数据规模),确保你可以构造清晰的实验验证路径。

【图片占位】 图 1-2-7:研究 idea 三角评估图 三个顶点分别为可行性、创新性、影响力,在图中标出示例课题的相对位置。


0.2.4 从课程学习到科研项目的过渡方式

对于大多数学生而言,研究生前半段的日常是“上课 + 作业 + 考试”,后半段逐渐变成“项目 + 论文 + 汇报”。怎样平滑地从前者过渡到后者,是能否在具身智能方向站住脚的关键。

许多经验文章都强调:课程侧重“学习已有知识”,科研则要求你“在不确定中创造新知识”,两者在节奏、评估方式和心态上都有明显差别。(科学杂志)

本小节从“巩固基础 → 参与项目 → 主动探索”三个阶段,勾勒一个现实可行的过渡路径。


0.2.4.1 巩固基础

课程阶段的目标不是拿满分,而是为未来科研打下可重用的知识与代码资产

1.把核心课程视为“工具箱建设”。

  • 数学与机器学习课程:给你提供阅读 VLA 理论、理解损失函数与优化算法的工具;
  • 深度学习、强化学习、机器人学课程:让你熟悉本书后续章节会详细展开的关键概念。 上课时,与其追求每个细节都搞懂,不如刻意问自己:“这门课给我增加了哪些可重复使用的工具?” 2.把课程大作业当作“微型科研项目”。 在许多学校,课程 project 已经非常接近真正的小型研究:
  • 你需要选题、调研相关工作、实现与实验、写报告;
  • 即使题目看起来简单(如变体的抓取任务、仿真导航),你也可以尝试做一点自己的改动(新损失、不同 backbone 等)。 如果提前做好规划,很多毕业论文选题都可以看作对某一个课程项目的深入延伸。 3.从“考前突击”转向“持续积累”。
  • 尽量把课堂笔记与实验代码整理成可复用的形式(例如独立的 repo、清晰的 README、可复用模块);
  • 对每门课,留下 1–2 页的“长期纪要”:列出最重要的概念、几篇关键论文和可复用代码位置; 这样,当你在做具身智能项目时,遇到相关问题,可以快速“跳回”这门课,而不是重学一遍。

0.2.4.2 参与项目

在很多计算机科学培养方案中,会明确指出:前 1–2 年以课程为主,之后逐渐转入以研究为主。(德克萨斯大学计算机科学系) 对学生而言,这个过渡的关键步骤是找到一个合适的项目并参与进去

1.主动接触导师与课题组。

  • 提前阅读老师的主页和最近两三篇论文,看看有哪些与你感兴趣且与本书主题相关的方向;
  • 写邮件或在课程结束后当面沟通,表达你希望在具身智能/VLA 方向做项目的意愿,并说明你当前掌握的技能与可投入时间。 2.接受“从执行者做起”的角色定位。 刚进入课题组时,你很可能先从以下任务开始:
  • 跑已有实验,复现组内或外部论文结果;
  • 清洗数据、整理日志、搭建仿真环境;
  • 为已有系统加小功能(增加一个新基线、新评测脚本)。 这并不是“打杂”,而是你真正摸清系统细节、建立工程直觉的阶段,为后续提出 idea 和主导子课题打基础。 3.在项目中练习“闭环思维”。 每一个你参与的项目,尽量按下面的闭环标准要求自己:
  • 知道项目要解决的高层问题是什么;
  • 明白自己负责的部分如何影响整体结果;
  • 在完成一个阶段后,对结果做简短总结(包括失败原因分析),而不是只“交差”。

【图片占位】 图 1-2-8:从课程到项目的角色演化 从“课程作业(个人)→ 项目执行者(team member)→ 子课题负责人(lead)”的演进示意图。


0.2.4.3 主动探索

当你对于一个方向的基础课程和关键论文有了初步理解,也在课题组中完成了一些“执行型工作”之后,就进入了真正意义上的**“研究起步”阶段**:开始从“做别人给的任务”,转为“提出自己的小问题”。

可以从以下几个手段着手:

1.从现有系统中的“不顺眼之处”切题。

  • 在跑实验时,你会遇到一些反复出现的问题:训练不稳定、部署延迟高、现实成功率低等;
  • 试着把这些现象记录下来,按照前文问题抽象的方法,提炼出一两个你觉得值得深入的点。 这种“从本组系统出发”的选题,往往更有资源基础,也更容易在有限时间内产出结果。 2.设计“最小可行副课题(Mini-Project)”。 而不是一上来就设计一个“通用具身智能框架”,可以从以下尺度开始:
  • 在某一基准任务(如抓取、开门、收纳)上,尝试一个改动(新视觉预训练、新动作表示等);
  • 在现有 VLA 模型上,添加或替换一个明确的模块(新的融合方式、新的指令编码方式)。 要求是:在 1–2 个月内,可以完成实验并得到明确结论(成或不成)。 3.与导师定期对齐方向与节奏。 许多经验材料指出,课程到科研的过渡失败,很大程度上是因为学生在研究初期缺乏结构化反馈与节奏安排。(科学杂志) 建议:
  • 与导师或带教学长/姐建立固定频率的讨论,如每 1–2 周汇报一次进展;
  • 每次准备简短文档:做了什么、遇到什么问题、接下来两周打算做什么;
  • 通过这样的循环,把“模糊兴趣”切割成一个个具体可操作的行动项。

【图片占位】 图 1-2-9:课程–项目–科研的时间轴示意图 标出入学 1–2 年内课程与项目的比例随时间变化,展示从“课为主”到“研为主”的过渡。


本节从“读懂论文”到“复现系统”,再到“提出新 idea”与“从课程走向科研项目”,勾勒了研究生阶段在具身智能/VLA 方向需要具备的核心能力画像。后续各章将围绕这些能力展开:先补足数学、机器学习和深度学习的基础,再逐步进入视觉、语言、RL/IL、机器人学与 VLA 架构本身,使读者有机会真正从“零基础读者”成长为能够设计和实现自己具身智能系统的研究者。

本章小结与自测

三行小结

  1. 本章定位了具身智能与 VLA 的学习全景与能力目标。
  2. 重点不在记忆术语,而在建立“理论-代码-实验”的闭环。
  3. 完成本章后应能为后续学习制定可执行计划。

检查题

  1. 用你自己的话总结本章最核心的一个公式/机制。
  2. 给出一个“如果要落地到项目里,你会怎么用”的具体例子。

常见误区

  1. 只读不做,停留在概念层。
  2. 目标过大,没有阶段里程碑。
  3. 不记录过程,无法复盘。

公式到代码(最小示例)

# 学习计划最小示例
weekly_hours = 8
focus = ["math", "dl", "robotics"]
plan = {k: weekly_hours // len(focus) for k in focus}
print(plan)

本章外部参考(集中)

  1. ACM Digital Library
  2. 机器学习研究期刊
  3. arXiv
  4. Medium
  5. richardmathewsii.substack.com
  6. 科学杂志
  7. 德克萨斯大学计算机科学系
  8. 科学杂志

0.3 学习路径规划与时间安排

0.3.1 基础知识阶段(数学 / ML / 机器人)

学习导航

  • 本章主题:0.3.1 基础知识阶段(数学 / ML / 机器人)
  • 前置知识:基础 Python 与高中数学即可。
  • 建议用时:68-88 分钟
  • 阅读顺序:先看概念框架,再看公式/代码,最后做自测。

这一阶段的目标只有一句话:把“看不懂论文公式、写不出代码、画不清机器人坐标系”的尴尬全部解决掉。 后面所有 CV / RL / VLA 的内容,都会默认你已经具备本阶段的能力。


0.3.1.1 时间分配

如果以两年制硕士为例,可以把基础阶段粗略放在入学后前 6–9 个月。参考国际上多数机器人 / 计算机视觉硕士项目的课程安排,通常第一学年集中在数学、机器学习和机器人学基础,第二学年才是专题课和项目研究。(ri.cmu.edu)

建议按“周”为单位来规划时间,而不是“有空再看”:

+每周 25–30 小时:正式学习时间

  • 数学(线代 + 概率 + 优化):10–12 小时
  • 机器学习基础:8–10 小时
  • 机器人学导论 / 运动学:5–8 小时 +每周 5–10 小时:练习与项目
  • 课程作业、代码实现、小实验、读几页简单教材或讲义

如果你是下面几种背景,可以略作调整:

+CS/EE 背景较强、数学较好:适当压缩数学时间,增加机器学习与机器人学的动手机会(多写代码、多跑实验)。 +机械 / 控制背景较强、编程较弱:保留数学时间,把 ML 部分多做实现练习(PyTorch / NumPy),哪怕一开始是简单的线性回归、逻辑回归。 +跨专业转入(数学、物理等):前 2–3 个月集中补编程和基本 ML,然后再进入正常节奏。

[图片占位]:一张“基础阶段时间分配”饼图或堆叠条形图,区分数学 / ML / 机器人 / 项目练习所占比例。

总的原则是:不要指望“暑假突击”,而是保证每周可持续的学习节奏。后面 VLA 阶段的复杂模型训练,需要你在这一阶段养成稳定的“长期耐力”。


0.3.1.2 学习内容

本阶段的学习内容不在于“多”,而在于**“打牢关键概念 + 能做典型题 + 能写基本代码”**。本书第 1 章、2 章、6 章会分别系统展开数学、深度学习和机器人学的细节,这里只从“学习目标”的角度做整体规划。

可以把内容分成三条主线:

1.数学主线:看懂公式、会算、懂含义

  • 线性代数:向量 / 矩阵运算、特征值分解、SVD、PCA 等。你至少要能理解“为什么要做对角化 / 降维”这类问题,而不是机械套公式。
  • 概率与统计:随机变量、期望 / 方差、常见分布、贝叶斯公式、最大似然 / 最大后验的直觉。
  • 优化:梯度、梯度下降、学习率、局部极值与鞍点、基本约束优化的思想。 这些内容在本书第 1 章会有详细展开,此处的重点是:跟着一套系统教材 + 课后习题 + 配套课程,扎实做完一遍,而不是“看过 PPT”。 2.机器学习主线:从“名词认识”到“能自己写一个小模型”
  • 监督学习:回归 / 分类的基本设定、损失函数、训练 / 验证 / 测试划分。
  • 模型与泛化:过拟合、欠拟合、正则化、交叉验证、常见评价指标(准确率、精确率、召回率、AUC 等)。
  • 简单模型实践:线性回归、逻辑回归、支持向量机、决策树 / 随机森林等。 这一部分的要求是:至少用 Python + 一个主流框架(如 PyTorch)完整实现过 2–3 个典型任务,例如房价预测、简单图像分类等。(领英) 3.机器人学主线:建立“坐标系 + 运动学 + 基本控制”的直观感
  • 坐标系与齐次变换:理解机器人不同连杆 / 末端的相对位置与姿态如何通过 4×4 矩阵描述。
  • 正 / 逆运动学:已知关节角求末端位姿、给定位姿求关节角的基本问题;至少在 2–3 自由度机械臂上能手算 / 编程实现。
  • 简单控制思想:PID 控制、轨迹跟踪的基本概念,为后面 RL / IL 接入机器人打基础。 很多国际机器人硕士项目都会在第一学年结束前要求学生掌握这些内容,并通过实验课或仿真实验进行验证。(research.gatech.edu)

在学习方式上,可以采用“三明治结构”:

理论 → 习题 → 代码 → 再回到理论(带着问题回看)

例如:学完线性回归的公式推导后,立刻在 Python 中实现最小二乘拟合,再对比手推和框架自动求导的差异。


0.3.1.3 达到水平

当你完成基础阶段时,应当具备一种“读论文不再完全晕菜、知道该查哪本书”的安全感。更具体地,可以用以下几个“自测指标”判断自己是否过关:

1.数学层面

  • 能够独立推导线性回归的闭式解、逻辑回归的梯度;
  • 遇到论文中的常见符号(如 \( E[\cdot] \)、\( p(x|\theta) \)、\( \nabla_\theta \) 等)不会感到陌生;
  • 能够解释“为什么深度网络训练需要随机梯度下降、为什么学习率太大会发散”等直观问题。 2.机器学习层面
  • 能用一个你熟悉的框架(如 PyTorch)从零开始写出:数据读取 → 模型定义 → 损失函数 → 训练循环 → 指标计算 的完整脚本;
  • 能够根据数据集和任务选择合理的损失函数和评价指标,并对过拟合有基本感知;
  • 能读懂经典 ML 课程(如 CS229)作业中的大部分题目和解答思路。(studocu.vn) 3.机器人层面
  • 给定一台简单机械臂的 DH 参数,能用程序计算任意关节角下的末端位姿;
  • 能够理解实验室常见机器人软件栈的大致结构(如“上层规划 → 下层控制”),看懂常用坐标系示意图;
  • 至少在仿真环境中(如 Gazebo / MuJoCo)完成过一次简单“点到点”轨迹规划与执行。(GitHub)

如果你已经达到了上述水平,可以认为:进入 CV / NLP / RL / IL 这类“领域知识阶段”是安全的,不会在基础问题上频繁绊倒。


0.3.2 领域知识阶段(CV / NLP / RL / IL)

这一阶段相当于把“通用 AI 基础”转化为“具身智能相关的关键领域能力”,为后面 VLA 奠定四大支柱:视觉、语言、决策(RL)、模仿学习(IL)。国际上很多机器人和计算机视觉硕士项目,也会在核心课之上,提供视觉、机器学习、机器人控制、强化学习等模块化选修,形成类似结构。(ri.cmu.edu)


0.3.2.1 时间分配

建议将领域知识阶段安排在研究生中期(大致 6–18 个月),与课程选修和早期科研项目交织进行。

一个典型的时间结构可以是:

+每学期聚焦 1–2 个主领域 + 1 个辅领域

  • 例如:本学期主攻 CV + RL,辅修 NLP;下学期主攻 RL + IL,巩固 CV。 +每周时间安排(参考)
  • 正式课程(听课、作业):15–20 小时
  • 小项目 / 课程 Project:8–10 小时
  • 论文 / 教材阅读:5–8 小时

这里有一个重要的经验:不要试图一学期同时“精通”四个领域。 更现实的做法是:保持宽度,但每个时段有清晰的“主线”。

[图片占位]:一张“学期级时间轴”示意图,横轴为学期,纵向标注不同领域的重点程度(例如高亮某学期的 CV + RL),展示“轮换主攻”的策略。


0.3.2.2 理论结合实践

仅仅“上完课 + 做完作业”是不够的。对于 CV / NLP / RL / IL,每个领域至少应该做到:理论上听得懂、代码里写得出、实验里调得动

可以按领域设计“最小实践单元”:

1.CV:从图片到语义理解

  • 理论:卷积、视觉 Transformer、分类 / 检测 / 分割的基本框架。
  • 实践项目示例:
    • 在 ImageNet 子集或 CIFAR 上训练一个简单分类器;
    • 在 COCO 子集上跑通一个开源检测模型的训练与推理。(University of Surrey) 2.NLP:从 token 到语义表示
  • 理论:语言模型、子词分词、预训练 + 微调范式。
  • 实践项目示例:
    • 使用预训练 Transformer 做一个文本分类 / 问答任务;
    • 通过指令微调或简单 Prompt 设计,体验 LLM 在下游任务中的适应能力。 3.RL:从 MDP 到可运行的策略
  • 理论:MDP、价值函数、策略梯度、Actor–Critic 等。
  • 实践项目示例:
    • 在经典离散环境(如 CartPole)上实现 DQN;
    • 在简单连续控制环境(如倒立摆 / 小车)上实现 PPO 或 SAC。(GitHub) 4.IL:从示范到策略
  • 理论:行为克隆、分布偏移、DAgger、基本逆强化学习思想。
  • 实践项目示例:
    • 在仿真环境中用示范轨迹训练一个行为克隆策略;
    • 分析“策略偏离示范后崩掉”的现象,并尝试通过数据增强 / DAgger 方式改进。

这些项目的规模不必很大,但要严格“从数据到结果”走完一遍完整 pipeline:数据准备 → 模型实现 → 训练调参 → 可视化结果 → 简单总结。 这样你在后面做 VLA 时,才能对每个模块的行为心中有数,而不是把所有问题都怪在“模型太大 / 数据太少”上。


0.3.2.3 知识融会

具身智能的核心不在于“分别学会 CV / NLP / RL / IL”,而在于把这些领域联通起来,形成对“感知–语言–决策–动作”的整体理解。近年来关于 VLA 的综述工作,也强调了这一点:单独做视觉或语言已经不够,关键在于把多模态、决策和物理交互整合成统一学习系统。(arXiv)

在领域知识阶段,可以开始有意识地做一些“跨界思考”:

+视觉 + RL:思考从像素直接输入 RL 策略,与“先做感知再做决策”的差别; +语言 + RL / IL:对比“固定任务奖励”与“语言指令描述任务”的两种方式; +CV + NLP:尝试实现一个简单的图文匹配 / 图文检索模型,体会跨模态对齐的难点。

建议定期做一个“小型综合反思”:

每 1–2 个月挑一个周末,画一张“知识网络图”: 把学过的主要概念(视觉特征、语言 embedding、价值函数、策略、示范轨迹等)画成节点,用线连接它们之间的关系,并标出你尚未理解清楚的部分。

[图片占位]:一张“CV / NLP / RL / IL 知识网络”手绘示意图,展示不同概念之间的箭头关系,用于帮助读者建立整体心智模型。

当你能流畅回答诸如“为什么现代机器人策略越来越像大型多模态模型,而不仅仅是传统规划器?”这类问题时,就说明你已经从“分科学生”开始转向“具身智能研究者”的思维方式。


0.3.3 VLA 专题与项目实践阶段

完成前两个阶段后,你已经具备了“通用 AI + 关键子领域”的基础。接下来,重点从“学习课程”转向“围绕 VLA 的系统性研究与工程实践”。

最近几年,Vision-Language-Action 模型已经成为具身智能研究的核心方向之一,相关综述将其视为“指令驱动机器人策略”的重要实现路径。(arXiv)


0.3.3.1 时间分配

时间上,这一阶段通常覆盖研究生后期(大约最后 6–12 个月),也是毕业论文 / 核心科研产出的集中期。

相比前两个阶段,这里需要更加明确“研究型时间”的结构,而不是纯课程节奏。可以参考如下每周分配:

+论文与调研:6–8 小时

  • 聚焦 VLA、具身基础模型、相关数据集与 benchmark; +代码与系统实现:15–20 小时
  • 搭建 / 修改模型、编写训练与评估脚本; +实验与数据处理:10–12 小时
  • 数据清洗、训练/推理、日志分析、可视化; +思考与写作:4–6 小时
  • 记录实验日志、撰写备忘录、构思论文结构。

这意味着:课程不再是主角,而是为你的研究提供稳定背景;真正拉开差距的是“你在项目和论文上花了多少高质量时间”。


0.3.3.2 项目实践

在 VLA 阶段,建议至少完成一个“从零搭到能跑”的中等规模项目。为了避免一开始就目标过大、难以落地,可以采用“由浅入深的阶梯式设计”。

可以参考以下三种层级:

1.Level 1:复现 + 小改动

  • 目标:选取一篇 VLA 论文或开源项目(例如基于 CLIP + 行为克隆的策略),在开源数据集上完整复现实验流程,并做少量改动。
  • 工作内容:
    • 理解并搭建模型结构(视觉编码器 + 语言编码器 + 动作解码器);
    • 跑通训练脚本、得到与原文接近的结果;
    • 尝试修改某一个模块(如换 backbone、换动作离散化方式),观察性能变化。(学OpenCV) 2.Level 2:自建数据 + 仿真实验
  • 目标:在 MuJoCo / Isaac Gym / RLBench 等仿真环境中,采集自己的多模态示教数据(图像 + 语言指令 + 动作),训练一个简单的 VLA 策略。(GitHub)
  • 工作内容:
    • 搭建简单场景(如“按颜色分类搬运方块”);
    • 通过遥操作 / 脚本生成示范轨迹,并设计相应语言指令模板;
    • 训练 VLA 模型,在环境中执行并评估成功率。 3.Level 3:从仿真走向真实机器人(如实验室机械臂)
  • 目标:将 Level 2 中在仿真训练的策略,迁移到真实平台上,哪怕只完成一个简化任务(例如“桌面抓取 + 放置”)。
  • 工作内容:
    • 适配传感器与控制接口(如 ROS);
    • 处理 sim-to-real 差距:图像差异、延迟、噪声等;
    • 引入安全约束,确保真实实验中不会对人和设备造成损害。

[图片占位]:一张“VLA 项目阶梯”示意图,展示从“论文复现”到“仿真实验”再到“真实机器人部署”的三层台阶。

在选择项目时,可以结合导师课题和公开数据资源,避免完全闭门造车。近年来一些 VLA 综述与开源列表,会系统整理相关数据集、任务和模型,对你设计项目非常有参考价值。(GitHub)


0.3.3.3 迭代提高

VLA 项目难点往往不在“能不能跑起来”,而在于如何在一个基线之上持续提升性能,并提炼出有研究价值的结论。这需要你有意识地进行“科学化迭代”,而不是凭感觉改代码。

可以参考如下迭代循环:

1.建立基线

  • 复现已有方法,得到稳定的基线性能;
  • 确保实验可重复(固定随机种子、记录配置和数据版本)。 2.提出假设
  • 例如:“增加历史动作上下文会提高策略稳定性”、“更强的语言编码器能够提升多任务泛化”等;
  • 假设应具体到可实验验证的设计。 3.设计对照实验
  • 只改变一个关键因素,保持其他条件不变;
  • 使用统一指标(成功率、路径长度等)进行比较,必要时统计多次试验均值和方差。 4.分析与归纳
  • 不仅看“是否提升”,还要分析“在哪些任务、哪些场景下提升显著”;
  • 将失败实验也记录下来,反思假设为何不成立。 5.整理为论文 / 报告
  • 在本书第 11 章将详细讨论如何设计实验和撰写论文;
  • 在这里,你只需记住:项目必须沉淀为“可交流的知识”,而不仅是“一个 Git 仓库”。

多篇 VLA 工作的经验表明,真正有影响力的贡献往往来自于:扎实的工程实现 + 清晰的实验设计 + 对失败现象的深入分析,而不是堆砌复杂模型结构。(Proceedings of Machine Learning Research)


0.3.4 如何在课程、项目与论文之间平衡时间

具身智能 / VLA 方向的学习,很容易陷入两种极端: 要么“疯狂修课但不做项目”,要么“沉迷写代码、不顾课程基础”。本节的目标,是帮助你形成一个**“长期可持续”的时间平衡策略**。


0.3.4.1 课程 vs 科研

可以把课程与科研的关系理解为:

+课程 = 安全下限(floor):保证你在数学、ML、机器人等方面不会出现致命短板; +科研 / 项目 = 上限(ceiling):决定你能走多远,是否具备独立研究能力。

从多所机器人 / 计算机视觉硕士项目的培养方案看,典型做法是:前期偏重课程,后期偏重项目和论文,一般会要求核心课程 + Capstone / Thesis 结合。(ri.cmu.edu)

对个人而言,可以遵循以下原则:

1.课程不过度“内卷” 保证核心课程成绩过关、概念掌握扎实即可,不必在每次作业上投入 200% 精力追求满分。把多出来的精力投入到项目和论文上,长期收益更大。 2.尽早参与科研 / 项目 不必等所有课上完才开始做研究。实际更有效的方式是: 在基础课程刚刚达到“能听懂 70%”时,就开始参与一个小项目,一边补课一边实践。 3.用课程作业为科研“打前站” 尽量把课程 Project 设计成与你未来科研方向相关的小问题,例如:

  • CV 课程的项目做一个小型视觉编码实验,为后续视觉模块打基础;
  • RL 课程的项目尝试一个简化版本的机器人任务。

0.3.4.2 项目管理

具身智能项目往往战线长、依赖多(硬件、仿真、数据、模型都要照顾),如果没有明确的管理方式,很容易陷入“忙了很久却没有实质结果”的困境。

建议采用轻量级的项目管理策略

1.明确里程碑(Milestone)

  • 按 4–6 周为周期,划分几个关键里程碑: 例如“跑通仿真环境”、“完成数据采集脚本”、“完成第一版模型训练”、“完成 ablation 实验”等。
  • 每个里程碑需要有可验证的“完成标准”,而不是泛泛的“差不多可以”。 2.任务拆分与优先级
  • 把每个里程碑拆分为若干可在 1–2 天内完成的小任务;
  • 按照“对整体进度影响最大”排序优先级,先解决阻塞问题,如环境搭建 / 数据格式统一。 3.时间块管理
  • 尽量为深度工作预留连续 2–3 小时的大块时间,用于写代码、调试或阅读难论文;
  • 把碎片时间用于检查实验结果、整理笔记、写 TODO 列表,而不是开启新工作。 4.风险预估与范围控制
  • 对每个里程碑预估最坏情况,如果在某个时间点仍未完成,需要果断缩小范围: 例如减少任务种类、简化模型规模,以确保在可控时间内有完整结果,而不是“追求完美但什么都没交付”。

[图片占位]:一张简单的甘特图示例,展示“课程、项目、论文写作”在时间轴上的并行与交叉分布。


0.3.4.3 论文阅读与写作

在具身智能 / VLA 方向,要想从“熟练工程师”走向“独立研究者”,必须建立持续阅读论文 + 持续写作整理的习惯。这不是临近毕业才开始的任务,而应该贯穿整个学习路径。

可以考虑以下实践方式:

1.固定“最低阅读配额”

  • 即便课程和项目再忙,也尽量保证: 每周至少读 1–2 篇与你课题直接相关的论文,并且写下半页到一页的阅读笔记。
  • 对于难度较高的综述或长文,可以分多次读完。 2.分层次阅读
  • 第一遍:只看题目、摘要、引言和结论,弄清楚“作者在解决什么问题,用什么方法,大概效果如何”;
  • 第二遍:细读方法部分,尝试复现关键公式或算法;
  • 第三遍:分析实验设计、结果与 ablation,思考你能否提出改进或新的问题。 3.在项目早期就开始写作
  • 不要等实验全部完成再写论文。更推荐做法是:
    • 项目开始时就打开一个文档,按“问题背景 – 相关工作 – 方法设想 – 预期实验”的结构先写一个粗略框架;
    • 随着实验推进逐步往里填内容;
    • 失败实验也要记录,为后续讨论和负面结果提供素材。 4.建立个人知识库
  • 使用笔记软件(如 Obsidian、Notion)或简单 Markdown 文件,建立“文献卡片”——每篇论文用一页记录关键点、启发和疑问;
  • 对 VLA / 具身智能这类快速发展的领域,个人知识库能帮助你在海量论文中保持清晰结构,而不是每次都从零开始搜索。近期关于 VLA 的综述也指出,系统性整理文献对于掌握这个高速演化的领域尤为重要。(arXiv)

本节从时间与阶段的角度,构建了从基础知识到领域能力,再到 VLA 专题研究的整体路径。下一章开始,我们将正式进入数学与机器学习基础的具体内容,让“第一个阶段”从规划走向落实。

本章小结与自测

三行小结

  1. 本章定位了具身智能与 VLA 的学习全景与能力目标。
  2. 重点不在记忆术语,而在建立“理论-代码-实验”的闭环。
  3. 完成本章后应能为后续学习制定可执行计划。

检查题

  1. 用你自己的话总结本章最核心的一个公式/机制。
  2. 给出一个“如果要落地到项目里,你会怎么用”的具体例子。

常见误区

  1. 只读不做,停留在概念层。
  2. 目标过大,没有阶段里程碑。
  3. 不记录过程,无法复盘。

公式到代码(最小示例)

# 学习计划最小示例
weekly_hours = 8
focus = ["math", "dl", "robotics"]
plan = {k: weekly_hours // len(focus) for k in focus}
print(plan)

本章外部参考(集中)

  1. ri.cmu.edu
  2. 领英
  3. research.gatech.edu
  4. studocu.vn
  5. GitHub
  6. University of Surrey
  7. arXiv
  8. 学OpenCV
  9. GitHub
  10. Proceedings of Machine Learning Research

1.1 线性代数基础

机器人具身智能本质上是在高维向量空间中做决策:相机图像被编码成向量,语言指令被编码成向量,机器人状态也是向量,而控制策略、神经网络权重本质上都是矩阵运算。本节的目标,是让读者掌握这些“向量–矩阵世界”的基本语法,并能把它们自然联想到后面关于深度学习、强化学习和机器人控制的内容。


1.1.1 向量与矩阵运算(内积、范数、矩阵分块)

学习导航

  • 本章主题:1.1.1 向量与矩阵运算(内积、范数、矩阵分块)
  • 前置知识:高中/本科数学基础(线代、概率、微积分)。
  • 建议用时:101-121 分钟
  • 阅读顺序:先看概念框架,再看公式/代码,最后做自测。

关键图示:线性代数核心路径

关键图示:线性代数核心路径

1.1.1.1 内积(点积)的定义与几何意义(投影、正交)

在实数空间 \(\mathbb{R}^n\) 中,两个列向量

\[ \mathbf{x} = \begin{bmatrix} x_1\\ \vdots\\ x_n \end{bmatrix},\quad \mathbf{y} = \begin{bmatrix} y_1\\ \vdots\\ y_n \end{bmatrix} \]

的**内积(点积)**定义为:

\[ \mathbf{x}^\top \mathbf{y} = \sum_{i=1}^n x_i y_i. \]

这是一个非常简单的代数运算,但它有关键的几何意义:

  • 记 \(|\mathbf{x}|\) 和 \(|\mathbf{y}|\) 为向量的长度(\(L_2\) 范数,见下一小节),\(\theta\) 为两向量的夹角,则有

    \[ \mathbf{x}^\top \mathbf{y} = |\mathbf{x}||\mathbf{y}| \cos\theta. \]

    也就是说,内积同时编码了长度方向相似度

    • 若 \(\mathbf{x}^\top \mathbf{y} > 0\):夹角小于 \(90^\circ\),大致“同向”;
    • 若 \(\mathbf{x}^\top \mathbf{y} < 0\):夹角大于 \(90^\circ\),大致“反向”;
    • 若 \(\mathbf{x}^\top \mathbf{y} = 0\):夹角为 \(90^\circ\),称为正交(orthogonal)。 +投影:向量 \(\mathbf{y}\) 在方向 \(\mathbf{x}\) 上的投影为

    \[ \operatorname{proj}_{\mathbf{x}}(\mathbf{y}) = \frac{\mathbf{x}^\top \mathbf{y}}{|\mathbf{x}|^2}\mathbf{x}. \]

    系数 \(\dfrac{\mathbf{x}^\top \mathbf{y}}{|\mathbf{x}|^2}\) 表示 \(\mathbf{y}\) 在 \(\mathbf{x}\) 方向上“有多少”。

【图 1-1 占位:二维平面中两个向量 \(\mathbf{x}\)、\(\mathbf{y}\),示意 \(\mathbf{y}\) 在 \(\mathbf{x}\) 方向上的投影,并标出夹角 \(\theta\)。】

在机器人具身智能中,内积有许多直接应用:

  • 视觉–语言模型中,图像与文本被编码为向量,常用它们的**归一化内积(余弦相似度)**衡量句子是否描述了这张图。
  • 机器人控制中,速度向量在某个轴上的分量,就是速度向量与该轴的单位向量的内积;比如沿机械臂某个关节轴的线速度,正是速度在该方向上的投影。

1.1.1.2 向量范数的定义、常见类型及物理含义

直观上,**范数(norm)**就是向量“有多大”的度量。形式上,范数是从向量空间到非负实数的函数 \(|\cdot|\),并满足三个性质:非负性、齐次性和三角不等式。(维基百科)

常见的向量范数包括:

+L2 范数(欧几里得范数)

\[ |\mathbf{x}|_2 = \sqrt{\sum_{i=1}^n x_i^2}. \]

这是我们最熟悉的“直线距离”,在几何上就是从原点到点 \(\mathbf{x}\) 的直线长度(ApX Machine Learning)。 物理上可以理解为位移长度速度大小力的大小等。 +L1 范数(曼哈顿范数)

\[ |\mathbf{x}|_1 = \sum_{i=1}^n |x_i|. \]

可以理解为沿坐标轴走到该点时所需要走的“总路程”,类似在棋盘或城市街区中只能沿南北东西方向走路的距离。 +\(L_\infty\) 范数(最大范数)

\[ |\mathbf{x}|_\infty = \max_i |x_i|. \]

表示所有坐标分量中绝对值最大的那一个,常用来度量最坏方向上的误差

在机器学习和机器人领域:

  • L2 范数常用于定义损失函数中的距离,如均方误差(MSE),或在正则项中约束参数大小;
  • L1 范数常用于稀疏性正则(Lasso),鼓励模型把某些参数压到 0;
  • 在移动机器人导航中,如果机器人只能在网格上上下左右移动,路径长度往往更接近 L1 范数而非 L2 范数。

1.1.1.3 矩阵的基本运算与分块方法

矩阵可以看作是数字的二维数组,也可以看作从一个向量空间到另一个向量空间的线性变换的表示。

  • 若 \(A\in\mathbb{R}^{m\times n}\),\(B\in\mathbb{R}^{m\times n}\),则 +矩阵加法:\((A+B)_{ij} = A_{ij}+B_{ij}\); +标量乘法:\((\alpha A)_{ij} = \alpha A_{ij}\)。

  • 若 \(A\in\mathbb{R}^{m\times n}\),\(B\in\mathbb{R}^{n\times p}\),则矩阵乘法\(C=AB\in\mathbb{R}^{m\times p}\) 定义为

    \[ C_{ij} = \sum_{k=1}^n A_{ik} B_{kj}. \]

    这对应于先做变换 \(B\),再做变换 \(A\):对向量 \(\mathbf{x}\),有 \(AB\mathbf{x} = A(B\mathbf{x})\)。

在机器人中,一个矩阵可以表示坐标变换刚体运动线性化后的雅可比矩阵等,多个矩阵相乘就是连续施加多个变换。

矩阵分块(block matrix)是处理大矩阵的常用技巧。 例如,将一个 \(m\times n\) 矩阵按行列分成四块:

\[ A= \begin{bmatrix} A_{11} & A_{12}\\ A_{21} & A_{22} \end{bmatrix}, \]

其中 \(A_{11}\) 是上左角的小矩阵,\((A_{12}, A_{21}, A_{22})\) 类似。对分块矩阵的相加、相乘遵循“块”层面的同样规则(尺寸匹配时)。

【图 1-2 占位:示意一个大矩阵被分成 2×2 的四个子矩阵块,每块用不同颜色标记。】

在实际工程中,分块可以自然地把系统拆成“状态–控制”“位置–速度”等部分,有助于推导和实现复杂控制算法。


1.1.2 线性变换与基变换、子空间概念

1.1.2.1 线性变换的定义及矩阵表示

设 \(T:\mathbb{R}^n\to\mathbb{R}^m\),如果对任意向量 \(\mathbf{x},\mathbf{y}\) 和任意标量 \(\alpha\) 都有

\[ T(\mathbf{x} + \mathbf{y}) = T(\mathbf{x}) + T(\mathbf{y}),\quad T(\alpha \mathbf{x}) = \alpha T(\mathbf{x}), \]

则称 \(\displaystyle T\) 为一个线性变换

在给定的一组基(如标准基)下,每个线性变换都可以用一个矩阵 \(A\in \mathbb{R}^{m\times n}\) 来表示,使得

\[ T(\mathbf{x}) = A\mathbf{x}. \]

常见的几类线性变换及其矩阵表示:

+缩放(沿坐标轴伸缩)

\[ A = \begin{bmatrix} s_x & 0\\ 0 & s_y \end{bmatrix} \Rightarrow \begin{bmatrix} x'\\ y' \end{bmatrix} =\begin{bmatrix} s_x x\\ s_y y \end{bmatrix}. \]

+二维旋转(绕原点旋转角度 \(\theta\))

\[ R(\theta) = \begin{bmatrix} \cos\theta & -\sin\theta\\ \sin\theta & \cos\theta \end{bmatrix}. \]

【图 1-3 占位:二维平面上展示一个向量经过旋转矩阵作用前后的关系,标注旋转角度 \(\theta\)。】

在机器人学中,我们会大量使用“旋转矩阵 + 平移向量”来描述姿态与坐标变换,都是线性代数在三维空间的具体体现(详见第 6 章)。

1.1.2.2 基变换(坐标系转换)

**基(basis)**是一组线性无关的向量,它们的线性组合可以表示空间中的任意向量。 在 \(\mathbb{R}^2\) 中,标准基是

\[ \mathbf{e}_1= \begin{bmatrix} 1\\ 0 \end{bmatrix},\quad \mathbf{e}_2= \begin{bmatrix} 0\\ 1 \end{bmatrix}. \]

但我们也可以选用别的基,例如 \(\mathbf{b}_1 = [1,1]^\top,\ \mathbf{b}_2=[-1,1]^\top\),它们同样线性无关,也能生成整个平面。

同一个几何向量,在不同基下的坐标不同。 如果 \(\{\mathbf{e}_i\}\) 与 \(\{\mathbf{b}_i\}\) 是两组基,令

\[ P = [\mathbf{b}_1\ \mathbf{b}_2\ \cdots\ \mathbf{b}_n] \]

即把新基向量按列排成矩阵,则对任意向量 \(\mathbf{v}\),它在标准基下的坐标 \([\mathbf{v}]_{\text{std}}\) 与在新基下的坐标 \([\mathbf{v}]_{\text{new}}\) 关系是:

\[ [\mathbf{v}]_{\text{std}} = P[\mathbf{v}]_{\text{new}},\quad [\mathbf{v}]_{\text{new}} = P^{-1}[\mathbf{v}]_{\text{std}}. \]

【图 1-4 占位:二维平面中,原来的 x–y 坐标系与旋转后的新坐标系 \(\mathbf{b}_1,\mathbf{b}_2\),同一个点在两套坐标系中的表示。】

在机器人中:

  • 不同关节、末端执行器、摄像头都有自己的坐标系;
  • “手眼标定”就是精确计算这些坐标系之间的变换(后面第 6 章、3 章会反复出现);
  • 基变换的本质,就是把向量在不同“观察视角”下重新表达。

1.1.2.3 向量子空间与维度

一个非空子集 \(U\subseteq \mathbb{R}^n\),若对任意 \(\mathbf{x},\mathbf{y}\in U\) 和任意标量 \(\alpha,\beta\),有

\[ \alpha \mathbf{x} + \beta \mathbf{y} \in U, \]

则称 \(\displaystyle U\) 为一个向量子空间

简单例子:

  • 通过原点的一条直线(如所有 \(\displaystyle (t,2t)\) 的集合)是 \(\mathbb{R}^2\) 的一维子空间;
  • 通过原点的一张平面是 \(\mathbb{R}^3\) 的二维子空间。

维度(dimension)是指一组基中向量的个数,也就是子空间中“互相独立方向”的数目。维度可以理解为这个子空间所需的自由度个数。

与矩阵相关的典型子空间包括:

+列空间(column space):所有列向量的线性组合,表示线性变换输出可能落在的子空间; +零空间 / 核(null space):所有满足 \(A\mathbf{x}=0\) 的向量集合,表示“被变换压缩成 0 的方向”。

线性代数中的一个重要结果(秩–零化度定理)表明: 对 \(A:\mathbb{R}^n\to\mathbb{R}^m\),有

\[ \dim(\text{Im}(A)) + \dim(\text{Ker}(A)) = n. \]

即“输出空间维度 + 被压扁成 0 的方向数 = 原空间维度”。这在理解“冗余自由度”“约束”等概念时非常有用。


1.1.3 特征值、特征向量与对角化

1.1.3.1 特征值与特征向量的定义和求解

给定一个 \(n\times n\) 矩阵 \(\displaystyle A\),非零向量 \(\mathbf{v}\in\mathbb{R}^n\) 若满足

\[ A\mathbf{v} = \lambda \mathbf{v} \]

其中标量 \(\lambda\) 为实数(或复数),则称 \(\mathbf{v}\) 是 \(\displaystyle A\) 的一个特征向量(eigenvector),\(\lambda\) 是对应的特征值(eigenvalue)

几何含义:在变换 \(\displaystyle A\) 下,大多数向量的方向都会改变,但特征向量的方向保持不变,仅被拉伸或压缩了一个倍数 \(\lambda\)。这使得特征向量成为“最容易理解的方向”。

求解方法(简要):

  1. 将方程改写为 \((A - \lambda I)\mathbf{v} = 0\)。
  2. 要有非零解,需要 \(\det(A - \lambda I) = 0\)。 这得到关于 \(\lambda\) 的多项式,称为特征多项式
  3. 解出所有特征值 \(\lambda_i\),再对每个 \(\lambda_i\) 解线性方程组 \((A-\lambda_i I)\mathbf{v}=0\),得到对应的特征向量。

特征值分解(eigendecomposition)正是围绕这些特征值、特征向量对矩阵进行因式分解,是后续对角化和 SVD、PCA 的基础。(维基百科)

在动态系统中,\(|\lambda|>1\) 的特征值通常对应不稳定方向,\(|\lambda|<1\) 对应收缩方向,这在分析机器人控制系统的稳定性时非常重要。

1.1.3.2 矩阵对角化

若一个 \(n\times n\) 矩阵 \(\displaystyle A\) 有 \(\displaystyle n\) 个线性无关的特征向量 \(\mathbf{v}_1,\dots,\mathbf{v}_n\),将它们按列组成矩阵

\[ P = [\mathbf{v}_1,\mathbf{v}_2,\cdots,\mathbf{v}_n], \]

再将对应特征值排成对角矩阵

\[ \Lambda = \operatorname{diag}(\lambda_1,\dots,\lambda_n), \]

则有

\[ A = P\Lambda P^{-1}. \]

这称为矩阵的对角化,也称为特征分解的一种形式。(维基百科)

  • 若 \(\displaystyle A\) 是实对称矩阵(\(A=A^\top\)),则由谱定理可知:
    • 所有特征值均为实数;
    • 可选择一组正交特征向量,此时 \(\displaystyle P\) 是正交矩阵(\(P^{-1}=P^\top\)), 对角化形式为 \(A = P\Lambda P^\top\)。(维基百科)

【图 1-5 占位:示意矩阵 \(\displaystyle A\) 通过对角化表示为“先在特征向量基下坐标变换 \(P^{-1}\) ,再沿坐标轴缩放 \(\Lambda\),再变回原基 \(\displaystyle P\)”的几何图。】

不是所有矩阵都能对角化;如果特征向量数量不够(例如出现“缺陷矩阵”),就不能写成上述形式。

1.1.3.3 对角化在计算中的作用

对角化最大的好处,是把复杂的矩阵运算变成了逐元素的标量运算。例如:

  • 计算矩阵高次幂 若 \(A=P\Lambda P^{-1}\),则

    \[ A^k = P\Lambda^k P^{-1}, \]

    而 \(\Lambda^k\) 仅需把对角线元素 \(\lambda_i\) 各自做 \(\displaystyle k\) 次方即可。

  • 计算函数 \(f(A)\)(如指数矩阵 \(e^A\)、多项式 \(A^2 + A + I\) 等)也可以通过

    \[ f(A) = P f(\Lambda) P^{-1} \]

    实现,其中 \(f(\Lambda)\) 对角线上为 \(f(\lambda_i)\)。

在机器学习和机器人中,对角化及其推广(如谱分解、SVD)经常用于:

  • 分析协方差矩阵,得到主成分(即 PCA);
  • 对系统的线性近似进行模态分解,识别系统的主振动模式或主变化方向;
  • 简化数值计算,提高算法稳定性。

1.1.4 奇异值分解(SVD)与主成分分析(PCA)

1.1.4.1 奇异值分解的形式及各部分含义

对任意实矩阵 \(A\in \mathbb{R}^{m\times n}\),总可以写成

\[ A = U\Sigma V^\top, \]

其中:

  • \(U\in\mathbb{R}^{m\times m}\):列向量为左奇异向量,构成一个正交基(\(U^\top U = I_m\));
  • \(V\in\mathbb{R}^{n\times n}\):列向量为右奇异向量,也构成正交基(\(V^\top V = I_n\));
  • \(\Sigma\in\mathbb{R}^{m\times n}\):对角矩阵(主对角线非负,其他为 0),对角线元素 \(\sigma_1\ge \sigma_2\ge \dots\ge 0\) 称为奇异值(singular values)。(维基百科)

几何上,SVD 可以理解为:

  1. \(V^\top\):在输入空间中做一次旋转(或反射),把坐标轴对齐到“最重要方向”上;
  2. \(\Sigma\):沿这些坐标轴进行不同程度的缩放(奇异值大小);
  3. \(\displaystyle U\):在输出空间中再做一次旋转(或反射)。

【图 1-6 占位:二维椭圆通过 SVD 分解为“旋转–拉伸–再旋转”的示意,标出左右奇异向量及奇异值。】

重要性质:\(A^\top A\) 与 \(AA^\top\) 的特征分解与 SVD 紧密相关,\(\sigma_i^2\) 是 \(A^\top A\) 的特征值,这一性质直接连接到 PCA。

1.1.4.2 主成分分析利用 SVD 降维

**主成分分析(PCA)**是经典的线性降维方法。给定数据矩阵 \(X \in \mathbb{R}^{N\times d}\)(N 条样本,每条 d 维特征),经过中心化(每列减去均值)后,其协方差矩阵为

\[ C = \frac{1}{N} X^\top X. \]

PCA 的目标是寻找一组正交方向,使得数据在这些方向上的方差最大。可以证明,这些方向正是协方差矩阵 \(\displaystyle C\) 的特征向量,而对应特征值大小反映在该方向上的方差大小。(维基百科)

另一方面,对中心化后的 \(\displaystyle X\) 做 SVD:

\[ X = U\Sigma V^\top, \]

则:

  • \(\displaystyle V\) 的列向量就是 PCA 的主成分方向
  • \(\Sigma\) 的对角线元素与各主成分上的方差成正比。

因此,PCA 实际上可以通过 SVD 来高效实现:取前 \(\displaystyle k\) 个最大的奇异值及对应的右奇异向量,就能将数据从 \(\displaystyle d\) 维降到 \(\displaystyle k\) 维,且在均方误差意义下是最优的低秩近似(Eckart–Young 定理)。(arXiv)

1.1.4.3 SVD/PCA 在图像和数据降维中的应用示例

1.图像压缩 将一张灰度图像表示成矩阵 \(\displaystyle A\)(行列为像素坐标,元素为灰度值),做 SVD:

\[ A \approx U_k \Sigma_k V_k^\top \]

只保留前 \(\displaystyle k\) 个奇异值和对应列向量,就得到一个秩为 \(\displaystyle k\) 的近似。这时:

【图 1-7 占位:左图原始图像,中间为 rank-5 近似,右图为 rank-20 近似,对比可视化 SVD 压缩效果。】

  • 存储量从原来的 \(mn\) 降到大约 \(k(m+n)\);
  • 若选择合适的 \(\displaystyle k\),肉眼几乎感觉不到图像质量下降。

2.数据去噪与可视化 在高维数据中,噪声通常分布在方差较小的方向上。PCA 只保留方差较大的前几个主成分,可以自动抑制噪声,同时把数据降到 2D/3D 以利于可视化。 3.机器人与具身智能中的应用

  • 将高维视觉特征、关节状态组合成的状态向量压缩到低维“任务子空间”,从而提高强化学习、控制算法的效率;
  • 在多机器人的大规模示教数据中,用 PCA/SVD 发现最主要的运动模式。

1.1.5 在线性代数视角下理解深度学习(表示空间、低秩近似)

1.1.5.1 向量表示空间

深度学习中,“向量表示(embedding)”几乎无处不在:

  • 自然语言中的词、句子通过嵌入层映射到 \(\mathbb{R}^d\);
  • 图像经过卷积网络或视觉 Transformer 编码后变成特征向量;
  • 机器人状态(关节角、速度、力、接触信息等)也常被进一步映射到一个“潜在空间”。

在这些表示空间中:

  • 内积/余弦相似度衡量两个对象在语义上的接近程度;
  • 线性组合 \(\alpha \mathbf{v}_1 + \beta \mathbf{v}_2\) 可以看作是“在语义上介于两者之间”的某种插值;
  • 子空间可以表示某类特定属性(例如“抓取相关特征子空间”“语言指令中的空间关系子空间”)。

从线性代数角度看,大模型的许多“奇妙能力”,例如插值生成、线性属性操作(如词向量中的“king - man + woman ≈ queen”现象),都依赖于向量空间结构良好的几何性质。

1.1.5.2 低秩近似

**秩(rank)**反映了矩阵中“真正独立的方向”的个数。许多深度模型的权重矩阵在训练后实际上是“接近低秩”的:虽然形状可能是 \(d\times d\),但有效信息主要集中在少数几个方向上。

对权重矩阵 \(W \in \mathbb{R}^{m\times n}\) 做 SVD:

\[ W = U\Sigma V^\top, \]

只保留前 \(\displaystyle k\) 个奇异值和向量,得到 \(W_k\):

\[ W_k = U_k\Sigma_k V_k^\top, \]

它是 \(\displaystyle W\) 在 Frobenius 范数意义下的最优秩 \(\displaystyle k\) 近似。(arXiv)

工程上常用的做法是直接把矩阵分解为两个较小的矩阵:

\[ W \approx AB^\top,\quad A\in\mathbb{R}^{m\times k},\ B\in\mathbb{R}^{n\times k}, \]

这样原本 \(mn\) 个参数变成 \(k(m+n)\) 个,当 \(k\ll \min(m,n)\) 时会大幅降低参数量和计算量。这类思想在:

  • 模型压缩与加速(如卷积核低秩近似、Transformer 的低秩注意力);
  • 参数高效微调(如 LoRA、Adapter 等将在第 2 章详细介绍)

中被广泛使用。

【图 1-8 占位:示意一个大的权重矩阵被分解为两个瘦长矩阵相乘,说明参数数量减少。】

1.1.5.3 利用特征向量理解神经网络权重矩阵的模式

线性代数还可以帮助我们理解深度网络“学到了什么”。

  • 对一个层的权重矩阵 \(\displaystyle W\) 做 SVD,右奇异向量(或特征向量)对应输入空间的“主要变化方向”,左奇异向量对应输出空间的“主要响应模式”;奇异值大小则表明该方向的重要性。(维基百科)
  • 在卷积层中,将卷积核视作矩阵后做 SVD,可以发现网络偏好检测的纹理、边缘、方向等模式。
  • 在机器人控制中,对线性化后的动力学模型矩阵(如雅可比矩阵、惯量矩阵)进行特征分解,可以识别出“容易运动的方向”和“难以运动的方向”,有利于设计更高效的控制策略。

这些分析方法为后续章节中的“可解释性”“模型诊断”“控制稳定性分析”提供了理论工具。


本节从向量与矩阵的基本运算出发,逐步引入了线性变换、子空间、特征值与特征向量、SVD 与 PCA,并点到为止地联系了深度学习和机器人具身智能中的典型应用。在后续章节中,我们会在模型结构、优化算法、视觉–语言–动作表示等具体场景中反复使用这些概念;熟练掌握本节内容,就掌握了进入 VLA 与机器人学习世界所需的“线性代数通行证”。

本章小结与自测

三行小结

  1. 本章提供后续全部模型章节的数学地基。
  2. 重点是把符号、公式和几何/概率直觉对应起来。
  3. 学完后应能独立检查推导与实现中的维度和假设。

检查题

  1. 用你自己的话总结本章最核心的一个公式/机制。
  2. 给出一个“如果要落地到项目里,你会怎么用”的具体例子。

常见误区

  1. 只背公式,不检查适用条件。
  2. 忽略维度一致性。
  3. 把符号记忆当成理解。

公式到代码(最小示例)

import numpy as np

x = np.array([1.0, 2.0, -1.0])
y = np.array([0.5, -1.0, 3.0])
inner = float(x @ y)
norm_x = float(np.linalg.norm(x, ord=2))
print(inner, norm_x)

本章外部参考(集中)

  1. norm
  2. 维基百科
  3. ApX Machine Learning
  4. 维基百科
  5. 维基百科
  6. arXiv

1.2 概率与统计基础

1.2.1 随机变量、分布、期望与方差

学习导航

  • 本章主题:1.2.1 随机变量、分布、期望与方差
  • 前置知识:高中/本科数学基础(线代、概率、微积分)。
  • 建议用时:120-140 分钟
  • 阅读顺序:先看概念框架,再看公式/代码,最后做自测。

关键图示:概率到推断

关键图示:概率到推断

在具身智能里,机器人看到的是一串“带噪声”的观测:距离可能测得偏大一点、偏小一点;每次抓取也不一定都成功。要想在不确定世界里做决策,首先要会用“随机变量”和“分布”来刻画这种不确定性。


1.2.1.1 随机变量的概念

随机试验与样本空间

  • 随机试验:结果在单次发生前不确定,但所有可能结果是已知的过程,例如:
    • 抛硬币(正面 / 反面);
    • 机器人执行抓取动作(成功 / 失败);
    • 激光雷达测距(读数会因噪声略有变化)。
  • 样本空间:所有可能结果构成的集合,记为 \(\Omega\)。

随机变量(Random Variable) 随机变量本质上是一个函数:把样本空间中的每个结果映射到一个实数。

  • 例如:抛硬币,定义

    \[ X(\text{正面}) = 1,\quad X(\text{反面}) = 0 \]

    这样“抛硬币”就被变成了“取 0 或 1 的随机变量”。

  • 对机器人而言,可以令

    • \(X\):某次抓取是否成功(成功 = 1,失败 = 0);
    • \(Y\):某次测距的读数(单位:米)。

离散随机变量与连续随机变量

+离散型:只取有限或可数多个值,例如 \(X\in\{0,1\}\)、骰子点数 \(\{1,2,3,4,5,6\}\)。 +连续型:在一个区间上取任意实数,例如测得距离 \(Y\in[0,5]\) 米。

概率分布

  • 对离散随机变量,用概率质量函数(pmf)描述:

    \[ p_X(x) = \mathbb{P}(X = x) \]

  • 对连续随机变量,用概率密度函数(pdf)描述:

    \[ f_X(x) \ge 0,\quad \int_{-\infty}^{+\infty} f_X(x)\mathrm{d}x = 1 \]

  • 相应的分布函数(CDF)为

    \[ F_X(x) = \mathbb{P}(X \le x) \]

这些定义构成了概率论和统计学习的最基础语言。(bookdown.org)

图片占位: 【图 1-2-1】一张示意图:上半部分为离散随机变量,在数轴上几个点画柱状条表示各自概率;下半部分为连续随机变量,画一条平滑曲线表示概率密度。


1.2.1.2 数学期望与方差

数学期望(Expectation) 直观上,期望就是“长期平均值”或“分布的重心”:

  • 离散情形:

    \[ \mathbb{E}[X] = \sum_x x p_X(x) \]

  • 连续情形:

    \[ \mathbb{E}[X] = \int_{-\infty}^{+\infty} x f_X(x)\mathrm{d}x \]

例如一个公平骰子 \(X\in\{1,2,3,4,5,6\}\),每个点数概率 \(1/6\):

\[ \mathbb{E}[X] = \frac{1+2+3+4+5+6}{6} = 3.5 \]

在机器人中的直觉

  • 激光雷达多次测量同一障碍物距离,其平均值接近真实距离。
  • 期望告诉你:如果你在同样条件下重复实验很多次,平均结果会到哪里。(bookdown.org)

方差(Variance) 期望只告诉我们“平均在哪”,但不知道“抖动有多大”。方差刻画的是随机变量偏离其期望的平均平方程度

\[ \mathrm{Var}(X) = \mathbb{E}\big[(X - \mathbb{E}[X])^2\big] \]

常用的等价形式是:

\[ \mathrm{Var}(X) = \mathbb{E}[X^2] - \big(\mathbb{E}[X]\big)^2 \]

示例:公平骰子的方差

\[ \mathrm{Var}(X) = \mathbb{E}[X^2] - \big(\mathbb{E}[X]\big)^2 \]

\[ \mathbb{E}[X^2] = \frac{1^2+2^2+3^2+4^2+5^2+6^2}{6} = \frac{91}{6} \]

\[ \mathrm{Var}(X) = \frac{91}{6} - 3.5^2 = \frac{91}{6} - 12.25 = \frac{35}{12} \]

在机器人场景中:

  • 如果测距结果方差很大,说明传感器噪声严重;
  • 如果机械臂末端位置的方差小,说明重复执行同一动作结果比较稳定。(bookdown.org)

1.2.1.3 常用统计量:标准差与协方差

标准差(Standard Deviation) 标准差是方差的平方根:

\[ \sigma_X = \sqrt{\mathrm{Var}(X)} \]

优点:

  • 与随机变量 \(X\) 的量纲相同(例如都是“米”),直观度量“典型偏离程度”;
  • 在很多工程指标中,比方差更常用,例如“噪声标准差为 0.01 m”。(matrix.skku.ac.kr)

协方差(Covariance) 当我们同时考虑两个随机变量 \(X, Y\) 时,会关心它们是不是“倾向一起变大或一起变小”。协方差定义为:

\[ \mathrm{Cov}(X,Y) = \mathbb{E}\big[(X - \mu_X)(Y - \mu_Y)\big] \]

其中 \(\mu_X = \mathbb{E}[X]\), \(\mu_Y = \mathbb{E}[Y]\)。(bookdown.org)

直观解释:

  • \(\mathrm{Cov}(X,Y) > 0\):当 \(X\) 高于自己平均值时,\(Y\) 也往往高于自己的平均值(“正相关”);
  • \(\mathrm{Cov}(X,Y) < 0\):一个偏高时另一个偏低(“负相关”);
  • \(\mathrm{Cov}(X,Y) \approx 0\):二者之间基本没有线性关系。

协方差矩阵 对多维随机向量 \(\mathbf{X}=(X_1,\dots,X_d)\),可以把所有变量两两之间的协方差排成一个矩阵:

\[ \Sigma_{ij} = \mathrm{Cov}(X_i, X_j) \]

这个矩阵在后续的多元高斯分布、PCA、卡尔曼滤波等场景中将频繁出现。

在机器人中的例子

  • 左右轮速度的协方差:如果机器人在直线行驶时,两轮速度偏差往往同向变化,则协方差为正。
  • 多关节机械臂末端误差的协方差:可以描述各方向误差是“独立的”还是“耦合的”。(MachineLearningMastery.com)

图片占位: 【图 1-2-2】二维散点图三组: 1)点云大致沿着右上斜线(正协方差); 2)点云沿右下斜线(负协方差); 3)点云几乎圆形云团(协方差约为 0)。


1.2.2 条件概率、贝叶斯公式、独立与条件独立

机器人决策几乎总是在“知道了一部分信息”的前提下进行的:

  • 已经看见桌上有杯子;
  • 已经知道上一步动作执行成功;
  • 已经检测到前方障碍物。

此时我们需要的就是条件概率贝叶斯更新


1.2.2.1 条件概率

定义 在事件 \(B\) 已经发生的前提下,事件 \(A\) 发生的概率称为条件概率,记为 \(\mathbb{P}(A\mid B)\):

\[ \mathbb{P}(A\mid B) = \frac{\mathbb{P}(A\cap B)}{\mathbb{P}(B)},\quad \mathbb{P}(B)>0 \]

这表示:在“只考虑 \(B\) 发生的那些情况”时,\(A\) 出现的比例。(麻省理工学院数学)

乘法公式 由定义可得:

\[ \mathbb{P}(A\cap B) = \mathbb{P}(A\mid B)\mathbb{P}(B) = \mathbb{P}(B\mid A)\mathbb{P}(A) \]

例子:视觉检测

  • \(A\):实际上前方真的有障碍物;
  • \(B\):视觉模型输出“有障碍物”。

\(\mathbb{P}(B\mid A)\) 是检测器的召回,\(\mathbb{P}(B\mid\neg A)\) 反映误报率; 条件概率允许我们根据检测结果重新评估“前方真的有障碍”的可能性。


1.2.2.2 贝叶斯公式

贝叶斯公式给出了“反向推理”的方式:通过观测结果 \(B\),更新对原因 \(A\) 的信念:

\[ \mathbb{P}(A\mid B) = \frac{\mathbb{P}(B\mid A)\mathbb{P}(A)}{\mathbb{P}(B)} \]

其中

  • \(\mathbb{P}(A)\):先验概率,表示在看到数据之前对 \(A\) 的主观信念;
  • \(\mathbb{P}(B\mid A)\):似然(likelihood),数据在假设 \(A\) 成立下出现的概率;
  • \(\mathbb{P}(B)\):证据(evidence),是数据在所有可能假设下出现的总体概率;
  • \(\mathbb{P}(A\mid B)\):后验概率,看到数据之后对 \(A\) 的更新信念。(AlmaBetter)

面向参数 \(\theta\) 与数据 \(D\) 的形式常写为:

\[ p(\theta\mid D) = \frac{p(D\mid\theta)p(\theta)}{p(D)} \]

机器人示例:障碍物存在概率

  • \(A\):前方有障碍物;
  • \(D\):相机模型给出“有障碍”信号。

若我们知道传感器在有障碍 / 无障碍时的检测分布,就可以用贝叶斯公式更新 \(\mathbb{P}(A\mid D)\),从而更理性地决定是否减速或绕行。


1.2.2.3 事件独立与条件独立

独立(Independence) 事件 A 与 B 独立,当且仅当:

\[ \mathbb{P}(A\cap B) = \mathbb{P}(A)\mathbb{P}(B) \]

等价地:

\[ \mathbb{P}(A\mid B) = \mathbb{P}(A),\quad \mathbb{P}(B\mid A) = \mathbb{P}(B) \]

直觉:A 是否发生对 B 完全没有影响,反之亦然。(麻省理工学院数学)

条件独立(Conditional Independence) 在给定条件 C 的前提下,如果

\[ \mathbb{P}(A,B\mid C) = \mathbb{P}(A\mid C)\mathbb{P}(B\mid C) \]

则称 \(A\) 与 \(B\)在条件 \(C\) 下独立,记作 \(A \perp B \mid C\)。

例子:

  • C:房间的布局已知;
  • A:左侧存在障碍;
  • B:右侧存在障碍。

在给定布局的条件下,左右是否有障碍可以近似看作相互独立。

条件独立的假设在贝叶斯网络等概率图模型中极其重要,可以使高维概率分布分解为若干简单因子,大幅降低建模与推断的复杂度。(Engineering LibreTexts)


1.2.3 常见分布(高斯、伯努利、多项式等)

具身智能中的很多子模块——从传感器噪声建模,到二分类/多分类,再到事件计数——都依赖于少数几个“常见分布”。掌握它们的性质,可以让你快速看懂大多数机器人与机器学习论文中的概率假设。


1.2.3.1 高斯分布(正态分布)

一维高斯分布 记为 \(X\sim\mathcal{N}(\mu,\sigma^2)\),其密度函数为:

\[ f(x) = \frac{1}{\sqrt{2\pi\sigma^2}}\exp\Big(-\frac{(x-\mu)^2}{2\sigma^2}\Big) \]

特性:

  • 曲线呈钟形,对称地围绕 \(\mu\);
  • \(\mu\):期望(位置参数),决定峰值位置;
  • \(\sigma^2\):方差(尺度参数),决定“胖瘦”,\(\sigma\) 越大,分布越“平”。(Analytics Vidhya)

中心极限定理的直觉 大量小扰动相加往往近似服从高斯分布——这解释了为什么自然界和工程系统中,高斯噪声如此常见。

多元高斯与协方差矩阵 对于向量随机变量 \(\mathbf{X}\in\mathbb{R}^d\),多元高斯由均值向量\(\boldsymbol{\mu}\) 和协方差矩阵\(\Sigma\) 决定:

\[ \mathbf{X}\sim\mathcal{N}(\boldsymbol{\mu},\Sigma) \]

协方差矩阵中的元素 \(\Sigma_{ij}=\mathrm{Cov}(X_i,X_j)\) 描述各维度之间的相关性。(bookdown.org)

在机器人中的应用

  • 激光雷达 / 深度相机测距误差常建模为高斯噪声;
  • 卡尔曼滤波器(轨迹估计)假设过程噪声和观测噪声服从高斯分布;
  • 机械臂末端误差的联合分布可视作多元高斯,从而用协方差椭球描述“不确定区域”。

图片占位: 【图 1-2-3】一维高斯分布示意图:均值相同、标准差不同的几条“钟形曲线”;以及二维高斯的等高线椭圆。


1.2.3.2 伯努利分布与多项分布

伯努利分布(Bernoulli) 如果随机变量 X 只取 0 或 1 两个值,且

\[ \mathbb{P}(X=1)=p,\quad \mathbb{P}(X=0)=1-p \]

则称 \(X\) 服从伯努利分布,记为 \(X\sim\mathrm{Bernoulli}(p)\)。(Analytics Vidhya)

其期望与方差为:

\[ \mathbb{E}[X]=p,\quad \mathrm{Var}(X)=p(1-p) \]

机器人中的例子:

  • 某次抓取是否成功;
  • 安全监测中某类报警是否触发;
  • 一个二分类模型的标签(“人类 / 非人类”)。

多项分布(Multinomial) 伯努利是“两选一”。如果一次试验有 \(K\) 种互斥结果(如红/绿/蓝三个类),各自概率为 \(\mathbf{p}=(p_1,\dots,p_K)\),重复进行 \(n\) 次独立试验,统计每类出现次数 \(\mathbf{X}=(X_1,\dots,X_K)\),则 \(\mathbf{X}\) 服从多项分布:

\[ \mathbf{X}\sim \mathrm{Multinomial}(n; p_1,\dots,p_K) \]

概率质量函数为:

\[ \mathbb{P}(X_1=x_1,\dots,X_K=x_K) = \frac{n!}{x_1!\cdots x_K!} p_1^{x_1}\cdots p_K^{x_K} \]

满足 \(x_1+\cdots+x_K=n\)。(statlect.com)

在机器学习中,多项分布常用于:

  • 建模一个 K 类分类器在 n 次独立预测中的类别计数;
  • 语言模型中,对某词窗口内词类计数建模。

1.2.3.3 其他常用分布:均匀、指数、泊松

均匀分布(Uniform)

  • 离散均匀:在有限集合 \(\{1,\dots,N\}\) 上,每个值概率 \(1/N\);

  • 连续均匀:在区间 [a,b] 上密度为

    \[ f(x) = \frac{1}{b-a},\quad x\in[a,b] \]

常被用作“无偏无信息”的简化假设或初始化。例如,在缺乏任何先验时,可以假设机器人初始位置在某区域服从均匀分布。

指数分布(Exponential) 指数分布用于建模非负的等待时间,密度为:

\[ f(x) = \lambda e^{-\lambda x},\quad x\ge 0 \]

其期望为 \(1/\lambda\),具有“无记忆性”:已经等了 5 秒,再等 1 秒的概率与之前等了多久无关。(Analytics Vidhya)

在机器人中,可用于近似:

  • 两次随机事件(如人进入视野、网络通信中断)之间的时间间隔。

泊松分布(Poisson) 泊松分布常用来描述单位时间内某种稀有事件发生次数:

\[ \mathbb{P}(X=k) = \frac{\lambda^k e^{-\lambda}}{k!},\quad k=0,1,2,\dots \]

参数 \(\lambda\) 同时是其均值和方差。(Medium)

机器人例子:

  • 某段时间内传感器“检测到人”的次数;
  • 控制系统中“紧急避障事件”的触发次数。

图片占位: 【图 1-2-4】三行图:

  • 均匀分布的平坦曲线;
  • 指数分布的单调递减曲线;
  • 泊松分布的离散柱状图,展示不同 \(\lambda\) 下形状差异。

1.2.4 最大似然估计、最大后验估计

在机器人学习和机器学习中,我们经常需要“从数据中估计模型参数”:例如估计传感器噪声方差、估计某类动作成功率。最大似然(MLE)和最大后验(MAP)是两种最常用的参数估计方法。(Medium)


1.2.4.1 最大似然估计(MLE)

似然函数(Likelihood) 给定模型参数 \(\theta\)、数据集 \(D=\{x_1,\dots,x_n\}\),我们将在参数 \(\theta\) 下观测到这些数据的概率视为似然函数:

\[ L(\theta; D) = p(D\mid\theta) \]

若样本在参数 \(\theta\) 下独立同分布(i.i.d.),则

\[ L(\theta; D) = \prod_{i=1}^n p(x_i\mid\theta) \]

常使用对数似然

\[ \ell(\theta; D) = \log L(\theta; D) = \sum_{i=1}^n \log p(x_i\mid\theta) \]

最大似然估计 MLE 就是选取使似然函数最大的参数:

\[ \hat{\theta}_{\text{MLE}} = \arg\max_{\theta} L(\theta; D) = \arg\max_{\theta} \ell(\theta; D) \]

示例:抛硬币估计成功率 假设硬币正面概率为 p,进行 n 次抛掷,结果中有 k 次正面。似然为

\[ L(p) = p^k (1-p)^{n-k} \]

对数似然:

\[ \ell(p) = k\log p + (n-k)\log(1-p) \]

对 p 求导并令其为 0,可得到

\[ \hat{p}_{\text{MLE}} = \frac{k}{n} \]

在机器人里,可类似地用 MLE 估计某动作“成功”的概率,或高斯噪声的均值与方差等。(Medium)


1.2.4.2 最大后验估计(MAP)

MLE 只利用数据,不考虑任何“先验经验”。在很多机器人场景中,我们往往已有经验

  • 传感器噪声大致在某个范围内;
  • 某抓取动作成功率不太可能比 0.99 还高。

此时可以采用贝叶斯视角

\[ p(\theta\mid D) \propto p(D\mid\theta)p(\theta) \]

其中 \(p(\theta)\) 是先验分布,\(p(\theta\mid D)\) 是后验分布。

**最大后验估计(MAP)**选择使后验概率最大的参数:

\[ \hat{\theta}_{\text{MAP}} = \arg\max_{\theta} p(\theta\mid D) = \arg\max_{\theta} \big[p(D\mid\theta)p(\theta)\big] \]

取对数:

\[ \hat{\theta}_{\text{MAP}} = \arg\max_{\theta} \big[ \log p(D\mid\theta) + \log p(\theta) \big] \]

这看起来像是在最大化“数据项 + 先验项”。(Medium)

示例:带 Beta 先验的硬币 对硬币成功率 \(p\) 施加 Beta 先验 \(p\sim\mathrm{Beta}(\alpha,\beta)\),观测到 \(k\) 次成功、\(n-k\) 次失败后,后验还是 Beta 分布:

\[ p\mid D \sim \mathrm{Beta}(\alpha+k,\beta+n-k) \]

其众数(在 \(\alpha+k>1,\ \beta+n-k>1\) 时)是 MAP 估计:

\[ \hat{p}_{\text{MAP}} = \frac{\alpha+k-1}{\alpha+\beta+n-2} \]

可以看到:当样本数不大时,先验参数 \(\alpha,\beta\) 会起到“平滑”作用,防止估计过于极端。


1.2.4.3 MLE 与 MAP 的区别联系

联系

  • 若先验 \(p(\theta)\) 为常数(即“非信息先验”),或者在样本数 \(n\to\infty\) 时先验影响逐渐被数据淹没,则

    \[ \hat{\theta}_{\text{MAP}} \approx \hat{\theta}_{\text{MLE}} \]

  • 因此,在大量数据场景下,MLE 和 MAP 往往给出非常接近的结果。(Medium)

差异与直觉

从优化角度看,MAP = MLE + 正则化:

\[ \max_{\theta} \big[\log p(D\mid\theta) + \log p(\theta)\big] \]

  • 如果先验是高斯 \(p(\theta)\propto \exp(-\lambda|\theta|_2^2)\),那么 \(-\log p(\theta)\) 就对应 L2 正则;
  • 如果先验是拉普拉斯 \(p(\theta)\propto \exp(-\lambda|\theta|_1)\),则对应 L1 正则。

这和后面“机器学习中的正则化”一节是同一逻辑,只是换了一种(贝叶斯)语言来理解。

工程取舍

  • 数据少、噪声大时,MAP 利用先验经验能给出更稳定的估计;
  • 数据丰富时,MLE 足够,计算更简单;
  • 在具身智能中,利用物理先验(例如“参数不可能无限大”)进入 MAP,是将“常识”注入算法的一个重要途径。

1.2.5 KL 散度、交叉熵与在机器学习中的意义

从这一小节开始,概率论和信息论与“损失函数”“训练目标”直接联系起来。几乎所有现代分类模型、概率模型、强化学习策略优化,都在某种形式上最小化 KL 散度或交叉熵。(RAINBOW-LAB)


1.2.5.1 KL 散度

定义 给定两个分布 P 和 Q,对同一随机变量 X:

  • 离散情形:

    \[ D_{\mathrm{KL}}(P|Q) = \sum_x P(x)\log\frac{P(x)}{Q(x)} \]

  • 连续情形(形式类似,用积分):

    \[ D_{\mathrm{KL}}(P|Q) = \int P(x)\log\frac{P(x)}{Q(x)}\mathrm{d}x \]

性质:

  • \(D_{\mathrm{KL}}(P|Q)\ge 0\),且等号成立当且仅当 \(P=Q\)(几乎处处); +不对称:一般有 \(D_{\mathrm{KL}}(P|Q)\neq D_{\mathrm{KL}}(Q|P)\),因此它不是严格意义上的“距离”。(RAINBOW-LAB)

信息论解释 如果真实分布是 P,但你按照 Q 来设计最优编码,那么平均每个样本要多付出

\[ D_{\mathrm{KL}}(P|Q) \]

这么多“比特”的代价。因此,KL 散度可以理解为:用 Q 近似 P 的“信息损失”。(RAINBOW-LAB)

在机器人中的直觉

  • P:真实环境中动作/状态的分布;
  • Q:你的模型或策略认为的分布。

KL 散度越小,说明模型对环境的刻画越接近真实;在策略优化中,也经常用 KL 来限制新旧策略偏差,防止机器人行为突然变化过大。


1.2.5.2 交叉熵

熵(Entropy)与交叉熵 熵 \(H(P)\) 描述分布 \(P\) 的不确定性:

\[ H(P) = -\sum_x P(x)\log P(x) \]

交叉熵 \(H(P,Q)\) 则定义为:

\[ H(P,Q) = -\sum_x P(x)\log Q(x) \]

注意两者的关系:

\[ H(P,Q) = H(P) + D_{\mathrm{KL}}(P|Q) \]

由于对给定的真实分布 \(P\),熵 \(H(P)\) 是常数,因此最小化交叉熵等价于最小化 KL 散度。(RAINBOW-LAB)

分类问题中的交叉熵损失

  • 二分类(标签 \(y\in\{0,1\}\),模型输出 \(\hat{p}=\mathbb{P}(y=1\mid x)\)):

    \[ \ell(x,y) = -\big[y\log\hat{p} + (1-y)\log(1-\hat{p})\big] \]

  • 多分类(标签为 one-hot 向量 \(\mathbf{y}\),预测分布为 \(\hat{\mathbf{p}}\)):

    \[ \ell(x,\mathbf{y}) = -\sum_{k} y_k\log \hat{p}_k \]

    对于 one-hot 标签,有 \(\ell = -\log \hat{p}_{\text{真实类别}}\)。

这正是深度学习中最常用的交叉熵损失函数。(DataCamp)

图片占位: 【图 1-2-5】二维示意图:真实分布 \(P\) 与预测分布 \(Q\) 的条形图,并在旁边标注 KL\(P|Q\) 与交叉熵 \(H(P,Q)\) 的关系式。


1.2.5.3 在机器学习中的应用

监督学习中的损失函数 大部分分类模型都是在最小化“真实标签分布 P 与模型预测分布 Q 的交叉熵”——这在概率论层面就是让模型分布逼近真实数据分布,从而最小化 KL 散度。(DataCamp)

生成模型与分布拟合

  • 在变分自编码器(VAE)中,我们显式使用 KL 散度约束“近似后验分布”与“先验分布”的差异;
  • 在某些密度估计问题中,训练目标就是 \(\min_\theta D_{\mathrm{KL}}(P_{\text{data}}|P_\theta)\),从而让模型 \(P_\theta\) 逼近真实数据分布。

强化学习与策略优化 在策略梯度与 PPO 等算法中,常加入 KL 散度约束:

  • \(D_{\mathrm{KL}}(\pi_{\text{old}}|\pi_{\text{new}})\) 太大说明新策略与旧策略差异过大,可能导致行为不稳定;
  • 约束 KL 散度可以看作对更新步长的一种“几何”控制,确保策略逐步演化而不是剧烈跳变,这对真实机器人尤为重要。(Medium)

在具身智能中的意义

  • 交叉熵提供了一个统一的度量,把“预测概率分布”和“真实结果”放在同一框架下比较,适用于视觉识别、语言理解、动作分类等各类子任务;
  • KL 散度则更多地用来控制“模型的变化”和“策略分布的差异”,是把“安全与稳定”融入学习过程的数学工具。

本节从随机变量、期望方差出发,经由条件概率和贝叶斯更新,到常见分布,再到 MLE / MAP 以及 KL 散度与交叉熵,构成了后续整本书中所有概率建模与学习算法的基础。后面在讨论深度学习损失函数、强化学习策略优化、VLA 模型训练目标时,你会不断看到这些概念再次出现,并在机器人具身智能的具体场景中发挥作用。

本章小结与自测

三行小结

  1. 本章提供后续全部模型章节的数学地基。
  2. 重点是把符号、公式和几何/概率直觉对应起来。
  3. 学完后应能独立检查推导与实现中的维度和假设。

检查题

  1. 用你自己的话总结本章最核心的一个公式/机制。
  2. 给出一个“如果要落地到项目里,你会怎么用”的具体例子。

常见误区

  1. 只背公式,不检查适用条件。
  2. 忽略维度一致性。
  3. 把符号记忆当成理解。

公式到代码(最小示例)

import numpy as np

x = np.array([1.0, 2.0, -1.0])
y = np.array([0.5, -1.0, 3.0])
inner = float(x @ y)
norm_x = float(np.linalg.norm(x, ord=2))
print(inner, norm_x)

本章外部参考(集中)

  1. bookdown.org
  2. matrix.skku.ac.kr
  3. MachineLearningMastery.com
  4. 麻省理工学院数学
  5. AlmaBetter
  6. Engineering LibreTexts
  7. Analytics Vidhya
  8. statlect.com
  9. Medium
  10. Medium
  11. RAINBOW-LAB
  12. DataCamp
  13. 本章其余链接可在正文中按上下文继续查阅。

1.3 优化基础

下面是按照你给出的提纲,完整撰写的1.3 优化基础中几个小节内容草稿,风格偏教材化,适合研究生自学。从读者“会微积分和线性代数,但还没系统学过优化”的背景出发,尽量用通俗语言讲清楚核心概念,并在合适位置加了图片占位说明。公式部分保持到能看懂后面神经网络和 RL 论文为目标。


1.3 优化基础

在具身智能、深度学习和强化学习中,本质上都在做一件事:

找到一组参数,使某个“代价”或“损失”尽可能小。

这一节我们系统介绍优化的基本概念与方法,从最常见的梯度下降到约束优化、再到神经网络训练中的实际问题,为后续深度网络、RL、控制中的各种“求最优”打基础。


1.3.1 无约束优化与梯度下降

学习导航

  • 本章主题:1.3.1 无约束优化与梯度下降
  • 前置知识:高中/本科数学基础(线代、概率、微积分)。
  • 建议用时:120-140 分钟
  • 阅读顺序:先看概念框架,再看公式/代码,最后做自测。

1.3.1.1 导数与梯度概念

(1)一元函数的导数:变化率的精确定义

在高中数学里,导数通常被解释为切线斜率。更一般地,可以理解为:

在一点附近,函数值对自变量的小变化有多敏感。

设一元函数 \(f(x)\),在点 \(\displaystyle x\) 的导数定义为

\[ f'(x) = \lim_{h\to 0} \frac{f(x+h)-f(x)}{h}. \]

  • 若 \(f'(x) > 0\):向右(\(x\) 增大)走一点,函数值会上升。
  • 若 \(f'(x) < 0\):向右走一点,函数值会下降。
  • 若 \(f'(x) = 0\):在该点附近一阶上看不到“上升/下降”的趋势,这里可能是极大值、极小值或鞍点(后面会详细讲)。

(2)多元函数的偏导与梯度

深度学习中的参数往往是高维向量 \(\theta \in \mathbb{R}^d\),损失函数 \(L(\theta)\) 是多元函数。 对每个分量 \(\theta_i\) 的偏导数

\[ \frac{\partial L}{\partial \theta_i} \]

衡量“只改变 \(\theta_i\),保持其它分量不变”时,损失的变化率。

将所有偏导按分量收集起来,得到梯度(gradient)

\[ \nabla_\theta L(\theta) = \begin{bmatrix} \frac{\partial L}{\partial \theta_1}\\ \vdots\\ \frac{\partial L}{\partial \theta_d} \end{bmatrix}. \]

几何上,梯度有两个重要性质(在欧几里得度量下):

1.方向:在当前点处,梯度指向函数“上升最快”的方向。 2.负梯度方向:\(-\nabla L\) 是函数“下降最快”的方向。

【图 1.3-1 占位:二维函数的等高线图,标出某点处的梯度向量,显示梯度垂直等高线并指向上升最快方向;负梯度指向下降方向。】

这两个性质是梯度下降法的核心依据。


1.3.1.2 梯度下降法

(1)问题形式:无约束优化

最简单也是最常见的优化问题形式是:

\[ \min_{\theta \in \mathbb{R}^d} L(\theta), \]

没有额外等式/不等式约束(比如不要求 \(\theta\) 非负等),称为无约束优化。在机器学习中,\(\theta\) 通常代表模型参数,\(L(\theta)\) 是在训练集上的损失或代价函数。(Analytics Vidhya)

(2)梯度下降思想

基于“负梯度是下降最快方向”这一事实,梯度下降(Gradient Descent)采用简单迭代:

\[ \theta^{(k+1)} = \theta^{(k)} - \eta \nabla_\theta L(\theta^{(k)}), \]

其中:

  • \(\displaystyle k\):迭代步数;
  • \(\eta > 0\):步长或学习率(learning rate)
  • \(\nabla_\theta L(\theta^{(k)})\):在当前参数的梯度。

直观理解:

  • 每一步都“看一眼”当前坡度(梯度),
  • 然后沿着下坡最快的方向走一小步(\(-\eta \nabla L\)),
  • 希望最终走到“山谷底”(损失最小处)。(DigitalOcean)

【图 1.3-2 占位:一维曲线 \(L(\theta)\) 图像,展示沿负导数方向移动的离散步点,逐步靠近最小值。】

(3)梯度下降的基本性质

在一些理想条件下(比如 \(L(\theta)\) 是光滑且凸的),可以证明梯度下降会收敛到全局最小值,且步长足够小即可保证函数值单调下降。但在非凸问题(深度网络训练)中,梯度下降往往只能保证:

+找到某个“还不错”的局部极小值或鞍点附近的低损失区域, 而不是严格意义上的全局最优。

不过在深度学习的实际经验中,局部极小值问题远没有想象中那么可怕,重点反而在于收敛速度和训练稳定性,这些会在后面几小节展开。


1.3.1.3 学习率对优化的影响

学习率 \(\eta\) 决定每一步走多远,直接影响:

  • 收敛速度
  • 是否发散
  • 是否在最优附近震荡

(1)学习率过大:发散或震荡

如果 \(\eta\) 取得非常大,一步走得太远,可能出现:

  • 每次更新都“跨过山谷”,在两侧来回跳,导致损失在最小值附近震荡;
  • 甚至越走越远,损失越来越大,出现发散

【图 1.3-3 占位:一维损失曲线,分别画出合适步长、偏大步长(震荡)、极大步长(发散)的迭代轨迹对比。】

在凸二次函数 \(L(\theta) = \frac{1}{2}a\theta^2\) 情况下,可以严格算出: 若 \(\eta > 2/a\),迭代就一定发散;\(\eta\in(0,2/a)\) 则可收敛。

(2)学习率过小:收敛极慢

若 \(\eta\) 非常小,梯度下降每次只迈出“蚂蚁步”,好处是几乎不会发散,坏处是:

  • 要走非常多步才能接近最优;
  • 在实际深度网络训练中,会导致显存和时间成本都非常高。

(3)合适学习率:速度与稳定性的折中

在深度学习实践中,一般:

  • 开始时使用相对较大的学习率加速下降;
  • 后期逐渐减小学习率,在最优附近“慢慢收敛”,减少震荡。

如何具体调度学习率,是 1.3.5 的重点内容之一。很多现代优化算法(如 Adam)本质上就是在智能地“调步长”——对不同参数维度、自不同时刻使用不同的有效学习率。(DigitalOcean)


1.3.2 一阶与二阶优化方法直觉(SGD、Momentum、Adam 等)

在 1.3.1 中,梯度下降用到了目标函数的一阶导数(梯度)。更一般地,可以根据使用信息的多少,大致将优化方法分为:

+一阶方法(first-order methods):只依赖梯度; +二阶方法(second-order methods):还利用 Hessian(即二阶导信息)。

从直觉上看:

  • 一阶方法:信息便宜、迭代快,但走路相对“笨拙”;
  • 二阶方法:更聪明地利用“曲率”,但每一步计算非常贵,在大规模神经网络中通常不现实。

1.3.2.1 一阶方法

一阶方法的共同特征:

更新规则形如 \(\theta^{(k+1)} = \theta^{(k)} + \text{某种函数}({\nabla L(\theta^{(t)})}_{t\le k})\)。

(1)批量梯度下降(Batch GD)

最原始的梯度下降在每一步都用整批训练数据计算损失和梯度,这在数据量巨大时计算代价非常高。深度学习实践中更常用的是 mini-batch 形式(见下面 SGD),这里略过。

(2)随机梯度下降(Stochastic Gradient Descent, SGD)

理论上需要在整批数据上计算梯度,但在实践中我们常用一个样本或一个小批量样本的梯度来近似整体梯度,这就是随机梯度下降(SGD)

\[ \theta^{(k+1)} = \theta^{(k)} - \eta \nabla_\theta \ell(x_{i_k}, y_{i_k}; \theta^{(k)}), \]

其中:

  • \(\displaystyle (x_{i_k}, y_{i_k})\) 是在第 \(\displaystyle k\) 步随机抽取的样本或 mini-batch;
  • \(\ell\) 是单样本损失。

这种“噪声较大的梯度”有两个好处:

1.更新更频繁,单步计算轻量,适合大数据场景; 2. 由于带噪声,优化过程更容易“抖出”某些鞍点或坏的局部极小值,有助于探索更好的解。(wikidocs.net)

(3)带动量的 SGD(Momentum)

纯 SGD 更新路径常常是一条“抖动的折线”:在狭长谷底中来回摆动,收敛慢。**动量(Momentum)**的思想是:

不仅考虑当前梯度,还记住“过去一段时间的更新方向”, 就像物理中的惯性一样,让参数沿着过去累积的方向继续前进。(DigitalOcean)

典型形式(速度形式):

\[ \begin{aligned} v^{(k+1)} &= \mu v^{(k)} - \eta \nabla_\theta L(\theta^{(k)}), \theta^{(k+1)} &= \theta^{(k)} + v^{(k+1)} , \end{aligned} \]

其中:

  • \(v^{(k)}\):“速度”或动量向量;
  • \(\mu\in[0,1)\):动量衰减系数(如 0.9)。

直觉:

  • 在损失谷底的长轴方向上,梯度方向长期一致,动量会不断积累,使得沿谷底方向前进更快;
  • 在与谷底垂直方向(损失变化陡峭的方向),梯度符号经常变化,动量会部分抵消震荡。

(4)自适应方法:RMSProp、Adam

传统 SGD 对所有参数使用同一个学习率 \(\eta\)。但不同维度可能有不同尺度和重要性,自适应方法通过统计历史梯度大小,为不同参数自动调整“步长”。

Adam为例(非常常见的优化器):(DigitalOcean)

  • 维护一阶矩(梯度的滑动平均) \(m_t\);
  • 维护二阶矩(梯度平方的滑动平均) \(v_t\);
  • 用这两个统计量对梯度进行“归一化”和“放缩”。

简化后更新类似:

\[ \theta_{t+1} = \theta_t - \eta \cdot \frac{\hat m_t}{\sqrt{\hat v_t} + \epsilon}. \]

直观上:

  • \(m_t\) 类似动量,平滑梯度方向;
  • \(\sqrt{v_t}\) 则反映梯度幅度,对梯度长期较大的维度减小步长,对梯度较小的维度增大步长,实现自适应学习率。

1.3.2.2 二阶方法

一阶方法只用梯度,而二阶方法还使用Hessian 矩阵

\[ H(\theta) = \nabla^2_\theta L(\theta), \]

它是一个 \(d\times d\) 矩阵,每个元素是二阶偏导:

\[ H_{ij} = \frac{\partial^2 L}{\partial \theta_i \partial \theta_j}. \]

(1)曲率信息与“更聪明的步长”

一元函数里,我们知道泰勒展开:

\[ L(\theta) \approx L(\theta_0) + L'(\theta_0)(\theta-\theta_0) + \frac{1}{2}L''(\theta_0)(\theta-\theta_0)^2. \]

若在附近用这个二次近似代替原函数,最小值的解析解是:

\[ \theta^\star \approx \theta_0 - \frac{L'(\theta_0)}{L''(\theta_0)}. \]

把这个推广到多元情形,就得到**牛顿法(Newton’s method)**的迭代:

\[ \theta^{(k+1)} = \theta^{(k)} - H(\theta^{(k)})^{-1} \nabla L(\theta^{(k)}). \]

相比梯度下降 \(-\eta\nabla L\),牛顿法将梯度再乘以 \(H^{-1}\),等价于在不同方向上动态调整步长,使得:

  • 在“弯曲得很厉害”(曲率大)的方向上,步子变小(防止跳太远);
  • 在“曲率较平缓”的方向上,步子变大,加速收敛。

(2)二阶方法的难点

对于深度网络:

  • 参数维度 \(\displaystyle d\) 往往在百万甚至亿级,Hessian 是 \(d\times d\) 矩阵, 存储和求逆都是天文级成本;
  • 计算 Hessian 本身也极其昂贵,且数值上不稳定。

因此直接使用“严格的二阶方法”在深度网络中几乎不可行。

(3)拟牛顿方法(简略了解)

实际中有一些折中方案,如 BFGS、L-BFGS 等拟牛顿法,通过在迭代中近似构造 \(H^{-1}\),而不显式求出完整 Hessian。这些方法在中等规模问题(如传统机器学习、小型网络)中依然常用,但在大规模深度学习里不再主流。


1.3.2.3 实用考虑

在深度学习和具身智能的实际训练里,通常采用:

+一阶优化器为主(SGD / SGD+Momentum / Adam / RMSProp 等);(DigitalOcean)

  • 在少数规模较小、需要高精度的模块中尝试二阶或拟牛顿方法。

主要原因:

  1. 模型参数维度太高,无法承担 Hessian 级别的计算和内存;
  2. 大量实践表明,好的初始化 + 合理的一阶优化 + 学习率调度,已足够得到很好的结果。

在机器人和 VLA 模型中,优化器的选择往往是工程问题:

  • 需要更稳定、自动调节学习率:Adam / AdamW 常见;
  • 更在意最终泛化性能、训练后期表现:不少视觉任务仍偏爱带动量的 SGD。

1.3.3 损失景观与局部极值、鞍点现象

1.3.3.1 损失函数景观

**损失景观(loss landscape)**是指: 在高维参数空间中,损失函数 \(L(\theta)\) 的取值构成的“山地地形”。

  • 每个点 \(\theta\) 是一组参数;
  • 其对应高度 \(L(\theta)\) 是训练损失;
  • 优化过程就是在这片高维山地上“下山”。

【图 1.3-4 占位:二维参数空间的损失等高线/三维曲面示意,标出多个谷地、鞍点和平坦区域。】

在深度网络中,损失景观具有以下特点:(lcnwww.epfl.ch)

  • 高维(成千上万甚至更多参数);
  • 强烈非凸(有大量局部极值和鞍点);
  • 经常存在大面积的“平坦区”(梯度很小)和“陡峭沟壑”。

理解损失景观有助于从几何视角解释:

  • 为什么梯度下降会卡住或变慢;
  • 为什么初始化会影响最终结果;
  • 为什么带噪声的 SGD 在实践中表现不错。

1.3.3.2 局部极小值与鞍点

(1)临界点(critical point)

若在某点 \(\theta^\star\) 处梯度为零:

\[ \nabla L(\theta^\star) = 0, \]

则称该点为临界点。临界点可能是:

  • 局部极小值(local minimum)
  • 局部极大值(local maximum)
  • 鞍点(saddle point)

(2)局部极小值

若存在足够小的邻域,使得:

\[ \forall \theta \text{ 在邻域内},\quad L(\theta) \ge L(\theta^\star), \]

则 \(\theta^\star\) 是局部极小值。简单理解: 在附近任何方向稍微走一步,损失都会变大。

在凸优化中,每个局部极小值同时是全局极小值,世界清爽又温柔。可惜深度网络损失往往不是凸的。

(3)鞍点(Saddle Point)

鞍点是这样一种临界点:梯度为零,但在某些方向上表现得像极小值,在另一些方向上则像极大值——类似马鞍的形状:横向是谷,纵向是峰。(data-intelligence.hashnode.dev)

  • 数学上:Hessian 的特征值有正有负;
  • 几何上:既存在“向下的方向”,也存在“向上的方向”。

在高维非凸优化中,研究与数值实验表明:

+鞍点远比“坏的局部极小值”更多

  • 很多“训练卡住”的现象,实则是停在鞍点附近或平坦区域,而非真正的局部最小谷底。(lcnwww.epfl.ch)

(4)鞍点对优化的影响

在鞍点附近,梯度接近零,普通梯度下降会:

  • 更新步长很小,移动缓慢;
  • 可能长时间在附近徘徊,看起来像“训练不动了”。

带噪声的 SGD 由于每步梯度有随机性,在一定程度上可以“抖出”鞍点,这也是实践中几乎总是使用 mini-batch 而不是纯 Batch GD 的原因之一。(ApX Machine Learning)


1.3.3.3 深度网络的损失特点

近年来不少工作分析了深度网络的损失景观,一些典型结论包括:(机器学习研究期刊)

1.坏的局部极小值在高维情况下不一定很多。 在很多设置下,深度线性网络甚至可以证明不存在“劣质局部极小值”,只有全局极小和鞍点。 2.鞍点和平坦区域是主要障碍。 训练变慢或停滞往往源于梯度接近零的平原或鞍点,而不是被困在某个特别高的局部谷底。 3.“好极小值”往往成片存在(flat minima)。 一些较“平坦”的极小值(改变参数一点点损失不变太多)与泛化性能有一定关联——通常认为平坦极小值对应更好的泛化。

对具身智能的实际意义:

  • 训练 VLA 或控制策略时,如果损失长时间不下降,未必是“模型不够强”,也可能是优化在不利的几何结构中爬得太慢;
  • 调整优化器(如从 Adam 换成 SGD+Momentum),修改学习率调度、增加噪声等,常常可以改变在损失景观中的“走路方式”,找到更好的解。

1.3.4 约束优化与拉格朗日乘子基本思想

前面讨论的是无约束优化,但在机器人和具身智能里,很多问题天然带有约束,例如:

  • 关节角必须在物理范围内;
  • 控制输入不能超过最大电机扭矩;
  • 概率分布的参数必须非负且和为 1;
  • 路径规划中必须避开障碍物等。

这类问题统称为约束优化(constrained optimization)


1.3.4.1 约束优化

一般形式可以写作:

\[ \begin{aligned} \min_{x} \quad & f(x) \text{s.t.} \quad & g_i(x) = 0,\quad i=1,\dots,m \quad \text{(等式约束)} & h_j(x) \le 0,\quad j=1,\dots,p \quad \text{(不等式约束)} \end{aligned} \]

其中:

  • \(x\in \mathbb{R}^d\):待求参数(比如控制变量、概率参数等);
  • \(f(x)\):目标函数(损失或代价);
  • \(g_i(x)\)、\(h_j(x)\):约束条件。

机器人中的若干例子:

  • 机械臂逆运动学求解时要求末端达到给定位置(等式约束);
  • 控制优化中限制关节速度或力矩不超过上限(不等式约束);
  • 最大熵模型或概率分布学习中要求 \(\sum_i p_i = 1, p_i \ge 0\)。

1.3.4.2 拉格朗日乘子

(1)等式约束:拉格朗日乘子法

考虑只有等式约束的情形:

\[ \begin{aligned} \min_x \quad & f(x) \text{s.t.}\quad & g_i(x) = 0,\quad i=1,\dots,m. \end{aligned} \]

拉格朗日乘子法的关键思想是:

把“在约束面上找极值”的问题,转化为“在更高维空间中找无约束极值”的问题。(cs.toronto.edu)

构造拉格朗日函数:

\[ \mathcal{L}(x, \lambda) = f(x) + \sum_{i=1}^m \lambda_i g_i(x), \]

其中 \(\lambda_i\) 称为拉格朗日乘子。此时的最优性条件(在一些技术条件下)可以写成:

\[ \nabla_x \mathcal{L}(x^\star,\lambda^\star) = 0,\quad g_i(x^\star)=0. \]

直观意义:

  • 在最优点上,目标函数 \(f(x)\) 的梯度在约束面切平面内不能再下降;
  • 拉格朗日乘子 \(\lambda_i\) 可以理解为“满足约束对目标值的边际代价”,在许多物理和经济问题中有很直观的解释。

【图 1.3-5 占位:二维函数等高线 + 一条曲线约束 \(g(x)=0\)(例如椭圆),示意在最优点处水平集与约束曲线切触,梯度方向与约束的梯度共线。】

(2)从优化到“方程组”

使用拉格朗日乘子或 KKT 条件,本质上就是把“优化问题”转换为一组方程/不等式系统:

\[ \begin{cases} \nabla_x \mathcal{L}(x,\lambda,\mu) = 0 g_i(x)=0 h_j(x)\le 0, \dots \end{cases} \]

这类系统在理论分析和某些算法(如内点法)中更容易处理。(Mathematics Stack Exchange)


1.3.4.3 KKT 条件

当存在不等式约束时,拉格朗日乘子法需要推广到Karush–Kuhn–Tucker(KKT)条件。它是非线性规划中非常重要的一阶必要条件。(维基百科)

考虑一般问题:

\[ \begin{aligned} \min_x \quad & f(x) \text{s.t.} \quad & g_i(x) = 0,\quad i=1,\dots,m & h_j(x) \le 0,\quad j=1,\dots,p. \end{aligned} \]

构造拉格朗日函数

\[ \mathcal{L}(x,\lambda,\mu) = f(x) + \sum_{i=1}^m \lambda_i g_i(x) + \sum_{j=1}^p \mu_j h_j(x), \]

其中:

  • \(\lambda_i\):等式约束的乘子;
  • \(\mu_j\):不等式约束的乘子。

KKT 条件包括:

1.原始可行性(primal feasibility) 满足原始约束:

\[ g_i(x^\star)=0,\quad h_j(x^\star)\le 0. \]

2.对偶可行性(dual feasibility) 不等式乘子非负:

\[ \mu_j^\star \ge 0. \]

3.站立条件(stationarity)

\[ \nabla_x \mathcal{L}(x^\star,\lambda^\star,\mu^\star) = 0. \]

4.互补松弛(complementary slackness)

\[ \mu_j^\star h_j(x^\star) = 0,\quad \forall j. \]

这表示:

  • 若某个不等式约束严格不等(\(h_j(x^\star) < 0\)),则对应乘子必须为 0;
  • 若乘子 \(\mu_j^\star>0\),则该约束一定正好“紧到边上”(\(h_j(x^\star)=0\))。

在凸优化问题且满足一定正则条件时,KKT 条件不仅是必要条件,也是充分条件——即解满足 KKT 条件就一定是全局最优解。这为许多机器学习模型(如支持向量机)的推导提供了理论基础。

后面讲到最大间隔分类、软间隔 SVM 时,会再次用到这些工具。


1.3.5 神经网络训练中的优化实践问题(学习率、收敛与稳定性)

从这一小节开始,重点从“理论优化”切换到“神经网络训练实践”。在具身智能中,无论训练 VLM、VLA 还是 RL policy,都要面对如下问题:

  • 学习率如何设定与调度?
  • 梯度为什么会消失或爆炸?
  • 训练过程算不算收敛?什么时候终止?如何保持稳定?

1.3.5.1 学习率调度

在 1.3.1.3 中,我们已经看到学习率大小对收敛速度和稳定性的影响。进一步地,**学习率调度(learning rate schedule)**指的是在训练过程中随时间改变学习率的策略。

(1)为什么要调度?

  • 训练初期:需要较大的学习率快速“粗略找到好区域”;
  • 训练后期:需要较小的学习率在最优附近细致调整,避免震荡;
  • 某些模型训练需要“预热”(warm-up),防止一开始梯度太大导致发散。

(2)常见调度策略

1.Step Decay:每过固定若干 epoch,将学习率乘以一个小于 1 的因子(例如每 30 个 epoch 乘以 0.1)。 2.Exponential Decay:按 \(\eta_t = \eta_0 \cdot \gamma^t\) 指数衰减。 3.Cosine Annealing(余弦退火):学习率随训练进度在一个余弦曲线上缓慢减小,有时结合周期性重启使用。 4.Warm-up + Scheduler:在前几百/几千步从非常小的值线性升高到目标学习率,然后按上述某种策略减小。

实践经验(特别是在 Transformer 和大规模模型训练中)表明,合理的学习率调度往往比“纯粹换更复杂的优化器”带来的收益更稳定且可控。(DigitalOcean)


1.3.5.2 梯度消失与爆炸

(1)问题现象

在深层网络中,反向传播时梯度会通过链式法则逐层相乘,如果每层的导数绝对值多数小于 1,则梯度会指数级减小,最终前面层几乎得不到更新,这就是梯度消失(vanishing gradients)。(维基百科)

反过来,如果导数绝对值多为大于 1,则梯度会指数级放大,导致梯度爆炸(exploding gradients)

  • 参数更新剧烈震荡甚至变成 NaN;
  • loss 突然变得非常大。

这些问题在 RNN、非常深的前馈网络以及不合理初始化时尤其严重。(arXiv)

(2)成因直观

简单看一维链式法则:

\[ \frac{\partial L}{\partial x_0} = \frac{\partial L}{\partial x_1} \frac{\partial x_1}{\partial x_0} = \frac{\partial L}{\partial x_n} \prod_{k=0}^{n-1} \frac{\partial x_{k+1}}{\partial x_k}. \]

若每个 \(\big|\frac{\partial x_{k+1}}{\partial x_k}\big|\) 大约为 0.5,10 层后得到 \(0.5^{10}\approx 1/1024\),梯度几乎消失;若每层约为 2,则 \(2^{10}\approx 1024\),梯度爆炸。

在多层线性/非线性组合中,这种现象极易出现。

(3)缓解方法

常见手段包括:(维基百科)

1.合理的权重初始化

  • Xavier 初始化:保证前向/反向信号方差在层间大致保持一致,适合 tanh 等。
  • Kaiming 初始化:针对 ReLU 族激活,考虑其非对称性。 2.合适的激活函数
  • 用 ReLU、GELU 等替代 Sigmoid/Tanh,可以减轻梯度饱和问题。 3.归一化层
  • Batch Normalization、LayerNorm 等在前向上稳定中间层分布,也有助于避免梯度过大或过小。 4.残差连接(Residual Connections)
  • 在 ResNet、Transformer 中广泛使用,允许梯度沿“捷径”反向传播,大幅缓解梯度消失问题。 5.梯度裁剪(Gradient Clipping)
  • 对梯度的范数设置上限,例如若 \(|g|_2 > c\) 则缩放为 \(\frac{c}{|g|_2}g\),常用于 RNN 和强化学习策略网络中,防止爆炸。(Data Science Stack Exchange)

在具身智能相关网络(例如 RNN/Transformer 控制策略、多帧视觉编码器)中,梯度消失与爆炸会直接导致策略不学或训练不稳定,是工程调参中的常见“坑”。


1.3.5.3 收敛判断与稳定训练

(1)什么叫“收敛”?

在理论上,收敛可以是:

  • 参数 \(\theta^{(k)}\) 收敛;
  • 梯度 \(\nabla L(\theta^{(k)}) \to 0\);
  • 损失 \(L(\theta^{(k)})\) 收敛到某个值。

在深度学习实践中,我们更关心:

  • 训练集损失是否持续下降并趋于平稳;
  • 验证集性能是否达到平台期甚至开始下降(过拟合)。

(2)训练监控

通常会绘制如下曲线:

  • 训练 loss vs. iteration / epoch;
  • 验证 loss / 准确率 vs. epoch。

在“健康”的训练过程中,一般会看到:

  • 前期训练 loss 快速下降;
  • 中后期下降变缓,接近收敛;
  • 若模型开始过拟合,训练集指标继续变好而验证集变差。

(3)稳定训练的常用技巧

1.早停(Early Stopping) 在验证集性能长时间未提升甚至下降时,停止训练并回退到最佳验证点对应的参数,防止过拟合。 2.检查学习率与梯度范围 若 loss 突然爆炸或梯度出现 NaN,优先怀疑学习率是否过大、是否缺少梯度裁剪或数值稳定处理。 3.使用验证集而非训练 loss 判断收敛 对具身智能任务尤其重要,因为在真实机器人上往往只关心“在新场景、新物体上的成功率”,不能只看训练轨迹上的表现。 4.多次重复实验与随机种子控制 优化过程本身带有随机性(初始化、mini-batch 抽样等),稳定结果应当在不同随机种子下大致一致,防止“偶然跑出一次好结果”。

在后续章节(例如 2.2 深度网络训练技巧、9.4 数据工程与 MLOps)中,会进一步结合实验工程细节讨论如何系统监控和管理训练过程。


这一节从导数和梯度开始,依次介绍了梯度下降、一阶/二阶方法直觉、损失景观与鞍点、约束优化与拉格朗日/KKT,再到神经网络训练中的学习率、梯度消失/爆炸以及收敛判断。掌握这些内容后,读者应该能:

  • 看懂大多数深度学习论文中涉及优化的公式;
  • 理解主流优化器(SGD、Momentum、Adam 等)的核心思想;
  • 在训练自己的网络(包括具身智能中的 VLA 模型)时,有一套清晰的调参和诊断思路。

后续章节将在此基础上,进一步讨论深度网络结构、Transformer、RL 与模仿学习中的优化问题,逐步搭建起完整的“从感知到控制”的学习图景。

本章小结与自测

三行小结

  1. 本章提供后续全部模型章节的数学地基。
  2. 重点是把符号、公式和几何/概率直觉对应起来。
  3. 学完后应能独立检查推导与实现中的维度和假设。

检查题

  1. 用你自己的话总结本章最核心的一个公式/机制。
  2. 给出一个“如果要落地到项目里,你会怎么用”的具体例子。

常见误区

  1. 只背公式,不检查适用条件。
  2. 忽略维度一致性。
  3. 把符号记忆当成理解。

公式到代码(最小示例)

import numpy as np

x = np.array([1.0, 2.0, -1.0])
y = np.array([0.5, -1.0, 3.0])
inner = float(x @ y)
norm_x = float(np.linalg.norm(x, ord=2))
print(inner, norm_x)

本章外部参考(集中)

  1. Analytics Vidhya
  2. DigitalOcean
  3. DigitalOcean
  4. wikidocs.net
  5. lcnwww.epfl.ch
  6. data-intelligence.hashnode.dev
  7. ApX Machine Learning
  8. 机器学习研究期刊
  9. cs.toronto.edu
  10. Mathematics Stack Exchange
  11. 维基百科
  12. 维基百科
  13. 本章其余链接可在正文中按上下文继续查阅。

1.4 机器学习基础

1.4.1 回归与分类基本问题设置

学习导航

  • 本章主题:1.4.1 回归与分类基本问题设置
  • 前置知识:高中/本科数学基础(线代、概率、微积分)。
  • 建议用时:102-122 分钟
  • 阅读顺序:先看概念框架,再看公式/代码,最后做自测。

在具身智能场景中,“模型”最常干两件事: 预测一个数值(如机械臂末端未来 0.1s 的位移),或预测一个类别(如“这次抓取会不会成功”)。前者是回归,后者是分类。这两类问题构成了监督学习的根基。


1.4.1.1 回归问题

定义与形式化

回归问题中,目标是从输入特征 \(\mathbf{x}\in\mathbb{R}^d\) 预测一个或多个连续实数输出 \(y\in\mathbb{R}\) 或 \(\mathbb{R}^k\):

\[ f_\theta: \mathbf{x} \mapsto \hat{y} \]

其中 \(\theta\) 是模型参数(例如线性回归中的权重向量)。损失函数常用均方误差(MSE)

\[ \mathcal{L}(\theta)=\frac{1}{N}\sum_{i=1}^N (\hat{y}_i - y_i)^2 \]

通过最小化损失来学习参数。

典型例子

  • 预测机器人末端执行器在下一时刻的位姿偏移量(连续 3D 坐标与角度)。
  • 预测接触力、扭矩、滑动速度等物理量。
  • 预测电机温度、能耗等运行指标。

与具身智能的关系

在具身智能中,回归通常用于:

+动力学建模:根据当前状态和控制输入预测下一个状态(状态转移模型)。 +代价函数学习:用回归拟合“动作是否优良”的连续评分,为后续规划或强化学习服务。

【可插图:二维平面上一条拟合数据点的直线或曲线,展示回归模型拟合连续目标的直观图像。】


1.4.1.2 分类问题

定义与形式化

分类问题中,目标是预测一个离散标签

\[ f_\theta: \mathbf{x} \mapsto \hat{y},\quad \hat{y}\in\{1,2,\dots,C\} \]

通常模型先输出每个类别的概率\(\hat{p}_c = P(y=c|\mathbf{x})\),再取概率最大的类别作为预测。

典型例子

  • 场景识别:桌面是否“整理干净/未整理完”。
  • 抓取可行性:当前抓取姿态是“可抓取 / 不可抓取”。
  • 障碍物类型分类:行人 / 桌子 / 箱子 / 墙面等。

常用损失:交叉熵

对于单标签多分类,标准损失为交叉熵:

\[ \mathcal{L}(\theta)=-\frac{1}{N}\sum_{i=1}^N \sum_{c=1}^C \mathbf{1}(y_i=c)\log \hat{p}_{i,c} \]

与前面在深度学习章节中出现的交叉熵损失是一致的,只是这里强调其在一般分类问题中的意义。(Google for Developers)


1.4.1.3 输入特征与模型输出的关系

监督学习的基本设定

给定训练数据集 \(\mathcal{D}=\{(\mathbf{x}_i,y_i)\}_{i=1}^N\),我们假设存在某个未知的“真实函数”:

\[ y = f^*(\mathbf{x}) + \epsilon \]

其中 \(\epsilon\) 是噪声或未建模因素。模型的目标就是在一个预先选好的“假设空间”(例如线性函数、决策树、神经网络等)内,找到一个 \(f_\theta\) 尽量逼近 \(f^*\)。

  • 输入 \(\mathbf{x}\) 称为特征:可以是原始传感器读数(图像像素、关节角度),也可以是经过预处理的高层特征(PCA 主成分、CNN 的特征向量等)。
  • 输出 \(\displaystyle y\) 是我们关心的目标(回归中的数值,分类中的类别)。

经验风险最小化

大多数监督学习算法可以统一理解为经验风险最小化(ERM)

\[ \hat{\theta} = \arg\min_\theta \frac{1}{N}\sum_{i=1}^N \ell(f_\theta(\mathbf{x}_i), y_i) \]

其中 \(\ell(\cdot,\cdot)\) 是合适的损失函数(回归用 MSE,分类用交叉熵等)。(科学导向)

在具身智能场景中,这种“输入特征 \(\to\) 输出预测”的监督学习模块,往往嵌在更大系统中(如用于状态估计、成功预测),与后续的规划或强化学习协同工作。


1.4.2 过拟合、欠拟合与偏差–方差权衡

仅靠在训练集上“把损失压到很低”并不等于模型就好用。真正重要的是:在未见过的新数据上的表现——即泛化能力。(bmc.com)


1.4.2.1 过拟合

现象

  • 模型在训练集上的损失很低,准确率很高;
  • 但在验证集/测试集上表现显著变差。

这说明模型不仅学到了有用规律,还记住了训练数据中的噪声和偶然性模式。在机器人场景中,这常表现为:在实验台上训练得很好,换一个桌面或灯光条件就“智商骤降”。(Interview Coder)

典型原因

  • 模型过于复杂(参数太多、结构太灵活),相对训练数据量而言容量过大。
  • 训练轮数太多,在训练集上“磨”过头。
  • 特征维度远大于样本数,模型可以用复杂组合记住具体样本。

【可插图:横轴为模型复杂度,画出训练误差持续下降,而验证误差先下降后上升的两条曲线,说明过拟合区域。】


1.4.2.2 欠拟合

现象

  • 模型在训练集和测试集上表现都不好(误差都很大)。
  • 换用更复杂的模型或加入更多有用特征后,训练误差和测试误差都会明显下降。

这是因为模型过于简单,表达能力不足,无法捕捉数据内在规律,称为高偏差情形。(geeksforgeeks.org)

在具身智能中,例如你用一个简单的线性模型预测高度非线性的机械臂动力学,结果就是无论如何调参都拟合不好——典型欠拟合。


1.4.2.3 偏差–方差权衡

误差分解直觉

可以将预测误差(例如 MSE)拆成三部分: “不可约噪声 + 偏差² + 方差”,其中:(bmc.com)

+偏差(Bias):模型“平均”预测与真实函数 \(f^*\) 的系统性偏离,反映模型是否“想错了问题”。

  • 模型太简单 → 高偏差。 +方差(Variance):因训练数据不同(采样不同)导致模型预测波动的程度。
  • 模型太复杂 → 容易对数据的小扰动反应剧烈 → 高方差。

权衡

  • 提高模型复杂度:偏差下降,但方差上升(更容易过拟合)。
  • 降低模型复杂度:方差下降,但偏差上升(更容易欠拟合)。

目标是在某个适中复杂度处,使二者综合导致的测试误差最小。这就是偏差–方差权衡的核心。(compneuro.neuromatch.io)

【可插图:三条曲线——偏差²随模型复杂度单调下降,方差单调上升,总测试误差呈 U 形,最低点对应最优复杂度。】

在具身机器人中,这个权衡尤其关键:

  • 过于复杂的模型在真实机器人数据有限的情况下几乎必然过拟合;
  • 过于简单的模型又无法应对复杂接触动力学和视觉变化。

后续我们会通过正则化、早停、交叉验证等手段,在工程上实现这种权衡。


1.4.3 正则化(L1/L2)、早停与交叉验证

这一节可以理解为:如何在实践中与过拟合打“持久战”


1.4.3.1 L1/L2 正则化

基本思想

在经验风险最小化的目标函数中加入对参数大小的惩罚项,鼓励模型“更简单”、参数“更小”,从而降低方差、提升泛化能力。(Built In)

给定原始损失 \(\mathcal{L}_0(\theta)\),加正则化后变为:

\[ \mathcal{L}(\theta) = \mathcal{L}_0(\theta) + \lambda \Omega(\theta) \]

其中 \(\lambda\) 控制惩罚强度。

L2 正则化(Ridge)

\[ \Omega_{L2}(\theta) = |\theta|_2^2 = \sum_j \theta_j^2 \]

特点:

  • 倾向将所有参数“缩小”但不变为 0。
  • 对异常值更敏感。
  • 在许多线性模型、深度学习中非常常用(权重衰减)。(Medium)

L1 正则化(LASSO)

\[ \Omega_{L1}(\theta) = |\theta|_1 = \sum_j |\theta_j| \]

特点:

  • 更倾向把一部分参数直接压到 0,产生稀疏解,起到类似“自动特征选择”的作用。
  • 对异常值更鲁棒。(neptune.ai)

在机器人应用中,L1 可用于从大量传感器特征中“自动挑出更重要的一小部分”;L2 更适合作为通用的稳定化手段。

【可插图:二维参数空间中,L2 约束是圆,L1 约束是菱形,展示为什么 L1 更容易压出稀疏解(交点落在坐标轴上)。】


1.4.3.2 早停策略

早停(Early Stopping)是深度学习中最实用的“隐式正则化”之一,本质思想非常简单:

  1. 将数据分为训练集与验证集。
  2. 训练过程中监控验证集的损失或评价指标。
  3. 一旦发现验证性能在若干轮内不再提升,甚至开始变差,就停止训练,并回滚到验证集性能最好的那一轮的模型参数。(Interview Coder)

从偏差–方差的角度看:

  • 前期训练:模型偏差快速下降,方差还不高;
  • 后期训练:模型开始对训练集噪声“死磕”,方差明显上升,验证误差反而上升。

早停把学习过程“截断”在最佳点附近,相当于对参数大小施加了一种时间维度上的约束,可以视作一种正则化。

在具身机器人系统训练中,早停尤其常用,因为:

  • 真实数据很贵,不希望过拟合少量轨迹;
  • 训练时间长,多跑几轮意味着真实机器人磨损和风险增加。

1.4.3.3 交叉验证

核心目的:更可靠地评估模型与超参数

单次划分训练/验证集往往运气成分大。**交叉验证(Cross-Validation)**通过多次划分并平均结果,得到更稳健的性能估计。(RCAC)

K 折交叉验证(K-fold CV)

  1. 将数据随机划分为 K 个大小近似相等的子集。
  2. 每次选其中 1 折作为验证集,其余 K-1 折作为训练集,训练并评估模型。
  3. 循环 K 次,K 个验证结果取平均,作为这个模型/超参数的最终评价。

留一交叉验证(LOO CV)

  • 特殊情况:K = N,每次只留出 1 个样本做验证,其余 N-1 个样本训练。
  • 理论上偏差很小,但计算开销极大。

交叉验证常用于:

  • 比较不同模型(如线性回归 vs 带核的 SVM);
  • 搜索正则化系数 \(\lambda\)、核函数参数等超参数的“最佳组合”。

在具身智能项目中,由于收集到的数据往往结构复杂(多机器人、多任务),可以按任务或场景划分折,从而评估模型的任务泛化能力,而不仅仅是随机样本的泛化。

【可插图:把数据集切成 K 份的小块,依次轮流作为验证集的示意图。】


1.4.4 核方法与高维特征空间直觉

当数据在原始特征空间中非线性可分时,我们可以尝试将它映射到一个更高维的空间,使其线性可分,然后再在该空间里做线性模型。这就是核方法背后的核心直觉。(维基百科)


1.4.4.1 核技巧

假设有一个显式特征映射:

\[ \phi: \mathcal{X} \to \mathcal{H} \]

将原始输入 \(\mathbf{x}\) 映射到高维(甚至无限维)特征空间 \(\mathcal{H}\)。在该空间中,我们做的是线性模型,例如线性分类或线性回归。

问题在于:\(\phi(\mathbf{x})\) 可能极高维,显式计算代价巨大

核技巧(Kernel Trick)利用如下事实:许多线性算法只依赖于数据点之间的内积\(\phi(\mathbf{x}_i)^\top\phi(\mathbf{x}_j)\)。如果我们找到一个函数 \(\displaystyle K\) 使得:(维基百科)

\[ K(\mathbf{x}_i,\mathbf{x}_j) = \phi(\mathbf{x}_i)^\top\phi(\mathbf{x}_j) \]

那么就可以直接在原空间计算 \(K(\mathbf{x}_i,\mathbf{x}_j)\),而不必显式计算 \(\phi(\mathbf{x})\) 本身,从而“隐式地”在高维空间里做线性学习——这就是核技巧。

【可插图:左边是原空间中无法线性分开的红蓝点;右边是高维特征空间中被超平面分开的示意,中间标注“\(\phi(x)\)”与“\(K(x,x')\)”的关系。】


1.4.4.2 常见核函数

常用核函数包括:(维基百科)

1.线性核

\[ K(\mathbf{x},\mathbf{z}) = \mathbf{x}^\top\mathbf{z} \]

对应没有显式映射(\(\phi\) 为恒等映射),即普通线性模型。 2.多项式核(Polynomial Kernel)

\[ K(\mathbf{x},\mathbf{z}) = (\gamma \mathbf{x}^\top\mathbf{z} + r)^d \]

  • 参数 \(\displaystyle d\) 控制多项式次数,\(\displaystyle r\) 是偏置项,\(\gamma\) 控制尺度。
  • 对应在高维空间里包含各种单项式组合(如 \(x_1^2x_2\) 等)。 3.高斯核 / RBF 核(Radial Basis Function)

\[ K(\mathbf{x},\mathbf{z}) = \exp\left(-\frac{|\mathbf{x}-\mathbf{z}|^2}{2\sigma^2}\right) \]

  • \(\sigma\) 控制“影响范围”。
  • 对应于无限维特征空间,具有很强的非线性拟合能力。

在机器人具身智能中,核方法可以用于:

  • 在低维状态特征上构造非线性回归模型(如动力学、接触力预测);
  • 在有限训练数据下构建较强的非线性分类器(如“可抓取 vs 不可抓取”)。

1.4.4.3 支持向量机中的核方法

线性 SVM 回顾

支持向量机(SVM)是一类通过最大化分类间隔来获得鲁棒决策边界的监督学习方法,可用于分类与回归。其线性版在特征空间中学习一个超平面:(Particle Data Group)

\[ f(\mathbf{x}) = \text{sign}(\mathbf{w}^\top\mathbf{x} + b) \]

训练目标可以写成仅依赖于样本之间的内积 \(\mathbf{x}_i^\top\mathbf{x}_j\)。

核 SVM

将内积替换为核函数:

\[ \mathbf{x}_i^\top\mathbf{x}_j \quad \Rightarrow \quad K(\mathbf{x}_i,\mathbf{x}_j) \]

得到的就是核 SVM。它等价于:

  • 首先用 \(\phi\) 将数据映射到高维空间;
  • 然后在该空间里寻找最大间隔的线性超平面。

优点在于我们从未显式构建高维特征,只是通过核函数计算内积。(Cross Validated)

在具身智能早期研究中(尤其在深度学习尚未主导的时期),核 SVM 曾是处理中小规模机器人数据(如力觉分类、简单视觉识别)的经典选择。即使在深度学习时代,核方法仍为理解高维特征空间和相似度度量提供重要直觉基础。


1.4.5 评价指标(准确率、精确率、召回率、AUC 等)

训练好模型之后,需要用统一、可比较的评价指标量化其性能,尤其在类别不平衡、错误代价不对称的场景中,仅看“准确率”会非常误导。(Google for Developers)

我们先从二分类的混淆矩阵讲起。

混淆矩阵

以“正类 = 机器人成功抓取”的二分类为例,模型输出“抓取/不抓取”,与真实标签对比得到四种情况:

  • TP(True Positive):真实成功,预测也成功。
  • FN(False Negative):真实成功,但预测失败(错杀)。
  • FP(False Positive):真实失败,但预测成功(误报)。
  • TN(True Negative):真实失败,预测也失败。

所有衡量指标都可以用 TP, FP, TN, FN 表达。


1.4.5.1 准确率

定义

\[ \text{Accuracy} = \frac{TP + TN}{TP + TN + FP + FN} \]

即预测正确的样本占总样本的比例。(Google for Developers)

适用场景

  • 类别相对均衡,且正负样本的重要性相近。
  • 比如机器人在大量正常状态与异常状态中识别异常,其中两类比例相近时,可直接用准确率。

局限性

高度不平衡数据集上(如异常率 1%),模型只要“全部预测为负类”,准确率也能达到 99%——显然毫无实际意义。因此在具身智能的安全相关任务(异常检测、碰撞预测)中,准确率通常不足以单独使用。(Jinwoo’s Devlog)


1.4.5.2 精确率与召回率

精确率(Precision)

\[ \text{Precision} = \frac{TP}{TP + FP} \]

表示:模型预测为“正类”的样本中,有多少是真的正类。精确率高意味着误报少。(Google for Developers)

召回率(Recall)

\[ \text{Recall} = \frac{TP}{TP + FN} \]

表示:真实为正类的样本中,有多少被模型找出来。召回率高意味着漏报少。(Google for Developers)

在具身智能中的典型权衡:

  • 机器人抓取任务中,“抓空/掉落”带来中等损失,“误抓危险物体”带来巨大损失时,可能希望高精确率(预测要谨慎)。
  • 安全监控或异常检测任务中,更重要的是不要漏检危险情况,往往更关注高召回率

F1 分数(可简单提一下)

为了在单个数值中综合考虑精确率和召回率,可以使用 F1:

\[ F1 = 2\cdot\frac{\text{Precision}\cdot\text{Recall}}{\text{Precision}+\text{Recall}} \]

当精确率与召回率相近且都较高时,F1 也会高;两者有一者很低时,F1 会被拉低。(Google for Developers)


1.4.5.3 ROC 曲线与 AUC

许多分类模型(如逻辑回归、神经网络)并不是直接给出“正/负”标签,而是给出“属于正类的概率”或“得分”。我们通过设置一个阈值(例如 0.5)将概率转为类别。改变阈值就会改变 TP、FP、TN、FN,从而改变精确率与召回率。

ROC 曲线

ROC(Receiver Operating Characteristic)曲线以:(Jinwoo’s Devlog)

  • 横轴:假正例率

\[ \text{FPR} = \frac{FP}{FP + TN} \]

  • 纵轴:真正例率(也就是召回率)

\[ \text{TPR} = \frac{TP}{TP + FN} \]

为不同阈值下得到的一系列点连成的曲线。

直观理解:

  • 随着阈值从 1 降到 0,模型会把越来越多样本判为正类,TPR 和 FPR 都会增加。
  • 一个完美分类器的 ROC 曲线接近左上角(高 TPR,低 FPR)。
  • 完全随机的分类器 ROC 曲线接近对角线(TPR≈FPR)。

AUC(Area Under ROC Curve)

AUC 是 ROC 曲线下的面积,介于 0 和 1 之间:(Jinwoo’s Devlog)

  • AUC = 0.5:与随机猜测差不多。
  • AUC → 1:越接近完美分类器。

一个重要解释是:AUC 等于“随机抽取一个正样本和一个负样本时,模型给正样本的得分高于负样本的概率”。

在具身智能中的使用建议

  • 二分类任务(例如“当前姿态是否危险”、“当前轨迹是否会导致碰撞”)中,常用 ROC-AUC 来衡量模型区分正负样本的整体能力。
  • 当正负样本极度不平衡且我们更关心正类行为(如少数危险情况),PR 曲线(Precision-Recall Curve)及其面积 PR-AUC往往更敏感,也值得在后续深入任务时使用。(Jinwoo’s Devlog)

【可插图:展示一个典型的 ROC 曲线(良好模型曲线高于随机对角线),并标注 AUC 区域;可以附一个简单的 PR 曲线对比。】


到这里,1.4 节从“基本监督学习任务设定(回归和分类)”出发,讨论了模型复杂度与泛化的偏差–方差权衡,并引出了控制复杂度的工具(正则化、早停、交叉验证),以及用于评价模型好坏的一整套指标体系。 在后续深度学习章节中,这些概念会以更复杂的形式再次出现——但本节提供的直观图景将持续作为理解更高级方法的“坐标系”。

本章小结与自测

三行小结

  1. 本章提供后续全部模型章节的数学地基。
  2. 重点是把符号、公式和几何/概率直觉对应起来。
  3. 学完后应能独立检查推导与实现中的维度和假设。

检查题

  1. 用你自己的话总结本章最核心的一个公式/机制。
  2. 给出一个“如果要落地到项目里,你会怎么用”的具体例子。

常见误区

  1. 只背公式,不检查适用条件。
  2. 忽略维度一致性。
  3. 把符号记忆当成理解。

公式到代码(最小示例)

import numpy as np

x = np.array([1.0, 2.0, -1.0])
y = np.array([0.5, -1.0, 3.0])
inner = float(x @ y)
norm_x = float(np.linalg.norm(x, ord=2))
print(inner, norm_x)

本章外部参考(集中)

  1. Google for Developers
  2. 科学导向
  3. bmc.com
  4. Interview Coder
  5. geeksforgeeks.org
  6. compneuro.neuromatch.io
  7. Built In
  8. Medium
  9. neptune.ai
  10. RCAC
  11. 维基百科
  12. Particle Data Group
  13. 本章其余链接可在正文中按上下文继续查阅。

1.5 推荐阅读与资源

1.5 推荐阅读与资源

本章从零开始勾勒了线性代数、概率统计、优化与基础机器学习的“最小必需集合”。 但要在具身智能与 VLA 方向真正做到能读论文、能推公式、能写代码、能做实验,仅靠本书的篇幅仍然略显紧凑。

因此,这里推荐三类强相关的配套资源:

  • 一本偏统计机器学习理论的中文书;
  • 一条线性代数 / 数值线性代数的进阶路径;
  • 一门成体系的机器学习公开课。

它们与本书的关系大致可以理解为:

本书:给出结构化主线与机器人应用视角 推荐资源:在“理论深度”和“练习密度”上进行补强

【图片占位:学习资源结构图——中间是“本书”,周围连出三条箭头: ① 指向《统计学习方法》(补充 1.2/1.4 的统计学习理论); ② 指向《Matrix Computations》/《Linear Algebra and Learning from Data》(补充 1.1/1.3 的线性代数与数值方法); ③ 指向 Stanford CS229(将本书第 1 章内容串联成一门完整 ML 课程)。】

下面分别说明每个资源适合在什么时候读、怎么读、和本书哪个部分形成互补


1.5.1 《统计学习方法》

学习导航

  • 本章主题:1.5.1 《统计学习方法》
  • 前置知识:高中/本科数学基础(线代、概率、微积分)。
  • 建议用时:43-63 分钟
  • 阅读顺序:先看概念框架,再看公式/代码,最后做自测。

基本信息与定位

《统计学习方法》(李航,清华大学出版社)是国内机器学习领域极为常用的一本教材,目前已有第二版,被许多高校作为“机器学习原理”课程主教材使用。(东南大学信息科学与工程学院)

它的特点可以概括为:

+理论导向:以统计学习理论为主线,强调“概率模型 + 损失函数 + 经验风险 / 结构风险最小化”这一统一框架; +覆盖经典算法:感知机、k 近邻、朴素贝叶斯、决策树、逻辑回归 / 最大熵、支持向量机、提升方法、EM、HMM、CRF 等; +公式推导完整:绝大多数算法都从“问题设定 → 目标函数 → 优化方法 → 性质”系统展开,非常适合练习看懂和推导公式。

这些内容与本书第1.2 节(概率与统计基础)1.3 节(优化)、**1.4 节(机器学习基础)**互相呼应:本书给的是“概念地图”和机器人视角,《统计学习方法》给的是“严格数学版的细节”。


建议的阅读顺序与对应关系

如果你已经读完本书第 1 章,建议按下面顺序局部精读,而不是从头到尾机械通读:

1.“统计学习方法概论”章节

  • 对应本书 1.4 整体框架:监督学习、经验风险最小化、结构风险最小化、泛化能力等概念。
  • 阅读目标:把“机器学习 = 拟合一个函数”的朴素印象,升级为“机器学习 = 在假设空间中寻找经验风险 / 结构风险最小的函数”的统计学习观。 2.线性模型与判别模型相关章节(如感知机、逻辑回归、最大熵模型)
  • 与本书1.4.1 回归与分类1.4.2 过拟合与偏差–方差、以及第 2 章的神经网络基础直接对应。
  • 阅读时可以刻意关注:
    • 损失函数是如何从概率模型中导出的(例如对数似然 → 对数损失 / 交叉熵);
    • 正则化项如何自然出现(先验 + MAP → L1/L2 正则)。
  • 这些内容读懂之后,再回看本书 1.3、1.4,会发现损失与正则化其实一直是“同一个故事”的不同侧面。 3.支持向量机与核方法章节
  • 与本书1.4.4 核方法与高维特征空间直觉紧密对应。
  • 建议阅读方式:
    • 先看“几何直觉”:间隔最大化、支持向量;
    • 再看“对偶问题与核技巧”:如何把高维特征空间的点积“藏进”核函数中。
  • 这一部分对于理解后续 VLA 模型中“高维表示空间”的直觉非常有帮助。 4.EM、HMM、CRF 等章节
  • 与本书后续关于概率图模型、序列建模(特别是机器人任务中的状态估计与时序决策)遥相呼应。
  • 这些方法在现代深度模型中常以“隐含结构”形式出现,理解它们会让你在阅读更复杂的模型(如带隐变量的世界模型)时不至于“只看结论”。

如何利用本书 +《统计学习方法》联合学习

一个比较实用的学习节奏是:

1.先看本书某一小节,获取“概念树”和“在机器人场景下为何需要它”的直觉; 2.再在《统计学习方法》中对照阅读对应算法章节,专注于:

  • 公式每一项的含义;
  • 优化目标与梯度 / 对偶问题的关系;
  • 与泛化误差、偏差–方差的联系;
  1. 最后回到本书的习题或后续章节,在仿真或真实机器人项目中实现 / 调用这些算法。

如此循环几轮,你会逐渐形成:看到一个新模型 → 能够迅速抽象为“统计学习方法”框架的能力,这对后续阅读具身智能 / VLA 论文非常关键。


1.5.2 《Matrix Computations》 或 《Linear Algebra and Learning from Data》

本书第 1.1 节对线性代数只做了“最必要”的回顾:向量空间、特征值与 SVD 等。 在具身智能和 VLA 研究中,线性代数还有两个常被忽视但极其重要的方面:

1.**数值计算层面:**矩阵算法在计算机中究竟是如何实现的、它们为什么稳定或不稳定; 2.**与机器学习的结合层面:**深度学习、压缩感知、低秩近似等现代工具,本质上都是线性代数思想的延伸。

下面这两本书各自从这两个方向对本书做补强。


(1)《Matrix Computations》——数值线性代数的“算法圣经”

《Matrix Computations》(Gene H. Golub & Charles F. Van Loan)是数值线性代数领域的经典教材,对线性方程组、最小二乘问题和特征值问题的数值算法做了系统而深入的总结,被广泛视为计算科学和工程领域的必备参考书。(约翰霍普金斯大学出版社)

适合解决的问题

  • 当你开始关心“矩阵分解在计算机里到底是怎么算的”;
  • 当你需要理解数值稳定性、条件数、舍入误差对算法的影响;
  • 当你在仿真或机器人控制中遇到数值发散、线性系统求解不稳定时。

与本书的衔接

  • 与本书1.1 线性代数基础: 本书强调“概念与几何直觉”,《Matrix Computations》强调“算法与误差分析”; 例如:LU 分解、QR 分解、SVD,在这里会从算法步骤、复杂度、稳定性等角度彻底展开。
  • 与本书1.3 优化基础、以及后面涉及最小二乘、最小范数解、低秩近似的内容一一对应:
    • 如何在数值上稳健地解最小二乘问题;
    • 如何实现高效的迭代方法解决大规模线性系统。

阅读建议

由于本书面向具身智能方向,不要求你把整本《Matrix Computations》精读完,可以采取“按需查阅 + 局部精读”的策略,例如:

  • 重点关注线性方程组、最小二乘与 QR / SVD 相关章节;
  • 遇到数值问题时,将其当作“字典”查表,看某种矩阵问题推荐使用哪类算法。

(2)《Linear Algebra and Learning from Data》——线代与现代机器学习的桥梁

Gilbert Strang 的《Linear Algebra and Learning from Data》将传统线性代数与现代数据科学、深度学习联系起来,整本书围绕“如何用线性代数视角理解数据与学习算法”展开。(麻省理工学院数学)

从目录可以看到,它一方面涵盖了经典内容(四个基本子空间、SVD、矩阵分解等),另一方面专门讨论了大矩阵计算、压缩感知以及深度学习等主题。(麻省理工学院数学)

适合解决的问题

  • 希望用统一的线性代数语言理解: 线性回归、主成分分析、正则化、低秩近似、神经网络中的矩阵运算等;
  • 希望知道“为什么线性代数是机器学习的骨架”,而不仅仅把它当作“会算题目”的课程。

与本书的衔接

  • 与本书1.1 线性代数基础1.4 机器学习基础直接互补: 例如,本书提到的 PCA、SVD 在 Strang 的书中会配合更多几何图示和实例;
  • 与本书2 章深度学习基础、以及后面 VLA 模型中“表示空间、低秩近似、注意力的矩阵形式”等内容理念一致: 你会更容易把深度模型的运算看成是矩阵 / 张量操作的堆叠,而不是一堆“黑盒”。

推荐的阅读顺序

如果你计划系统阅读,可参考如下顺序:

  1. 先结合本书1.1,阅读该书的线性代数基础部分(如 Ax 的几种理解、四个基本子空间、LU 分解等);(麻省理工学院数学)
  2. 再在本书1.4/2 章学习相关算法之后,回头看书中关于 PCA、压缩感知、深度学习的章节,强化对“矩阵视角下的机器学习”的理解;(亚马逊)
  3. 对数值问题有兴趣时,再从这里自然过渡到《Matrix Computations》的算法细节。

两本书如何取舍?

  • 若你目前主要目标是打通“线代–机器学习”的理解链路,更推荐优先读 Strang 的《Linear Algebra and Learning from Data》;
  • 若你已经开始写数值算法 / 控制算法代码,或者在仿真中频繁遇到数值问题,则可以逐步引入《Matrix Computations》作为工具书。

1.5.3 Stanford CS229 机器学习公开课

Stanford CS229 是斯坦福大学经典的研究生级机器学习课程,由 Andrew Ng 等人主讲,提供了系统的课程视频、讲义和课后作业,对监督学习、无监督学习、核方法、神经网络以及强化学习等内容进行较为完整的讲解。(cs229.stanford.edu)

从官方课程描述可以看到,它的核心内容与本书第 1 章高度重合:线性回归、逻辑回归、神经网络、SVM、聚类、降维、核方法、强化学习等,是本书所述基础知识的一条“课程化实现”。(cs229.stanford.edu)


为什么推荐 CS229

1.系统性强 本书在第 1 章以“知识点”为单位组织;CS229 则以“课程节次”为单位,把这些知识点串成一条完整的学习路径,有利于你建立“整门课”的时间线和节奏感。 2.配套资料丰富

  • 公开的讲义(lecture notes)对很多算法进行了严格推导,是极好的公式练习素材;(cs229.stanford.edu)
  • 视频课程可以帮助你在“推导细节看不懂”时,通过教师的口头解释获取直觉。(YouTube) 3.要求的数学背景与本书契合 CS229 被普遍认为是一门“偏理论”的课程,需要一定的线性代数、概率论和多元微积分基础。(csdiy.wiki) 这恰好与本书第 1 章的定位一致:只要你按照本书 1.1–1.3 的要求打好基础,就已经具备了啃 CS229 的数学条件。

如何将 CS229 与本书结合

可以将 CS229 看作是本书第 1 章的“扩展实验课”,建议采用如下配合方式:

+第一轮:本书为主,CS229 为辅 先按照本书章节顺序学习:

  • 在阅读完本书1.4 机器学习基础后,选择性观看 CS229 中关于线性 / 逻辑回归、SVM、神经网络、偏差–方差与正则化的讲座;(cs229.stanford.edu)
  • 重点在于听懂问题设定与公式推导思路,而不必强求每一处证明都完全掌握。 +第二轮:CS229 为主,本书为“导航 + 补充” 当你开始正式做机器学习 / 具身智能的课程项目或科研时,可以完整跟一遍 CS229:
  • 以课程讲义和作业为主线;
  • 本书第 1 章作为“索引”和“简化注解”:遇到不熟悉的数学 / 概念,可快速翻回本书对应小节回顾直觉与定义;
  • 在强化学习与自适应控制部分,与本书第 5 章内容形成前后呼应。(cs229.stanford.edu) +第三轮:带着机器人问题回头看 当你进入 VLA、模仿学习或机器人控制的研究阶段,再回看 CS229 的相关章节(尤其是核方法、正则化、偏差–方差、EM、强化学习等),会更清楚这些“基础课上的理论”在机器人任务中分别扮演什么角色。

小结:本书与三类资源在学习路径中的位置

+第 0~1 章 + 本书整体:提供具身智能 / VLA 视角下的数学与机器学习“骨架”; +《统计学习方法》:把 1.2 / 1.4 中的统计学习理论“加厚”,帮助你真正掌握公式推导和理论框架; +《Matrix Computations》 & 《Linear Algebra and Learning from Data》:从数值算法与线性代数–数据科学的结合两个方向,补全 1.1 / 1.3 的深度; +CS229:把这些知识组织成一门逻辑严密的课程,通过作业和项目推动你真正“会用”。

在后续章节,我们会逐步进入深度学习、视觉、语言、强化学习以及 VLA 模型的细节; 当你在后面遇到任何“数学或机器学习基础不够扎实”的时刻,都可以回到本书第 1 章,并借助本节列出的资源向下钻研一层,使你的理论根基足以支撑具身智能这个长期而复杂的研究方向。

本章小结与自测

三行小结

  1. 本章提供后续全部模型章节的数学地基。
  2. 重点是把符号、公式和几何/概率直觉对应起来。
  3. 学完后应能独立检查推导与实现中的维度和假设。

检查题

  1. 用你自己的话总结本章最核心的一个公式/机制。
  2. 给出一个“如果要落地到项目里,你会怎么用”的具体例子。

常见误区

  1. 只背公式,不检查适用条件。
  2. 忽略维度一致性。
  3. 把符号记忆当成理解。

公式到代码(最小示例)

import numpy as np

x = np.array([1.0, 2.0, -1.0])
y = np.array([0.5, -1.0, 3.0])
inner = float(x @ y)
norm_x = float(np.linalg.norm(x, ord=2))
print(inner, norm_x)

本章外部参考(集中)

  1. 东南大学信息科学与工程学院
  2. 约翰霍普金斯大学出版社
  3. 麻省理工学院数学
  4. 麻省理工学院数学
  5. 亚马逊
  6. cs229.stanford.edu
  7. cs229.stanford.edu
  8. YouTube
  9. csdiy.wiki
  10. cs229.stanford.edu

2.1 神经网络基本结构

2.1 神经网络基本结构

本节从最经典的感知机出发,逐步推导出现代深度学习中广泛使用的前馈神经网络(MLP),并系统讨论激活函数、损失函数以及反向传播与自动求导。这一部分是后续卷积网络、Transformer、VLA 模型的“通用底层语法”。


2.1.1 感知机与前馈神经网络

学习导航

  • 本章主题:2.1.1 感知机与前馈神经网络
  • 前置知识:建议先完成第 1 章核心内容。
  • 建议用时:92-112 分钟
  • 阅读顺序:先看概念框架,再看公式/代码,最后做自测。

关键图示:神经网络训练闭环

关键图示:神经网络训练闭环

2.1.1.1 感知机模型

感知机(Perceptron)是最早的人工神经元模型之一,用于二分类问题。形式非常简单:对输入向量做一次线性加权求和,然后通过一个阈值函数决定输出类别。(维基百科)

设输入为 \(x \in \mathbb{R}^d\),权重为 \(w \in \mathbb{R}^d\),偏置为 \(b \in \mathbb{R}\),则感知机的输出为

\[ f(x) = h(w^\top x + b), \]

其中 \(h(\cdot)\) 通常取阶跃(Heaviside step)函数:

\[ h(a) = \begin{cases} 1, & a > 0,[4pt] 0, & a \le 0. \end{cases} \]

几何上,\(w^\top x + b = 0\) 是输入空间中的一个超平面,感知机就是“问:样本在超平面的哪一侧?”。因此它是一个线性分类器,只能解决线性可分的二分类问题,例如 AND、OR,但无法解决 XOR 这样的非线性问题。(Cross Validated)

感知机的学习(经典的感知机学习算法)就是不断调整 \((w,b)\),使训练集中正负样本最终被这个超平面正确分开——只要数据线性可分,经典感知机算法可以在有限步内收敛。(维基百科)

【图 2-1 占位】 感知机结构示意图:左侧若干输入节点 \(x_1,\dots,x_d\),连接到一个神经元,中间标出权重 \(w_i\),节点内部显示加权和 \(\sum w_i x_i + b\),右侧是经阶跃函数后输出 0/1。

在具身智能/机器人中,单个感知机本身不常直接使用,但它是理解更复杂神经网络的基石:你可以把它看作“最小决策单元”。


2.1.1.2 前馈神经网络(MLP)

感知机只有一层线性变换 + 非线性,不足以表达复杂模式。为此,人们自然想到:把很多这样的“神经元”堆叠起来——于是就有了多层前馈神经网络(Multilayer Perceptron, MLP)。(Take heed : 개발 블로그)

前馈网络的典型结构:

  • 输入层:接收原始特征,例如图像像素、机器人关节状态、传感器读数等。
  • 若干隐藏层:每一层都是仿照感知机的线性变换 + 激活函数。
  • 输出层:给出回归值、类别概率或动作命令等。

以两层 MLP(1 个隐藏层)为例:

\[ \begin{aligned} h &= \sigma(W_1 x + b_1), y &= \phi(W_2 h + b_2), \end{aligned} \]

其中

  • \(x \in \mathbb{R}^{d_{\text{in}}}\):输入;
  • \(h \in \mathbb{R}^{d_{\text{hidden}}}\):隐藏层表示;
  • \(\displaystyle y\):输出;
  • \((W_1, W_2)\)、\((b_1, b_2)\) 为可学习参数;
  • \(\sigma(\cdot)\) 是隐藏层激活函数(如 ReLU、GELU);
  • \(\phi(\cdot)\) 是输出层激活函数(如恒等、sigmoid 或 softmax,视任务而定)。

所有层的连接方向从输入到输出,没有回路,所以称为“前馈(feedforward)”。

【图 2-2 占位】 两层 MLP 拓扑图:输入层若干节点,经全连接到隐藏层,再全连接到输出层,用箭头表示信息单向流动。

在机器人具身智能系统中,MLP 通常扮演以下角色:

  • 视觉 backbone 后面的决策头(policy head):将高维视觉特征映射为动作参数。
  • 强化学习中的价值函数 / Q 函数近似器
  • 动力学模型或世界模型中的局部近似模块,将状态映射到下一状态或奖励。

2.1.1.3 表示能力

为什么 MLP 如此重要?关键是它的函数逼近能力

**通用逼近定理(Universal Approximation Theorem)**表明:在较宽的条件下,具有非多项式激活函数(如 sigmoid、ReLU)的一隐藏层前馈网络,可以以任意精度逼近定义在紧致集合上的任意连续函数。(维基百科)

直观地讲:

  • 每个隐藏层神经元可以看作一个“小基函数”,例如某个方向上的“台阶”或“拐点”;
  • 通过线性组合足够多的这样的基函数,就能构造出形状非常复杂的曲线和曲面;
  • 因此,只要隐藏单元足够多,MLP 在理论上可以表示任意复杂的输入–输出映射。

从工程角度:

+宽度(隐藏单元个数)决定单层网络能表示多复杂的函数; +深度(层数)允许网络通过逐层组合,产生更高层次、更结构化的特征,很多研究表明“适度加深”比“无限加宽”更高效。(维基百科)

但要注意: 通用逼近定理只是“存在性定理”,它告诉我们“有某个参数配置”能做到,并不保证我们一定能通过有限数据和有限训练时间找到那个最好配置。这正是前面第 1 章中优化与泛化问题的现实版本。

在具身智能场景里,这个理论给我们信心:只要模型结构合理、数据与训练方法得当,一个足够大的前馈网络有能力学会从机器人多模态观测到高质量控制命令的映射


2.1.2 激活函数(ReLU、GELU 等)及其性质

2.1.2.1 常见激活函数

激活函数决定了神经元如何“非线性响应”输入。如果没有激活函数(或者只用线性函数),整个网络退化为一层线性变换,无法表示复杂关系。常见激活函数包括:sigmoid、tanh、ReLU、GELU、SiLU 等。(geeksforgeeks.org)

1.Sigmoid(S 形函数)

\[ \text{sigmoid}(x) = \frac{1}{1 + e^{-x}}. \]

  • 输出范围 \(\displaystyle (0,1)\),早期常用于二分类输出。
  • 曲线在 0 附近较陡,两端(正/负无穷)趋近于 1 和 0。
  • 大输入绝对值区域梯度接近 0,深层网络中容易产生梯度消失

2.Tanh(双曲正切)

\[ \tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}}, \]

输出范围 \(\displaystyle (-1,1)\),形状与 sigmoid 相似,但是零中心的。相比 sigmoid,在某些场景下收敛更快,但同样存在饱和区梯度很小的问题。

3.ReLU(Rectified Linear Unit)

\[ \text{ReLU}(x) = \max(0, x). \]

  • \(x\le 0\) 时输出 0;\(x>0\) 时保持线性。
  • 计算简单,梯度在正半轴为 1,在负半轴为 0。
  • 在深度网络中表现良好,是目前最常用的激活函数之一。(维基百科)

4.GELU(Gaussian Error Linear Unit)

GELU 大致形状类似一个平滑的“软 ReLU”:对较小或负的输入输出接近 0,对较大的输入近似线性;它的精确表达式可写为与高斯累积分布相关的形式。GELU 在 Transformer 等大模型中被广泛采用,被认为在某些任务上比 ReLU 有更好的性能和更平滑的梯度性质。(Medium)

5.SiLU / Swish 等平滑 ReLU 变体

SiLU(Sigmoid Linear Unit)、Swish 等也是近年常用的激活函数,在负半轴有小的负输出,在正半轴近似线性,兼具平滑与非线性。

【图 2-3 占位】 多种激活函数曲线对比图:在同一坐标系中绘制 Sigmoid、Tanh、ReLU、GELU 的函数曲线,并在另一幅子图中绘制它们的导数,突出梯度在不同区间的大小差异。


2.1.2.2 激活函数对梯度的影响

激活函数不仅影响网络的表达能力,也直接影响梯度传播质量,从而影响训练速度与稳定性。(geeksforgeeks.org)

1.梯度消失(vanishing gradient)

  • Sigmoid/Tanh 在远离 0 的区域导数接近 0,深层网络中多次相乘后,梯度会迅速衰减。
  • 结果是靠近输入的前几层几乎得不到有效更新,训练停滞。

2.梯度爆炸(exploding gradient)

  • 若激活函数的导数较大,或者权重初始化不合适,梯度在层间传播时会被放大,导致数值不稳定。
  • 虽然激活函数本身不是唯一原因,但其导数规模是关键因素之一。

3.ReLU 的“半线性”优势与问题

  • ReLU 在正半轴导数为 1,不会压缩梯度;在负半轴导数为 0,可以增加稀疏性。
  • 这有助于缓解梯度消失问题,也在实践中显著提升了深度网络训练效果。(维基百科)
  • 但 ReLU 也会出现“死亡 ReLU”(neuron dying)现象:若某个神经元长期落在负区间,其输出和梯度都为 0,难以再被激活。

4.平滑非线性(GELU、SiLU)的折中

  • GELU 等函数在零附近平滑过渡,导数在全域不为 0,利于梯度更柔和地传播。(arXiv)
  • 实证研究表明,在 Transformer 等架构中使用 GELU 能带来更好的收敛性质和最终性能。

总体来看,激活函数的设计和选择,是在“表达能力—梯度稳定性—计算开销”之间寻找平衡。


2.1.2.3 激活函数选择

在具体工程实践中,激活函数通常按以下经验进行选择:

+隐藏层(MLP、CNN、Transformer 前馈)

  • 默认优先:ReLU 或 GELU。
  • 若特别追求平滑性或更高性能,可考虑 GELU、SiLU 等。 +输出层
  • 回归:一般使用线性激活(恒等函数),直接输出实数。
  • 二分类:常用 sigmoid,将输出映射到 \(\displaystyle (0,1)\),然后配合二元交叉熵损失。
  • 多分类:使用 softmax,将 logits 映射为概率分布,再配合交叉熵损失。 +机器人 / 具身智能中的特殊考虑
  • 输出若为角速度、力矩等连续控制量,通常选择线性或 Tanh,并在 Tanh 输出后再缩放到物理允许范围;
  • 为保证安全,可在激活函数后附加硬裁剪(clamp),确保输出不超出机器人硬件极限。

随着模型规模与任务复杂度提升,新的激活函数还在不断被提出;但在掌握基础原理后,读者可以将它们都看作是在“非线性形状”和“梯度传播”上的微调。


2.1.3 损失函数(交叉熵、MSE 等)与任务类型对应关系

损失函数(Loss function)度量模型输出与真实标签之间的差异,是训练中需要最小化的目标。不同任务适合不同的损失设计,这一点在前面机器学习基础(1.4 节)已有初步介绍,这里结合神经网络再做系统梳理。

2.1.3.1 均方误差(MSE)

均方误差(Mean Squared Error, MSE)是回归任务中最常用的损失之一。(simpling)

单样本情况下:

\[ \mathcal{L}_{\text{MSE}}(y,\hat{y}) = \frac{1}{2}(y - \hat{y})^2, \]

其中 \(\displaystyle y\) 为真实值,\(\hat{y}\) 为模型预测值。对一个批量大小为 \(\displaystyle n\) 的样本集合,损失通常取平均:

\[ \mathcal{L}_{\text{MSE}} = \frac{1}{n} \sum_{i=1}^n \frac{1}{2}(y_i - \hat{y}_i)^2. \]

MSE 的特点:

  • 对误差进行平方,放大大误差的影响,有利于收敛到整体最优。
  • 对于高斯噪声假设下的线性回归,MSE 对应于最大似然估计,是一个有良好统计意义的目标函数。
  • 梯度简单:\(\partial \mathcal{L}/\partial \hat{y} = \hat{y} - y\),便于反向传播。

在机器人控制中,若要预测未来状态、关节角度或力矩等连续量,MSE 是自然的选择;在某些 RL 算法中,价值函数近似也常使用 MSE(或 Huber 损失等变体)来拟合目标回报。


2.1.3.2 交叉熵损失

交叉熵损失主要用于分类任务,特别是配合 softmax(多分类)或 sigmoid(二分类)输出时。(simpling)

1.二分类交叉熵

设真实标签 \(y \in \{0,1\}\),预测概率 \(\hat{p} = \sigma(z)\) 为属于正类的概率,则二元交叉熵为:

\[ \mathcal{L}_{\text{BCE}}(y,\hat{p}) = - \big( y \log \hat{p} + (1-y) \log (1-\hat{p}) \big). \]

2.多分类交叉熵

设有 \(\displaystyle K\) 个类别,真实标签 one-hot 向量 \(y \in \{0,1\}^K\),预测概率 \(\hat{p}\in[0,1]^K\),\(\sum_k \hat{p}_k=1\)。多分类交叉熵为:

\[ \mathcal{L}_{\text{CE}}(y,\hat{p}) = - \sum_{k=1}^K y_k \log \hat{p}_k. \]

与 softmax 联用时,这个损失实际上等价于最大化真实类别对应的 log 概率。 从信息论角度看,交叉熵与 KL 散度密切相关,是衡量模型预测分布与真实分布差异的自然指标。

为什么分类不用 MSE,而更偏好交叉熵?

  • 软最大 + 交叉熵组合在梯度上更“匹配”,能提供更稳定、有效的学习信号;
  • 对于概率模型,交叉熵直接对应于最大似然估计,使模型输出可以被解释为概率。(Medium)

在具身智能中,当我们训练“高层离散决策”(例如动作原语的选择:抓取/放置/导航)或文本指令分类时,交叉熵是主力损失函数。


2.1.3.3 特定任务的损失

除了 MSE 与交叉熵,各类特定任务还发展出大量对应的损失设计,这里只做简要指引:

+序列任务

  • 语言模型、动作序列预测:通常使用序列交叉熵,对每个时间步的 token/动作进行交叉熵损失求和或求平均。
  • 在 VLA 中,若动作被离散化为 token(参见第 8 章),也可以使用交叉熵学习“下一个动作 token”。 +生成与对抗学习
  • GAN 中的对抗损失、KL 散度、Wasserstein 距离等,用于度量生成分布与真实分布的差异。
  • 对于机器人世界模型(生成未来观测/状态),常见组合是 MSE + 感知损失等。 +几何与控制相关损失
  • 位姿误差:使用位置误差的 MSE + 姿态误差(如四元数距离)组合。
  • 轨迹平滑正则:对加速度、加加速度(jerk)的平方惩罚。
  • 碰撞惩罚:对发生碰撞的样本加上大损失,或在 RL 中赋予负奖励。

本书后续章节在具体任务中会分别介绍对应的损失设计;在本节的层级,我们只要意识到:损失函数就是把“我们想要的行为”翻译成一个可优化的数学目标

【图 2-4 占位】 \(\displaystyle a\) MSE 对预测值的曲线示意;\(\displaystyle b\) 交叉熵随预测正确类别概率变化的曲线示意,直观展示它们对误差的惩罚差异。


2.1.4 反向传播算法与链式法则

前面的所有内容——网络结构、激活函数、损失函数——最终都要通过反向传播(Backpropagation)来连接:我们需要计算损失对每一个参数的梯度,从而用优化算法(如 SGD、Adam)更新参数。反向传播本质上就是把多元微积分里的链式法则,以系统化的方式应用到计算图上。(深度学习导引)

2.1.4.1 链式法则

在 1.3 节中已经回顾过单变量和多变量的链式法则,这里结合神经网络做一个针对性的强化。

假设有复合函数:

\[ y = f(g(x)), \]

则对 \(\displaystyle x\) 的导数为

\[ \frac{\mathrm{d}y}{\mathrm{d}x} = f'(g(x)) \cdot g'(x). \]

推广到多维情况,如果

\[ \begin{aligned} u &= g(x_1, x_2, \dots, x_n), y &= f(u), \end{aligned} \]

则对某个输入 \(x_i\) 的偏导数为

\[ \frac{\partial y}{\partial x_i} = \frac{\partial y}{\partial u} \cdot \frac{\partial u}{\partial x_i}. \]

在神经网络中,每一层的输出都是前一层输出的函数,整个网络就是大量函数的复合。因此,只要我们能写出每个小步骤的导数,就可以通过链式法则逐层把梯度传回去。


2.1.4.2 反向传播算法

考虑一个简单的两层网络:

\[ \begin{aligned} h &= \sigma(W_1 x + b_1), \hat{y} &= \phi(W_2 h + b_2), \mathcal{L} &= \ell(\hat{y}, y), \end{aligned} \]

目标是计算 \(\frac{\partial \mathcal{L}}{\partial W_1}, \frac{\partial \mathcal{L}}{\partial b_1}, \frac{\partial \mathcal{L}}{\partial W_2}, \frac{\partial \mathcal{L}}{\partial b_2}\)。

前向传播(forward pass)

  1. 从输入 \(x\) 出发,依次计算: \(z_1 = W_1 x + b_1,\ h = \sigma(z_1),\ z_2 = W_2 h + b_2,\ \hat{y} = \phi(z_2),\ \mathcal{L} = \ell(\hat{y}, y)\)。

反向传播(backward pass)

  1. 先计算损失对输出的梯度 \(\frac{\partial \mathcal{L}}{\partial \hat{y}} = \nabla_{\hat{y}} \ell(\hat{y}, y)\);

  2. 对输出层做链式法则:

    \[ \frac{\partial \mathcal{L}}{\partial z_2} = \frac{\partial \mathcal{L}}{\partial \hat{y}} \cdot \phi'(z_2), \]

    \[ \frac{\partial \mathcal{L}}{\partial W_2} = \frac{\partial \mathcal{L}}{\partial z_2} \cdot h^\top, \quad \frac{\partial \mathcal{L}}{\partial b_2} = \frac{\partial \mathcal{L}}{\partial z_2}. \]

  3. 把梯度“传回”隐藏层:

    \[ \frac{\partial \mathcal{L}}{\partial h} = W_2^\top \frac{\partial \mathcal{L}}{\partial z_2}. \]

  4. 对隐藏层做链式法则:

    \[ \frac{\partial \mathcal{L}}{\partial z_1} = \frac{\partial \mathcal{L}}{\partial h} \odot \sigma'(z_1), \]

    \[ \frac{\partial \mathcal{L}}{\partial W_1} = \frac{\partial \mathcal{L}}{\partial z_1} \cdot x^\top, \quad \frac{\partial \mathcal{L}}{\partial b_1} = \frac{\partial \mathcal{L}}{\partial z_1}. \]

其中 \(\odot\) 表示按元素乘。

这一过程可以抽象描述为:

+前向:从输入到输出,保存中间结果(如每一层的 \((z, h)\))。 +反向:从输出到输入,逐层应用链式法则,把 \(\partial \mathcal{L}/\partial(\text{当前变量})\) 传递给前一层,同时计算相应参数的梯度。

反向传播的核心思想在 20 世纪 80 年代已经提出,是现代深度学习训练的核心算法。更形式化地看,它是**反向模式自动微分(reverse-mode automatic differentiation)**在神经网络上的一个具体实现。(cs.toronto.edu)

【图 2-5 占位】 以简单两层 MLP 为例,画出前向图与反向箭头:从输入开始向前计算,再从损失节点反向传播梯度到各层权重的示意图。


2.1.4.3 计算图与自动求导

手工推导复杂网络的梯度既繁琐又容易出错。现代深度学习框架(PyTorch、TensorFlow、JAX 等)普遍采用**计算图(Computational Graph)+ 自动求导(Automatic Differentiation,Autograd)**机制,大幅简化了开发工作。(深度学习导引)

1.计算图

在前向计算时,框架会构建一个有向无环图(DAG):

  • 节点:变量或中间结果(张量);
  • 边:由某个算子(加法、矩阵乘法、激活函数等)连接输入与输出。

例如一个简单表达式:

\[ y = (x_1 \cdot x_2 + \sin x_1)^2 \]

即可被拆成若干节点:乘法、加法、sin、平方等。

2.自动求导(Autograd)

自动求导是一类算法族,目标是在计算图上高效、精确地实现链式法则。(Medium)

  • 在前向传播阶段,框架记录每一步操作以及输入/输出;
  • 在调用 .backward()grad() 等接口时,框架从损失节点开始,沿计算图反向遍历,逐个节点应用链式法则,自动得到所有需要的梯度;
  • 这一过程就是反向模式自动微分(reverse-mode AD),对“多参数、单输出”的场景(典型的神经网络训练)非常高效。

3.静态图 vs 动态图

  • 静态图(如早期 TensorFlow):先定义好计算图,再执行;优化空间大,但调试不直观。
  • 动态图(如 PyTorch):前向执行时即时构图,更接近命令式编程,易于调试与与 Python 生态结合。

无论哪种形式,对使用者来说,最重要的是理解:框架帮你做的是链式法则的机械应用,但你仍然需要明白梯度是什么、如何影响训练。本节的理论理解会在后续你阅读复杂 VLA 模型代码(尤其是自定义算子、非标准损失)时发挥作用。

【图 2-6 占位】 简单计算图示例:以 \(y = (x_1 \cdot x_2 + \sin x_1)^2\) 为例,画出节点和有向边,并用另一幅图显示从 \(y\) 反向传播到 \((x_1, x_2)\) 的梯度流向。


到此为止,我们已经构建了深度学习中“最小工作单元”的全景: 结构 =(前馈网络) + 非线性(激活函数) + 目标(损失函数) + 训练机制(反向传播与自动求导)

在接下来的 2.2 和 2.3 节,我们将在此基础上讨论深层网络训练技巧、卷积与序列建模,并逐步走向 Transformer 与 VLA 的整体结构,为后面在机器人具身智能中的大规模模型应用做好准备。

本章小结与自测

三行小结

  1. 本章建立深度学习训练与 Transformer 的工程认知。
  2. 核心是结构、目标函数、优化与稳定性联动理解。
  3. 学完后应能从训练日志定位主要问题来源。

检查题

  1. 用你自己的话总结本章最核心的一个公式/机制。
  2. 给出一个“如果要落地到项目里,你会怎么用”的具体例子。

常见误区

  1. 只看模型结构,不看训练配置。
  2. 出现 NaN 时只降学习率而不查数据。
  3. 把单次结果当作稳定结论。

公式到代码(最小示例)

import torch

model = torch.nn.Linear(16, 4)
opt = torch.optim.AdamW(model.parameters(), lr=1e-3)
x = torch.randn(8, 16)
y = torch.randint(0, 4, (8,))
loss = torch.nn.CrossEntropyLoss()(model(x), y)
loss.backward()
torch.nn.utils.clip_grad_norm_(model.parameters(), 1.0)
opt.step(); opt.zero_grad()

本章外部参考(集中)

  1. 维基百科
  2. Cross Validated
  3. Take heed : 개발 블로그
  4. 维基百科
  5. geeksforgeeks.org
  6. 维基百科
  7. Medium
  8. arXiv
  9. simpling
  10. Medium
  11. 深度学习导引
  12. cs.toronto.edu
  13. 本章其余链接可在正文中按上下文继续查阅。

2.2 深度网络训练技巧

下面直接进入 2.2 这一小节的具体内容。你可以把它当作“深度网络工程训练实战篇”的第一部分:在后面训练大规模 VLA / 机器人模型时,这些都是每天会用到的“基本功”。


2.2 深度网络训练技巧概览(引入)

学习导航

  • 本章主题:2.2 深度网络训练技巧概览(引入)
  • 前置知识:建议先完成第 1 章核心内容。
  • 建议用时:119-139 分钟
  • 阅读顺序:先看概念框架,再看公式/代码,最后做自测。

在第 1 章我们从优化角度讨论了梯度下降、学习率、收敛等概念,这一节则更偏工程实践:同样一个网络结构,训练得好不好、稳不稳,很大程度取决于权重初始化、归一化、正则化以及训练过程的监控与调度。 对于后面要训练的 Transformer、视觉骨干、甚至整套 VLA 模型,这些技巧是保证“能训起来”的前提。


2.2.1 权重初始化与梯度消失 / 爆炸问题

2.2.1.1 参数初始化策略:Xavier、Kaiming 等

(1)为什么初始化是个严肃问题?

设一层全连接网络

\[ y = Wx + b \]

其中 \(x \in \mathbb{R}^{n_{\text{in}}}\),\(y \in \mathbb{R}^{n_{\text{out}}}\),权重 \(W_{ij}\) 独立同分布,均值为 0、方差为 \(\sigma^2\)。如果输入各维方差相同且独立,可推得每个输出维的方差约为

\[ \mathrm{Var}(y_j) \approx n_{\text{in}} \sigma^2\mathrm{Var}(x). \]

  • 如果 \(\sigma^2\) 选得太大,随着层数加深,激活的方差会迅速变大,前向信号“发散”,后向梯度也会爆炸。
  • 如果 \(\sigma^2\) 选得太小,信号层层被压缩,最后几乎全是 0,导致梯度消失。

初始化的目标:让每一层输出的方差与输入大致相当,从而在多层堆叠后,既不过度放大也不过度衰减。(Pinecone)


(2)Xavier / Glorot 初始化

Xavier(也叫 Glorot)初始化假设激活函数是对称且不过度饱和的(如线性、tanh),希望同时在前向与反向传播中都保持方差稳定。基本思想是根据 fan-in 和 fan-out 调整权重方差:(Pinecone)

  • fan-in:该层每个神经元的输入维数 \(n_{\text{in}}\);
  • fan-out:输出维数 \(n_{\text{out}}\)。

典型设置:

\[ \mathrm{Var}(W) = \frac{2}{n_{\text{in}} + n_{\text{out}}}. \]

实现上常见两种形式:

+均匀分布

\[ W_{ij} \sim U\left[-\sqrt{\frac{6}{n_{\text{in}} + n_{\text{out}}}},\ \sqrt{\frac{6}{n_{\text{in}} + n_{\text{out}}}}\right] \]

+正态分布

\[ W_{ij} \sim \mathcal{N}\left(0,\ \frac{2}{n_{\text{in}} + n_{\text{out}}}\right). \]

在 PyTorch 等框架中,这通常对应 xavier_uniform_ / xavier_normal_。对于卷积层,fan-in/out 会包含卷积核大小(如 \(C_{\text{in}} \times k_h \times k_w\))。(PyTorch 文档)


(3)Kaiming / He 初始化

ReLU 及其变体(LeakyReLU、GELU 等)在负半轴直接截断,会把方差“砍掉一半”左右,Xavier 初始化没有考虑这一点。Kaiming He 等人推导得到对 ReLU 更合适的方差:(www.abhik.xyz)

  • 对标准 ReLU:

    \[ \mathrm{Var}(W) = \frac{2}{n_{\text{in}}}. \]

  • 对 LeakyReLU(负半轴斜率为 \(\displaystyle a\))等,可推广为:

    \[ \mathrm{Var}(W) = \frac{2}{(1 + a^2) n_{\text{in}}}. \]

实现时常用:

  • kaiming_normal_(..., mode='fan_in', nonlinearity='relu')
  • kaiming_uniform_(...)

它的目标是维持前向信号的方差稳定,从而在很多层 ReLU 堆叠后不会过快衰减或发散。


(4)实践建议与偏置初始化

  • 多层感知机 + ReLU:优先选用Kaiming 初始化;tanh / sigmoid 仍可以使用Xavier
  • 卷积网络:同样使用 Xavier/Kaiming,只是 fan-in/out 的计算要把卷积核大小考虑进去。(Pinecone)
  • 偏置项通常初始化为 0(或小常数),避免引入额外偏移。
  • RNN 常使用正交初始化(Orthogonal),以在时间维上更好地保持梯度范数。

【图 2-2-1 占位】 示意图:横轴为层数,纵轴为激活方差,比较“随机大值初始化”(方差迅速爆炸)、“随机小值初始化”(方差迅速衰减)和“Xavier / Kaiming 初始化”(方差在合理区间内平稳)的三条曲线。


2.2.1.2 梯度消失与梯度爆炸

(1)现象描述

+梯度消失:反向传播时,越靠近输入层的梯度越小,接近 0,导致这些层几乎不更新,看起来像“白学了”。 +梯度爆炸:梯度在反向传播中被成倍放大,最终变得非常大,引起参数更新剧烈震荡甚至出现 NaN。

这两个问题在深层网络时间展开很长的 RNN中尤为常见。


(2)从“链式法则”的角度看

假设一个 L 层网络,损失对第 \(l\) 层激活 \(h^{(l)}\) 的梯度可以写成一串雅可比矩阵的乘积:

\[ \frac{\partial \mathcal{L}}{\partial h^{(l)}} = \frac{\partial \mathcal{L}}{\partial h^{(L)}} \prod_{k=l+1}^{L} \frac{\partial h^{(k)}}{\partial h^{(k-1)}}. \]

每个 \(\frac{\partial h^{(k)}}{\partial h^{(k-1)}}\) 的“平均尺度”如果略小于 1,很多层相乘后就指数级趋近于 0;略大于 1,就指数级增长。配合饱和型激活函数(sigmoid / tanh 在两端导数接近 0),非常容易出现梯度消失。(Pinecone)

在 RNN 中,这个乘积沿着时间展开,更容易出问题:

\[ \frac{\partial \mathcal{L}_T}{\partial h_t} ;=; \frac{\partial \mathcal{L}_T}{\partial h_T} \prod_{k=t+1}^{T} \frac{\partial h_k}{\partial h_{k-1}}. \]

当序列很长时,远处的梯度要么弱得像“幽灵”,要么强得像“爆炸”


(3)对训练的影响

  • 梯度消失:
    • 靠近输入的层训练极慢,网络只能“学会”靠后的几层;
    • 难以捕获长距离依赖(长序列、深层语义)。
  • 梯度爆炸:
    • 损失值突然暴涨,优化器步长过大直接跳出稳定区域;
    • 参数变成 NaN,训练中断。

机器人与具身智能中,任务往往涉及长时间决策序列,梯度消失 / 爆炸会直接导致策略难以学到稳定的长时行为,这也是后面在 RNN / Transformer、RL 章节要重点处理的问题。

【图 2-2-2 占位】 示意图:左图展示从输出层向前传播的梯度在层数增加时指数级衰减(梯度消失);右图展示梯度指数级增长(梯度爆炸),对比两种极端情况。


2.2.1.3 缓解梯度消失 / 爆炸的常见方法

1.合理的权重初始化

  • 使用 Xavier / Kaiming 等能保持前向、反向方差适中的初始化方法,是最基础的一步(见 2.2.1.1)。(Pinecone) 2.选择合适的激活函数

  • ReLU 与其变体(LeakyReLU、ELU、GELU 等)在大部分输入区间有非零导数,相比 sigmoid/tanh 更能缓解梯度消失。

  • 同时要防止 ReLU“死亡”(大量神经元长期输出 0),通常通过 Kaiming 初始化、稍微增大学习率、或使用 LeakyReLU/GELU 来缓解。 3.归一化技术

  • BatchNorm、LayerNorm 会在每层强行把中间激活标准化到均值接近 0、方差接近 1,从而在一定程度上阻止方差在层间无限放大或缩小。(arXiv)

  • 这也是 2.2.2 的主题。 4.结构设计:残差连接(Residual Connections)

  • ResNet 中的 skip-connection 让梯度可以“绕过”若干非线性层直接传到更前面,减少有效深度,使梯度更容易流动。 5.梯度裁剪(Gradient Clipping)

  • 对每次反向传播得到的梯度范数做上界限制,如

    \[ g \leftarrow g \cdot \min\left(1,\frac{\tau}{|g|}\right), \]

    其中 \(\tau\) 是预设阈值。

  • 在 RNN、RL 和真实机器人训练中非常常见,用来防止偶发的“梯度尖峰”引起训练崩溃。 6.合理的学习率与调度

  • 过大的学习率会放大梯度爆炸的风险;过小则放大梯度消失的效果。

  • 第 2.2.4 节会系统讨论学习率调度和训练监控。


2.2.2 Batch Normalization / LayerNorm 等归一化技术

归一化(Normalization)的核心思想是:在每一层把神经元的激活“拉回到一个合适的统计范围”,让优化问题变得更稳定。这在深层网络中特别重要。


2.2.2.1 批归一化(Batch Normalization)

BatchNorm 由 Ioffe 和 Szegedy 提出,用来缓解所谓的“内部协变量偏移”(internal covariate shift)——即某一层输入的分布,随着前面层参数更新不断变化,从而让这一层不停适应新分布,训练变慢。(arXiv)

尽管后续研究发现“内部协变量偏移”并非 BN 有效性的根本解释,但 BN 在实践中确实显著加速收敛、稳定训练,并带来一定正则化效果。(维基百科)

(1)前向计算公式

对一个 mini-batch \(B = {x_1,\dots,x_m}\),对每个通道 / 特征维度 \(\displaystyle k\),计算:

  • 均值:

    \[ \mu_B^{(k)} = \frac{1}{m} \sum_{i=1}^m x_i^{(k)} \]

  • 方差:

    \[ (\sigma_B^{(k)})^2 = \frac{1}{m} \sum_{i=1}^m \big(x_i^{(k)} - \mu_B^{(k)}\big)^2 \]

然后标准化:

\[ \hat{x}_i^{(k)} = \frac{x_i^{(k)} - \mu_B^{(k)}}{\sqrt{(\sigma_B^{(k)})^2 + \varepsilon}} \]

再通过可学习的缩放和平移参数

\[ y_i^{(k)} = \gamma^{(k)} \hat{x}_i^{(k)} + \beta^{(k)} \]

其中 \(\gamma, \beta\) 也是模型参数,可以恢复或改变归一化后的分布。(Medium)

在卷积网络中,BN 一般对“batch × 空间维度(H×W)”整体求通道均值与方差。


(2)训练 vs 推理(inference)

  • 训练阶段:使用当前 mini-batch 的统计量 \(\mu_B, \sigma_B^2\)。
  • 推理阶段:使用滑动平均累积的“全局均值 / 方差”,避免单个 batch 不稳定。

(3)BN 的作用与局限

  • 允许使用更大的学习率,加速收敛;
  • 在一定程度上减轻了初始化敏感性;
  • mini-batch 统计带来的噪声本身具有正则化效果,有时可以减弱 Dropout 强度;(arXiv)
  • 对 batch size非常敏感:当 batch 很小时(如 2~8),估计的方差很不稳定,这时往往需要使用 GroupNorm、LayerNorm 等替代方案。

【图 2-2-3 占位】 示意图:展示一层网络中“线性变换 → BatchNorm(减均值 / 除标准差 / 乘 γ 加 β)→ 非线性激活”的数据流。


2.2.2.2 层归一化(LayerNorm)

LayerNorm 由 Ba 等人提出,最初就是为了解决 BN 在 RNN 等场景中不易使用的问题。核心区别在于:BN 是在 batch 维上做统计,而 LN 是在“特征维”上对单个样本做统计。(arXiv)

给定单个样本的隐藏状态向量 \(\mathbf{h} \in \mathbb{R}^d\),LN 计算:

\[ \mu = \frac{1}{d}\sum_{j=1}^{d} h_j,\quad \sigma^2 = \frac{1}{d}\sum_{j=1}^{d} (h_j - \mu)^2 \]

\[ \hat{h}_j = \frac{h_j - \mu}{\sqrt{\sigma^2 + \varepsilon}},\quad y_j = \gamma_j \hat{h}_j + \beta_j \]

特点:

  • 与 batch size无关,非常适合小 batch 或 batch=1 的场景;
  • 训练和推理阶段完全一致,无需维护滑动平均;
  • 已成为 Transformer 中的标准组件(前 / 后 LayerNorm)。

(3)其他归一化变体(了解即可)

  • InstanceNorm:对每个样本、每个通道单独在空间维上归一化,多用于风格迁移等视觉任务。
  • GroupNorm:将通道分组,每组内部做归一化,兼具 BN/LN 的一些优点,适合小 batch 的 CNN。(d2l.ai)

在后续的视觉与 VLA 模型中,你会看到:CNN 常用 BN / GroupNorm,Transformer 常用 LayerNorm / RMSNorm,这是由各自的数据形式和训练方式决定的。


2.2.2.3 归一化技术的作用与实践要点

1.稳定中间层分布,改善优化几何归一化相当于把每一层的输入都“重置”到均值零、方差一的尺度上,使得损失函数在参数空间中更“平滑”,从而允许更大的学习率、加速收敛。理论和实证研究都表明 BN/LN 的主要收益与平滑损失景观密切相关。(维基百科) 2.提高训练速度与深度可达性

  • VGG 这类极深网络在引入 BN 后变得更容易训练;
  • 在 Transformer 中,如果没有 LN,几十层的深度几乎无法稳定收敛。 3.正则化效果
  • BN 通过 batch 统计引入噪声,有类似模型集成的效果,对过拟合有抑制;
  • 这也意味着BN + 强 Dropout有时反而会伤害性能,需要适度调整。(arXiv) 4.机器人 / 具身智能中的注意点
  • 在强化学习或机器人场景中,输入数据往往不是独立同分布(non-iid),BN 的 batch 统计可能与策略变化纠缠在一起,导致不稳定;这时 LayerNorm 或不依赖 batch 统计的归一化往往更稳定。
  • 对多模态输入(图像、关节状态、语言 embedding)时,可以分别在各模态分支中使用最合适的归一化方式,再做融合。

2.2.3 Dropout、数据增广等正则化方法

为了防止第 1.4 节所说的过拟合,深度学习发展出一系列正则化手段,其中 Dropout 和数据增广几乎出现在所有成功的视觉 / 语言 / 机器人模型中。


2.2.3.1 Dropout:随机丢弃神经元

Dropout 由 Srivastava 等人提出,本质上是一种随机丢弃神经元的模型集成方法。训练时,每个神经元以一定概率被“关掉”,迫使网络不能依赖某些特定特征,从而降低过拟合。(机器学习研究杂志)

(1)数学形式(以“反向缩放”实现为例)

给定一层的激活 \(\displaystyle h\),生成掩码向量 \(\displaystyle m\),其中每个元素独立服从 Bernoulli 分布:

\[ m_i \sim \mathrm{Bernoulli}(p_{\text{keep}}), \]

然后在训练时计算:

\[ \tilde{h}_i = \frac{m_i}{p_{\text{keep}}} h_i. \]

这样 \(\mathbb{E}[\tilde{h}_i] = h_i\),保证训练和测试阶段的激活期望一致。 测试时则不再随机丢弃,而是使用完整网络(或在权重上做等价缩放)。


(2)直观理解

  • 每次训练都在随机采样一个“变薄的子网络”(thinned network),不同子网络共享权重;
  • 测试时等价于对大量子网络做平均(ensemble);
  • 因为神经元不能依赖于固定的“队友”,模型被迫学到更鲁棒、更分散的特征。

(3)实践经验

  • 全连接层常用 dropout rate 在 0.1~0.5 之间;
  • 卷积层中,如果直接对单个像素位置做 Dropout,效果往往一般,可以使用更结构化的SpatialDropout / DropBlock等变体;(ScienceDirect)
  • 与 BatchNorm 叠加时要小心,一般将 Dropout 放在 BN 之后、激活函数之后,且强度不宜过大。

【图 2-2-4 占位】 示意图:左边是完整网络,右边是训练时启用 Dropout 后“随机熄灭部分神经元”的网络,配上测试阶段使用完整网络的说明。


2.2.3.2 数据增广:让数据“学会变身”

数据增广(Data Augmentation)通过对已有样本做各种变换,在不改变标签的前提下制造更多样本,是深度学习中效果最直接的正则化手段之一。(ScienceDirect)

(1)图像任务中的经典增广

几乎所有视觉模型都会用到以下几类增广:(forever_happiness)

  • 几何变换:随机水平翻转、旋转、平移、缩放、裁剪;
  • 光照 / 颜色变换:亮度、对比度、饱和度、色相扰动,加入高斯噪声、模糊等;
  • 遮挡 / 混合类增广:
    • Cutout:随机挖掉图像中的方块区域;
    • Mixup:将两张图像按比例线性混合、标签也加权混合;
    • CutMix:剪切一块图像贴到另一张上,同时按面积混合标签。(Medium)

这些方法可以显著提升模型在噪声、遮挡和标签噪声条件下的鲁棒性。


(2)具身智能场景下的数据增广

对于机器人场景,我们可以在更多模态上做增广和“域随机化”(Domain Randomization):

  • 视觉增广:改变背景纹理、光照条件、物体颜色、摄像机视角等,使模型不过度依赖特定桌面材质或灯光;
  • 状态 / 轨迹增广:对关节角、末端位姿、动作加入小扰动,保证物理可行的前提下丰富轨迹分布;
  • 语言增广:对指令做同义改写、改变语序而不改变语义;
  • 在仿真中更激进地随机环境参数(摩擦系数、物体质量),为后续的 Sim2Real 做铺垫。

【图 2-2-5 占位】 示意图:展示同一个机器人抓取场景的原图与若干增广结果(光照改变、背景纹理随机、遮挡、颜色扰动等)。


2.2.3.3 其他正则化:L1/L2、BatchNorm 的正则作用、模型集成

(1)L2 正则化 / 权重衰减(Weight Decay)

在损失函数中附加惩罚项:

\[ \mathcal{L}_{\text{total}} = \mathcal{L}_{\text{task}} + \lambda |W|_2^2 \]

对梯度下降而言,等价于在每轮更新中给权重乘上一个略小于 1 的系数(向 0 收缩),抑制权重无限变大,有助于提高泛化能力。(d2l.ai)

  • 在纯 SGD 下,L2 正则与显式的 weight decay 本质等价;
  • 在 Adam / AdamW 等自适应优化中,两者存在差别,实践中更推荐使用“解耦的权重衰减”(AdamW)。

(2)L1 正则化

  • 惩罚项为 \(\lambda |W|_1\),鼓励参数稀疏;
  • 用于特征选择或模型压缩时常见,在大规模深网中使用频率相对较低。

(3)BatchNorm 的正则化效果

  • 前面的 2.2.2 已经提到,BN 利用 batch 统计带来的噪声,实际上起到了一定“模型集成”的作用;
  • 有研究指出,在存在 BN 等归一化层时,L2 正则的“真正作用”更多是调整有效学习率,而不是传统意义上控制模型容量。(arXiv)

(4)模型集成(Ensemble)

  • 训练多个结构相同但初始化不同的模型,对其输出取平均,可以显著提高泛化性能;
  • 在机器人场景中,完整 ensemble 会带来较大计算成本,但可以在离线阶段或关键任务上使用;
  • Dropout、BN 等都可以视为隐式 ensemble 的一种。

总体来说,在真实机器人数据昂贵、样本有限的条件下,数据增广 + 适度的权重衰减 + 归一化,往往比单纯加大 Dropout 更有效、更稳定。


2.2.4 训练监控:损失曲线、学习率调度、早停策略

深度网络训练是一个动态过程,不是“一键跑完看结果”。对损失与指标的持续监控、适当调整学习率以及使用早停策略,是保证训练效率和避免过拟合的关键。


2.2.4.1 监控损失曲线与训练状态

(1)训练集 vs 验证集

  • 训练集损失:反映模型对已见数据的拟合程度;
  • 验证集损失 / 指标:反映模型对未见数据的泛化性能;
  • 通常每若干 step 或每个 epoch 记录一次两者的曲线,并可视化(如 TensorBoard、Weights & Biases 等)。

在机器人 / RL 场景中,验证指标可以是:

  • 平均回报(average return);
  • 任务成功率(success rate);
  • 任务完成时间、路径长度等。

(2)典型曲线形态与诊断

1.正常收敛

  • 训练损失稳步下降;
  • 验证损失也下降并最终趋于平稳;
  • 说明模型容量和正则化基本合适。 2.欠拟合
  • 训练和验证损失都高,且都不再明显下降;
  • 可能的原因:模型太小、训练轮数不够、学习率过低或特征表达不足。 3.过拟合
  • 训练损失持续下降;
  • 验证损失先降后升,出现“U 型”或“碗型”曲线;
  • 表明模型已经开始记忆训练噪声,这时应增加正则化或使用早停。(Medium) 4.训练不稳定 / 发散
  • 损失忽然剧烈抖动或直冲无穷大,甚至 NaN;
  • 常见原因:学习率过大、梯度爆炸、数值不稳定(如 log(0))。

【图 2-2-6 占位】 示意图:画出“正常收敛”“欠拟合”“过拟合”三种场景下的训练/验证损失曲线,并用标注指出过拟合开始点。


2.2.4.2 学习率调度:从“粗调”到“精调”

学习率(learning rate)是影响训练速度和稳定性最敏感的超参数之一。很多现代训练策略都会对学习率做随时间变化的调度(schedule)。(arXiv)

(1)为什么需要学习率调度?

  • 初期希望快速探索、跳出不良局部极小和鞍点——需要较大的学习率;
  • 后期希望细致“打磨”参数——需要较小的学习率以免在最优点附近抖动;
  • 固定学习率往往很难兼顾这两种需求。

(2)常见学习率调度策略

1.阶梯衰减(Step Decay)

  • 每过若干 epoch(如 30、60、90)就将学习率乘以一个固定因子(如 0.1);

  • 经典 CNN 训练(如 ResNet)中很常见。 2.指数 / 多项式衰减

  • 按 epoch 或 step 指数级减小学习率,平滑一些,但超参数较多。 3.余弦退火(Cosine Annealing)

  • Loshchilov & Hutter 在 SGDR 中提出的一类调度:(arXiv)

    \[ \eta_t = \eta_{\min} + \frac{1}{2}(\eta_{\max} - \eta_{\min}) \left(1 + \cos\frac{T_{\text{cur}}}{T_{\max}}\pi\right), \]

    其中 \(T_{\text{cur}}\) 是当前 step,\(T_{\max}\) 是一个周期长度。

  • 学习率随训练呈“半个余弦”缓慢减小,比阶梯衰减平滑;

  • 在很多视觉与 Transformer 训练中表现良好。 4.余弦退火 + 重启(Cosine Annealing with Warm Restarts, SGDR)

  • 当学习率降低到很小值后,突然“重启”回大值,再一次余弦衰减,如此周期往复;

  • 可以帮助模型反复跳出局部极小,获得更好的最终结果。 5.循环学习率(Cyclical LR)与 One-cycle Policy

  • 学习率在一个区间内来回震荡(上升再下降),有助于快速找到合适区域;

  • One-cycle 策略常用于大批量、短训练任务。


(3)Warmup(预热)

大模型、尤其是 Transformer,在训练开始时对大学习率非常敏感,容易发散。常用的技巧是在前若干 step/epoch 使用“学习率线性增加”的 warmup:

  • 从非常小的值开始,逐步线性增至目标学习率;
  • Warmup 结束后再接上余弦退火或其他调度。(ResearchGate)

【图 2-2-7 占位】 示意图:绘制常数学习率、阶梯衰减、余弦退火和带 warmup 的余弦退火曲线,直观比较不同策略随时间的变化。

在后续训练 VLA 大模型(第 9 章)时,Warmup + 余弦退火会是一个非常常见的默认配置。


2.2.4.3 早停(Early Stopping):在最合适的时候“踩刹车”

早停是一种非常实用、实现简单的正则化技巧:当模型在验证集上的性能不再提升甚至开始下降时,提前停止训练,并回滚到效果最好的那一轮。(Medium)

(1)基本流程

  1. 划分出验证集或验证任务集;
  2. 在训练过程中定期评估验证指标(如验证损失、准确率、成功率等);
  3. 维护一个“最佳验证指标”和对应模型参数的缓存;
  4. 当连续若干次评估(patience)都没有改善时,停止训练,将模型恢复到最佳状态。

(2)超参数与实现细节

+监控指标

  • 通常选择验证损失 / 准确率;
  • 在机器人任务中可以选择任务成功率、平均回报等。 +patience(耐心)
  • 过小:可能在指标随机波动时误判“变差”;
  • 过大:早停效果变弱;
  • 实践中可以从 5~10 个评估周期起步,根据任务调整。(GeeksforGeeks) +最小训练轮数
  • 避免一开始就触发早停,一般设置一个最小 epoch 数,如至少训练 20~30 个 epoch 后才考虑早停。

(3)在 RL / 机器人任务中的注意点

  • RL 中性能波动较大,单次评估的噪声很高;
  • 可以采用:
    • 在多个随机种子、多个环境实例上取平均;
    • 使用滑动平均平滑验证曲线;
    • 提高 patience,以免过早停止。

【图 2-2-8 占位】 示意图:显示验证集指标随 epoch 变化,在某一点达到峰值后出现下降,并标出早停触发的位置。


小结:从这一节过渡到更大规模模型训练

2.2 小节从权重初始化 → 归一化 → 正则化 → 训练监控与调度,搭起了“如何把一个深度网络训稳、训好”的基本框架。这些技巧在后续章节会不断复用:

  • 在第 2.4 节 Transformer 结构中,你会看到 LayerNorm + 残差连接如何让数十层网络可训练;
  • 在第 9 章 VLA 预训练与模仿学习中,我们会具体讨论如何结合数据增广、学习率调度和早停,稳健地训练大规模视觉–语言–动作模型;
  • 在第 5、7 章强化学习和仿真环境中,梯度稳定性与正则化会直接决定机器人策略能否安全收敛。

掌握了这一节的内容,就相当于为后面所有“大模型 + 机器人”的实验打好了一个坚实的“工程地基”。

本章小结与自测

三行小结

  1. 本章建立深度学习训练与 Transformer 的工程认知。
  2. 核心是结构、目标函数、优化与稳定性联动理解。
  3. 学完后应能从训练日志定位主要问题来源。

检查题

  1. 用你自己的话总结本章最核心的一个公式/机制。
  2. 给出一个“如果要落地到项目里,你会怎么用”的具体例子。

常见误区

  1. 只看模型结构,不看训练配置。
  2. 出现 NaN 时只降学习率而不查数据。
  3. 把单次结果当作稳定结论。

公式到代码(最小示例)

import torch

model = torch.nn.Linear(16, 4)
opt = torch.optim.AdamW(model.parameters(), lr=1e-3)
x = torch.randn(8, 16)
y = torch.randint(0, 4, (8,))
loss = torch.nn.CrossEntropyLoss()(model(x), y)
loss.backward()
torch.nn.utils.clip_grad_norm_(model.parameters(), 1.0)
opt.step(); opt.zero_grad()

本章外部参考(集中)

  1. Pinecone
  2. PyTorch 文档
  3. www.abhik.xyz
  4. arXiv
  5. 维基百科
  6. Medium
  7. arXiv
  8. d2l.ai
  9. arXiv
  10. 机器学习研究杂志
  11. ScienceDirect
  12. ScienceDirect
  13. 本章其余链接可在正文中按上下文继续查阅。

2.3 卷积与序列建模

2.3.1 卷积神经网络(CNN)基本结构与感受野

学习导航

  • 本章主题:2.3.1 卷积神经网络(CNN)基本结构与感受野
  • 前置知识:建议先完成第 1 章核心内容。
  • 建议用时:58-78 分钟
  • 阅读顺序:先看概念框架,再看公式/代码,最后做自测。

卷积神经网络是现代视觉感知的“工作马”,几乎所有机器人视觉系统——从桌面机械臂抓取、移动机器人导航,到自动驾驶感知——都在某种形式上依赖 CNN。与前面介绍的全连接网络相比,CNN 利用了图像的“局部性”和“平移不变性”,大幅减少参数并提升泛化能力。

2.3.1.1 卷积运算

从直觉上看,卷积就是拿一个小窗口(卷积核,kernel),在图像上滑动,在每个位置做“加权求和”,得到该位置的特征响应。每种卷积核都在寻找一种特定的局部模式:水平边缘、垂直边缘、角点、某种纹理等。

设输入为三通道图像 \(x \in \mathbb{R}^{H \times W \times C}\),卷积核大小为 \(K_h \times K_w\),通道数与输入相同,为 \(\displaystyle C\),则输出特征图某个通道在位置 \(\displaystyle (i,j)\) 的值可写成:

\[ y_{i,j} = \sum_{c=1}^{C} \sum_{m=0}^{K_h-1} \sum_{n=0}^{K_w-1} w_{c,m,n} x_{c,i+m,j+n} + b \]

其中 \(\displaystyle w\) 是卷积核参数,\(\displaystyle b\) 是偏置。通过在空间上滑动卷积核,可以得到一整张输出特征图。步幅(stride)控制滑动步长,填充(padding)决定是否在边界补零以控制输出大小。(cs231n.github.io)

与全连接层相比,卷积有两个核心特点:

+局部连接:每个输出神经元只与输入的一个局部区域相连,而不是与整张图像相连。 +参数共享:同一个卷积核在不同位置复用,检测“同一种模式在不同位置是否存在”。

这样的设计使 CNN 特别适合图像和深度图等“具有空间结构”的输入:对于机器人而言,无论物体出现在图像左上角还是右下角,只要模式相同,卷积核都能给出相似的响应。

【图 2-XX:2D 卷积运算示意图——3×3 卷积核在灰度图像上滑动,标出一个位置处的卷积计算过程(图片占位)】

2.3.1.2 CNN 层级结构

单层卷积只能看到很局部的模式;而深度 CNN 通过多层堆叠,逐步从“像素”上升到“语义”。

典型 CNN 的主干结构可以抽象为反复堆叠的模块:

卷积层(Conv) → 非线性激活(如 ReLU)→(可选)池化或下采样

底层卷积核通常会学到非常简单的局部特征,例如水平或垂直边缘、角点等;中层逐渐聚合这些低级特征,形成纹理、局部形状(如圆弧、孔洞);高层则组合出更抽象的概念,如物体部件(车轮、桌面边缘)乃至整个物体类别的典型轮廓。(cs231n.github.io)

对于具身智能中的机器人,这种层级表示非常关键:

  • 底层特征帮忙分辨边缘、空隙等几何信息,有利于抓取点或障碍物边界的估计;
  • 高层特征则更多编码“这是杯子”“这是抽屉把手”这样的语义信息,方便上层决策模块根据人类指令(如“拿起杯子”)去关联对应视觉区域。

【图 2-XX:CNN 层级特征示意图——从输入图像开始,展示浅层特征图(突出边缘)、中层特征图(纹理/轮廓)、深层特征图(物体部件)(图片占位)】

2.3.1.3 感受野

**感受野(receptive field)**指的是,网络中某一层的一个神经元在原始输入上“能看到”的区域大小——即输入图像中有哪一块区域会影响到这个神经元的输出。(AI Summer)

需要特别区分:

+卷积核大小:某一层卷积操作本身的窗口大小,例如 3×3、5×5。 +感受野大小:考虑到前面所有层(卷积、池化、下采样)的组合效果后,高层单元在原始输入上的覆盖范围。

一个简单例子:连续堆叠两层 3×3、stride=1 的卷积(假设无池化),看起来每层都只看 3×3 的局部,但第二层的每个神经元实际上已经“间接看到了”输入的 5×5 区域——第一层每个单元看 3×3,第二层再在这些单元上卷积 3×3,两者叠加扩张了实际感受野。随着层数增加,感受野会越来越大。(ultralytics.com)

更严格地,若第 \(\displaystyle l\) 层卷积核大小为 \(k_l\),步幅为 \(s_l\),则可以递推该层感受野大小 \(r_l\) 和“步距” \(j_l\):

\[ \begin{aligned} r_l &= r_{l-1} + (k_l - 1) j_{l-1},\\ j_l &= j_{l-1} \cdot s_l, \end{aligned} \]

其中第 0 层(输入)有 \((r_0 = 1, j_0 = 1)\)。我们不必在实践中手算所有层的感受野,但要形成直觉:

  • 堆叠小卷积核(例如多层 3×3)可以渐进扩大感受野;
  • 下采样(stride 或池化)会让每个高层单元对应更大的输入区域。

更进一步的研究指出,**有效感受野(effective receptive field)**往往比理论计算的小——中心区域对输出影响最大,边缘区域的权重逐渐减弱,大致近似高斯分布。(NeurIPS Proceedings)

对机器人来说,感受野大小直接影响行为安全性与全局规划能力:

  • 如果用于抓取的视觉特征感受野太小,模型可能只看到目标物体的一角,而忽略桌边、障碍物等关键信息;
  • 在导航任务中,如果高层特征感受野不足,机器人难以从单帧图像中理解整个通道或房间布局,会造成局部最优、反复“来回试探”。

后续 2.3.2 中的池化与特征金字塔,以及 3 章中的视觉主干选择,本质上都在围绕“如何在不同尺度与足够大的感受野之间做平衡”。

【图 2-XX:感受野随网络深度扩大的示意图——三层 3×3 卷积叠加后,高层单元对应输入上较大的方块区域(图片占位)】


2.3.2 池化、下采样与特征金字塔

卷积层负责发现局部模式,而池化和下采样则在空间尺度上“压缩信息”,构建多尺度表示。对于机器人来说,这关系到:

  • 模型是否能在有限算力下实时运行;
  • 是否能同时识别远处的大物体和近处的小物体;
  • 是否对相机轻微抖动、物体位置的小变化保持鲁棒。

2.3.2.1 池化层

**池化(Pooling)**是在局部窗口内对特征进行聚合的操作,其输入是一张特征图,输出为尺寸更小的特征图。常见形式包括最大池化(Max Pooling)和平均池化(Average Pooling)。(geeksforgeeks.org)

设输入特征图为 \(x \in \mathbb{R}^{H \times W \times C}\),池化窗口大小为 \(f \times f\),步幅为 \(\displaystyle s\),则最大池化可写成:

\[ y_{i,j,c} = \max_{0 \le m, n < f} x_{is+m,\ js+n,\ c} \]

平均池化则是取窗口内所有值的平均。

从效果上看:

+最大池化:保留局部区域内最强的激活,适合回答“这里是否存在某种特征”; +平均池化:平均化局部响应,更关注整体强度,起到一定平滑和去噪作用; +全局平均池化(Global Average Pooling):对整张特征图在空间维度上取平均,将每个通道压缩为一个数,常用来替代最后的全连接层。(Towards AI)

池化的主要作用包括:(Milvus)

+降低空间维度:缩小特征图尺寸,减少后续层的参数和计算量; +抑制过拟合:通过聚合邻域信息,减少模型对单个像素噪声的敏感度; +提升平移不变性:微小位置偏移在池化后往往不会改变聚合结果,使模型对物体位置变化更鲁棒。

在机器人视觉中,池化有助于应对:相机轻微抖动、机器人自身微小位姿变化导致的图像差异,使感知对高层任务而言更加“稳定”。

【图 2-XX:池化层示意图——左侧为输入特征图,局部 2×2 区域通过最大池化或平均池化被压缩成单个值,右侧为下采样后的特征图(图片占位)】

2.3.2.2 下采样的作用

**下采样(Downsampling)**并不局限于显式的池化层,使用卷积层时将步幅设为大于 1(如 stride=2)同样可以实现下采样效果。(cs231n.github.io)

从信号处理的视角看,下采样会丢失部分高频细节,但带来几个重要好处:

1.扩大有效感受野 每向下采样一次,后续卷积层的每一个单元对应的输入区域就成倍扩大。几层卷积 + 下采样之后,高层特征能“看到”更大的场景,用较小的特征图表达更大范围的信息,这对理解全局布局至关重要。 2.降低计算成本 特征图尺寸每缩小一半,后续卷积的计算量大致缩小为原来的四分之一。对于需要高帧率感知的机器人系统,下采样是控制推理时间的关键手段。 3.提高尺度与平移鲁棒性 多次下采样后的特征更关注粗尺度的语义结构,对物体位置、大小的小幅变化不敏感。这使机器人在不同距离观察同一物体时仍能做出相似判断。(Milvus)

当然,下采样也带来一个明显问题:小物体信息容易在多次压缩后消失。例如桌面上的螺丝、插头,或者远处的路标、行人,如果在感知链路中过早、过多地下采样,最终用于决策的高层特征中可能再也看不到这些小目标。这正是后面特征金字塔与 FPN 要解决的问题。

【图 2-XX:下采样级联示意——一张输入图像经过若干层卷积+下采样,特征图从 256×256 逐步缩小到 128×128、64×64、32×32 等(图片占位)】

2.3.2.3 特征金字塔应用

**特征金字塔(Feature Pyramid)**的思想源自传统计算机视觉中的图像金字塔:通过对输入图像做多次下采样,在不同尺度上进行处理,从而同时兼顾大物体和小物体。深度学习时代的特征金字塔进一步利用了 CNN 各层天然具有不同分辨率的特征图。(CVF开放获取)

**Feature Pyramid Network(FPN)**是这一思想的代表性结构,其核心设计包括:(CVF开放获取)

1.自下而上的路径(Bottom-up) 主干 CNN(如 ResNet)逐层下采样,得到一系列从高分辨率到低分辨率的特征图。浅层特征分辨率高但语义弱,深层特征分辨率低但语义强。 2.自上而下的路径(Top-down) 将最深层、语义最强的特征图通过上采样(如最近邻或双线性插值)逐层放大,再与对应的浅层特征通过横向连接(lateral connections)相加或拼接,让每一层既保留高分辨率,又拥有足够的语义信息。 3.多尺度检测头 在构成的金字塔每一层上分别布置检测头:高分辨率层负责小物体,中等分辨率层负责中等物体,低分辨率层负责大物体。实践表明,FPN 极大提升了小物体检测性能,已成为现代目标检测框架(如 Faster R-CNN、RetinaNet)的标准组件。(arXiv)

在机器人具身智能领域,多尺度特征的价值同样显著:

  • 桌面操作中,机器人既要看清“桌子整体布局”(大尺度),又要准确识别“插头孔位、螺丝孔、瓶盖刻度”(小尺度);
  • 移动机器人或自动驾驶,需要同时感知远处道路结构和近处行人脚步、小物体障碍物;
  • 在复杂场景中,小目标(开关、按钮)往往决定任务是否成功,FPN 等结构因此常被用于机器人视觉感知前端。

【图 2-XX:FPN 结构示意图——底部为 CNN backbone 的多层特征图,自上而下路径通过上采样和横向连接构成多尺度特征金字塔,每一层连接到相应检测头(图片占位)】

CNN、池化、下采样和特征金字塔共同构成了现代机器人视觉中的“基础设施”。在此基础上,我们还需要处理另一类核心数据:时间序列,这正是下一小节 RNN/LSTM/GRU 所要解决的问题。


2.3.3 RNN / LSTM / GRU 的基本结构与局限性

具身智能不仅要看“这一帧是什么样子”,还要理解“之前发生了什么”、“接下来会发生什么”。机器人每一步的决策都依赖历史观测、动作和隐含的环境状态,这天然是一个时间序列问题。循环神经网络(Recurrent Neural Networks, RNN)及其门控变体 LSTM、GRU 是在 Transformer 出现之前,处理序列数据的主力模型。

2.3.3.1 RNN

**循环神经网络(RNN)**的核心思想是:在每个时间步 \(\displaystyle t\),不仅处理当前输入 \(x_t\),还维护一个隐藏状态 \(h_t\),用于“记住”此前的信息。更新可以写成:(Amazon Web Services, Inc.)

\[ \begin{aligned} h_t &= \phi(W_x x_t + W_h h_{t-1} + b), y_t &= W_y h_t + c, \end{aligned} \]

其中 \(\phi\) 通常是非线性函数(如 \(\tanh\))。如果把 RNN 沿时间轴展开,可以看到它是一条链式结构:同一个单元在每个时间步重复使用,参数在时间维度共享。

直观理解:

  • \(h_t\) 相当于到目前为止序列的“压缩记忆”;
  • 给定整个输入序列 \(x_1, x_2, \dots, x_T\),RNN 依次递推,得到隐藏状态序列 \(h_1, \dots, h_T\) 和输出序列 \(y_1, \dots, y_T\)。

在机器人场景中,RNN 可以用来:

  • 处理关节角度、速度、力矩等时间序列,预测未来状态或控制信号;
  • 对连续的视觉特征序列进行建模,例如从视频序列中推断物体动态;
  • 建模传感器序列(IMU、力传感器)以检测异常模式。

然而,基础 RNN 存在明显缺陷:反向传播过程中的梯度在时间维很容易出现消失或爆炸,使得网络难以学习长时间跨度的依赖关系。这正是 LSTM 和 GRU 被提出的背景。(ResearchGate)

【图 2-XX:RNN 展开结构示意——单个 RNN 单元在多个时间步重复,显示输入 x_t、隐藏状态 h_t 的递推关系(图片占位)】

2.3.3.2 LSTM

**长短期记忆网络(Long Short-Term Memory, LSTM)**通过引入显式的“记忆单元”和门控机制,缓解了普通 RNN 的长期依赖问题。(arXiv)

LSTM 的核心是两条状态:

+单元状态 \(c_t\):用于长期存储信息,相对“直通”,可跨越多个时间步几乎不变; +隐藏状态 \(h_t\):对外暴露的状态,用于当前预测。

以及三个门:

+遗忘门 \(f_t\):决定保留多少旧记忆; +输入门 \(i_t\):决定写入多少新信息; +输出门 \(o_t\):决定暴露多少记忆给当前输出。

一组典型的更新公式是:

\[ \begin{aligned} f_t &= \sigma(W_f [x_t, h_{t-1}] + b_f), i_t &= \sigma(W_i [x_t, h_{t-1}] + b_i), g_t &= \tanh(W_g [x_t, h_{t-1}] + b_g), c_t &= f_t \odot c_{t-1} + i_t \odot g_t, o_t &= \sigma(W_o [x_t, h_{t-1}] + b_o), h_t &= o_t \odot \tanh(c_t), \end{aligned} \]

其中 \(\sigma\) 是 sigmoid,\(\odot\) 为逐元素乘。

直觉上:

  • 如果遗忘门 \(f_t\) 接近 1,输入门 \(i_t\) 接近 0,则 \(c_t \approx c_{t-1}\),网络就会“几乎原样地”把记忆传下去;
  • 如果遗忘门接近 0,输入门接近 1,则 LSTM 会丢弃旧记忆并写入新内容。

这一机制使得 LSTM 在许多序列任务(语言建模、语音识别、时间序列预测等)上远优于普通 RNN,也更擅长处理长距离依赖。(arXiv)

在机器人具身智能中,可以用 LSTM 来建模:

  • 长时间的操作序列,例如“开门→进入→关门→走向桌子→抓取杯子→放进柜子”,帮助机器人记住所处阶段;
  • 复杂环境动态,例如预测移动障碍物的轨迹。

但 LSTM 的代价也很明显:结构复杂、参数较多,计算量大,训练时间长。这在算力受限、需要实时响应的机器人平台上,有时会成为瓶颈。(Medium)

【图 2-XX:LSTM 单元结构示意——展示 c_t 的水平流动、f/i/o 三个门与候选更新 g_t 的乘加路径(图片占位)】

2.3.3.3 GRU

**门控循环单元(Gated Recurrent Unit, GRU)**是 LSTM 的一种简化变体,试图在保持长期依赖建模能力的同时减少参数数量与计算复杂度。(ResearchGate)

GRU 只有一个状态 \(h_t\),不再区分 \(c_t\) 和 \(h_t\),并使用两个门:

+更新门 \(z_t\):在“保留旧记忆”和“写入新记忆”之间做权衡; +重置门 \(r_t\):决定在计算当前候选状态时,参考过去记忆的程度。

典型更新公式为:

\[ \begin{aligned} z_t &= \sigma(W_z [x_t, h_{t-1}] + b_z), r_t &= \sigma(W_r [x_t, h_{t-1}] + b_r), \tilde{h}_t &= \tanh(W_h [x_t, r_t \odot h_{t-1}] + b_h), h_t &= (1 - z_t) \odot h_{t-1} + z_t \odot \tilde{h}_t. \end{aligned} \]

直觉上:

  • 若 \(z_t\) 很小,\(h_t\) 接近旧状态 \(h_{t-1}\);
  • 若 \(z_t\) 很大,则更多采用新候选状态 \(\tilde{h}_t\)。

GRU 相比 LSTM 有更少的门、更少的矩阵乘法,在许多任务上能获得相近甚至更好的性能,同时训练和推理速度更快;这对实时性要求高的机器人场景尤其有吸引力。(Medium)

【图 2-XX:GRU 单元结构示意——显示更新门、重置门以及新旧状态的加权合成路径(图片占位)】

2.3.3.4 序列建模局限

尽管 RNN / LSTM / GRU 在一段时间内是序列建模的主角,至今仍在很多工业系统中发挥作用,但在机器人具身智能这一更复杂的场景下,它们也暴露出一些核心局限,为后续 Transformer 类架构的出现埋下伏笔。(arXiv)

1.对极长序列依然吃力 LSTM 和 GRU 相比基本 RNN 大幅改善了梯度消失问题,但在需要建模数百甚至上千步依赖的场景中(例如几十分钟的多阶段任务),训练仍然困难,模型往往倾向于只利用较近的历史。对于希望“记住用户最开头指令细节”的家庭服务机器人,这是明显瓶颈。 2.时间维度无法并行 RNN 家族在时间维度上具有天然的顺序依赖:\(h_t\) 必须先计算 \(h_{t-1}\)。这导致训练和推理都难以在时间轴上做大规模并行。相比之下,卷积和自注意力可以同时处理整个序列,大幅提升训练效率。对于需要处理高帧率传感数据或长时间视频的机器人系统,这种串行计算会严重限制模型规模和性能。(geeksforgeeks.org) 3.优化敏感、调参成本高 RNN 的训练对学习率、梯度裁剪阈值、序列截断长度等超参数都较为敏感,很容易出现梯度爆炸(loss 突然变成 NaN)或收敛到次优。对于实际机器人系统,工程团队往往无法像离线 NLP 训练那样反复尝试多套配置,这限制了其大规模应用。(alinlab.kaist.ac.kr) 4.难以直接建模“任意远”的交互 在 RNN 框架下,所有历史信息被“压缩”进一个向量序列 \(\displaystyle (h_t)\),模型难以显式知道“当前决策依赖于哪几个关键时间点”。而基于自注意力的模型可以通过注意力权重直接连接任意两个时间步,更容易表达“当前动作需要参考 20 步之前那次观察”的模式,也更易于可视化和解释。(geeksforgeeks.org) 5.多模态长序列融合能力有限 在具身智能任务中,我们常常需要同时处理:视觉特征序列、语言指令 token 序列、机器人状态轨迹等多种模态。如果全部塞进一个 RNN,其隐藏状态必须非常高维才能容纳这些信息,训练难度和参数规模都迅速膨胀;而多头自注意力则更自然地支持在不同模态、不同时间步之间建立稀疏而有结构的相关性。

综合来看,RNN / LSTM / GRU 在处理短到中等长度的序列、传统时间序列预测任务时依然有用,也在早期机器人控制与预测中发挥了重要作用。但随着数据规模增大、序列变长、模态变多、并行计算硬件发展,自注意力与 Transformer 架构逐渐成为主流选择。下一节将从自注意力机制切入,系统介绍 Transformer 如何在时间与空间上统一建模,为后文的视觉-语言-动作(VLA)模型打下基础。

本章小结与自测

三行小结

  1. 本章建立深度学习训练与 Transformer 的工程认知。
  2. 核心是结构、目标函数、优化与稳定性联动理解。
  3. 学完后应能从训练日志定位主要问题来源。

检查题

  1. 用你自己的话总结本章最核心的一个公式/机制。
  2. 给出一个“如果要落地到项目里,你会怎么用”的具体例子。

常见误区

  1. 只看模型结构,不看训练配置。
  2. 出现 NaN 时只降学习率而不查数据。
  3. 把单次结果当作稳定结论。

公式到代码(最小示例)

import torch

model = torch.nn.Linear(16, 4)
opt = torch.optim.AdamW(model.parameters(), lr=1e-3)
x = torch.randn(8, 16)
y = torch.randint(0, 4, (8,))
loss = torch.nn.CrossEntropyLoss()(model(x), y)
loss.backward()
torch.nn.utils.clip_grad_norm_(model.parameters(), 1.0)
opt.step(); opt.zero_grad()

本章外部参考(集中)

  1. cs231n.github.io
  2. AI Summer
  3. ultralytics.com
  4. NeurIPS Proceedings
  5. geeksforgeeks.org
  6. Towards AI
  7. Milvus
  8. CVF开放获取
  9. arXiv
  10. Amazon Web Services, Inc.
  11. ResearchGate
  12. arXiv
  13. 本章其余链接可在正文中按上下文继续查阅。

2.4 Transformer 结构

2.4.1 Self-Attention 机制与 Query/Key/Value

学习导航

  • 本章主题:2.4.1 Self-Attention 机制与 Query/Key/Value
  • 前置知识:建议先完成第 1 章核心内容。
  • 建议用时:70-90 分钟
  • 阅读顺序:先看概念框架,再看公式/代码,最后做自测。

关键图示:Transformer 数据流

关键图示:Transformer 数据流

在前面的序列建模部分已经看到,RNN/LSTM 通过“递归地”一格一格地处理序列,这使得长距离依赖不易捕获,也难以并行训练。Self-Attention(自注意力)则直接在序列中任意两个位置之间建立可学习的“相似度连接”,从而在一次运算中融合全局信息,是 Transformer 的核心思想之一。(arXiv)

2.4.1.1 自注意力机制:在序列内部做“加权信息汇总”

设输入序列长度为 \(\displaystyle n\),每个位置的向量维度为 \(d_\text{model}\),将整个序列写成矩阵形式:

\[ X \in \mathbb{R}^{n \times d_\text{model}}. \]

通过三组不同的线性变换,得到 Query(Q)、Key(K)、Value(V):

\[ Q = X W^Q,\quad K = X W^K,\quad V = X W^V, \]

其中 \(W^Q, W^K, W^V \in \mathbb{R}^{d_\text{model} \times d_k}\) 或 \(\mathbb{R}^{d_\text{model} \times d_v}\) 是可训练的权重矩阵。

标准的scaled dot-product attention定义为:(维基百科)

\[ \text{Attention}(Q, K, V) = \text{softmax}!\left(\frac{Q K^\top}{\sqrt{d_k}}\right) V. \]

其中:

  • \(QK^\top \in \mathbb{R}^{n\times n}\) 给出序列中任意两个位置之间的“相关性分数”(内积越大,越相似);
  • 除以 \(\sqrt{d_k}\) 是为了避免维度过大时内积值过大导致 softmax 饱和;
  • softmax 在每一行上做归一化,将相关性分数转为“注意力权重”(非负且和为 1);
  • 将这些权重对 \(\displaystyle V\) 做加权和,得到每个位置融合了整句信息的新表示。

直观地看,每个位置 \(\displaystyle i\) 的输出向量就是“从全序列所有位置的 Value 中,按相关性做加权平均”的结果,自注意力因此可以在单层中捕获任意距离的依赖关系。

【图 2-4-1 占位:自注意力示意图。上方是一行 token(或 patch)向量,中间通过 Q/K/V 线性变换,下面是一个 \(n\times n\) 注意力矩阵热力图;矩阵第 i 行突出显示该位置对其它位置的关注程度。】

2.4.1.2 Query / Key / Value 的含义与类比

Q/K/V 的命名可以类比为“查字典”的过程:(billparker.ai)

+Query(Q,查询):当前想要“查”的词条,如一个位置上的 token 表示; +Key(K,键):所有候选词条的“索引标签”,用于和 Query 做匹配; +Value(V,值):与每个 Key 对应的内容,一旦某个 Key 与 Query 匹配度高,就会更多地读取其对应的 Value 信息。

注意力分数由 Query 与各个 Key 的相似度决定(通常就是向量内积),再通过 softmax 归一化后,作为对 Value 的加权系数。因此:

  • 若 Query 与某个 Key 成“高相似度”,对应 Value 在输出中权重更大;
  • 若 Query 与某些 Key 几乎无关,则它们对应的 Value 在输出中的权重接近 0。

编码器自注意力中,Q/K/V 都来自同一个输入序列;在**解码器的交叉注意力(encoder-decoder attention)**中,Q 来自解码器当前状态,而 K/V 来自编码器输出,这将在 2.4.4 节进一步展开。(维基百科)

从具身智能的角度可以这样理解:机器人在某个时间步要做决策时,它把当前状态向量作为 Query,把过去观测或语言指令编码后的向量作为 Key/Value,通过 attention“查”到与当前状况最相关的信息,再基于这些信息输出动作。

2.4.1.3 注意力矩阵与掩码机制

把自注意力的权重部分单独记为矩阵:

\[ A = \text{softmax}!\left(\frac{QK^\top}{\sqrt{d_k}}\right) \in \mathbb{R}^{n\times n}. \]

  • \(A_{ij}\) 表示“序列中位置 \(\displaystyle i\) 对位置 \(\displaystyle j\) 的注意力权重”;
  • 每一行都是一个概率分布(和为 1),体现了位置 \(\displaystyle i\) 对各个位置的关注程度。

Encoder 层中常用的全连接自注意力,允许每个位置关注序列中任意位置;而在 Decoder 的自回归生成中,为避免“偷看未来”,会对注意力矩阵进行下三角**因果掩码(causal mask)**处理:在 softmax 前将所有“未来位置”的相关性分数置为 \(-\infty\),softmax 之后它们的权重就变为 0,仅允许当前位置看到自己与其之前的 token。(维基百科)

【图 2-4-2 占位:注意力矩阵与掩码示意图。左图为完整的 \(n\times n\) 注意力矩阵热力图;右图为 Decoder 中的下三角掩码矩阵,上三角区域被灰色遮挡(权重为 0)。】

在机器人动作序列建模中,自回归 Decoder-only 架构同样使用这种因果掩码,以保证每一步动作仅依赖过去的观测和动作历史,符合物理因果顺序。


2.4.2 多头注意力(Multi-Head Attention)

单一的自注意力头相当于从一个“投影子空间”里计算相似度和信息汇总。Transformer 引入多头注意力(Multi-Head Attention),并行地在多个子空间中计算注意力,从而提高表达能力。(NeurIPS论文)

2.4.2.1 多头机制的形式化定义

在多头注意力中,我们为每个头 \(\displaystyle i\) 单独学习一组线性变换:

\[ W_i^Q, W_i^K, W_i^V \in \mathbb{R}^{d_\text{model} \times d_k},\quad i = 1,\dots,h, \]

\[ \text{head}_i = \text{Attention}(QW_i^Q,\ KW_i^K,\ VW_i^V). \]

然后将所有头的输出在特征维上拼接,再通过一个线性层 \(W^O\) 做整合:

\[ \text{MultiHead}(Q,K,V) = \text{Concat}(\text{head}_1, \dots, \text{head}_h) W^O. \]

(维基百科)

这样,每个头都在各自的投影子空间中学习不同的相似性模式,最终汇聚为一个更丰富的表示。

【图 2-4-3 占位:多头注意力结构图。上方 Q/K/V 通过多组线性变换分别进入多个 attention 单元(Head 1, Head 2, …, Head h),各自输出后在特征维拼接,再经过一个线性层得到最终输出。】

2.4.2.2 不同注意力头学习不同的关系

大量实证分析表明,不同注意力头往往会“专注”于不同类型的模式:(科学导向)

  • 在自然语言任务中,有的头擅长捕获邻近词之间的局部依赖(如短语结构),有的头捕获长距离依赖(如跨句子的共指、主题联系);
  • 在视觉 Transformer 中,有的头聚焦局部 patch 的几何关系,有的头关注整体场景结构或物体的语义轮廓。

对于具身智能任务,可以预期:

  • 某些头重点关注与目标物体相关的视觉区域;
  • 某些头偏重障碍物和安全边界;
  • 还有一些头可能更关注时间维度上动作的连续性或物体轨迹。

虽然这些“功能分工”不是硬编码的,而是训练过程中自发涌现,但在实践中,可以通过可视化注意力权重来分析模型行为,从而对机器人决策过程获得一定的可解释性(在第 10 章可解释性部分会再回到这一点)。

【图 2-4-4 占位:多头注意力可视化示例。对同一句话(或同一图像 patch 序列),展示多个头的注意力矩阵热力图,每个头关注的模式不同。】

2.4.2.3 计算开销与并行执行

从复杂度角度看,多头注意力虽然引入了多个头,但每个头通常使用较小的 \(d_k\)(例如 \(d_k = d_\text{model} / h\)),因此总的计算量与单个大头的注意力同阶,只是常数因子有所增加。(NeurIPS论文)

更重要的是,各个头之间完全可以在 GPU/TPU 上并行计算,因此在现代硬件上,多头注意力的实际计算效率很高,与标准矩阵乘法的实现高度契合。这也是 Transformer 能够在视觉、语言以及多模态任务上高效扩展到大规模模型的关键工程基础。

在机器人应用中,多头注意力使得单个 VLA 模型可以同时在不同“视角”下理解环境与任务指令,为后续的动作决策提供更丰富的上下文表征。


2.4.3 位置编码(绝对 / 相对)

自注意力机制本身对输入顺序是“置换不变”的——如果不显式加入位置信息,模型仅将序列视为一个“集合”,无法区分不同排列顺序,从而无法正确建模时间顺序或语序。(ACL Anthology)

为了解决这一问题,Transformer 在输入层或各层内部引入位置编码(Positional Encoding),将位置信息注入到每个 token 或 patch 的表示中。

2.4.3.1 绝对位置编码:正弦/余弦函数形式

原始 Transformer 论文提出了一种固定的正弦–余弦位置编码,给每个位置 (pos) 分配一个维度为 \(d_\text{model}\) 的向量:(arXiv)

\[ \begin{aligned} \text{PE}(pos, 2i) &= \sin\left(\frac{pos}{10000^{2i/d_\text{model}}}\right), \text{PE}(pos, 2i+1) &= \cos\left(\frac{pos}{10000^{2i/d_\text{model}}}\right), \end{aligned} \]

其中 \(i = 0,1,\dots, d_\text{model}/2-1\)。

特点与直觉:

  • 不同维度对应不同波长的正弦波,低频维度编码粗粒度的位置信息,高频维度编码细粒度的局部差异;
  • 由于是解析函数定义,不需要训练额外参数,并且可以自然地外推到比训练时更长的序列长度;
  • 通过线性组合不同维度,模型可以在一定程度上推断两个位置之间的相对距离。

在实现上,常见做法是在输入 embedding 上“相加”位置编码:

\[ X^\text{input}_i = X^\text{embed}_i + \text{PE}(i). \]

【图 2-4-5 占位:若干维度的正弦/余弦位置编码随位置变化的曲线图,展示不同频率、不同波长的波形。】

除正弦编码之外,很多模型也采用可学习的绝对位置 embedding,即像词向量一样为每个位置建立一个可训练表,将其加到输入上。实现更简单,但在泛化到更长序列时往往需要额外技巧。

2.4.3.2 相对位置编码:对相对距离更敏感

绝对位置编码强调的是“某个 token 在整个序列中处于第几位”;然而很多任务更关心的是token 之间的相对距离——例如“当前词前面最近的名词在哪里”,“上一时刻与当前时刻的相对差值”等。(arXiv)

**相对位置编码(Relative Positional Encoding, RPE)**的基本思想,是让注意力分数不仅依赖于内容相似度 \(q_i^\top k_j\),还依赖于位置差值 \(\displaystyle (i-j)\) 对应的一个向量或偏置,例如:(Lilian Weng)

\[ \text{score}_{ij} = \frac{q_i^\top k_j + q_i^\top r_{i-j}}{\sqrt{d_k}}, \]

其中 \(r_{i-j}\) 是与相对位移 \(\displaystyle (i-j)\) 相关的参数向量或标量偏置。

代表性工作包括:

  • Shaw 等人在机器翻译中的相对位置编码;
  • Transformer-XL 使用相对位置编码解决长上下文建模问题;
  • 后续的 T5、RoPE(Rotary Position Embedding)等方法,对相对位置进一步推广,使模型对序列整体平移具有更好的不变性。(Lilian Weng)

在机器人与具身智能任务中,时间维度往往很长,而我们关注的是“前后几步”动作与观测之间的因果关系,相对位置编码因此更加契合时序决策的需求。

【图 2-4-6 占位:相对位置编码示意图。以当前时间步为中心,展示不同相对位移(-k…0…+k)的编码向量,或绘制一个相对位置偏置矩阵。】

2.4.3.3 位置编码的重要性:从“集合”到“有序序列”

如果不给 Transformer 加入任何位置信息,网络对输入的任何排列都将给出相同的输出(只是对应位置发生置换),这会导致:

  • 在语言任务中无法区分 “把红色方块放入盒子” 与 “盒子放入红色方块”;
  • 在机器人控制中无法区分“先抓取后放置”与“先放置后抓取”的时序逻辑。

位置编码正是将**“序列顺序”**显式注入到模型中的关键步骤,使自注意力从“集合运算”转变为真正的“序列建模”。(ACL Anthology)

在后续构建 VLA 模型时,时间步编号、视频帧序号、甚至任务分段(如“示教阶段/执行阶段”)都会通过某种形式的“位置或阶段编码”进入模型,使机器人能够理解“何时发生了什么”。


2.4.4 Encoder–Decoder 架构与纯 Decoder 架构

Transformer 最初以编码器–解码器(Encoder–Decoder)形式提出,用于机器翻译等序列到序列任务。随后,纯Decoder-only架构(如 GPT 系列)成为大语言模型和部分 VLA 模型的主流。理解两者差异,有助于后面选择适合具身智能任务的结构。(arXiv)

2.4.4.1 编码器–解码器架构:典型 Seq2Seq 形式

在 Encoder–Decoder Transformer 中:

+编码器(Encoder):由多层“自注意力 + 前馈网络(FFN)”组成。输入为源序列(例如源语言句子、环境描述、视觉特征序列),经过多层编码后,得到每个位置的上下文表示。 +解码器(Decoder):同样由多层堆叠组成,但每一层一般包括:

  1. 带因果掩码的自注意力(masked self-attention),建模目标序列内部已生成部分;
  2. 编码器–解码器注意力(encoder-decoder cross-attention),使用解码器当前层隐藏状态作为 Query,编码器输出作为 Key/Value,从源序列里“查找”与当前生成位置相关的信息;
  3. 前馈网络。

这种结构天然适合“把一段信息转换为另一段信息”的任务,例如机器翻译、摘要生成等。(arXiv)

【图 2-4-7 占位:Encoder–Decoder 架构总览图。左侧是若干 Encoder 层叠加,右侧是 Decoder 层,Decoder 每层中有 self-attention、cross-attention 两种注意力模块,中间用箭头表示 cross-attention 连接。】

在具身智能场景中,如果希望“根据视觉感知或状态序列生成一整段动作脚本”,也可以将视觉/状态作为编码器输入,把动作序列作为解码器输出,这与机器翻译非常类似,只是“目标语言”换成了“机器人动作语言”。

2.4.4.2 纯解码器(Decoder-only)架构:统一序列建模

Decoder-only架构则去掉了单独的编码器,仅保留一堆带因果掩码的自注意力层。训练时将所有内容串成一个长序列,采用自回归语言建模目标:给定前缀 token 预测下一个 token。(Hugging Face)

其特点是:

  • 所有信息(指令、上下文、历史观测、历史动作等)都以统一 token 序列的形式输入;
  • 模型结构更加简洁——本质上就是一个大号自回归 Transformer;
  • 通过合适的分隔符 token 和位置段编码,可以区分“指令区域”“状态区域”“动作区域”等。

这正是 GPT 系列等大语言模型采用的结构,也是许多最新 VLM/VLA 模型采用的范式 —— 将视觉特征、语言指令、机器人状态和动作都离散化成 token,统一交给一个 Decoder-only 模型处理。(科学导向)

2.4.4.3 架构选择:任务类型与工程需求

总结两者的适用场景:

+Encoder–Decoder 架构

  • 适合“源序列–目标序列”有明显区分的任务,如机器翻译、长文本摘要、将一段视觉/语言描述转换为完整动作脚本;
  • 在具身智能中,可用于“先感知–后离线规划”的场景,例如根据任务描述和环境扫描生成一条完整的执行计划。 +Decoder-only 架构
  • 适合大规模预训练的通用语言/多模态模型。通过把不同模态与任务都统一到 token 序列上,可以用同一套训练目标和基础设施扩展到非常大的规模;
  • 在具身智能中,可通过“指令 + 多模态观测 + 历史轨迹”的统一序列,让同一个基础模型同时学会多种机器人和多种任务的行为模式。

在第 8 章讨论 VLA 架构时,将可以看到两种思路的具体实现:一类是“感知模块 + Decoder 生成动作”的结构(更接近 Encoder–Decoder),另一类则是基于大号 Decoder-only 模型,通过 token 化动作实现统一序列建模的结构。

【图 2-4-8 占位:架构对比图。左侧是 Encoder–Decoder 结构示意,右侧是 Decoder-only 结构示意,下方各自标注典型应用场景(机器翻译 vs GPT 风格生成 vs 多模态 VLA)。】


2.4.5 参数规模与计算复杂度

Transformer 的表达能力很强,但背后对应的是相当可观的参数规模与计算复杂度。本节从参数量和时间/空间复杂度两个角度建立直观认识,这对于后续讨论机器人系统部署、模型压缩与高效注意力尤为重要。(科学导向)

2.4.5.1 Transformer 参数规模估算

以一个标准 Transformer Block 为例,假设:

  • 模型隐藏维度为 \(d_\text{model}\);
  • 前馈网络内部维度为 \(d_\text{ff}\)(通常取 \(4d_\text{model}\) 左右);
  • 注意力头数为 \(\displaystyle h\)。

单层的大致参数量:

1.自注意力部分

  • Q/K/V 三个线性层:约 \(3 d_\text{model}^2\) 参数;
  • 输出线性层 \(W^O\):约 \(d_\text{model}^2\) 参数。 合计 \(\approx 4 d_\text{model}^2\)。 2.前馈网络部分(两层 MLP)
  • 第一层:\(d_\text{model} \times d_\text{ff}\);
  • 第二层:\(d_\text{ff} \times d_\text{model}\)。 合计 \(\approx 2 d_\text{model} d_\text{ff}\),在 \(d_\text{ff} \approx 4d_\text{model}\) 时,同样是 \(\mathcal{O}(d_\text{model}^2)\) 量级。(arXiv)

因此,单层 Transformer Block 的参数规模近似为:

\[ \mathcal{O}\big(d_\text{model}^2\big), \]

整个模型若有 \(\displaystyle L\) 层,则总参数量大致为:

\[ \mathcal{O}\big(L d_\text{model}^2\big). \]

这解释了为何在提升模型能力时,增大 \(d_\text{model}\) 和层数会带来近似“平方级别”的参数增长。现代大语言模型和多模态模型往往具有数十到数百层、数千到上万的隐藏维度,对应参数规模可以轻松达到百亿甚至万亿级别。(科学导向)

对于具身智能而言,大参数模型意味着更强的跨任务、跨场景泛化能力(“一个模型包办很多机器人和任务”),但也意味着更重的训练和部署成本,这在后续“模型压缩与边缘部署”相关章节中会成为反复讨论的话题。

2.4.5.2 自注意力的时间与空间复杂度

从计算复杂度角度,自注意力的瓶颈在于构造和使用 \(n \times n\) 的注意力矩阵,其中 \(\displaystyle n\) 为序列长度。(Proceedings of Machine Learning Research)

假设隐藏维度为 \(\displaystyle d\):

  1. 计算 Q/K/V:需要三次矩阵乘法,复杂度约为 \(\mathcal{O}(n d^2)\);
  2. 计算相关性矩阵 \(QK^\top\):复杂度约为 \(\mathcal{O}(n^2 d)\);
  3. 计算 softmax 并与 V 相乘:同样约为 \(\mathcal{O}(n^2 d)\)。

当 \(n\) 较大时,\(\mathcal{O}(n^2 d)\) 项占主导,因此通常说自注意力在序列长度上的时间和空间复杂度均为 \(\mathcal{O}(n^2)\)。(ACL Anthology)

这在 NLP 中已经构成长文本建模的瓶颈,而在具身智能中,情况往往更加严峻:

  • 机器人控制序列可能包含成千上万步决策;
  • 视觉输入可能是一长段视频(每帧又被切分为多个 patch);
  • 若将语言、视觉、状态、动作 token 统一串成一个长序列 \(n\),则注意力矩阵大小和计算量会极快增长。

为此,近几年出现了大量高效 Transformer 变体,如 Linformer、Performer、Longformer 等,通过低秩近似、稀疏注意力、窗口注意力等机制,将复杂度从 \(\mathcal{O}(n^2)\) 降低到近似线性的 \(\mathcal{O}(n)\) 或 \(\mathcal{O}(n \log n)\),使得长序列任务(包括视频、长轨迹建模)变得可行。(arXiv)

【图 2-4-9 占位:复杂度对比曲线。横轴为序列长度 \(n\)(对数尺度),纵轴为计算/显存开销(对数尺度),画出标准自注意力的 \(n^2\) 曲线与若干近似方法的线性或次线性曲线,标出典型 Transformer 变体名称。】

在本书后面更偏工程实践的章节,将会简要介绍这些高效注意力结构的使用场景,帮助读者在实际机器人项目中根据环境复杂度与硬件条件做出合理选择。

2.4.5.3 模型规模与性能:缩放效应与资源约束

大量工作表明,在足够的数据和计算资源下,Transformer 模型的性能往往随着参数量、训练数据量和训练算力的增加呈现近似幂律关系,即“缩放定律(scaling laws)”:更大模型在语言理解、视觉感知和多模态任务上往往获得更好的泛化能力和少样本学习能力。(科学导向)

然而,在具身智能与机器人领域,还必须严肃考虑以下现实因素:

+训练数据与成本限制 真实机器人互动数据极其昂贵,仿真数据也需要大量算力生成。很难像语言模型那样简单地“堆数据、堆算力”。因此实践中往往采用“互联网多模态预训练 + 少量机器人数据微调”的方式,让大模型在丰富的视觉–语言知识基础上学习具身技能。 +推理延迟与实时性要求 机器人控制通常需要在几十毫秒级内完成一次决策,超出这个延迟可能会明显影响动作平滑性甚至安全性。过大的模型虽然能力强,但若推理速度不足,就只能用于离线规划或云端辅助,而难以直接用于实时闭环控制。 +部署位置与算力约束 在云端运行大模型可以使用强大 GPU/TPU,但极度依赖网络连接,且存在安全与隐私问题;在机器人本体或边缘设备上,则必须结合嵌入式 GPU、专用加速芯片等选择合适规模的模型。这些问题将在第 10 章“部署与评测”和第 10.4 节“工程优化与压缩”中进一步展开。

因此,在实际的 VLA 系统设计中,“尽可能大”并不总是最佳答案。更合理的策略通常是:

  • 利用大规模模型作为“通用基础模型”或云端规划者;
  • 同时通过蒸馏、量化和架构简化,在机器人本体上部署较小的实时控制模型;
  • 在任务复杂度、泛化能力、实时控制、安全性和成本之间寻找平衡点。

这也是本书从理论到实践不断强调的一条主线:Transformer 和大模型为具身智能提供了前所未有的表达能力,但要真正落地到物理机器人上,必须在模型能力与系统工程之间进行精心权衡与设计。


以上就是 2.4.1–2.4.5 的完整展开稿,后续在第 8 章你就可以直接把这里的 Self-Attention、多头、位置编码、架构差异自然嫁接到具体 VLA 模型的输入输出与训练设计上。

本章小结与自测

三行小结

  1. 本章建立深度学习训练与 Transformer 的工程认知。
  2. 核心是结构、目标函数、优化与稳定性联动理解。
  3. 学完后应能从训练日志定位主要问题来源。

检查题

  1. 用你自己的话总结本章最核心的一个公式/机制。
  2. 给出一个“如果要落地到项目里,你会怎么用”的具体例子。

常见误区

  1. 只看模型结构,不看训练配置。
  2. 出现 NaN 时只降学习率而不查数据。
  3. 把单次结果当作稳定结论。

公式到代码(最小示例)

import torch

model = torch.nn.Linear(16, 4)
opt = torch.optim.AdamW(model.parameters(), lr=1e-3)
x = torch.randn(8, 16)
y = torch.randint(0, 4, (8,))
loss = torch.nn.CrossEntropyLoss()(model(x), y)
loss.backward()
torch.nn.utils.clip_grad_norm_(model.parameters(), 1.0)
opt.step(); opt.zero_grad()

本章外部参考(集中)

  1. arXiv
  2. 维基百科
  3. billparker.ai
  4. NeurIPS论文
  5. 科学导向
  6. ACL Anthology
  7. arXiv
  8. Lilian Weng
  9. Hugging Face
  10. Proceedings of Machine Learning Research
  11. ACL Anthology
  12. arXiv

2.5 大模型训练与微调

2.5.1 预训练目标与数据构成

学习导航

  • 本章主题:2.5.1 预训练目标与数据构成
  • 前置知识:建议先完成第 1 章核心内容。
  • 建议用时:41-61 分钟
  • 阅读顺序:先看概念框架,再看公式/代码,最后做自测。

大模型训练的第一阶段是预训练。核心任务不是“学会某个单一任务”,而是通过海量数据学习通用表示与条件生成能力。

2.5.1.1 自回归目标与多模态扩展

语言模型最常见目标是 next-token prediction:

\[ \mathcal{L}{\text{AR}}(\theta) = -\sum{t=1}^{T}\log p_\theta(x_t\mid x_{<t}). \]

在 VLA 场景中,可以把文本、视觉 token、动作 token 拼接成统一序列,仍然使用相同的自回归损失。这样做的好处是训练目标统一,坏处是不同模态的统计特性差异很大,容易出现“强模态压制弱模态”(通常是文本压制动作)。

2.5.1.2 数据混合策略(Data Mixture)

预训练数据通常由多来源组成:

  1. 通用文本语料。
  2. 图文对齐数据。
  3. 机器人示教轨迹与状态-动作序列。

常见做法是设置混合权重:

\[ \mathcal{L} = \lambda_{\text{text}}\mathcal{L}{\text{text}} + \lambda{\text{vl}}\mathcal{L}{\text{vl}} + \lambda{\text{act}}\mathcal{L}_{\text{act}}. \]

工程上不要只看总 loss。建议分别记录每个子损失与每类样本占比,否则很难定位“模型退化到底来自哪一类数据”。

2.5.1.3 数据质量控制

预训练阶段,数据质量常比模型结构更关键。建议最少做三类清洗:

  1. 去重:减少重复样本导致的过拟合和记忆偏差。
  2. 规则过滤:去除损坏样本、错配图文、越界动作。
  3. 分布校验:保证任务、机器人、场景覆盖不过度偏斜。

2.5.2 训练基础设施与稳定性

当模型规模上升后,“能否稳定训练”本身就是主要挑战。

2.5.2.1 全局批量、学习率与 warmup

大模型通常使用较大的全局 batch,并配合 warmup + 衰减调度。一个常见策略是:

  1. 前若干 step 线性 warmup 到目标学习率。
  2. 中后期使用 cosine decay 或分段衰减。

如果 batch、学习率、梯度累计步数不一致地变动,训练曲线会明显抖动,甚至出现 loss 突然发散。

2.5.2.2 混合精度与分布式训练

在大模型训练中,BF16/FP16 与分布式并行几乎是必需项:

  1. 数据并行:提升吞吐。
  2. 张量并行:切分大矩阵计算。
  3. 流水线并行:切分层级降低显存峰值。

无论采用何种并行方式,都建议固定记录以下信息:

  1. 有效 tokens/s。
  2. 每卡显存峰值。
  3. 梯度范数与 loss scale。

2.5.2.3 稳定训练的最小防线

最常见的稳定性手段:

  1. 梯度裁剪:

\[ g \leftarrow g \cdot \min\left(1, \frac{\tau}{|g|}\right) \]

  1. 激活与 loss 的 NaN 监控。
  2. 周期性 checkpoint 与自动恢复。

在机器人场景中,训练稳定性直接影响后续真实部署安全性。离线训练阶段若存在不稳定区间,往往会在在线推理时放大为异常动作。


2.5.3 指令微调与参数高效微调

预训练得到的是“通用能力”,微调阶段才决定它“听谁的话、做什么事”。

2.5.3.1 监督微调(SFT)

SFT 的核心是用高质量指令-响应(或观测-动作)对模型进行任务对齐:

\[ \mathcal{L}{\text{SFT}} = -\sum_t \log p\theta(y_t\mid y_{<t}, x). \]

其中 (x) 可以是文本指令、图像与状态,(y) 可以是文本动作描述或离散动作 token。

2.5.3.2 LoRA / QLoRA

LoRA 将权重更新写成低秩分解:

\[ \Delta W = BA, \]

其中 (A\in\mathbb{R}^{r\times d})、(B\in\mathbb{R}^{k\times r}),(r\ll\min(k,d))。

优势:

  1. 可训练参数少。
  2. 显存压力小。
  3. 可快速多任务切换(不同 adapter)。

QLoRA 在低比特量化基座模型上做 LoRA,可进一步降低资源消耗,适合实验室级 GPU 资源。

2.5.3.3 微调数据的设计原则

比“数据量大”更重要的是“任务边界清晰”:

  1. 指令表达尽量一致,减少同义混乱。
  2. 失败样本要保留并标注,避免模型只学习“理想轨迹”。
  3. 多机器人数据要显式带 embodiment 条件。

2.5.4 偏好对齐与安全约束

SFT 之后,模型通常还需要偏好对齐,减少“看起来合理但不安全”的输出。

2.5.4.1 偏好学习基本范式

常见方式是收集成对偏好样本 ((y^+, y^-)),让模型更偏好高质量行为。

两条主路线:

  1. 奖励模型 + RL(RLHF)。
  2. 直接偏好优化(如 DPO)。

2.5.4.2 DPO 直观理解

DPO 可以在不显式训练奖励模型的情况下,直接优化偏好对比目标。它在实现复杂度与稳定性上通常优于完整 RLHF 流程,适合工程落地。

对机器人系统而言,偏好并不只包含“任务完成”,还应包含:

  1. 动作平滑。
  2. 安全距离。
  3. 对约束指令的服从性。

2.5.4.3 安全数据与红队测试

对齐阶段建议单独构建安全集:

  1. 危险指令样本。
  2. 传感器异常样本。
  3. 边界动作样本(速度/力矩/关节限位附近)。

上线前应做红队测试:用“高风险输入组合”反复压测,而不是只看常规 benchmark 分数。


2.5.5 评测、压缩与部署前准备

训练结束不代表可部署。最后一步是验证“性能、成本、安全”三者平衡。

2.5.5.1 分层评测指标

建议分三层评测:

  1. 离线指标:困惑度、token 准确率、回归误差。
  2. 仿真指标:任务成功率、轨迹质量、恢复能力。
  3. 在线指标:延迟、稳定性、异常率、安全触发率。

2.5.5.2 模型压缩与蒸馏

常见压缩路径:

  1. 量化(8bit/4bit)。
  2. 蒸馏(teacher-student)。
  3. 结构裁剪(层数/宽度/头数)。

实践中通常先蒸馏再量化,避免精度损失过大。

2.5.5.3 部署前检查清单

建议在部署前完成以下清单:

  1. 固定随机种子可复现。
  2. 关键实验可一键重跑。
  3. 推理延迟满足控制频率预算。
  4. 安全过滤器与急停策略已联调。
  5. 失败案例库已建立并可回放。

到这一步,2.5 章节的核心目标才算达成:你不仅“训练了一个大模型”,而且建立了可复现、可评测、可部署的完整微调流水线。


2.5 小结

  1. 预训练阶段决定上限,微调阶段决定行为边界。
  2. 训练稳定性、数据质量、偏好对齐是三根主线。
  3. 真实机器人部署前,必须把性能指标和安全指标同等对待。

2.5.6 参考阅读(集中)

  1. Transformer 原始论文:https://arxiv.org/abs/1706.03762
  2. LoRA:https://arxiv.org/abs/2106.09685
  3. QLoRA:https://arxiv.org/abs/2305.14314
  4. DPO:https://arxiv.org/abs/2305.18290
  5. RLHF 概览:https://arxiv.org/abs/2203.02155

本章小结与自测

三行小结

  1. 本章建立深度学习训练与 Transformer 的工程认知。
  2. 核心是结构、目标函数、优化与稳定性联动理解。
  3. 学完后应能从训练日志定位主要问题来源。

检查题

  1. 用你自己的话总结本章最核心的一个公式/机制。
  2. 给出一个“如果要落地到项目里,你会怎么用”的具体例子。

常见误区

  1. 只看模型结构,不看训练配置。
  2. 出现 NaN 时只降学习率而不查数据。
  3. 把单次结果当作稳定结论。

公式到代码(最小示例)

import torch

model = torch.nn.Linear(16, 4)
opt = torch.optim.AdamW(model.parameters(), lr=1e-3)
x = torch.randn(8, 16)
y = torch.randint(0, 4, (8,))
loss = torch.nn.CrossEntropyLoss()(model(x), y)
loss.backward()
torch.nn.utils.clip_grad_norm_(model.parameters(), 1.0)
opt.step(); opt.zero_grad()

本章外部参考(集中)

  1. 本章暂无外部链接,建议优先完成本章自测与代码实践。

3.1 经典视觉任务与数据集

3.1.1 图像分类、目标检测、实例分割 / 语义分割

学习导航

  • 本章主题:3.1.1 图像分类、目标检测、实例分割 / 语义分割
  • 前置知识:建议先完成第 2 章基础网络与训练技巧。
  • 建议用时:77-97 分钟
  • 阅读顺序:先看概念框架,再看公式/代码,最后做自测。

关键图示:视觉任务流水线

关键图示:视觉任务流水线

这一小节讨论的任务,可以理解为“视觉理解的三个层级”:

+图像分类:只回答“这张图整体是什么?” +目标检测:回答“图里有哪些目标、在什么位置?” +分割(语义 / 实例):精确到“每一个像素属于什么东西?哪些像素属于同一个物体个体?”

从具身智能角度看,这三个层级对应着从“看懂是什么”到“知道在哪里”再到“知道它的形状和边界”,直接影响机器人能否安全地移动、对物体进行精细操作。

图片占位建议:一张包含多辆车和行人的街景,分别画出 – 只标注整图类别(如 “city street”); – 带边界框的检测结果; – 语义分割伪彩色图; – 实例分割图(同类物体用不同颜色或不同边界)。


3.1.1.1 图像分类(Image Classification)

任务定义

给定一张图像 \(\displaystyle x\),输出一个或多个类别标签 \(\displaystyle y\):

+单标签分类:一张图只对应一个主类别,例如 “狗”“飞机”。 数学上是 \(y \in \{1,\dots, C\}\)。 +多标签分类:一张图可以同时属于多个类别,例如“室内 + 厨房 + 有人”。 数学上是 \(y \in \{0,1\}^C\)。

典型做法是:用CNN 或 ViT把图像编码成一个向量特征,然后接一个全连接层 + Softmax(多标签时用 Sigmoid)输出每个类别的概率。前面章节已经介绍过 CNN/Transformer 的结构,这里不再展开。

在机器人中的角色

  • 场景识别:判断当前是“走廊 / 楼梯间 / 厨房”,帮助移动机器人选择行为模式。
  • 物体存在性检测(粗粒度):例如“桌上是否有杯子”“仓库里是否有托盘”,不要求精确位置,只要知道有没有。
  • 状态识别:例如“红绿灯状态”“门是开着还是关着”,本质上也是一种分类。

随着后面引入更细粒度的视觉任务,单纯分类在机器人中更多扮演“高层语义标签”的角色,而不是唯一的信息来源。

图片占位建议:图像分类网络结构示意图:左边是一张输入图片,中间是若干卷积/Transformer 模块,右边是一个类别概率条形图(dog, cat, car…)。


3.1.1.2 目标检测(Object Detection)

任务定义

目标检测要在图像中找出所有感兴趣的目标,并给出:

  • 每个目标的类别标签
  • 每个目标的位置,通常用矩形边界框(bounding box)表示:
    • 形式一:\(x_{\min}, y_{\min}, x_{\max}, y_{\max}\)
    • 形式二:\(\displaystyle (c_x, c_y, w, h)\)(中心点 + 宽高)

输出是一个可变长集合

\[ {(b_i, c_i, s_i)}_{i=1}^N \]

其中 \(b_i\) 是边界框,\(c_i\) 是类别,\(s_i\) 是置信度(模型认为这个框有多靠谱)。

与图像分类相比,检测多了两件事:

1.目标个数是未知的(0 个、1 个、很多个都有可能),模型要自己决定输出多少个框; 2.要精准定位——不仅要“认得出”,还要“画得准”。

典型检测器结构

现代深度学习检测器大致可以分成两类:

1.两阶段(two-stage)检测器

  • 代表:R-CNN 系列(Fast R-CNN、Faster R-CNN、Mask R-CNN 等)。
  • 流程: 1)先用一个网络产生少量“候选框”(Region Proposal); 2)再对每个候选框进行精细分类和位置回归修正。
  • 特点:精度高、速度相对较慢,适合离线分析或对实时性要求不特别苛刻的机器人应用。 2.单阶段(one-stage)检测器
  • 代表:YOLO 系列、SSD、RetinaNet 等。(arXiv)
  • 流程:直接在特征图上预测每个位置可能有哪些目标、对应的框和类别。
  • 特点:速度快,适合实时场景(如无人机、移动机器人),精度略低但在工程中往往更受欢迎。

此外,还有anchor-based(在预定义框上微调)与anchor-free(直接预测框中心和尺寸)等差异,这些细节在后续讲检测网络时可以展开。

在机器人中的角色

  • 行人 / 障碍物检测:移动机器人或自动驾驶车辆的基础能力。
  • 操作前目标定位:机械臂抓取前,需要知道目标的 2D 位置,用于进一步估计 3D 位姿(见 3.3 节)。
  • 多目标场景理解:例如一个仓库机器人需要知道哪些是“货架”“箱子”“叉车”,并区分它们的位置关系。

图片占位建议:同一张街景图,标出不同类别的边界框,并在旁边画一个典型检测网络示意(backbone + FPN + detection head)。


3.1.1.3 实例分割 vs 语义分割

共同点:都是“每个像素要有标签”

分割任务比检测更精细:不再满足于框出一个矩形,而是要知道每个像素属于哪一类,甚至属于哪一个具体物体。

1.语义分割(Semantic Segmentation)

  • 目标:为图像中的每一个像素分配一个语义类别,如“路面 / 行人 / 汽车 / 建筑 / 背景”。
  • 特点:不区分实例。所有“汽车像素”都被标为同一个类别 ID,不管场景中有几辆车。 2.实例分割(Instance Segmentation)
  • 目标:不仅要告诉你每个像素“是什么”,还要告诉你“属于哪一个物体实例”。
  • 特点:同一类别的不同物体要有不同的实例 ID,例如“车 1”“车 2”“车 3”。
  • 技术上通常结合检测 + 分割(如 Mask R-CNN:先检测出框,再为每个框预测掩膜)。

可以用简单的类比理解:

  • 语义分割:把城市地图按区域涂色(道路全是灰色、绿地全是绿色);
  • 实例分割:不仅涂色,还给每一辆车、每一个行人单独编号。

图片占位建议:一张街景图的三种输出对比: – 语义分割:所有车相同颜色; – 实例分割:每辆车不同颜色; – 并用箭头标出“同类不同实例”的区别。

Panoptic Segmentation(全景分割)简单点到为止

在 COCO 等数据集中,还提出了panoptic segmentation: 同时输出“语义类别 + 实例 ID”,并区分“thing 类”(可数的物体,如车、人)和“stuff 类”(背景材料,如天空、草地)。(cocodataset.org)

这是语义分割和实例分割的统一视角,本书在后续更高级的场景理解部分可以再展开。

在机器人中的角色

  • 精准抓取与放置:知道物体的形状和边界,才能规划手爪接触点、避免夹到旁边物体。
  • 可通行区域检测:语义分割可把“可走区域”(地面、台阶)与“不可走区域”(桌子、墙)区分出来,用于导航。
  • 精细安全约束:机器人可以通过分割结果理解“人体的轮廓”,从而在靠近人体时自动减速或绕行。

3.1.2 常见基准数据集(ImageNet、COCO 等)的作用

在深度学习时代,大规模标注数据集 + 标准评测协议是推动视觉算法发展的关键基础设施:

  • 提供统一的“试卷”,方便比较不同模型的好坏;
  • 提供大规模、多样化的数据,用于预训练通用视觉特征
  • 形成社区共识:大家默认在 ImageNet / COCO 等基准上“打分”,就像标准化考试成绩一样。

在具身智能里,大多数视觉 backbone(ResNet、ViT 等)都来自这些数据集上的预训练模型,然后再迁移到机器人场景。


3.1.2.1 ImageNet

基本情况

ImageNet 是一个规模巨大的图像分类数据集,最经典的是 ILSVRC 使用的ImageNet-1K子集:

  • 1000 个类别;
  • 约 128 万张训练图像、5 万张验证图像、10 万张测试图像。(image-net.org)
  • 整个 ImageNet 项目总共包含 1400 万以上图像、2 万多个类别。(维基百科)

从 2010 年开始,ImageNet 每年举办ILSVRC 挑战赛,主要任务就是大规模图像分类和定位。2012 年 AlexNet 在 ImageNet 上大幅超越传统方法,被普遍视作深度学习在计算机视觉中爆发的起点。

为什么对机器人仍然重要?

尽管 ImageNet 中大多是互联网图片(和机器人摄像头看到的分布不完全一样),但:

  • 低层的边缘、纹理等特征具有较好的通用性;
  • 在 ImageNet 上预训练的 CNN / ViT,在很多下游任务(检测、分割、机器人操作)上都展现出显著更快的收敛和更好的性能,这一点在大量论文中得到验证。

因此,“从 ImageNet 预训练开始”几乎是视觉模型的默认选项,本书后面提到 ResNet、ViT 等 backbone 时,默认你已经知道它们通常是先在 ImageNet 上训练好的。

图片占位建议:展示 ImageNet 一些类别示例(动物、工具、交通工具),以及挑战赛年份与错误率下降的简单折线图。


3.1.2.2 COCO

基本情况

COCO(Common Objects in Context)是面向检测 + 分割 + 关键点 + 图像描述的综合性数据集:(cocodataset.org)

  • 约 33 万张图像,其中约 20 万张带检测 / 分割 / 描述标注; +80 个“thing”类(可数物体,如人、车、椅子等),并扩展出 91 个“stuff”类(天空、路面等)形成 COCO-Stuff,合计 172 类。(cocodataset.org)
  • 每张图配有5 条图像描述(captions),支持视觉–语言任务。(cocodataset.org)
  • 提供边界框、实例分割 mask、人体关键点(姿态)等丰富标注。

COCO 的评测标准以**AP@[0.5:0.95]**为核心(后面 3.1.3 会详细解释),已经成为检测、实例分割论文中最常见的“成绩单格式”。

COCO 的特点

  • “In Context”:强调物体在复杂背景中的关系,而不是简单白底产品图;
  • 目标尺度变化大,小物体(如远处行人、路牌)较多,是检验模型鲁棒性的好试金石;
  • 评测细致:按照小 / 中 / 大物体分别统计 AP,对检测大物体、小物体的能力都有要求。(Ultralytics Docs)

面向机器人的启示

  • 用 COCO 预训练的检测器,是移动机器人和操作机器人常用的“起点模型”;
  • 但 COCO 仍然是“互联网自然场景”,与具体实验室或工厂环境有 domain gap,因此在机器人系统中通常需要再做微调或增补专用数据

图片占位建议:COCO 官方样例图:一张室内场景,标注出人、椅子、桌子等边界框 + 实例掩膜 + 文字描述。


3.1.2.3 其他数据集(Pascal VOC、Cityscapes、KITTI 等)

本书后面会在机器人专用数据集章节进一步展开,这里只介绍几个对“经典视觉任务”很重要、同时和机器人密切相关的基准。

1.PASCAL VOC

  • 早期非常重要的目标检测 / 分割 / 分类基准;
  • 典型年份(VOC2007 / 2012)包含约 20k 张图像,20 个常见类别(人、车、自行车、动物等),提供边界框和分割标注。(Ultralytics Docs)
  • 使用 mAP@0.5 做为主要指标(后文解释),历史上很多经典检测器(Faster R-CNN、早期 YOLO 版本)都是首先在 VOC 上验证。

VOC 如今在学术论文中使用较少,但仍是入门实践很好的数据集(规模适中、类别简单)。

2.Cityscapes

专注于城市街景语义理解的数据集:(cityscapes-dataset.com)

  • 在 50 个城市采集的街景双目视频序列;
  • 5000 张图像具有高质量的像素级分割标注,额外 2 万张带粗标注;
  • 主要任务:语义分割(路面、人行道、建筑、车辆、行人等)。

Cityscapes 特别适合研究自动驾驶和城市移动机器人中的感知问题,是各种语义分割网络(FCN、DeepLab、PSPNet 等)的常用评测基准。

3.KITTI

KITTI Vision Benchmark Suite 面向自动驾驶场景,提供多模态传感器数据:(cvlibs.net)

  • 采用配备多相机、LiDAR、GPS/IMU 的车辆采集;
  • 提供 2D/3D 目标检测、立体匹配、光流、视觉里程计、语义分割等多个子任务;
  • 3D 检测基准中,约 7k 训练图像、7k 测试图像,并配有点云标注。(cvlibs.net)

对具身智能来说,KITTI 是典型的“从 2D 到 3D 感知”过渡数据集,帮助你理解如何从相机 / LiDAR 获得三维信息。

图片占位建议:三张小图拼在一起,分别展示 – VOC 中标注的边界框; – Cityscapes 的街景语义分割伪彩色图; – KITTI 的 2D 图像配合 3D 检测框和点云示意。


3.1.3 评价指标(mAP、IoU 等)

前面机器学习基础部分已经介绍过“准确率、精确率、召回率”等通用指标。本节重点放在视觉检测/分割场景下常用的几个专门指标,并说明它们如何影响机器人系统的实际效果。


3.1.3.1 准确率(Accuracy)

图像分类任务中,准确率定义很直接:

\[ \text{Accuracy} = \frac{\text{预测正确的样本数}}{\text{总样本数}} \]

在 ImageNet 竞赛中,经常看到Top-1 / Top-5 准确率

  • Top-1:预测概率最高的类别是否等于真实类别。
  • Top-5:真实类别是否出现在预测概率最高的前 5 个类别中。

在机器人领域,分类准确率仍然有用,例如判断“当前场景类别”“开关状态”等。但对于目标检测和分割

  • 一个图像中可能有多个目标;
  • 预测的是框 / 掩膜集合,而不是单一标签;

此时简单的准确率已经不够,必须结合位置精度多个预测之间的对应关系,这就引出了 IoU 和 mAP。


3.1.3.2 平均精度均值(mAP)

1)核心思想:基于 Precision–Recall 曲线

假设你训练了一个检测器,它对每个候选框输出一个置信度分数(score)。如果我们从高到低改变这个分数阈值:

  • 阈值高:只保留特别有信心的框,精确率(Precision)高,但漏检多,召回率低;
  • 阈值低:检测更多目标,召回率高,但也引入许多假阳性,精确率下降。

在每个阈值下,我们都可以计算一对 \(\displaystyle (P, R)\),在平面上连起来就是一条Precision–Recall 曲线

图片占位建议:一条典型的 P–R 曲线,并用阴影区域表示“曲线下的面积”。

2)单类别的 AP(Average Precision)

对某一个类别,AP 就是 P–R 曲线下面积,数值范围在 0–1 之间:(v7labs.com)

  • AP 越高,说明在各种阈值下,这个类别的精确率和召回率整体越好;
  • AP 会受到IoU 阈值的影响:要先用 IoU 决定每个预测框是否算“正确”(下节讲)。

3)多类别的 mAP(mean Average Precision)

如果有 \(\displaystyle C\) 个类别,可以对每个类别分别算一遍 AP,然后取平均:

\[ \text{mAP} = \frac{1}{C}\sum_{c=1}^{C} AP_c \]

mAP 提供一个单一数字,方便比较模型整体性能。

4)VOC mAP vs COCO AP

这里需要特别指出:不同数据集对 “mAP” 的定义略有不同:

+PASCAL VOC

  • 传统上使用 AP@0.5:即只在 IoU ≥ 0.5 的情况下计算 AP;
  • mAP 就是 20 个类别 AP@0.5 的平均。(Ultralytics Docs)
  • 指标相对宽松,对框定位要求不那么苛刻。 +COCO
  • 使用更严格的AP@[0.50:0.95]:在 0.5, 0.55, …, 0.95 共 10 个 IoU 阈值下分别计算 AP,然后取平均;(kharshit.github.io)
  • COCO 文档常直接把这个量记为 AP,也就是所谓 “COCO mAP”;
  • 还会报告 AP50、AP75 等子指标。

这种设计使得 COCO 的 AP 对“定位偏差”更加敏感:框稍微画不准,IoU 从 0.9 掉到 0.5,多数阈值下都会受到惩罚。

5)阅读论文和工程实践时的注意事项

  • 看别人报 “mAP = 40” 时,一定要确认是 VOC@0.5还是 COCO@[0.5:0.95],两者差别非常大;
  • 对机器人任务,如果偏重“是否发现目标”,AP50 更相关;如果关心“抓取位置是否足够精确”,更严格的 AP75 或 COCO AP@[0.5:0.95] 更有意义;
  • 在自建数据集时,建议沿用COCO 风格评测,避免只在单一 IoU 阈值上评价。

3.1.3.3 交并比(IoU,Intersection over Union)

1)定义

IoU 是衡量两个区域重叠程度的指标,广泛用于目标检测和分割评估。给定预测区域 \(\displaystyle A\) 和真值区域 \(\displaystyle B\):

\[ IoU(A, B) = \frac{|A \cap B|}{|A \cup B|} \]

  • 完全重合:IoU = 1;
  • 完全不相交:IoU = 0;
  • 部分重叠:介于 0 和 1 之间。

在目标检测中,\(\displaystyle A\) 和 \(\displaystyle B\) 是两个矩形框;在分割中,则是两个像素集合。(learnopencv.com)

图片占位建议:两个矩形框的重叠示意图,用不同颜色涂出交集和并集,并标出 IoU = 交集面积 / 并集面积。

2)在评测中的用法

  • 目标检测中,通常先设定一个 IoU 阈值,例如 0.5:
    • 如果预测框与某个真值框的 IoU ≥ 0.5,则认为是一次 True Positive(正确检测);
    • 否则是 False Positive(错误检测),或者如果真值框没有被任何预测框“覆盖”,则记为 False Negative(漏检)。(wikidocs.net)
  • 分割中,IoU 常直接用作主要指标(也称 Jaccard 指数),表示预测掩膜与真值掩膜的重叠程度。(wikidocs.net)

IoU 是 mAP 计算的基础:只有知道每个预测是 TP 还是 FP,才能画精确率–召回率曲线,从而得到 AP / mAP。

3)对机器人的含义

  • 对移动机器人来说,检测到障碍物就行,框的边缘偏差一点问题不大,IoU 0.5 可能已经足够;
  • 对精细操作(插销、抓小物体)来说,即使 IoU 达到 0.7、0.8,也可能意味着末端位置偏差数厘米,对任务成功率有明显影响;
  • 因此,在具体工程中,应该根据任务容忍误差的大小,选择合适的 IoU 阈值和指标(如 AP75、AP@[0.75:0.95])。

小结一下这一节的逻辑:

+图像分类 → 检测 → 分割,是视觉理解精度不断提高的三个层级; +ImageNet / COCO / VOC / Cityscapes / KITTI等数据集,提供了从分类、检测、分割到 3D 感知的一整套“训练场”; +IoU 和 mAP是连接“模型输出”和“我们如何评价它”的关键纽带,它们的具体定义(VOC vs COCO)会直接影响结论解读。

在后续 3.2 及以后的章节,我们会从特征表示(ResNet、ViT、自监督)和三维几何的角度,进一步讨论如何让这些视觉能力真正服务于具身智能和机器人控制。

本章小结与自测

三行小结

  1. 本章解释视觉信息如何转成机器人可用表征。
  2. 关键在于任务定义、表示学习与工程约束并行考虑。
  3. 学完后应能为任务选择合理视觉输入与评测指标。

检查题

  1. 用你自己的话总结本章最核心的一个公式/机制。
  2. 给出一个“如果要落地到项目里,你会怎么用”的具体例子。

常见误区

  1. 只追求 backbone 大小,忽略任务匹配。
  2. 忽略数据标注噪声。
  3. 指标选择与任务目标不一致。

公式到代码(最小示例)

def iou(box_a, box_b):
    xa1, ya1, xa2, ya2 = box_a
    xb1, yb1, xb2, yb2 = box_b
    inter_w = max(0, min(xa2, xb2) - max(xa1, xb1))
    inter_h = max(0, min(ya2, yb2) - max(ya1, yb1))
    inter = inter_w * inter_h
    area_a = (xa2 - xa1) * (ya2 - ya1)
    area_b = (xb2 - xb1) * (yb2 - yb1)
    union = area_a + area_b - inter
    return inter / union if union > 0 else 0.0

本章外部参考(集中)

  1. arXiv
  2. cocodataset.org
  3. image-net.org
  4. 维基百科
  5. Ultralytics Docs
  6. Ultralytics Docs
  7. cityscapes-dataset.com
  8. cvlibs.net
  9. cvlibs.net
  10. v7labs.com
  11. kharshit.github.io
  12. learnopencv.com
  13. 本章其余链接可在正文中按上下文继续查阅。

3.2 视觉特征与表示学习

注:上面只是示意图,实际书稿中建议用自绘或重画的简洁示意图替换。


3.2 视觉特征与表示学习(节选)

本节聚焦“视觉 backbone 究竟在学什么”。从卷积的层级特征,到 Vision Transformer 的 patch-token 表示,再到自监督预训练与迁移使用方式,这一节是后面 VLM / VLA 模型视觉部分的“放大镜”。


3.2.1 卷积特征与层级表示直觉

学习导航

  • 本章主题:3.2.1 卷积特征与层级表示直觉
  • 前置知识:建议先完成第 2 章基础网络与训练技巧。
  • 建议用时:65-85 分钟
  • 阅读顺序:先看概念框架,再看公式/代码,最后做自测。

卷积神经网络(CNN)已经被证明会自动学习出从边缘、纹理到物体部件、完整对象的分层表征,与生物视觉皮层中从 V1 到 IT 的层级处理有相似之处。(arXiv) 对机器人来说,这意味着:同一个相机画面,在不同层中被编码成不同抽象层级的信息,为后续抓取、导航、场景理解提供基础。

3.2.1.1 卷积网络的层级特征

可以把卷积核看成一块块可学习的小“模板”,在图像上滑动,检测某种局部模式是否出现。早期层的模板非常“原始”,后期层变得“语义化”。

+低层特征:边缘和纹理

在第一、二层卷积中,可视化滤波器时,经常能看到“Gabor 滤波器”式的条纹、斑点、方向性边缘等。(arXiv) 对机器人来说,这一层类似回答“这里有一条明暗边界”“这里有一段重复纹理”的问题,有助于后续识别桌沿、物体轮廓。

+中层特征:局部图形和部件

随着网络加深,卷积层的感受野(能“看到”的输入区域)逐渐变大,中层卷积核开始响应更复杂的局部结构,比如圆形角落、T 字交界、物体的一部分(杯把、车轮、门把手等)。这些特征已经脱离“几何原始元素”,开始向“物体部件”靠拢。(SPIE Digital Library)

+高层特征:对象和类别级模式

在靠近分类头的高层卷积中,特征往往与具体类别强相关,例如“狗头”“键盘区域”“车前脸”等高度语义化的激活。Zeiler & Fergus 的可视化工作表明,高层 feature map 上,一整块区域常常只在特定类别图像中被激活。(arXiv)

【插图占位 3.2.1-1】 “CNN 不同层的卷积核与激活可视化”: 左侧为浅层卷积核(类似边缘检测器);中间为中层对纹理与局部形状的响应;右侧为高层对物体部件/对象的响应。用一张输入图(如桌面上有杯子)对应三层 feature map 激活。

在具身智能场景中,可以这样理解:当机械臂视觉系统通过 ResNet 看一张桌面图像时,早期层主要检测各种边缘和纹理(桌沿、物体阴影),中层开始形成“杯子边缘”“盒子角”等部件特征,高层则直接形成“杯子”“蓝色盒子”等对象级特征,供上层任务(如“抓起杯子”)使用。

3.2.1.2 特征图(Feature Map)

卷积操作对输入图像进行处理后,输出的是一个多通道的张量,通常记作大小为 \(H \times W \times C\):

  • \((H, W)\):空间维度,对应图像在当前层的分辨率;
  • \(\displaystyle C\):通道数,每个通道就是一个feature map,代表某个卷积核在整幅图上的“响应强度图”。

可以把 feature map 看成:“对于这一种视觉模式,每个像素位置匹配的程度是多少”。例如某个通道专门响应“垂直边缘”,那在所有垂直物体边缘的位置,这个通道的值会比较大。

随着网络前进,卷积步长和池化层会逐步降低 \((H,W)\),而提高通道数 \(\displaystyle C\)。这意味着:

+空间分辨率下降:单个激活对应的物理区域更大; +通道维表达能力增强:每一个空间位置上,C 维向量可以编码非常丰富的语义。

这样的结构自然形成了多尺度特征金字塔:浅层 feature map 分辨率高,适合描述精细边界和小物体;深层 feature map 分辨率低、语义强,适合理解“这块区域大致是什么东西”。

【插图占位 3.2.1-2】 “Feature Map 尺寸变化示意”: 画出一张输入图像,经过多层卷积+池化后 feature map 的形状从 \(224\times224\times3\) 变为 \(112\times112\times64\)、\(56\times56\times128\)…直至 \(7\times7\times2048\),用不同颜色方块表示不同通道。

在机器人应用中,这些 feature map 通常不会直接显示,而是输入到检测头、抓取预测头或下游 Transformer 中,作为视觉语义的“压缩表达”。

3.2.1.3 层级表示直觉

总结起来,卷积网络的层级表示有几个直观要点:

1.从局部到全局 早期层只“看见”局部几像素,后期层的感受野可以覆盖图像中很大的区域甚至全图,逐步整合上下文。 2.从具体到抽象 表征从“这有条边”“这里有条纹理”逐渐演化为“这个区域像是一个杯子”“这大概是桌面的一角”。这种从低级特征到高级语义的抽象,与认知科学中人类视觉皮层的层级处理趋势相似。(ScienceDirect) 3.局部平移不变性和结构先验 卷积核在整幅图上共享权重,让网络天然对小范围平移具有不变性。这种强归纳偏置使 CNN 在中等规模数据集上非常高效、稳定,但也导致其对更复杂的长程关系(如远处两个物体之间的关系)建模能力有限。

对具身智能来说,这意味着:如果任务主要依赖局部形状与纹理(例如检测桌沿、防止跌落、识别可抓取边缘),卷积 backbone 通常已经足够;而当任务涉及复杂全局关系(例如“把桌面最左边的杯子移到靠近门的那边”),我们更希望有能力建模“全局 patch 之间关系”的结构——这正是 Vision Transformer 要解决的问题。


3.2.2 视觉 Transformer(ViT)的基本结构

Vision Transformer(ViT)直接把图像视为一串“视觉 token”,用 Transformer 编码器处理,从而将 NLP 中已经验证有效的全局自注意力机制引入视觉。(arXiv)

3.2.2.1 图像分块

经典 ViT 的第一步是图像分块(patch embedding)

  1. 给定一幅大小为 \(H \times W \times C\) 的图像;
  2. 使用固定大小的 patch(如 \(P \times P\))将图像划分为 \(N = \frac{HW}{P^2}\) 个不重叠的小块;
  3. 每个 patch 展平为长度 \(P^2 C\) 的向量,并通过一个线性层投影到 \(\displaystyle D\) 维,得到一个 token;
  4. 所有 patch token 组成长度为 \(\displaystyle N\) 的序列,再加上一个 learnable 的 class token,总长度为 \(N+1\);
  5. 再加上可学习的位置编码,以保留 patch 的空间位置信息。(arXiv)

【插图占位 3.2.2-1】 “ViT patch embedding 架构”: 左侧是一张输入图像,被切成若干 \(P\times P\) 的小 patch;每个 patch 展平后通过线性层映射为 D 维向量;所有 patch token 与一个 class token 拼接成序列,并加上位置编码输入 Transformer encoder。

在机器人视角下,可以理解为:摄像头拍到的画面首先被离散为几十到上百个“小视野格子”,每个格子由一个向量描述。后续的自注意力层决定这些格子之间如何互相“交流”。

3.2.2.2 自注意力在图像中的应用

在 ViT 中,Transformer 编码器对 token 序列应用多层自注意力(self-attention)

  • 每个 patch token 通过线性变换产生 Query / Key / Value;
  • 每个 patch 的 Query 与所有 patch 的 Key 计算相似度,经 softmax 得到注意力权重;
  • 使用权重对 Value 做加权和,得到融合了全局信息的新表示。(d2l.ai)

直觉上,这相当于:每个 patch 决定“应该向哪些其他位置要信息”。例如在桌面场景中:

  • 表示“杯子”的 patch 可能会关注桌面边缘(判断杯子是否在边缘,是否安全);
  • 表示“目标盒子”的 patch 会关注周围障碍物 patch,辅助规划路径。

多头注意力让不同“注意力头”在不同子空间内学习不同的关注模式:有的头关注近邻局部纹理,有的头捕捉对称、重复结构,有的头专门建模远距离物体间的关联。(wikidocs.net)

与 CNN 相比,自注意力有两大关键差异:

+显式全局建模:每个位置可以直接与任意位置交互,而不需要堆叠许多局部卷积才能间接感知远处; +归纳偏置更弱:不强假设局部平移不变性,网络在足够数据上可以学习更丰富的模式,但在小数据集上也更容易过拟合或训练不稳定。

3.2.2.3 ViT 特点

综合来说,ViT 作为视觉 backbone 具有以下特点:(arXiv)

1.全局视野与强表示能力

自注意力使得 ViT 在每一层就能获取全局信息,对复杂布局、长程关系建模有天然优势。在大规模预训练(如 ImageNet-21k 或图文对齐数据)下,ViT 在分类、检测、分割等任务上已经超越或媲美同规模 CNN。

2.对数据量敏感

由于缺乏 CNN 那种强的局部归纳偏置,ViT 在小数据集从头训练通常表现不佳,需要:

  • 借助大规模有监督或自监督预训练;
  • 或在结构中引入层次化、局部窗口(如 Swin Transformer 一类)。

3.与自监督方法高度契合

ViT 的“token 化”结构与掩码建模(MAE 等)天然匹配,在自监督框架下表现尤为突出,这是后续 3.2.3 将重点展开的内容。(arXiv)

4.对机器人应用的影响

  • 在算力足够(如云端推理或高性能边缘设备)且数据丰富时,可使用 ViT/层次 Transformer backbone 作为机器人视觉主干,更好地理解复杂场景;
  • 在实时性、算力严苛的场景中,往往采用轻量化 Transformer 变体,或与 CNN 混合使用,以兼顾性能与速度。

3.2.3 自监督视觉表征(对比学习、MAE 等基本思想)

对于具身智能而言,最稀缺的不是图像,而是高质量标注和示教。机器人可以 24 小时拍视频,但人类不可能 24 小时在旁边标注。这使得“如何利用大量未标注视觉数据学习通用表示”成为关键问题,自监督学习正是目前最主流的答案之一。(SpringerLink)

3.2.3.1 对比学习

对比学习(contrastive learning)的核心想法是:把“同一个事物的不同观察”拉近,把“不同事物”拉远。在视觉自监督中,常见做法是“实例判别(instance discrimination)”:每张图像被视为自己的“类别”。(CVF开放获取)

典型框架(SimCLR、MoCo 等)的基本流程:

  1. 对同一张原始图像做两次随机数据增强(裁剪、翻转、颜色抖动、模糊等),得到两张“视角不同”的图像;
  2. 使用共享参数的编码器(CNN 或 ViT)分别将这两张图像映射到特征向量;
  3. 通过一个小的投影头(MLP)映射到对比空间;
  4. 设计对比损失(如 InfoNCE):
    • 把这两个来自同一图像的向量视为“正样本对”;
    • 与 batch 中其他图像的向量作为“负样本”;
    • 优化目标是让正样本对在特征空间距离更近,负样本更远。

直觉上,相当于告诉网络:“即便这杯子的姿态、光照改变,它在特征空间也应该是同一个‘点附近’。” 训练完成后,编码器就学到了一种对常见变化(旋转、光照、轻微遮挡)不敏感、但对语义差异敏感的特征。

在机器人场景中:

  • 正样本可以是同一次操作的不同帧,或同一物体在不同位置、不同抓取阶段的图像;
  • 负样本是其他物体或其他任务场景;

这样,机器人在没有任何“类别标签”的情况下,就能学会“哪些图像属于同一事物或同一过程”,为后续的抓取预测或策略学习提供基础特征。

3.2.3.2 掩码图像建模(MAE)

对比学习强调“区分”,而**掩码图像建模(Masked Image Modeling, MIM)**更强调“重建”。其中影响力最大的工作之一就是 MAE(Masked Autoencoders)。(arXiv)

MAE 的关键思想:

  1. 仍然基于 ViT 的 patch 表示,将图像切成若干 patch; 2.随机遮挡大部分 patch(例如 75%),只保留少量可见 patch;
  2. 编码器(ViT encoder)只处理可见 patch,生成其高维表示;
  3. 将可见 patch 表示与位置编码、掩码标记一起输入一个轻量解码器;
  4. 解码器的任务是重建被遮挡部分的像素(或某种压缩形式,如低分辨率图)。

重要特性有两点:

+极高遮挡比例:迫使模型必须真正理解全局结构,而不是简单“补纹理”; +编码器轻负载:只对可见 patch 计算自注意力,大幅节约计算,特别适合大规模预训练。(arXiv)

直觉上,MAE 要求模型回答的问题是:“在只看见一小部分图像补丁的情况下,这张图合理的完整样子是什么?” 这使得模型必须学到:

  • 物体典型形状(杯子大致是圆柱、桌子是平面等);
  • 背景与物体的相互约束关系;
  • 不同 patch 之间的纹理、颜色、结构一致性。

在机器人应用中,遮挡是常态——机械臂自己会挡住部分视野,桌面物体会相互遮挡。通过 MAE 预训练的 ViT 在面对大面积遮挡、视角变化时,往往比纯监督训练的模型更稳健。后续还有很多基于 MIM 的变体,扩展到视频、点云等模态,在这里不展开。(ScienceDirect)

【插图占位 3.2.3-1】 “MAE 自监督框架”: 左侧为原始图像和其 patch;中间展示随机遮挡的 patch(大面积灰块);右侧是编码器只处理可见 patch,解码器重建完整图像的流程图。

3.2.3.3 自监督的意义

自监督视觉学习对具身智能的意义,并不仅仅是“省标签”,更深层的价值在于:

1.大幅提高数据利用率

现实中很容易收集到“机器人看到的一切”:摄像头视频、深度图、点云等。但完整标注每一帧中的物体、语义、动作几乎不可能。自监督允许我们用这些原始数据构建大规模预训练语料库,让视觉 backbone 从“无标签的观察”中学习世界的结构。(SpringerLink)

2.得到更通用、与任务无关的表示

和在单一标注任务(比如 ImageNet 分类)上训练得到的特征相比,对比学习和 MAE 这种预训练方式往往给出更“面向世界”的表征——它们捕捉到的是一般性的视觉规律,而不是某个数据集里特定类别的边界。因此,在目标检测、分割、3D 理解乃至机器人策略学习上迁移时,都更容易适配。

3.为世界模型和长期规划打基础

重建式自监督(如 MAE)和时序预测式自监督(预测下一帧、未来轨迹)本质上都是在学习“如果世界缺了一部分信息,我能不能根据上下文补完”的能力。这种能力对于构建具身智能的“世界模型”至关重要,是后续章节(例如 9.3、12.1)要讨论的核心方向之一。

4.实际工程中的策略

对一个真实机器人平台,常见做法是:

  • 长时间录制未标注视频,构建视觉自监督预训练数据;
  • 先用对比学习或 MAE 预训练视觉 backbone;
  • 再用少量示教数据、标注任务数据微调到具体操作任务上(抓取、分类、可抓取检测等)。

这种“先学看,再学做”的范式,在多模态 VLM/VLA 模型中会进一步扩展为“先学看 + 听(视觉 + 语言),再学做(动作)”。


3.2.4 视觉 Backbone 的选择与迁移(ResNet、ViT 等)

在具身系统中,视觉 backbone 不只是一个“分类器的前半部分”,而是整个系统对世界的主要感知入口。选择何种 backbone,以及如何迁移预训练权重,对最终性能、实时性、部署成本都有直接影响。

这里重点讨论两类主力骨干:ResNet(典型 CNN)与 ViT(典型 Transformer),以及它们在迁移学习中的常见用法。

3.2.4.1 ResNet

ResNet(Residual Network)的核心思想是引入残差连接,即让每一层只需要学习相对于输入的“增量”。这极大缓解了深层网络中的梯度消失问题,使得 50 层、101 层甚至更深的 CNN 训练变得可行。(SPIE Digital Library)

从视觉 backbone 的角度看,ResNet 有几个工程上非常重要的特点:

1.强归纳偏置与稳定性能

标准的卷积+池化+残差结构,使得 ResNet 在中等规模数据集上具有极高的收敛稳定性和泛化能力。即便没有大规模自监督预训练,直接在任务数据上微调也常能得到不错的结果。

2.成熟的工具链与硬件友好性

各种深度学习框架和推理引擎对卷积操作高度优化,在嵌入式 GPU、加速器上都有现成的高效实现;因此 ResNet 类 backbone 在移动机器人、嵌入式机械臂上非常常见。

3.多尺度特征易于复用

ResNet 的分层结构天然适合构造特征金字塔(如 FPN),用于目标检测、实例分割等任务——这些任务又恰恰是机器人抓取、障碍检测的基础模块。(SPIE Digital Library)

在具身智能的实践中,一条常见经验是:

+初期实验 / 小规模项目:优先选用 ResNet-18 / 34 等轻量骨干,保证训练和部署简单、鲁棒; +性能要求更高:可升级到 ResNet-50 / 101 加 FPN,用于精度更高的场景理解,再将结果提供给上层 VLA 决策模块。

3.2.4.2 ViT

相比之下,ViT 系列 backbone 更“现代”,也更依赖大规模预训练。当前主流开源模型(如 vit-base-patch16-224 等)通常先在 ImageNet-21k 等大数据集上预训练,再在 ImageNet-1k 上微调。(Hugging Face)

作为视觉 backbone,ViT 有几方面的特点:

1.全局建模能力

利用自注意力,ViT 对全图 patch 之间的关系进行显式建模,尤其有利于需要理解复杂场景关系的任务,例如:

  • 判断多个物体之间的相对位置(哪一个“更靠近门口”);
  • 推理遮挡关系(哪个物体被挡住、相对深度)。

2.与图文预训练、VLM 的天然适配

ViT 常被用作图文对齐模型(如 CLIP)中的视觉编码器,学习到的特征与语言空间对齐良好,非常适合直接用作机器人 VLM/VLA 模型的视觉 backbone。(arXiv)

3.在大数据下优于 CNN,小数据下需谨慎

多项比较研究显示,当训练和预训练数据足够大时,ViT 在分类、识别类任务上的表现可以显著超越或至少不弱于同规模 ResNet。(arXiv) 但在小数据集、从头训练或迁移数据分布与预训练差异很大时,原始 ViT 可能难以训练稳定,这时需要:

  • 使用 MAE/对比学习等自监督权重;
  • 或采用带卷积前端、窗口注意力的改进架构(如 Swin、ConvNeXt 等)。

在具身智能系统中,常见的一种组合是:语言–视觉对齐用 ViT(或其变体),低层几何理解和实时感知仍以 CNN 为主,二者通过特征融合或多任务训练结合起来。

3.2.4.3 迁移学习

无论使用 ResNet 还是 ViT,视觉 backbone 在机器人任务中几乎总是以“预训练 + 迁移”的方式出现,而不是从零开始训练。迁移学习通常包含几个关键决策:(arXiv)

1.选择预训练来源

  • 经典监督预训练:如 ImageNet 分类;
  • 自监督预训练:对比学习(SimCLR、MoCo、DINO 等)、MAE 等;
  • 多模态预训练:图文对齐模型(CLIP 风格)、视频自监督等。

对机器人来说,多模态和自监督预训练往往更有优势,因为它们捕捉到的是更通用的世界结构,而不是某个特定分类任务。

2.“冻结 vs 全量微调 vs 参数高效微调” +冻结特征 + 训练任务头:适合数据较少、算力有限、对性能要求不极致的场景; +全量微调:适合数据相对充足、希望 backbone 充分适应特定场景(特殊光照、视角、相机)的情况; +参数高效微调(Adapter / LoRA 等):在不修改大部分预训练权重的前提下,仅训练少量插入模块,达到较好适应能力,又控制了训练成本;这与第 2.5.3 节中语言模型微调的思想完全一致。 3.根据任务和资源选择 backbone 类型

一个实用的经验表,可以帮助在具身智能项目中快速做出初步选择:

+小数据集 + 强实时性 + 嵌入式设备 → 轻量 CNN(ResNet-18/34、MobileNet 等),使用 ImageNet 或自监督预训练权重,冻结大部分层,仅微调最后几层和任务头。 +中等数据规模 + 单一场景(固定工位、固定相机) → 可以使用更深的 ResNet 或轻量 ViT / Swin;优先使用自监督预训练权重(SimCLR/MoCo/MAE)以提高数据效率。 +大规模多场景数据 + 多任务机器人平台 → 优先使用 ViT 或层次 Transformer backbone(如 Swin)、甚至直接采用 CLIP-ViT 或 MAE-ViT 作为视觉模块,与大语言模型共同组成 VLM / VLA 系统。在这种情况下,视觉编码器的能力将成为整个系统泛化能力的关键瓶颈之一。

【插图占位 3.2.4-1】 “视觉 backbone 迁移流程”: 画出一个从左到右的流程: “大规模预训练数据(ImageNet/图文/未标注视频)” → “预训练视觉 backbone(ResNet/ViT)” → “加入机器人特定任务头(检测、抓取预测等)” → “在机器人任务数据上微调(可选:冻结部分层、Adapter 微调)”。

在后续章节中,视觉 backbone 会以多种角色重复出现:在第 4 章中作为图文对齐模型的一部分,在第 8 章中作为 VLA 统一模型的视觉输入模块。读者理解了本节中 CNN 层级特征与 ViT patch-token 表示、自监督预训练与迁移学习的基本思路,就具备了“读懂后面模型结构图中视觉那一坨方块究竟干什么”的能力。接下来,我们会在 3.3 节进一步将 2D 视觉表示延伸到 3D 场景理解,为机器人在物理世界中行动铺路。

本章小结与自测

三行小结

  1. 本章解释视觉信息如何转成机器人可用表征。
  2. 关键在于任务定义、表示学习与工程约束并行考虑。
  3. 学完后应能为任务选择合理视觉输入与评测指标。

检查题

  1. 用你自己的话总结本章最核心的一个公式/机制。
  2. 给出一个“如果要落地到项目里,你会怎么用”的具体例子。

常见误区

  1. 只追求 backbone 大小,忽略任务匹配。
  2. 忽略数据标注噪声。
  3. 指标选择与任务目标不一致。

公式到代码(最小示例)

def iou(box_a, box_b):
    xa1, ya1, xa2, ya2 = box_a
    xb1, yb1, xb2, yb2 = box_b
    inter_w = max(0, min(xa2, xb2) - max(xa1, xb1))
    inter_h = max(0, min(ya2, yb2) - max(ya1, yb1))
    inter = inter_w * inter_h
    area_a = (xa2 - xa1) * (ya2 - ya1)
    area_b = (xb2 - xb1) * (yb2 - yb1)
    union = area_a + area_b - inter
    return inter / union if union > 0 else 0.0

本章外部参考(集中)

  1. arXiv
  2. SPIE Digital Library
  3. ScienceDirect
  4. arXiv
  5. d2l.ai
  6. wikidocs.net
  7. arXiv
  8. SpringerLink
  9. CVF开放获取
  10. ScienceDirect
  11. Hugging Face
  12. arXiv
  13. 本章其余链接可在正文中按上下文继续查阅。

3.3 场景理解与 3D 信息

3.3.1 多视角几何与相机模型基本概念

学习导航

  • 本章主题:3.3.1 多视角几何与相机模型基本概念
  • 前置知识:建议先完成第 2 章基础网络与训练技巧。
  • 建议用时:91-111 分钟
  • 阅读顺序:先看概念框架,再看公式/代码,最后做自测。

从这一节开始,我们正式从“看一张图像”升级到“理解三维世界”。具身机器人要在真实空间中抓、放、躲、走,都离不开对 3D 几何的建模,而这一切的入口就是相机模型和多视角几何。


3.3.1.1 针孔相机模型

1)从透视投影开始

理想化的相机可以看作一个“针孔”:所有从场景出发的光线都通过同一个小孔,投到后面的成像平面上。这就是经典的 针孔相机模型

在相机坐标系下,设三维点为

\[ P=(X, Y, Z)^\top \]

针孔相机的基本透视关系可以写成:

\[ x = f \frac{X}{Z},\quad y = f \frac{Y}{Z} \]

其中 \(\displaystyle f\) 是焦距,\(\displaystyle (x,y)\) 是该点在成像平面的坐标(以相机光轴与成像平面的交点为原点)。(cs.cmu.edu)

【图 3-1 占位:针孔相机几何示意图】 图中画出相机坐标系、针孔位置、成像平面,以及从 3D 点 \(\displaystyle P\) 射向针孔并投影到平面的光线,标出焦距 \(\displaystyle f\)、坐标 \((X,Y,Z)\) 与投影点 \(\displaystyle (x,y)\) 的关系。

2)从“理想平面”到真实像素:相机内参矩阵

真实图像的坐标是以左上角为原点的像素坐标 \(\displaystyle (u,v)\),与上面的理想几何坐标 \(\displaystyle (x,y)\) 还差一个线性变换和偏移。常用 相机内参矩阵 \(\displaystyle K\) 将两者联系起来:

\[ K = \begin{bmatrix} f_x & s & c_x\\ 0 & f_y & c_y\\ 0 & 0 & 1 \end{bmatrix} \]

其中:

  • \((f_x, f_y)\):x/y 方向的“有效焦距”(包含像素尺寸的缩放);
  • \((c_x, c_y)\):主点(principal point),即光轴在图像上的交点;
  • \(\displaystyle s\):像素轴之间的切变(大多数相机可近似为 0)。

在齐次坐标下,三维点 \(X=(X,Y,Z,1)^\top\) 到图像点 \(x=(u,v,1)^\top\) 的投影可写成矩阵形式:

\[ x \sim K [R\mid t] X \]

这里:

  • \([R\mid t]\) 是相机相对于世界坐标的旋转矩阵和平移向量(外参);
  • “\(\sim\)” 表示相差一个非零尺度因子。(users.cecs.anu.edu.au)

【图 3-2 占位:相机坐标系、世界坐标系及内参与外参示意图】 图中画出世界坐标系、相机坐标系,标出相机位姿 \([R|t]\),以及内参矩阵 \(\displaystyle K\) 将相机坐标投影到图像像素的流程框图。

3)畸变一笔带过

真实镜头往往存在 径向畸变(直线变弯)和 切向畸变。在多视几何理论中常假设图像已经做了去畸变,便于使用简单的针孔模型。具体如何标定和去畸变会在 3.4 节详细讨论,这里只需记住:

绝大多数视觉几何公式,都默认你已经把像素坐标“拉直”成理想针孔相机的坐标了。


3.3.1.2 多视角几何

单张图像只能看到“投影”,距离信息被压缩到 2D 中。多视角几何研究的是:当我们有两张或多张从不同视点拍摄的图像时,如何恢复场景的三维结构和相机之间的相对关系。这是立体视觉、结构光重建、SLAM 等技术的理论基础。(r-5.org)

1)极几何与基础矩阵

考虑两个针孔相机,拍到同一个三维点 \(\displaystyle X\)。在两张图像中的投影分别是 \(\displaystyle x\) 和 \(x'\)。两张图像之间存在一个几何约束,叫做 极线约束

\[ x'^{\top} F x = 0 \]

这里 \(\displaystyle F\) 是一个 \(3\times3\) 的 基础矩阵(Fundamental Matrix)。它编码了两台 未标定 相机之间的全部极几何信息。(维基百科)

几何含义是:

  • 给定左图上的一点 \(\displaystyle x\),右图中与其对应的点 \(x'\) 必须落在一条 极线 上:\(l' = F x\);
  • 搜索匹配点时,不必在整张图上盲目搜索,只需要沿这条线搜索,大幅降低匹配难度。

2)本质矩阵与相机标定

如果两台相机的内参 \((K, K')\) 已知,则可以定义 本质矩阵(Essential Matrix) \(\displaystyle E\):

\[ E = K'^{\top} F K \]

本质矩阵与相机间的相对旋转 \(\displaystyle R\) 与平移 \(\displaystyle t\) 直接相关。通过估计 \(\displaystyle F\) 再结合内参,就能恢复两台相机的相对位姿(最多有少数离散歧义)。(维基百科)

对于机器人而言,这意味着:

  • 只要能在两帧图像中匹配到足够多的特征点,就能估计相机的运动(视觉里程计);
  • 再结合多帧图像的 3D 点重建,就能逐步构建环境地图——这就是视觉 SLAM 背后的核心几何。

3.3.1.3 三角测量

有了多视角、相机位姿和匹配到的特征点,对应的三维点怎样求出来?答案就是 三角测量(Triangulation)。(ics.uci.edu)

1)几何直觉

对同一个 3D 点 \(\displaystyle X\),从相机中心 \(C_1\) 和 \(C_2\) 发出的两条光线分别“穿过”像平面上的点 \(\displaystyle x\) 和 \(x'\)。理论上,这两条光线在空间中会相交于 \(\displaystyle X\)。

【图 3-3 占位:两相机三角测量几何示意图】 图中画出两个相机中心、两条投影光线以及三维点交点,示意通过两条线求交得到 3D 位置。

在无噪声理想情况下,直接求两条直线的交点即可。但真实世界中,由于检测误差、标定误差,光线往往不会完全相交,而是“错开”一小段距离。

2)线性三角测量(概念层面)

在齐次形式下,两相机投影矩阵分别为 \((P_1, P_2)\),图像点为 \((x, x')\)。由于

\[ x \sim P_1 X,\quad x' \sim P_2 X \]

可以写出一组关于 \(\displaystyle X\) 的线性方程组,通过最小二乘求解,使得重投影误差最小。这就是经典的线性三角测量方法。(ics.uci.edu)

对具身智能来说,你可以简单记住:

“三角测量”就是:给我两个视角下同一个像素点的位置 + 两个相机是如何摆放的,我就能算出这个点在三维世界大概在哪里。

后续在 3.3.2 的立体视觉深度中,我们会看到三角测量在规则双目系统中可以简化成非常漂亮的一个公式。


3.3.2 深度估计与点云表示

前面的多视角几何更多关注“稀疏的点”:少量特征点的 3D 恢复。对于机器人操作与导航,更常用的是:为每个像素估计一个深度(生成深度图),再把整个场景表示成点云


3.3.2.1 双目视觉深度

1)视差与深度公式

考虑一对平行摆放、经过极线校正的双目相机,左右相机的光轴大致平行,基线长度为 \(\displaystyle B\),焦距为 \(\displaystyle f\)。同一 3D 点在左右图像上投影为 \(\displaystyle (u_L, v)\) 和 \(\displaystyle (u_R, v)\)。定义 视差(disparity):

\[ d = u_L - u_R \]

经典双目几何推导给出深度公式:

\[ Z = \frac{fB}{d} \]

其中 \(\displaystyle Z\) 是点到相机平面的距离。可见视差越大(左右像素差越大),物体离相机越近;视差越小,物体越远。(teledynevisionsolutions.com)

【图 3-4 占位:立体双目几何与视差示意图】 画出左右相机、基线 \(\displaystyle B\)、焦距 \(\displaystyle f\)、空间点以及左右图像中的投影位置,标出视差 \(\displaystyle d\) 与深度关系。

2)视差计算与极线约束

要利用公式估深度,需要为每个像素找到左、右图之间的 对应点。在极线校正后,对应点应该在同一行上,因此只需沿水平方向搜寻视差,大大简化计算。(ni.com)

实际算法会:

  • 使用块匹配或代价聚合(SGBM 等)在左右图上匹配;
  • 对每个像素估计一个视差值 \(\displaystyle d\),形成视差图;
  • 再用 \(Z=\frac{fB}{d}\) 变换成深度图。

深度分辨率与 \((B, f)\) 和视差测量精度密切相关——基线越大、焦距越长,近距离深度精度越高,但视野和最大可测距离也会发生变化。(ni.com)

3)双目与其他深度传感器的比较

  • 双目优点:只需两台普通 RGB 相机,成本较低,室外和远距离适用;
  • 双目缺点:纹理少、强反光区域容易匹配失败;远距离时视差很小,深度噪声大;
  • 其他选择:结构光 / ToF 深度相机、LiDAR 等将会在后续点云表示与机器人章节中频繁出现。

3.3.2.2 单目深度估计

1)纯几何角度:多帧单目结构恢复

如果只有单目相机,但有一段时间序列(视频),可以利用相机的运动产生视差:相机移动时,每一帧可以看作一个新的“视角”,配合估计的相机位姿,再通过三角测量得到稀疏或稠密深度。这是 单目视觉 SLAM / SfM 的传统思路。(IJCAI)

2)深度学习的单帧 / 视频深度估计

近年来更主流的路线是:直接训练一个网络,从单张图像或短视频片段预测每个像素的深度

  • 监督式方法使用有真值深度的数据集(如 LiDAR 测量)进行回归;
  • 自监督方法则通过 视图合成 作为监督信号:给定相邻帧图像、预测的深度与相机相对位姿,重投影前后帧,让网络最小化光度重建误差,而不需要真值深度标签。(CVF开放获取)

例如经典的自监督单目深度工作将深度估计网络和位姿估计网络一起训练,使得从视频中学习出几何一致的深度图和相机运动。

同时,基于 Vision Transformer 的单目深度网络(如 DPT,Dense Prediction Transformer)在大规模数据上预训练后,能够在不同场景中提供较为准确且平滑的深度估计。(arXiv)

3)单目深度的特点

  • 优点:只需一台普通 RGB 相机;可以离线地从互联网视频或机器人日志中学习,适合大规模数据预训练;
  • 局限:绝对尺度存在不确定性(除非有额外尺度信息),预测容易受训练数据分布影响;对纹理贫乏区域仍然困难。

在机器人系统中,单目深度估计常与 SLAM、结构化光或额外传感器结合使用,用于补充或增强深度感知。


3.3.2.3 点云

1)什么是点云?

点云(Point Cloud) 是一组三维点的集合,每个点通常包含:

\[ (x, y, z)\quad (+\text{颜色/强度/法向等属性}) \]

点云可以来自:

  • 立体视觉/单目深度估计生成的深度图(每个像素反投影为一点);
  • LiDAR、闪光 LiDAR 等测距设备;
  • 结构光或 ToF 深度相机。(SpringerLink)

【图 3-5 占位:室内场景点云可视化】 展示一个简单室内场景(桌子、椅子、墙壁)的彩色点云,点的稠密程度中等,便于读者直观感受点云是什么。

2)有序点云与无序点云

  • 有序点云:由深度图反投影而来,点的排列与像素网格一致(可以看作带深度的图像);
  • 无序点云:由 LiDAR 或多视角融合得到,点通常是不规则散布的。

有序点云便于和图像特征对齐,无序点云则更适合全局建图、三维重建与高精度几何计算。

3)点云在机器人中的作用

  • 建图与定位:对连续帧点云进行配准(如 ICP、NDT 等算法),构建三维地图并估计机器人位姿,是 3D SLAM 的核心。(维基百科)
  • 障碍物检测与避障:从点云中分割出地面、障碍物,给路径规划模块使用。(sensors.myu-group.co.jp)
  • 物体识别与抓取:在点云中拟合几何形状(平面、圆柱、盒子),或基于点云特征进行 3D 检测与 6D 位姿估计。(arXiv)

在后面的 3.3.3 和 3.3.4 节中,我们会看到点云如何与物体检测、抓取和避障紧密结合。


3.3.3 物体检测与 6D 位姿估计

机器人若要“抓住某个物体”,光知道“画面里有个杯子”是不够的,还必须知道:杯子在三维空间中的位置和朝向。这由 6D 位姿估计 提供。


3.3.3.1 6D 位姿

1)6 自由度位姿的定义

6D 位姿(6-DoF pose)通常指刚体在三维空间中的:

+3 维平移:\(\displaystyle (x, y, z)\),位置; +3 维旋转:可以用欧拉角(roll/pitch/yaw)、旋转矩阵 \(\displaystyle R\)、四元数 \(\displaystyle q\) 等表示。

我们经常直接写成一个齐次变换矩阵:

\[ T = \begin{bmatrix} R & t\\ 0 & 1 \end{bmatrix} \]

在 6D 物体姿态估计问题中,我们关心的是物体相对于 某个坐标系 的位姿,常见为相机坐标系或者机器人基座坐标系。(arXiv)

2)为什么 6D 位姿对机器人如此关键?

  • 抓取:爪子从哪个方向接近物体、如何旋转才能避免碰撞,完全取决于物体的 6D 姿态;
  • 精密操作:如插入插座、对接零件,要求物体与工具之间的姿态误差在毫米/角度量级;
  • 多物体操作:在堆叠、整理、装箱任务中,需要准确知道每个物体的空间布局。

从具身智能宏观角度看,6D 位姿估计可以视为连接“视觉理解”和“工程控制”的关键桥梁,是许多机器人抓取系统的前置步骤。(arXiv)


3.3.3.2 物体检测 + 姿态估计流水线

现实系统中,6D 位姿估计通常建立在 2D 物体检测的基础上形成一个 流水线。可以概括为以下几个步骤:

1)2D 物体检测或分割

使用目标检测或实例分割网络(如 YOLO、Faster/Mask R-CNN 等),识别出图像中的物体类别与 2D 边界框 / 像素掩膜。此时我们知道 哪里 有一个“杯子”或“方块”,但还不知道它的空间姿态。

2)建立 2D–3D 对应关系

根据物体类型,通常有以下几种方式建立 2D–3D 对应:

  • 已知 CAD 模型或模板:在模型坐标系中选取一组 3D 特征点(如角点),网络预测这些点在图像中的 2D 位置。
  • 类别级 3D 盒子:网络预测物体的 3D 包围盒形状和方向,从而隐含给出一些“虚拟”3D 点与 2D 点的对应关系。(MDPI)

3)求解 PnP 或直接回归位姿

有了若干个对应的 3D 点 \(\{X_i\}\) 和像素点 \(\{x_i\}\),再加上相机内参 \(\displaystyle K\),就可以通过 PnP(Perspective-n-Point) 问题求解物体相对于相机的旋转 \(\displaystyle R\) 和平移 \(\displaystyle t\)。(r-5.org)

另一类方法则直接用神经网络回归 6D 位姿参数,然后再结合渲染或 ICP 进行几何优化。

4)利用深度 / 点云进行精细对齐

如果有深度图或点云,可以将 CAD 模型渲染到深度图中,与观测到的点云对齐,利用 ICP 或概率配准(如 NDT)进行 pose refinement,以提升位姿精度,尤其是对遮挡部分的补偿。(维基百科)

【图 3-6 占位:典型“检测 + 6D 位姿估计”流水线示意图】 用流程图展示:输入 RGB/深度 → 2D 检测 → 关键点/分割 → PnP 解位姿 → 利用点云 refine → 输出 6D pose。

整体来看,这条流水线帮助机器人从“这张图里有一个杯子”上升到“杯子在相机前方 0.6m、右侧 0.2m、高度 0.1m,绕 z 轴转了 30°”。


3.3.3.3 应用

1)抓取与放置

在抓取任务中,6D 位姿估计最直接的用途是为运动规划提供目标约束。例如:

  • 已知某个物体相对于相机的姿态 \(T_{\text{obj}}^{\text{cam}}\),再结合相机-机械臂的手眼标定 \(T_{\text{cam}}^{\text{base}}\),可求出物体在机器人基座坐标系下的位姿;
  • 运动规划器据此生成一条无碰路径,让末端执行器在期望的姿态下接近并抓住物体。(arXiv)

2)装配、对接与精确操作

对于插拔连接器、插销入孔等操作,稍有角度偏差就会导致卡顿甚至损坏。6D 位姿估计结合高分辨率点云,可以提供毫米级的位姿测量,为高精度装配与工业机器人应用提供基础。(arXiv)

3)多物体场景理解与 VLA

在更复杂的场景中,6D 位姿与 3D 检测结果可以构成一个“物体级 3D 场景图”:每个物体都有类别标签和空间位姿。这种表示与语言指令(“把右边那个蓝色杯子放到桌子上”)天然契合,为后续第 8 章中的 VLA 模型提供结构化的感知输入。(arXiv)


3.3.4 对机器人特别重要的视觉能力(可抓取检测、障碍物检测等)

前面介绍的多视几何、深度估计和 6D 位姿,为机器人提供了“几何级”的理解。本节聚焦几个在具身智能中极为关键、又高度依赖前面几何基础的 专项视觉能力:可抓取检测、障碍物检测和场景语义理解。


3.3.4.1 可抓取检测

1)从“物体姿态”到“抓取姿态”

6D 位姿估计告诉我们“物体在哪里、怎么放”,但机器人真正执行的是“手爪在哪里、怎么放”。可抓取检测(grasp detection) 更关心的是:

在当前场景几何和任务需求下,哪些手爪位姿是“可行且安全”的抓取姿态?

早期方法常用二维抓取矩形来表示抓取,即在图像平面上预测一个长方形 \(x, y, w, h, \theta\),矩形中心是抓取中心,角度 \(\theta\) 决定手爪闭合方向。(arXiv)

在 3D 中,抓取姿态则通常包括:抓取接触点的 3D 坐标、抓取方向(法向)、手爪张开宽度以及手爪自身的姿态——本质上就是一个针对末端执行器的 6D pose。(ScienceDirect)

2)基于深度学习的抓取检测

现代抓取检测普遍采用深度学习,从 RGB-D 图像或点云输入直接预测一组抓取候选及其“成功概率”:

  • 将场景映射到一个 graspability map:每个像素或点都有“可抓概率”,再从中选取评分高的局部作为抓取目标;(arXiv)
  • 使用 CNN/GCN 等对点云或图像进行编码,预测一批 6-DoF 抓取姿态和对应的评分。(ScienceDirect)

【图 3-7 占位:可抓取检测示意图】 上图:叠放杂物的桌面;中图:可抓取热力图(颜色越红越容易抓);下图:选出的若干 3D 抓取姿态用绿色手爪示意。

3)可供性(Affordance)视角

与其先识别物体类别再决定如何抓取,另一种更“具身”的视角是:直接学习场景中哪些区域 具有某种操作可供性(affordance),比如“可抓”、“可按”、“可拉”。

  • 这类方法预测每个像素 / 点的任务相关可供性标签,再生成相应的抓取或操作动作;(cs.columbia.edu)
  • 对 VLA 模型而言,可供性图可以看作把视觉输入转化为“行动机会”的中间表征,有利于在复杂任务中做高层决策。

3.3.4.2 障碍物检测

机器人不仅要“抓到东西”,还必须“别撞到东西”。障碍物检测 是所有具身系统最基本的安全能力之一。

1)移动机器人:从深度 / 点云到占据图

对于轮式移动机器人或无人车,常见流程是:

  1. 使用双目、LiDAR 或其他深度传感器获取周围环境的点云或深度图;
  2. 将这些点投影到地平面坐标系下,构建 占据栅格(occupancy grid)voxel map,标记哪些单元格为“被障碍物占据”;
  3. 在此基础上,局部规划算法(如 VFH、DWA)生成避免障碍的安全路径。(维基百科)

有些工作会用更加紧凑的场景表示,如 stixels:将深度信息压缩为一系列垂直“柱子”,每根柱子表示在该方向上的最近障碍物,大大提升了处理效率。(维基百科)

2)机械臂工作空间内的障碍物

对固定底座的机械臂来说,障碍物通常分为:

  • 静态环境,例如桌边、墙面、固定装置;
  • 动态物体,例如其他机器人、人或者当前操作的物品。

利用机载 RGB-D 相机或外部 3D 传感器,可将障碍物点云融合到机器人坐标系下,交给运动规划器(如基于 RRT* 或轨迹优化的规划器),在规划路径时用碰撞检测排除会穿过障碍物的轨迹。(ScienceDirect)

3)透明 / 复杂障碍物

现实环境中,玻璃、亚克力板等透明障碍物对 RGB 和深度相机都是难点。最近有工作利用 LiDAR 点云 强度 信息和多层网格表示,专门针对透明障碍物进行检测,以提升室内机器人导航的安全性。(arXiv)


3.3.4.3 场景语义理解

仅仅知道“哪儿有障碍物”还不够。具身智能系统还需要理解:哪儿是桌面、哪儿是抽屉、哪儿是垃圾桶、哪儿是不该进入的区域。这就是 场景语义理解 的任务。

1)从像素到语义:2D/3D 语义分割

在 2D 视角上,语义分割模型为每个像素分配类别标签(桌子、地面、墙、物体种类等);结合深度信息或点云,可将这些语义标记提升到 3D,构建 语义点云语义体素地图。(CVF开放获取)

2)多层次场景表示

一个对机器人有用的场景表征往往包含多层信息:

  • 几何层:深度图、点云,提供可通行空间和障碍物;
  • 物体层:各个物体的 6D 位姿和形状;
  • 语义层:物体和区域的类别及功能(桌子、垃圾桶、储物箱、禁区等)。

例如,多视图融合系统可以从一系列“相机在手”的 RGB 图像中构建场景点云、估算未知物体的大致形状,并对已知物体估计精确 6D 姿态,为机器人操作提供全方位信息。(arXiv)

3)与语言和任务的结合

语义理解是后续“语言——视觉——行动”闭环的关键支撑:

  • 当用户说“把桌子上的红杯子放进垃圾桶”,语义分割与检测为 VLA 模型提供“桌子”“杯子”“垃圾桶”等概念在场景中的位置;
  • 高层规划可以基于“区域”而不是“裸坐标”思考:先找到桌面区域,再在桌面上搜索目标,再规划路径到垃圾桶区域。

这部分将在第 4 章语言与多模态表示、以及第 8 章 VLA 架构中被系统化地使用。本节的角色是:为具身智能提供一套能够支撑复杂任务的几何与语义感知基础


到这里,你可以把 3.3 这一大块理解为:

我们已经从“相机如何把 3D 看成 2D”一路走到“机器人如何从多视角、多传感器中重建 3D 世界,并识别其中可以抓取的区域、需要避开的障碍物和具有特定语义的区域”。

接下来 3.4 节会进一步讨论这些视觉能力在真实机器人系统中的工程落地:相机标定、延迟、噪声、帧率等实际问题。

本章小结与自测

三行小结

  1. 本章解释视觉信息如何转成机器人可用表征。
  2. 关键在于任务定义、表示学习与工程约束并行考虑。
  3. 学完后应能为任务选择合理视觉输入与评测指标。

检查题

  1. 用你自己的话总结本章最核心的一个公式/机制。
  2. 给出一个“如果要落地到项目里,你会怎么用”的具体例子。

常见误区

  1. 只追求 backbone 大小,忽略任务匹配。
  2. 忽略数据标注噪声。
  3. 指标选择与任务目标不一致。

公式到代码(最小示例)

def iou(box_a, box_b):
    xa1, ya1, xa2, ya2 = box_a
    xb1, yb1, xb2, yb2 = box_b
    inter_w = max(0, min(xa2, xb2) - max(xa1, xb1))
    inter_h = max(0, min(ya2, yb2) - max(ya1, yb1))
    inter = inter_w * inter_h
    area_a = (xa2 - xa1) * (ya2 - ya1)
    area_b = (xb2 - xb1) * (yb2 - yb1)
    union = area_a + area_b - inter
    return inter / union if union > 0 else 0.0

本章外部参考(集中)

  1. cs.cmu.edu
  2. users.cecs.anu.edu.au
  3. r-5.org
  4. 维基百科
  5. ics.uci.edu
  6. teledynevisionsolutions.com
  7. ni.com
  8. IJCAI
  9. CVF开放获取
  10. arXiv
  11. SpringerLink
  12. 维基百科
  13. 本章其余链接可在正文中按上下文继续查阅。

3.4 视觉在机器人中的工程考虑

3.4.1 相机标定与外参估计

学习导航

  • 本章主题:3.4.1 相机标定与外参估计
  • 前置知识:建议先完成第 2 章基础网络与训练技巧。
  • 建议用时:97-117 分钟
  • 阅读顺序:先看概念框架,再看公式/代码,最后做自测。

机器人要「看得懂世界」,第一步就是让相机的像素坐标与真实世界的几何量建立严格对应关系。这件事在工程上拆成三块:相机内参标定外参(姿态)估计,以及对于机载相机尤为关键的手眼标定

[图 3.4-1:相机坐标系、机器人基座坐标系、末端坐标系以及标定板坐标系的相对位置示意图]


3.4.1.1 相机内参标定

1)内参是什么,为什么要标定?

在 3.3 中已经介绍了针孔相机模型,这里从工程角度再做一次简要回顾。理想情况下,3D 点在相机坐标系 \(\displaystyle (X, Y, Z)\) 下投影到图像平面 \(\displaystyle (u, v)\) 的关系可写为:

\[ s \begin{bmatrix} u \\ v \\ 1 \end{bmatrix} = \mathbf{K} \begin{bmatrix} \frac{X}{Z} \\ \frac{Y}{Z} \\ 1 \end{bmatrix}, \quad \mathbf{K} = \begin{bmatrix} f_x & 0 & c_x\\ 0 & f_y & c_y\\ 0 & 0 & 1 \end{bmatrix} \]

这里的 \(\mathbf{K}\) 就是相机内参矩阵:\((f_x, f_y)\) 是横纵向焦距(以像素为单位),\((c_x, c_y)\) 是主点坐标。实际镜头还会引入径向、切向畸变,需要用若干畸变系数 \(k_1, k_2, p_1, p_2, \dots\) 建模。(cs280-berkeley.github.io)

对机器人而言,内参的作用很直接:

  • 将像素单位(px)转换成角度和长度的约束;
  • 为后续外参估计、PnP 位姿求解、三角测量提供基础;
  • 畸变校正后,几何关系才严格满足针孔模型假设。

2)典型标定方法(以棋盘格 + Zhang 方法为例)

在工程实践中,使用平面棋盘格进行标定是最常见的方案。Zhang 提出的平面标定方法只需要在不同姿态下拍摄若干张棋盘格图像,即可同时估计内参和畸变,被广泛集成到 OpenCV、ROS 等工具中。(ResearchGate)

核心流程可以概括为:

1.准备标定板

  • 一块已知尺寸的棋盘格或圆点格(例如 8×6 内角点,每个格子 25 mm)。
  • 在标定程序中配置每个格子的真实尺寸。 2.采集多视角图像
  • 将棋盘格在相机视野中以不同距离和姿态摆放:近、远;左、右;倾斜、旋转等。
  • 要让角点尽量覆盖整个图像平面,以便估计畸变和主点位置。
  • 一般建议采集 10–20 张以上有代表性的图像。 3.角点检测与匹配
  • 使用亚像素精度角点检测(如 OpenCV findChessboardCornerscornerSubPix)提取每张图像的角点坐标。
  • 将角点与平面标定板上的 3D 点坐标建立对应(Z=0 的平面)。 4.线性求解 + 非线性优化
  • 先通过线性方法估计一个初始内参矩阵与畸变参数;
  • 再使用非线性最小二乘(如 Levenberg–Marquardt)优化全部参数,最小化所有图像上角点的重投影误差。 5.评估与保存结果
  • 查看重投影误差的均值与方差(通常 RMS 在 0.1–0.5 像素级即相当不错);
  • 将内参、畸变系数存入配置文件或 ROS 参数服务器,供后续去畸变和三角测量使用。

[图 3.4-2:棋盘格标定过程示意,包括多视角图像、角点检测结果和重投影误差可视化]

3)工程实践中的细节与坑

+曝光与清晰度:图像过曝或模糊会严重影响角点检测质量;建议使用自动曝光锁定或手动曝光。 +温度与变焦:变焦镜头在调整焦距/对焦后,内参会明显变化;部分工业相机在温度变化较大时内参也会轻微漂移。需要在最终使用配置(焦距、对焦、安装姿态)下完成标定。(MDPI) +分辨率变化:若相机分辨率配置改变(例如从 1920×1080 改为 1280×720),内参需要按比例缩放或重新标定。 +RAW vs ISP 输出:若直接在 RAW 域上做几何感知,内参应针对 RAW 分辨率标定;若使用 ISP 后的裁剪/缩放输出,则必须在最终输出分辨率下标定。


3.4.1.2 外参(相机姿态)估计

1)外参的定义

相机外参描述的是相机坐标系相对于某个参考坐标系(例如世界坐标系、机器人基座坐标系)的位姿,即旋转矩阵 \(\mathbf{R}\) 与平移向量 \(\mathbf{t}\)。通常用一个齐次变换写成:

\[ \mathbf{T}_{\text{world}}^{\text{cam}} = \begin{bmatrix} \mathbf{R} & \mathbf{t}\\ 0 & 1 \end{bmatrix} \]

有了外参,就可以把图像中的点反投影到世界或机器人坐标系,从而实现「看见桌面上的目标 → 指挥机械臂去抓」。(cs280-berkeley.github.io)

2)基于 PnP 的外参求解

在内参已知的情况下,如果我们知道一组 3D 点在世界坐标系中的位置 \(\{\mathbf{X}_i\}\),以及这些点在图像中的像素坐标 \(\{\mathbf{u}_i\}\),就可以通过**位姿估计(PnP,Perspective-n-Point)**求解相机姿态。 典型工程流程:

  1. 在世界中固定一个带已知几何结构的标定物体(棋盘格、ArUco 标志板、定制标定架等);
  2. 记录该标定物体在世界坐标系中的 3D 坐标;
  3. 拍摄标定物体,提取图像上的角点或标志点像素坐标;
  4. 使用如 OpenCV solvePnP 之类的算法求解 \(\mathbf{R}, \mathbf{t}\)。

为了提高鲁棒性,常见做法是采集多张图像,对每张求得的位姿进行非线性联合优化(bundle adjustment),从而减小噪声影响。

3)固定相机的标定策略

对于安装在环境中的固定相机(如俯视桌面的顶置相机),一般做法是:

  • 在机械臂可达区域内放置标定板或精密标记;
  • 使用测量工具确定标定板在机器人基座坐标系中的精确位置;
  • 拍摄多张标定板图像,通过 PnP 估计 \(\mathbf{T}_{\text{world}}^{\text{cam}}\);
  • 将世界坐标系选为机器人基座坐标系,则可直接得到 \(\mathbf{T}_{\text{base}}^{\text{cam}}\)。

这样,后续任何在图像中检测到的 3D 点或平面,都可以转换到机器人基座下,用于规划运动。


3.4.1.3 手眼标定

1)Eye-in-hand vs Eye-to-hand

+Eye-in-hand(手眼相机):相机安装在机械臂末端或接近末端的位置,随着机械臂一起运动。 +Eye-to-hand(外部相机):相机固定在环境中,从外部观察机器人和工作区。(Department of Computer Science)

手眼标定要解决的问题是:

已知机器人末端在机器人基座坐标系下的位姿、以及相机看到的标定物体在相机坐标系下的位姿,求相机与末端之间的刚体变换。

简单说,就是求出「相机相对于机械臂手的精确位置和朝向」。

2)AX = XB 形式化

经典手眼标定可写成矩阵方程:

\[ \mathbf{A}_i \mathbf{X} = \mathbf{X} \mathbf{B}_i \]

其中:

  • \(\mathbf{A}_i\):机械臂从姿态 \(\displaystyle i\) 到姿态 \(\displaystyle j\) 的运动(末端在基座坐标系下的相对变换);
  • \(\mathbf{B}_i\):相机从姿态 \(\displaystyle i\) 到姿态 \(\displaystyle j\) 的运动(标定物体在相机坐标系下位姿的相对变换);
  • \(\mathbf{X}\):我们要寻找的「手到眼」刚体变换(相机相对于末端的位姿)。(IARJSET)

通过采集多组不同姿态的 \(\mathbf{A}_i, \mathbf{B}_i\) 对,便可用线性方法求得一个初始解,再用非线性优化细化。

[图 3.4-3:Eye-in-hand 几何关系示意图,显示基座、末端、相机、标定板四个坐标系,以及 AX = XB 中各矩阵对应的运动箭头]

3)数据采集与求解流程

  1. 固定一个标定板或标志(如带 ArUco 的平面板)在世界中不动;
  2. 控制机械臂末端携带相机,绕标定板做多次不同姿态的运动(尽量覆盖不同位置和朝向);
  3. 记录每个姿态下:
    • 机械臂末端相对于基座的位姿 \(\mathbf{T}_{\text{base}}^{\text{ee}}\);
    • 标定板相对于相机的位姿 \(\mathbf{T}_{\text{cam}}^{\text{target}}\);
  4. 从这些姿态对构造 \(\mathbf{A}_i, \mathbf{B}_i\),求解 AX=XB 问题,得到 \(\mathbf{X} = \mathbf{T}_{\text{ee}}^{\text{cam}}\);
  5. 可进一步引入非线性最小二乘,最小化所有姿态下标定板重投影误差和几何误差。

4)误差评估与常见问题

+重投影误差:将世界中已知的标定点,通过「基座 → 末端 → 相机」链路投到图像,再与真实像素位置比较,均方误差越小越好。 +抓取精度测试:在桌面上放置若干已知位置的小目标,让机器人根据视觉估计去抓取,统计抓取位置误差和成功率。(develop.realman-robotics.com)

常见坑包括:

  • 姿态采样不够丰富(都在一个平面附近),导致解病态;
  • 相机或末端在采集中产生微小滑动,但未被模型考虑;
  • 标定板精度不足或标记尺寸测量不准。

3.4.2 图像处理链路:从传感器到模型输入

本小节关注的是「从光子到张量」的工程过程:相机如何把光信号转成数字图像,图像又如何变成深度学习模型可以接受的张量。这条链路任何细节处理不当,都可能直接影响模型在机器人上的表现。

[图 3.4-4:典型数字相机 ISP + 深度学习预处理的流水线图:光学 → 传感器(RAW)→ ISP(demosaic/降噪/白平衡/gamma)→ RGB 图像 → 尺度调整/裁剪 → 归一化 → Tensor]


3.4.2.1 传感器输出

1)RAW 数据与 Bayer 阵列

大部分 CMOS 图像传感器本质上是单色传感器,前面覆盖了一个彩色滤波阵列(CFA),最常见的是 Bayer 模式(RGGB)。每个像素只测量 R、G 或 B 中的一种分量,输出的是一个 RAW 灰度图像,但每个像素有不同颜色含义。(e-con Systems)

RAW 域通常具有以下特点:

  • 响应近似线性(曝光强度与数值基本成正比);
  • 动态范围大,但包含噪声、坏点等;
  • 尚未进行白平衡、降噪、锐化等处理。

2)ISP(Image Signal Processing)管线

在绝大多数工业/消费级相机中,RAW 数据会先进入 ISP,再输出常见的 RGB 或 YUV 图像。典型 ISP 包含:(ResearchGate)

  1. 黑电平校正、响应线性化;
  2. 白平衡(调整不同颜色通道增益); 3.Demosaicing:从 Bayer CFA 重建完整的 RGB 像素;
  3. 降噪、去坏点、锐化;
  4. 颜色校正(传感器色域 → 标准 RGB 空间,如 sRGB);
  5. Gamma 矫正、对比度增强、色调映射等。

对于机器人视觉,有两种常见策略:

  • 直接使用相机输出的 RGB 图像,让 ISP 完成大部分处理;
  • 利用可编程相机/RAW 接口,手动实现简化 ISP,以获得更稳定、更可控的图像风格,为后续模型训练带来一致性。

3)与控制闭环的关系

ISP 的复杂度直接影响感知延迟。在一些高帧率、低延迟要求的场景(如高速飞行器避障),会刻意选择简化 ISP,甚至直接使用灰度或近 RAW 数据,以换取更低延迟。(rpg.ifi.uzh.ch)


3.4.2.2 尺度调整与裁剪

大多数视觉模型要求固定大小的输入(例如 224×224 或 480×480)。原始图像往往分辨率较高、纵横比不规则,需要进行缩放和裁剪

1)缩放(Resize)的策略

+保持纵横比缩放:按长边或短边缩放到目标尺寸,再在较短边上填充或裁剪。该策略可避免非均匀拉伸,减小几何畸变对检测、位姿估计的影响。 +直接拉伸到目标尺寸:简单粗暴,但会扭曲几何关系,尤其对需要精确几何信息(抓取点预测、姿态估计)任务不利。

  • 插值方式上,常用双线性、双三次插值;过于激进的插值会模糊边缘。

2)裁剪(Crop)与 ROI 选择

  • 对于固定工作区(如实验桌面),可以直接裁剪出桌面区域,减少无关背景。
  • 对于多任务场景,可以先用轻量级检测网络找出感兴趣区域,再裁剪出 ROI 输入到精细模型。
  • 注意:裁剪会改变对象相对于图像坐标系的位置,对后续几何计算(如像素坐标归一化、PnP)必须做一致处理。

3)与内参与外参的一致性

如果标定是在原始全分辨率下完成的,而后续对图像进行缩放或裁剪,则需要对内参进行相同的线性变换:

  • 缩放:\((f_x, f_y, c_x, c_y)\) 按比例缩放;
  • 裁剪:主点 \((c_x, c_y)\) 需要减去裁剪偏移。

这是很多工程系统中容易忽略但会直接降低精度的细节。


3.4.2.3 归一化与张量转换

走到这一步,我们已经有了一张「看着还不错」的 RGB 图像,但深度学习模型需要的是一个数值张量。

1)归一化(Normalization)

典型的预处理包括:

  • 将像素从 0–255 线性缩放到 0–1 或 -1–1 区间;
  • 按通道减去均值、除以标准差(例如 ImageNet 标准均值/方差);
  • 对深度图或灰度图,可能需要做 log 变换或裁剪到物理合理范围。

关键要求是:训练时使用的归一化方式必须在推理时严格一致。否则模型学到的统计分布会在部署时完全失配,导致性能大幅下降。

2)张量格式与内存布局

  • 通常深度学习框架使用 NCHW(batch,通道,高度,宽度)格式;
  • 来自相机或图像库的数据往往是 HWC(高度,宽度,通道)格式,需要转换维度顺序;
  • 对实时系统,数据拷贝和排列本身也会引入延迟,因此实际工程会尽量减少多余格式转换。

3)多模态输入的对齐

在机器人场景中,模型输入可能包括:

  • RGB 图像、深度图;
  • 机器人关节状态、末端位姿;
  • 历史动作序列。

这些张量需要在时间戳上对齐(参见第 7 章的数据采集部分),以免模型把错位的感知和动作拼在一起,导致训练出的策略在真实世界表现异常。


3.4.3 延迟、噪声与帧率对控制的影响

视觉只是机器人控制闭环中的一环:从场景发生变化,到相机采集、ISP 处理、模型推理,再到控制器下发关节指令,中间会不可避免地引入时间延迟;图像本身则存在各种噪声与不确定性;而帧率则决定了系统感知世界的时间分辨率。这三者直接决定了视觉控制的上限性能。

[图 3.4-5:视觉控制闭环时间轴示意图,从真实世界事件发生到机器人执行动作的各个延迟环节;附带不同噪声源的示意]


3.4.3.1 延迟

1)延迟的类型

+感知延迟:从真实场景变化到相机输出图像的时间,包含曝光时间、传感器读出时间、ISP 处理时间、数据传输时间。(ScienceDirect) +计算延迟:图像预处理、模型推理、后处理(如 NMS、轨迹规划)的时间。 +执行延迟:从控制命令发出到机器人关节产生实际运动的时间,包括通信延迟、电机响应等。

整体延迟可简单理解为:机器人看到的是几帧之前的世界。在静态环境下这还好,在高速运动场景(如无人机避障)中则非常致命。

研究表明,在给定障碍密度和反应能力的前提下,感知延迟会对可安全行驶的最大速度形成硬性上限。(rpg.ifi.uzh.ch)

2)测量与建模

  • 实验上可以通过让场景中出现一个在已知时间变化的视觉事件(如 LED 灯突然点亮),测量从事件发生到控制器检测到的时间,即感知+计算延迟。(ScienceDirect)
  • 在控制算法层面,可以把延迟作为一个固定时滞或随机时滞进行建模,用离散时间视觉伺服控制、预测控制等方法进行补偿。(MDPI)

3)工程上的缓解策略

+降低复杂度:简化图像分辨率、模型大小,牺牲部分精度换取更低延迟; +管线并行:将图像采集、推理、控制执行做成流水线,而非完全串行; +预测补偿:用上一时刻速度估计目标或机器人自身在当前时刻的位置,将控制量作用到「预测状态」上; +速度约束:直接在规划层限制最大线速度和角速度,使系统在给定延迟下仍能保证安全距离。


3.4.3.2 噪声

1)噪声的来源

  • 传感器层面:读出噪声、光子噪声(shot noise)、热噪声;
  • ISP 处理:压缩、锐化、降噪算法可能引入纹理变化和伪影;
  • 环境因素:光照变化、反光、高动态范围场景导致局部过曝或欠曝。(ResearchGate)

这些噪声会直接影响:

  • 特征检测与匹配的稳定性(角点、特征点抖动);
  • 深度估计与点云的精度(视差误差放大为深度误差);
  • 物体检测和姿态估计模型的置信度。

2)滤波与多帧融合

典型工程手段包括:

  • 空间滤波(Gaussian、bilateral filter)去除高频噪声;
  • 时间滤波(指数滑动平均)稳定目标位置估计,但会引入额外滞后;
  • 多帧融合与超分辨技术,利用多帧观测提高信噪比。

3)在模型和数据层面的应对

  • 数据增强时加入高斯噪声、压缩伪影、光照扰动,使模型对噪声更鲁棒;
  • 通过鲁棒损失(如 Huber loss)减弱少数极端噪声样本对参数估计的影响;
  • 利用原始 RAW 或线性域数据训练模型,避免 ISP 的不可控风格差异。(arXiv)

3.4.3.3 帧率

1)帧率与时间分辨率

帧率(FPS)决定了系统每秒能够获取多少张新图像。帧率越高,系统对环境变化越敏感,能更快发现和响应变化;帧率越低,则容易错过短暂事件或造成控制指令不连贯。

在视觉伺服中,常见的控制频率是相机帧率的整数倍或约数,例如相机 30 FPS、控制循环 30 Hz 或 60 Hz。若控制频率远高于视觉更新频率,后续控制循环只能基于旧图像反复更新,实际价值有限。(faculty.cc.gatech.edu)

2)高帧率的代价

  • 采集和传输带宽需求增大(尤其是高分辨率图像);
  • ISP 和模型推理要在更短时间内完成,否则会堆积延迟;
  • 嵌入式平台(如 Jetson)上,高帧率往往意味着更高功耗和温度。

因此,在工程上通常要做系统级预算:图像分辨率、帧率、模型大小、硬件性能必须同时考虑,找到一个满足任务需求的折中点。

3)帧率、延迟与噪声的联合作用

三者之间存在天然的联系:

  • 提高帧率需要缩短曝光时间,可能降低信噪比,使图像更暗更「粗糙」;
  • 过强的降噪又可能引入更多处理时间,增加延迟;
  • 降低帧率虽可提高单帧质量,但控制回路响应变慢。

在机器人工程中,合理的做法不是单独追求某一指标极致,而是根据任务(慢速操作 vs 高速运动)选取合适的参数组合。


3.4.4 单目 / 双目 / 手眼相机的差异与适用场景

从「看」这个动作本身来说,相机可以有多种布置方式。不同布置在成本、深度感知能力、遮挡情况和标定复杂度上都有截然不同的特性。本小节主要对比三种典型配置:单目相机、双目相机、手眼相机与外部固定相机

[图 3.4-6:单目相机、双目相机、Eye-in-hand 与 Eye-to-hand 四种典型配置的示意图,标出各自视野范围和与机器人坐标系的关系]


3.4.4.1 单目相机

1)特点

  • 硬件简单、成本最低,安装灵活(机载、固定、头戴式等均可);
  • 无法直接从单帧图像恢复真实尺度的深度,只能得到相对结构或借助先验;
  • 适合做 2D 检测、语义分割、场景理解等任务。

2)单目深度与结构推理

虽然单目本身不具备几何尺度,但可以利用:

  • 相机运动多帧(结构从运动,SfM / VO);
  • 几何先验(物体尺寸、平面假设);
  • 学习方法(单目深度估计网络)。

这些方法在机器人场景中可以提供「相对深度」或近似距离信息,但其精度与鲁棒性通常不如真正的立体或深度传感器。

3)适用场景

  • 低成本移动机器人导航(配合激光雷达或超声波避障);
  • 对绝对距离要求不高的拾取放置任务(如高度固定的桌面、物体尺寸已知);
  • 需要利用大视野和语义信息的任务(如房间场景分析、目标搜索)。

3.4.4.2 双目相机

1)立体几何与深度

双目相机由两台内参相同、外参已知的相机组成,通过视差恢复深度:

  • 同一空间点在左右图像上的像素位置存在水平偏移,称为视差;
  • 视差与深度成反比,基线越大、分辨率越高,估计精度越好。

在 3.3 已经介绍过基础三角测量原理,这里强调其工程意义:双目提供了稠密或半稠密的深度图,能让机器人在单次观测中获得完整的 3D 信息,而无需相机移动。

2)工程挑战

  • 双目标定需要同时估计两台相机的内参和相互外参,对棋盘格姿态和数据质量要求更高;
  • 立体匹配算法复杂度较高,对弱纹理区域、反光面表现不佳;
  • 两路相机需要精确同步,否则会在快速运动时产生伪视差。

3)适用场景

  • 模拟人眼视觉的服务机器人、移动平台导航;
  • 抓取与操作任务中的深度感知(如堆叠物体高度估计、障碍物高度判断);
  • 对成本敏感,但又需要一定深度信息的场景,是 RGB-D 相机(结构光/ToF)的一种替代方案。

3.4.4.3 手眼相机 vs 外部固定相机

1)Eye-in-hand(手眼相机)的特点

  • 相机固定在末端执行器或机械臂手腕上,视野随机器人运动而改变;
  • 可以近距离观察目标,获得高分辨率局部细节,尤其适合精细操作(插入、拧螺丝、检查焊点等);
  • 遮挡问题更容易控制:机器人可以主动移动相机绕过遮挡。

缺点是:

  • 手眼标定较复杂,需要解决 AX=XB 问题并维持长期稳定;(Department of Computer Science)
  • 视野有限,很难同时观察整个工作区,需要配合路径规划确保相机视线不被自身或环境遮挡;
  • 在机械臂高速运动时,图像更容易模糊,对曝光和帧率要求更高。

2)Eye-to-hand(外部固定相机)的特点

  • 相机安装在环境中,如俯视工作台的顶置相机、墙角相机;
  • 可以一次性覆盖较大的工作区域,方便做全局任务规划与监控;
  • 外参标定相对简单,只需对固定标定板做 PnP 标定,且只要不移动相机,参数可以长期保持稳定。

但它也有明显局限:

  • 容易被机械臂本体或其他物体遮挡;
  • 对小物体或精细操作细节分辨率不足,远处目标角度变化导致姿态估计精度下降;
  • 对于多机器人协作,需要复杂的多视角配置和坐标对齐。

3)组合使用与趋势

在较复杂的机器人系统中,常见的做法是:

  • 使用一到多台外部相机提供全局感知(物体分布、障碍物、其它机器人位置);
  • 使用手眼相机提供局部精细感知(抓取对准、接触前微调);
  • 通过统一的坐标标定(手眼标定、相机间外参)将多视角信息进行融合。(Robotics Stack Exchange)

这种「全局 + 局部」的配置,也为后续 VLA 模型和世界模型提供了丰富多样的视觉输入基础——在后续章节中,我们会看到如何在这个基础上进一步利用语言、历史轨迹,将几何感知提升为智能行为决策。

本章小结与自测

三行小结

  1. 本章解释视觉信息如何转成机器人可用表征。
  2. 关键在于任务定义、表示学习与工程约束并行考虑。
  3. 学完后应能为任务选择合理视觉输入与评测指标。

检查题

  1. 用你自己的话总结本章最核心的一个公式/机制。
  2. 给出一个“如果要落地到项目里,你会怎么用”的具体例子。

常见误区

  1. 只追求 backbone 大小,忽略任务匹配。
  2. 忽略数据标注噪声。
  3. 指标选择与任务目标不一致。

公式到代码(最小示例)

def iou(box_a, box_b):
    xa1, ya1, xa2, ya2 = box_a
    xb1, yb1, xb2, yb2 = box_b
    inter_w = max(0, min(xa2, xb2) - max(xa1, xb1))
    inter_h = max(0, min(ya2, yb2) - max(ya1, yb1))
    inter = inter_w * inter_h
    area_a = (xa2 - xa1) * (ya2 - ya1)
    area_b = (xb2 - xb1) * (yb2 - yb1)
    union = area_a + area_b - inter
    return inter / union if union > 0 else 0.0

本章外部参考(集中)

  1. cs280-berkeley.github.io
  2. ResearchGate
  3. MDPI
  4. Department of Computer Science
  5. IARJSET
  6. develop.realman-robotics.com
  7. e-con Systems
  8. ResearchGate
  9. rpg.ifi.uzh.ch
  10. ScienceDirect
  11. MDPI
  12. arXiv
  13. 本章其余链接可在正文中按上下文继续查阅。

4.1 NLP 基础

4.1.1 语言模型与子词分词(BPE、SentencePiece 等)

学习导航

  • 本章主题:4.1.1 语言模型与子词分词(BPE、SentencePiece 等)
  • 前置知识:建议具备第 2 章 Transformer 基础。
  • 建议用时:68-88 分钟
  • 阅读顺序:先看概念框架,再看公式/代码,最后做自测。

这一小节的目标,是把“语言”从符号序列变成可以计算的概率对象,并解释为什么几乎所有现代 NLP/LLM 都离不开子词分词。


4.1.1.1 语言模型

**语言模型(Language Model, LM)**的核心任务: 给定一个词(或 token)序列 \(w_1, w_2, \dots, w_T\),估计这整个序列出现的概率

\[ P(w_1, w_2, \dots, w_T) \]

或更常用的条件形式

\[ P(w_t \mid w_1, \dots, w_{t-1}) \]

即“在前面已经看到的内容条件下,下一个词是什么的概率”。

利用概率论中的链式法则(chain rule),可以把整体概率拆成一连串条件概率的乘积:

\[ P(w_1,\dots,w_T) = \prod_{t=1}^T P(w_t \mid w_1,\dots,w_{t-1}) \]

这就是“预测下一个词”的数学形式。无论是传统 n-gram 模型,还是后面 4.2 节要介绍的大型自回归 Transformer 语言模型,都是在近似和建模这类条件概率。

在工程实践中,语言模型主要用于:

  • 评估一句话是否“自然”(概率越大越自然)
  • 生成新文本(按概率采样或取最大概率的下一个词)
  • 作为其它任务(翻译、问答、对话、代码生成、机器人语言理解)的基础模块

评价指标上,**困惑度(perplexity)**常被用来衡量语言模型好坏: 直观理解上,它刻画“模型平均每一步在多少个候选 token 之间摇摆”。困惑度越低,说明模型越“不困惑”,预测越准确。

【图 4-1 占位:语言模型示意图】 建议画一个简单示意:左侧是词序列 “机器人 / 把 / 杯子 / …”,箭头指向右侧一个“softmax 概率分布”柱状图,表示下一个词的概率分布。


4.1.1.2 N-gram 模型

在真实语言里,\(P(w_t \mid w_1,\dots,w_{t-1})\) 依赖的上下文可能非常长,直接建模几乎不可能。N-gram 模型通过一个强但简单的假设来简化问题:

第 \(\displaystyle t\) 个词只依赖前面最近的 \(n-1\) 个词,而不管更早的历史。

n 阶马尔可夫假设

\[ P(w_t \mid w_1,\dots,w_{t-1}) \approx P(w_t \mid w_{t-n+1},\dots,w_{t-1}) \]

于是整句的概率就变成:

\[ P(w_1,\dots,w_T) \approx \prod_{t=1}^T P(w_t \mid w_{t-n+1},\dots,w_{t-1}) \]

常见的几种 n-gram:

+Unigram(一元组):每个词独立,\(P(w_t)\) +Bigram(二元组):只看前一个词,\(P(w_t \mid w_{t-1})\) +Trigram(三元组):看前两个词,\(P(w_t \mid w_{t-2}, w_{t-1})\)

参数估计很直观: 在语料库里数共现次数,比如 bigram:

\[ \hat{P}(w_t \mid w_{t-1}) = \frac{\text{count}(w_{t-1}, w_t)}{\text{count}(w_{t-1})} \]

数据稀疏和平滑(smoothing) 即使在很大的语料库里,很多 n-gram 组合仍然从未出现,简单的计数估计会得到概率 0,导致整句概率为 0。为此需要平滑技术:

+加一(Laplace)平滑:全部计数 +1,避免 0 概率 +Kneser–Ney 平滑:更精细地折扣高频 n-gram,将概率质量分配给低阶模型,是实际应用中非常强大的平滑方法

N-gram 模型的优点是直观、易实现、解释性好,但局限也很明显:

  • 上下文窗口固定、短(一般 n≤5),难以捕获长距离依赖
  • 高阶 n-gram 参数量膨胀严重,极易稀疏
  • 需要大量人工设计特征和复杂平滑

这也为后续的神经语言模型和 Transformer-based LLM 铺垫了背景:它们在本质上也是语言模型,但放弃了简单的 n-gram 结构,使用深度网络来拟合长期依赖关系(详见 4.2 节)。

【图 4-2 占位:N-gram 概率图】 一条横向词序列,画出 bigram 的有向边(从前一个词指向后一个词,边上标概率),旁边再画一个 trigram 概率公式。


4.1.1.3 子词分词

语言模型需要先把原始文本切成离散 token,才能定义上面的概率分布。最朴素的做法是“按空格切词”,但这在很多场景中会出问题:

  • 词汇表如果只包含完整单词,生僻词、人名、技术术语会变成 OOV(Out-of-Vocabulary)
  • 黏着语、形态丰富的语言(如德语、土耳其语)一个词可以拼成非常长的复合词
  • 对中文、日文等无空格语言,“按词切分”本身就是困难任务

**子词分词(subword tokenization)**就是折衷方案: 把词拆成更小的子单元(子词、字块、甚至字节),既比字符更长、表达能力更强,又比完整词更泛化。这样,模型只要掌握有限的子词,就能组合出近乎无限的单词。

Byte Pair Encoding(BPE)

BPE 原本是一种数据压缩算法,被 Sennrich 等人改造为子词分词方法,用于机器翻译等任务。 其基本思想:

  1. 字符级开始,将训练语料中的每个词看作字符序列。
  2. 统计所有相邻符号(初始是字符对)的出现频率。
  3. 找出出现频率最高的一对符号,把它们合并成一个新的符号(子词)。
  4. 在整个语料中替换这对符号,更新符号序列。
  5. 重复 2–4 步,直到达到预设的词表大小(例如 32k 或 50k 子词)。

举个简单例子(极简示意):

  • 初始:l o w, l o w e r, n e w, n e w e r
  • 多次合并之后:lo w, lo wer, ne w, ne wer,再进一步可能变成 low, lower, new, newer

在机器人/多模态场景中,BPE 的优势尤其明显: 当遇到新的对象名(如“电动三轮广告车”)时,模型仍然可以把它拆成若干已知子词组合,而不是完全陌生的一个 token。

SentencePiece 与 Unigram LM

SentencePiece是 Google 提出的一个子词分词工具,核心特点是:从原始字符序列直接训练子词模型,不依赖预先分词。

它支持两类常见的子词模型:

+BPE 模式:基本同上,只是集成在统一工具中 +Unigram 语言模型(Unigram LM):为候选子词集合建立一个概率模型,对一句话所有可能的分词方式求概率,选择整体概率最大的那一种。

SentencePiece 还有几个工程上重要的特性:

+语言无关:可以直接处理日文、中文、混合语种等,无需先用特定语言的分词器 +直接训练与解码:既提供训练子词词表,也负责编码/解码,方便端到端部署

  • 对空格等也视作普通字符,避免“空格信息丢失”的问题

在大模型和 VLA 场景中,我们通常只需要统一、稳定的 tokenization(如 BPE/Unigram + SentencePiece 实现),就能在多任务、多语言、多机器人之间共享同一语言模型。

【图 4-3 占位:BPE/SentencePiece 分词过程示意】 左侧是原始句子,下面列出“字符级表示 → 若干轮合并 → 最终子词序列”的过程,中间可附上合并频率排名的小表格。


4.1.2 词向量、上下文表示(word2vec、ELMo 等)

这一小节从“离散 token 编号”走向“连续向量空间表示”,是从统计 NLP 过渡到神经表示学习的关键步骤。


4.1.2.1 静态词向量

传统做法中,每个单词只是一个 ID,模型无法直接比较“机器人”和“机械臂”的相似程度。**词向量(word embedding)**通过把每个词映射为一个实数向量,能让模型在几何空间中“感受”词义相近性。

背后的直觉是著名的分布式假设

在相似上下文中出现的词,其语义也相似。

word2vec

Mikolov 等人提出的word2vec模型是静态词向量的代表,使用一个小型神经网络在大规模语料上自监督训练。

两种典型结构:

+CBOW(Continuous Bag-of-Words):给定中心词周围的上下文词,预测中心词 +Skip-gram:给定中心词,预测其左右上下文词;对稀有词效果更好

训练时常用的技巧包括:

+层次 softmax:用 Huffman 树加速输出层计算 +负采样(negative sampling):只采样少量“负例”单词来更新参数,大幅加速训练

训练结束后,每个词对应一个固定维度的向量(如 100 维、300 维),在这个向量空间里:

  • 语义相近的词距离较近(cosine 相似度高)
  • 有时还能观察到线性关系,如 \(\text{vec}(\text{“国王”})\) - \(\text{vec}(\text{“男人”})\) + \(\text{vec}(\text{“女人”})\) \approx \(\text{vec}(\text{“女王”})\)

其他静态词向量方法如GloVe,可以看作对词共现矩阵的某种因子分解,也在许多 NLP 任务中表现良好。

【图 4-4 占位:词向量空间示意图】 通过二维投影展示若干词(如 “机器人”“机械臂”“猫”“狗”)在平面上的位置,同类词聚在一起。


4.1.2.2 上下文表示

静态词向量有一个致命缺陷:同一个词在不同语境中的含义不同,但它的向量是固定的。

比如“银行”在中文中可以是“金融机构”也可以是“河岸”;静态 embedding 无法区分这两种含义。为解决多义词问题,研究者提出了上下文敏感(contextualized)词表示

ELMo:基于双向语言模型的上下文向量

ELMo(Embeddings from Language Models)是早期具有代表性的上下文表示方法。它的做法是:先训练一个深层双向语言模型(biLM),然后把每个词的表示定义为这个 biLM 内部隐藏状态的函数(通常是不同层表示的加权和)。

关键特点:

  • 模型结构:字符级 CNN + 多层 BiLSTM + 语言模型目标(从左到右和从右到左)
  • 对于句子中的每个词,ELMo 输出一个向量,这个向量取决于整句上下文
  • 将这些向量作为附加特征喂给下游模型(如问答、自然语言推断、情感分析),能显著提升性能

与静态词向量相比,上下文表示有几点明显优势:

  • 一词多义:可以根据句子动态区分意义(河边的“银行”和金融“银行”得到不同向量)
  • 表达能力更强:深层网络可以捕获语法、语义乃至一些世界知识
  • 迁移性好:在大语料上预训练,再迁移到各种下游任务

ELMo 之后,BERT、GPT 等基于 Transformer 的预训练模型进一步统一了“语言建模 + 上下文表示 + 下游任务微调”的范式(详见 4.2 节),但 ELMo 清晰体现了**“从语言模型内部状态抽取表示”**的思想。

【图 4-5 占位:静态 vs 上下文词向量对比】 同一个词 “bank” 在两句

  • “I went to the bank to deposit money.”
  • “He sat on the river bank.” 中的表示:上图静态 embedding 是同一点,下图上下文 embedding 是两处不同的位置。

4.1.2.3 预训练词向量的作用

无论是静态词向量(word2vec/GloVe),还是上下文表示(ELMo/BERT 系列),共同点是:可以在海量无标注文本上预训练,然后作为下游任务的“通用特征”。

在工程实践中,这带来几方面好处:

1.更好的初始化 将下游模型的嵌入层初始化为预训练词向量,而不是随机初始化,用少量标注数据就能达到更高性能,并更快收敛。 2.显著提升小数据任务的效果 许多任务(尤其是领域特定任务,比如“机器人操作日志理解”“工业说明书理解”)标注数据很少。预训练词向量可以把互联网大规模语料中学到的语言知识迁移过来,提高泛化能力。 3.统一多任务、多领域表示空间 使用同一套预训练向量,多种任务共享一个表示空间,使得跨任务迁移、更大规模的多任务训练更容易实现。这为后续“统一视觉–语言–动作表示”的 VLA 模型打下了先验基础。 4.在机器人场景中的具体价值

  • 对自然语言指令的理解更鲁棒(可以识别各种同义表达)
  • 可以把人类使用的专业术语、品牌名等编码进机器人可用的向量空间
  • 与视觉、动作表示对齐时,语言侧已经有较好的几何结构,便于跨模态对齐

在现代 LLM 中,“预训练 +(可能的)微调”几乎成为默认范式。4.2 节可以被看作是将“预训练词向量”扩展到“预训练整套语言模型”的自然结果。


4.1.3 常见任务:机器翻译、问答、摘要等

在掌握语言模型与向量表示之后,最典型的应用场景就是各种“序列到序列”任务。这里简要介绍三类与后续 VLA 特别相关的任务:机器翻译、自动问答和文本摘要。


4.1.3.1 机器翻译

**机器翻译(Machine Translation, MT)**的目标是: 给定源语言句子 \(\mathbf{x}\),生成语义等价的目标语言句子 \(\mathbf{y}\)。

发展脉络(非常简略版):

1.基于规则 / 统计的传统翻译

  • 基于语法和词典的规则系统
  • 统计机器翻译(SMT):学习“翻译模型 + 语言模型”,典型如短语翻译 + n-gram 语言模型 2.神经机器翻译(Neural Machine Translation, NMT) 使用一个端到端的神经网络直接建模 \(P(\mathbf{y} \mid \mathbf{x})\),
  • 早期采用 RNN 编码器–解码器结构
  • Bahdanau 等人引入注意力机制(attention),解码时可以软对齐到源句的不同部分,大幅提升性能
  • 后来 Transformer 架构成为主流翻译模型(与 2.4 节呼应) 3.子词与开放词汇翻译 由于翻译需要处理大量人名、地名、新词,NMT 特别依赖子词分词。Sennrich 等工作表明,用 BPE 进行子词分词可以显著改善罕见词和未登录词的翻译质量。

机器翻译在具身智能中的作用非常直接: 机器人系统如果希望跨语言工作(例如同时接受中文和英文指令),可以使用统一的多语言表示空间或翻译模块,将不同语言映射到统一的语义指令表示,再交给 VLA 模型进行决策。

【图 4-6 占位:NMT Encoder–Decoder 结构示意】 左边源句 token 序列,经过编码器变成一串向量;右边解码器逐步生成目标句,每一步从注意力层“查看”源句不同位置。


4.1.3.2 自动问答

**自动问答(Question Answering, QA)**任务要求系统根据输入的问题,返回一个自然语言答案。根据是否给定上下文,可以大致分成:

+机器阅读理解(Machine Reading Comprehension, MRC) 给定一段文本(如维基百科文章)和一个问题,从文本中找出答案。 典型数据集如 SQuAD:每个问题的答案是文章中的一个文本片段。 +开放域问答(Open-domain QA) 系统可以检索整个知识库或搜索引擎结果,然后综合得到答案。这里通常需要“检索 + 阅读 + 生成”三段式管线。 +封闭书问答(Closed-book QA) 模型完全依赖参数中“记住”的知识,不提供外部文档。例如直接问 LLM “谁提出了 ELMo”。

早期的 QA 系统通常采用“特征工程 + 机器学习”,或者 “检索 + 规则匹配”。现代 QA 系统则多依赖预训练语言模型,通过:

  • 编码问题和文档,使用注意力/交互模块找出答案 span
  • 或直接由生成式模型输出答案文本

在机器人场景中,自动问答能力可以自然扩展为:

+解释型问答:用户询问“你为什么没有抓起杯子?”,机器人根据视觉、状态和任务规划给出语言解释(见 4.4.3)。 +知识问答:机器人可回答“这个零件的材质是什么”“这个操作步骤下一步是什么”,帮助人类在任务中获取信息。

这些都依赖足够强的语言理解和生成能力,而这些能力本质上都来自于强大的语言模型 + 上下文表示


4.1.3.3 文本摘要

**文本摘要(Text Summarization)**任务希望模型从长文本中压缩出简短而信息密集的摘要。在现代 NLP 中通常分为两大类:

1.抽取式摘要(Extractive Summarization)

  • 从原文中选出若干“重要句子/片段”,按一定顺序拼接成摘要
  • 摘要中的句子是原文的子集,不生成新句子 2.生成式(抽象式)摘要(Abstractive Summarization)
  • 模型“理解”原文要点后,用自己的语言重新组织句子
  • 可以使用原文中没有出现过的表述,更接近人类写作风格

早期抽象式摘要往往采用编码器–解码器结构,结合注意力和指针机制(pointer-generator),既能生成新文本,又能“复制”原文中的关键词语,缓解 OOV 问题。

模型评价上,ROUGE系列指标被广泛使用,通过比较系统摘要和人工摘要之间的 n-gram 重合来评估质量。

在具身智能和机器人系统中,摘要能力的应用场景包括:

+实验日志与传感器数据的“语言摘要”:把长时间运行的机器人操作日志自动总结成自然语言报告,帮助研究人员快速了解结果。 +环境描述压缩:将复杂场景感知结果压缩成高层语言描述(如“桌子上有三个杯子,其中一个是红色”),再交给上层规划模块。 +人机交互中的简短回顾:机器人执行一长串动作后,用一两句话向用户简单汇报自己做了什么,有利于建立信任和可解释性。

【图 4-7 占位:抽取式 vs 抽象式摘要对比】 左边:原文多句,系统选出其中几句高亮连接成摘要;右边:模型生成几句新文本,箭头指向原文不同部分,表示它综合了多个来源。


本节从语言模型 → N-gram → 子词分词 → 词向量与上下文表示 → 典型 NLP 任务搭建了一个最基础的 NLP 知识框架。后续 4.2 节会在此基础上,引入大规模 Transformer 语言模型及其在多模态、具身智能中的角色,从“会说话的模型”进一步走向“会理解、会行动的机器人大脑”。

本章小结与自测

三行小结

  1. 本章说明语言如何参与机器人任务表达与约束。
  2. 重点是语义条件化,而不是只做文本生成。
  3. 学完后应能设计语言到控制约束的映射接口。

检查题

  1. 用你自己的话总结本章最核心的一个公式/机制。
  2. 给出一个“如果要落地到项目里,你会怎么用”的具体例子。

常见误区

  1. 把语言当装饰输入,不做约束落地。
  2. 忽略指令歧义与失败反馈。
  3. 缺少安全规则优先级设计。

公式到代码(最小示例)

instruction = "pick the red cup"
keywords = [w for w in instruction.split() if w not in {"the"}]
constraints = {"forbid": ["spill"], "speed": "low"}
print(keywords, constraints)

本章外部参考(集中)

  1. 本章暂无外部链接,建议优先完成本章自测与代码实践。

4.2 大语言模型(LLM)基础

4.2.1 自回归语言模型与下一个 token 预测

学习导航

  • 本章主题:4.2.1 自回归语言模型与下一个 token 预测
  • 前置知识:建议具备第 2 章 Transformer 基础。
  • 建议用时:80-100 分钟
  • 阅读顺序:先看概念框架,再看公式/代码,最后做自测。

4.2.1.1 自回归模型

在 4.1 节里,我们已经从“语言模型 = 预测下一个词的机器”的角度做过直观介绍。这里开始进入现代大语言模型(LLM)的主流形式:自回归(autoregressive)语言模型

给定一个 token 序列 \(x_{1:T} = (x_1, x_2, \dots, x_T)\),自回归模型假设整段文本的概率可以被分解为从左到右的一系列条件概率:

\[ p_\theta(x_{1:T}) = \prod_{t=1}^{T} p_\theta(x_t \mid x_{<t}) \]

也就是说,第 \(\displaystyle t\) 个 token 的分布,只依赖于它左侧所有已经出现的 token。这就是“自回归”的含义:用自己过去的输出来回归(预测)未来。

在工程上,主流实现是Transformer 的纯 Decoder 结构(第 2.4.4 节已介绍):

  • 输入是一串 token 的嵌入向量;
  • 自注意力(Self-Attention)使用因果掩码(causal mask),只允许每个位置看到自己左边的 token;
  • 最后一层通过一个线性层 + Softmax 输出在整个词表上的概率分布,即“下一个 token 的分布”。

生成过程可以用几行伪代码概括:

tokens = [BOS]          # 开始符
for t in range(T_max):
    p = model(tokens)   # 得到当前步的下一个 token 概率分布
    x_next = sample(p)  # 采样或取最大概率的 token
    tokens.append(x_next)
    if x_next == EOS:   # 结束符:生成终止
        break

这里的 sample 可以是贪心(取最大概率)、带温度的采样、top-k / nucleus sampling 等,在 8 章讲到动作 token 生成时还会再次出现。自回归生成的特点是:一步一步往后写,前文一旦写出就不再修改

【图 4-2-1 插图占位:画出一个 Transformer Decoder,仅向左注意力的掩码示意,并标注从 “我 / 今天 / 去 / 了 / …” 逐步预测下一 token 的流程。】

对于具身智能,本章暂时先只把“自回归语言模型”当成一个可以自然生成序列的核心模块。在第 8 章你会看到,把“token”从纯文本扩展到视觉 token、动作 token后,同样的自回归结构就能统一生成“视觉–语言–动作”序列,为 VLA 打下统一建模的基础。


4.2.1.2 预训练目标

大语言模型的预训练阶段,本质上就是在海量文本上,把上面的分解式变成一个优化问题:

\[ \mathcal{L}_{\text{LM}}(\theta) = - \mathbb{E}_{x_{1:T} \sim D} \left[ \sum_{t=1}^{T} \log p_\theta(x_t \mid x_{<t}) \right] \]

也就是最小化所有 token 的交叉熵损失,最大化训练语料在模型下的对数似然。这里的语料库 \(\displaystyle D\) 通常包括互联网网页、书籍、论文、代码、对话等复杂混合数据。

几个关键点:

1.自监督(self-supervised) 每个序列本身就自带标签:前缀是输入,当前 token 是要预测的“标签”。不需要额外人工标注,这使得 LLM 可以利用极其巨大的无标注语料进行训练。 2.Teacher Forcing 训练方式 训练时第 \(\displaystyle t\) 步的条件 \(x_{<t}\) 是真实文本,而不是模型上一步生成的 token,这叫 teacher forcing。好处是梯度传播稳定、训练高效;代价是在推理时会出现所谓exposure bias(见 4.2.1.3)。 3.统一的预训练任务 不论是翻译、问答、代码补全还是推理题,在预训练阶段统统都被当成“补完一段文本”来处理:

  • 输入部分可以是“题目 + 提示”;
  • 输出部分是“答案 + 解释”;
  • 模型完全不知道“现在是在做什么任务”,它只是尽量把“后面的 token 写得像训练数据里的样子”。

大量理论与经验研究表明,单一的“下一个 token 预测”目标,已经足以让模型学会相当复杂的模式:包括上下文学习(in-context learning)、算术推理等。

从具身智能的角度,可以先把这一步理解为:在预训练阶段,我们只是教会模型**“读写符号序列”**,包括自然语言、代码、数学公式等,还没有加入任何机器人动作或传感信息。后续在第 8、9 章,会把这些新模态也统一成“token 序列”,继续用同一个目标进行训练或微调。


4.2.1.3 优点与局限

一、优点

(1)目标统一、实现简单 自回归 + 下一个 token 预测,为整个大模型生态提供了一个极其统一的训练目标:

  • 不需要为每个任务设计专门的损失函数;
  • 不需要显式区分“分类 / 回归 / 生成”;
  • 所有东西都变成“在某个上下文下继续写 token”。

(2)高效利用无标注数据 由于是自监督,可以拿几乎任何文本(甚至代码、公式、注释)去训练 LLM,极大提高了参数中的“世界知识密度”,也带来了预训练规模和能力随之扩展的Scaling Law现象:模型变大、数据变多、算力增大,性能往往按幂律提升,并出现新的能力。

(3)生成能力自然、可扩展到多模态 自回归模型本来就是生成模型,扩展到多模态时,只需把图像 patch、动作 token 等也视作序列中的元素,让模型继续“从左到右生成序列”即可。这种统一视角是 VLM / VLA 等方向的基础(见第 8 章)。

二、局限

(1)推理与训练目标的错位 预训练阶段只关心“像训练语料一样写下一个 token”,并不直接关心真伪、因果、价值观。如果训练语料里存在虚假或有害文本,模型也会学到相应模式。在开放式问答时,这直接表现为“看起来很真但其实瞎编”的幻觉(4.2.3、4.2.4 将展开)。

(2)Exposure Bias 与错误放大 训练时用真实历史 \(x_{<t}\),推理时用模型自己生成的历史。一旦前面几步略有偏差,后续条件分布就建立在“错误的历史”之上,错误可能迅速滚雪球。

(3)上下文有限与生成不可回头 自回归生成是单向、不可回退的:

  • 一旦生成了前面的 token,就很难整体重写全部回答;
  • Transformer 的注意力复杂度是 \(O(n^2)\),上下文长度有限,长推理链或长对话中的信息很容易被截断。

(4)对具身任务来说缺乏环境闭环 在机器人场景中,只靠“文本自回归”是远远不够的:

  • 现实世界状态随时间变化;
  • 机器人需要根据传感器反馈不断调整动作。 然而自回归语言模型本身只看到“历史 token 序列”,看不到真实物理状态。这就是为什么后文会引入指令微调、RLHF、工具调用、VLA 架构等机制,把“预测 token”这套能力嵌入到更大的闭环系统中。

4.2.2 指令微调与对话式模型

4.2.2.1 指令微调

预训练后的 LLM 更像一个“万能补全引擎”:写小说、续代码、模仿网页风格都没问题,但并不一定会乖乖按人类给出的“指令”办事。指令微调(Instruction Tuning)就是要把它从“自动补全器”变成一个“听得懂任务说明的助手”。

典型流程(以 InstructGPT 为例):

1.构造指令数据集 收集大量“指令–输入–输出”三元组,例如:

  • 指令:“请用一句话总结下列实验结果。”
  • 输入:一段论文中的实验部分;
  • 输出:简要总结。 这些样本覆盖分类、翻译、抽取、推理、代码等多种任务,并尽量使用自然语言描述,而不是硬编码任务 ID。 2.仍然使用下一个 token 预测作为目标 把“指令 + 输入 + 特殊分隔符”与“期望回答”拼接成一个长序列,继续用交叉熵最小化:

\[ \mathcal{L}_{\text{SFT}}(\theta) = - \sum_{t \in \text{answer}} \log p_\theta(x_t \mid x_{<t}) \]

这一步通常被称为SFT(Supervised Fine-Tuning),从行为上把模型“拉向”人类示范。 3.指令格式与元信息 工程上往往约定统一格式,例如:

### 指令:
解释下面这段代码的功能。

### 输入:
...

### 回答:

模型只在“回答”部分计算损失。对于具身任务,这里的“输入”可以扩展为文字描述场景、传感信息摘要等。

指令微调的本质,是把“任务是什么”也用自然语言编码进输入,让同一个预训练模型,在见到不同指令时自动切换行为。对 VLA 而言,“把红色方块放进蓝色盒子”也只是另一种指令,后续我们会让模型学会把这种指令翻译成动作序列。


4.2.2.2 ChatGPT 风格的对话模型

在指令微调的基础上,再进一步引入多轮对话数据,就得到 ChatGPT 这类对话式模型。典型训练样本不再是单轮的 “指令–回答”,而是一整段带角色的对话:

[system] 你是一个乐于助人的机器人助手。
[user]   我想学一下强化学习,需要什么基础?
[assistant] 你可以从概率论、线性代数和优化方法开始...
[user]   那和监督学习的主要区别是?
[assistant] ...

训练方式仍然是自回归下一个 token 预测:把整段对话视作一个长序列,只对 assistant 角色的 token 计算损失。通过大量此类数据,模型逐渐学会:

  • 如何在对话中保持礼貌、连贯;
  • 如何利用历史轮次补全省略信息(如“那这个算法呢?”中的“这个”指代前文);
  • 如何遵守 system 角色设定(例如保持某种语气、遵守安全规范)。

在机器人场景下,ChatGPT 风格的模型承担的是人类接口角色:

  • 用户用自然语言表达需求、偏好和约束;
  • 对话模型负责解释、澄清、分解任务;
  • 后端再把相对明确的“子任务描述”交给 VLA 或传统规划器去执行(见第 8、10 章)。

【图 4-2-2 插图占位:对话式模型的输入输出示意图,展示 system / user / assistant 三类 role 如何拼接成一个统一的 token 序列。】


4.2.2.3 对话管理

传统任务型对话系统一般分成四个模块:

  1. 语义理解(NLU):把用户话语解析成槽位、意图;
  2. 对话状态跟踪(DST):维护“当前任务进展到哪一步”;
  3. 策略(Policy):根据状态选择下一步系统动作;
  4. 自然语言生成(NLG):把动作转成回复句子。

大语言模型出现后,很多系统把这四步合并到一个 LLM 里,让它直接“端到端生成回复”。但在工程实践,尤其是具身机器人领域,完全端到端的对话管理仍然不够安全与可靠,通常会采用“LLM + 外部对话管理器”的混合方案。

可以粗略分成三个层次:

+纯生成式对话管理 全部状态都以文本形式隐含在对话历史中,由 LLM 自行“脑补”。优点是简单;缺点是难以强约束、安全性难保证。 +结构化状态 + LLM 把关键信息(当前任务、机器人位置、是否抓到物体等)维护在结构化的“世界状态”中,让 LLM 只做两件事: 1)理解用户意图并转换为结构化指令(如调用 API pick(object=red_block)); 2)在需要时给出自然语言说明。 这类似 Chapter 10 所说的“VLA 与传统规划模块共存”。 +LLM 作为高层“对话策略模块” 高层由 LLM 决定“应该和用户说/问什么”“需要调用哪个工具或子系统”;低层对话轮次管理、日志记录、安全过滤则由传统对话管理框架负责。

对机器人而言,对话管理还有一个核心要求:把“语言状态”与“物理状态”对齐。例如用户说“再往左一点”,系统需要结合当前相机画面、机器人位姿来解释这个“左”。这要求对话管理器必须同时读懂对话历史和环境状态,而不能只靠语言模型单方面推理;这一点会在第 4.4、10.1 节继续展开。


4.2.3 RLHF(人类反馈强化学习)的动机与基本流程

4.2.3.1 模型幻觉与价值不对齐问题

从前两小节可以看到:

  • 预训练 + 指令微调的模型已经很会“说话”;
  • 但它的优化目标依然是“写出高似然的下一个 token”。

结果就是:

1.幻觉(Hallucination) LLM 会产生看起来流畅、逻辑通顺但事实错误的内容,例如捏造不存在的论文、凭空编造 API 接口等。多篇综述将这种现象统称为“幻觉”,强调其在开放式问答、信息检索等场景中的严重性。近期研究指出,当前评测指标往往鼓励“宁可乱猜也不要说不知道”,这进一步放大了幻觉:模型会被奖励为“好考生”,而不是“诚实的助手”。 2.价值观与安全的不对齐 预训练语料包含大量有毒言论、偏见、甚至危险做法。仅靠指令微调,很难保证模型在所有场景下都避免攻击性语言、尊重隐私、避免提供危险操作建议。InstructGPT 的工作系统地展示了:仅放大模型规模,不能自动解决“对齐(alignment)”问题。

在纯文本助手里,幻觉“顶多说错话”;而在具身机器人中,如果把 LLM 输出直接映射成实际动作,错误决策可能导致设备损坏甚至安全事故。这就是引入 RLHF 的直接动机:

  • 不再只看“预测下一个 token 的概率”;
  • 而是让人类对模型行为进行打分或排序,用强化学习把这些偏好编码进策略中,使之更“有用、无害、诚实”。

4.2.3.2 人类反馈数据

RLHF 一般包含两类核心人类数据(在 InstructGPT 与后续工作中已形成“标准三部曲”):

1.示范数据(Demonstrations)——监督微调阶段 标注者看到一个 prompt(例如用户问题),直接写出一份他们认为“理想的回答”。这些数据用于 SFT 阶段,把模型从纯 LM 拉到“基本像个助手”的水平。 2.偏好数据(Preference Data)——奖励模型阶段 给定同一个 prompt 和多条候选回答(通常来自 SFT 模型采样),标注者只需在其中排序或选择更喜欢的一条

训练一个奖励模型\(r_\phi(x, y)\),目标是让其在“好回答”上给出的分数高于“差回答”。典型的损失函数为成对逻辑回归:

\[ \mathcal{L}_{\text{RM}}(\phi) = - \mathbb{E}_{(x, y_w, y_l)} \left[ \log \sigma\big(r_\phi(x, y_w) - r_\phi(x, y_l)\big) \right] \]

使得 \(r_\phi\) 近似“人类偏好函数”。

  • 相比绝对打分,成对比较更稳定、简单;
  • 采集到的样本形如 \((x, y_{\text{good}}, y_{\text{bad}})\)。

除了文本助手,类似的人类偏好也可以施加在机器人轨迹上:例如给两段示教视频打分“哪种抓取更稳定、更安全”。这与 5.3 节的“奖励学习”“逆强化学习”在思想上是一致的,只是对象从“物理轨迹”变成了“文本回答”。


4.2.3.3 强化学习微调

在拿到 SFT 模型和奖励模型后,RLHF 的第三步才是真正的“强化学习”:用奖励模型指导策略(LLM)更新

典型做法(以 PPO 为例)可简化为:

1.策略初始化 把指令微调后的模型记为 \(\pi_{\text{SFT}}\)。以其为起点初始化 RL 策略 \(\pi_\theta\),这样一开始行为就已经“像个人”。 2.生成数据并打分 从真实或合成的 prompt 分布 \(x \sim D\) 采样,令策略生成回答 \(y \sim \pi_\theta(\cdot \mid x)\)。

  • 用奖励模型计算分数 \(r_\phi(x, y)\);
  • 同时加入一个 KL 惩罚项,限制策略不要偏离初始的 \(\pi_{\text{SFT}}\)。 3.优化目标 我们希望最大化期望奖励,同时保持与 SFT 模型接近,可以写成:

\[ \max_\theta \ \mathbb{E}_{x, y \sim \pi_\theta} \big[ r_\phi(x, y) - \beta , \mathrm{KL}(\pi_\theta(\cdot|x)\Vert \pi_{\text{SFT}}(\cdot|x)) \big] \]

其中 \(\beta\) 控制“听奖励模型”和“别离谱乱跑”之间的平衡。实际实现中使用 PPO 这样的Actor–Critic 算法,以保证更新稳定(这与第 5 章中的 RL 算法是一脉相承的)。 4.得到 RLHF 模型 经过多轮迭代,我们得到一个既继承预训练知识、又更符合人类偏好的新策略。InstructGPT 结果显示,1.3B 参数的 RLHF 模型,在人工偏好评估中甚至可以优于 175B 的原始 GPT-3,可见“对齐”有时比“变大”更重要。

【图 4-2-3 插图占位:RLHF 三阶段流水线示意图——左侧是 SFT,中央是“人类偏好数据 + 奖励模型”,右侧是 PPO 微调策略的循环。】

在具身智能语境下,可以类比地考虑:

  • 策略 \(\pi_\theta\) 不再输出文本,而是输出动作 token 序列;
  • 奖励模型可以基于人类对轨迹视频的偏好训练;
  • PPO 之类的 RL 算法同样适用。 不过机器人 RLHF 还需要解决安全约束、样本效率等额外问题,这会在第 5 章和第 9 章进一步探讨。

4.2.4 LLM 的推理能力与局限性

4.2.4.1 涌现的推理能力

一个看似“魔法”的现象是:随着参数量、数据量和训练算力的扩大,LLM 会突然表现出一些在小模型中不存在的能力,例如多步算术推理、链式思维(Chain-of-Thought)推理、复杂代码生成等。Wei 等人将这种现象命名为“涌现能力(emergent abilities)”并进行了系统量化。

典型观察包括:

  • 在模型规模较小时,某些任务(如多步骤算术、逻辑组合题)准确率接近随机;
  • 当参数量跨过某个阈值后,性能会突然出现“跳变”;
  • 一些研究从理论上分析了:单一的下一个 token 预测任务,就足以让模型在上下文中学会“隐式拟合任务”和“算法样式”,从而表现出 in-context learning、算术等能力。

更直观地说,大模型在学习如何“最合理地接龙”时,被迫压缩了大量统计结构和模式,包括:

  • 语法、语义模式;
  • 论证结构(先提出假设,再论证,再得结论);
  • 问题–解题步骤–答案的模板。

当我们用“逐步思考一下再回答”的提示(Chain-of-Thought prompting)时,其实是在要求模型显式展开它在内部已经学到的“解题模板”。这并不等价于人类的逻辑推理,但在很多任务上效果非常接近。

【图 4-2-4 插图占位:横轴为模型规模(log 尺度),纵轴为某推理任务准确率,画出一条在某点附近出现明显“弯折”的曲线,用以说明涌现能力。】

对具身智能来说,这种涌现能力的意义在于:

  • 可以把高层任务分解、策略规划、条件判断等“符号逻辑味很重”的部分交给 LLM;
  • 再由 VLA 或传统控制模块负责把这些高层步骤“编译”成具体的物理动作。 换句话说,LLM 更适合担当文本世界里的“策士”,而不是直接作为底层执行器。

4.2.4.2 知识局限

尽管 LLM 参数中“存了大量知识”,但它的知识能力有几个根本限制:

1.静态知识:有时间截止 预训练数据是在某个时间点之前采集的,之后发生的事件、发布的论文、新的 API 等,模型天然不知道。要获取最新知识,必须连接检索或工具。 2.不完整且有偏 即便在截止时间之前,训练语料也不可能覆盖世界的全部事实,而且采集自互联网势必带来地域、语言、阶层等偏差。这些偏差会被模型放大乃至固化。 3.“记住在参数里”并不等于“随时取得出” 即使某个事实确实出现在训练文本中,模型也可能因为 prompt 的写法不同、上下文干扰等原因而给出错误答案。这和人类“记得学过,但一时想不起来”有点类似,但机制完全不同。

一种主流缓解方式是检索增强生成(Retrieval-Augmented Generation, RAG):在推理时先从外部知识库(如 Wikipedia 或公司内网文档)检索相关文段,再把检索结果和用户问题一起喂给 LLM,让它在“外部记忆 + 内部参数”的联合信息上生成答案。RAG 已被证明能显著提高知识密集型任务的准确度和可追溯性。

另一个方向是工具增强(tool-augmented)语言模型:让 LLM 学会在需要时调用外部计算器、搜索引擎、数据库查询、代码执行环境等,从而把自己从“单机离线模型”升级为“会使用工具的代理(agent)”。系统性综述表明,这类架构在复杂推理、数值计算、领域专用知识等任务中有显著优势。

对于机器人而言,这种“外部知识源”更加重要:

  • 参数里的知识可以告诉机器人“如何一般性地折叠衣服”;
  • 但只有外部传感(相机、力觉)和专用地图/数据库,才能告诉它“这件衣服到底在哪、当前皱成什么样”。 因此,在具身系统中,LLM 的知识局限应该通过环境感知 + 检索 + 专用知识库来弥补,而不能被当成“世界真相的唯一来源”。

4.2.4.3 错觉与事实性问题

“幻觉”一词在本书中已经多次出现,这里做一个更系统的整理。大部分研究把 LLM 幻觉定义为:输出内容在形式上流畅自然,但在事实、逻辑或与上下文一致性上存在错误或捏造

常见类型可以粗略分为:

+上下文外幻觉(extrinsic):回答与外部真实世界矛盾,例如捏造不存在的论文、引用虚假的法律条款; +上下文内幻觉(intrinsic):回答与输入上下文自身矛盾或逻辑不一致,例如前面说“这是一个 3×3 矩阵”,后面却把它当成 2×2 处理。

造成幻觉的根本原因有:

1.目标函数不追求“真”,只追求“像” 下一个 token 预测 + RLHF(以人类偏好为导向),本质上都鼓励模型产生“看起来像好答案的文本”。只要在训练/偏好数据中,高分回答往往是“自信作答”而不是“诚实地说不知道”,模型就会更倾向于猜测而不是拒答。 2.训练数据本身包含错误与噪声 互联网文本并不总是可靠,模型可能正确学习到“错误的事实”。 3.生成算法放大高概率但错误的“故事” 为了提高可读性,我们常用温度调节、top-k / nucleus sampling 等采样策略;这些策略会倾向抽取“概率较高的 token”,一旦模型的内部分布略有偏差,就可能生成一条表面极其合理的错误叙事。

在工程上,人们提出了多种缓解方案:

+RAG 与知识库 grounding:在回答前强制检索权威数据源,让模型“围绕检索结果说话”; +自一致性与多次采样交叉验证:对同一问题生成多份答案,相互比对,选取一致性更高的一份; +显式不确定性表达:修改训练与评价指标,鼓励模型在不确定时说“我不知道”而不是乱猜; +外部验证器:用小模型或规则系统对 LLM 输出进行事实核查,例如验证引用是否真实存在。

尽管如此,当前共识仍然是:幻觉无法被完全消除,只能被压低到某个可接受水平。这在纯文本助手里已经是一个严重问题,在具身机器人系统中更是安全关键:

  • 如果 LLM 错把“有水的杯子”当成空杯子去翻转倒置,后果就是一桌水;
  • 如果 LLM 误判危险区域、忽略用户设定的安全约束,会直接演化为物理世界的事故。

因此,在本书后续关于 VLA 系统部署与安全性(第 10.3 节)中,我们会坚持一个原则:

不要把 LLM 的输出当成“事实”,而应当当成“需要验证与约束的建议”

在机器人具身智能的发展路线中,大语言模型提供了强大的知识与推理接口,但它必须始终处在传感–规划–控制这一闭环架构之中,被感知模块、控制约束和人类监督共同“托举”,才能真正安全、可靠地发挥价值。

本章小结与自测

三行小结

  1. 本章说明语言如何参与机器人任务表达与约束。
  2. 重点是语义条件化,而不是只做文本生成。
  3. 学完后应能设计语言到控制约束的映射接口。

检查题

  1. 用你自己的话总结本章最核心的一个公式/机制。
  2. 给出一个“如果要落地到项目里,你会怎么用”的具体例子。

常见误区

  1. 把语言当装饰输入,不做约束落地。
  2. 忽略指令歧义与失败反馈。
  3. 缺少安全规则优先级设计。

公式到代码(最小示例)

instruction = "pick the red cup"
keywords = [w for w in instruction.split() if w not in {"the"}]
constraints = {"forbid": ["spill"], "speed": "low"}
print(keywords, constraints)

本章外部参考(集中)

  1. 本章暂无外部链接,建议优先完成本章自测与代码实践。

4.3 视觉–语言对齐与多模态模型

4.3.1 图文对比学习(CLIP 思路)

学习导航

  • 本章主题:4.3.1 图文对比学习(CLIP 思路)
  • 前置知识:建议具备第 2 章 Transformer 基础。
  • 建议用时:73-93 分钟
  • 阅读顺序:先看概念框架,再看公式/代码,最后做自测。

这一小节的核心,是回答一个问题:**怎样让“看图的网络”和“读字的网络”学会在同一个语义空间里对齐?**CLIP 是目前最经典、也最具工程价值的方案之一。


4.3.1.1 CLIP 模型

(1)整体思想:从“标签分类”到“自然语言监督” 传统视觉模型用“狗 / 猫 / 车”这类固定标签做监督;CLIP(Contrastive Language–Image Pretraining)反其道而行:

  • 不再依赖人工标注的有限类别,而是使用海量互联网图像及其自然语言描述(标题、alt 文本等)作为监督信号。
  • 模型的任务不是“这张图是第几类”,而是“在一堆文本说明里,哪一句最有可能描述这张图?”——这是一个图文对齐问题

(2)模型结构:双编码器 + 共享嵌入空间 CLIP 采用一个图像编码器和一个文本编码器,两者结构可以各自选择合适的 backbone:

+图像编码器(Image Encoder)

  • 典型选择:ResNet 系列或 ViT(Vision Transformer)。
  • 输入图像 → 一系列卷积 / Transformer 层 → 得到一个全局图像向量(通过全局池化或 [CLS] token)。 +文本编码器(Text Encoder)
  • 采用 Transformer 结构(与 2.4 节介绍的类似),先做子词分词(如 BPE),再输入到多层 self-attention 中。
  • 使用句子末尾的特殊 token(如 [EOS])的隐藏状态作为整段文本的向量表示。 +投影与归一化
  • 两个编码器最后都接一个线性投影层,将图像和文本映射到同一维度的向量空间(例如 512 维)。
  • 对向量做 L2 归一化,用余弦相似度衡量图文之间的语义相似。

【图 4.3-1 占位:CLIP 结构示意图——左边是图像编码器(ResNet/ViT),右边是文本编码器(Transformer),二者输出向量被映射到同一嵌入空间,中间通过相似度矩阵和对比损失训练。】

(3)零样本分类与“提示工程” 预训练完成后,CLIP 不需要再单独训练分类头,就能做零样本图像分类

  • 给定一个分类任务(如 ImageNet 的 1000 类),先为每个类别写一句自然语言提示,例如“a photo of a dog”,“a photo of a cat”。
  • 用文本编码器编码这些类别描述;用图像编码器编码一张测试图像。
  • 比较图像向量与每个类别文本向量的相似度,选相似度最大的类别作为预测。

从机器人角度看,这等价于让机器人用“语言标签”来理解视觉概念:后续在 VLA 模型中,可以通过调整文本提示来改变机器人对环境的“分类方式”,而不必重新训练整个视觉网络。


4.3.1.2 图文对齐训练

(1)对比学习直觉:拉近正样本、推远负样本 对比学习(contrastive learning)的核心思想很简单:

  • 对于一对真实匹配的图像–文本(I, T),希望它们在嵌入空间的距离尽可能近;
  • 对于不匹配的图像–文本对,则希望距离尽可能远。

在 CLIP 中,“负样本”来自同一个 mini-batch 内的其它图文对,无需额外标注,这使得训练可以扩展到数亿规模的图文对。

(2)InfoNCE / 对比损失形式 设一个 batch 内有 \(\displaystyle N\) 对图文样本 \(\displaystyle (I_i, T_i)\),记图像 / 文本编码器输出的向量为 \(\mathbf{v}_i, \mathbf{u}_i\),相似度 \(s_{ij} = \cos(\mathbf{v}_i, \mathbf{u}_j)\)。

+图像→文本方向的对比损失(每张图必须“认出”自己的文本):

\[ L_{\text{img}} = -\frac{1}{N}\sum_{i=1}^{N} \log \frac{\exp(s_{ii}/\tau)}{\sum_{j=1}^{N}\exp(s_{ij}/\tau)} \]

+文本→图像方向的对比损失(每段文本也必须“认出”自己的图像):

\[ L_{\text{text}} = -\frac{1}{N}\sum_{i=1}^{N} \log \frac{\exp(s_{ii}/\tau)}{\sum_{k=1}^{N}\exp(s_{ki}/\tau)} \]

  • 总损失 \(L = \frac{1}{2}(L_{\text{img}} + L_{\text{text}})\),其中 \(\tau\) 为温度参数,控制相似度分布的“尖锐程度”。

解释成自然语言就是:每张图要在所有文本中找到“唯一正确的一句”,每段文本也要在所有图中找到“唯一对应的一张”,并且错配要被严重惩罚。

(3)负样本规模与变体

  • batch 越大,“负样本”越多,对比学习效果越好,因此 CLIP 采用大 batch 训练。
  • 后续工作在 CLIP 基础上加入检索增强局部区域–文本对齐,提升精细对齐能力,例如 RA-CLIP 引入在线检索增强特征,CLOC 通过 region-text 对比改善定位能力等。

对机器人而言,精细的区域–文本对齐可以帮助模型区分“桌子上的红杯子”和“地板上的红杯子”,为精准操作打基础。


4.3.1.3 用途

CLIP 训练出的图文对齐表征,已经成为多模态世界的“通用货币”,下游可以有多种使用方式:

(1)零样本 / 少样本视觉识别

  • 通过不同文本提示,实现开放类别分类,例如“一个工业机械臂”“一个吸尘机器人”“一个桌面场景”等。
  • 在机器人应用中,可用自然语言直接定义新类别,而不必收集专门数据集重新训练分类器。

(2)跨模态检索与语义搜索

  • 以图找文:给一个场景图片,检索最匹配的文本描述或说明文档;
  • 以文找图:给一句指令或描述,检索相应的图像 / 视频片段,例如“人把杯子放进微波炉”的示范视频。 这类检索能力为后续“从视频库中检索相似示教轨迹供机器人模仿”提供了基础。

(3)作为下游模型的“语义模块”

  • 文本到图像生成模型中,CLIP 可以作为评估器 / 奖励模型,引导生成结果与文本更匹配。
  • 在大规模 VLM/VLA 中,CLIP 式图文对齐常被用作预训练第一阶段,为后续更复杂的多模态推理打基础。

(4)对机器人具身智能的意义

  • 将“看到的像素”映射到与“语言”共享的语义空间,是让机器人理解人类指令和环境语义的第一步。
  • 只要图像与语言在表征空间中可计算相似度,后面就可以自然地加入“动作”这一模态,形成视觉–语言–动作一体的 VLA 模型(第 8 章会展开)。

4.3.2 图文检索、VQA、图像字幕等任务

在具身智能之前,视觉–语言模型最典型的评测任务主要是三类:图文检索、视觉问答(VQA)、图像描述(Image Captioning)。它们覆盖了“检索、理解、生成”三种能力维度,也会在机器人场景中以各种形式出现。

【图 4.3-2 占位:多模态任务一览图——上:以文找图 / 以图找文;中:VQA(图像 + 问题 → 文本答案);下:Image Captioning(图像 → 描述句子)。】


4.3.2.1 图文检索

(1)任务定义 图文检索(Image–Text Retrieval)包含两个方向:

+文本检索图像(Text→Image):给定一句文本描述,检索与之最匹配的图像(例如在图库中找到“机器人把碗放进柜子”的画面)。 +图像检索文本(Image→Text):给定一张图像,在文本库中找出最相关的说明文、操作步骤等。

在机器人系统中,这可以被用来从大规模操作视频 / 示教库中检索相似场景与动作脚本

(2)实现路径:双编码器 + 相似度搜索

  • 使用类似 CLIP 的双编码器结构,将所有图像和文本编码为向量,并归一化。
  • 检索时,仅需计算查询向量与数据库向量的余弦相似度,使用向量检索库(如 FAISS)实现高效近邻搜索。
  • 对需要更精细语义匹配的场景,可先用双编码器快速召回,再用单流或交叉注意力模型重排序(re-ranking)。

(3)评价指标与数据集

  • 常用指标:Recall@K(R@1/5/10)、mAP 等,与第 3 章目标检测指标类似但针对检索任务。
  • 典型数据集:MS-COCO、Flickr30k 等,提供图像和多句描述,用于训练和评测检索能力。

4.3.2.2 VQA(视觉问答)

(1)任务定义与特点 视觉问答(Visual Question Answering, VQA)指:给定一张图像和一个自然语言问题,让模型输出一个自然语言答案。

  • 问题可以是事实类:“桌子上有几个杯子?”
  • 也可以是关系类:“红色杯子在碗的左边还是右边?”
  • 甚至是知识类:“这个工具通常用来做什么?”(需要结合外部世界知识,OK-VQA 等数据集便属于此类)。

(2)模型结构 典型 VQA 模型包含三部分:

1.视觉编码:用 CNN/ViT 把图像编码成特征图或对象级特征(如检测框 + ROI 特征)。 2.语言编码:用 RNN/Transformer 编码问题文本。 3.多模态融合与回答解码

  • 早期做法:把图像向量和问题向量简单拼接,然后用 MLP 分类固定答案集合。
  • 现代做法:使用单流或带 cross-attention 的 Transformer,在 token 层进行细粒度对齐,最后输出答案 token(可以是分类,也可以自由生成)。

(3)与机器人场景的联系 在具身机器人中,VQA 形式的能力可以用来:

  • 状态查询:例如“抽屉现在是开着的还是关着的?”、“桌上还有脏碗吗?”
  • 诊断与解释:机器人执行前,先问自己“目标物体是否可见?”、“是否存在障碍物挡住路径?”让高层策略更稳健。

后续在 VLA 章节,可以把 VQA 视为“对当前视觉观测的语言推理子模块”。


4.3.2.3 图像描述(Image Captioning)

(1)任务定义 图像描述(Image Captioning)要求模型根据输入图像生成一段自然语言描述,既要覆盖主要物体,也要体现关系和场景语义。

  • 简单描述: “一个机器人站在桌旁。”
  • 更丰富的描述: “一台白色机械臂正从桌上的蓝色盒子里取出一只杯子。”

(2)典型架构:编码器–解码器

1.编码器(视觉):CNN 或 ViT,将图像映射为特征向量或特征序列。 2.解码器(语言):RNN 或 Transformer,自回归地逐词生成描述文本。 3.训练目标

  • 主流是序列交叉熵损失(teacher forcing,下一个词预测)。
  • 有时还会结合 RL 方法,直接优化 BLEU、CIDEr 等评价指标。

新近工作还提出“全景式描述(Panoptic Captioning)”,试图用一段文本尽可能完整覆盖图中所有物体、关系和属性,使图像与文本更接近“信息等价”。

(3)在机器人中的作用

+环境汇报 / 日志生成:机器人可以用自然语言描述当前看到的场景,为人类提供可读日志,例如“我已经把三个碗放进洗碗机,还剩一个在桌角”。 +辅助 VQA 与规划:先将图像转为文字摘要,再交给强大的文本 LLM 做复杂逻辑推理(这种“先描述再推理”的方案在 OK-VQA 等任务中表现良好)。

【图 4.3-3 占位:图像描述架构示意图——左侧图像编码器输出特征,右侧语言解码器按时间步生成描述 token。】


4.3.3 视觉–语言大模型(VLM)的结构(联合 / 解耦)

视觉–语言模型(Vision-Language Model, VLM)指能同时理解图像和文本、并在两者之间建立语义联系的模型。它们是后续 VLA(视觉–语言–动作)模型的直接前身。

从结构上看,主流可以概括为两大类:

+双流结构(解耦):视觉与语言各自编码,后期再融合; +单流结构(联合):视觉 token 与文本 token 放在一个 Transformer 里统一处理。


4.3.3.1 双流结构(解耦)

(1)基本思路 双流结构通常包含:

  • 一个视觉编码器(ResNet/ViT 等),输出图像特征向量或 patch 序列;
  • 一个文本编码器(BERT/Transformer 等),输出文本向量或 token 序列;
  • 在高层通过相似度(CLIP)、简单拼接或少量 cross-attention 层进行融合。

CLIP、ALIGN 等大规模图文对比预训练模型可视为典型的双编码器式 VLM

(2)优点

+可充分复用单模态预训练模型:直接加载已有的视觉 backbone 与语言模型权重,只在顶部做少量适配。 +检索效率极高:图像和文本可以分别预计算向量,在线检索只需做向量相似度计算,非常适合大规模检索场景。 +工程部署友好:视觉编码可放在机器人的本地板卡上,文本编码可以在云端共享,一个视觉特征可以支持多种语言任务。

(3)局限性

  • 视觉和语言交互较“浅”,主要靠全局向量相似度,难以精细理解局部关系(例如“左边第二个红杯子”)。
  • 做复杂推理(如长文本问答、推断隐含关系)时,往往需要再叠加更复杂的 Cross-Attention 或 LLM 模块。

从具身智能视角看,双流结构很适合做通用感知模块:先把图像转为语义向量,再交给高层语言 / 决策模块处理。


4.3.3.2 单流结构(联合)

(1)基本思路:统一 Transformer 单流结构假设视觉和语言之间的关系足够复杂,需要在 token 级别完全交织,因此:

  • 将图像切成 patch(或用检测器抽取对象特征),把每个 patch 映射为“视觉 token”;
  • 将文本子词映射为“语言 token”;
  • 把两类 token 串接在一起,加入位置编码与模态编码,一并输入单个多层 Transformer,通过自注意力实现全局交互。

典型单流模型包括 VisualBERT、VL-BERT、UNITER 等。

(2)优点

  • 能在 token 级别学习复杂的跨模态对齐,例如“哪一块图像区域对应文本中的某个词”。
  • 非常适合VQA、图文推理、细粒度多模态理解等任务。
  • 也便于在同一结构中同时加入多种预训练目标(ITC、ITM、MLM、Captioning 等)。

(3)局限性

  • 计算成本较高,无法像双编码器那样方便地离线预计算表示。
  • 图像和文本必须一起送进模型,在线推理时的延迟和显存占用更大,这对实时机器人控制是一个压力。

近年来的大型视觉–语言大模型(例如 BLIP 系列、部分 LVLM)一般在双流与单流之间采用分阶段或混合结构:先用双流对齐,再用单流精细融合。


4.3.3.3 模型选择

在实际系统中选择哪种结构,取决于任务类型与资源约束,可以从以下维度考虑:

(1)任务类型

  • 若以检索 / 开放词汇识别为主(例如为机器人查找相关示教视频、做开放类别物体识别),双编码器 + 对比学习往往足够,且高效。
  • 若需要复杂的图文推理、细粒度问答(如长文本指令 + 场景理解),则单流或带 cross-attention 的联合结构更合适。

(2)计算与部署

  • 资源受限的嵌入式机器人平台上,更倾向采用参数较小的双流结构,将重计算(如大语言模型)放在云端。
  • 在离线训练或服务器环境中,可以使用单流结构做重型训练,然后利用蒸馏等手段(见第 10.4 节)将其压缩。

(3)与后续动作决策模块的接口

  • 如果后续 VLA 模型只需要一个紧凑的状态向量(例如“场景的语义 embedding”),双流结构自然输出这种向量。
  • 如果希望在生成动作时直接访问图像 token 与语言 token 的细粒度交互信息,单流或混合结构更有优势。

【图 4.3-4 占位:VLM 结构比较图——左:双流(独立图像/文本编码器,顶部用相似度或简易融合);右:单流(统一 Transformer 处理图像 token + 文本 token)。】


4.3.4 多模态预训练目标设计(对比、匹配、生成)

从优化目标的角度,看待视觉–语言预训练会更清晰:多数 VLM 都是**对比(contrastive)+ 匹配(matching)+ 生成(generative)**三类目标的组合,只是侧重点不同。


4.3.4.1 对比目标

(1)全局图文对比(Image–Text Contrastive, ITC)

  • 典型代表就是 CLIP 的 InfoNCE 损失(见 4.3.1.2),目标是让全局图像向量与其对应的全局文本向量在嵌入空间中靠近,对其他样本远离。
  • 适合训练可迁移的全局语义表示,对检索和零样本分类非常有效。

(2)局部对比与细粒度对齐 为支持更细粒度任务(如区域级定位),一些工作将对比目标拓展到:

  • 区域–短语对比:例如让“the red cup on the right”对应图像中的某个局部区域。
  • token–token 对比:在视觉 token 与文本 token 之间建立一对一或一对多的对齐。

这种细粒度对齐对机器人抓取与操作特别重要,因为许多指令会涉及空间关系和对象局部(“把杯子把手朝上”)。


4.3.4.2 匹配目标

(1)图文匹配(Image–Text Matching, ITM) ITM 通常被定义为一个二分类任务:给定一对图像–文本,预测它们是“匹配”还是“不匹配”。

  • 正样本:真实图像及其描述。
  • 负样本:随机替换文本或图像得到的错配对,或使用难例挖掘选择“看起来很像但不对的描述”。

与对比学习相比,ITM 常在联合 Transformer上进行(例如 UNITER、BLIP 中的多模态编码器),要求模型通过 cross-attention 精细判断图文是否一致。

(2)Token 级 / 实例级匹配 更进一步的工作如 VL-Match,将匹配目标细化到 token 或实例级:

  • Token-level Matching:预测每个文本 token 是否在图像中有对应视觉证据。
  • Instance-level Matching:对于图像中的每个物体,判断是否在文本中被提及。

这类目标能显著增强模型对“描述是否完整 / 是否遗漏关键物体”的判断能力,对于机器人执行安全相关指令(如“不要碰桌子右边的玻璃杯”)尤其重要。


4.3.4.3 生成目标

(1)图像条件下的语言生成(Captioning / MLM) 生成目标让模型在图像条件下学会“说话”,常见形式包括:

+图像描述生成:给定图像,生成完整描述句子(Image Captioning),损失多为自回归的交叉熵。 +条件掩码语言建模(Conditional MLM):在给定图像和文本上下文的条件下,随机 mask 掉部分词,要求模型重建这些词。 +语言模型式预训练:把图像特征作为“前缀”输入语言模型,使其在多模态提示下完成填空或续写。

BLIP 等模型会同时使用 ITC、ITM 和 Captioning 三种目标,使得模型既能对比对齐,又能判别匹配,还能自然生成描述文本。

(2)重建与世界建模 在更广义的生成目标中,还包括:

+掩码图像建模(MIM):随机遮挡图像部分区域,让模型根据未遮挡区域和文本恢复像素或特征(例如 MAE 类方法的多模态版本)。 +视频 / 未来帧预测:给定当前图像与文本,预测下一帧或未来的视觉变化,为未来的世界模型(第 12 章)打基础。

(3)对具身智能的启示 对于机器人 VLA 模型,生成目标有两个重要作用:

  • 让模型具备用语言解释自己所见所为的能力,这直接对应 4.4 节中“语言作为解释接口”的需求。
  • 生成式训练与大语言模型的预训练目标兼容,便于将视觉–语言模型进一步扩展为视觉–语言–动作模型,通过“在统一序列上生成 token”的方式一起预测文本和动作。

【图 4.3-5 占位:多任务预训练示意图——同一 VLM 同时优化三种损失:ITC(对比)、ITM(匹配)、Caption(生成),三者用不同颜色标注在同一结构上。】


本节从 CLIP 式图文对比学习出发,介绍了多种视觉–语言任务形式、VLM 的结构设计,以及对比 / 匹配 / 生成三类预训练目标。后续章节将在此基础上进一步引入“动作”这一模态,展示如何把这些视觉–语言能力自然扩展为机器人可以执行的视觉–语言–动作策略。

本章小结与自测

三行小结

  1. 本章说明语言如何参与机器人任务表达与约束。
  2. 重点是语义条件化,而不是只做文本生成。
  3. 学完后应能设计语言到控制约束的映射接口。

检查题

  1. 用你自己的话总结本章最核心的一个公式/机制。
  2. 给出一个“如果要落地到项目里,你会怎么用”的具体例子。

常见误区

  1. 把语言当装饰输入,不做约束落地。
  2. 忽略指令歧义与失败反馈。
  3. 缺少安全规则优先级设计。

公式到代码(最小示例)

instruction = "pick the red cup"
keywords = [w for w in instruction.split() if w not in {"the"}]
constraints = {"forbid": ["spill"], "speed": "low"}
print(keywords, constraints)

本章外部参考(集中)

  1. 本章暂无外部链接,建议优先完成本章自测与代码实践。

4.4 语言在机器人中的角色

4.4 语言在机器人中的角色(本节综述)

学习导航

  • 本章主题:4.4 语言在机器人中的角色(本节综述)
  • 前置知识:建议具备第 2 章 Transformer 基础。
  • 建议用时:93-113 分钟
  • 阅读顺序:先看概念框架,再看公式/代码,最后做自测。

关键图示:语言条件化控制

关键图示:语言条件化控制

在具身智能中,“语言”不再只是聊天工具,而是贯穿任务描述、约束与安全、行为解释、规划分解的统一接口。 本节重点讨论:当机器人已经具备视觉与控制能力之后,如何把“人话”稳健地接到“机器动作”上,并反过来用语言让机器人更可控、更安全、更可理解。


4.4.1 语言作为任务描述(goal specification)

4.4.1.1 自然语言指令

在人机协作场景中,最自然的任务接口就是一句话:

“把桌上的红色杯子放进水槽左边的碗里。”

对人类来说,这是一句再日常不过的句子,对机器人来说,这其实隐含了多个层次的信息:

  • 任务意图:搬运(pick-and-place)
  • 目标物体:红色杯子
  • 目标位置:水槽左边的碗
  • 关系约束:从桌子上拿起,再放入碗中
  • 隐含常识:不要打碎杯子,要先清空路径、避免撞到人等

典型的自然语言任务接口一般包含以下处理链路:

1.语言输入

  • 文本指令(键盘、APP、手机端)
  • 语音指令 + 语音识别(ASR)转成文本 2.语义解析 / LLM 理解
  • 使用大语言模型或专门的语义解析器,将指令转为结构化表示,例如:
action: place
object: cup(color=red, category=“mug”)
target: bowl(location=left_of(sink))
constraints: gentle, avoid_spill
  • 现代系统常利用语言模型直接对“动作原语库”进行评分,选择适合技能,如 SayCan 框架通过将 LLM 与价值函数组合来选择技能序列,实现“既有用又可行”的行动 (arXiv)

3.与感知和控制对接

  • 视觉模块在场景中识别“红色杯子”“碗”“水槽”等目标
  • 任务层规划生成抓取、移动、放置的子任务序列
  • 低层控制器生成具体的轨迹和关节控制命令

[图片占位:一张“自然语言指令到机器人执行”的流程图 从左到右依次为:人类口头/文本指令 → 语言模型/解析器 → 结构化任务表示(object / target / constraints)→ 任务规划器 → 运动规划 → 机械臂执行画面。]

相比传统“按钮 + 工程参数”的交互方式,自然语言有三个优势:

  • 接近人类思维,学习成本低
  • 可以模糊但正确地描述任务(“大概放在中间”“尽量轻一点”),由系统再细化
  • 方便表达组合任务与长时序目标(“先把桌子收拾干净,再拖地”)

语言条件化机器人策略,已经在多种操作基准与真实机器人中被验证可行,如 VIMA 提出用多模态 prompt(语言 + 目标图像)来统一表达多种操作任务,Transformer 模型自回归地产生动作序列 (OpenReview)。


4.4.1.2 相比坐标输入

传统机器人更习惯接受这样的命令:

  • “末端移动到 \( (x, y, z, roll, pitch, yaw) \)”
  • “关节角设置为 \( q_1, \dots, q_7 \)”

这类坐标/关节指令有两个显著特征:

1.语义层次低

  • 它只告诉机器人“到哪儿、摆成什么姿态”,而不是“为什么要这样做”
  • 无法直接表达“抓起”“放下”“避开玻璃杯”等任务语义和约束 2.对使用者要求高
  • 人类需要理解机器人坐标系、DH 参数、工作空间边界等
  • 在非结构化场景(家居、仓库)中,用户难以给出准确坐标,更不可能频繁手动输入

语言接口与坐标接口之间的关系可以这样理解:

+语言:任务层描述(task-level)

  • “把 A 放到 B”“先做 X 再做 Y”“如果桌子太乱就先整理” +坐标:控制层接口(motion/control-level)
  • 决策好的“抓取 A”最终会被落到一系列笛卡尔位姿或关节轨迹上

现代 VLA 系统的典型做法是:

语言描述 → 抽象任务表示(符号层)→ 运动规划器生成一组几何目标 / 轨迹 → 控制器执行。

这样既保留了语言的高层表达力,又利用坐标级控制的精确性与可验证性。


4.4.1.3 任务参数提取

要让语言真正转化为可执行任务,核心是从自然语言中自动提取出任务参数(task parameters),并与环境状态对齐。

常见的任务参数类型包括:

+对象参数:类别、颜色、形状、材质、是否易碎 +目标位置 / 容器:桌面某区域、某个容器、某个具体物体附近 +空间关系:左边、右边、前面、背后、堆叠在上方、靠近墙面等 +时序结构:先后顺序、条件执行(“如果 A 不存在就改为 B”) +风格 / 性能要求:快/慢、轻/重、优先节能/优先速度等

在工程上可采用多种方式提取:

1.模板与槽位(slot filling) 对于结构固定的任务(如装配线操作),可定义模板:

模板:“把 [颜色] 的 [物体] 放到 [目标位置]” 然后用简单的 NLP 或正则匹配来提取槽位。

2.语义角色标注 / 依存分析

  • 使用语法分析器找出句子中的谓词(谓词:put / move / pick)及其论元(agent, patient, destination)。
  • 如:“把红色杯子放到水槽左边的碗里”中:
    • 动作:放
    • 受事(被操作对象):红色杯子
    • 目标:碗
    • 目标位置修饰:水槽左边 3.大语言模型 + 结构化输出
  • 直接让 LLM 输出 JSON 或类似结构:
{
  "high_level_action": "place",
  "object": {"type": "cup", "color": "red"},
  "target": {"type": "bowl", "relation": "left_of", "anchor": "sink"},
  "constraints": ["be_gentle"]
}
  • 这种方式已被广泛用于语言条件化策略学习和多任务操作系统,如多个工作将自然语言指令映射为操作子、技能调用图或 symbolic predicate,用于下游规划器 (arXiv)

4.“代码即策略”(Code as Policies) 更进一步,可以直接让 LLM 生成可执行代码,代码中显式包含任务参数、条件判断和控制 API 调用。例如 CaP 框架中,大模型从自然语言生成完整的 Python 控制程序,其中对物体、目标、运动参数的解析隐含在生成的函数调用与逻辑结构中 (arXiv)。

[图片占位:自然语言 → JSON 任务表示 → 运动规划 → 控制的示意图。 左侧是原始中文指令,中间是结构化参数表,右侧为机械臂在仿真环境中执行抓取/放置动作的帧序列。]

在本书后续 VLA 架构与训练章节(第 8、9 章)中,可以把“任务参数提取”视作语言编码器 + 头部预测任务的一部分,或视作 LLM 通过 few-shot 提示(prompting)自动完成的子功能。


4.4.2 语言作为约束与安全规范(规则、禁止项)

任务描述回答的是“做什么”,但对真实机器人系统来说,“不准做什么”同样重要,尤其在开放环境中。

语言可以自然地表达:

  • 安全边界:“不要靠近人”“不能碰到墙上的名画”
  • 操作限制:“易碎物品都要轻拿轻放”“不要提起超过 5kg 的物体”
  • 个性偏好:“不要在晚上 10 点以后打扫”“不要移动这张桌子上的任何东西”

这些信息对 RL 奖励函数或传统代价函数来说很难完整编码,因此自然语言约束逐渐成为安全机器人学习的重要研究方向。Safe RL with Natural Language Constraints 这类工作就专门区分了“指令(做什么)”与“约束(不能做什么)”,并用文本对安全区域进行定义和学习 (NeurIPS Proceedings)。


4.4.2.1 语言规则示例

从工程视角看,我们希望把自然语言规则系统化整理为可处理的类型。 可以将常见规则粗略划分为:

1.区域/位置类约束

  • “不要进入厨房的地毯区域”
  • “离墙至少 30cm”
  • “不要在婴儿床 1 米以内移动” 2.对象/材料类约束
  • “不要触碰玻璃制品”
  • “对易碎物体速度要小于 0.1 m/s”
  • “不要移动这个黑色笔记本电脑” 3.交互与力学类约束
  • “人接近时降低速度”
  • “不要施加超过 10N 的推力”
  • “搬运液体时避免急加速” 4.时序类约束
  • “先确认门关闭再启动机械臂”
  • “绝对不要在有人进入房间之前开启激光器”
  • “如果湿滑警示存在,不要进入该区域”

[图片占位:表格形式的“自然语言规则示例汇总图”,左列为中文规则,中列为类别(区域/对象/力学/时序),右列为简要解释。]

这些规则本身可以由操作员、实验室安全规范、企业 SOP(Standard Operating Procedure)或监管机构标准给出,再通过语言接口实时配置给机器人。


4.4.2.2 将安全规范翻译为可检查条件

自然语言规则最终必须变成可计算、可验证的形式,才能在规划和控制中生效。典型做法是构建一个“语言 → 形式规范”的翻译模块,然后在控制环路中加入一个**安全过滤器(safety filter)**或“Safety Chip”进行实时约束检查 (人机实验室)。

可以从三个层次理解这一过程:

1.语义到逻辑/数学形式的映射举例:

更复杂的时序规则(如“先关门再开动机器人”)常被映射为**时序逻辑(如 LTL)**或自动机约束,并在规划或 MPC(Model Predictive Control)中强制满足。部分工作已经实现了从自然语言到 LTL 公式的自动翻译,再用自动机对策略执行过程进行监控 (人机实验室)。

  • 语言规则:

“不要靠近人,至少保持 0.8 米距离。”

  • 转换为数学约束:

    \[ \forall t,\ \text{dist}(\text{robot}(t), \text{human}(t)) \ge 0.8\ \text{m} \]

  • 再进一步可转换为运动规划中的线性或非线性不等式约束。

2.结合感知进行“语义落地”(grounding)

近期工作提出“语言条件化安全过滤”框架:LLM 将自然语言规则翻译为结构化安全规格;感知模块维护对象级 3D 表示;控制模块通过 MPC 或 QP 在实时控制中强制满足语义与几何安全约束 (arXiv)。

  • “不要压到地上的电源线”需要先通过视觉/点云识别“电源线”,再把其投影到机器人坐标系中,定义避让区域。
  • “避免湿滑区域”则需要通过语义分割或人类标注,将地面 patch 标记为“slippery”,再生成约束。

3.规划与控制中的集成方式

  • 任务规划器中: 将规则编译进规划域(例如 PDDL 中的 precondition / forbidden state),在生成任务序列时就避免违背规则。
  • 运动规划器/控制器中: 使用“安全过滤器”对候选轨迹进行可行性检查,不满足约束的轨迹被丢弃或修正(例如 QP-based Safety Layer,或 Control Barrier Function)。
  • RL 策略中: 把规则转化为约束集,用于限制策略的动作选择或构造“屏蔽层(shield)”,形成 safe RL。

[图片占位:语言规则 → LTL/数学约束 → 安全过滤器 → 机器人轨迹 的流程示意图;图中包含感知模块将地毯/电源线等标成不同颜色区域。]


4.4.2.3 人机交互中的纠偏

即便事先定义了大量规则,机器人仍然会犯错或不符合用户偏好。语言在**在线纠偏(on-the-fly correction)**中尤其有用:

典型交互形式:

  • 速度或风格纠正:
    • “太快了,慢一点。”
    • “不要再从桌子这一侧绕了,从后面走。”
  • 安全偏好调整:
    • “这块地毯很贵,不要踩上去。”
    • “这些纸箱可以随便挪,不用小心。”
  • 目标修正:
    • “不是那个红杯子,是靠近窗户的那个。”

研究表明,将语言反馈映射为代价函数修正轨迹改写,可以显著提升机器人轨迹质量和用户满意度。比如有工作提出从自然语言反馈中学习“比较偏好”(comparative language feedback),在共享的嵌入空间中对轨迹进行改进和奖励学习,从而迭代优化策略 (arXiv)。另一些工作则直接把“不要靠这么近”“往桌子中心一点”这类文本映射为代价函数的参数更改,从而重新规划路径 (NVIDIA)。

这一方向与第 9 章中 RLHF 和人类偏好学习内容相呼应: 区别在于,这里的人类反馈不是抽象的数值,而是更具信息量的自然语言,可同时指出“哪里错了”和“应该如何改”。


4.4.3 语言作为解释接口(机器人行为的可解释性)

当机器人通过 VLA 模型自主决策时,人类很容易产生“黑箱恐惧”: 为什么它要绕一大圈?为什么它停在这里不动?是坏了还是在思考?

语言解释接口的目标,就是让机器人在关键时刻说清楚自己在做什么、为什么这么做、哪里出了问题、下一步会怎样做,从而提升信任与可调试性。


4.4.3.1 行为解释

可以把行为解释按“深度”分为三层:

1.What:描述正在做什么

  • “我正在寻找红色杯子。”
  • “我准备从桌子的右侧绕到水槽前面。”
  • “我正在缓慢放下杯子,避免倾倒。” 2.Why:解释决策原因(代价与约束)
  • “我选择从右侧绕行,因为左侧有地毯区域被标记为禁入。”
  • “我降低了速度,因为检测到附近有人类在移动。”
  • “我先收拾桌面,再拖地,因为拖地前需要清空地面。” 3.What-if:对比和反事实解释
  • “如果我从左侧走,可能会踩到电源线。”
  • “如果直接抬起箱子,可能超过负载限制,会造成危险。”

在实现上,解释可以来自:

+显式规划轨迹和代价信息: 规划器天生就有路径、代价值、约束,LLM 可以根据这些信息生成自然语言说明。 +任务层步骤序列: 像 SayCan 这类系统已经有“技能序列 + 成功概率”的中间表示,可以直接转换成可读的步骤说明(“先打开柜门,再拿出杯子,再关门……”) (arXiv)。 +策略内部的中间 token / subgoal: 多模态 Transformer 产生的中间“子目标 token”也可视为解释线索,经过语言解码头转换成自然语言解释。

[图片占位:左侧为机器人执行某个长时任务的时间轴,右侧对应每个关键时刻的解释气泡;例如“t1:正在寻找杯子”“t2:绕开地毯”“t3:抓取失败,重新尝试”。]


4.4.3.2 故障诊断

当机器人无法完成任务或表现异常时,人类需要知道是感知出错、规划失败、控制器饱和,还是“指令不可行”。

语言诊断接口可以做几件事情:

1.明确失败原因类别

  • 感知问题: “我没有在桌面上找到红色杯子,只找到了蓝色和绿色的杯子。”
  • 几何可达性问题: “目标位置太靠近墙角,我的机械臂在不碰撞墙的前提下无法到达。”
  • 动力学/负载问题: “物体重量估计超过 7kg,而我的额定负载为 5kg。”
  • 规则/约束冲突: “该路径会经过禁止进入的地毯区域,因此被安全规则拒绝。” 2.反馈给普通用户与开发者不同粒度的信息
  • 对普通用户:用日常语言说明情况并给出建议(“请把杯子放到更靠近桌面中心的位置”)。
  • 对开发者:附带具体错误码、关节、传感器读数等技术信息(供日志分析)。 3.与调试工具联动
  • 语言解释中可附带“建议收集何种数据”“建议降低某个参数”等,使调试过程更高效。

随着 LLM 与机器人控制的结合,越来越多工作尝试用大模型对低层日志进行“文本摘要式诊断”,例如将多轮规划失败记录压缩成一句话:“最近 10 次任务失败大多是由于抓取时末端对准误差过大”。这一方向与第 10 章“系统部署与评测”可以形成上下呼应。


4.4.3.3 学习反馈

语言不仅可以解释机器人的行为,也可以用来总结机器人学到的内容,形成一种“可对话的学习日志”。

从机器人一侧来看,典型能力包括:

+任务完成总结

  • “本次共完成 10 次抓取任务,成功 8 次,失败 2 次(均发生在抓取小物体时)。我发现对小物体使用当前视角难以准确对准。” +策略更新说明
  • “根据最近的语言反馈‘尽量不要碰到桌上的纸张’,我在路径规划中增加了对纸张区域的避让权重。” +提出澄清问题
  • “你希望我优先减少耗时还是优先减少能耗?”
  • “‘把房间收拾干净’是否包括把桌上的书也收进书架?”

从人类一侧来看,自然语言反馈本身也可以参与学习:

  • 作为奖励模型 / 偏好模型的训练数据,例如“刚才那条路径太靠近花瓶了”对应一个低评分,反之“这样很好,离人足够远”对应高评分。
  • 作为策略改进建议,被自动映射到轨迹修正或约束调整中(参见前面提到的 comparative language feedback 与 preference learning 工作) (arXiv)。

这一方向在未来有望让机器人拥有更“人性化”的学习接口: 不是只看数字奖励和 loss 曲线,而是能听懂“老板/用户”一句抱怨或鼓励,从中调整行为策略。


4.4.4 任务层规划与语言层规划的关系

在前面的机器人学与控制章节中,我们主要讨论的是任务/运动规划: 如何在给定目标状态与环境模型的前提下,找到一条可行又优的轨迹。

而在有了大语言模型之后,出现了一个新层级:语言层规划(language-level planning)——用语言或符号步骤来规划“做什么”,再交给传统规划器和控制器决定“怎么做”。

两者的关系类似于:

人说“先买菜再做饭”,导航和操作模块决定“走哪条路、用哪只手拿菜、锅放在哪个灶眼”。


4.4.4.1 任务层规划(Task-level Planning)

任务层规划传统上指在符号状态和动作空间上进行规划,有时也包含几何细节,典型包括:

  • 经典 AI 规划(如 PDDL + 规划器)
  • Task and Motion Planning(TAMP):同时考虑离散任务结构与连续运动可行性
  • 运动规划与轨迹优化(RRT*, CHOMP, TrajOpt 等)

其输入通常是:

  • 形式化目标(goal state / goal formula)
  • 任务域模型(动作 precondition / effect)
  • 几何与动力学约束(碰撞、关节限制等)

输出则是:

  • 一个可执行的动作序列或带参数的操作模板:
    • pick(obj=RedCup, pose=p1)
    • place(obj=RedCup, pose=p2)
    • 中间插入 move_baseopen_door 等技能调用

这一层不关心“指令是用中文、英文还是按钮点击传达的”,它只需要结构化的目标与约束。


4.4.4.2 语言层规划(Language-level Planning)

语言层规划利用语言模型强大的世界知识与组合能力,在“符号/语言空间”内先做一轮高层策略推理,其典型形式包括:

1.把自然语言指令分解为子任务序列例如指令:“帮我准备一个早餐托盘:一杯咖啡、一片面包和一个苹果。”语言层规划可能生成的步骤:

每一步再映射为相应的机器人技能调用。

1. 去厨房找到干净的托盘
2. 把咖啡杯放到托盘左侧
3. 把面包放在托盘中间
4. 把苹果放在托盘右侧
5. 把托盘端到餐桌上

2.**生成“代码式策略”**Code as Policies 等工作直接让 LLM 生成控制程序,如:

def make_breakfast_tray():
    tray_pose = find_object("tray")
    move_arm_to(tray_pose)
    # ...

这段代码中已经内含了子任务结构、条件判断和循环逻辑,语言层规划就是程序结构本身 (arXiv)。

3.与经典规划器协同近期大量工作探讨“LLM + 经典规划器”的组合:

  • LLM 负责从自然语言抽象出符号谓词、操作子、子目标
  • 把这些知识编译成 PDDL 或其他形式,交给经典规划器求解
  • 规划结果再由 LLM 或规则系统转回自然语言解释或技能序列 (Nature)。

在 VLA 框架下,可以把语言层规划看成是“在 token 序列上做规划”: 模型生成一串“子任务 token / 技能 token / 子目标 token”,然后由下游模块执行。

[图片占位:上半部分为 LLM 生成的“文字/代码形式的步骤计划”,下半部分为每步映射到任务规划器和运动规划器的执行过程。]


4.4.4.3 协同作用

真正强大的机器人系统,往往不是“纯语言驱动”或者“纯经典规划”,而是两者的协同:

1.语言层:提出“可能的好计划”

  • 借助大模型的常识和抽象能力,快速产生多种候选计划:
    • 不同子任务顺序
    • 不同工具/通道选择(从门走还是从另一侧绕行)
  • 考虑用户偏好、安全需求、任务优先级等“软因素” 2.任务层:验证“这计划在几何和安全上能不能干”
  • 利用精确的几何/动力学模型、环境地图和安全约束,对候选计划进行可行性检查与优化
  • 发现不可行时(如某个抓取姿态在当前场景会碰到墙),反馈给语言层更新计划 3.安全层:语言约束与形式安全的结合
  • 语言层从自然语言中抽取安全规则(第 4.4.2 节),转换为形式约束
  • 任务层与控制层利用这些约束进行优化与安全过滤
  • 一些工作更进一步,结合 LLM 生成的安全策略与 QP/MPC 安全过滤器,构建“Safety-aware Task Planning”体系,让规划过程同时兼顾任务成功率与安全规避 (arXiv)。 4.解释与交互闭环
  • 语言层可以解释任务层的规划决策(“我选择方案 B,因为方案 A 会违反安全约束 X”)
  • 人类可以通过语言修改计划或规则(“允许你临时进入这个区域,但速度必须低于 0.2 m/s”),系统再重新规划

[图片占位:三层结构图: 顶层“语言层规划(LLM)”负责解析指令、分解子任务和规则解释; 中层“任务/运动规划”负责路径和动作的具体计算; 底层“控制与执行”负责实时控制。 左侧有“人类语言输入/反馈”,右侧有“机器人执行 + 语言解释输出”。]

从长远看,可以把语言看成一种统一接口

  • 向上连接人类的任务需求、偏好与安全规范
  • 向下连接机器人的传统规划、控制与感知模块
  • 与多模态表示(视觉、状态、历史轨迹)共同构成具身基础模型的一部分

本节讲的是“语言的角色”;在后续章节中,你会看到这些角色如何通过具体的 VLA 架构、训练范式和系统部署,真正落地到一个能听话、会解释、守规矩、敢自主的机器人身上。

本章小结与自测

三行小结

  1. 本章说明语言如何参与机器人任务表达与约束。
  2. 重点是语义条件化,而不是只做文本生成。
  3. 学完后应能设计语言到控制约束的映射接口。

检查题

  1. 用你自己的话总结本章最核心的一个公式/机制。
  2. 给出一个“如果要落地到项目里,你会怎么用”的具体例子。

常见误区

  1. 把语言当装饰输入,不做约束落地。
  2. 忽略指令歧义与失败反馈。
  3. 缺少安全规则优先级设计。

公式到代码(最小示例)

instruction = "pick the red cup"
keywords = [w for w in instruction.split() if w not in {"the"}]
constraints = {"forbid": ["spill"], "speed": "low"}
print(keywords, constraints)

本章外部参考(集中)

  1. arXiv
  2. OpenReview
  3. arXiv
  4. arXiv
  5. NeurIPS Proceedings
  6. 人机实验室
  7. arXiv
  8. arXiv
  9. NVIDIA
  10. Nature
  11. arXiv

5.1 强化学习基本框架

5.1.1 马尔可夫决策过程(MDP)的五元组

学习导航

  • 本章主题:5.1.1 马尔可夫决策过程(MDP)的五元组
  • 前置知识:建议先完成第 1-2 章,再进入 RL/IL。
  • 建议用时:78-98 分钟
  • 阅读顺序:先看概念框架,再看公式/代码,最后做自测。

关键图示:强化学习交互闭环

关键图示:强化学习交互闭环

在强化学习中,我们需要一个统一的数学框架来描述“智能体与环境反复交互、在不确定条件下做序贯决策”的问题,这个框架就是马尔可夫决策过程(Markov Decision Process, MDP)。经典定义中,一个离散时间的 MDP 通常用一个五元组表示:

\[ \mathcal{M} = \langle \mathcal{S}, \mathcal{A}, P, R, \gamma \rangle \]

其中分别对应状态空间、动作空间、转移概率、奖励函数和折扣因子。(维基百科)

在机器人领域中,可以把 MDP 理解为:给定机器人当前“所处情境”(状态),它可以选择某个控制指令(动作),环境根据物理规律和噪声发生变化(转移),机器人会得到一个任务反馈信号(奖励),并持续重复这个过程,目标是让长期奖励最大化。很多移动机器人路径规划、操作抓取等问题都可以用 MDP 或其扩展建模。(MDPI)

【图片占位:图 5-1】 内容:经典“智能体–环境交互”示意图。左边是 Agent(机器人),右边是 Environment(环境),中间箭头标注:状态 \(s_t\)、动作 \(a_t\)、奖励 \(r_{t+1}\)、下一个状态 \(s_{t+1}\)。


5.1.1.1 状态(State)

状态\(s \in \mathcal{S}\) 用来描述环境在某一时刻的“信息摘要”,包含做决策所需的关键信息。

  • 对机械臂抓取任务: 状态可以包括各关节角度与角速度、末端位姿、目标物体的 6D 位姿、夹爪开合状态等。
  • 对移动机器人导航: 状态可以是机器人在地图中的位姿 \(x, y, \theta\),以及局部局势信息(附近障碍物、目标位置等)。(MDPI)

从数学上,MDP 要求状态满足马尔可夫性(Markov property)

\[ \Pr(s_{t+1} \mid s_0,a_0,\dots,s_t,a_t) = \Pr(s_{t+1} \mid s_t,a_t) \]

也就是说,当前状态已经包含了对未来决策有用的全部历史信息,过去发生了什么只需要通过当前的状态来“折叠表示”。(维基百科)

在机器人具身智能中,原始传感器数据(例如 RGB 图像、深度图、力矩传感器读数)往往不是严格的“马尔可夫状态”,而更接近“观测(observation)”。工程上常见的做法包括:

  • 通过滤波器或估计器(如卡尔曼滤波、SLAM)综合历史观测,构造接近马尔可夫的内部状态;
  • 或直接让神经网络(如 RNN、Transformer)在时间维度上“记住”历史,从而在表示空间上逼近马尔可夫性。

【图片占位:图 5-2】 内容:机器人导航示意图:地图上若干位置格子,每个格子标注为一个状态 \(\displaystyle s\),机器人当前位置用小车图标表示。


5.1.1.2 动作(Action)

动作\(a \in \mathcal{A}\) 表示智能体可以施加在环境上的控制信号或高层指令。

在机器人中,动作空间的设计与控制层级密切相关:

1.低层连续控制

  • 关节力矩 \(\tau\)、关节速度 \(\dot{q}\) 或末端速度 \(\dot{x}\) 等连续值;
  • 适合直接基于物理动力学的强化学习算法(如 DDPG、SAC 等在后文介绍)。 2.中层运动命令
  • 例如“末端向前移动 1 cm”“夹爪闭合 5°”“底盘向左转 10°”;
  • 通常是离散化的 delta pose / delta velocity 命令,与第 6 章的动作表示呼应。 3.高层动作原语(Skill / Primitive)
  • 例如“抓取桌面上的红色杯子”“打开抽屉”,内部再由一系列底层控制组成;
  • 在具身智能和 VLA 模型中,高层动作常与自然语言指令或技能库对应。

理论上,MDP 允许动作空间是离散的、连续的,甚至是混合的;但不同类型的动作会直接影响后续可用的强化学习算法。


5.1.1.3 转移概率(Transition)

转移概率\(\displaystyle P\) 刻画在环境动力学下,执行某个动作后状态如何变化:

\[ P(s' \mid s, a) = \Pr(s_{t+1} = s' \mid s_t = s, a_t = a) \]

这是 MDP 中的“环境模型”。对于给定的 \(\displaystyle s\) 和 \(\displaystyle a\),它告诉我们可能到达哪些 \(s'\),以及各自的概率。(维基百科)

在机器人场景中:

  • 理论上可以通过动力学方程(第 6 章)精确给出状态转移:

    \[ M(q)\ddot{q} + C(q,\dot{q})\dot{q} + G(q) = \tau \]

    这类模型往往是近似确定性的。

  • 现实中存在大量非理想因素:摩擦、接触不确定性、传感噪声、人类干预等,使转移过程具有随机性。(MDPI)

在经典动态规划求解 MDP 时,通常假设 \(\displaystyle P\) 是已知的(“有模型”情形);而在大多数强化学习应用中,我们并不知道显式的 \(\displaystyle P\),只能通过与环境交互采样经验来“间接利用”转移结构——后文的 Q-Learning、Actor–Critic 等都属于这种“无模型”方法。

【图片占位:图 5-3】 内容:从状态 \(\displaystyle s\) 出发经动作 \(\displaystyle a\) 指向多个可能的 \(s'\),箭头上标注对应概率 \(P(s'|s,a)\) 和奖励 \(R(s,a,s')\)。


5.1.1.4 奖励函数(Reward)

奖励函数\(\displaystyle R\) 定义为在状态–动作–下一状态三元组上的即时反馈:

\[ R(s,a,s') = \mathbb{E}[r_{t+1} \mid s_t = s, a_t = a, s_{t+1} = s'] \]

有时也简写为 \(R(s)\) 或 \(R(s,a)\),取决于具体建模习惯。(维基百科)

奖励的作用是编码任务目标

+任务成功 / 失败

  • 如抓取任务中,成功抓起目标物体给 +1,失败给 0 或负值;
  • 导航任务中,到达目标格子给高奖励,碰撞障碍物给负奖励。 +过程成本
  • 每一步运动消耗一点负奖励(-0.01),促使策略尽可能快速完成任务;
  • 转弯次数过多、路径过长都可用额外负奖励约束。

奖励设计是机器人强化学习中非常关键的工程问题。奖励过于稀疏(只有成功才给奖励)时,智能体很难通过随机探索“发现”有用信号;通常需要合理的奖励塑形(reward shaping),例如为“接近目标”“抓取姿态更对齐”等中间阶段提供一些中间奖励,以提高学习效率。


5.1.1.5 折扣因子(Discount factor)

折扣因子\(\gamma \in (0,1]\) 用于平衡“当前奖励”和“未来奖励”的相对重要性。给定未来奖励序列 \(\{r_{t+1}, r_{t+2}, \dots\}\),从时间步 \(t\) 起的折扣回报定义为:

\[ G_t = \sum_{k=0}^{\infty} \gamma^{k} r_{t+k+1} \]

当 \(\gamma < 1\) 时,这个无穷级数在期望意义下是有界的,适合描述无限时域任务;当任务是有限长的一个 episode 时,往往也可以取 \(\gamma \approx 1\) 或者直接令 \(\gamma = 1\)。(维基百科)

直观理解:

  • \(\gamma\) 越接近 0:
    • 智能体越“短视”,只关心眼前的即时回报;
    • 对机器人来说,更像是贪图眼前便利,例如只在当前局部寻找最短路径而忽略远处的大障碍。
  • \(\gamma\) 越接近 1:
    • 智能体越“远视”,会为长远利益做规划;
    • 例如家务机器人为长期整理房间布局付出短期代价,以换取未来更高效率。

折扣因子不仅有行为学上的意义,更是很多理论结果(如贝尔曼方程收敛性)的关键条件。


5.1.2 回报、折扣因子与价值函数概念

在有了 MDP 的五元组之后,我们还需要一个量化“好状态、好动作”的核心工具,这就是价值函数(value function)。价值函数并不是额外增加一个元素,而是基于 MDP 与策略 \(\pi\) 定义的一族函数,它将“长期回报”的概念形式化。


5.1.2.1 回报(Return)

前面已经给出折扣回报的定义:

\[ G_t = \sum_{k=0}^{\infty} \gamma^{k} r_{t+k+1} \]

注意两点:

1.回报是随机量: 奖励 \(r_{t+1}, r_{t+2}, \dots\) 由随机的转移和可能的随机策略决定,因此 \(G_t\) 也是随机变量。 2.我们关心的是期望回报: 对机器人策略的评估通常是“长期平均表现”,而不是某一次执行的偶然好坏。(ralasun.github.io)

在具身智能场景中,可以把回报理解成:当你在某个状态开始执行当前策略,让机器人长期运行下去,它平均能在任务上做得多好。


5.1.2.2 状态价值函数 \(V(s)\)

给定一个策略 \(\pi\),状态价值函数定义为:

\[ V^{\pi}(s) = \mathbb{E}_\pi \big[ G_t \mid s_t = s \big] \]

即“从状态 \(\displaystyle s\) 出发,之后按照策略 \(\pi\) 行事,所能获得的期望回报”。

经典结果表明,\(V^{\pi}(s)\) 满足贝尔曼期望方程(Bellman expectation equation)

\[ V^{\pi}(s) = \sum_{a} \pi(a \mid s) \sum_{s'} P(s' \mid s,a) \Big[ R(s,a,s') + \gamma V^{\pi}(s') \Big] \]

这只是对“回报定义”的递推展开:从当前状态的价值等于当前一步期望奖励加上下一状态价值的折扣期望。(숨니의 무작정 따라하기)

在机器人导航中,可以将 \(V^{\pi}(s)\) 想象为地图上每个格子的“热度”:值高的状态意味着从那里出发,按照当前策略,最终到达目标的概率高、成本低。

【图片占位:图 5-4】 内容:2D 网格地图,每个格子用颜色表示 \(V^{\pi}(s)\) 的大小(越接近目标值越高),展示价值函数的空间分布。


5.1.2.3 动作价值函数 \(Q(s,a)\)

与只关心“当前状态”不同,动作价值函数(state–action value function)还区分了当前动作:

\[ Q^{\pi}(s,a) = \mathbb{E}_\pi \big[ G_t \mid s_t = s, a_t = a \big] \]

表示“在状态 \(\displaystyle s\) 下先执行动作 \(\displaystyle a\),然后再一直遵循策略 \(\pi\),所能得到的期望回报”。

它的贝尔曼期望方程为:

\[ Q^{\pi}(s,a) = \sum_{s'} P(s' \mid s,a) \Big[ R(s,a,s') + \gamma \sum_{a'} \pi(a' \mid s') Q^{\pi}(s',a') \Big] \]

(参考)

两个价值函数的关系可以写成:

\[ V^{\pi}(s) = \sum_{a} \pi(a \mid s) Q^{\pi}(s,a) \]

因此可以把 \(Q^{\pi}\) 看作是“比 \(V^{\pi}\) 细一层”的对象。

在很多强化学习算法(如 Q-Learning、DQN)中,策略不再单独存储,而是通过 \(\displaystyle Q\) 函数的贪婪选择隐式给出:

\[ \pi(s) = \arg\max_{a} Q(s,a) \]

这使得我们可以只专注于估计 \(\displaystyle Q\) 函数,而不必单独存储整张策略表。


5.1.2.4 最优价值函数

对于给定的 MDP,存在一族可能的策略集合 \(\Pi\)。在所有策略中,我们关心的是最优策略\(\pi^*\),以及对应的最优价值函数:

\[ V^*(s) = \max_{\pi \in \Pi} V^{\pi}(s), \qquad Q^*(s,a) = \max_{\pi \in \Pi} Q^{\pi}(s,a) \]

它们满足贝尔曼最优性方程(Bellman optimality equation)

\[ V^*(s) = \max_{a} \sum_{s'} P(s' \mid s,a) \Big[ R(s,a,s') + \gamma V^*(s') \Big] \]

\[ Q^*(s,a) = \sum_{s'} P(s' \mid s,a) \Big[ R(s,a,s') + \gamma \max_{a'} Q^*(s',a') \Big] \]

(参考)

一旦我们“知道”了 \(Q^{*}\),最优策略可以简单地由逐状态贪婪给出:

\[ \pi^*(s) = \arg\max_{a} Q^*(s,a) \]

这就是很多强化学习算法背后的思想:通过样本或模型逼近 \(Q^{*}\),然后对其取贪婪即可控制机器人。后续章节的值函数法(DQN 等)与策略梯度法都可以视作在不同条件下对这些最优函数的近似求解。


5.1.3 策略、价值迭代的直觉

到目前为止,我们只是定义了策略、价值和最优性的概念。本小节进一步给出如何利用已知模型求解最优策略的直觉:当环境转移 \(\displaystyle P\) 与奖励 \(\displaystyle R\) 已知时,可以通过动态规划(Dynamic Programming)类方法求解 MDP,其中最经典的就是策略迭代(Policy Iteration)价值迭代(Value Iteration)。(ralasun.github.io)

需要强调的是,在真实机器人系统中,我们往往不知道精确的 \(\displaystyle P\) 和 \(\displaystyle R\),只能通过仿真或真实交互采样近似,这就引出了后续的强化学习算法。但理解这两种理想化的“规划”方法,有助于把 RL 看成是“在有限数据下逼近 DP 解”的过程。


5.1.3.1 策略(Policy)

在 MDP 中,策略\(\pi\) 给出了智能体在每个状态下选择动作的规则:

+确定性策略

\[ \pi(s) = a \quad \text{或记作} \quad \pi(a \mid s) = 1 \]

+随机策略

\[ \pi(a \mid s) = \Pr(a_t = a \mid s_t = s) \]

价值函数总是“附着在某个策略上”的:在前面我们写 \(V^{\pi}(s)\)、\(Q^{\pi}(s,a)\),强调给定策略后才谈得上“好坏评估”。

在机器人具身智能中,策略可以有多种实现形式:

  • 手写规则(if–else 控制器、有限状态机);
  • 传统控制/规划算法(如 DWA 导航、RRT* 路径规划)可以看作特殊形式的策略;
  • 神经网络策略(后续章节重点),输入状态特征,输出动作或动作分布。

强化学习的目标,就是在策略空间中找到一个尽可能接近 \(\pi^*\) 的策略。


5.1.3.2 策略迭代(Policy Iteration)的直觉

策略迭代可视作“先思考,再行动”的流程:给定完整环境模型,通过不停地评估当前策略改进策略来逐步逼近最优策略。经典教科书指出,当状态空间有限、折扣因子 \(0<\gamma<1\) 时,策略迭代会在有限轮次内收敛到最优策略。(维基百科)

整体循环可以概括为两步:

1.策略评估(Policy Evaluation)

  • 固定现有策略 \(\pi_k\),求解对应的 \(V^{\pi_k}\)(或 \(Q^{\pi_k}\));

  • 在有模型的情况下,可以通过迭代应用贝尔曼期望方程来收敛到真实值:

    \[ V_{k+1}(s) \leftarrow \sum_{a} \pi_k(a \mid s) \sum_{s'} P(s' \mid s,a) \big[ R(s,a,s') + \gamma V_k(s') \big] \]

  • 直观上是“在整张状态空间上模拟当前策略长期表现”。 2.策略改进(Policy Improvement)

  • 有了 \(V^{\pi_k}\) 或 \(Q^{\pi_k}\) 的估计后,在每个状态上选择“更优”的动作:

    \[ \pi_{k+1}(s) = \arg\max_{a} Q^{\pi_k}(s,a) \]

  • 这一步是局部的“贪婪改进”:在当前对未来的评估下,换一个更好的动作。

策略迭代不断在“评估–改进”之间往复,策略性能单调提升,直到某一轮改进后策略不再变化,得到的就是最优策略

把它放在机器人场景来看,可以理解为:

  • 首先固定一个控制器,让机器人在所有可能状态下“试想一下”或在仿真中验证其效果(评估);
  • 然后根据评估结果,在每个状态上对控制器做一点点优化(改进);
  • 重复这个过程,最终得到在整个状态空间上表现最好的控制策略。

5.1.3.3 价值迭代(Value Iteration)的直觉

策略迭代的“评估”步骤代价较高(要精确地求整个 \(V^{\pi}\)),在状态空间较大时不够高效。价值迭代可以看作一种融合了“评估”和“改进”的更紧凑做法:

其核心迭代为贝尔曼最优性更新

\[ V_{k+1}(s) \leftarrow \max_{a} \sum_{s'} P(s' \mid s,a) \big[ R(s,a,s') + \gamma V_k(s') \big] \]

每一步更新就是一次“局部规划”:假设我们已经有了对未来价值 \(V_k(s')\) 的估计,那么在当前状态 \(\displaystyle s\) 上,只需向前“看一步”,考虑所有动作的即时奖励加上折扣后的未来价值,取其中最大的作为新的估计。(숨니의 무작정 따라하기)

这可以理解为:

  • 策略迭代:先完整评估当前策略,再一次性改进策略
  • 价值迭代:在每一次局部更新时就已经做了“潜在的策略改进”,因此无需显式存储每轮策略。

当价值迭代收敛到 \(V^{*}\) 时,我们可以再通过

\[ \pi^*(s) = \arg\max_{a} \sum_{s'} P(s' \mid s,a) \big[ R(s,a,s') + \gamma V^*(s') \big] \]

一次性导出最优策略。

在机器人导航这类经典问题中,价值迭代与网格地图规划关系非常紧密:

  • 把每个栅格当作一个状态;
  • 动作为“向上/下/左/右移动”;
  • 奖励设为每走一步 -1,到终点给 0;
  • 使用价值迭代可以得到每个格子的最优价值,再通过“朝价值更高的邻居移动”导出最短路径策略,这与很多动态规划式路径规划算法本质相同。(MDPI)

【图片占位:图 5-5】 内容:左图为网格地图;右图为价值迭代过程中数次迭代的 \(V_k(s)\) 伪彩图(颜色逐步向最终最优价值分布收敛),箭头从低价值区指向高价值区,说明贪婪策略方向。


本小节通过 MDP 五元组、回报与价值函数、以及策略迭代/价值迭代的直觉,给出了强化学习的“数学语言”。后续 5.2 节将在此基础上介绍 Q-Learning、策略梯度、Actor–Critic 等具体算法,并进一步讨论如何在机器人具身智能场景中,从“理论上的 MDP 求解”过渡到“基于真实交互和数据驱动的策略学习”。

本章小结与自测

三行小结

  1. 本章打通 RL 与 IL 的核心概念和常用算法。
  2. 重点是数据分布、目标函数与稳定训练的平衡。
  3. 学完后应能解释“何时 BC、何时 RL、何时混合”。

检查题

  1. 用你自己的话总结本章最核心的一个公式/机制。
  2. 给出一个“如果要落地到项目里,你会怎么用”的具体例子。

常见误区

  1. 把离线指标当在线性能。
  2. 忽视分布偏移。
  3. 奖励设计过稀疏或可被投机。

公式到代码(最小示例)

rewards = [0.0, 0.0, 1.0]
gamma = 0.99
G = 0.0
for r in reversed(rewards):
    G = r + gamma * G
print(round(G, 6))

本章外部参考(集中)

  1. 维基百科
  2. MDPI
  3. ralasun.github.io
  4. 숨니의 무작정 따라하기
  5. 参考
  6. 参考

5.2 经典 RL 算法

5.2.1 值函数法(Q-Learning、DQN)

学习导航

  • 本章主题:5.2.1 值函数法(Q-Learning、DQN)
  • 前置知识:建议先完成第 1-2 章,再进入 RL/IL。
  • 建议用时:120-140 分钟
  • 阅读顺序:先看概念框架,再看公式/代码,最后做自测。

值函数法的核心思想是:先学会“这个状态–动作有多值钱”(Q 值),再用“选最值钱的动作”得到策略。这类方法通常假设动作空间是离散的,非常适合作为强化学习入门。


5.2.1.1 Q-Learning

Q-Learning是最经典、最基础的值函数控制算法之一,由 Watkins 在 1989 年提出,是一种离线策略(off-policy)的时序差分(TD)控制方法。(ApX Machine Learning)

1.目标:学习最优动作价值函数 我们希望学到最优 Q 函数:

\[ Q^*(s,a) = \mathbb{E}\Big[ \sum_{k=0}^{\infty}\gamma^k r_{t+1+k} \Big| s_t=s, a_t=a,\ \pi = \pi^* \Big] \]

一旦知道了 \(Q^*(s,a)\),就可以用贪心策略

\[ \pi^*(s) = \arg\max_a Q^*(s,a) \]

在“纸面上”把所有状态的最佳动作都写出来。 2.更新规则:基于贝尔曼最优方程的 TD 更新 Q-Learning 的核心更新:

\[ Q_{\text{new}}(s_t,a_t) \leftarrow Q(s_t,a_t) \quad + \alpha \Big[ r_{t+1} + \gamma \max_{a'} Q(s_{t+1},a') - Q(s_t,a_t) \Big] \]

  • 方括号内是TD 误差(temporal-difference error)

    \[ \delta_t = r_{t+1} + \gamma \max_{a'} Q(s_{t+1},a') - Q(s_t,a_t) \]

  • 直觉:

    • “当前对 \(Q(s,a)\) 的认识” 是旧值;
    • “基于下一步最优动作的估计” 给出新的目标;
    • 用学习率 \(\alpha\) 在两者之间做插值。 3.离线策略(Off-policy)的含义 +行为策略(behavior policy):实际与环境交互的策略,通常是 \(\epsilon\)-greedy: 绝大多数时候选 \(\arg\max_a Q(s,a)\),偶尔随机探索。 +目标策略(target policy):更新时用到的,是对 \(\max_a Q(s,a)\) 的贪心策略。
  • 行为策略可以和目标策略不同,这就是 off-policy 的特点,允许我们在探索时做一些“奇怪动作”,但更新时仍朝着“最终想用的最优贪心策略”学习。 4.收敛性(在表格情形) 在有限状态–动作空间、每对 \((s,a)\) 被无穷次访问,且学习率满足 \(\sum_t \alpha_t = \infty, \sum_t \alpha_t^2 < \infty\) 的条件下,Q-Learning 收敛到 \(Q^*\)。(ApX Machine Learning) 5.简单示例:网格世界 / 移动机器人导航

  • 状态:机器人在网格中的位置;

  • 动作:上、下、左、右;

  • 奖励:到达目标 +1,其他为 0 或小负数; Q-Learning 会通过不断试探,逐渐学到每个格子上朝哪走未来回报最大。

【图 5-1 占位:二维网格世界 + Q 表示意图。左侧是网格和机器人、目标位置;右侧是状态-动作 Q 表的一个片段。】


5.2.1.2 深度 Q 网络(DQN)

当状态是高维连续空间(如图像、机器人状态向量)时,显然不可能再用一张表来存所有 Q 值。**DQN(Deep Q-Network)**将 Q 函数用深度神经网络来近似,是“深度强化学习”真正起飞的关键工作之一。(Nature)

1.基本思想:用神经网络近似 Q 函数

  • 设网络参数为 \(\theta\),网络输入状态 \(s\),输出一个向量 \((Q(s,a_1;\theta), \dots, Q(s,a_{|\mathcal{A}|};\theta))\);
  • 对于 Atari 游戏,网络输入为若干帧堆叠的灰度图像,输出每个离散动作的 Q 值。 2.损失函数与目标值 对于一条经验 \((s_t,a_t,r_{t+1},s_{t+1})\),定义目标:

\[ y_t = r_{t+1} + \gamma \max_{a'} Q(s_{t+1},a';\theta^-) \]

其中 \(\theta^-\) 是目标网络参数(后面介绍)。 然后最小化平方误差:

\[ L(\theta) = \mathbb{E}_{(s,a,r,s') \sim \mathcal{D}} \big[ ( y_t - Q(s_t,a_t;\theta) )^2 \big] \]

3.经验回放(Experience Replay)

  • 与环境交互时,将每步经历 \((s,a,r,s')\) 存入回放池 \(\mathcal{D}\);
  • 训练时随机采样小批量数据更新网络。 作用:
  • 打破连续样本之间的相关性;
  • 提高数据利用率(每条经验可被多次采样使用)。 4.目标网络(Target Network) 直接用当前网络参数 \(\theta\) 去计算目标中的 \(\max_{a'} Q(s',a';\theta)\) 会导致更新目标跟随网络频繁变化,训练不稳定。 DQN 使用一个**“慢更新”的目标网络**\(Q(s,a;\theta^-)\),参数 \(\theta^-\) 每隔固定步数从 \(\theta\) 拷贝一次。(Nature) 5.整体训练流程(概略)
  • 初始化 Q 网络参数 \(\theta\) 和目标网络参数 \(\theta^- = \theta\);
  • 重复:
    1. 用 \(\epsilon\)-greedy 策略与环境交互,存经验到回放池;
    2. 从回放池随机采样一个 batch;
    3. 用目标网络计算 y;
    4. 对在线网络参数 \(\theta\) 做一次梯度下降;
    5. 每 N 步同步目标网络:\(\theta^- \leftarrow \theta\)。

【图 5-2 占位:DQN 结构示意图。左边是 Atari 图像帧,经过 CNN 提取特征,右侧输出每个离散动作的 Q 值;旁边画出经验回放池和目标网络的关系。】


5.2.1.3 DQN 技巧

在基础 DQN 之后,大量工作围绕“如何让值函数法更稳定、更高效”展开,形成了一整套 “DQN 家族” 技巧。(ResearchGate)

常见改进可以按以下几类理解:

1.减小过估计偏差:Double DQN 标准 DQN 中的 \(\max_{a'}Q(s',a')\) 容易产生系统性过估计,即对所有动作的价值略微偏乐观。

  • Double DQN 的做法是“由一个网络选动作,另一个网络估值”:

    \[ a^* = \arg\max_{a'} Q(s',a';\theta) \]

    \[ y = r + \gamma Q(s', a^*; \theta^-) \]

  • 直觉:

    • 在线网络负责“挑动作”;
    • 目标网络负责“打分”;
    • 这样减少了单一网络的乐观偏差。 2.网络结构改进:Dueling Network dueling 架构将 Q 分解为状态价值 V优势函数 A

\[ Q(s,a) = V(s) + A(s,a) - \frac{1}{|\mathcal{A}|}\sum_{a'} A(s,a') \]

  • 对于很多状态,“当前状态好不好”比“具体动作差异”更重要(例如四面都是墙);
  • Dueling 结构先学习一个共享的表示,再分别输出 V 和 A,有利于在很多动作“差不多”的状态下更稳定地估计价值。(ResearchGate) 3.经验回放的改进:优先经验回放(PER)
  • 标准回放是均匀采样,但有些 transition 比另一些更“关键”;
  • PER 根据 TD 误差大小给样本分配优先级,误差大的样本被采到的概率更高,以更快修正错误估计。(ResearchGate) 4.多步回报与分布式值函数 +多步回报(n-step return): 用 \(r_t + \gamma r_{t+1} + \dots + \gamma^{n-1} r_{t+n-1} + \gamma^n \max_a Q(s_{t+n},a)\) 替代一步 TD 目标,在偏差与方差之间取得更好平衡。 +分布式 Q 学习(Distributional RL): 不只预测期望回报 \(\mathbb{E}[G]\),而是预测回报的整个分布,在风险敏感决策等场景中更有用。 5.探索策略改进
  • 从简单的 \(\epsilon\)-greedy 发展到:
    • Boltzmann / softmax 探索;
    • 参数噪声(noisy nets);
    • 基于不确定性或预测误差的探索(如随机网络蒸馏 RND,后续章节会提)。(ApX Machine Learning)
  • 对于机器人具身智能,探索必须与安全约束结合,这在后面章节(5.4、10.3)会进一步讨论。

【图 5-3 占位:DQN 改进家族示意图:从基础 DQN 出发,分叉出 Double DQN、Dueling DQN、PER、Distributional RL 等分支,形成“演化树”。】


5.2.2 策略梯度与 REINFORCE

值函数法从“状态–动作值”间接得到策略,而**策略梯度(Policy Gradient)**则是“直接把策略当成一个可微函数,显式对它做梯度上升”。这在连续动作空间或需要随机策略时尤为重要。(维基百科)


5.2.2.1 策略直接优化

1.策略参数化 用参数 \(\theta\) 表示一个可微的随机策略:

\[ \pi_\theta(a|s) \]

例如:

  • 离散动作:\(\pi_\theta(a|s)\) 是 softmax 输出的类别分布;
  • 连续动作:\(\pi_\theta(\cdot|s)\) 是高斯分布 \(\mathcal{N}(\mu_\theta(s), \Sigma_\theta(s))\)。 2.目标函数:最大化期望回报

\[ J(\theta) = \mathbb{E}_{\tau \sim \pi_\theta}\Big[ \sum_{t=0}^{T-1} \gamma^t r_{t+1} \Big] \]

其中 \(\tau\) 是一条由策略 \(\pi_\theta\) 生成的轨迹。 3.策略梯度定理(Policy Gradient Theorem) 可证明:

\[ \nabla_\theta J(\theta) = \mathbb{E}_{\pi_\theta}\bigg[ \sum_{t=0}^{T-1} \nabla_\theta \log \pi_\theta(a_t|s_t) G_t \bigg] \]

其中 \(G_t\) 是从 t 时刻开始的回报。

  • 直觉:
    • \(\nabla_\theta \log \pi_\theta(a_t|s_t)\) 表示“如何调整参数以增加该动作概率”;
    • \(G_t\) 表示“这次选择的长期收益”;
    • 两者相乘,相当于:如果某个动作带来高回报,就把它在该状态的概率往上推;如果回报差,就往下拉。 4.优点与缺点
  • 优点:
    • 可以自然处理连续动作和复杂策略结构;
    • 可以直接优化“想要的指标”(期望回报)。
  • 缺点:
    • 梯度估计通常方差较大;
    • 需要大量样本,往往是on-policy(每次更新都要采集新数据)。

5.2.2.2 REINFORCE 算法

REINFORCE是最经典、最直接的 Monte Carlo 策略梯度算法,由 Williams 在 1992 年提出。(维基百科)

1.算法核心公式 对于一条完整轨迹 \(\tau\),REINFORCE 使用:

\[ \nabla_\theta J(\theta) \approx \sum_{t=0}^{T-1} \nabla_\theta \log \pi_\theta(a_t|s_t) G_t \]

  • 其中 \(G_t = \sum_{k=t}^{T-1} \gamma^{k-t} r_{k+1}\) 为从 t 时刻开始的总回报。 2.基本算法流程(单策略网络)
  • 初始化策略参数 \(\theta\);
  • 循环直到收敛:
    1. 在当前策略 \(\pi_\theta\) 下采样若干条完整轨迹;

    2. 对每条轨迹、每个时间步计算回报 \(G_t\);(wikidocs.net)

    3. 聚合梯度:

      \[ g = \frac{1}{N}\sum_{\tau}\sum_t \nabla_\theta \log \pi_\theta(a_t|s_t) G_t \]

    4. 沿梯度上升:\(\theta \leftarrow \theta + \alpha g\)。 3.特点与局限

  • 优点:
    • 推导简单、实现方便,是理解策略梯度的最好入口;
    • 不依赖价值函数估计,适用于任意可微策略参数化。
  • 缺点:
    • 需要完整轨迹(Monte Carlo),不能实时更新;
    • 梯度估计方差非常大,收敛通常较慢;
    • 对机器人任务(特别是长时间操作)来说,样本效率偏低。

5.2.2.3 减少方差

策略梯度的一个核心实际问题是梯度估计方差太大,会导致训练过程震荡、收敛缓慢。以下是最常用的方差减少技巧。

1.基线(Baseline)思想 在公式

\[ \nabla_\theta J(\theta) = \mathbb{E}_{\pi_\theta}\big[ \nabla_\theta \log \pi_\theta(a_t|s_t) G_t \big] \]

中,我们可以减去一个与动作无关的基线 \(b(s_t)\)

\[ \nabla_\theta J(\theta) = \mathbb{E}_{\pi_\theta}\big[ \nabla_\theta \log \pi_\theta(a_t|s_t) (G_t - b(s_t)) \big] \]

只要 \(b(s_t)\) 不依赖于 \(a_t\),这个变换不会引入偏差。

  • 直观理解:
    • \(G_t\) 是“这次做完之后的实际成绩”;
    • \(b(s_t)\) 是“在当前状态下的平均水平”;
    • 只对“高于平均水平的行动”强烈鼓励,对“低于平均水平的行动”强烈惩罚,自然而然减小波动。
  • 最理想的基线是状态价值函数 \(V^\pi(s_t)\),这在 5.2.3 中会系统化为优势函数。 2.Reward-to-go 与截断回报
  • 原始 REINFORCE 若用整条轨迹总回报 \(G_0\) 作为每一个时间步的权重,会引入不必要的噪声;
  • 更常见做法是reward-to-go:每个时间步只用从该步往后的回报 \(G_t\),已经是对方差的一种显著减少。(维基百科) 3.回报 / 优势的归一化 在实践中,人们常对每个 batch 内的 \(G_t\) 或优势 \(A_t\) 做:
  • 减去均值;
  • 除以标准差。 这样能使梯度步长更稳定,也算一种简单的“数值层面”降方差策略。 4.广义优势估计(GAE,概念直觉) GAE(Generalized Advantage Estimation)将多个 n-step TD 误差按指数权重混合,形成一个在偏差与方差之间可调的优势估计:(Medium)

\[ \hat{A}_t^{\text{GAE}(\gamma,\lambda)} = \sum_{l=0}^{\infty} (\gamma\lambda)^l \delta_{t+l} \]

其中 \(\delta_t\) 是 TD 误差。

  • \(\lambda \to 1\):更接近 Monte Carlo,方差大但无偏;
  • \(\lambda \to 0\):更接近一步 TD,方差小但偏差大。 GAE 在后面 PPO 等算法中将经常出现,是现代策略梯度方法的标配组件。

【图 5-4 占位:示意图对比三种估计:纯 MC G、一步 TD 估计、GAE 估计在方差和偏差上的折衷。】


5.2.3 Actor–Critic 框架

Actor–Critic方法可以视作“**值函数法(Critic)+策略梯度法(Actor)**的融合”,同时利用值函数的低方差估计和策略梯度的灵活表达能力,是现代强化学习的主力架构。(维基百科)


5.2.3.1 Actor–Critic

1.核心构成 +Actor(策略网络):参数 \(\theta\),输出 \(\pi_\theta(a|s)\) 或确定性动作 \(\mu_\theta(s)\); +Critic(价值网络):参数 \(\displaystyle w\),估计 \(V_w(s)\) 或 \(Q_w(s,a)\)。 2.基本思想

  • Critic 根据环境给出的奖励和下一个状态,使用 TD 方法学习“这个状态/动作的好坏”;

  • Actor 使用 Critic 给出的信号(通常是优势或 TD 误差)更新策略参数,让“好动作的概率变大,坏动作的概率变小”。 3.典型 on-policy Actor–Critic 更新 以状态价值 Critic 为例(估计 \(V(s)\)):

  • 收到奖励和下一个状态后计算 TD 误差:

    \[ \delta_t = r_{t+1} + \gamma V_w(s_{t+1}) - V_w(s_t) \]

  • Critic 更新:

    \[ w \leftarrow w + \beta \delta_t \nabla_w V_w(s_t) \]

  • Actor 更新(策略梯度):

    \[ \theta \leftarrow \theta + \alpha \delta_t \nabla_\theta \log \pi_\theta(a_t|s_t) \]

    这里 \(\delta_t\) 可以理解为“当前动作的即时优势估计”。 4.与纯 REINFORCE 的区别

  • REINFORCE 使用完整回报 \(G_t\),高方差;

  • Actor–Critic 使用 TD 误差(或价值函数/优势函数),可以边交互边更新,更样本高效,方差更小

【图 5-5 占位:Actor-Critic 结构图:左侧环境,右侧两张网络:Actor 输出动作,Critic 评估状态或动作价值;Critic 的评估结果反馈给 Actor 更新策略。】


5.2.3.2 优势函数

优势函数在策略梯度与 Actor–Critic 中扮演统一角色,是理解“为什么要减 baseline”的标准形式。

1.定义 在策略 \(\pi\) 下:

\[ Q^\pi(s,a) = \mathbb{E}[G_t|s_t=s,a_t=a],\quad V^\pi(s) = \mathbb{E}_{a \sim \pi}[Q^\pi(s,a)] \]

优势函数

\[ A^\pi(s,a) = Q^\pi(s,a) - V^\pi(s) \]

  • 如果 \(A^\pi(s,a) > 0\):说明“这次选的动作比平均水平好”;
  • 如果 \(A^\pi(s,a) < 0\):说明“比平均水平差”。 2.优势函数与策略梯度 策略梯度理论告诉我们:

\[ \nabla_\theta J(\theta) = \mathbb{E}_{\pi_\theta}[ \nabla_\theta \log \pi_\theta(a|s) A^{\pi_\theta}(s,a) ] \]

优势函数自然地出现在理论公式里,相当于自动选择了最优基线 \(b(s) = V^\pi(s)\),从而在不引入偏差的前提下降低方差。(维基百科) 3.优势函数的近似方式 在实际算法中,我们无法精确求得 \(A^\pi\),通常采用近似: +一步 TD 误差

 \\[
 \hat{A}\_t = r\_{t+1} + \gamma V\_w(s\_{t+1}) - V\_w(s\_t) = \delta\_t
 \\]

+n-step 回报

\[ \hat{A}_t^{(n)} = \big( r_{t+1} + \dots + \gamma^{n-1} r_{t+n} + \gamma^n V_w(s_{t+n}) \big) - V_w(s_t) \]

+GAE:用指数衰减平均多个 TD 误差,前面已给出形式。(ApX Machine Learning)


5.2.3.3 算法示例

在 Actor–Critic 框架下,众多具体算法可以看作“在 Actor–Critic 模板上添加不同的估计方式、并行方式或约束方式”。

1.同步优势 Actor–Critic(A2C)

  • 多个并行环境同时使用同一策略 \(\pi_\theta\) 采集数据;
  • 每隔若干步把所有环境的数据合并起来,计算优势(通常用 GAE);
  • 使用统一的 Critic 和 Actor 做一次同步更新;
  • A2C 通过并行环境降低样本方差、提高训练利用率。(ApX Machine Learning) 2.异步优势 Actor–Critic(A3C)
  • 多个线程(或进程)各自与环境交互,维护本地网络副本;
  • 每个线程定期将本地梯度推送到全局网络,异步更新参数;
  • 异步探索可以自然增加策略多样性,同时减少样本间相关性。(Medium) 3.TRPO / PPO:在 Actor–Critic 上加入“安全步长约束”
  • 朴素策略梯度/Actor–Critic 容易因为一步更新过大而“策略崩溃”; +**TRPO(Trust Region Policy Optimization)**显式约束新旧策略的 KL 距离不超过某个阈值; +PPO用更简单的“剪切(clipping)”目标近似 TRPO 的信任域思想(PPO 在 5.2.4.3 专门详述)。(arXiv) 4.值函数型与策略型 Critic 的选择
  • 部分 Actor–Critic 只用 \(V(s)\) 作为 Critic(比如 A2C/A3C、PPO);
  • 另一些(如 DDPG、SAC)使用 \(Q(s,a)\) 作为 Critic,更适合与确定性或连续动作策略结合(5.2.4 将重点讨论)。

【图 5-6 占位:A2C / A3C 示意图:多环境并行生成轨迹,统一送入 Actor–Critic 更新;下方标注 TRPO/PPO 在更新时对策略变化施加约束。】


5.2.4 连续控制算法(DDPG、SAC、PPO 的核心思想)

前面介绍的 Q-Learning、DQN 主要针对离散动作空间。而在机器人具身智能中,关节位置、速度、扭矩等往往是连续控制量。DDPG、SAC、PPO 等算法正是为连续控制而设计或在连续控制上效果优异的代表。


5.2.4.1 DDPG:深度确定性策略梯度

DDPG(Deep Deterministic Policy Gradient)将 DQN 的经验回放与目标网络与确定性策略梯度结合,构建了一个适用于连续动作空间的 off-policy Actor–Critic 算法。(arXiv)

1.策略与 Critic 的形式

  • Actor:确定性策略 \(\mu_\theta(s)\),直接输出连续动作,如关节角速度向量;
  • Critic:Q 网络 \(Q_w(s,a)\),输入状态和动作,输出对应的 Q 值。 2.Critic 更新 与 DQN 类似,对每条经验 \(\displaystyle (s,a,r,s')\),构造目标:

\[ y = r + \gamma Q_{w^-}(s', \mu_{\theta^-}(s')) \]

  • \(w^-, \theta^-\) 是目标网络参数,缓慢跟随在线网络更新;
  • 最小化 \((y - Q_w(s,a))^2\) 更新 Critic。 3.Actor 更新:确定性策略梯度 对连续动作的确定性策略,可以推导得到:(arXiv)

\[ \nabla_\theta J(\theta) \approx \mathbb{E}_{s \sim \mathcal{D}} \big[ \nabla_a Q_w(s,a)|_{a=\mu_\theta(s)} \cdot \nabla_\theta \mu_\theta(s) \big] \]

即:

  • 用 Critic 告诉 Actor:在当前状态下,往哪个方向改变动作可以增加 Q 值;
  • Actor 再通过链式法则更新参数,使输出动作朝“价值更高的方向”变化。 4.探索策略:动作空间加噪声 因为 Actor 输出的是确定性动作,探索需要通过在执行时加入噪声:

\[ a_t = \mu_\theta(s_t) + \mathcal{N}_t \]

  • 经典做法使用 Ornstein–Uhlenbeck 过程噪声,模拟物理系统中带惯性的随机扰动。(arXiv) 5.特点与局限
  • 优点:
    • 可以利用 off-policy + Replay Buffer,样本效率比 on-policy 更好;
    • 适用于复杂连续控制任务,在早期连续控制基准上表现优异。
  • 局限:
    • 对超参数、网络初始化等较敏感;
    • 易出现训练不稳定、发散,探索也可能不充分;
  • 实践中经常配合更多技巧,如双 Q 网络(TD3)、延迟更新等加强稳定性。

【图 5-7 占位:DDPG 框架示意图:Actor 输出连续动作,执行时加噪声;Critic 评估 Q 值;Replay Buffer + 目标网络的结构与 DQN 类似。】


5.2.4.2 SAC:软 Actor–Critic 与最大熵强化学习

**SAC(Soft Actor–Critic)是近几年连续控制领域非常流行的算法之一,基于最大熵强化学习(maximum entropy RL)**思想:

不仅要获得高回报,还要让策略尽可能“随机”一些,以鼓励探索和鲁棒性。(arXiv)

1.最大熵目标 标准 RL 只最大化回报:

\[ J(\pi) = \mathbb{E}\Big[\sum_t \gamma^t r_t\Big] \]

SAC 引入熵正则项:

\[ J_{\text{soft}}(\pi) = \mathbb{E}\Big[\sum_t \gamma^t (r_t + \alpha \mathcal{H}(\pi(\cdot|s_t)))\Big] \]

  • \(\mathcal{H}\) 是策略的熵,\(\alpha\) 是温度系数;

  • 直觉:在获得类似回报的策略中,更偏好“动作更随机”的策略,因为它们通常探索更充分、对模型误差更鲁棒。 2.结构:随机 Actor + 双 Q Critic

  • Actor:随机策略 \(\pi_\theta(a|s)\),通常为高斯分布经过 \(\tanh\) 压缩到动作范围;

  • Critic:两个 Q 网络 \((Q_{w_1}, Q_{w_2})\) 来减轻过估计偏差;

  • 目标值使用“软”备份:

    \[ y = r + \gamma \big( \min_{i=1,2} Q_{w_i^-}(s',a') - \alpha \log \pi_\theta(a'|s') \big) \]

    其中 \(a' \sim \pi_\theta(\cdot|s')\)。 3.Actor 更新:最小化“soft Q - entropy”目标 Actor 更新等价于最小化:

\[ J_\pi(\theta) = \mathbb{E}_{s \sim \mathcal{D}, a \sim \pi_\theta} \big[ \alpha \log \pi_\theta(a|s) - Q_w(s,a) \big] \]

  • 如果对某个 \((s,a)\) 的 Q 值较高,梯度会推动策略提高该动作概率;
  • 同时 \(\alpha \log \pi\) 项推动策略保持一定随机性。 4.温度 \(\alpha\) 的自动调节 实践中,SAC 通常自动学习 \(\alpha\),使策略的熵接近一个目标值(例如期望熵)。
  • 这避免了人工手动调温度的困难,使算法更加稳健。(arXiv) 5.SAC 的优势
  • Off-policy,样本效率高;
  • 训练稳定性好,对超参数不那么敏感;
  • 在 Mujoco 等连续控制基准上表现强劲,已成为真实机器人实验中常用的 RL 算法之一。

【图 5-8 占位:SAC 结构图:随机策略输出高斯参数,经 Tanh 得到动作;双 Q 网络估计 soft Q;目标中含有熵项,旁边用文字标出“高回报 + 高熵”。】


5.2.4.3 PPO:近端策略优化

PPO(Proximal Policy Optimization)是一种on-policy Actor–Critic 算法,以其实现简单、性能稳定而被广泛采用,尤其是在连续控制任务中。(arXiv)

1.问题:普通策略梯度更新太“凶猛”

  • Vanilla Policy Gradient 或基础 Actor–Critic 在一次更新中如果步长过大,可能导致新策略与旧策略差别过大,性能骤降;
  • TRPO 通过显式 KL 约束解决,但实现复杂、计算开销较高。 2.PPO 的核心:剪切(Clipped)目标函数 设旧策略参数为 \(\theta_{\text{old}}\),新策略为 \(\theta\),定义概率比:

\[ r_t(\theta) = \frac{\pi_\theta(a_t|s_t)}{\pi_{\theta_{\text{old}}}(a_t|s_t)} \]

以及优势估计 \(\hat{A}_t\)(例如用 GAE)。

  • 未剪切的策略梯度目标:

    \[ L^{\text{PG}}(\theta) = \mathbb{E}[ r_t(\theta) \hat{A}_t ] \]

  • PPO 的剪切目标:

    \[ L^{\text{CLIP}}(\theta) = \mathbb{E}\big[ \min\big( r_t(\theta)\hat{A}_t, \text{clip}(r_t(\theta), 1-\epsilon, 1+\epsilon)\hat{A}_t \big) \big] \]

    含义:

  • 如果新旧策略差别不大(\(r_t\) 在 \([1-\epsilon, 1+\epsilon]\) 内),目标与普通 PG 相同;

  • 一旦 \(r_t\) 试图偏离这个区间,\(\text{clip}\) 会“拉回”,使得过大的变化不会继续被鼓励。 3.完整损失函数 实际上,PPO 一般同时优化三部分:(arXiv)

\[ L(\theta) = \mathbb{E}\big[ L^{\text{CLIP}}(\theta) \quad + c_1 (V_\theta(s_t) - V^{\text{target}}_t)^2 \quad + c_2 \mathcal{H}(\pi_\theta(\cdot|s_t)) \big] \]

  • 第一项:策略更新(剪切目标);
  • 第二项:价值函数回归损失;
  • 第三项:熵正则(鼓励一定探索)。 4.训练流程特点
  • 与 vanilla PG 不同,PPO 会对同一批轨迹做多轮小批量梯度更新,提高样本利用率;
  • 常搭配 GAE 估计优势;
  • 一般使用并行环境(多进程采样)提升效率。 5.在机器人任务中的角色
  • 优点:
    • 实现简单、稳定性好,成为许多 RL 库的默认连续控制算法(如 OpenAI Baselines、RLlib 等);
    • 对超参数较为宽容,适合做研究原型和仿真实验。
  • 局限:
    • on-policy,样本利用率低,相比 SAC 等 off-policy 算法,在真实机器人上成本较高;
  • 实践中常见模式:
    • 在大规模仿真中先用 PPO 训练一个合理策略,再在真实机器人上用 SAC 或离线 RL 进行精调。

【图 5-9 占位:PPO 训练循环示意图:并行环境生成轨迹 → 计算 GAE 优势 → 使用 CLIP 目标做多轮梯度更新;在图中标出 \(r(\theta)\)、\(\mathrm{clip}(\cdot)\) 和 KL 限制直观关系。】


本节从值函数法(Q-Learning/DQN)出发,逐步过渡到策略梯度与 REINFORCE,再走向Actor–Critic 框架,最终落到在机器人连续控制中最常用的三类算法 DDPG、SAC、PPO。后续章节将以这些算法为“工具箱”,结合模仿学习、VLA 预训练等内容,构建真正能在现实世界中“看、听、动”的具身智能系统。

本章小结与自测

三行小结

  1. 本章打通 RL 与 IL 的核心概念和常用算法。
  2. 重点是数据分布、目标函数与稳定训练的平衡。
  3. 学完后应能解释“何时 BC、何时 RL、何时混合”。

检查题

  1. 用你自己的话总结本章最核心的一个公式/机制。
  2. 给出一个“如果要落地到项目里,你会怎么用”的具体例子。

常见误区

  1. 把离线指标当在线性能。
  2. 忽视分布偏移。
  3. 奖励设计过稀疏或可被投机。

公式到代码(最小示例)

rewards = [0.0, 0.0, 1.0]
gamma = 0.99
G = 0.0
for r in reversed(rewards):
    G = r + gamma * G
print(round(G, 6))

本章外部参考(集中)

  1. ApX Machine Learning
  2. Nature
  3. ResearchGate
  4. ApX Machine Learning
  5. 维基百科
  6. wikidocs.net
  7. Medium
  8. 维基百科
  9. arXiv
  10. arXiv
  11. arXiv
  12. arXiv

5.3 模仿学习与行为克隆

5.3.1 行为克隆(Behavior Cloning,BC)问题设定

学习导航

  • 本章主题:5.3.1 行为克隆(Behavior Cloning,BC)问题设定
  • 前置知识:建议先完成第 1-2 章,再进入 RL/IL。
  • 建议用时:91-111 分钟
  • 阅读顺序:先看概念框架,再看公式/代码,最后做自测。

关键图示:模仿学习与强化学习组合

关键图示:模仿学习与强化学习组合

5.3.1.1 模仿学习

在前面的强化学习部分,我们假设智能体可以与环境“自己玩”,通过试错不断积累经验;而在很多真实机器人场景中,这样做要么太慢,要么太危险——机械臂乱挥可能砸坏设备,无人车乱试可能直接上墙。

**模仿学习(Imitation Learning, IL)**就是在这样的背景下提出的: 给定专家示范(demonstrations),希望训练一个策略来“学会像专家那样做”,尽量少或者不与环境进行额外交互。直观地说,就是:

不让机器人自己闯祸,而是先让它“看高手怎么玩”,然后学着照做。

更形式一点,可以把模仿学习看成:在一个已知或未知的 MDP 环境中,给定若干专家轨迹

\[ \tau_i = (s_0^i, a_0^i, s_1^i, a_1^i, \dots, s_{T_i}^i), \]

这些轨迹由某个专家策略 \(\pi^*\) 生成,我们希望学得一个策略 \(\hat\pi\),其表现尽量接近甚至优于 \(\pi^*\)。系统性的综述指出,模仿学习已经在自动驾驶、机器人抓取与操作等领域得到广泛应用。(arXiv)

从方法上看,大部分模仿学习可以粗略分为两类:

1.直接模仿专家策略

  • 典型代表就是行为克隆(Behavior Cloning),把模仿学习问题转化为一个标准的监督学习问题; 2.“反推”专家在优化什么
  • 即逆强化学习(IRL),先根据示范恢复一个奖励函数,再在该奖励下做强化学习。

本节的 5.3.1–5.3.2 主要关注第一类(直接模仿策略),5.3.3 再转向 IRL 与奖励学习。

在机器人具身智能场景中,示范往往来自:

  • 人类遥操作(teleoperation)生成的轨迹;
  • 人手带动机械臂的 kinesthetic teaching;
  • 规划器、控制器在仿真中执行任务得到的自动演示。

这些在第 7 章会展开,这里先把它们当作“已经有了一堆轨迹数据”的前提。


5.3.1.2 行为克隆

**行为克隆(Behavior Cloning, BC)**是最直接的模仿学习形式:

把“观察状态→输出动作”当成一个监督学习任务,拿专家动作当标签,训练一个函数拟合器。

具体设定如下:

  • 通过专家与环境交互,收集一个数据集

    \[ \mathcal D = {(s_t^i, a_t^i)}_{i,t}, \]

    其中 \(s_t^i\) 是第 \(\displaystyle i\) 条轨迹在时刻 \(\displaystyle t\) 的状态,\(a_t^i\) 是专家在该状态下执行的动作;

  • 选取一个参数化策略 \(\pi_\theta(a|s)\)(例如深度神经网络),

  • 通过最小化监督学习损失来拟合专家:

    \[ \min_\theta ; \mathbb E_{(s,a)\sim \mathcal D}\big[l\big(\pi_\theta(\cdot|s), a\big)\big], \]

    • 离散动作:\(\displaystyle l\) 通常是交叉熵损失;
    • 连续动作:\(\displaystyle l\) 可以是均方误差(MSE),或者假设高斯策略用负对数似然。

早在 1980s 的 ALVINN 无人车项目中,就已经使用行为克隆将前视相机图像直接映射到方向盘角度,实现端到端的道路跟随,可视为模仿学习最早的成功案例之一。(NeurIPS论文)

在具身机器人中,行为克隆的典型用法包括:

+机械臂抓取与放置

  • 输入:当前 RGB-D 图像 + 机械臂末端位姿;
  • 输出:末端位姿增量或关节增量; +移动机器人导航
  • 输入:前视摄像头图像 / 激光雷达扫描;
  • 输出:线速度、角速度命令。

【图 5-3-1 占位】 建议插图:示意“行为克隆管线”:左侧是专家示范的图像与动作序列,中间是一个神经网络,右侧是克隆后的策略在相似场景中输出动作。

在实现上,行为克隆几乎和训练一个普通分类 / 回归模型没有区别: 只要能把状态编码为特征,把动作编码为标签,就可以用任意深度学习框架进行训练,这也是它在工程实践中被广泛采用的原因。


5.3.1.3 前提假设

行为克隆之所以“好用”,背后有几条往往被忽略但非常关键的前提假设

1.专家接近最优(Optimality assumption)

  • 假设示范来自一个接近任务最优或至少“足够好”的策略;
  • 若专家本身就经常犯错(例如人类新手操作),BC 只会稳定地学会“错误的习惯”;
  • 后续很多工作研究如何从非最优示范中学习,这在 IRL 与奖励学习里尤为重要。(牛津大学机器人研究所) 2.示范覆盖测试时会遇到的状态分布(Coverage assumption)
  • 训练时,状态是从专家策略诱导的分布 \(d_{\pi^*}(s)\) 中采样的;
  • 测试时,机器人按自己的策略 \(\hat\pi\) 行动,状态分布变为 \(d_{\hat\pi}(s)\);
  • BC 隐含假设:\(d_{\hat\pi} \approx d_{\pi^*}\),也就是机器人不会走到专家“没去过”的地方;
  • 实际上只要策略略有偏差,就可能逐步偏离专家轨迹,进入数据集外的状态,带来严重问题(下一小节的“分布偏移”)。 3.观测与动作标注准确
  • 假设传感器标定正确、时间同步良好,状态–动作对 \((s_t, a_t)\) 没有系统偏差;
  • 在真实机器人系统中,延迟、丢帧、标定误差会导致“错误配对”(比如相机图像实际上对应的是 100 ms 前的动作);
  • 这类误差会直接体现在监督信号中,使得 BC 很难学到稳定策略。 4.具身配置一致
  • 假设专家和学习者的身体(embodiment)相同或足够接近,如同一型号的机械臂;
  • 若专家是人类的手,而学习者是 7 自由度机械臂,则需要解决“动作空间映射”问题,单纯行为克隆就不够。

这些假设在实验室简单任务中勉强成立,但在开放环境、长时间操作的具身智能场景下往往会被打破。 其中状态分布覆盖问题最为致命,它直接导致了行为克隆中经常出现的“开始很像专家,过一会儿就崩掉”的现象——这就是 5.3.2 要讨论的核心:分布偏移与 DAgger


5.3.2 分布偏移与 DAgger 思想

5.3.2.1 分布偏移

在监督学习中,通常假设训练集和测试集来自同一分布。 行为克隆却非常“狡猾”地违反了这个假设:

  • 训练阶段:
    • 状态来自专家策略 \(\pi^*\) 的轨迹,分布记为 \(d_{\pi^*}(s)\);
  • 测试阶段:
    • 机器人执行的是自己学到的策略 \(\hat\pi\),状态分布变为 \(d_{\hat\pi}(s)\)。

只要 \(\hat\pi\) 和 \(\pi^*\) 不完全相同,两者的分布就会有差异,这种差异随着时间步数增长会不断放大

  • 在每一步,策略以概率 \(\varepsilon\) 选错动作;
  • 一次小小的偏差可能把系统带到新的状态区域,在那里策略从未见过数据;
  • 在这个新区域里错误率往往更高,于是进一步走向更“奇怪”的状态……

这是经典的误差累积问题(compounding error): 理论分析表明,在行为克隆中,某些任务下最终性能损失可以和时间跨度 \(\displaystyle T\) 的平方成正比(\(O(T^2 \varepsilon)\)),这意味着长时任务在 BC 中特别容易崩坏。(Stanford University)

在具身机器人场景中,具体表现例如:

  • 移动机器人学会跟随走廊中线,刚开始几米看起来很稳,一旦稍微偏离,之后误差越积越大,最终撞墙;
  • 机械臂在抓取任务中,只要一次对准偏差,之后的抓取、提起、放置动作都会在“错误位姿”附近执行,导致任务失败。

【图 5-3-2 占位】 建议插图:横轴为时间步,纵轴为轨迹偏离量;画出“专家轨迹”与“BC 策略轨迹”的对比,展示误差如何随时间累积。

解决分布偏移问题的关键思路就是:让训练中看到的状态,尽可能接近自己将来真正会遇到的状态,这就引出了 DAgger。


5.3.2.2 DAgger 算法

DAgger(Dataset Aggregation)是 Ross 等人提出的一类交互式模仿学习算法,其核心思想可以用一句话概括:

不再只在专家访问的状态上训练,而是在当前学到的策略会访问到的状态上,请专家标注动作,并不断把这些新样本加入训练集。(cs.cmu.edu)

用更程序化的方式描述 DAgger:

1.初始化

  • 用纯专家示范数据 \(\mathcal D_0\) 做一次行为克隆,得到初始策略 \(\pi_1\)。 2.第 \(k\) 次迭代(交互与标注)
  1. 用当前策略 \(\pi_k\) 与环境交互,收集新的状态序列

    \[ \tau^{(k)} = (s_0^{(k)}, s_1^{(k)}, \dots, s_T^{(k)}), \]

    此时状态分布是 \(d_{\pi_k}(s)\);

  2. 对这些状态,请专家给出“正确动作” \(a_t^{(k,*)}\),得到新数据集

    \[ \mathcal D_k = {(s_t^{(k)}, a_t^{(k,*)})}_t \]

  3. 数据聚合:\(\mathcal D \leftarrow \mathcal D \cup \mathcal D_k\);

  4. 在新的聚合数据集 \(\mathcal D\) 上重新训练策略,得到 \(\pi_{k+1}\)。 3.停止条件

  • 当策略性能收敛、或者达到预定迭代轮数时停止,
  • 最终可使用最后一次策略 \(\pi_K\),或某种平均策略。

相对行为克隆,DAgger 有几个关键特征:

+训练分布匹配测试分布

  • 每一轮训练都在更接近 \(\pi_k\) 自己将会访问的状态分布上进行,避免了“只在专家访问区域表现好”; +理论保证更强
  • 在一定条件下,如果用于监督学习的基础算法具备“无遗憾(no-regret)”性质,则 DAgger 可以将性能损失从 \(O(T^2\varepsilon)\) 改善到 \(O(T\varepsilon)\); +工程直觉:不断在线纠偏
  • 机器人在自己“犯错”的状态下会收到专家纠正,这类似于人类教练随时在旁边拉一把。

【图 5-3-3 占位】 建议插图:画出 DAgger 的循环流程图: 「当前策略执行 → 产生新状态 → 专家标注动作 → 数据聚合 → 重新训练策略」,形成闭环。

在机器人实验中,DAgger 通常通过遥操作界面实现: 机器人执行自己的策略,人类在旁边监控,一旦发现动作不合理,就接管并给出“应当采取的动作”,系统则记录下“状态–专家动作对”,用于后续训练。


5.3.2.3 反复迭代

从实现角度看,DAgger 不是“只多了一轮训练”,而是设计一个长期人机协作的训练流程

+迭代次数的权衡

  • 迭代太少,策略仍然对自身造成的状态分布偏移不够鲁棒;
  • 迭代太多,人类标注成本和机器人运行时间会很高;
  • 实际工程中常采用:先用 BC 预训练,再做有限轮 DAgger(例如 3–5 轮),即可显著提升性能。 +安全与交互方式
  • 在真实机器人上执行 DAgger 时,必须保证人类可以随时接管或触发急停;
  • 一种常见做法是:机器人处于“半自动模式”,每步先给出自己的动作建议,人类有机会审批 / 修改,系统记录最终执行的“专家版本”动作; +主动查询与不确定性
  • 后续许多工作扩展了 DAgger,只在“模型不自信”的状态上向专家询问动作,从而减少标注负担;
  • 对具身智能系统来说,这类“有选择地向人类提问”的机制尤为重要,因为真实实验成本极高。(wensun.github.io)

从全书结构上看,BC 与 DAgger 提供了一套纯基于示范的数据驱动建模方式, 在第 9 章中我们会看到,BC 也可以被视作“最简单的离线 RL 方法”,而 DAgger 则是走向“交互式模仿 + 在线纠错”的第一步。


5.3.3 逆强化学习与奖励学习的基本概念

5.3.3.1 逆强化学习(IRL)

行为克隆的思路是:直接学“怎么做”; 逆强化学习(Inverse Reinforcement Learning, IRL)的思路则是:

先学“专家在乎什么”(奖励函数),再让强化学习去自己发现“怎么做”。

经典定义是:给定一个 MDP 的状态空间、动作空间和转移动力学,以及一组由专家策略产生的行为轨迹,求解一个奖励函数 \(r(s,a)\),使得专家策略在该奖励下是最优或近似最优。(ai.stanford.edu)

形式上可以写成:

  • 已知:\(\mathcal S, \mathcal A, P, \gamma\) 和专家轨迹集合 \(\{\tau_i\}\);
  • 未知:奖励函数 \(r_\theta(s,a)\);
  • 目标:找到某个 \(r_\theta\),使得在 MDP \(\mathcal S,\mathcal A,P,r_\theta,\gamma\) 上求解得到的最优策略 \(\pi^*_\theta\) 与专家行为尽量一致。

IRL 的直觉在机器人中非常自然:

  • 行为只是表象,奖励才是“偏好”
  • 一旦学得了“偏好”,可以在新环境、不同初始条件下重新规划,而不必局限在原有示范分布内;
  • 例如:
    • 学习自动驾驶中“安全、平稳、尽量快速”的组合偏好,
    • 学习机械臂装配任务中“避免碰撞、保证插入成功”的综合奖励。

IRL 的典型算法包括最大间隔 IRL、最大熵 IRL 等,它们通常需要在“内层”反复调用 RL 算法来评估一个候选奖励函数有多“好”,因此计算开销相对行为克隆要大得多。(ai.stanford.edu)

【图 5-3-4 占位】 建议插图:对比“正向 RL”与“逆向 RL”的流程:

  • RL:已知奖励 → 求策略;
  • IRL:观察策略(示范) → 反推奖励。

5.3.3.2 奖励建模

在更广义的视角下,**奖励学习 / 奖励建模(reward learning / reward modeling)**指的是:

通过数据(示范、偏好、规则等)来学习一个奖励模型 \(\hat r_\phi\), 在此基础上再用 RL 优化策略。

相对于“严格的 IRL”,实际系统中的奖励建模往往更“务实”:

1.输入形式更灵活

  • 不仅可以使用专家轨迹;
  • 还可以使用人类对机器人行为的打分 / 排序、语言评价,甚至环境中的自动指标(例如任务是否完成)。 2.输出形式多样
  • 状态–动作级别奖励 \(\hat r_\phi(s,a)\);
  • 整条轨迹级别评分 \(\hat r_\phi(\tau)\);
  • 分段的子任务奖励(例如“抓取成功”“姿态舒适”“能量消耗少”)。 3.训练方式灵活
  • 可以做二分类(好 vs 坏行为)、回归(连续评分)、排序学习(偏好建模);
  • LLM 的 RLHF(人类反馈强化学习)就是一个著名的奖励建模实例:从人类对多个回答的排序中学一个奖励函数,然后用 RL 调整语言模型。

在机器人具身任务中,奖励建模尤其适用于那些难以手工写出奖励函数的目标,例如:

  • “端杯子走路时既不洒水,又看起来自然不抖”;
  • “整理桌面时,既要完成用户指令,又要保持整体美观、避免过度移动无关物体”。

此时直接对奖励建模,比尝试写一大堆手工 reward term 更现实。


5.3.3.3 优缺点

把行为克隆、IRL 和更广义的奖励建模放在一起,可以看到它们各有优势与短板:(ScienceDirect)

1.行为克隆(BC) +优点: + 算法与实现极其简单,可直接复用监督学习工具链; + 不依赖环境奖励信号,适合“只有示范、没有 reward”的场景; + 训练速度快,工程上容易部署。 +缺点: + 严重依赖示范质量与覆盖范围,分布偏移导致长时任务表现差; + 无法超越专家,理论性能上限受示范策略限制; + 没有显式奖励函数,不利于解释与迁移到新环境。 2.逆强化学习(IRL) +优点: + 得到的是奖励函数而非单个策略,天然更易迁移到新环境、新约束; + 奖励具有一定可解释性,有助于理解专家偏好与安全约束; + 在示范较有限、但动力学可知的场景中(如模拟器)具有潜在优势。 +缺点: + 问题本身是“不适定”的:许多不同的奖励函数都可能解释同样的行为; + 算法通常需要“外层学奖励 + 内层跑 RL”的双层优化,计算和样本成本高; + 在高维连续机器人场景中,稳定且可扩展的 IRL 算法仍是研究热点。 3.奖励建模 / 偏好学习 +优点: + 可以利用丰富的人类反馈(打分、对比、语言描述),不局限于轨迹本身; + 适合描述复杂、模糊、难以形式化的目标(“自然”“舒适”“礼貌”); + 奠定了像 RLHF 这样“对齐”技术的基础,可用于具身机器人的安全约束学习。 +缺点: + 奖励模型有可能被策略“利用”(reward hacking),表现看似好,实际行为不符合人类期待; + 需要持续维护奖励模型与策略之间的一致性,否则训练后期策略会“偏离标尺”; + 人类偏好本身存在噪声和主观性,建模难度较大。

从本书的长远视角看:

  • BC 适合作为快速启蒙方法,为机器人提供一个能“基本完成任务”的起点;
  • IRL 与奖励建模则更像是在搭建机器人“价值观”的框架,
  • 它们与下一节的离线 RL一起,构成从纯示范走向“数据 + 偏好 + 自主优化”的通路。

5.3.4 离线数据与离线 RL 的简单认识

5.3.4.1 离线 RL

在前文的强化学习章节中,我们默认智能体在训练时可以不断与环境交互、采样新数据; 但在真实系统中,这种“在线试错”往往成本高昂乃至不可行:

  • 真实机器人磨损、耗材严重;
  • 某些操作具有安全风险(自动驾驶、手术机器人等);
  • 有时我们手上已经有大量历史日志数据,却无法再轻松重复采集。

**离线强化学习(Offline RL,亦称 Batch RL)**正是针对这一需求提出的:

在训练期间,算法只能访问一个固定的、预先收集好的数据集, 不允许再与环境进行额外交互,从而学习一个能够在环境中执行的策略。(arXiv)

形式化地说,离线 RL 给定的是一个静态数据集

\[ \mathcal D = {(s_t, a_t, r_t, s_{t+1})}, \]

这些数据由某个(可能未知的)行为策略 \(\mu(a|s)\) 产生。 目标是在**只使用 \(\mathcal D\)**的前提下,学习一个新的策略 \(\pi(a|s)\), 在真实环境中执行时获得尽可能高的回报。

与模仿学习相比:

  • BC / IL 通常只用到 \((s_t, a_t)\),不关心 \(r_t\);
  • 离线 RL 则以奖励为核心,会尝试“重新优化”策略,甚至超越原数据中的行为策略;
  • 在具身机器人背景下,离线 RL 希望把已有的遥操作日志、历史任务执行轨迹,变成一个可以泛化到新情形的决策引擎

5.3.4.2 挑战

离线 RL 看起来像是“把 RL 变成监督学习”,实则难度颇高。 核心困难来自于:我们在训练时看不到策略在“新状态–动作”上的真实后果,却又必须对它们做出估计

主要挑战包括:(arXiv)

1.分布外行动与外推误差(Extrapolation Error)

  • 标准的 Q-learning 等方法会估计 \(Q(s,a)\),并通过

    \[ Q(s,a) \leftarrow r + \gamma \max_{a'} Q(s', a') \]

    来更新;

  • 在离线设置中,如果某个动作 \(\displaystyle a\) 在状态 \(\displaystyle s\) 上几乎从未在数据集中出现, 则 \(Q(s,a)\) 完全来自函数逼近的“外推”——既没有真实经验支撑,又被“max”操作放大;

  • 结果是算法可能对数据集中从未出现过的动作估计出很高的 Q 值, 导致最终策略在真实环境中选择这些“虚假的高价值动作”,表现极差。 2.数据覆盖度与行为策略偏差

  • 如果离线数据只覆盖了极少量任务情形(例如机械臂只在桌子中央抓取某个物体), 那么离线 RL 几乎无法学到在其他场景下的合理策略;

  • 行为策略若过于保守(例如人类操作非常谨慎,只在安全区域活动), 离线 RL 想要学习“更激进、更高回报”的策略,就会严重依赖外推,风险更高。 3.离线策略评估困难(Offline Policy Evaluation)

  • 在没有新交互的前提下,我们只能通过已有数据间接估计一个新策略的性能,

  • 这需要重要性采样、模型估计或其它复杂技术,且方差通常很大;

  • 对机器人任务来说,这直接影响到“什么时候敢在真实机器人上部署”这一关键决策。 4.真实机器人系统的高维与噪声

  • 视觉输入、高维连续动作、噪声传感器等因素,使得函数逼近更困难,

  • 任何小的外推错误都可能被放大成物理世界中的灾难性行为。

这些挑战意味着:

“把在线 RL 代码里采样环境的那几行换成读数据集”,并不能自动得到一个可用的离线 RL 算法。

需要专门的离线方法来控制外推范围、正则化策略,保证学习过程的保守性。


5.3.4.3 方法概览

针对上述挑战,近年来离线 RL 形成了几条主要思路(在第 9 章会以更系统方式展开,此处只做概览):(arXiv)

1.保守 / 约束型值函数方法

  • 核心思想:惩罚那些远离数据分布的状态–动作, 让 Q 函数在数据支持不足的地方更保守,避免虚假的高估;
  • 代表性做法:
    • BCQ(Batch-Constrained Q-learning):限制策略选择动作时,只从“看起来像是数据中出现过的动作”中采样;
    • CQL(Conservative Q-Learning):在目标中加入正则项,使得数据集外动作的 Q 值被压低;
    • 各类行为正则化方法(如在策略更新时约束 \(\pi\) 与行为策略 \(\mu\) 的 KL 距离)。 2.策略约束与行为克隆正则(Behavior Regularization)
  • 将行为克隆与 RL 目标结合:
    • 一方面最大化估计回报;
    • 另一方面保持策略不要偏离数据中行为太远;
  • 直觉:
    • 只在“稍微改善”行为的局部空间内优化,
    • 不要一下子跳到数据集中从未尝试过的极端动作。 3.模型化离线 RL(Model-based Offline RL)
  • 先用离线数据学习一个环境动力学模型 \(\hat P(s'|s,a)\) 和奖励模型 \(\hat r(s,a)\);
  • 再在这个“学得的模型”里进行规划或 RL;
  • 同样需要通过不确定性估计(例如对模型输出方差建模)来避免在模型不可信区域过度使用外推。 4.BC 与离线 RL 的组合
  • 行为克隆本质上可以看作一种极端保守的离线 RL:
    • 完全不尝试优化超越行为策略,只在数据分布上拟合专家动作;
  • 最近一些工作指出,在许多实际任务中,简单 BC + 适当数据清洗 就能达到甚至接近更复杂离线 RL 算法的性能;
  • 对机器人来说,常见的实践策略是:
    • 先用 BC 得到一个可靠、稳定的初始策略;
    • 再在此基础上使用保守的离线 RL 微调,希望在安全范围内挖掘额外性能。

【图 5-3-5 占位】 建议插图:对比“在线 RL”与“离线 RL”的示意图:

  • 在线 RL:策略 ↔ 环境,有交互箭头;
  • 离线 RL:策略只连接到一个“固定数据集”方框,箭头从历史日志指向学习算法。

从具身智能的视角看,离线 RL 提供了一条把已有的模仿示范、运行日志、互联网视频 都转化为“可用于决策优化的经验”的路径。 在后续章节中,我们会多次看到模仿学习、奖励学习和离线 RL 如何交织在一起:

  • 用 BC 和 IRL 从示范中挖掘初始策略与价值观,
  • 再用离线 RL 在庞大异质数据上做统一提升,
  • 最终形成可泛化、多任务、可部署的机器人 VLA 模型。

本章小结与自测

三行小结

  1. 本章打通 RL 与 IL 的核心概念和常用算法。
  2. 重点是数据分布、目标函数与稳定训练的平衡。
  3. 学完后应能解释“何时 BC、何时 RL、何时混合”。

检查题

  1. 用你自己的话总结本章最核心的一个公式/机制。
  2. 给出一个“如果要落地到项目里,你会怎么用”的具体例子。

常见误区

  1. 把离线指标当在线性能。
  2. 忽视分布偏移。
  3. 奖励设计过稀疏或可被投机。

公式到代码(最小示例)

rewards = [0.0, 0.0, 1.0]
gamma = 0.99
G = 0.0
for r in reversed(rewards):
    G = r + gamma * G
print(round(G, 6))

本章外部参考(集中)

  1. arXiv
  2. NeurIPS论文
  3. 牛津大学机器人研究所
  4. Stanford University
  5. cs.cmu.edu
  6. wensun.github.io
  7. ai.stanford.edu
  8. ScienceDirect
  9. arXiv
  10. arXiv

5.4 机器人学习中的实践要点

5.4.1 样本效率与真实机器人数据的昂贵性

学习导航

  • 本章主题:5.4.1 样本效率与真实机器人数据的昂贵性
  • 前置知识:建议先完成第 1-2 章,再进入 RL/IL。
  • 建议用时:54-74 分钟
  • 阅读顺序:先看概念框架,再看公式/代码,最后做自测。

5.4.1.1 样本效率

在纯模拟的强化学习论文里,经常可以看到“训练 5e7 step 后收敛”之类的描述。对于 Atari 或 MuJoCo 虚拟环境,这只是几小时到几天的 GPU 时间;但如果每一步都是一个真实机器人动作,这个数量级就完全不可接受了。大量调研都指出,深度强化学习在机器人上的一个核心瓶颈就是样本效率过低。(年评审)

导致样本效率低的典型原因包括:

+高维连续状态与动作空间 机械臂、移动平台往往有十几个自由度,每一步决策都在高维连续空间中“摸索”,需要大量试错才能找到高回报区域。 +稀疏奖励与长时间尺度 把物体从桌上抓起再放入盒子,可能需要几十上百步,只有最后一步才有“成功/失败”奖励,前面的动作很难精确归因(credit assignment),导致学习过程需要更多数据来估计价值函数。 +策略分布随训练不断变化 策略更新会改变数据分布,旧数据迅速“过时”,大量交互样本很快失效,只能不断采集新数据,这进一步放大了对真实交互的需求。

在真实机器人实验中,为了避免损坏设备和占用实验平台,研究者通常只能使用几十到几百小时的机器人交互数据,这和许多仿真 RL 工作动辄数千万步的规模相比差了几个数量级。(年评审)

【图 5-4-1 占位】对比示意图:左边是游戏/仿真 RL 常用的“1e7–1e8 step”训练曲线,右边是真实机器人实验可承受的“1e4–1e6 step”范围,用条形图或对数坐标展示数量级差异。

5.4.1.2 数据收集成本

真实机器人数据的“贵”,不仅仅是时间长,还体现在多维度的实际成本上:(年评审)

1.硬件磨损与维护成本

  • 关节减速器、丝杠、力传感器都有寿命,频繁的高频动作会加速老化。
  • 一次碰撞可能带来昂贵的维修费用,尤其是高端协作机械臂或移动平台。 2.人力与场地成本
  • 真实机器人 RL 通常需要人值守:重置场景、拾起摔落的物体、处理急停。
  • 实验室场地有限,一套机器人往往同时服务多个课题,长时间“刷数据”会挤占其他实验。 3.任务物料与布景成本
  • 抓取易碎物体(玻璃、电子元件)可能导致物品损耗。
  • 复杂场景(例如厨房、仓储)搭建与维护本身就需要资源。 4.数据工程成本
  • 多模态数据(图像、深度、关节状态、力矩、语言指令)需要同步、存储与管理。
  • 为 RL/模仿学习准备“可复现、可回放”的轨迹格式,并进行清洗、标注,也是大量工程工作(第 7 章会展开)。

因此,真实机器人上的“再多收一点数据试试”并不是一个轻松的选项,算法层面的样本效率提升几乎是刚需

5.4.1.3 提高效率

为了在现实硬件约束下仍然能训练出足够好的策略,近年的研究主要从以下几个方向提升样本效率:(年评审)

1.更高效的强化学习算法设计 +离线 / 离策略(off-policy)RL:充分复用已有轨迹(包括旧策略数据、人类示教数据),减少必须在线收集的步数。 +模型式 RL / 世界模型(world model):先学习环境动力学,再在“心智仿真”中大量滚动策略,真实机器人上只需少量校正数据。 +改进探索策略:如熵正则、乐观初始化、基于不确定性的探索,使每一步交互更“有价值”。 2.利用模仿学习和离线演示数据

  • 先用人类示教数据进行行为克隆(BC),得到一个尚可的初始策略,再用 RL 进行小步微调,这类“先模仿后强化”的范式显著减少了探索期的“瞎摸索”。(jenskober.de)
  • 利用开放数据集(如 Open X-Embodiment)上汇集的多机器人演示,为策略预训练提供大规模数据基础。(arXiv) 3.视觉 / 表示的预训练与迁移
  • 使用大规模图文数据预训练视觉–语言模型,再迁移到机器人任务,使机器人在视觉理解和语言理解上“开箱即用”。(维基百科)
  • 预训练好的视觉 backbone(如自监督 ViT)能在少量机器人数据上快速适应,从而减少为“看清世界”而付出的额外交互样本。 4.任务与课程设计
  • 采用从易到难的课程学习(curriculum learning),先在简单任务或低难度配置上训练,再逐步提升难度,可以减少在“几乎不可能完成”的早期阶段浪费的尝试。
  • 利用规划器生成高质量轨迹,作为“教师”,把 RL 策略学习限制在较优的状态–动作子空间中。

【图 5-4-2 占位】流程图:展示“预训练表示 → 行为克隆获得初始策略 → 在仿真中 RL 微调 → 少量真实机器人 fine-tune”的多阶段样本高效 pipeline。


5.4.2 仿真–现实(Sim2Real)差距

5.4.2.1 仿真逼真度限制

仿真器的角色是“便宜的现实世界”,但它永远不是现实本身。大量工作系统性地总结了仿真与现实之间的差异来源:(arXiv)

1.动力学建模误差

  • 摩擦系数、刚度、阻尼、关节间背隙等参数很难精确标定,只能近似。
  • 接触与碰撞建模往往简化为“刚体 + 接触模型”,而真实世界中存在弹性、微滑、粘滞等复杂现象。
  • 控制延迟、电机饱和、传感器滤波等在仿真中通常被弱化或忽略。 2.视觉渲染差异
  • 材质、纹理、光照、阴影、反射等真实世界非常复杂,仿真很难完全还原。
  • 真实相机有噪声、曝光变化、失焦、污渍遮挡,而仿真相机通常“干净又高清”。 3.环境与任务建模不完备
  • 仿真往往只建模任务相关物体,忽略线缆、地面摩擦不均、桌面杂物等“细节”。
  • 人类的干预和意外情况(误碰、临时移动物体)也难以在仿真中全面覆盖。

这些差异综合起来,就形成了所谓的Sim2Real gap(仿真–现实差距):模型在仿真中表现优秀,一旦上到真实机器人就“水土不服”。

【图 5-4-3 占位】示意图:左侧为理想化仿真场景(光照均匀、物体简化),右侧为真实实验室照片(杂物、光照不均、线缆等),中间用箭头标记“Sim2Real gap”。

5.4.2.2 差距带来的问题

仿真–现实差距主要在几个层面上影响机器人学习与部署:(arXiv)

1.策略性能大幅下降

  • 在仿真中成功率 90% 的抓取策略,上机器人可能只有 20–30% 成功率。
  • 常见现象包括:抓取抓不牢、轨迹在真实世界会发生轻微碰撞、移动底盘在不同地面材质上打滑等。 2.策略学到“仿真特有技巧”
  • 策略可能利用仿真的物理漏洞(例如物体间穿透、不合理的反弹)完成任务,一旦换成真实物理,行为就完全不可行。
  • 这本质上是策略对仿真模型过拟合。 3.价值估计与不确定性偏差
  • RL 策略在仿真中学到的价值函数(Q 值)是针对“仿真 MDP”的,转移到真实 MDP 后,若状态–转移的统计特性变化,价值估计就会系统性偏差。
  • 在安全敏感任务中,这种偏差可能导致策略高估某些危险动作的安全性。 4.调试成本转移到现实
  • 若在仿真中只关注“任务是否完成”,而不关注姿态 margin、接触力等安全指标,那么把策略上到机器人后,故障诊断大部分还是得在现实世界进行,抵消了部分仿真收益。

5.4.2.3 弥合差距方法

为缩小 Sim2Real gap,研究者提出了多种互补策略,大致可以分为“改仿真”“改策略”和“用真实数据矫正”三条线:(arXiv)

1.域随机化(Domain Randomization)

  • 核心思想:不要企图做一个完全准确的仿真器,而是在仿真参数空间中广泛随机,让策略在大量“略有不同”的环境中都能成功。
  • 在视觉上随机光照、纹理、噪声;在动力学上随机质量、摩擦、关节阻尼等。
  • 理论与实证结果表明,在一定条件下,基于域随机化训练的策略可以在现实环境中获得良好表现,且无需大量真实微调。(arXiv) 2.仿真参数标定与离线域优化
  • 利用少量真实数据进行系统辨识,估计更接近现实的物理参数,使仿真器更加“贴脸”。
  • 进一步的工作(如 Offline Domain Randomization)通过优化随机化分布本身,让样本集中在更现实、同时又能促进策略泛化的参数区域。(ScienceDirect) 3.视觉域自适应与风格迁移
  • 利用风格迁移网络或对抗学习,将仿真图像映射到“更像真实相机”的风格,或反过来把真实图像映射到仿真风格,减少视觉分布差异。
  • 再配合多域训练,使视觉编码器对纹理/光照变化不敏感,只关注几何与语义结构。 4.在真实环境中进行微调(Real-world fine-tuning)
  • 通常的做法是在仿真中预训练策略,然后用极少量真实交互数据进行 RL 或行为克隆微调,对残余差异进行修正。
  • 由于初始策略已经“八九不离十”,微调阶段可以采用更保守的、安全约束更强的 RL 算法,减少安全风险。 5.残差学习(Residual Learning)与混合控制
  • 把传统基于模型或规划的控制当作“基线”,RL 策略只学习一个残差控制项,在基线轨迹附近做小幅调整。
  • 这样,仿真–现实差距主要通过残差来矫正,整个系统既继承模型控制的可解释性,也具备学习的灵活性。

【图 5-4-4 占位】结构示意图:展示 Sim2Real pipeline:左侧“仿真训练 + 域随机化”,中间“参数辨识 / 视觉域适配”,右侧“少量真实微调 + 残差控制”。


5.4.3 稳定训练与安全探索的需求

5.4.3.1 训练稳定性

在仿真中,训练不稳定最多是 loss 爆炸、策略崩掉,重启即可;在真实机器人上,训练不稳定可能直接演化为“机械臂乱甩”“底盘冲出安全区”。最新的机器人 RL 调研一直强调:稳定性是现实部署的前提,而不是锦上添花的优化项。(年评审)

影响训练稳定性的典型因素包括:

1.价值估计和梯度估计的高方差

  • 稀疏奖励、多步回报导致价值估计噪声大,策略更新往往“忽左忽右”;
  • 在机器人连续控制任务中,这种震荡会反映为策略不断输出风格截然不同的动作模式,给硬件带来冲击。 2.策略更新步长过大
  • 若每次参数更新导致策略分布大幅变化,可能出现“上一轮学会抓,下一轮又忘了”的现象。
  • 像 PPO 这类限制策略变化幅度的算法,就是在稳定性与学习速度之间寻求折中。(arXiv) 3.多组件系统的耦合与非平稳性
  • 机器人系统往往包含低层 PID、阻抗控制、传感器滤波等模块,这些模块本身就是一个动态系统。
  • RL 策略在这个“黑箱控制栈”上再加一层决策,会形成高度耦合的闭环,训练中小小的参数变化都可能放大为真实运动的大幅改变。

工程上常见的稳健策略包括:

  • 使用固定的回放缓冲区容量和采样策略,避免数据分布剧烈震荡。
  • 保守的学习率和梯度裁剪,配合周期性评估与“最优 checkpoint 回滚”。
  • 将 RL 策略限定为输出相对增量(Delta Pose / 小速度),把绝对稳定性交给底层控制器。

5.4.3.2 安全探索

安全强化学习(Safe RL)明确提出:在许多现实场景中,目标不是“在长期回报意义上平均安全”,而是在整个训练和部署过程中尽量避免违反安全约束。(机器学习研究杂志)

典型安全约束包括:关节角/力矩限制、最大速度、禁止进入的空间区域、与人保持安全距离等。围绕这些约束,已有大量 Safe RL 工作总结出几类主流方法:(cmp.felk.cvut.cz)

1.约束优化 / CMDP 方法

  • 将问题建模为有约束的 MDP(Constrained MDP),目标是在满足约束期望值不超过阈值的前提下最大化回报。
  • 典型算法如拉格朗日法、CPO(Constrained Policy Optimization)等,通过在优化目标中加入约束代价或拉格朗日乘子,实现“奖励–安全”的双目标平衡。 2.安全屏蔽(Shielding)与监督控制
  • 在 RL 策略外面再包一层“安全过滤器”:
    • 策略提出候选动作;
    • 安全模块检查该动作是否可能导致违反约束;
    • 若不安全,则投影到最近的安全动作或直接替换为安全备份策略。
  • 这类方法往往借鉴控制理论(如控制 barrier 函数)或形式化验证结果,为安全性提供一定的理论保证。 3.基于模型的安全探索
  • 先学习环境的不确定模型,再在“乐观但带约束”的未来预测中选择探索动作,尽量避免进入模型不确定但高风险的区域。
  • 一些新工作试图统一各类安全探索问题,提出“广义安全探索”的统一框架和元算法。(NeurIPS 会议论文集)

在机器人实践中,除了算法层面,还会配合大量“工程安全措施”,例如:

  • 设置物理限位、软限位和软件安全边界;
  • 初期训练时限制运动速度与操作区域;
  • 对明显危险的动作(例如大幅挥臂、靠近人脸)在动作空间中直接屏蔽。

5.4.3.3 监控与恢复

即使采用了安全 RL 算法,真实世界仍然不可避免地会出现异常行为。因此,一个可行的机器人学习系统通常需要设计监控–诊断–恢复的完整闭环:

1.多层次监控

  • 低层:驱动器电流、关节力矩、速度、温度等硬件状态;
  • 中层:机器人姿态、与障碍物的距离、接触力;
  • 高层:任务进展(是否卡在某步)、策略输出是否异常(例如突然跳到极端动作)。 2.异常检测与应急策略
  • 通过阈值检测、统计异常检测或学习到的异常识别模型,识别“违背常规”的状态和动作模式;
  • 一旦触发异常,立即执行预定义应急策略:比如急停、关节回缩到安全姿态、底盘减速并保持静止等。 3.安全恢复与环境重置
  • 在不损害安全的前提下,尽可能自动恢复到可继续训练的初始或中间状态,减少人力干预。
  • 对于长期学习系统,可以加入“自我诊断日志”:出错时详细记录传感器、动作、指令等信息,方便后续分析与算法改进。 4.人类在环(Human-in-the-Loop)监督
  • 对于高风险操作场景,通常要求有人类在场监督,并为系统提供“最终仲裁权”;
  • 在训练早期,可以通过人类“批准/否决”某些策略行为的方式,给策略附加一层基于人类偏好的安全约束(与第 9 章的 RLHF 有天然联系)。(arXiv)

【图 5-4-5 占位】系统结构图:从 RL 策略输出到机器人执行之间,插入“安全过滤器”“监控模块”“紧急停止/E-stop”几个方框,箭头表示信息流和控制流。


5.4.4 IL、RL 与 VLA 预训练的组合方式概览

这一小节从更宏观的角度总结:在现代机器人系统中,模仿学习(IL)、强化学习(RL)和大规模 VLA 预训练往往不是互斥的,而是通过合理编排形成一个分阶段的训练流水线。

5.4.4.1 先模仿后强化

“先模仿再强化”是机器人学习中最常见、也最符合直觉的一种范式:先让机器人“看人怎么做”,再让它在安全范围内自己试着“做得更好”。大量综述与具体工作都验证了这种组合的有效性。(jenskober.de)

典型流程可以概括为:

1.收集专家示范

  • 通过遥操作、示教等方式采集高质量轨迹(第 7 章已详细讨论)。
  • 每条轨迹包含:视觉、机器人状态、动作序列、任务成功标记等。 2.行为克隆(BC)预训练策略
  • 将模仿学习视为监督学习:给定状态(视觉 + 机器人状态 + 语言指令),预测专家动作。
  • 得到一个初始策略,已经能在大部分示范场景中较好完成任务,避免 RL 初期完全随机探索。 3.在仿真/现实中进行 RL 微调
  • 以 BC 策略为初始化,用 RL 在仿真或真实环境中进一步优化,以任务成功率或长期回报为目标。
  • RL 阶段可以纠正示范中的系统性偏差(人类操作未必最优),并适应新的环境变化。
  • 为了稳定性和安全性,常会加入 KL 正则或行为克隆辅助损失,防止策略偏离示范分布过远。 4.分层组合与技能复用
  • 在一些工作中,模仿学习先学出若干“技能原语”(例如抓取、推、开门),RL 在更高层面利用这些技能进行任务规划和组合,从而降低 RL 的搜索空间。

【图 5-4-6 占位】两阶段训练示意图:左侧块为“IL / BC 预训练策略”,右侧块为“RL 微调”,中间箭头表示以 BC 策略作为 RL 初始点。

5.4.4.2 自监督预训练

在 VLA 模型兴起之前,机器人学习中的预训练主要发生在视觉 backbone 上;而现在,更大尺度的自监督和多模态预训练已经延伸到“视觉–语言–动作统一表征”层面。(arXiv)

几种典型的自监督 / 预训练方式包括:

1.视觉与语言的跨模态预训练

  • 先在互联网图文数据上进行 CLIP 风格的对比学习,或者在图文上训练视觉–语言模型,获得强大的语义理解能力(第 4 章已展开)。
  • 代表性工作如 DINOv2、CLIP 等,被直接用作 VLA 的视觉与语言 backbone。(维基百科) 2.基于机器人数据的“掩码建模 / 未来预测”
  • 利用大量无标签机器人视频和传感器数据,通过掩码帧重建、未来帧/未来状态预测等自监督任务,学习机器人特定的世界模型和时序表征。
  • 这类预训练使得模型对接触、物体运动等物理规律有更好的内在理解。 3.大规模 VLA 预训练
  • 例如 OpenVLA 在 Open X-Embodiment 汇集的约百万条跨机器人演示上进行预训练,使用预训练视觉和语言 backbone,将动作离散化为 token,在“视觉–语言–动作”统一 Transformer 中学习通用策略表示。(arXiv)
  • 预训练后,只需在新机器人或新任务上进行少量参数高效微调(如 LoRA),就能快速适应。 4.结合 RL 的自监督表示学习
  • 在仿真中一边用 RL 学策略,一边用自监督目标(如对比学习、动态预测)训练中间表示,使得策略在样本有限时仍能获益于更好的特征。

在这样的大背景下,IL 和 RL 不再孤立地直接操作原始图像和原始动作,而是建立在一个规模更大的预训练 VLA 表征之上,从而显著提升样本效率与泛化能力。

5.4.4.3 多范式结合

在前两小节的基础上,可以把现代机器人学习系统理解为一个“多层、多范式协同”的结构:

1.表征层:VLA / 世界模型预训练

  • 目标:学习一个对视觉、语言、机器人状态和动作都具有良好表达能力的“基础模型”。
  • 数据:互联网图文 + 多机器人示教轨迹 + 未标注视频。
  • 方法:自监督、对比学习、多任务预训练。 2.行为层:模仿学习整合人类经验
  • 目标:在给定基础表征的前提下,通过行为克隆让机器人直接“复制”人类或其他机器人在特定任务上的表现。
  • 数据:高质量示教轨迹。
  • 作用:迅速获得可用策略,覆盖常见工作模式,减少 RL 早期的危险探索。 3.优化层:强化学习与人类反馈微调
  • 目标:在安全约束下进一步提升策略性能、提高鲁棒性与泛化能力。
  • 方法:在仿真或现实环境中使用 PPO 等算法进行 RL 微调;结合人类偏好数据进行 RLHF,使策略在“好用”与“安全”之间达成平衡。(年评审) 4.系统层:与控制、规划模块协同
  • VLA 模型可以作为高层决策“脑”,与传统的运动规划、低层控制协同工作。
  • 多范式学习的结果最终要通过这一层与真实硬件对接,以满足实时性与可靠性要求(第 10 章会展开)。

整理成一句话:

预训练负责“看懂世界、听懂人话”,模仿学习负责“先做到及格”,强化学习负责“在安全边界内追求更优”。

【图 5-4-7 占位】三层结构示意图:底层为“表征预训练(VLA / 世界模型)”,中层为“模仿学习(BC/IL)”,顶层为“RL & 人类反馈微调”,箭头注明数据与梯度流向,并在顶端连到“真实机器人系统”。

这一节到这里为止,基本勾勒出了真实机器人学习面对的三大现实约束:数据成本、Sim2Real 差距和安全稳定性,同时给出了一套兼顾 IL、RL 与 VLA 预训练的综合解法,为后续关于具体 VLA 架构和训练细节的章节打下工程与方法论层面的基调。

本章小结与自测

三行小结

  1. 本章打通 RL 与 IL 的核心概念和常用算法。
  2. 重点是数据分布、目标函数与稳定训练的平衡。
  3. 学完后应能解释“何时 BC、何时 RL、何时混合”。

检查题

  1. 用你自己的话总结本章最核心的一个公式/机制。
  2. 给出一个“如果要落地到项目里,你会怎么用”的具体例子。

常见误区

  1. 把离线指标当在线性能。
  2. 忽视分布偏移。
  3. 奖励设计过稀疏或可被投机。

公式到代码(最小示例)

rewards = [0.0, 0.0, 1.0]
gamma = 0.99
G = 0.0
for r in reversed(rewards):
    G = r + gamma * G
print(round(G, 6))

本章外部参考(集中)

  1. 年评审
  2. jenskober.de
  3. arXiv
  4. 维基百科
  5. arXiv
  6. arXiv
  7. ScienceDirect
  8. arXiv
  9. 机器学习研究杂志
  10. cmp.felk.cvut.cz
  11. NeurIPS 会议论文集
  12. arXiv

6.1 机器人运动学

6.1 机器人运动学概述(局部节选)

学习导航

  • 本章主题:6.1 机器人运动学概述(局部节选)
  • 前置知识:建议先完成第 1 章线代与第 5 章基础。
  • 建议用时:95-115 分钟
  • 阅读顺序:先看概念框架,再看公式/代码,最后做自测。

关键图示:机器人运动学流程

关键图示:机器人运动学流程

本节从坐标系与齐次变换出发,逐步推导到DH 建模、正运动学与逆运动学,最后引出冗余度、多解与奇异位形这些在具身智能机器人中绕不过去的概念。你可以把它理解为:从“如何描述机器人在空间里的姿势”,一路走到“如何让它伸手拿起桌上的杯子”。


6.1.1 坐标系与齐次变换矩阵

6.1.1.1 坐标系:给机器人一个“参考视角”

在 1.1 中,我们已经把向量和线性变换当成了熟悉的老朋友。机器人学里,我们把这些朋友包装成一个又一个坐标系(reference frame)

典型的坐标系包括:

+世界 / 实验室坐标系:记作 \( {W} \),通常固定在地面或工作台上,是“上帝视角”。 +基座坐标系:记作 \( {0} \),固定在机械臂底座上,是后续连杆坐标系的起点。 +连杆坐标系:记作 \( {1},{2},\dots,{n} \),分别固定在各个连杆或关节处。 +末端执行器(工具)坐标系:记作 \( {E} \) 或 \( {T} \),固定在手爪或工具法兰盘上。 +相机 / 物体坐标系:在视觉部分我们已经见过,便于把感知结果映射到机器人可用的形式。

同一个三维点在不同坐标系下的坐标一般不同。例如,杯子在基座坐标系下的坐标是 \( ^{0}\mathbf{p} \),在世界坐标系下是 \( ^{W}\mathbf{p} \),二者之间通过一个坐标变换联系起来。

【图 6.1-1 占位】 画一台 6 轴机械臂,标出世界坐标系 \( {W} \)、基座 \( {0} \)、中间某个关节坐标系 \( {2} \) 和末端坐标系 \( {E} \),每个坐标系用右手坐标轴 \( (x,y,z) \) 表示,示意它们在空间中的相对姿态。

我们默认采用右手坐标系:右手拇指、食指、中指分别代表 \( x,y,z \) 轴方向,满足 \( x\times y = z \)。这与后续旋转矩阵、叉乘方向统一。


6.1.1.2 齐次变换矩阵:把旋转和平移装进一个 4×4 盒子

在 3D 空间里,一个刚体相对于另一个坐标系的“姿态”包含两部分

  • 旋转:\( 3\times 3 \) 正交矩阵 \( R \),满足 \( R^\top R = I,\ \det R = 1 \);
  • 平移:\( 3\times 1 \) 向量 \( \mathbf{p} \)。

为了统一处理旋转和平移,机器人学中引入了齐次变换矩阵(homogeneous transformation matrix)。它是一个 \( 4\times 4 \) 矩阵:

\[ {}^{A}T_B= \begin{bmatrix} R_{AB} & \mathbf{p}_{AB} \\ \mathbf{0}^\top & 1 \end{bmatrix} \]

其中 \(R_{AB}\) 表示坐标系 \(\{B\}\) 相对于 \(\{A\}\) 的旋转, \(\mathbf{p}_{AB}\) 表示 \(\{B\}\) 的原点在 \(\{A\}\) 中的坐标。(维基百科)

我们把三维点写成齐次坐标 \( \tilde{\mathbf{x}} = [x\ y\ z\ 1]^\top \),则有

\[ \tilde{\mathbf{x}}_A = {}^{A}T_B\ \tilde{\mathbf{x}}_B \]

这一步本质上就是把“在 \( B \) 中的坐标”变换为“在 \( A \) 中的坐标”。

变换的串联非常自然:如果我们已知

\[ {}^{0}T_1,\quad {}^{1}T_2,\quad \dots,\quad {}^{n-1}T_n \]

那么基座到第 \( n \) 节坐标系的总变换为

\[ {}^{0}T_n = {}^{0}T_1\ {}^{1}T_2 \cdots {}^{n-1}T_n \]

这正是后面正运动学的核心公式。

齐次变换矩阵的逆也很简单:

\[ ({}^{A}T_B)^{-1} = \begin{bmatrix} R_{AB}^\top & -R_{AB}^\top \mathbf{p}_{AB}\\ \mathbf{0}^\top & 1 \end{bmatrix} \]

这里利用了旋转矩阵正交的性质 \( R^{-1}=R^\top \)。(维基百科)

【图 6.1-2 占位】 左侧画出两个坐标系 \( {A} \)、\( {B} \) 及平移向量 \( \mathbf{p}_{AB} \),右侧写出对应的 \( 4\times 4 \) 齐次变换矩阵结构,用不同颜色标注旋转子矩阵和平移列向量。


6.1.1.3 位姿表示:位置 + 姿态

位姿(pose)=位置(position) + 姿态(orientation)

  • 位置:通常用 \( 3 \) 维向量 \( \mathbf{p} = [x,y,z]^\top \) 表示;
  • 姿态:有多种常见表示方法: +旋转矩阵\( R \):直观、便于与齐次矩阵结合,但有 9 个参数且有正交约束; +欧拉角 / RPY 角:三个角度表示三次旋转,直观但存在万向节死锁(gimbal lock); +轴–角(axis–angle):用单位旋转轴 \( \mathbf{u} \) 和旋转角 \( \theta \) 表示; +四元数(quaternion):4 个实数 \( (w,x,y,z) \) 表示单位四元数,避免万向节死锁,常用于插值与控制。(Academia)

在工程实践中,常见的位姿表示有两种:

1.齐次变换矩阵\( T=[R,\mathbf{p};\ 0^\top,1] \):在机器人运动学推导中最常用,可直接参与矩阵连乘; 2.“平移向量 + 四元数”\( (\mathbf{p},q) \):在 ROS、仿真器和优化求解器中非常流行,占用参数少、插值方便。

本书中,在推导运动学时主要使用齐次矩阵;在与优化、学习算法接口时,会经常切换到“平移 + 四元数”的形式,你需要熟悉二者之间的概念联系。

【图 6.1-3 占位】 画三个小框:左边是 3×3 旋转矩阵 \( R \),中间是欧拉角 \( (\phi,\theta,\psi) \),右边是四元数 \( (w,x,y,z) \),用箭头表示它们之间可以互相转换。


6.1.2 DH 参数与刚体链建模

6.1.2.1 DH 参数:用四个数刻画一节机械臂

一个串联机械臂可以看作若干刚体(连杆)通过关节串起来的刚体链。为了系统地描述每两节之间的几何关系,机器人学界广泛使用Denavit–Hartenberg(DH)参数。(维基百科)

经典 DH 约定中,每一关节(或连杆)用四个参数描述:

  • \( \theta_i \):关节角,绕 \( z_{i-1} \) 轴的旋转量(对转动关节是变量);
  • \( d_i \):关节距,沿 \( z_{i-1} \) 轴的平移;
  • \( a_i \):连杆长,沿 \( x_i \) 轴的平移;
  • \( \alpha_i \):连杆扭转角,绕 \( x_i \) 轴的旋转量。

这四个参数对应一个从坐标系 \( {i-1} \) 到 \( {i} \) 的齐次变换:

\[ {}^{i-1}T_i = \operatorname{Rot}_z(\theta_i)\operatorname{Trans}_z(d_i) \operatorname{Trans}_x(a_i)\operatorname{Rot}_x(\alpha_i) \]

展开后得到标准形式(这里只给出结构):

\[ {}^{i-1}T_i = \begin{bmatrix} \cos\theta_i & -\sin\theta_i\cos\alpha_i & \sin\theta_i\sin\alpha_i & a_i\cos\theta_i\\ \sin\theta_i & \cos\theta_i\cos\alpha_i & -\cos\theta_i\sin\alpha_i & a_i\sin\theta_i\\ 0 & \sin\alpha_i & \cos\alpha_i & d_i\\ 0 & 0 & 0 & 1 \end{bmatrix} \]

【图 6.1-4 占位】 画出两节连杆之间的 DH 几何:标出连续的关节轴 \( z_{i-1} \)、\( z_i \),它们之间的公共法线(连杆长 \( a_i \)),以及扭转角 \( \alpha_i \),同时在图旁标注 \( \theta_i,d_i,a_i,\alpha_i \) 的几何含义。

注意:在部分教材和工业手册中,会使用**修改 DH(modified DH)**约定,参数定义顺序略有差异。本书采用经典 DH 记号为主,在使用修改 DH 的地方会特别说明。(维基百科)


6.1.2.2 刚体链:用一串齐次矩阵拼出整条机械臂

考虑一个有 \( n \) 个关节的串联机械臂,它有 \( n+1 \) 节连杆(从基座连杆 0 到连杆 \( n \))。我们为每节连杆依次建立坐标系 \( {0},{1},\dots,{n} \),并为每个关节写出对应的 DH 变换矩阵 \( ^{i-1}T_i \)。(users.cs.duke.edu)

则基座到末端的总变换为:

\[ {}^{0}T_n(q) = {}^{0}T_1(q_1)\ {}^{1}T_2(q_2)\ \cdots\ {}^{n-1}T_n(q_n) \]

其中 \( q_i \) 是第 \( i \) 个关节的变量(转动关节为角度、移动关节为位移)。这就是把整条刚体链的几何关系编码为一串矩阵连乘。

从结构上看:

  • 每个 \( ^{i-1}T_i \) 编码了“连杆 \( i \) 相对连杆 \( i-1 \) 如何旋转和平移”;
  • 整个连乘编码了“末端相对于基座的姿态”。

这条链就是我们在学习强化学习 / 控制策略时所依赖的几何骨架——策略输出的是关节角 \( q \),而真正落在物理世界的是通过这条链计算出来的末端位姿。

【图 6.1-5 占位】 画一个 3 关节机械臂,标出 \( {0},{1},{2},{3} \) 四个坐标系,并在旁边画出 \( ^{0}T_1 \)、\( ^{1}T_2 \)、\( ^{2}T_3 \) 三个矩阵连乘得到 \( ^{0}T_3 \) 的示意箭头。


6.1.2.3 建模步骤:从几何结构到 DH 表格

实际给一台机械臂,你可以按以下流程进行 DH 建模(以经典 DH 为例):

1.确定关节类型与顺序 标明每个关节是转动(R)还是移动(P),按从基座到末端的顺序编号 \( 1,\dots,n \)。 2.指定基座坐标系\( {0} \)和末端坐标系\( {n} \)

  • \( {0} \) 一般与工程图纸中的基坐标一致;
  • \( {n} \) 固定在工具法兰盘或末端执行器上,便于后续抓取 / 操作任务定义。 3.为每个关节轴定义\( z_i \)方向
  • 对转动关节:\( z_i \) 与旋转轴方向一致;
  • 对移动关节:\( z_i \) 与滑动方向一致。 4.确定相邻关节轴的公共法线,定义\( x_i \)
  • 若 \( z_{i-1} \) 与 \( z_i \) 不平行:\( x_i \) 沿两轴的最短连线方向
  • 若平行:\( x_i \) 可任意选择一个垂直于轴的方向;
  • \( y_i \) 按右手定则补齐。 5.从几何关系读出 DH 参数\( (\theta_i, d_i, a_i, \alpha_i) \)
  • \( d_i \):沿 \( z_{i-1} \) 从原点 \( {i-1} \) 到公共法线的距离;
  • \( a_i \):公共法线的长度,即沿 \( x_i \) 的距离;
  • \( \alpha_i \):\( z_{i-1} \) 绕 \( x_i \) 转到 \( z_i \) 的角度;
  • \( \theta_i \):\( x_{i-1} \) 绕 \( z_{i-1} \) 转到 \( x_i \) 的角度。对转动关节,这是关节变量。 6.写出每一节的\( ^{i-1}T_i \),整理成 DH 表格 通常整理为一张 \( n\times 4 \) 的表格,列为 \( a_i,\alpha_i,d_i,\theta_i \),方便实现和检查。 7.验证模型
  • 检查在“所有关节为零位”的情况下,\( ^{0}T_n \) 是否与机械臂实际“零姿态”一致;
  • 如有偏差,通常说明某个轴方向或角度符号选反了。

【图 6.1-6 占位】 左边画一个 2R 平面机械臂(在 \( x\text{-}y \) 平面),标出两节连杆长度 \( l_1,l_2 \) 和关节角 \( \theta_1,\theta_2 \);右边给出对应的 DH 表格(两行四列),展示一次完整的建模示例。


6.1.3 正运动学(FK):关节空间到笛卡尔空间

6.1.3.1 定义:给定关节角,算末端在哪里

**正运动学(Forward Kinematics, FK)**回答的问题是:

已知关节变量 \( q = [q_1,\dots,q_n]^\top \),求末端执行器相对于基座的位姿 \( T(q) \)。

把数学上抽象一下,就是一个从关节空间到任务空间的映射:

\[ F:\ \mathbb{R}^n \to SE(3),\quad T(q)=F(q) \]

其中 \( SE(3) \) 是三维刚体运动群,包含所有合法的旋转 + 平移组合。

对给定的机械臂,FK 映射是确定且单值的:同一组关节角只对应一个末端位姿。这是控制和仿真中最基本的几何模块。(Academia)


6.1.3.2 矩阵计算:把 DH 连乘到底

利用上一小节得到的 DH 参数,我们可以将 FK 写为:

\[ {}^{0}T_n(q) = {}^{0}T_1(q_1)\ {}^{1}T_2(q_2)\ \cdots\ {}^{n-1}T_n(q_n) \]

其中每个 \( ^{i-1}T_i \) 都是 \( q_i \) 的显函数(对转动关节是关于 \( \cos q_i,\sin q_i \) 的三角函数)。通过矩阵连乘,就可以求出末端相对于基座的旋转矩阵 \( R(q) \) 和位移向量 \( \mathbf{p}(q) \):

\[ {}^{0}T_n(q) = \begin{bmatrix} R(q) & \mathbf{p}(q)\\ \mathbf{0}^\top & 1 \end{bmatrix} \]

作为一个简单的二维例子,考虑平面 2R 机械臂,连杆长度为 \( l_1,l_2 \),关节角为 \( \theta_1,\theta_2 \)。其末端位置 \( (x,y) \) 满足:

\[ x = l_1\cos\theta_1 + l_2\cos(\theta_1 + \theta_2),\quad y = l_1\sin\theta_1 + l_2\sin(\theta_1 + \theta_2) \]

这就是 FK 的显式形式,直接由几何相加得到。

在实际程序中,你通常会:

  1. 根据当前关节角 \( q \),构造所有 \( ^{i-1}T_i(q_i) \);
  2. 从 \( i=1 \) 循环到 \( n \) 做矩阵连乘;
  3. 从最终的 \( T \) 中读出末端位置 \( \mathbf{p} \) 和姿态 \( R \) 或四元数。

【图 6.1-7 占位】 展示平面 2R 机械臂的几何图和对应的 \( (x,y) \) 公式,标注每一项来自哪一节连杆长度和角度之和。


6.1.3.3 正运动学的特点与作用

正运动学有几个重要特点:

+对任意合法的\( q \)总是可解且唯一:不需要迭代或优化; +计算复杂度线性于关节数\( n \):只是一串矩阵乘法,在实时控制中非常可行; +是许多上层任务的“查询接口”

  • 动态方程 \( M(q)\ddot{q} + \dots \) 中需要用到几何量;
  • 碰撞检测需要知道连杆和末端的空间位置;
  • 视觉–手眼标定中要把相机检测到的物体位置映射到机器人基座坐标系。

在具身智能场景下,你可以把 FK 看成“世界坐标模拟器”:RL / VLA 策略输出的是关节动作,而环境和相机看到的是末端和连杆在笛卡尔空间的位置,二者之间全靠 FK 连接。


6.1.4 逆运动学(IK):笛卡尔空间到关节空间

6.1.4.1 定义:指定一个末端位姿,问关节该如何摆

**逆运动学(Inverse Kinematics, IK)**解决的是与 FK 相反的问题:

给定期望的末端位姿 \( T_d \)(或期望位置 \( \mathbf{p}_d \) 和姿态 \( R_d \)),求关节变量 \( q \),使得 \[ \(F(q) = T_d\) \]

与 FK 不同,IK 一般既不保证唯一解,也不保证总有解

  • 可能无解:目标太远或超出机械臂可达工作空间;
  • 可能多解:存在多个关节配置实现同一末端位姿(如肘上 / 肘下);
  • 冗余机械臂(自由度大于任务维度)会有无穷多组解。

IK 是机器人规划、抓取、避障等任务的核心子问题,本书后续多处会在 IK 之上叠加优化、学习和语言条件。


6.1.4.2 解析解:能写成公式的 IK

在一些结构比较规则的机械臂上,可以推导出解析解(closed-form solution):用有限次代数、三角运算直接给出 \( q \) 的表达式,不需要迭代求解。(Academia)

继续以平面 2R 机械臂为例,给定目标点 \( (x_d, y_d) \),连杆长度 \( l_1, l_2 \),则由余弦定理可得:

\[ \cos\theta_2 = \frac{x_d^2 + y_d^2 - l_1^2 - l_2^2}{2 l_1 l_2} \]

从而

\[ \theta_2 = \arctan2\big(\pm\sqrt{1-\cos^2\theta_2},\ \cos\theta_2\big) \]

这里 \( \pm \) 对应肘上 / 肘下两种构型(多解现象的一个具体体现)。然后可以再由几何关系求出 \( \theta_1 \)。

对于常见的 6 自由度工业机械臂,如果后三个关节形成所谓“球腕(spherical wrist)”,也可以分解为位姿分离问题,采用解析方法求解。这类解析 IK 在工业控制器中非常普遍,因为它计算快、确定性强。


6.1.4.3 数值解:用迭代逼近 IK

大多数复杂结构或冗余机械臂(例如 7 自由度人形手臂)不再容易写出解析 IK,需要求助于数值方法。典型做法是把 IK 看成求解非线性方程

\[ F(q) = T_d \]

或在位置空间写成

\[ \mathbf{f}(q) = \mathbf{x}_d \]

然后使用类似牛顿–拉弗森(Newton–Raphson)的迭代方法。其关键工具是雅可比矩阵(Jacobian)\( J(q) \),它描述关节速度与末端线速度 / 角速度的线性关系:(wanxinjin.github.io)

\[ \dot{\mathbf{x}} = J(q)\ \dot{q} \]

在数值 IK 中,我们可以通过线性化把“位置误差”转化为“关节增量”:

\[ \Delta q \approx J(q)^\dagger\ \Delta \mathbf{x} \]

其中 \( J^\dagger \) 是雅可比的广义逆或阻尼广义逆。迭代过程如下:

  1. 从一个初始猜测 \( q^{(0)} \) 开始;
  2. 每步计算当前末端位姿 \( T(q^{(k)}) \),得到任务空间误差 \( \Delta \mathbf{x} \);
  3. 计算(或近似)雅可比 \( J(q^{(k)}) \),求出 \( \Delta q = J^\dagger \Delta \mathbf{x} \);
  4. 更新 \( q^{(k+1)} = q^{(k)} + \Delta q \);
  5. 直到误差足够小或达到迭代上限。

数值 IK 的特点:

  • 需要初始值,不同初始值可能收敛到不同的解(多解);
  • 奇异位形附近,\( J \) 接近退化,数值 IK 会变得不稳定或需要非常大的关节变化;
  • 易于加入额外约束(如关节限位、避障项),可以通过优化框架统一处理。

后文在介绍雅可比和冗余度时,我们会进一步展开基于雅可比伪逆和 null space 的 IK 规划思想。(现代机器人学)

【图 6.1-8 占位】 画出数值 IK 的迭代示意:任务空间中目标点 \( \mathbf{x}_d \) 和当前末端位置 \( \mathbf{x} \),用箭头表示通过雅可比线性化后的一步更新,展示逐步逼近目标的过程。


6.1.5 冗余度与多解、奇异位形的概念

6.1.5.1 冗余机械臂:多出来的自由度用来“耍花活”

我们用 \( n \) 表示机械臂的关节自由度(DOF)

  • 如果任务只要求末端位置(3 维),理论上需要至少 3 个自由度;
  • 如果要求完整的 6 维位姿(3 位置 + 3 姿态),理论上至少需要 6 个自由度。

\[ n > m \]

其中 \( m \) 是任务空间维度(如 \( m=3 \) 或 \( m=6 \))时,我们称机械臂在该任务上是冗余的(redundant)。典型例子是 7 自由度机械臂执行 6 维位姿控制,冗余 1 个自由度。(Academia)

冗余的好处是:

  • 可以在不改变末端任务的前提下,调整身体姿态来避障、躲关节限位
  • 可以优化二级目标,比如“离奇异位形远一点”、“让重心更稳定”等;
  • 为人形 / 服务机器人提供更“自然”的动作风格(看起来更像人)。

数学上,冗余带来的结果是:任务空间方程 \( F(q)=T_d \) 的解集从“离散点”变成一条或多条连续的曲线 / 曲面。


6.1.5.2 多解现象:即使不冗余,也可能“同一个末端,多种姿势”

即便在非冗余(\( n=m \))情况下,IK 也不一定只有一个解。原因在于三角函数的周期性和空间几何的镜像对称。例如:

  • 平面 2R 机械臂到达同一个目标点 \( (x_d,y_d) \),通常有**肘上(elbow-up)肘下(elbow-down)**两种解,对应 \( \theta_2 \) 两个不同分支;
  • 三维 6R 机械臂经常有“腕翻转(wrist flip)”多解,末端姿态相同,但前臂 / 腕部呈现不同的卷曲方式。

更一般地,对于复杂的非线性方程 \( F(q)=T_d \),可能存在多个相互独立的实根,每一个对应机器人在工作空间内的一个“构型分支”。

在工程上,这意味着:

  • IK 求解时需要选择一个构型(例如偏好“肘下”,以免打到周围物体);
  • 数值方法探索的解往往与初始值所在的构型连通区域有关;
  • VLA / RL 策略在学习时,可能在不同次试验中收敛到不同构型,对数据分布和泛化有影响。

【图 6.1-9 占位】 同一个目标点,两幅图分别画出平面 2R 机械臂的肘上、肘下两种姿态,用相同颜色标出末端位置一致但中间关节角不同。


6.1.5.3 奇异位形:雅可比退化导致“这个方向动不了了”

要理解奇异位形(singularity),需要回忆雅可比矩阵 \( J(q) \) 的角色:它把关节速度映射为末端速度,

\[ \dot{\mathbf{x}} = J(q)\ \dot{q} \]

其中 \( \dot{\mathbf{x}} \) 通常是 6 维的空间速度(linear + angular velocity),\( \dot{q} \) 是 \( n \) 维关节速度。

在一般构型下,\( J \) 的秩等于任务空间维度(例如 \( 6 \) 或 \( 3 \)),这说明机器人在局部可以沿所有任务空间方向自由运动。而当某个构型 \( q_s \) 处,\( J(q_s) \) 的秩降到低于最大值时,我们称 \( q_s \) 为一个运动学奇异位形:(现代机器人学)

  • 物理直觉:末端在某些方向上失去了局部自由度,不再能“随便小幅动一动”;
  • 数学表现:某些任务空间方向的速度无法通过任何有限的关节速度组合得到;
  • FK 仍然是光滑的,但 IK 的局部线性近似失效。

典型例子包括:

1.完全伸直的手臂 当几节连杆共线伸直时,末端在某个方向的运动能力会消失。例如,直臂状态下很难绕“手臂自身轴线”做小幅绕圈。 2.腕部关节轴对齐 在 6R 机械臂中,如果三个腕关节的轴线对齐,关于某些转轴的旋转变得与其他运动方向线性相关,雅可比秩降低。

在数值计算层面,奇异位形带来的问题包括:

+关节速度发散:为了产生一个有限的末端速度,\( J^\dagger \) 中某些元素需要变得非常大; +数值不稳定:IK 迭代在奇异附近震荡或陷入很差的局部解; +操纵能力下降:微小扰动难以被末端动作有效补偿。

因此,在轨迹规划和学习控制中,通常会:

  • 设计奇异性度量(如 manipulability),通过二级优化目标远离奇异区域;
  • 在 IK 中使用阻尼伪逆等数值技巧,缓解奇异附近的尖锐不适定性;
  • 在策略训练数据中避免长时间停留在极端伸展等奇异构型。

【图 6.1-10 占位】 画一个 3R 平面机械臂:左边是正常弯曲状态,末端可以向多个方向小幅移动;右边是完全伸直状态,用箭头表示“沿某个方向几乎不能再前进”,并在旁边标注“Jacobian 秩降低”。


本节从坐标系与齐次变换出发,通过DH 参数搭建了机械臂的刚体链模型,进一步引入了正运动学逆运动学,最后讨论了冗余度、多解和奇异位形这些在后续控制与学习中反复出现的几何现象。在接下来的 6.2 节中,我们会在这些几何关系之上叠加质量、惯量和外力,引出机械臂的动力学方程与控制律,完成从“几何骨架”到“力学行为”的过渡。

本章小结与自测

三行小结

  1. 本章提供机器人几何、动力学与控制接口基础。
  2. 重点是把数学方程映射到可执行控制命令。
  3. 学完后应能读懂常见机器人控制管线。

检查题

  1. 用你自己的话总结本章最核心的一个公式/机制。
  2. 给出一个“如果要落地到项目里,你会怎么用”的具体例子。

常见误区

  1. 只会调用 API,不理解坐标系。
  2. 控制频率与模型延迟不匹配。
  3. 未考虑硬件限位与安全约束。

公式到代码(最小示例)

import numpy as np

R = np.eye(3)
p = np.array([0.1, 0.2, 0.3])
T = np.eye(4)
T[:3, :3] = R
T[:3, 3] = p
print(T)

本章外部参考(集中)

  1. 维基百科
  2. Academia
  3. users.cs.duke.edu
  4. wanxinjin.github.io
  5. 现代机器人学

6.2 机器人动力学与控制

下面是对 6.2.1–6.2.4 的一版“书稿级”展开,你可以直接并入整本书的 LaTeX / Markdown 中使用。图片处我用占位说明好了,方便你后期统一风格。


6.2 机器人动力学与控制概述(承上启下小节)

在 6.1 中,我们已经从几何层面刻画了机器人:给定关节角 \( q \),通过正运动学就能算出末端位姿;给定末端目标位姿,通过逆运动学就能求出一组关节角解。 这些内容只回答了一个问题:

“关节角度和末端位姿之间是什么几何关系?”

真正让机器人动起来,必须回答第二个问题:

“在有质量、惯性和重力的真实世界中,要产生这些运动,需要多大的关节力矩\( \tau \)?”

这一问题的答案,就是机器人动力学方程。在此基础上,我们才能讨论 PID 控制、阻抗控制以及高层策略如何与低层伺服环协同工作。

本节从关节空间动力学方程出发,逐步过渡到典型的低层控制方法(PID、位置/速度/力矩模式),再介绍与人类交互密切相关的阻抗/顺应控制,最后给出“低层控制器–高层策略”的分层结构视角,为 6.3 的任务建模与动作表示埋下伏笔。


6.2.1 关节空间动力学方程的基本形式

学习导航

  • 本章主题:6.2.1 关节空间动力学方程的基本形式
  • 前置知识:建议先完成第 1 章线代与第 5 章基础。
  • 建议用时:100-120 分钟
  • 阅读顺序:先看概念框架,再看公式/代码,最后做自测。

关键图示:动力学与控制回路

关键图示:动力学与控制回路

6.2.1.1 关节空间动力学方程的标准形式

对于一个 \( n \) 自由度的刚体串联机械臂,在假设各连杆刚体、关节理想(摩擦单独建模)的条件下,其关节空间动力学可以写成如下标准形式:(罗马大学诊断中心)

\[ M(q)\ddot{q} + C(q,\dot{q})\dot{q} + G(q) = \tau \]

其中:

  • \( q \in \mathbb{R}^n \):关节位置(角度或位移)向量;
  • \( \dot{q}, \ddot{q} \):关节速度、加速度;
  • \( M(q) \in \mathbb{R}^{n\times n} \):惯量矩阵(inertia matrix),描述系统在配置 \( q \) 下的“有效质量”分布;
  • \( C(q,\dot{q})\dot{q} \):科里奥利/离心项(Coriolis and centrifugal terms),与 \( \dot{q} \) 线性相关,反映关节相互耦合带来的“速度相关”惯性效应;
  • \( G(q) \):重力项(gravity term),只与姿态 \( q \) 有关,表示为了平衡重力所需的关节力矩;
  • \( \tau \in \mathbb{R}^n \):各关节执行器产生的总力/力矩(control input)。

在更完整的工程模型中,常常把关节摩擦、外界扰动和末端外力也显式纳入,比如写成:

\[ M(q)\ddot{q} + C(q,\dot{q})\dot{q} + G(q) + \tau_{\text{fric}}(\dot{q}) + \tau_{\text{ext}} = \tau \]

  • \( \tau_{\text{fric}} \):粘性摩擦 + 底摩擦等;
  • \( \tau_{\text{ext}} \):末端或连杆受到外力(例如人拉动机械臂)通过雅可比 \( J(q) \) 映射到关节空间的力矩:\( \tau_{\text{ext}} = J(q)^\top F_{\text{ext}} \)。

重要性质(后续控制设计会频繁用到):(罗马大学诊断中心)

  1. \( M(q) \) 对称且正定: 对任意非零向量 \( x \),有 \( x^\top M(q) x > 0 \),这反映了系统动能总是正的。

  2. \( M(q) \) 与 \( C(q,\dot{q}) \) 满足能量守恒相关的结构性质: 对任意向量 \( x \),有

    \[ x^\top \big(\dot{M}(q) - 2C(q,\dot{q})\big) x = 0, \]

    这个反对称性质在证明控制器稳定性(Lyapunov 分析、被动性)时很有用。

图 6.2-1 占位: 建议放一张“机械臂 + 动力学方程结构”的示意图:左侧是多关节机械臂,右侧是框图,标出 \( M(q) \)、\( C(q,\dot{q}) \)、\( G(q) \) 分支,显示 \( \ddot{q}, \dot{q}, q \) 进入这些模块,再汇总为关节力矩 \( \tau \)。


6.2.1.2 与单自由度系统的类比:各项物理含义

如果只看一个单自由度转动关节,忽略耦合,可以写成熟悉的形式:

\[ I \ddot{\theta} + b \dot{\theta} + \tau_g(\theta) = \tau \]

  • \( I \):转动惯量;
  • \( b\dot{\theta} \):粘性阻尼;
  • \( \tau_g(\theta) \):重力产生的力矩。

这与高等物理中常见的“质量–阻尼–弹簧”系统 \( m\ddot{x}+b\dot{x}+kx = u \) 完全同构。 多自由度机械臂的动力学方程可以看作是这一单输入单输出系统在高维空间中的推广:

  • \( M(q)\ddot{q} \):像“多维质量项”,不仅数值随姿态变化,而且不同关节之间有耦合(非对角元素);
  • \( C(q,\dot{q})\dot{q} \):类似“速度相关的耦合阻尼”,在某些姿态下甚至会产生向心力矩(例如手臂挥动时需要额外力矩抵消离心效应);
  • \( G(q) \):重力引起的静态偏置力矩,机械臂抬高越高,重力力矩越大。

用这种类比,初学者可以先在“一维弹簧–阻尼–质量”直觉上建立感觉,再推广到关节空间的矩阵形式。


6.2.1.3 拉格朗日法推导思路

如果要系统地从机械臂结构推导出 M, C, G 的具体表达,常用的是拉格朗日法(Euler–Lagrange formulation)。(罗马大学诊断中心)

基本步骤如下(这里是“看懂思路版”,详细推导可以放在附录或练习中):

1.选择广义坐标\( q \) 对串联机械臂而言,关节角/位移正好就是约束完好的广义坐标。 2.写出动能\( T(q,\dot{q}) \)

  • 对每个连杆,考虑其质心速度和转动速度;

  • 将线速度、角速度表示为 \( q \) 和 \( \dot{q} \) 的函数;

  • 整个机械臂的动能为各连杆动能之和:

    \[ T(q,\dot{q}) = \frac{1}{2}\dot{q}^\top M(q)\dot{q}. \]

3.写出势能\(V(q)\)

  • 通常是重力势能之和;
  • 若存在弹簧等,还可加入其他势能项。 4.构造拉格朗日函数

\[ L(q,\dot{q}) = T(q,\dot{q}) - V(q). \]

5.套用 Euler–Lagrange 方程

\[ \frac{d}{dt}\left(\frac{\partial L}{\partial \dot{q}}\right) - \frac{\partial L}{\partial q} = \tau. \]

展开、整理后,自然得到

\[ M(q)\ddot{q} + C(q,\dot{q})\dot{q} + G(q) = \tau. \]

拉格朗日法的特点:

  • 得到的是解析的符号表达式,便于分析系统性质(对称性、能量守恒、被动性等);
  • 适合用来设计基于模型的控制器,如计算力矩控制(computed torque)、反馈线性化、阻抗控制等。

图 6.2-2 占位: “能量视角的动力学推导”示意图:上半部分是机械臂连杆示意,下半部分写出动能 \( T \) 和势能 \( V \) 的表达式,再用箭头指向 Euler–Lagrange 方程,最后得到 \( M(q), C(q,\dot{q}), G(q) \)。


6.2.1.4 牛顿–欧拉法推导思路

另一条常被工程使用的路径是牛顿–欧拉法(Newton–Euler formulation)。它直接基于牛顿第二定律(线加速度与力)、欧拉方程(角加速度与力矩)来做递推计算。(tomgra.folk.ntnu.no)

典型流程:

1.前向递推(forward recursion) 从基座开始,沿着机械臂链路递推每个连杆的:

  • 角速度、角加速度;
  • 质心线速度、线加速度。 2.后向递推(backward recursion) 从末端开始,按反方向递推每个连杆:
  • 合力、力矩;
  • 计算出作用在每个关节的反作用力矩,即所需的关节力矩贡献。
  1. 将所有链接递推结果综合起来,得到与拉格朗日法等价的动力学方程。

与拉格朗日法相比:

  • 牛顿–欧拉法倾向于给数值形式(recursive numeric form),方便实时计算“给定 \(q,\dot{q},\ddot{q}\),求所需 \(\tau\)”(即逆动力学),在实际控制与仿真中非常常用;
  • 拉格朗日法则更偏向于理论分析和求解系统整体性质。

在现代机器人软件栈中,诸如 RBDL、Pinocchio 等动力学库一般都基于牛顿–欧拉递推及其拓展版本实现。


6.2.1.5 一个二维双连杆机械臂示例(直觉版)

考虑一个二维平面内的 2-link 机械臂(上臂 + 前臂),关节为肩、肘两个转动自由度 q_1, q_2 ,各连杆质量为 m_1, m_2 ,长度 l_1, l_2 。 在忽略摩擦的情况下,其动力学可写成:

\[ M(q)\ddot{q} + C(q,\dot{q})\dot{q} + G(q) = \tau,\quad q = \begin{bmatrix}q_1 \ q_2\end{bmatrix} \]

其中:

  • \( M(q) \) 包含:
    • 自身转动惯量 \( I_1, I_2 \);
    • 由第二连杆质量引起的耦合项(比如当肘关节转动时对肩部力矩的影响);
  • \( C(q,\dot{q}) \) 包含与 \( \dot{q}_1\dot{q}_2 \)、\( \dot{q}_2^2 \) 等项相关的科里奥利和离心力;
  • \( G(q) \) 则是两节手臂在重力场中形成的力矩,例如当 \( q_1 \) 抬高时肩关节需要更大的力矩支撑整条手臂。

你可以把这个系统想象成“两个相连的摆锤”,只不过质量分布和惯性更复杂而已。

图 6.2-3 占位: 画一个平面 2-link 机械臂,在每个关节标出角度 \(q_1, q_2\),在各连杆标出质心、重力方向,并在关节标注 \(\tau_1, \tau_2\),帮助读者把公式与具体物理形象对应起来。


6.2.2 PID 控制与位置 / 速度 / 力矩控制模式

在有了动力学模型之后,一个自然的问题是:如何根据期望的轨迹 \(q_d(t)\) 生成关节力矩 \(\tau(t)\)?

最经典、也最广泛落地的做法,就是以 PID(比例–积分–微分)为核心的闭环控制结构。这一节先给出 PID 的直观解释,再说明工业机器人中常见的三种低层控制模式:位置控制、速度控制、力矩控制,以及它们的存在意义和适用场景。(mclab-me.pusan.ac.kr)


6.2.2.1 PID 控制的基本形式与直觉

对一个单关节来说,假设目标是跟踪期望角度 \(q_d(t)\),定义误差:

\[ e(t) = q_d(t) - q(t). \]

连续时间 PID 控制律可写为:

\[ u(t) = K_p e(t) + K_i \int_0^t e(\tau)\mathrm{d}\tau + K_d \frac{de(t)}{dt}. \]

+比例项(P):\( K_p e(t) \) 当前误差越大,输出越大,可以快速推动系统朝目标移动。\( K_p \) 越大,响应越快,但过大可能导致严重超调或震荡。 +积分项(I):\( K_i \int e(\tau)d\tau \) 积累历史误差。若系统存在稳态偏差(例如重力或摩擦导致的恒定偏差),积分项能够自动“补偿”,把误差逼向 0。但积分过强会导致响应变慢甚至“积分饱和”(出现大幅超调)。 +微分项(D):\( K_d \dot{e}(t) \) 对误差变化速度作出反应,有点类似预测未来趋势。误差变化快时,D 项会“刹车”,帮助抑制超调和震荡。但 D 项对噪声敏感,实际实现时常加入滤波。

在数字控制器中,PID 通常以离散形式实现,比如用差分近似微分和积分,或者采用“增量式”PID 以避免积分漂移。


6.2.2.2 三种低层控制模式:位置、速度、力矩

在工业和服务机器人产品中,控制接口往往抽象为三种模式:

1.**位置控制模式(Position Control)**控制器的输入:期望关节角 \(q_d\)(或轨迹 \(q_d(t)\)); 内部:每个关节驱动器自带位置环(通常还有更内层的速度、电流环),通过 PID 等方法让实际角度 \(q\) 跟踪 \(q_d\); 输出给电机的是电流/电压,但对上层来说是透明的。特点:

  • 对上层开发者非常友好,只需给出目标角度;
  • 高度稳定、安全,一般具有软限位和速度限制;
  • 但无法灵活控制关节施加的力,只能“尽力跟踪角度”。 2.**速度控制模式(Velocity Control)**控制器的输入:期望关节速度 \(\dot{q}_d\); 内部:驱动器保证实际速度 \(\dot{q}\) 跟踪 \(\dot{q}_d\),位置不直接受控。应用:

特点:

  • 移动机器人底盘(差速轮、全向轮):给定线速度/角速度;
  • 连续旋转任务(如输送带驱动电机)。
  • 适合“持续运动”的场景;
  • 上层需要自己积分速度生成位置,对轨迹规划负责。

3.**力矩(或电流)控制模式(Torque / Current Control)**控制器的输入:期望关节力矩 \(\tau_d\)(或等价的电机电流); 内部:只做电流/力矩闭环控制,基本不对位置/速度做显式闭环(当然也有安全限幅)。优点:

缺点:

  • 给予上层最大自由度,可直接利用动力学模型设计精细的控制律(计算力矩控制、阻抗控制等);
  • 可实现柔顺控制、人机交互等高级行为。
  • 上层必须承担更多稳定性和安全性可靠性责任;
  • 对模型精度和控制频率要求较高。

图 6.2-4 占位: 用层次框图展示“电流环(力矩)→ 速度环 → 位置环”三层结构,并用箭头说明:上层如果用位置控制,则实际上是通过嵌套的 PID 环间接控制电流;如果选用力矩模式,则直接绕过外层,站到最内层。


6.2.2.3 控制模式的适用场景与与动力学前馈的结合

综合来看,三种模式可以这样理解:

+位置控制: “尽量把关节拉到这儿来”,对高精度定点、重复性轨迹非常合适(典型工业机械臂焊接、搬运等)。 +速度控制: “保持这样的速度走/转”,对导航、持续旋转设备、轮式机器人驱动非常合适。 +力矩控制: “产生这样大小的力矩/力”,适合需要与环境互动、需要柔顺性的任务,例如协作机械臂、人机共抓重物、装配插销、打磨等。(MathWorks)

在力矩控制模式下,我们可以直接利用动力学方程设计所谓的计算力矩控制(Computed Torque Control)或反馈线性化控制:(mclab-me.pusan.ac.kr)

\[ \tau = M(q)v + C(q,\dot{q})\dot{q} + G(q), \]

其中 v 是一个新的“虚拟加速度”控制量,例如:

\[ v = \ddot{q}_d + K_v(\dot{q}_d - \dot{q}) + K_p(q_d - q), \]

代入动力学方程后,系统在理想模型下可化为:

\[ \ddot{q} = \ddot{q}_d + K_v(\dot{q}_d - \dot{q}) + K_p(q_d - q), \]

变成一组解耦的二阶线性系统,调 K_p, K_v 即可获得类似“二阶系统”的响应。这种“模型前馈 + PID 反馈”结构在理论上优雅,在工程上也十分常见。


6.2.3 阻抗控制与顺应性控制的直觉

单纯的“把手臂拉到某个位置”在许多任务中是不够的。比如:

  • 把插头插入插座,需要在碰撞到边缘时让一点,而不是死命顶上去;
  • 人推一下协作机器人手臂,希望它像一个带弹簧的物体那样略微退让,而不是僵硬不动或狂抖。

这类任务要求机器人不仅要跟踪轨迹,还要在碰到环境或人时呈现某种“机械特性”——像软弹簧?像硬杆?像带阻尼的弹簧?

阻抗控制(Impedance Control)顺应控制(Admittance Control)正是为此而提出的交互控制策略。它们都是从虚拟的“质量–弹簧–阻尼”模型出发,让机器人在接触中表现出可调的“硬/软”特性。(ScienceDirect)


6.2.3.1 阻抗控制:让末端“表现成弹簧–阻尼系统”

在力学中,“阻抗(impedance)”描述的是力–运动之间的关系,例如力与速度、加速度的关系。对机器人末端(任务空间)坐标 x 来说,一个典型的二阶阻抗模型是:

\[ M_d(\ddot{x} - \ddot{x}_d) + D_d(\dot{x} - \dot{x}_d) + K_d(x - x_d) = F_{\text{ext}}, \]

其中:

  • \(x, \dot{x}, \ddot{x}\):末端实际位置、速度、加速度;
  • \(x_d, \dot{x}_d, \ddot{x}_d\):期望末端轨迹;
  • \(F_{\text{ext}}\):环境对末端施加的外力(通过力/力矩传感器测得);
  • \(M_d, D_d, K_d\):期望的虚拟质量、阻尼、刚度矩阵(通常设计为对角阵)。

含义可以这样理解:

  • 没有外力时(\(F_{\text{ext}} = 0\)),末端会尽量跟踪 \(x_d\),偏差满足一个“虚拟质量–弹簧–阻尼”系统;
  • 当环境施加外力时,末端偏离期望轨迹的程度由 \(M_d, D_d, K_d\) 决定:
    • \(K_d\) 大 → 刚度高 → 末端更“硬”;
    • \(K_d\) 小、\(D_d\) 足够 → 末端更“软”,容易在外力作用下产生位移但不会长时间震荡。

在实现上,阻抗控制通常在力矩控制模式下工作:

  1. 用传感器测得 \(F_{\text{ext}}\);

  2. 在任务空间按上述方程计算期望的末端加速度/力;

  3. 通过雅可比 \(J(q)\) 把期望末端力转换成关节力矩命令:

    \[ \tau = J(q)^\top F_{\text{cmd}} + \text{(可能的重力补偿等项)}. \]

很多关于“操作空间控制(operational space control)”的工作,都是在此基础上进一步通过 \(M(q)\) 和 \(J(q)\) 引入任务空间惯量,从而直接在末端空间设计控制律。(SAGE Journals)

图 6.2-5 占位: 画一个机械臂末端与环境接触的示意图,在末端画一个“虚拟弹簧–阻尼器”与环境相连,用箭头标注 K_d 、 D_d ,并用文本说明:“通过调节 K_d, D_d ,机器人末端的软硬度可调”。


6.2.3.2 顺应控制(Admittance Control):把力当作输入,输出运动

与阻抗控制相对的是顺应控制(Admittance Control)。在电路类比中,阻抗是 V/I ,顺应(admittance)是其倒数 I/V ;在机器人里可以粗略地理解为:

  • 阻抗控制:输入是位移/速度,输出是力(“不让你随便推”);
  • 顺应控制:输入是外力,输出是位移/速度(“你推我我就动”)。(Ris)

典型的顺应控制结构如下:

1.力输入 由末端力/力矩传感器测到 \(F_{\text{ext}}\)。 2.虚拟质量–阻尼–刚度模型 在控制器中模拟一个虚拟物体,其动力学为:

\[ M_v \ddot{x}_{\text{cmd}} + D_v \dot{x}_{\text{cmd}} + K_v (x_{\text{cmd}} - x_d) = F_{\text{ext}}. \]

  • \(x_{\text{cmd}}\):由控制器生成的“命令位置”;
  • 上层位置/速度控制器把 \(x_{\text{cmd}}\) 作为目标。 3.位置/速度环执行 将 \(x_{\text{cmd}}(t)\) 转换为关节空间轨迹或速度命令,由底层位置/速度控制器(而非力矩控制器)执行。

顺应控制的优势在于:

  • 适用于刚性很高、内环位置/速度控制较成熟的机器人(无需原生力矩控制接口);
  • 在人机交互场景中,可以通过调节虚拟参数 M_v, D_v, K_v 轻松改变顺应性——例如让机械臂在被人牵引时表现得更轻、更柔软;
  • 在工业中已有大量应用,例如外力协助的示教、协作手臂、康复机器人等。

6.2.3.3 阻抗 vs 顺应:物理直觉与应用场景

阻抗控制与顺应控制本质上都是在“形塑(shape)机器人与环境的交互动力学”。两者区别主要体现在实现方式和对硬件的要求上:(MathWorks)

+阻抗控制(Impedance)

  • 更自然搭配力矩控制模式
  • 控制器直接输出期望力/力矩;
  • 适合机器人本体柔软/关节具有一定顺应性的场景;
  • 硬环境(刚性治具、刚性工件)接触时表现更稳健。 +顺应控制(Admittance)
  • 更自然搭配位置/速度控制模式
  • 控制器根据测得的外力计算期望位移/速度;
  • 适合机器人本体刚度较高,但配有准确力传感器;
  • 与人或软体环境交互时表现出良好的顺应性和安全性。

典型应用包括:

+打磨/抛光:需要沿着工件表面以一定压力滑动,常采用阻抗控制来维持稳定接触力。 +插接/装配:如插销入孔、插线、插 USB,阻抗/顺应控制允许末端在插入时自动“找孔”,而不是完全依赖几何精度。 +人机协作:人牵着协作机器人手臂做示教,或人直接推机器人改变其轨迹,顺应控制可以让机器人像一个“有弹簧的助手”而不是一个“刚性机器”。

这一节中的思想,在后续更高级的 VLA 控制中仍然适用:高层策略可以输出期望的刚度/阻尼参数,而低层控制器(阻抗或顺应控制)负责把这些“行为风格”体现在物理交互中。


6.2.4 低层控制器 vs 高层策略的分层结构

至此,我们已经有了:

  • 动力学模型 \( M(q), C(q,\dot{q}), G(q) \);
  • 经典低层控制方法:PID、位置/速度/力矩模式;
  • 交互控制方法:阻抗控制与顺应控制。

然而,一个完整的具身智能系统从感知–决策–控制到执行往往结构复杂。实践中,人们通常采用一种分层控制架构:(MDPI)

+低层控制器(Low-Level Controller):负责毫秒级的伺服、稳定性和安全; +高层策略(High-Level Policy/Planner):负责秒级甚至更长时间尺度的任务规划、策略决策——包括传统规划算法和基于 RL / VLA 的策略。


6.2.4.1 低层控制:高速伺服与安全守门员

低层控制通常包含以下内容:

1.电流/力矩环(kHz 级)

  • 硬件驱动器内部,基于电流传感器调整 PWM;
  • 实际频率可达几 kHz,用于精确实现力矩命令、快速抑制电机扰动。 2.速度环(几百 Hz)
  • 计算当前速度误差 \(\dot{q}_d - \dot{q}\);
  • 输出期望电流/力矩给电流环;
  • 保证速度响应平滑,限制最大速度、加速度。 3.位置环(几十到几百 Hz)
  • 计算位置误差 q_d - q ;
  • 输出速度或力矩命令;
  • 确保轨迹跟踪、软限位、安全停止。

这三层可以由同一控制器分时执行,也可以分布在驱动器 MCU 和主控工控机/嵌入式 CPU 上。它们共同的特点是:

高频率(例如 100–1000 Hz)、低延时、强安全约束。

无论高层算法是什么样(RL policy、VLA 模型、传统规划器),只要通过这些低层接口下发命令,就能在一定程度上保证机器人在物理层面不会“发疯”。


6.2.4.2 高层策略:任务规划与智能决策

高层策略可以来自多种来源:

  • 传统的路径规划与轨迹优化算法(RRT*, CHOMP、MPC 等),输出末端或关节轨迹;
  • 任务级规划器(Task Planner),基于符号状态和动作描述生成“拿起 → 移动 → 放下”的高层动作序列;
  • 深度强化学习策略(RL Policy),以状态(视觉 + 机器人状态)为输入,输出高层动作(如期望末端速度、期望关节速度,甚至期望阻抗参数);
  • VLA 模型,将视觉 + 语言 + 动作建模在统一 Transformer 中,直接输出高层动作 token。

它们的共同点是:

+决策频率较低,通常在 5 – 50 Hz;

  • 输出的是更“抽象”的控制接口,如期望末端 pose、短时序列动作、目标轨迹片段等,而不是直接 PWM。

图 6.2-6 占位: 画一个“分层控制”框图:最上层是“语言指令 / 任务规划 / VLA 策略”,中间是“高层动作接口(末端目标、delta pose、速度命令、阻抗参数)”,最下层是“关节级伺服(PID、电流环) + 动力学模型”。用不同时间尺度标注各层频率(例如 10 Hz / 100 Hz / 1 kHz)。


6.2.4.3 分层结构的优势与与后续章节的衔接

采用分层结构有几个关键好处:(MDPI)

1.稳定性与安全性可控低层控制闭环总是存在,并且由可靠的模型和经验设计保证稳定。高层策略即使有波动或短暂不稳定,低层也可以通过限幅、饱和、阻抗/顺应控制等手段进行“缓冲”。 2.复用性强同一套低层控制器可以服务于不同高层算法:

只要接口一致,高层算法可以独立演化。

  • 今天用传统规划;
  • 明天换成 RL 策略;
  • 后天接入 VLA 模型。

3.易于工程调试与分工控制工程师可以专注于低层伺服和安全,AI/学习方向的研究者可以专注于高层策略和模型结构,两边通过清晰接口协作。 4.自然承接到 VLA 模型在本书后续章节(尤其是第 8、9、10 章),VLA 模型通常扮演“高层策略”的角色:

  • 输入:视觉观测、语言指令、机器人状态;
  • 输出:末端位姿增量(Delta Pose)、关节速度命令、抓取/释放指令,甚至期望阻抗参数;
  • 然后通过第 6 章介绍的低层控制与动力学执行到真实机器人上。

而第 6.3 节“任务建模与动作表示”会进一步细化高层策略输出的形式,比如关节空间轨迹 vs 末端轨迹、delta pose / velocity 命令、动作原语等,使“VLA 输出的动作”与“第 6.2 节介绍的低层控制接口”在概念上严丝合缝地对接起来。


这一整节从动力学方程到 PID、再到阻抗/顺应控制和分层结构,基本构成了“机器人低层控制”的核心框架。读者在掌握这些内容后,就可以比较从容地理解后面章节中 VLA 模型如何“站在低层控制肩膀上”,把高维感知和语言理解转化为可靠的物理行为。

本章小结与自测

三行小结

  1. 本章提供机器人几何、动力学与控制接口基础。
  2. 重点是把数学方程映射到可执行控制命令。
  3. 学完后应能读懂常见机器人控制管线。

检查题

  1. 用你自己的话总结本章最核心的一个公式/机制。
  2. 给出一个“如果要落地到项目里,你会怎么用”的具体例子。

常见误区

  1. 只会调用 API,不理解坐标系。
  2. 控制频率与模型延迟不匹配。
  3. 未考虑硬件限位与安全约束。

公式到代码(最小示例)

import numpy as np

R = np.eye(3)
p = np.array([0.1, 0.2, 0.3])
T = np.eye(4)
T[:3, :3] = R
T[:3, 3] = p
print(T)

本章外部参考(集中)

  1. 罗马大学诊断中心
  2. tomgra.folk.ntnu.no
  3. mclab-me.pusan.ac.kr
  4. MathWorks
  5. ScienceDirect
  6. SAGE Journals
  7. Ris
  8. MDPI

6.3 任务建模与动作表示

6.3.1 关节空间轨迹 vs 末端位姿轨迹

学习导航

  • 本章主题:6.3.1 关节空间轨迹 vs 末端位姿轨迹
  • 前置知识:建议先完成第 1 章线代与第 5 章基础。
  • 建议用时:74-94 分钟
  • 阅读顺序:先看概念框架,再看公式/代码,最后做自测。

在上一节中,我们已经从动力学和低层控制的角度讨论了机器人“怎么动得稳”。本节开始从任务层出发,讨论“应该规划一条什么样的动作轨迹”,以及这些轨迹如何被编码为适合学习和控制的表示。

从本质上看,轨迹规划可以在两种空间中进行:

  • 关节空间(joint space):直接对各个关节角度随时间的变化进行规划;
  • 笛卡尔空间 / 操作空间(Cartesian / task space):对末端执行器的空间位姿进行规划。(mclab-me.pusan.ac.kr)

理解这两种描述方式及它们的折中,是后续设计 VLA 模型动作表示的基础。


6.3.1.1 关节空间轨迹:直接在关节角度上规划

定义与表示形式 设机器人有 \(\displaystyle n\) 个关节,关节向量记为

\[ q(t) = [q_1(t), q_2(t), \dots, q_n(t)]^\top \]

关节空间轨迹就是在给定时间区间内,为每个关节规划一条随时间变化的函数 \(q_i(t)\),通常要求这些轨迹在位置、速度、加速度上都是连续且平滑的(例如多项式插值、样条插值)。(哥伦比亚大学计算机学院)

优点:天然满足关节约束与动力学约束

+易于施加关节限制:关节速度、加速度、力矩等限制天然定义在关节空间中,因此通过限制 \(q(t)、\dot q(t)、\ddot q(t)\) 的边界可以直接保证不超限。 +与低层控制匹配:大多数工业机器人伺服控制器的内部接口本来就是“期望关节角/关节速度”,因此规划出的关节轨迹可以几乎直接下发。(首尔科技大学) +数值稳定:在关节空间进行插值,可以避免在接近奇异位形时末端轨迹出现过大的速度或加速度。

缺点:在任务空间不直观

+路径形状“不可见”:给定两个关节配置 \(q_\text{start}\) 和 \(q_\text{goal}\),在关节空间做一条看似平滑的插值,映射到末端的路径可能会绕远路、穿过障碍物,甚至在某些姿态下关节严重弯折,这在规划时并不直观。(ResearchGate) +难以精确约束末端行为:比如“末端保持竖直、沿直线从 A 移到 B”,关节空间轨迹很难直接表达这样的几何约束。

典型使用场景

  • 无人协作、环境比较空旷的工业场景(如点到点搬运),只要末端在起点和终点准确即可,中间路径没那么重要;
  • 对动力学和关节力矩有严格要求的高速运动(如喷涂、高速搬运),需要在轨迹规划阶段就考虑关节加速度和力矩极限。

【图 6-3-1 占位:二维平面 2 自由度机械臂,从同一个起点到终点,展示“关节空间线性插值”和“末端空间直线轨迹”在工作空间中的路径差异。】


6.3.1.2 末端位姿轨迹:在笛卡尔空间中规划路径

定义与表示形式 末端执行器的位姿通常记为

\[ x(t) = {p(t), R(t)} \]

其中 \(p(t)\) 为位置,\(R(t)\) 为姿态(可用旋转矩阵、欧拉角或四元数等表示)。笛卡尔空间轨迹就是为 \((p(t), R(t))\) 直接规划一条路径,例如“末端沿直线或圆弧移动,同时保持某个方向”。(diag.uniroma1.it)

规划完成后,需要通过**逆运动学(IK)**将每个时间步的末端位姿 \(x(t)\) 转换为关节配置 \(q(t)\),再交由低层控制器执行(对应 6.1.4 中的 IK 内容在任务层的应用)。

优点:直观且易于表达几何约束

+路径可视化清晰:工程师可以直接在工作空间中画出“末端从桌面上方某点沿直线插入盒子内”的轨迹,便于人类理解与调试。 +易于避障与安全约束:障碍物、禁行区域等都自然定义在工作空间中,在笛卡尔空间规划路径更便于保证末端不穿透桌面、不碰撞墙体。 +方便与视觉/语言对齐:视觉识别得到的是物体在相机或世界坐标系下的位置,语言指令也常以“把某物移动到某处”表述,从末端位姿出发可以减少表示上的跨度,这一点与后续 VLA 模型中的“操作空间动作 token”有很好呼应。

缺点:需要逆运动学与奇异性处理

+需要 IK 求解:对于高自由度或构型复杂的机械臂,解析 IK 不一定存在,只能用数值迭代,可能出现收敛失败或多解选择问题。(doc.aldebaran.com) +奇异位形与关节极限问题:规划在笛卡尔空间是连续的,但映射到关节空间时可能经过奇异位形或导致某些关节角接近极限,因此必须在 IK 与轨迹生成中额外检查。 +动力学约束不显式:末端路径看起来很好,但对应的关节加速度和力矩不一定在安全范围内,通常需要额外的时间尺度调整或再优化。

典型使用场景

  • 需要严格控制末端路径形状的任务:例如“沿直线插入孔内”、“沿焊缝轨迹焊接”、“沿边缘擦拭”。
  • 对“对人安全”和“可解释路径”有要求的人机协作场景:操作员希望看到末端的动作是可理解、可预期的。

6.3.1.3 混合规划:在笛卡尔空间设关键节点,在关节空间生成可执行轨迹

实际系统中,常用的并不是“纯关节空间”或“纯笛卡尔空间”两极,而是两者的混合策略

1.在笛卡尔空间指定关键路径点(waypoints)

  • 例如抓取任务中:
    • 远离物体的“预抓取位姿”;
    • 靠近物体表面的“接近位姿”;
    • 真正抓取时的“抓取位姿”;
    • 抬起后的“撤离位姿”。(MoveIt)
  • 这些关键位姿由感知模块(视觉、力觉)和任务规划模块共同产生,与 8 章中的高层规划输出一致。 2.对关键点之间进行插值
  • 在笛卡尔空间做位置和姿态插值(直线、样条),得到一串更密的末端位姿样本。 3.调用 IK 生成关节轨迹
  • 对每个插值后的末端位姿调用 IK 求解得关节角;
  • 在关节空间对这些离散点再次进行平滑(如时间重分配、多项式拟合),保证速度、加速度连续,最终获得可执行的关节轨迹。(哥伦比亚大学计算机学院)

这种“笛卡尔空间规划 + 关节空间执行”的混合方式,既保留了末端路径的直观性,又充分利用了关节级限幅与动力学约束的优势,是工程实践和现代机器人学习系统里最常见的做法。后续在讨论“动作原语”和“抓取模式”时,可以把每个原语理解为:在笛卡尔空间定义了一些关键位姿和运动形状,再自动转化为底层关节轨迹。

【图 6-3-2 占位:展示一个抓取任务的关键笛卡尔路径点(预抓取、接近、抓取、撤离)以及这些点通过 IK 映射到关节空间轨迹的示意图。】


6.3.2 Delta Pose / Velocity 命令的含义

在具身智能与 VLA 模型中,一个常见的设计是让策略网络直接输出“增量位姿”或“末端速度”命令,而不是最终轨迹。这类命令与 6.2 中的低层控制接口紧密相连:高层在较低频率上输出 delta/速度,低层控制器在高频率上进行插值和闭环控制。


6.3.2.1 增量位姿命令(Delta Pose)

基本形式 若当前末端位姿为 \((x_t = {p_t, R_t})\),高层策略输出一个增量位姿

\[ \Delta x_t = {\Delta p_t, \Delta R_t} \]

则下一步目标位姿为

\[ x_{t+1} = x_t \oplus \Delta x_t \]

其中 \(\oplus\) 表示位姿的组合(位置相加、姿态用旋转复合,例如四元数相乘)。

在实现上,这通常表现为:

  • 高层每隔 \(20 \sim 100\) ms 计算一次较小的位姿增量(单位可以是 m、rad 或归一化后的步长);
  • 低层控制器将 \(x_{t+1}\) 作为当前位置的短距离目标,通过 IK + 关节控制使末端快速靠近该目标;
  • 连续叠加这些小增量,就形成了一条平滑轨迹。

优点与直觉

+相对命令,更适合闭环调整:策略只需要“往前挪一点”、“向左偏一点”,对环境变化的响应更自然; +数值平稳:每一步增量较小,降低了策略输出突然大幅跳变的风险,对强化学习和模仿学习都更友好; +和视觉伺服自然结合:可将视觉误差(例如末端与目标的偏差)直接映射为下一步的增量位姿,实现“看到一点,改一点”的控制模式。(PMC)

在 VLA 实现中,Delta Pose 往往被离散化成若干 token(例如“x 方向 +1 单位格”、“z 方向 -1 单位格”、“绕 z 轴旋转 +5°”),从而可以由 Transformer 等序列模型输出。


6.3.2.2 速度命令(Velocity Command)

另一种常见方式是直接在操作空间输出末端线速度 + 角速度

\[ v_t = [v_x, v_y, v_z, \omega_x, \omega_y, \omega_z]^\top \]

在时间步长 \(\Delta t\) 下,末端位姿的更新可近似为

\[ p_{t+1} \approx p_t + v_{lin,t} \cdot \Delta t,\quad R_{t+1} \approx R_t \cdot \exp(\hat\omega_t \Delta t) \]

低层控制器在更高频率下根据这些速度设定关节速度,积分得到真实轨迹。

特点

+连续控制感更强:在时间上看,机器人“持续地朝某个方向运动”,非常适合描述平滑运动、推拽、擦拭等操作; +方便施加速度上限:在接口层限制 \(|v_t|\) 即可保证安全,不会出现瞬时大位移; +与动力学控制兼容:在力控或阻抗控制框架下,期望速度往往是控制方程中的显式变量,用速度命令更易结合。

速度命令在工业控制与视觉伺服中应用广泛,例如通过图像误差生成运动速度,确保末端在摄像机视野中按照一定速率收敛到目标。(doc.aldebaran.com)


6.3.2.3 相对命令 vs 绝对命令:何时用哪一种?

从抽象上看,可以把控制命令分成两类:

+绝对命令(absolute command)

  • 直接给出目标关节位置 \(q^{*}\) 或目标末端位姿 \(x^{*}\);
  • 控制器的任务是“尽快把机器人从当前状态拉到目标”,典型于点到点快速定位、搬运。 +相对命令(relative command)
  • Delta Pose、速度命令都属于“相对控制”:每一步都在当前状态的基础上做一个小改动;
  • 更适合连续跟踪、细致操作,以及在执行过程中不断根据传感反馈修正轨迹。

如何选择?可以粗略遵循以下原则:

  • 任务几何结构简单、只需要把物体“从 A 搬到 B”,且环境基本静态 → 用绝对命令更简单,和关节空间轨迹规划相似;
  • 任务需要持续闭环调整,例如抓取时对准物体、旋转瓶盖、插销入孔等 → 用相对命令更合适,控制策略学到的是“误差→修正”的局部规则;
  • 在 VLA 中,绝对命令更像“规划一个目标位姿”,相对命令更像“一步一步执行策略”;两者在 8 章中会分别对应“高层子目标输出”和“低层连续控制输出”。

6.3.3 动作原语(skill primitives / motion primitives)

有了轨迹与命令的基本概念,下一步是建立更高层的动作抽象。 如果把“Delta Pose / Velocity 命令”看作机器人控制的“字母”,那么动作原语就对应“单词”或“短语”:在一个较长时间窗口内实现一个相对完整的小目标,例如“抓起桌上的杯子”、“沿边缘推一段距离”。(arXiv)


6.3.3.1 概念:常用子动作的封装

**动作原语(motion / skill primitive)**通常具有以下几个特征:

1.时间上有限、空间上局部

  • 原语持续一段有限时间(例如 0.5–3 秒),在一个局部区域内完成特定动作。 2.内部包含固定的控制逻辑或轨迹模板
  • 例如“抓取”原语内部可能包含:接近、闭合手爪、检测抓取成功、微调姿态等一整套控制流程;
  • 这些流程可以直接由规则 + 控制算法手写,也可以由学习得到的策略来实现。(CMU Robotics Institute) 3.参数化
  • 一个原语往往带有少量参数,如目标位置、目标朝向、接近方向等;
  • 同一个“抓取”原语,通过不同参数化就能抓取桌上不同位置、不同朝向的物体。(arXiv)

典型原语包括:抓取(grasp)放置(place)推动(push)拉动(pull)擦拭(wipe)、**开门(open-door)**等。很多近期的机器人强化学习和终身学习工作,都是在这些原语上进行组合和参数学习。(CVF开放获取)


6.3.3.2 组合复杂任务:从“原语库”到“任务脚本”

引入动作原语的直接收益,是能够从离散层次上拼装复杂任务:

  • 对于“收拾桌面”这样的复杂任务,可以粗略写成:
    • 重复执行:{找到一个物体 → 抓取 → 搬运 → 放置到收纳盒};
  • 对于“装配任务”,可以组合:
    • {抓起零件 → 插入槽位 → 施加压力到底 → 松开 → 撤离}。

在系统架构上,常见做法是:

1.高层任务规划器(symbolic planner / LLM / VLA 高层)

  • 在符号或语言层面决定原语序列:

    \[ \text{Plan} = [\text{Grasp}(obj_1),\ \text{Place}(obj_1,\ box),\ \text{Grasp}(obj_2), \dots] \]

2.原语调度与参数选择

  • 对每个原语,基于当前视觉和状态选择参数:目标位置、方向、力阈值等。 3.原语内部控制与反馈
  • 原语内部运行自己的轨迹规划与闭环控制,一旦完成或失败,向上层报告结果。

这种层次结构使得系统更易解释、调试和扩展:

  • 如果“抓取”失败,多半可以定位到“抓取原语”的实现或参数,而不是整条长链条;
  • 对 VLA 模型而言,也可以设计成“预测下一步应该调用哪个原语,以及原语参数”,而不是直接在连续控制空间中长时间滚动控制。

6.3.3.3 学习动作原语:从示教到强化学习

动作原语可以由工程师手工设计,但随着任务增多和环境复杂,完全手工定义会变得困难,因此研究界大量工作关注从数据中学习动作原语。(dfki.de)

常见思路包括:

1.示教学习(Learning from Demonstration)

  • 从人类示范中分割出若干“重复出现的子动作片段”,通过聚类或序列建模发现潜在原语;
  • 为每个原语学习一个条件策略:输入局部观测 → 输出 Delta Pose / 速度命令;
  • 原语的参数来自于示范中的“接触点、目标位姿”等。 2.基于强化学习的原语优化
  • 先指定一个粗略的原语模板(例如“向目标点接近→闭手爪→抬起”),再用强化学习在模拟或现实中微调内部控制策略,以提高成功率、鲁棒性和效率。(arXiv) 3.多任务共享的原语
  • 不同技能(“抓香蕉”、“放锅”、“推门”)在空间上往往共享一些底层动作模式(如“从侧面接近并闭手爪”),可以用共享原语库建模,再针对不同任务学习高层组合和参数调节。(CVF开放获取)

在 VLA 框架中,这些学得的原语可以进一步被“语言化”:

  • 用自然语言描述原语的语义(如“轻轻抓起杯子”、“沿边缘推到尽头”),
  • 让大语言模型理解和调用这些原语,为“从语言到动作”的桥接提供更结构化的中间层。

6.3.4 抓取与操作任务的典型动作模式

最后,我们用“抓取”和“放置”等常见操作任务,具体展示一个动作从任务层描述 → 轨迹表示 → 控制执行的大致模版。这些典型模式也可以直接对应到上一节的动作原语。


6.3.4.1 抓取动作分解:接近、对准、抓紧、提起

一个看似简单的“抓起物体”动作,实际可以拆分为以下阶段:(MoveIt)

1.接近(approach)

  • 从安全距离上的“预抓取位姿”开始,沿着设计好的路径接近物体附近;
  • 通常要求路径避开障碍,并保持手爪朝向大致合理,以便后续微调。 2.对准(align)
  • 利用视觉或力觉反馈,逐渐修正末端位姿,使手爪与物体表面或主轴线对齐;(MDPI)
  • 对准过程往往使用 Delta Pose 或速度命令实现小幅调整,可能包含:
    • 平移到物体中心上方或侧面;
    • 旋转使夹爪面与物体抓取面平行;
    • 通过轻触桌面、检测力变化确认高度。 3.抓紧(grasp)
  • 在对准后缓慢闭合夹爪,监控力传感器或夹爪开合位置,确认物体已被稳定夹持;
  • 一些研究提出顺应性抓取原语,通过控制手指与支撑面的柔顺接触,显著提高抓取成功率。(CMU Robotics Institute) 4.提起(lift)
  • 在确认抓取成功后,沿着安全方向(通常是竖直向上)抬起物体,避免与周围物体碰撞;
  • 这一阶段结束时,机器人进入“携带物体”的状态,为后续放置或操作做好准备。

在具身智能系统中,每个阶段都可以被视作一个原语(“ApproachPrimitive”、“AlignPrimitive”、“GraspPrimitive”、“LiftPrimitive”),高层策略只需决定何时切换阶段及其参数。

【图 6-3-3 占位:抓取动作四阶段序列示意图,每个阶段配一帧图片(接近、对准、闭合、提起),并用箭头标注末端运动方向。】


6.3.4.2 放置动作分解:移动、接触、松开、撤离

与抓取相对的“放置(place)”动作,同样可以拆成多个阶段,且要求在接触与松开过程中保持物体的稳定和姿态正确。(MoveIt)

1.移动到目标位置附近

  • 根据任务指令(如“将杯子放到托盘中央”)与感知信息,规划一条轨迹,将物体移动到目标区域上方一定高度的“预放置位姿”;
  • 此阶段仍然以末端位姿轨迹规划和避障为主。 2.接触(place down)
  • 缓慢沿法向方向下降末端,使物体与目标表面接触;
  • 可以通过力传感器检测接触力是否在合理范围内,避免砸下去或悬空。 3.松开夹爪
  • 在物体已被支撑面稳定支撑的前提下,缓慢松开夹爪,并监控物体在图像或力觉上的反馈,确保未被带动滑动或翻倒;
  • 某些精密装配任务中,会引入“推压/微调”原语,在松开前先用小力将物体推至定位边缘。(MDPI) 4.撤离(retreat)
  • 松开后沿着安全路径撤回末端,避免带动周围物体或重新碰撞刚刚放置的物体;
  • 撤离路径常设计为先沿法向抬高,再在远离目标的方向移动。

在 MoveIt 等机器人软件中,完整的 “pick-and-place” pipeline 通常就是:

  • 抓取阶段:approach → grasp → lift;
  • 放置阶段:move → place down → release → retreat。(MoveIt)

6.3.4.3 其他操作模式:旋转、插入与高要求操作

除了抓取与放置,还有一类对对准和力控要求更高的操作任务,例如:

1.旋转(如旋开瓶盖、拧螺丝、扭门把)

  • 通常需要:
    • 抓取并固定物体本体(瓶身、螺母等);
    • 控制末端绕特定轴施加旋转位姿或扭矩;
    • 监控旋转角度与力矩变化,判断是否已经旋开或拧紧。
  • 这里,轨迹表示不仅包括位置和姿态,还需要显式地考虑力/扭矩限幅与顺应性控制。(CMU Robotics Institute) 2.插入(如插销入孔、插拔插头、装配轴–孔结构)
  • 几何对准精度要求高,误差容易导致卡死;
  • 常见模式是:
    • 在远处通过视觉对准,规划大致插入方向;
    • 靠近后使用小步长 Delta Pose + 力控,边轻触边调整姿态;
    • 在检测到插入深度或力反馈满足条件后,进入完全插入阶段。(MDPI) 3.推 / 拉 / 调整位置
  • 与抓取不同,推/拉往往利用环境约束(桌面边缘、槽口等)辅助定位,如通过推到边缘确保物体位置准确;
  • 典型做法是设计“推拽原语”,内部控制末端施加持续速度和限定力,并用视觉或位姿反馈判断是否到达目标。(MDPI)

这些高要求操作的共同特点是:

  • 轨迹局部形状接触力非常敏感;
  • 通常配合相对命令(Delta Pose / 速度)阻抗/顺应控制实现细颗粒度的调整;
  • 很适合作为独立的动作原语,通过示教和强化学习进行专门训练。

【图 6-3-4 占位:展示三类操作模式的典型示意: (a)旋开瓶盖:夹持瓶身 + 绕 z 轴旋转; (b)插销入孔:先对准、再沿孔轴缓慢插入; (c)利用环境约束的推拽:沿桌面边缘推动物体到定位位置。】


本小节到此为止,你可以把 6.3.1–6.3.4 看作是从“连续控制信号”上升到“任务动作单元”的第一层抽象:

  • 关节空间 vs 末端位姿轨迹明确了“在哪个空间里描述运动”;
  • Delta Pose / 速度命令是“步进式”的控制接口;
  • 动作原语和典型抓取/操作模式则为后续 VLA 模型提供了“结构化动作词汇表”。

在第 8 章中,我们会进一步看到,这些概念如何被编码为 token、序列和模块,使得视觉–语言–动作模型能在统一的框架下学习和调用这些动作能力。

本章小结与自测

三行小结

  1. 本章提供机器人几何、动力学与控制接口基础。
  2. 重点是把数学方程映射到可执行控制命令。
  3. 学完后应能读懂常见机器人控制管线。

检查题

  1. 用你自己的话总结本章最核心的一个公式/机制。
  2. 给出一个“如果要落地到项目里,你会怎么用”的具体例子。

常见误区

  1. 只会调用 API,不理解坐标系。
  2. 控制频率与模型延迟不匹配。
  3. 未考虑硬件限位与安全约束。

公式到代码(最小示例)

import numpy as np

R = np.eye(3)
p = np.array([0.1, 0.2, 0.3])
T = np.eye(4)
T[:3, :3] = R
T[:3, 3] = p
print(T)

本章外部参考(集中)

  1. mclab-me.pusan.ac.kr
  2. 哥伦比亚大学计算机学院
  3. 首尔科技大学
  4. ResearchGate
  5. diag.uniroma1.it
  6. doc.aldebaran.com
  7. MoveIt
  8. PMC
  9. arXiv
  10. CMU Robotics Institute
  11. CVF开放获取
  12. dfki.de
  13. 本章其余链接可在正文中按上下文继续查阅。

6.4 机器人操作系统与开发环境

6.4 机器人操作系统与开发环境(节选)

学习导航

  • 本章主题:6.4 机器人操作系统与开发环境(节选)
  • 前置知识:建议先完成第 1 章线代与第 5 章基础。
  • 建议用时:58-78 分钟
  • 阅读顺序:先看概念框架,再看公式/代码,最后做自测。

本小节聚焦如何把前面学到的运动学、控制理论真正“落在地上”:在实际机器人系统里,感知、决策和控制通常通过 ROS / ROS 2 串起来,并通过一套相对统一的接口与机械臂、移动底盘和传感器交互。本节从三个角度展开:

  • ROS / ROS 2 的基本概念
  • 常见机器人硬件接口
  • 实验室环境下的安全规范与调试流程

6.4.1 ROS / ROS2 基本概念(节点、话题、服务)

在机器人社区里,“会用 ROS”几乎已经成为基础技能。需要先澄清一点:ROS 并不是传统意义上的操作系统,而是一个面向机器人的中间件与工具生态 —— 它提供了一套标准的通信机制、工具链和约定,用来连接不同的程序、驱动和算法。ROS2 在此基础上重构了通信层,采用 DDS(Data Distribution Service)作为默认中间件,具备更好的实时性与可靠性配置能力。(ROS Documentation)

6.4.1.1 ROS 架构:节点与 ROS 图

在 ROS / ROS 2 里,每一个独立的程序进程都叫做一个节点(Node)。可以把节点想象成“机器人神经系统”里的一个小功能模块:

  • 有的节点负责读相机、雷达等传感器;
  • 有的节点负责路径规划或强化学习策略推理;
  • 有的节点负责直接控制电机驱动。

所有节点之间通过 ROS 提供的几种通信接口相互连接,形成一个ROS 图(ROS Graph):节点是图中的点,节点之间的各种连接(话题、服务、动作等)是边。ROS2 官方文档将其概括为“基于强类型匿名发布/订阅机制的消息传递系统”。(ROS Documentation)

这种设计的关键特性是松耦合

  • 发布者(Publisher)只负责往某个话题名发送消息,不关心谁在订阅;
  • 订阅者(Subscriber)只声明自己想订阅哪个话题、哪种消息类型,不需要知道消息来自哪个具体节点;
  • 节点可以在运行时加入或离开,只要遵守同样的接口约定,整套系统仍然可以协同工作。

【图片占位】 建议插图:一个 ROS 图示意图:若干节点(camera_node、perception_node、policy_node、arm_controller 等)通过不同颜色箭头连接,标注 Topic(/camera/image、/joint_states)、Service(/compute_ik)、Action(/arm_controller/follow_joint_trajectory)等,帮助读者整体理解。

在 ROS1 中,节点通过 master 做名称解析与发现;在 ROS2 中,节点发现由 DDS 的对等网络负责,拓展到多机、多网络场景更加自然,这对未来大规模具身智能系统(多机器人协作等)尤为重要。(ROS Documentation)

6.4.1.2 话题与消息:持续数据流

话题(Topic)是 ROS 中最基础也最常用的一种通信方式,可以理解为“有名字的消息管道”。节点之间通过发布/订阅话题来传递持续的数据流,例如:

  • 相机驱动节点持续在 /camera/image_raw 上发布图像帧(sensor_msgs/Image);(ROS Documentation)
  • 激光雷达节点在 /scan 上发布激光扫描数据(sensor_msgs/LaserScan);(ROS Documentation)
  • 里程计或 joint_state 发布当前关节状态(sensor_msgs/JointState)。(ROBOTIS e-Manual)

每个话题都同时绑定了一个消息类型(Message Type)。消息类型是一种强类型的数据结构,有类似 C 语言 struct 的字段定义,例如移动底盘常用的速度控制消息 geometry_msgs/Twist

# This expresses velocity in free space broken into its linear and angular parts.
Vector3 linear
Vector3 angular

(ROS Documentation)

在差动轮或全向轮移动机器人中,通常使用:

  • linear.x:沿机器人前进方向的线速度(m/s);
  • angular.z:绕垂直于地面的 z 轴旋转角速度(rad/s)。(Stack Overflow)

同一个话题的所有发布者和订阅者必须使用完全一致的消息类型,这使得跨语言(C++/Python)、跨平台节点之间仍能可靠通信。

在 ROS2 中,话题通信的底层由 DDS 实现,用户可以为不同话题配置QoS(Quality of Service)策略,例如:

  • 对控制命令话题使用可靠传输,确保每条命令都送达;
  • 对高帧率图像话题使用 best-effort,允许少量丢帧以减少带宽和延迟。(ROS Documentation)

【图片占位】 建议插图:Twist 消息在 base_link 坐标系中的含义示意图,对 x/y/z 线速度与绕 x/y/z 角速度的方向进行三维箭头标注。

6.4.1.3 服务与动作:请求-响应与长时任务

仅靠话题的“单向数据流”无法很好地表达请求-响应式的交互。例如:

  • “请帮我算一下某个末端位姿对应的逆运动学解”;
  • “请保存当前地图到磁盘”;

这种场景适合使用服务(Service)。服务是 ROS 中的同步 RPC 机制,其通信模式是一次请求 – 一次响应:客户端发送请求消息,服务器处理后返回响应消息。ROS2 官方文档强调,服务适合处理短时间内可以完成的操作,不适用于需要长时间执行、可能需要随时取消的任务。(ROS Documentation)

对于“移动到某个目标点”“执行一条机械臂轨迹”这类长时任务,ROS 提供了更高级的**动作(Action)**接口,尤其在 ROS2 中已经成为推荐做法。动作的特点是:(ROS Documentation)

  • 客户端发送一个目标(Goal)
  • 服务器在执行过程中不断通过**反馈(Feedback)**通道汇报进度(例如当前轨迹进度、剩余距离);
  • 执行结束后发送结果(Result)(成功、失败或被取消);
  • 客户端可以在过程中发送取消(cancel)请求,实现可抢占

动作本质上是基于话题和服务组合出来的更高层抽象,既保留了服务的“明确开始/结束”,又具备流式反馈的能力,在机器人导航、机械臂轨迹跟踪等场景中极其常见。

【图片占位】 建议插图:一个动作交互时序图:Client 发送 Goal,Action Server 发送一系列 Feedback,最后返回 Result,并标出中途 Cancel 的处理流程。

在后文 6.4.2 中会看到:基础机械臂控制通常通过 FollowJointTrajectory 动作接口,移动机器人则常通过 cmd_vel 话题来接收底盘速度命令,这些都是“上层算法 → ROS 接口 → 低层控制器”的典型组合。


6.4.2 常见机械臂 / 移动平台接口

虽然不同厂商的机器人在硬件和驱动上差异很大,但 ROS 社区逐渐形成了一套事实标准接口,使得上层算法(规划器、VLA 模型、RL 策略等)可以在不同机器人之间复用。

这一节只关心“接口长什么样”,而不再重复前面章节中关于运动学、动力学和控制律的推导。

6.4.2.1 机械臂接口:FollowJointTrajectory 动作

在 ROS / ROS2 中,机械臂关节空间控制最常见的接口是 control_msgs/FollowJointTrajectory 动作。其定义大致如下:(ROS Documentation)

  • 动作目标(goal)里包含一条 trajectory_msgs/JointTrajectory
    • joint_names:关节名称数组,例如 ["shoulder_pan", "shoulder_lift", ...]
    • points:多个时间点的轨迹,每个点包含 positions(必选)以及可选的 velocitiesaccelerationseffort 等,以及 time_from_start
  • 执行反馈(feedback)常包含当前轨迹执行进度、误差等;
  • 执行结果(result)包含成功/失败状态及错误原因。

典型的使用方式是:

  1. 上层规划器(例如 MoveIt 或自定义轨迹优化器)在关节空间规划出一条时间标定的轨迹;(MoveIt)
  2. 将轨迹封装为 FollowJointTrajectory 的 goal 发送给控制器动作服务器(例如 /arm_controller/follow_joint_trajectory);
  3. 控制器节点在内部以高频率运行(100–1000 Hz),对每个关节进行 PID 或更复杂的力矩控制,平滑跟踪整条轨迹;
  4. 上层仅需监控反馈和结果,不必关心控制细节。

【图片占位】 建议插图:

  • 上半部分:关节角度随时间变化的曲线(多条曲线),表示 JointTrajectory
  • 下半部分:FollowJointTrajectory Action 的数据结构示意,标注 goal → trajectory → points 的层级关系。

这种“轨迹作为目标、低层负责跟踪”的模式与 6.3 节的任务建模是自然衔接的:高层可以在末端空间规划轨迹,再用逆运动学转换为关节空间轨迹,最后交给 FollowJointTrajectory 执行。

6.4.2.2 移动底盘接口:geometry_msgs/Twist 与 /cmd_vel

大多数差动轮或全向轮底盘在 ROS 中都会实现一个 geometry_msgs/Twist 话题接口,一般命名为 /cmd_vel 或类似名称。(ROS Documentation)

Twist 的语义是“在某一坐标系下的线速度与角速度”:

  • linear.x, linear.y, linear.z:沿三个轴方向的线速度(单位 m/s);
  • angular.x, angular.y, angular.z:绕三个轴的角速度(单位 rad/s)。

在常见的平面移动机器人中,通常只使用:(Stack Overflow)

  • linear.x:前进/后退速度;
  • angular.z:绕竖直 z 轴的旋转速度;
  • 其余维度设置为 0。

上层导航或 RL 策略节点只需要在固定频率(例如 10–20 Hz)上发布 Twist 消息,底盘驱动节点会将其转换为轮子的转速命令并执行。很多开源机器人平台(如多代 TurtleBot)都采用 /cmd_vel + Twist 作为默认接口。(Kasimov)

在工程实践中,通常需要注意几件事:

  • /cmd_vel 话题设置超时机制:一段时间(如 0.5 s)没有新的命令则自动刹车,防止“僵尸速度命令”;
  • 对线速度和角速度做饱和限制,避免策略输出异常值导致危险运动;
  • 保证坐标系约定和前面 6.1 节中的位姿表示一致,例如 base_link 前方为 x 轴正方向。

【图片占位】 建议插图:一个差动轮机器人示意,标出 linear.x 指向前方、angular.z 绕竖直轴旋转的方向,使读者将 Twist 与物理运动对应起来。

6.4.2.3 传感器与手爪接口:标准消息与专用动作

传感器接口方面,ROS 提供了 sensor_msgs 包,定义了常用传感器的标准消息,包括:(ROS Wiki)

  • 相机:sensor_msgs/Image(原始图)、sensor_msgs/CompressedImage(压缩图)、sensor_msgs/CameraInfo(相机内参与畸变系数);(ROS Documentation)
  • 激光雷达:sensor_msgs/LaserScan(平面雷达)、sensor_msgs/PointCloud / PointCloud2(三维点云);(ROS Documentation)
  • 距离传感器:sensor_msgs/Range;(ROS 2 文档)
  • 关节状态:sensor_msgs/JointState(所有关节角度、速度、扭矩/电流等)。(ROBOTIS e-Manual)

实际使用时,通常由驱动节点(driver node)直接与硬件通信,并向这些标准话题发布消息。算法与 VLA 模型只需订阅标准化消息,而不必关心具体传感器品牌与通信协议,大幅提升了可移植性。

机器人手爪(Gripper)接口通常有两类做法:

  1. 将手爪视作“额外的关节”,使用 sensor_msgs/JointState 发布状态,再通过 FollowJointTrajectoryJointTrajectoryController 控制开合,如部分机械臂或仿真系统所采用的做法;(ROS Documentation)
  2. 使用专门的控制消息或动作,例如 control_msgs/ParallelGripperCommand 动作,其 goal 部分就是一个 sensor_msgs/JointState,包含期望的手爪开合位置和速度上限等参数。(ROS Documentation)

【图片占位】 建议插图:

  • 左:相机驱动节点发布 ImageCameraInfo 的话题结构;
  • 右:机械臂末端手爪的关节示意图,标出 JointState 中 position/velocity/effort 的含义,以及 ParallelGripperCommand 要求的目标。

在实际 VLA 系统中,上层模型最好只依赖这些抽象接口(例如“可抓取区域 → 抓取姿态 → 转换成 FollowJointTrajectory + 手爪动作”)。这样,当更换机械臂或手爪时,只需要替换下层驱动与 ROS 接口,而无需重写上层策略。


6.4.3 实际实验室环境中的安全规范与调试流程

具身智能研究与纯软件实验相比,最重要的差异就是:机器人真能撞东西(包括人)。因此,在具身智能实验室中,安全与调试流程必须被视为系统设计的一部分,而不是“最后再补几条规则”。

国际标准(如工业机器人安全标准 ISO 10218 系列以及协作机器人标准 ISO/TS 15066)不断强调:应通过风险评估、急停装置、安全距离和限速等手段,将机器人对人和环境的风险降到可接受范围。(国际标准化组织)

6.4.3.1 安全第一:硬件急停与工作空间管理

在进行任何机器人实验之前,建议首先检查硬件层面的安全功能

1.急停按钮(Emergency Stop)

  • 工业与协作机器人安全标准都明确要求必须配备可靠的急停装置,一旦触发可以立即切断电机驱动或进入安全刹车状态。(国际标准化组织)
  • 每次实验开始前,应人为按下急停按钮进行功能测试(确认机器人确实停止,并记录指示灯状态)。 2.安全工作空间与隔离
  • 对于桌面机械臂,可在地面或桌面划出安全区域危险区域:例如用胶带在地上圈出机械臂可能扫过的最大范围。
  • 对于高速或大负载机器人,建议使用物理安全围栏或光栅、扫描式安全传感器,确保非授权人员无法进入危险区域。(robotnik.eu)
  • 在学生实验环境中,可以采用“只允许操作者在机器人后方操作终端,前方区域严禁站人”的简单规则。 3.软急停与软件安全约束
  • 除硬件急停外,系统中要提供软件级“急停服务”,上一章提到的高层策略可以通过调用服务让底层立即停止轨迹或清空速度命令。
  • 在 ROS 层面,可以设计一个统一的“安全监控节点”,订阅关节状态、力/扭矩传感器、距离传感器等,一旦发现异常(速度过高、接触力超限、传感器失效),立即发布刹车命令或触发停机动作。

【图片占位】 建议插图:

  • 实验室平面示意:标出机器人、操作台、安全围栏、急停按钮的位置;
  • 用不同颜色区分“安全观察区”“操作区”“禁止进入区”。

在具身智能研究中,机器人经常执行由学习策略生成的动作,其行为可能超出开发者预期,因此“默认安全、逐步放权”的原则尤为重要。

6.4.3.2 调试步骤:从仿真到真实,以低速单步推进

为了避免对设备和环境造成不可逆的损伤,通常推荐采用如下渐进式调试流程:

1.仿真验证优先

  • 在第 7 章将详细介绍各类仿真平台(Gazebo、Isaac Sim、MuJoCo 等),在这里只强调原则:
  • 所有涉及运动规划、策略学习的算法,应当先在仿真环境中完成基本正确性和稳定性验证,例如路径是否自洽、关节限位是否被尊重、是否存在明显碰撞等。 2.上电后的人机共存检查
  • 首次在真实机器人上运行新软件前,先在“零速度/零力矩”模式下检查:
    • 关节编码器读数是否合理;
    • 力矩/电流是否在安全范围内;
    • 各类传感器(相机、激光雷达、IMU)数据是否正常更新。 3.低速、单步模式调试 +机械臂
    • 先用手动示教器或简短 ROS 程序测试单个关节小幅运动;
    • 再在小速度限制下执行简单点到点运动(例如 FollowJointTrajectory 仅包含两个点);
    • 在此过程中,观察机器人是否存在异常振动、末端路径是否与预期一致。(ROS Wiki) +移动底盘
    • 首先在开阔空间,以极低线速度和角速度通过 /cmd_vel 指令测试前进、后退、左右旋转,确认速度尺度与方向正确;(Kasimov)
    • 然后再加入避障逻辑和更复杂的导航。 4.逐步提高自动化程度
  • 初期阶段,由人工在终端发出简单命令、逐条执行动作;
  • 随着系统稳定性提升,可以让机器人自动执行一段短轨迹或短任务,并在任务间隙让人复查状态;
  • 最终才允许机器人在较大范围、较长时间内完全自动运行,同时需要配套安全监控与急停方案。

在 ROS / ROS2 中,有一些调试工具非常有用,但细节会在实践章节展开,这里只简单列举以便形成概念:

  • rviz / rviz2:可视化机器人模型、传感器数据(点云、图像)和规划轨迹;
  • rqt_graph:可视化当前 ROS 图,帮助理解各节点和话题的连接关系;
  • rqt_plot:绘制某个话题字段(如关节角度、控制误差)随时间的曲线;
  • rosbag / rosbag2:录制与回放话题数据,是调试与数据分析的核心工具。(robertchoi.gitbook.io)

【图片占位】 建议插图:

  • 一个“调试流程”流程图:从“仿真验证 → 真实机器人低速单步 → 自动执行短任务 → 长时间自动运行”的递进关系;
  • 旁边标注每个阶段建议使用的 ROS 工具(rviz、rqt_plot、rosbag 等)。

6.4.3.3 日志与录像:为错误“留证据”

在具身智能实验中,不可避免会出现各种“奇怪行为”:抓取失误、导航绕圈、机械臂突然震荡等。要想分析原因、改进系统,关键是在出问题之前就有足够的记录

一般建议从三个层面进行记录:

1.传感器和控制数据日志(ROS bag)

  • 使用 rosbag(ROS1)或 rosbag2(ROS2)录制关键话题,如:
    • /joint_states/tf(关节与坐标变换);
    • /camera/image_raw/scan 或点云话题;
    • /cmd_vel/arm_controller/follow_joint_trajectory/goal 等控制命令。(robertchoi.gitbook.io)
  • 日志文件可以在离线时回放,用于:
    • 重现实验情景,调试算法;
    • 离线训练或验证模型(与第 7 章的数据采集紧密相关,但这里重点仍在“调试用途”)。 2.关键变量与错误日志
  • 在控制节点和策略节点中,为关键变量(如代价函数、RL 奖励、规划失败原因)添加日志输出,并通过 ROS 日志系统(rosconsole / rclcpp logging)集中管理。
  • 对于容易出现数值问题的部分(优化器、神经网络推理)可以增加断言与异常捕获,一旦出错立即记录当前状态和输入。 3.视频录像与外部观察
  • 使用固定位置的相机(俯视或侧视)录制实验过程,与 ROS bag 的时间戳对齐。
  • 很多“看起来是感知问题”的错误,实际上可能是环境布置或机械结构问题,视频往往能给出关键线索。

【图片占位】 建议插图:

  • 一条时间轴,上面标出“ROS bag 数据流”“控制变量曲线”“外部视频帧”;
  • 示意如何将三者在时间戳上对齐,从而复现并分析一次失败的抓取或导航尝试。

在工程实践中,建议为每次重要实验赋予一个唯一的实验 ID,并将以下信息统一关联:

  • 实验 ID;
  • 使用的数据集版本、机器人配置(如机械臂型号、末端工具、传感器安装方式);
  • 所用代码的 Git 提交号;
  • 对应的 rosbag 文件名与录像文件名;
  • 实验简要备注(任务描述、是否成功)。

这套“为错误留证据”的习惯,既是面向科研复现的基本要求,也将直接影响你在后续调试 VLA 模型时的效率。在更大的系统层面,这与第 9.4 节的 MLOps 与数据工程实践是相互呼应的:机器人系统的稳定性,往往取决于你能多快定位并修复 bug,而不是单次跑通的精彩 demo。

本章小结与自测

三行小结

  1. 本章提供机器人几何、动力学与控制接口基础。
  2. 重点是把数学方程映射到可执行控制命令。
  3. 学完后应能读懂常见机器人控制管线。

检查题

  1. 用你自己的话总结本章最核心的一个公式/机制。
  2. 给出一个“如果要落地到项目里,你会怎么用”的具体例子。

常见误区

  1. 只会调用 API,不理解坐标系。
  2. 控制频率与模型延迟不匹配。
  3. 未考虑硬件限位与安全约束。

公式到代码(最小示例)

import numpy as np

R = np.eye(3)
p = np.array([0.1, 0.2, 0.3])
T = np.eye(4)
T[:3, :3] = R
T[:3, 3] = p
print(T)

本章外部参考(集中)

  1. ROS Documentation
  2. ROS Documentation
  3. ROS Documentation
  4. ROBOTIS e-Manual
  5. ROS Documentation
  6. Stack Overflow
  7. ROS Documentation
  8. ROS Documentation
  9. ROS Documentation
  10. ROS Documentation
  11. MoveIt
  12. ROS Documentation
  13. 本章其余链接可在正文中按上下文继续查阅。

7.1 仿真平台

7.1.1 常见仿真引擎(MuJoCo、Isaac Gym、Gazebo 等)

学习导航

  • 本章主题:7.1.1 常见仿真引擎(MuJoCo、Isaac Gym、Gazebo 等)
  • 前置知识:建议先完成第 6 章机器人运动与控制基础。
  • 建议用时:70-90 分钟
  • 阅读顺序:先看概念框架,再看公式/代码,最后做自测。

关键图示:Sim2Real 迁移

关键图示:Sim2Real 迁移

【建议插图】图 7-1:三个典型仿真平台界面截图对比(MuJoCo 操作任务、Gazebo 移动机器人场景、Isaac Gym 并行训练示意),帮助读者直观认识它们的风格与定位。

在具身智能和强化学习中,“仿真引擎 = 虚拟世界中的物理定律 + 传感器 + 机器人模型”。选择什么仿真平台,直接决定你能多快收集数据、物理是否可信、和实际机器人接口是否顺滑。

这里重点介绍三个在机器人和 RL 社区使用非常广泛的引擎 / 框架:MuJoCo、Gazebo 和 Isaac Gym(及其后继者)。


7.1.1.1 MuJoCo

MuJoCo(Multi-Joint dynamics with Contact)是 Google DeepMind 维护的开源物理引擎,专门面向机器人学、生物力学和机器学习。(mujoco.org) 它的特点可以概括为:高精度刚体动力学 + 强力接触模型 + 良好数学结构

1.定位与典型用途

  • 主要用于:机械臂操作、腿足机器人、各类连续控制基准环境(如 Gymnasium/MuJoCo 里的半倒立摆、Hopper、Walker2d、Humanoid 等)。(The Farama Foundation)
  • 在强化学习社区非常流行,很多 RL 算法(DQN 之后的一大批连续控制算法)都是先在 MuJoCo 环境上做基准实验。(arXiv) 2.建模方式与文件格式

这使得 MuJoCo 非常适合严肃的动力学研究与机器人控制算法验证。

  • MuJoCo 支持自有的MJCF(XML)模型格式,也支持从 URDF 导入机器人模型。
  • 在 MJCF 中可以精细指定:
    • 刚体的质量、惯量张量、几何形状;
    • 关节类型(转动、滑动、球铰等)和限制;
    • 摩擦参数(滑动、滚动、扭转摩擦);
    • 执行器(电机、力控制、位置控制等)。(mujoco.org)

3.数值特点:快速而稳定

  • MuJoCo 使用基于约束优化的接触求解与高效的隐式积分方法,能在保持较高精度的同时支持较大的时间步长。(arXiv)
  • 对 RL 来说,这意味着:在不牺牲太多物理精度的前提下,能以较快的仿真速度收集大量交互数据。 4.MuJoCo + GPU:MJX 的出现
  • 在新版本中,MuJoCo 提供了MJX模块,基于 XLA 在 GPU/TPU 上对一大批并行环境进行向量化仿真,专门为大规模强化学习优化。(mujoco.readthedocs.io)
  • 适用场景:需要像 Isaac Gym 那样同时跑成百上千个环境,但希望保持 MuJoCo 的接触精度和建模灵活性。 5.适合什么读者 / 项目?
  • 如果你:
    • 更关心单个机器人动作的精细动力学(例如操作、腿足);
    • 主要在Python + RL 框架(Gymnasium、Stable-Baselines3 等)中工作;
    • 不太需要复杂、精美的 3D 渲染和多机器人城市级场景;
  • 那么 MuJoCo 通常是一个非常合适的仿真“底座”。

7.1.1.2 Gazebo

Gazebo 是由 Open Robotics 社区维护的开源 3D 机器人模拟器,是 ROS/ROS2 生态中事实上的“官方”仿真标准之一。(gazebosim.org)

1.Gazebo Classic 与 Gazebo Sim 的演化

  • 早期版本被称为Gazebo Classic,集成了 ODE 等物理引擎、OpenGL 渲染以及丰富的传感器模型。(classic.gazebosim.org)
  • 之后社区推出了模块化的Ignition Gazebo,后来由于商标问题又统一改名为Gazebo(Gazebo Sim),而原先旧版本则称为 Gazebo Classic。(维基百科)
  • 当前推荐在 ROS2 + Ubuntu 新版本上使用的是现代的 Gazebo Sim。(PX4 文档) 2.Gazebo 的核心能力 +复杂场景建模:室内、室外、城市级别环境,支持多机器人、多传感器、天气和光照等。(gazebosim.org) +多物理引擎支持:可以切换 ODE、Bullet、DART 等物理后端(不同引擎在接触、稳定性和速度上表现略有不同)。(classic.gazebosim.org) +丰富传感器:RGB/深度相机、激光雷达、IMU、GPS 等,都有内置插件和噪声建模。(theconstruct.ai) +与 ROS 深度集成:Gazebo 中的机器人通常通过 ROS topic/service/action 对接到控制和感知节点,是实验室中调试移动机器人、无人机的标准工具链。(gazebosim.org) 3.典型使用场景
  • 移动机器人导航、SLAM、编队控制;
  • 服务机器人在家庭、仓储、工厂等环境中的任务验证;
  • 将真实系统的 ROS 节点“直接接到仿真上”,实现软硬件在环(HIL)测试。 4.优势与局限
  • 优点:
    • 场景、传感器、ROS 接口非常成熟,适合**“真实机器人系统”级**的仿真;
    • 图形界面友好,新手易上手。(theconstruct.ai)
  • 局限:
    • 主要在 CPU 上运行,在需要百万级时间步的强化学习训练时,速度往往远不如 GPU 并行仿真框架;
    • 物理精度足以满足多数工程应用,但在细致接触建模上不如 MuJoCo 等专门引擎灵活。

7.1.1.3 Isaac Gym(及 Isaac Sim / Isaac Lab)

Isaac Gym 是 NVIDIA 发布的一款面向强化学习的 GPU 加速仿真框架,可将物理仿真 + RL 计算都放在 GPU 上执行,从而获得 2–3 个数量级的加速。(Medium)

1.核心思想:端到端 GPU 仿真

  • 传统做法:仿真在 CPU,神经网络在 GPU,中间需要大量数据在 CPU/GPU 间来回拷贝。
  • Isaac Gym:仿真由 GPU 驱动,物理结果直接以 Torch/Tensor 形式保存在显存中,RL 的状态、奖励计算也在 GPU 完成。(docs.robotsfan.com)
  • 实际效果:在典型连续控制任务上能比传统 CPU 仿真 + GPU 学习快 100–1000 倍。(Medium) 2.与 PhysX / Isaac Sim / Isaac Lab 的关系
  • Isaac Gym 使用 NVIDIAPhysX作为物理后端,与基于 Omniverse 的Isaac Sim在物理实现上逐渐对齐,以便未来迁移策略到 Isaac Sim。(NVIDIA Developer)
  • 目前 Isaac Gym 已被官方标记为deprecated(不再维护),推荐迁移到基于 Isaac Sim 的开源框架Isaac Lab。(NVIDIA Developer Forums)
  • Isaac Lab 延续了 Isaac Gym 的 GPU-native 并行仿真思路,但利用 Omniverse/Isaac Sim 提供的高保真渲染、USD 场景描述等能力,用于大规模多模态学习。(arXiv) 3.典型使用方式
  • 编写 Python 环境(IsaacGymEnvs / Isaac Lab),一次性创建上千个并行环境;
  • 每次仿真 step,返回 GPU 上的张量:观测、奖励、done 标志等;
  • 直接在同一块 GPU 上运行 RL 算法(如 PPO/SAC),实现极高吞吐量的数据收集。(docs.robotsfan.com) 4.趋势:统一物理引擎与开源生态
  • NVIDIA、Google DeepMind 等机构正在联合开发新的开源物理引擎 Newton,使其可与 MuJoCo、Isaac Lab 等框架配合使用,目标是统一高精度物理仿真与机器人学习生态。(NVIDIA Developer)

对初学者来说:如果你计划做大量仿真-强化学习实验,而实验室已有 NVIDIA GPU 硬件,那么学习 Isaac Sim / Isaac Lab 的工作流会是非常现实的选择;而理论上讲,MuJoCo + MJX 也在向类似方向发展。


7.1.2 物理仿真中的关键参数(摩擦、接触、时间步长)

【建议插图】图 7-2:一个方块在桌面上被推动的示意图,分别标注法向力、摩擦力、接触点和时间离散步长,帮助读者把抽象参数与直觉联系起来。

物理引擎的任务是数值求解“机器人 + 环境”的动力学方程。对于具身智能来说,三类参数尤为关键:

  • 摩擦(决定“滑不滑”)
  • 接触模型(决定“撞上去是弹开、卡住,还是穿透”)
  • 时间步长(决定“算得稳不稳、快不快”)

理解这些参数的意义与调节方法,是从“会跑 demo”走向“能做严肃仿真研究”的第一步。


7.1.2.1 摩擦系数

在简化模型中,摩擦力大小通常近似为

\[ F_{\text{friction}} = \mu F_N \]

其中 \(F_N\) 是法向支撑力,\(\mu\) 是摩擦系数(无量纲)。

1.静摩擦 vs 动摩擦 +静摩擦系数\(\mu_s\):物体刚要滑动前的摩擦,决定“起滑难度”。 +动摩擦系数\(\mu_k\):物体已经滑动时的摩擦,一般略小于静摩擦。

  • 许多仿真引擎用统一的“滑动摩擦系数”来近似上述效果,也有引擎提供更细致区分。(arXiv) 2.摩擦在机器人任务中的影响
  • 抓取:摩擦过小,物体一夹就滑走;摩擦过大,仿真中可以“粘”住物体,现实中却会掉落。
  • 推动:摩擦决定推手与物体之间的“咬合”程度,直接影响最优策略(推还是抬)。
  • 行走:腿足机器人或轮式机器人需要足够摩擦才能产生牵引力,摩擦过小仿真中会频繁打滑。 3.实际建模建议 +从真实材料参数起步:查表或测量典型材料组合(橡胶-木板、金属-塑料等)的摩擦系数范围,在仿真中设定相近值。(科学直通车) +仿真-现实对齐:在真实平台上做简单实验(推箱子、抓取同一物体),调整摩擦参数直到仿真和现实的行为相似。 +避免极端取值:\(\mu\) 过大可能导致数值不稳定或不自然“粘连”;过小则动作普遍打滑,策略学习难度急剧上升。

7.1.2.2 接触模型

现实世界中,物体接触本质上是弹性变形、微观粗糙度和材料内部结构的复杂结果。仿真中通常用简化模型来近似:

1.接触检测(collision detection)

  • 判断两个几何体是否相交,并找出接触点、接触法向量和穿透深度。
  • 不同引擎支持的几何体种类不同(球、盒、圆柱、网格等),复杂网格模型虽然真实但会增加计算成本。(classic.gazebosim.org) 2.**接触响应(contact resolution)**常见的两大类方法:

典型参数包括:

+惩罚法(penalty method) 将穿透看作弹簧压缩,引入法向弹簧刚度 \(\displaystyle k\) 和阻尼 \(\displaystyle d\),产生恢复力和阻尼力;再叠加摩擦模型。

  • 优点:实现简单、计算快;
  • 缺点:刚度过大时数值刚性强,容易发散,只能用很小的时间步长。 +约束法(constraint-based) 通过求解线性互补问题(LCP)或二次规划(QP),显式施加“不能穿透”约束,对法向力和切向摩擦进行联合求解。MuJoCo、某些 PhysX 配置属于这一类。(arXiv)
  • 法向刚度 / 阻尼:决定“撞上去”是软弹还是硬碰;
  • 恢复系数(restitution):决定反弹高度(0 代表完全不弹,1 接近完美弹性);
  • 最大摩擦力 / 摩擦锥近似的细节。

3.数值问题与调参

  • 接触参数不合理时,仿真中常见“物体抖动”“轻微穿透”“叠放物体慢慢滑走”等现象;
  • 在 PhysX/Isaac 中,还可以调整 rest_offsetcontact_offset 这类参数控制接触启发式,平衡精度和稳定性。(NVIDIA Developer)
  • 建议做“小测试场景”:两个盒子叠放、物体落地弹跳等,用于观察接触参数改变的效果。

7.1.2.3 时间步长(time step)

时间步长 \(\Delta t\) 是离散化仿真时间的粒度:每一步仿真实际代表 \(\Delta t\) 秒的物理过程。

1.时间步长与数值稳定性

  • 多数引擎使用显式或半隐式积分方法,时间步长过大时,刚体和接触系统会变得不稳定——表现为速度爆炸、关节乱飞。(arXiv)
  • 接触越“刚”(刚度越高)、系统频率越高,所需时间步长越小。这和数值分析中的稳定性界限是一致的。 2.仿真频率、控制频率与渲染频率
  • 仿真频率:\(f_{\text{sim}} = 1/\Delta t\),例如 \(\Delta t = 0.001s\) 对应 1000 Hz。
  • 控制频率:机器人策略输出动作的频率(可以是仿真每步都控制,也可以每 N 步控制一次)。
  • 渲染频率:画面刷新的频率,一般远低于仿真频率。 在 RL 任务中常用的配置是:仿真以 500–1000 Hz 运行,每 10–20 步向策略暴露一次状态,相当于 25–100 Hz 的控制频率。 3.速度与精度的权衡
  • 较小的 \(\Delta t\):
    • 优点:接触更稳定、轨迹更平滑;
    • 缺点:同样的物理时间会有更多步,计算负担加重。
  • 较大的 \(\Delta t\):
    • 优点:计算更快;
    • 缺点:需要更激进的数值技巧与接触调参,否则容易出现物体穿透、机器人行为不自然。

在后续的 Sim2Real 中(见 7.1.4 节),时间步长的选择也会影响策略迁移:仿真中如果用了远大于控制周期的步长,策略学到的“微分方程”可能和真实机器人不一致。


7.1.3 仿真场景搭建与任务脚本编写

【建议插图】图 7-3:从“模型文件(URDF/MJCF/USD)→ 仿真场景(机器人 + 环境 + 传感器)→ 任务脚本(reset/step/reward)”的流程图。

从 VLA 模型的角度看,一个“仿真任务”至少包括:

  • 世界:机器人、物体、障碍和相机等组成的场景;
  • 接口:如何从仿真中读出状态(观测),向仿真写入动作;
  • 协议:任务的开始、结束和评测方式。

7.1.3.1 场景搭建

无论是 MuJoCo、Gazebo 还是 Isaac 系列,场景搭建的核心思路是相似的。

1.机器人模型导入

  • 使用 URDF / SDF / MJCF / USD 等格式描述机器人结构:连杆、关节、惯量、关节限制。(mujoco.org)
  • 检查:
    • 单位是否统一(米 / 千克 / 牛顿);
    • 关节方向和零位是否符合真实机器人;
    • 关节上下界与真实硬件一致。 2.环境与物体建模
  • 地面(ground plane)、桌面、货架等静态几何体,可简化为平面 / 盒子 / 圆柱等基本形状;
  • 目标物体:尽量用简单但形状接近的碰撞几何体(如用盒子近似复杂物体的碰撞体),视觉网格可以更精细;(gazebosim.org)
  • 设置物体的质量和摩擦参数,使其在仿真中表现与现实近似(例如同样的推力下移动距离相近)。 3.传感器配置
  • 相机:位置、朝向、分辨率、视场角、更新频率和噪声模型;
  • 深度相机 / LiDAR:射线数量、最大测距、噪声;
  • 关节传感器:是否存在测量噪声、延迟。(theconstruct.ai) 4.坐标系与标定
  • 明确世界坐标系(world)、机器人基座坐标系(base)、末端执行器坐标系(ee)、相机坐标系(camera);
  • 在仿真场景中,保证这些变换与真实系统(手眼标定等)一致,方便后续 Sim2Real。

7.1.3.2 任务脚本

场景只是“静态世界”;要让机器人“活起来”,需要任务脚本来定义交互逻辑。一般需要明确以下元素:

1.环境接口设计典型的 RL / 控制任务接口可以写成类似 Gym 的风格:

MuJoCo、Gazebo 和 Isaac Gym / Isaac Lab都提供 Python/C++ API,用于在脚本中驱动物理步进和读写状态。(mujoco.org)

  • reset():重置环境到初始状态(放置物体、随机扰动姿态、清零累计奖励等);
  • step(action):执行一个动作步长,返回
    • 观测 obs(视觉、关节状态、语言上下文等);
    • 标量奖励 reward
    • 是否结束 done
    • 额外信息 info

2.重置与随机化

  • 重置时可以对物体初始位置、姿态、材质、光照、摄像机位置等进行随机化,为后续的域随机化和泛化打基础;(Xue Bin Peng)
  • 注意重置逻辑要确定且可重复,使用固定随机种子方便实验复现。 3.奖励函数与终止条件
  • 奖励函数应与任务成功定义对应,例如:
    • 抓取任务:抓取成功 +1,碰撞或超时 −1,其余为 0 或小的 shaping 奖励;
    • 导航任务:每前进一步给少量负奖励,逼近目标给正奖励,撞墙大负奖励。
  • 终止条件:达到目标、失败(跌倒、掉落)或超时。 这些设计与第 5 章中的 RL 设置一一对应,只是现在在具体仿真环境中实现。 4.任务复杂度与课程设计
  • 初学者可从“单物体、静态场景、无干扰”做起,逐渐引入多物体、移动障碍、随机初始状态等难度,形成“仿真课程学习”。

7.1.3.3 自动化评测

一旦任务脚本搭建完成,就需要自动化评测来判断算法或 VLA 模型的好坏。

1.批量运行与指标统计

  • 多次运行环境(如 100 或 1000 回合),统计:
    • 任务成功率;
    • 平均完成时间 / 步数;
    • 平均奖励、最差奖励等。
  • 对于并行仿真框架(MuJoCo MJX、Isaac Gym/Isaac Lab),可以一次性在 GPU 上同时评测大量环境,加速统计。(mujoco.readthedocs.io) 2.日志与可视化
  • 记录每步的状态、动作、奖励到日志文件(如 Python pickle、HDF5、ROS bag 等),方便之后做离线分析;(gazebosim.org)
  • 保存关键回合的渲染视频或截图,便于定性检查策略行为是否合理。 3.基准化与消融实验
  • 对同一环境,使用不同算法 / 模型结构 / 超参数进行对比;
  • 设计消融实验(移除某个模块或训练阶段)观察性能变化,为后续论文写作提供可靠证据。

7.1.4 仿真–现实差距的来源与缓解方法

【建议插图】图 7-4:“仿真世界”和“真实世界”两个气泡,中间标注各种差异(视觉、摩擦、延迟等),并标出几种典型弥补方法(域随机化、实机微调等)。

在第 5.4.2 节我们已经从强化学习角度讨论过 Sim2Real 的困难与策略,这里从仿真平台和物理建模的角度,系统梳理一下“仿真–现实差距”(reality gap)的主要来源及缓解手段。


7.1.4.1 传感器差异

1.视觉传感器仿真渲染通常是“完美”的:

现实中的视觉传感器则充满各种非理想因素,使得“同一场景”的图像在仿真和现实之间分布差异巨大(domain shift),从而导致 VLA 模型在实际相机图像上表现显著变差。

  • 不存在真实相机中的噪声、模糊、曝光不均、白平衡漂移;
  • 深度相机在仿真中往往没有“测不出”的洞、反射、红外干扰;
  • 视角、畸变等也常常被设为理想值。(theconstruct.ai)

2.其他传感器

  • 力 / 力矩传感器:现实中存在非线性、漂移和噪声,仿真常常给的是“干净数值”;
  • 关节编码器:现实中会有量化误差、背隙、延迟等;
  • IMU:现实的陀螺仪 / 加速度计具有偏置和随机游走,仿真若不建模这些噪声,则会低估算法对噪声的敏感性。 3.缓解思路(传感器侧) +域随机化(Domain Randomization):在仿真中随机改变纹理、光照、相机姿态、噪声等,使模型学到对这些变化不敏感。(Xue Bin Peng) +真实感渲染 + 噪声建模:使用 Isaac Sim 等提供的物理化渲染(PBR)、相机噪声模型,尽量逼近实际摄像机特性。(NVIDIA Developer) +Real-to-Sim 校准:根据真实相机标定和采集的图像统计特性(噪声分布、伽马、失真参数)调整仿真渲染管线。

7.1.4.2 动力学差异

物理引擎做的是某种“理想模型”的数值求解,而真实机器人系统充满各种非理想性。

1.未建模 / 误建模的物理因素

  • 质量、惯量估计不准;
  • 关节摩擦、刚度、阻尼设置与真实系统不符;
  • 马达和驱动链路(齿轮间隙、柔性连杆、电机饱和和延迟等)未建模或严重简化。(科学直通车) 2.接触与摩擦的不确定性
  • 地面材质不均匀、灰尘和磨损使摩擦系数随时间变化;
  • 物体边缘细节、变形、微小不规则都难以用刚体接触模型捕捉。 这些都会导致在仿真中学到的“最优动作”在真实环境下效果不佳甚至失败。 3.缓解思路(动力学侧) +系统辨识 + 参数调优:利用真实机器人数据(例如手动施加已知力矩,测量响应)来拟合质量、摩擦等参数,然后在 MuJoCo、PhysX 等仿真器中调整模型,使“仿真响应曲线 ≈ 实机响应”。(科学直通车) +动力学域随机化:在训练时随机扰动物理参数(质量、摩擦系数、关节阻尼等),使策略对这些参数变化更加鲁棒。(arXiv)

7.1.4.3 差距缓解:综合策略

现实中往往需要多种方法联合使用,才能将仿真-现实差距控制在可接受范围内。

1.域随机化(Domain Randomization)

  • 在仿真训练中同时随机化:
    • 视觉域:材质、颜色、光照、相机姿态、噪声;
    • 动力学域:质量、摩擦、关节阻尼、控制延迟;
    • 场景布置:物体位置、数量、尺寸。(Xue Bin Peng)
  • 理论与实践均表明,在一定条件下,域随机化可以理论上保证策略对真实世界的泛化上界。(arXiv) 2.Sim-Real 协同训练与离线域优化
  • 利用少量真实机器人轨迹来微调策略或奖励模型,以“修正”纯仿真训练中的偏差;(科学直通车)
  • 或者像 DROPO 这类方法一样,用有限的真实数据来优化域随机化的分布,使仿真域更贴近真实域。(科学直通车) 3.Real-to-Sim:用真实数据改善仿真器
  • 通过真实数据来校准渲染、传感器噪声和动力学参数,使仿真世界“更像现实”;
  • 一部分工作在此基础上构建世界模型(world model),在模型内部做规划,再在现实中验证。(arXiv) 4.抽象与层次化控制
  • 将低层连续控制抽象为更高层的技能或离散动作(例如“抓取”“放置”“移动到桌子左侧”),让策略主要在更抽象、对物理细节不那么敏感的层面上做决策;
  • 低层则采用传统控制(PID、轨迹跟踪)和安全约束来屏蔽部分动力学差异。(arXiv)

从本书整体结构看,本节更多聚焦在“仿真器和物理参数”这一环,而第 5 章、9 章则分别从强化学习算法训练范式 / 数据工程的角度继续展开。掌握这一节的内容,你就已经从“会用仿真跑 demo”迈向了“能用仿真认真做具身智能研究”的台阶。

本章小结与自测

三行小结

  1. 本章聚焦仿真、采集、标注和数据组织方法。
  2. 重点是数据质量与可复现性,而非只追求规模。
  3. 学完后应能搭建一个可持续扩展的数据流水线。

检查题

  1. 用你自己的话总结本章最核心的一个公式/机制。
  2. 给出一个“如果要落地到项目里,你会怎么用”的具体例子。

常见误区

  1. 只扩数据量,不控数据质量。
  2. 时间同步与标注规范缺失。
  3. 实验配置缺少版本化管理。

公式到代码(最小示例)

samples = [
    {"t": 0.00, "img": "f0", "act": "a0"},
    {"t": 0.10, "img": "f1", "act": "a1"},
]
# 统一时间轴后再切片训练样本
window = samples[:2]
print(window)

本章外部参考(集中)

  1. mujoco.org
  2. The Farama Foundation
  3. arXiv
  4. mujoco.readthedocs.io
  5. gazebosim.org
  6. classic.gazebosim.org
  7. 维基百科
  8. PX4 文档
  9. theconstruct.ai
  10. gazebosim.org
  11. Medium
  12. docs.robotsfan.com
  13. 本章其余链接可在正文中按上下文继续查阅。

7.2 数据采集与示教方式

下面这一小节可以直接作为你书中的 7.2.* 内容使用,我按你给的层级结构展开,并尽量和前后章节衔接、避免重复。


7.2.1 Teleoperation(遥操作)采集轨迹

学习导航

  • 本章主题:7.2.1 Teleoperation(遥操作)采集轨迹
  • 前置知识:建议先完成第 6 章机器人运动与控制基础。
  • 建议用时:47-67 分钟
  • 阅读顺序:先看概念框架,再看公式/代码,最后做自测。

在上一节我们主要在仿真中“造世界”。从本节开始,重点转向“造数据”:如何让人类通过各种方式把自己的操作经验变成可以训练 VLA 模型的轨迹。最常见的一类方式就是遥操作(teleoperation)——人类远程控制机器人完成任务,系统同时记录传感器和控制信号。

【图 7-xx 占位:展示一个典型遥操作系统:人戴 VR 头显和手柄,通过网络控制桌面机械臂抓取物体;图中用箭头标出“人 → 控制设备 → 控制信号 → 机器人 → 相机图像回传 → 人”。】

7.2.1.1 遥操作方式

遥操作并不只是一种形态,而是一大类接口家族,大致可按“人是怎样发出控制信号”的角度来区分:

1.传统输入设备:手柄、键鼠、SpaceMouse 等

  • 工业和实验室环境里最常见的是摇杆 / 游戏手柄 / SpaceMouse等六自由度输入设备,用来控制机械臂末端的平移、旋转和夹爪开合。(robin-lab.cs.utexas.edu)
  • 优点是硬件便宜、部署简单;缺点是学习曲线较陡,操作长期高精度任务比较累。 2.虚拟现实(VR)遥操作
  • 使用VR 头显 + 手柄,将机器人所在环境渲染到用户眼前,用户通过自然的手部动作控制机械臂末端姿态,已有工作用 VR 接口大量采集操作演示,用于模仿学习和 VLA 训练。(arXiv)
  • 相比传统手柄,VR 能提供沉浸式视角和立体深度感,对复杂三维操作尤其友好。 3.穿戴/动捕类遥操作:外骨骼、数据手套、动作捕捉
  • 人类穿上外骨骼或戴上数据手套,机器直接跟随人手、人臂轨迹运动。(robin-lab.cs.utexas.edu)
  • 好处是动作映射直观,自然度高;缺点是硬件复杂、成本高,场地和佩戴舒适度都是工程挑战。 4.移动端 / Web 端遥操作
  • 一些系统尝试用手机、平板或 Web UI提供遥操作界面,适合简化任务或给非专业用户使用。(robin-lab.cs.utexas.edu)
  • 交互方式通常是拖拽目标、点击按钮等,更接近“远程人机界面”,操作精度有限,但易于部署到大量用户。 5.辅助/共享控制遥操作(Assisted / Shared Teleoperation)
  • 为降低人类负担,可以让部分动作由算法自动完成,人只在关键决策点介入。例如 PATO 系统中,机器人在不确定时才请求人工接管,从而提高大规模示教效率。(arXiv)
  • 这种“人机共驾”模式在采集大规模示教数据时尤其重要,可支持一个人同时监督多台机器人。

7.2.1.2 优点

遥操作在现代机器人数据集构建中几乎是“默认选项”,原因主要有:

1.高质量、任务相关的演示

  • 人类在闭环控制下完成任务,能自动避开明显不合理动作;对于抓取、插入等精细操作,人类往往能凭经验快速找到可行策略。
  • 大规模操作数据集(如 BridgeData V2、DROID)都大量采用遥操作或其变体来采集示范轨迹。(Proceedings of Machine Learning Research) 2.任务多样性和开放性
  • 同一套硬件和遥操作界面,可以在不同环境、不同物体、不同指令下反复采集,使得数据集覆盖大量任务变体,有利于训练通用 VLA 模型。(rail-berkeley.github.io) 3.自然融合多模态信号
  • 遥操作过程本身天然包含机器人状态 + 控制命令 + 视觉观测,如果同时录音或采集语言说明,就能构造完整的视觉–语言–动作三模态数据,这为后续 VLA 训练提供了理想素材。(rh20t.github.io) 4.对操作员技术门槛相对可控
  • 虽然需要一定学习,但相较于直接写控制程序,遥操作让没有机器人编程经验的操作者也能参与数据采集,这对大规模数据构建是关键前提。(SpringerLink)

7.2.1.3 挑战

当然,遥操作也有一长串“坑”,在设计数据采集系统时要提前考虑:

1.操作负担与疲劳

  • 长时间高精度操作会极大消耗操作者注意力和体力,导致演示质量下降。实验表明,合适的界面设计(如提供实时任务状态虚拟仪表盘)可以提高抓取精度和用户体验。(MDPI)
  • 在采集大型数据集时,通常需要轮换操作员、设置短任务、甚至设计游戏化机制来减轻疲劳。 2.通信延迟与带宽限制
  • 如果人和机器人不在同一局域网,图像传输和控制命令往返会带来明显延迟,易导致操作过冲、抖动甚至碰撞。
  • 工程上常见做法包括:降低视频分辨率/帧率、在机器人端做局部避障、或采用共享控制,让高频稳定控制留在本地。 3.接口与动作映射的设计难度
  • 如何将人手、手柄或 VR 控制器的运动映射到机械臂末端、移动底盘等,是一个需要仔细调参的问题。映射不自然会导致学习难、错误多。
  • 最近的工作(如 TeleMoMa、Versatile Demonstration Interface 等)都强调通过统一的接口同时支持多种示教模式,以降低使用门槛。(robin-lab.cs.utexas.edu) 4.可扩展性问题
  • 传统遥操作“一人一机”,当需要上万条演示时成本惊人。
  • 辅助遥操作和多机器人并行采集(如 PATO)提供了一条思路:让策略在简单场景下自动执行,只有在不确定时才喊人类“救场”。(arXiv) 5.数据偏差与安全风险
  • 示范数据只覆盖了“人类习惯的操作空间”,容易出现状态分布不均衡;在危险场景下,人类也可能不敢尝试极限操作。
  • 为安全起见,遥操作系统必须提供急停、虚拟约束区域等机制,同时对碰撞、超力等异常进行硬件级保护,这些内容在第 10 章会进一步展开。

7.2.2 Kinesthetic teaching(人手带动机械臂)

如果说遥操作是“远程操纵”,那么**kinesthetic teaching(本体示教、拖拽示教)就是“直接上手”。在这种范式中,人直接抓住机器人机械臂本体,将其推到希望的位置或轨迹上,机器人通过关节力矩/位置传感器记录整个过程。这种方式通常被归入Programming by Demonstration(PbD,示教编程)**的重要一支。(calinon.ch)

【图 7-xy 占位:一位操作员站在协作机械臂旁边,用双手扶着机械臂末端拖动其完成“抓取–搬运–放置”的动作,旁边简单标注“零力模式”“关节角记录”等。】

7.2.2.1 示教方法

典型的 kinesthetic teaching 流程包括以下步骤:

1.进入“零力模式”或重力补偿模式

  • 机械臂低层控制切换到力控 / 阻抗控制模式,通过电机电流和力矩传感器主动抵消重力,使操作者感觉机械臂“很轻”,可以轻松推动。(calinon.ch) 2.人手拖拽机械臂执行任务
  • 操作员抓住末端执行器或专门的手柄,让机械臂按照完成任务的自然轨迹运动(例如从桌面抓起一个杯子再放到架子上)。
  • 在复杂任务中,操作者可以多次示教不同变体,如不同初始位置、不同物体,以增加数据多样性。 3.关键帧与连续轨迹两种风格
  • 有的系统要求操作员逐个关键姿态点示教(keyframe based),系统再自动做插值;有的则直接记录高频连续轨迹。(roboticsproceedings.org)
  • 关键帧方式更适合传统工业编程;连续轨迹更适合模仿学习和 VLA 的 BC 训练。 4.交互式修正与重复示教
  • 示教后可以回放轨迹,操作员发现不满意的部分可以再次拖拽局部修正,这在工业 PbD 中非常常见。(Google Patents)

7.2.2.2 数据记录

与遥操作类似,kinesthetic teaching 也要把“人–机交互”转成可用的数据集。常见记录内容包括:

1.关节空间与末端空间轨迹

  • 每个时间步记录关节角 \(q_t\)、关节速度 \(\dot{q}_t\)、末端位姿(通过正运动学计算),采样频率通常在 50–200 Hz 之间,既保证细节,又可控数据量。 2.力/力矩与接触信息
  • 如果机械臂有六维力/力矩传感器,还可以记录施加在末端的外力,这对于装配、打磨、插入等接触丰富的任务非常关键。(arXiv) 3.额外传感器与人类状态
  • 一些多模态数据集会在 kinesthetic teaching 过程中同步采集多视角 RGB、深度、声音、人体动作捕捉、肌电(EMG)等信号,用来分析人类操作策略和丰富训练信号。(arXiv) 4.标注与元数据
  • 同样需要记录任务 ID、物体类别、成功/失败标记等信息,这部分在 7.3 节会系统展开,这里只强调:示教方式本身会影响你需要记录哪些字段。例如,如果主要用于学习力控策略,就应该重点保证力/力矩数据的精度和同步性。

7.2.2.3 适用性

相较于遥操作,kinesthetic teaching 在以下场景中尤其有优势,也有明显局限:

1.优势场景 +协作机械臂 / 人机共作环境:协作机器人本身具备力控和安全设计,非常适合人直接拖拽示教,是工业 PbD 的主战场。(ResearchGate) +接触丰富、精细操作:例如插销装配、打磨、拧螺丝等,人通过“手感”辅助控制,能给出更符合实际的轨迹和接触模式。(arXiv) +对非专业操作者友好:不需要理解坐标系、关节角等概念,只需“像教一个合作者那样拉着它做一次”。 2.局限性 +仅适用于能被人直接接触的机器人:对于大型工业机械臂、高速设备或移动平台,安全与体积问题往往使 kinesthetic teaching 不可行。 +操作者身体负担:长时间拖拽机械臂对肩肘腕是个挑战,尤其是机械臂负载较大时。 +操作范围受人工作空间限制:人站在机器人旁边示教,工作范围主要是人可触及空间,难以覆盖远距离或封闭空间任务。 3.与其他示教方式的互补

  • 最新一些工作尝试将遥操作、kinesthetic teaching、自然人类示范集成到同一示教接口中,让操作者根据任务自由选择示教方式。(arXiv)
  • 在构建通用 VLA 数据集时,常见做法是:粗粒度任务用遥操作或程序化数据扩展覆盖面,关键精细操作用 kinesthetic teaching 采高质量样本

7.2.3 自动生成 / 合成数据(程序化场景)

仅靠人类示教,很难支撑“大模型 + 通用技能”的数据需求。这时就轮到自动生成 / 合成数据登场:利用仿真器、任务脚本、运动规划甚至三维编辑,自动合成大量示范轨迹和对应观测。

【图 7-xz 占位:示意程序化场景生成流程:脚本随机生成桌面布局 → 调用运动规划器生成抓取–放置轨迹 → 仿真器渲染多视角图像 → 输出“图像 + 状态 + 动作”数据集。】

7.2.3.1 程序化脚本

在许多仿真基准中,任务和演示轨迹是通过代码“写”出来的,而不是由人操作得到。例如:

1.基于规则的任务生成

  • 指定一组物体类别、摆放规则和目标描述(如“把蓝色方块放入左侧抽屉”),脚本随机采样物体初始位置、姿态、背景纹理等,自动生成多种场景变体。
  • 这类方法在 RLBench、ManiSkill 等操作基准中广泛存在。(ResearchGate) 2.基于运动规划的演示生成
  • 针对每个任务,使用运动规划器 + 逆运动学自动求出“从起始位姿到目标位姿”的无碰路径,把规划出的关节轨迹当作专家示范。RLBench 就通过这种方式为 100 多个任务提供了理论上“无限多”的脚本演示。(arXiv) 3.基于任务-运动规划(TAMP)的复杂动作生成
  • 对多阶段任务(开门、搬运、装配等),可以先用符号规划生成动作序列,再为每个子动作调用运动规划器,自动得到长序列示范。这种思路也被应用在 DemoGen 等合成示范系统中。(OpenReview)

7.2.3.2 数据合成

除了轨迹层面的“自动规划”,近年的工作还探讨更激进的视觉和动作的合成

1.基于 3D 场景编辑的“重排”

  • 例如 DemoGen:只需少量真实示范,就通过 3D 点云和渲染,把物体在场景中的位置、姿态随机重排,并通过几何转换调整原始动作轨迹,从而生成大量新的“伪轨迹”。(arXiv) 2.视角、光照和材质的程序化扰动
  • 利用渲染引擎改变相机位置、光照条件、材质贴图等,生成多视角、多光照的图像,对应同一动作轨迹。这本质上是更强大的数据增强。(arXiv) 3.跨模态合成与补全
  • 一些多模态数据集会在仿真中同时合成深度图、点云、触觉/接触信号等,为以后训练多模态表示(例如 DROID-3D + EmbodiedMAE)提供统一的三维输入。(arXiv) 4.语言指令的自动生成
  • 对程序化任务可以自动导出语义描述(如“将最右边的红杯子放到蓝盘子上”),再用大语言模型改写成多种自然语言指令版本,为后续 VLA 训练构造大规模图文–动作对。

7.2.3.3 优劣

程序化 / 合成数据不是“白嫖”,它的优点与风险都很明显:

1.优势 +规模几乎无限:脚本一旦写好,就可以离线生成任意数量的轨迹和场景,是支撑大模型训练的关键。RLBench 的脚本演示、BridgeData V2 中脚本 pick-and-place 轨迹都是代表例子。(arXiv) +可控性强:可以系统地改变物体数量、布局、干扰物等,从而评估和提升模型的泛化能力。Colosseum 等基准就是在 RLBench 基础上增加系统 perturbation 因素来检验泛化。(arXiv) +安全与成本优势:所有“试错”都发生在仿真中,不会真的摔坏机器人或物体,也不需要实验室人员盯着。 2.劣势与风险 +仿真–现实差距(Sim2Real gap):合成图像和物理参数与真实世界总有差异,模型若完全在合成数据上训练,直接上真实机器人时性能可能大幅下降——这一点在第 5.4、7.1 节已讨论。 +行为模式过于理想化:运动规划生成的轨迹通常是“几何上完美”的,没有人类真实操作中的犹豫、微调、接触探索等,这对学习鲁棒策略可能是不利的。 +脚本工程成本不容忽视:要实现几十上百个任务的高质量程序化生成本身是一项工程,需要熟悉仿真引擎、运动规划、碰撞检测等模块。 3.实践中的折中策略

  • 目前较被认可的做法是**“少量真实 + 大量合成 + 少量真实微调”**:用少量遥操作或 kinesthetic 示教给出真实示范,再依靠程序化和合成方法扩充数据,最后在真实机器人上用少量数据做 domain adaptation 或 RL 微调。(arXiv)

7.2.4 多模态同步:图像、语言指令、关节状态、动作序列

无论数据是通过遥操作、kinesthetic teaching 还是程序化生成得到,只要最终目标是训练VLA 模型,就必须把视觉、语言和动作这几条信息流严格对齐到同一个时间轴上。这一节从工程角度解释如何进行多模态同步。

【图 7-xw 占位:一条时间线,上方是 RGB 图像帧序列,中间是语言指令(整体或按短语划分),下方是关节状态和动作命令曲线,用竖直虚线表示不同模态按时间戳对齐。】

7.2.4.1 时间同步

时间同步是所有多模态数据工程的地基,核心思想很简单:所有传感器和控制信号都带统一时间戳

1.统一时间源与时间戳

  • 在机器人系统中,常通过操作系统时间 + NTP 同步,或由控制电脑作为统一时间源,所有传感器驱动在采样时记录“系统时间”。
  • 在复杂多模态数据集(如 Kaiwu、RH20T、DROID 等)中,通常在硬件层面就保证各设备同步时钟,然后将 RGB、深度、力觉、音频、关节状态等全部按绝对时间戳记录下来。(arXiv) 2.软件层面的对齐与插值
  • 由于不同话题/设备采样频率不同(例如图像 30 Hz,关节状态 100 Hz,动作命令 10 Hz),离线处理时需要选择一个“主时间轴”(经常是控制频率或图像频率),然后对其他信号做插值或最近邻对齐。
  • 实践里既有以图像帧为主的对齐方式(每帧图像配一个最近动作),也有以控制周期为主的方式(每个控制 step 附近取最近一张图像和语言片段)。 3.同步精度与抖动控制
  • 对于大多数桌面操作任务,几十毫秒级的对齐误差通常可以接受;但在高速运动或接触瞬间(如敲击、插入)中,几毫秒的误差也可能改变接触判定结果,多模态装配数据集会特别强调微秒级同步和抗振动设计。(arXiv) 4.可视化与检验工具
  • 在工程实践中,会使用像 Foxglove、RViz 等工具将多种话题按时间轴播放,以肉眼检查同步是否合理。很多开源多模态示例都提供这样的可视化配置。(Foxglove)

和 7.3 节中“轨迹数据格式与 ROS bag”不同,这里只聚焦于“如何让多条轨迹变成一条多模态时间线”;具体存储格式和解析方法将在 7.3 中详细展开。

7.2.4.2 语言指令关联

语言模态有两种典型来源:离线文本描述在线语音/对话指令。如何把语言和具体轨迹片段关联,是构造 VLA 训练样本的关键步骤之一。

1.整体任务级指令

  • 最简单的情形是:为整个演示轨迹提供一条文本指令,例如 “把红色杯子拿起放到右边碗里”。
  • 这种形式在许多机器人数据集(如 BridgeData V2、DROID)中非常常见,每条轨迹有一条文本描述,用于训练 “(图像, 语言) → 动作” 的条件策略。(rail-berkeley.github.io) 2.分段指令与层级标注
  • 对更复杂、长时间任务,可以将轨迹切分为多个阶段(如“伸手–抓取–移动–放置”),为每一段配一条短指令(如“抓起杯子”“移到架子上”)。
  • 这种更细粒度的对齐可支持训练层级 VLA 模型,让语言不仅描述最终目标,还能作为子任务切分信号。 3.语音指令与对话日志
  • 如果在示教过程中使用语音控制(“再往右一点”“抓紧一点”),系统需要实时语音识别(ASR)并记录原始音频、转写文本以及时间戳。
  • 在构造数据集时,可以保留“语音–动作–图像”的完整历史,从而支持训练具备对话纠偏能力的机器人策略。 4.自动生成与扩充语言描述
  • 实践中,人类不可能为每条轨迹手工写多条指令,常用的方式是:由脚本生成模板指令,再用大语言模型做改写和多样化扩充,以提高语言分布的自然性。(rail-berkeley.github.io)

7.2.4.3 多源数据记录

最后,从系统工程角度看,多模态数据采集就是一个“多源日志记录问题”:

1.采集哪些模态? 对于典型 VLA 数据集,常见的模态组合包括: +视觉:多视角 RGB、深度甚至点云; +机器人本体状态:关节角、关节速度、末端位姿、夹爪开合状态; +动作/控制命令:末端速度、关节目标、离散技能 ID 等; +力觉与接触:力/力矩传感器、触觉阵列(若有); +音频与环境上下文:例如装配声、环境噪声,用于识别接触事件或异常; +语言与人类状态:文本/语音指令、人手轨迹、目光方向等。 近期多模态数据集(如 Kaiwu、RH20T、DROID、REASSEMBLE 等)都在尝试尽可能“把能录的都录了”。(arXiv) 2.记录频率与存储权衡

  • 高频记录能捕获更多细节,但存储和后处理代价也成倍增加;常见折衷是:控制与关节状态高频(50–200 Hz),相机中频(10–30 Hz),音频高频(kHz),语言事件按需记录
  • 对于之后要训练 Transformer 类 VLA 模型,需要提前考虑序列长度和采样率,避免生成后期完全难以加载的超长序列。 3.统一日志格式与索引
  • 实际工程中,常采用诸如 ROS bag、HDF5、自定义二进制格式等作为统一日志容器,把所有模态一起存进去,再通过索引文件记录每条轨迹的起止时间、任务 ID、重要事件时间点等。
  • 统一的日志与索引结构是后续“切片”出训练样本(例如固定长度窗口、按阶段切片)的基础,这在 7.3 节会给出更加细致的建议。 4.多模态对下游 VLA 的意义
  • 从模型视角看,这些多模态数据最终都要映射成一串 token——图像 patch token、语言 token、动作 token、状态 token。
  • 数据采集阶段做得越规范、同步越精确、模态越丰富,下游就有越大的空间去设计强大的 VLA 架构(第 8 章会从模型结构角度回到这些设计决定)。

这一节到这里,你基本把“人怎么教机器人、仿真怎么帮人造数据、这些数据怎么对齐成多模态轨迹”讲清楚了。后面的 7.3 节可以顺势从“时间线上铺好的多模态原始信号”,进一步落到文件格式、标注策略和数据清洗流水线上,形成完整的数据工程闭环。

本章小结与自测

三行小结

  1. 本章聚焦仿真、采集、标注和数据组织方法。
  2. 重点是数据质量与可复现性,而非只追求规模。
  3. 学完后应能搭建一个可持续扩展的数据流水线。

检查题

  1. 用你自己的话总结本章最核心的一个公式/机制。
  2. 给出一个“如果要落地到项目里,你会怎么用”的具体例子。

常见误区

  1. 只扩数据量,不控数据质量。
  2. 时间同步与标注规范缺失。
  3. 实验配置缺少版本化管理。

公式到代码(最小示例)

samples = [
    {"t": 0.00, "img": "f0", "act": "a0"},
    {"t": 0.10, "img": "f1", "act": "a1"},
]
# 统一时间轴后再切片训练样本
window = samples[:2]
print(window)

本章外部参考(集中)

  1. robin-lab.cs.utexas.edu
  2. arXiv
  3. arXiv
  4. Proceedings of Machine Learning Research
  5. rail-berkeley.github.io
  6. rh20t.github.io
  7. SpringerLink
  8. MDPI
  9. calinon.ch
  10. roboticsproceedings.org
  11. Google Patents
  12. arXiv
  13. 本章其余链接可在正文中按上下文继续查阅。

7.3 数据存储与标注

7.3.1 轨迹数据格式设计(时间戳、Topic 结构)

学习导航

  • 本章主题:7.3.1 轨迹数据格式设计(时间戳、Topic 结构)
  • 前置知识:建议先完成第 6 章机器人运动与控制基础。
  • 建议用时:103-123 分钟
  • 阅读顺序:先看概念框架,再看公式/代码,最后做自测。

关键图示:数据流水线

关键图示:数据流水线

从本节开始,可以把自己想象成在给“未来的 Open X-Embodiment 数据集维护者”打地基:你设计好的格式,将直接决定后面所有模型训练、可视化与复现实验的上限。(arXiv)


7.3.1.1 数据格式

(1)轨迹与 episode 的层次结构

在机器人学习中,通常以“episode(任务执行回合)”为基本单位来组织数据。建议采用三层结构:

1.数据集级(dataset)元信息

  • dataset_nameversioncoordinate_convention(例如世界坐标系定义)
  • 支持的机器人列表(如 robot_type: franka_panda / ur5 / mobile_base
  • 全局时间基准(如统一采用 UNIX 时间戳,单位秒 + 纳秒) 2.episode 级信息
  • episode_id:唯一标识一个任务执行
  • task_id:对应 7.3.2 中的任务类型
  • scene_config:环境配置(物体类型、初始位置、随机种子)
  • robot_id / embodiment_id:哪台机器人、哪种形态
  • start_timeend_time:绝对时间戳
  • 预留 success_flagpartial_success 等标记(具体定义在 7.3.2) 3.step 级数据(时间序列) 典型一个 step 可以包含:
{
  "t": 1.23456789,              // 相对 episode 起始的秒数
  "timestamp": 1680000123.23456789, // 绝对时间戳,可选
  "observation": {
    "rgb_image_path": "episode_001/frame_000123.png",
    "depth_image_path": "episode_001/depth_000123.png",
    "joint_positions": [...],
    "joint_velocities": [...],
    "ee_pose": [...],
    "gripper_state": 0
  },
  "action": {
    "type": "delta_ee_pose",
    "command": [...]
  },
  "extra": {
    "reward": 0.0,
    "done": false
  }
}

大尺寸模态(图像、点云)一般不直接嵌在 JSON/Proto 中,而是单独存储为文件,在轨迹文件里只保存路径或索引(提升读写性能和灵活性)。

【图 7-3-1 占位:轨迹数据的层次结构示意图:dataset / episode / step 三层结构,step 中包含多模态观测与动作指针。】

(2)时间戳的设计

为了保证后续多模态对齐与 rosbag 回放一致,建议同时保留两类时间戳:

+绝对时间戳:例如 UNIX 时间(秒 + 纳秒),直接使用 ROS 消息头 header.stamp。 +相对时间戳:以 episode 起始时刻为 0 的相对时间(浮点秒),便于后续模型训练和可视化。

常见做法是:轨迹内部用相对时间用于“步长统一”与插值,跨日志同步时再回到绝对时间戳。

(3)Topic 级结构与逻辑步长

原始数据往往来自多个 ROS Topic(视觉、关节状态、控制命令等),频率各不相同。建议在“落盘到训练格式”时做一次结构化处理:

  • 选择一个主时间轴(例如控制命令 Topic固定频率定时器)作为 step 的基准;
  • 其它传感器 Topic(相机、力矩传感器等)按时间就近插值 / 对齐到该主时间轴上;
  • 在 step 级别记录“来自哪些 Topic 的消息已经对齐良好”(例如缺帧时标记 observation.rgb_valid = false)。

这样可以在保持原始 rosbag 灵活性的同时,为模型提供统一粒度的“时间步”。


7.3.1.2 ROS bag

在 ROS 生态中,rosbag / ros2 bag是事实标准的轨迹日志格式,用于记录任意 Topic 上的消息时间序列。(wiki.ros.org)

  • ROS1 中使用 .bag 文件,以自定义格式顺序存储: [\\((timestamp, topic_name, serialized_message)\\), ...]。(mathworks.com)
  • ROS2 中 ros2 bag 将数据存入数据库(早期默认 SQLite .db3,后续发行版逐步转向 MCAP 作为默认存储后端)。(ROS)

(1)选择需要记录的 Topic

为具身智能任务设计 rosbag 时,通常会重点关注以下几类 Topic:

  • 机器人状态类:/joint_states、末端位姿、力矩/触觉传感器
  • 视觉类:/camera/rgb/image_raw/camera/depth/image_raw、相机外参/内参
  • 控制命令类:/arm_controller/command/cmd_vel
  • 任务相关信号:重置信号、任务 ID、成功标志、语言指令 Topic 等

原则是:能够在离线回放时还原完整任务上下文即可,不必记录实验中所有无关 Topic,以避免数据爆炸。

(2)bag 作为“原始事实”,轨迹文件作为“训练视图”

一个可行的工程实践:

  1. 在线实验时,用 rosbag record / ros2 bag record 记录若干 Topic,作为原始事实日志
  2. 离线阶段,用解析脚本将 bag 转换为“episode + step”结构的训练轨迹文件(如 JSON Lines / Parquet / HDF5);
  3. 训练时仅加载结构化轨迹;调试或可视化时再用 bag 做细节回放。

【图 7-3-2 占位:左侧 ROS 节点与 Topic 流图,右侧 rosbag 文件与“加工后轨迹文件”的数据流示意。】


7.3.1.3 回放与解析

(1)回放(replay)

ROS 提供的 rosbag play / ros2 bag play 能将 bag 中的消息按原始时间戳重放到对应 Topic 上,仿佛“时光回溯”到实验时刻。(wiki.ros.org)

回放的典型用途:

  • 在仿真或离线系统中,重复调试同一条轨迹;
  • 用旧数据验证新算法(感知、控制、规划);
  • 生成演示视频或用于教学展示。

需要注意的是,回放时通常会把 ROS 时间(/use_sim_time)绑定到 bag 时间轴,避免系统使用真实系统时间造成混乱。

(2)解析(parsing)与 episode 切分

将 rosbag 转换为训练轨迹,需要一个清晰的解析流程。一个常见方案:

1.扫描元信息 使用命令行 rosbag info / ros2 bag info 获取 bag 中所有 Topic 名、消息类型、起止时间。(wiki.ros.org) 2.按 Topic 读取消息流 用脚本(Python C++ 或 MATLAB 等)逐条读取消息,按时间排序(bag 内部本身已经按时间顺序,但跨多个文件或分段时需重新合并)。(mathworks.com) 3.确定 episode 边界

  • 可以依据专门的“重置 Topic”(例如 /task_reset);
  • 或通过机器人状态检测 reset 事件(如末端回到初始 pose,物体恢复初始位置);
  • 或根据外部标注文件给出的 episode 起止时间段。 4.对齐多模态数据到统一 step
  • 以控制命令 Topic 的时间戳为主轴;
  • 对每个时间戳,在图像/传感器流中找到相邻两帧做最近邻或插值;
  • 将结果写入标准化轨迹格式。 5.附加元数据与标签 留出接口与 7.3.2(任务标签)和 7.3.3(语言指令)对接。

(3)离线调试与可视化

为了帮助人类快速感知轨迹质量,推荐在解析脚本中顺便生成:

  • 集成可视化:例如每个 episode 导出一个“关键帧 + 末端轨迹 2D 投影图”;
  • 快速统计:轨迹长度分布、关节速度分布等,用于后续清洗(7.3.4)。

【图 7-3-3 占位:从 rosbag 时间线到统一 step 时间线的对齐示意图,展示多种 Topic 的时间戳如何投影到主时间轴上。】


7.3.2 任务标签与成功 / 失败标注

轨迹本身只是“机器人做了什么”的记录,要让 VLA 模型真正学习到“机器人为什么这样做、做得好不好”,就必须在轨迹之上叠加任务语义与质量标签。近年来的大规模具身数据集(如 Open X-Embodiment、各种语言条件操作数据集)无一例外都重视这一层信息。(arXiv)


7.3.2.1 任务元数据

(1)任务级别信息

每个 episode 至少应具备:

  • task_id:简洁机器可读的标识,如 "pick_and_place""open_drawer"
  • task_family:更高层级的任务族,例如 "manipulation""navigation"
  • task_params:与本次任务实例相关的参数
    • 目标物体类别 / 颜色 / 尺寸
    • 目标区域(容器类型、位置)
    • 初始布局随机种子等
  • language_instruction_ids:与 7.3.3 中语言指令条目关联的 ID 列表。

这种设计既方便后续按照任务类型过滤数据,也为模板化语言生成(7.3.3.2)提供了参数来源。

(2)环境与机器人配置

建议把容易被忽略但对泛化十分关键的信息也纳入元数据:

  • 机器人类型与工具末端(两指爪、三指手、吸盘等);
  • 相机类型与安装位置(手眼 / 外参 ID 参考);
  • 场景类型(桌面操作、地面导航、台面整理等)。

在跨机器人、多任务的大规模数据集中,这些字段是进行条件建模和跨平台迁移的关键。(arXiv)


7.3.2.2 成功 / 失败记录

(1)“成功”的定义

理想情况下,需要在数据采集协议中提前定义每个任务的“成功条件”,例如:

  • 抓取任务:目标物体被稳定抓起、离开桌面超过一定高度;
  • 放置任务:目标物体中心落在目标区域内,且最终静止;
  • 门 / 抽屉任务:开合角度超过一定阈值。

可以用规则 + 传感器检测自动判断(如通过视觉检测物体位置),也可以在实验结束后由操作者通过 UI 一键标注“成功 / 失败”。

(2)标签结构

建议引入显式结构,而不是一个单布尔变量“一刀切”:

{
  "episode_id": "...",
  "success": true,
  "failure_reason": null,
  "metrics": {
    "final_distance_to_goal": 0.012,
    "time_to_success": 5.4
  }
}

或者在失败时记录:

"success": false,
"failure_reason": "object_slipped",
"metrics": {
  "max_gripper_force": 15.2
}

这些额外信息可以用于后续成功预测模型安全性分析,而不仅仅是过滤样本。


7.3.2.3 部分成功标记

现实任务往往是长序列、多阶段的,如“打开抽屉 → 拿出物体 → 放到盒子里”。只用一个最终成功标记,会导致大量“前半段做得很好但最后一步失败”的轨迹全部被当成失败样本丢弃,极度浪费。

(1)阶段划分

一种常见实践是为每个任务设计阶段化 schema,例如:

"subtasks": [
  {
    "name": "reach_object",
    "success": true,
    "t_start": 0.0,
    "t_end": 1.2
  },
  {
    "name": "grasp_object",
    "success": true,
    "t_start": 1.2,
    "t_end": 2.0
  },
  {
    "name": "place_object",
    "success": false,
    "t_start": 2.0,
    "t_end": 5.0
  }
]

阶段边界可以通过:

  • 人工标注关键帧;
  • 规则(如“末端距离物体小于阈值时认为进入 grasp 阶段”);
  • 或基于任务分解模型自动推断。(CVF开放获取)

(2)部分成功的用法

  • 在训练模仿策略或技能原语时,只使用对应阶段成功的轨迹片段;
  • 在层级 RL 中,把每个子任务视作一个“option / skill”,利用阶段成功率进行单独评估;
  • 在数据分析时识别瓶颈环节(例如普遍在 place 阶段失败),指导任务设计与硬件改进。

【图 7-3-4 占位:长任务时间轴上不同子任务阶段的标记示意图(reach / grasp / place 等),并显示各阶段 success / fail。】


7.3.3 语言指令的设计与采集(手工 / 自动生成)

在具身智能场景中,语言不再只是“标签”,而是直接参与决策的条件变量:同一视觉场景,在“把红色方块放进盒子”和“把蓝色圆柱放到桌子右侧”两条指令下,机器人应做出完全不同的行为。因此,本节关注如何为轨迹配备高质量语言指令,并扩展到大规模。(NeurIPS 会议记录)


7.3.3.1 人工编写指令

(1)指令风格与基本原则

面向 VLA 模型的指令,推荐采用自然、简洁、面向用户的任务描述,而不是低层控制命令。例如:

  • “把红色方块放入右边的蓝色盒子里。”
  • “从上面抓起杯子,然后放到桌子中央。”

为了兼顾可学性与可扩展性,编写时可遵循几点原则:

1.任务导向、结果导向:描述目标而非每一步动作细节,让模型有空间自发规划; 2.对视觉可对齐:指令中涉及的颜色、形状、位置等,应在图像中确实可见; 3.减少歧义:避免“它”“那里”等指代含糊的词,优先使用“红色杯子”“左边的盒子”等明确描述; 4.风格一致:同一数据集内,尽量保持时态、句式的一致性,降低模型学习负担。

(2)人工标注流程

典型工作流如下:

  1. 标注工具展示关键帧或者轨迹视频
  2. 标注员观看后,为当前 episode 编写 1–3 条自然语言指令;
  3. 将每条指令分配唯一 ID,并与 episode_id 建立关联;
  4. 选取一部分样本做交叉审核,保证指令语义与轨迹行为一致。

【图 7-3-5 占位:标注界面示意图:左侧播放轨迹视频,右侧文本框输入多条语言指令,并显示任务元数据。】

人工指令的优势是自然、贴近真实用户语言;缺点是成本较高,因此通常与模板和大模型方法结合使用。


7.3.3.2 模板自动生成

为了在大型数据集中批量生成语言指令,可以基于任务元数据设计参数化模板

(1)模板结构

以抓取放置为例,可以设计一组中文模板:

  • “把{color}{object}放到{target_location}的{target_object}里。”
  • “将{target_location}的{target_object}中的{color}{object}拿出来。”
  • “把桌子上{side}的{color}{object}移到{target_location}。”

其中 {color}{object}{target_location}{side} 等字段,都来自 7.3.2.1 中定义的 task_params

(2)模板系统要点

  • 对每个任务族维护一套模板列表;
  • 生成指令时,随机选择不同模板,增强语言多样性;
  • 确保模板不会生成与环境不符的描述,例如在没有“蓝色物体”时不会使用 {color=蓝色}
  • 可以为同一 episode 生成多条模板指令,供训练时随机采样。

很多语言–机器人数据集采用类似策略,将结构化任务参数转换为成千上万条指令,从而在有限的环境配置上构造出丰富语言分布。(NeurIPS 会议记录)


7.3.3.3 大模型辅助

大语言模型(LLM)与视觉语言模型(VLM)在具身数据标注中的角色,越来越从“锦上添花”变成“必备基础设施”。(arXiv)

(1)基于元数据的指令扩写与改写

在已有模板或人工指令的基础上,可以用 LLM 进行:

+释义生成(paraphrasing):保持语义不变,改变表达方式,例如“把红色方块放进蓝色盒子里”→“请将红色的小方块移入蓝色的盒子中”; +难度分级:生成“口语化版本”“正式版本”或“儿童友好版本”,用于研究语言风格对模型行为的影响; +多语言扩展:在保持语义一致的前提下生成英文、日文等多语言指令。

这类生成通常只需提供结构化 task_params 与示例提示即可自动化运行。

(2)基于视觉的自动描述

对于没有现成元数据的旧轨迹,可以利用 VLM:

  • 输入关键帧或短视频片段;
  • 令模型生成动作摘要或任务说明;
  • 再由人类抽检与修订,形成稳定风格的指令集。

(3)质量控制与防止“幻觉”

大模型可能会描述实际上并不存在的物体或动作。因此需要:

  • 用脚本检查生成指令中的实体名是否都出现在环境元数据中;
  • 对高风险任务(涉及安全)保留人工审核;
  • 将自动生成的指令打上 source: llm,方便后续分析其对训练的影响。

【图 7-3-6 占位:利用大模型进行指令生成与扩写的流程图:输入轨迹 + 元数据 → 模型生成 → 自动检查 → 人工抽检。】


7.3.4 数据清洗与异常轨迹处理

在具身智能项目中,“垃圾进,垃圾出”尤为明显:带有错误传感器读数、时间错乱、标签不一致的轨迹,会直接使模型学到“违反物理常识”的策略。因此,构建系统性的数据清洗与异常处理流程,是整个数据工程链路的关键一环。(ceur-ws.org)


7.3.4.1 清洗目的

数据清洗的目标不只是“丢掉坏样本”,而是更精确地做到:

1.识别并修复结构性错误:例如时间戳乱序、缺失模态、轨迹被中途截断; 2.过滤物理不合理的轨迹:例如关节角度越界、速度跳变不符合机器人动力学; 3.纠正或标记错误标签:成功标为失败、任务 ID 错配、语言指令与行为不对应; 4.为后续分析提供“质量标签”:不是简单删除异常,而是标记其质量等级,使不同算法可以有选择地使用。

在大规模轨迹数据上,异常比例常常不会小(传感器故障、示教错误、软件崩溃等),但通过良好的清洗流程,可以在保证覆盖多样性的同时提高整体训练信噪比。(MDPI)


7.3.4.2 异常检测

异常检测可以分为三类:结构异常、物理异常、语义异常

(1)结构异常

关注轨迹“长什么样”是否合理:

  • 时间戳是否单调递增;
  • episode 长度是否在合理范围内(过短可能是记录中断,过长可能包含多个任务混在一起);
  • 关键字段是否缺失(如动作为空、图像路径不存在)。

这类异常可以通过规则 + 脚本检查快速发现,例如:

  • len(steps) < min_steps 则标记为异常;
  • 若连续两步的 t 差值超过上限(例如 > 1s),视为“中断”。

(2)物理异常

基于机器人动力学和控制常识判断:

  • 关节角度突破硬件极限或安全范围;
  • 在物理上不可能的加速度 / 速度(例如 1ms 内转动 90°);
  • 碰撞检测 Topic 报警,但成功标记仍为 true。

可以利用简单统计与规则:

  • 计算每个关节的速度与加速度直方图,将高于一定分位数(如 99.9%)的样本标记为 outlier;
  • 检查末端与场景中障碍物的最小距离(若有几何信息)。

(3)语义异常

这是更“智能”的一层:

  • 轨迹最终状态与任务成功条件矛盾(如物体未进入目标区域,却被标记为成功);
  • 语言指令与真实行为不匹配(指令要求“放进盒子”,结果轨迹只有抓取没有放置);
  • 中途出现明显“任务崩溃”(例如示教者抖手,把物体甩飞)。

对于语义异常,可以使用:

  • 简单规则(基于 7.3.2 中的任务成功定义);
  • 或训练一个**“正常轨迹”预测模型 / 自编码器**,通过重构误差或预测误差检测异常模式,这是当前机器人与轨迹异常检测文献中常用的思路。(arXiv)

7.3.4.3 清洗流程

为了让清洗过程可复用、可追溯,可以设计一个标准管线,类似机器学习训练 pipeline:

(1)步骤 0:版本化备份

  • 原始 rosbag 与初始轨迹文件应只读保存;
  • 每次清洗产生一个新的数据集版本,如 v1.0_rawv1.1_cleaned_basicv1.2_cleaned_semantic

(2)步骤 1:批量结构检查

  • 运行脚本对所有 episode 进行结构校验,统计:缺失字段数、异常时间间隔、长度分布;
  • 给每个 episode 打一个结构级“质量分数”,例如 structure_score ∈ [0, 1]

(3)步骤 2:物理约束过滤

  • 使用机器人模型(关节上下界、最大速度等)定义一系列约束;
  • 批量计算每条轨迹是否违反约束,并记录违反的类型(越界 / 高速 / 碰撞);
  • 对严重违反物理约束的轨迹打上 quality: bad_physics 标记,默认不用于训练。

(4)步骤 3:语义一致性检查

  • 使用任务定义与成功条件,自动判断 episode 成功 / 失败,并与人工标注比对;
  • 对冲突案例(如“系统判断失败但人工标成功”)输出列表,用于人工复查;
  • 对语言–行为不一致的样本,选择修正语言或丢弃该指令。

(5)步骤 4:人工抽检与可视化

  • 对边缘样本(例如自动评分在 0.4–0.6 之间)进行人工抽检;
  • 借助可视化工具(轨迹动画、关键帧拼图)帮助快速决策。

(6)步骤 5:输出清洗报告与标签

最终,每条 episode 除了原始任务标签外,还应多出一组与清洗相关的字段:

"quality": {
  "structure_score": 0.95,
  "physics_score": 0.9,
  "semantic_score": 0.85,
  "flags": ["passed_basic_checks"]
}

这样,在后续训练中可以:

  • 先只使用高质量子集训练基线模型;
  • 再尝试加入部分噪声样本,研究模型对噪声的鲁棒性;
  • 或在研究异常检测、恢复策略时专门用“异常集”做基准。(ceur-ws.org)

【图 7-3-7 占位:数据清洗流水线示意图:原始轨迹 → 结构检查 → 物理约束过滤 → 语义检查 → 人工抽检 → 生成带质量标签的清洗后数据集。】


通过本节内容,读者应当能从工程和建模两个角度,理解“一个高质量 VLA 训练数据集”在存储格式、任务标签、语言指令以及清洗流程上的设计要点。后续章节在介绍预训练与模仿学习训练范式(第 9 章)时,将反复依赖这里所建立的这些“数据基础设施”。

本章小结与自测

三行小结

  1. 本章聚焦仿真、采集、标注和数据组织方法。
  2. 重点是数据质量与可复现性,而非只追求规模。
  3. 学完后应能搭建一个可持续扩展的数据流水线。

检查题

  1. 用你自己的话总结本章最核心的一个公式/机制。
  2. 给出一个“如果要落地到项目里,你会怎么用”的具体例子。

常见误区

  1. 只扩数据量,不控数据质量。
  2. 时间同步与标注规范缺失。
  3. 实验配置缺少版本化管理。

公式到代码(最小示例)

samples = [
    {"t": 0.00, "img": "f0", "act": "a0"},
    {"t": 0.10, "img": "f1", "act": "a1"},
]
# 统一时间轴后再切片训练样本
window = samples[:2]
print(window)

本章外部参考(集中)

  1. arXiv
  2. wiki.ros.org
  3. mathworks.com
  4. ROS
  5. wiki.ros.org
  6. CVF开放获取
  7. NeurIPS 会议记录
  8. ceur-ws.org
  9. MDPI
  10. arXiv

7.4 开源数据集与基准

下面这一节可以直接作为教材正文使用,我按你给的三级标题展开,语气尽量保持“教科书级但读得懂”的风格。


7.4.1 多机器人、多任务数据集概览

学习导航

  • 本章主题:7.4.1 多机器人、多任务数据集概览
  • 前置知识:建议先完成第 6 章机器人运动与控制基础。
  • 建议用时:72-92 分钟
  • 阅读顺序:先看概念框架,再看公式/代码,最后做自测。

到目前为止,你已经知道如何自己在实验室里采集数据。本小节换个视角:站在“数据使用者”的角度,了解几个已经被社区广泛采用的多机器人、多任务开源数据集。它们是训练和评测 VLA 模型的“公共语料库”,也是你快速开始实验的捷径。

【图 7-12 占位】 建议配一张“多数据集对比示意图”:横轴为 RoboNet / RLBench / Open X-Embodiment,纵轴列出“现实/仿真”“机器人数量”“任务数量”“是否有自然语言指令”等,用图标和简单数字对比。

7.4.1.1 RoboNet

RoboNet 是加州大学伯克利等机构提出的大规模多机器人操作数据集,核心目标是**“用共享数据推动通用视觉操作模型”**。(arXiv)

1.基本属性

+数据规模:约 1500 万张图像帧(video frames),组成大量的交互序列。 +机器人种类:包含至少 7 种不同平台,如 Sawyer、Franka、KUKA、WidowX、Baxter 等,覆盖不同结构、不同控制接口的机械臂。(Proceedings of Machine Learning Research) +任务类型:主要是桌面场景下的非结构化物体交互——推、拨、移动、简单抓取等,不刻意区分“具体任务标签”,更像是“通用交互经验池”。

2.数据模态与动作空间

+视觉:单或多视角 RGB 图像,来自 113 个不同相机视角,场景(桌面、背景、物体外观)有较强随机化。(bair.berkeley.edu) +状态与动作

  • 状态通常包含末端执行器笛卡尔位姿(位置 + 局部朝向)以及夹爪开合状态。
  • 动作采用末端执行器增量控制(delta pose action):在当前位姿基础上给出位置/旋转小增量,以及一个维度控制夹爪开/合。(TensorFlow) +其他传感信息:部分子集还包含力/力矩传感器读数,可用于建模接触动力学。(bair.berkeley.edu)

对 VLA 来说,这种“视觉 + 增量位姿 + 多机器人”的统一格式,非常适合作为动作 token 化的基础(见第 8 章对动作表示的讨论)。

3.设计特点与适用场景

+多机器人统一格式:不同机械臂的数据被规整为统一的末端空间控制,使得同一个模型有可能在多种平台之间共享参数。(arXiv) +偏重物理交互多样性,而非语义任务标签:更适合

  • 视觉预测 / 视频预测模型、世界模型
  • 通用抓取/推动技能的预训练
  • 多机器人共享视觉-控制表征的研究

【图 7-13 占位】 建议配 RoboNet 官方博客中的拼图式示例:多种机械臂在不同桌面场景中与杂物交互的若干帧截图。(bair.berkeley.edu)

在后续章节,当我们讨论“单模型多机器人”的 VLA 架构时,可以把 RoboNet 看作现实世界数据的一个典型来源。


7.4.1.2 RLBench

RLBench 既是仿真环境又是基准数据集,可以理解为“带有标准任务库的操作仿真平台”。(arXiv)

1.基本属性

+仿真实现:基于 CoppeliaSim(原 V-REP)物理引擎,内部集成一台 7 自由度机械臂(Franka Panda 类似结构)和若干场景。 +任务数量:最初发布时包含 100 个手工设计的任务,从伸手触碰目标到开门、拉抽屉、整理物品等,难度跨度大。(arXiv) +演示数据:每个任务提供大量通过运动规划器自动生成的示教轨迹,理论上可以生成无限多的演示,方便行为克隆和模仿学习。(arXiv)

2.观测与动作空间

+多视角视觉输入

  • 肩部上方的双目或多视角相机
  • 手眼相机(eye-in-hand) 提供 RGB、深度图以及语义分割掩膜等。(arXiv) +机器人观测:关节角、关节速度、末端位姿、夹爪状态等。 +动作:可以在关节空间或末端空间发送位置/速度/增量命令,是强化学习与行为克隆常用的控制接口。

3.扩展与语言指令

后续许多工作在 RLBench 上叠加了自然语言指令,形成“视觉 + 语言 + 操作”的实验平台,例如 HIVEformer、Ex-PERACT 等方法在 RLBench 上评估语言条件下的多任务操作能力。(arXiv)

4.适用场景

  • 快速原型:无需真实机器人,即可在仿真中大规模采集演示和在线交互。
  • 多任务研究:任务多而标准化,是研究多任务学习、少样本学习、长期操作(multi-stage tasks)的常见基准。(arXiv)

【图 7-14 占位】 建议截图 RLBench 中几个典型任务(如“打开抽屉”“堆积木”“开烤箱放托盘”),并标注不同相机视角。


7.4.1.3 Open X-Embodiment 数据集

Open X-Embodiment 是由 Google DeepMind 联合多家学术机构发布的多机器人、多任务真实操作大合集,可以视为“现实世界版的多机器人基础语料库”。(arXiv)

1.规模与来源

+轨迹数量:超过 100 万条真实机器人轨迹。(Open X-Embodiment) +机器人多样性:覆盖 22 种不同“具身类型”(embodiments),包括单臂、双臂、多关节机械臂、移动平台、四足机器人等,由 30+ 个实验室联合贡献。(arXiv) +技能与任务:官方统计约 527 种“技能(skills)”与 16 万+ 任务变体,涵盖抓取、开门、整理物品、清洁、工具使用等多种日常操作。(arXiv)

2.数据格式与模态

+视觉:以 RGB 图像为主,部分数据集含多视角或视频序列。由于是汇集多个独立数据集,摄像机内参、深度图、点云等信息在不同子集中的完备程度不一。(Open X-Embodiment) +语言:相当一部分轨迹带有自然语言指令或描述,如“把黄色杯子放进水槽”。不同子集的语言风格和详细程度也存在差异。(arXiv) +动作与状态

  • 大多为末端位姿或关节命令的连续控制序列。
  • 官方统一成标准化格式,便于在统一模型中训练“跨机器人策略”。(arXiv)

4.与 RT-X 模型的关系

在 Open X-Embodiment 基础上,作者训练了大规模机器人 Transformer 模型 RT-X / RT-1-X,展示了跨机器人正迁移:在一个机器人上学到的能力可以提升其他机器人在相关任务上的表现。(arXiv)

这为“通用具身基础模型”提供了强有力的实证支持,也是本书后面讨论多机器人 VLA 架构时的重要参考。

【图 7-15 占位】 建议绘制“多机器人时间轴示意图”:横向排列不同机器人(移动底盘、机械臂、四足等)的轮廓图,下方标出对应数据量或任务示例。


7.4.2 常见操作基准任务与评价指标

有了数据,还需要“统一的考试卷”——即操作基准任务(benchmarks)与明确的评价指标。这部分内容既关系到论文实验的可比性,也直接影响你如何设计自己的任务和实验。

7.4.2.1 典型基准任务

当前社区中,机器人操作基准大致可分为几类维度:任务复杂度场景复杂度多任务/多机器人等。下面给出若干典型任务模式,并不局限于单个数据集。

1.基础操作原语类

+到达(reach / point):控制末端到达目标位置或物体上方,用于评估基础运动学控制与简单视觉定位。 +单物体抓取(grasp):在桌面上抓起一件物体,如积木或小瓶子,通常要求夹爪闭合后物体离开桌面一定高度即视为成功。 +推动与拉动(push / pull):用末端将物体沿指定方向推至目标区域,考察接触动力学和摩擦建模。

2.Pick-and-Place 与物体搬运类

这类任务是现有基准中最常见的“中等难度操作”:

+单物体搬运:如“将红色方块放入绿色碗中”。需要完成抓取、搬运、放置三个阶段。 +多物体排序 / 分类:把不同颜色或形状的物体放入对应容器,考察感知-语言-动作之间的对齐能力(例如 RLBench、RLBench-LC 上的多任务任务集)。(arXiv)

3.长序列与多阶段任务

+开门 / 开抽屉 / 打开烤箱并放入托盘:需要先找到把手,抓取并沿特定方向施力,然后在另外一个空间完成放置,是典型的多阶段任务。(arXiv) +装配 / 插入(assembly / insertion):例如“把插头插入插座”“将方块插入带孔的结构体”,要求高精定位和力控,常用于检验高精度操作能力。

4.语言条件与多任务基准

在 RLBench、Open X-Embodiment 等数据集上,越来越多工作使用自然语言指令作为条件,形成“语言 → 多任务操作”的基准:(arXiv)

  • 同一场景下,不同语言指令对应不同任务(如“把蓝杯子放进抽屉”“把红杯子放到桌角”)。
  • 不同任务之间共享一套视觉与语言表征,用以评估多任务泛化零样本组合能力。

5.泛化与鲁棒性基准

近期更关注“在扰动和分布偏移下的表现”,例如 The Colosseum 基准通过改变物体颜色、纹理、光照、桌面材质、相机姿态等,量化模型成功率的下降,用于系统性评估泛化能力。(arXiv)

【图 7-16 占位】 画一个“任务层级金字塔”:底层为 reach / grasp,中层为 pick-and-place / sorting,顶层为多阶段语言任务与泛化评测,在图中标注对应的典型基准(RLBench、Open X-Embodiment、The Colosseum 等)。


7.4.2.2 评价指标

评价指标的设计决定了模型“被鼓励做什么”。在机器人操作中,既要考虑传统机器学习指标,又要加入物理世界特有的约束(时间、能耗、安全等)。下面列出常用指标及其直观含义。

1.任务成功率(Success Rate)

+定义:在 N 次独立尝试中有多少次任务达到预设成功条件,如“物体最终落在目标区域且未掉落”。 +常见形式

  • 二值成功率:成功/失败。
  • 分阶段成功率:如“抓取成功率”“抓取+放置完整成功率”。 +用途:几乎所有 manipulation 基准的主指标,简单直观,适合多任务和跨算法对比。(robo-eval.github.io)

2.时间与效率指标

+完成时间(Completion Time):从任务开始到判定成功/失败所消耗的时间或时间步数。 +样本效率:在强化学习场景中,常统计达到某成功率所需的环境交互步数。 +步骤数 / 动作长度:用于比较“走直路”和“绕远路”的策略差异。

3.轨迹质量与精度指标

+空间精度:如放置误差(目标位姿与最终物体位姿的距离 / 旋转差),在高精度装配任务中尤为重要。(科学直通车) +路径质量:包括轨迹总长度、曲率、平滑度等,有时会用能耗、关节速度积分等间接表示。 +稳定性:例如抓取过程中物体是否在移动中掉落,可以通过“保持时间”“晃动幅度”等二级指标度量。

4.鲁棒性与泛化指标

+扰动鲁棒性:在遭受光照变化、物体外观变化、相机视角偏移、动力学参数扰动等情况下的成功率。The Colosseum 等工作会报告“标准设置成功率 vs 扰动设置成功率的差值或下降比例”。(arXiv) +跨任务泛化:训练任务集合与测试任务集合不重叠时的成功率,比如“新物体、新布局、新指令”的成功率。 +跨机器人迁移:在训练过的机器人和新机器人上的表现对比,用于评估“具身泛化”能力。(arXiv)

5.语言对齐与指令遵循指标(VLA 特有)

+指令完成度:给定指令“把红色杯子放进蓝色碗中”,不仅要搬运杯子,还要检查目标是否匹配(是否是“红色”“杯子”“蓝色碗”)。 +语言理解准确率:在某些设定中,会附加一个“是否遵守指令关键约束”的标志,例如是否选择了正确对象、是否满足约束条件(“不要移动绿色物体”)。


7.4.2.3 基准意义

为什么需要如此繁琐的基准和指标?从研究者的角度,可以从三个层面理解其价值。

1.公平比较与复现

统一的任务定义、环境配置和指标,使得不同算法的结果具有可比性——你在 RLBench 上的 80% 成功率,可以直接和别人报告的数字对照,而不是“各做各的实验,各讲各的故事”。(arXiv)

2.引导研究重点

精心设计的基准能“放大痛点”:

  • 泛化基准会迫使模型走出“单场景刷分”的舒适区。(arXiv)
  • 多机器人、多任务基准会推动大家思考“共享表征”和“具身基础模型”。(arXiv)

长远来看,基准本身就是一种“研究方向工程”,它把社区的注意力集中在某些被认为重要的问题上。

3.连接学术与产业

产业界在意的是:在真实场景下,机器人到底好不好用。如果实验室里的基准已经考虑了成功率、效率、鲁棒性、安全性等因素,那么从基准性能到工业 KPI 的距离就会缩短许多。这也是近年来 RoboEval 等工作试图系统化评估方法的原因。(robo-eval.github.io)


7.4.3 如何基于开源数据开始 VLA 实验

前两小节回答了“有什么数据”和“如何评价”的问题,本节回到最实际的工程视角:如果只有一台电脑和若干开源数据集,该如何从零开始做 VLA 实验?

可以把流程粗略划分为:数据获取 → 数据筛选与预处理 → 实验设计与训练评测


7.4.3.1 数据获取

1.选择合适的数据源

结合本书前面对 VLA 的介绍,可以按以下维度选择:

+现实 vs 仿真

  • 若首要目标是快速原型与算法比较,可优先使用 RLBench 这类仿真基准。(GitHub)
  • 若关注 sim2real 或通用具身模型,可采用 RoboNet、Open X-Embodiment 等真实数据集。(arXiv) +是否需要语言
  • 仅训练视觉-动作策略,RoboNet、RLBench 原始演示即可。
  • 若需要 VLA,可选择带语言描述的 RLBench 扩展集、Open X-Embodiment 中带语言标注的子集,或社区整理的语言条件数据。(arXiv) +机器人/任务多样性
  • 针对单一机器人、小任务集:RLBench 子集、某个单独实验室数据。
  • 针对多机器人、多任务:优先考虑 Open X-Embodiment。(arXiv)

4.下载与基础工具

+官方仓库与镜像

  • RoboNet:提供官方 GitHub 仓库与 TensorFlow Datasets 条目,可直接用 tfds 或官方脚本加载数据。(GitHub)
  • RLBench:GitHub 上提供仿真环境、任务定义与 demo 生成脚本。(GitHub)
  • Open X-Embodiment:官方网站给出各子数据集下载链接以及统一的数据格式说明。(Open X-Embodiment) +本地数据组织 建议在本地为每个数据集设计统一的目录结构,例如
dataset_root/
  ├── robonet/
  ├── rlbench/
  └── open_x/

并在其下维护统一的“清洗后子集”,避免反复对原始数据做耗时预处理。

【图 7-17 占位】 画一个“数据流”示意图:从“官方数据源/下载脚本”流向“原始数据缓存”,再流向“预处理 & 统一格式”,最终接入“训练 DataLoader”。


7.4.3.2 数据筛选

开源数据体量巨大,直接“喂完所有数据”往往既不现实也不高效。对于初学者,更推荐先构造一个干净的子集,再逐步扩展。

1.按研究问题筛选

先问自己要解决的问题是什么,然后再反推数据选择。例如:

  • 想研究“语言条件下的单机器人多任务控制”? → 选 RLBench 中若干带语言描述的任务,或 Open X-Embodiment 中针对某一机械臂的多任务子集。(arXiv)
  • 想研究“多机器人共享策略”? → 从 RoboNet 或 Open X-Embodiment 中选取 2–3 种机械臂,在相似的桌面任务上构造混合训练集。(arXiv)

2.按模态与视角筛选

  • 统一视觉输入:例如只保留“正前方相机”的 RGB 图像,把其他视角作为可选扩展。
  • 固定分辨率与帧率:将所有图像 resize 到统一大小(如 128×128 或 224×224),并统一每条轨迹的时间步长(如每 0.1s 采样一次帧)。
  • 明确状态与动作字段:例如限制所有轨迹都包含末端位姿 + 夹爪状态,剔除缺失关键字段的样本。

3.质量控制与清洗

+去除损坏/异常样本:如图像无法解码、轨迹突然跳变到非法关节角、时间戳缺失等。(robo-eval.github.io) +成功/失败划分:许多数据集会对轨迹标注成功/失败或分阶段成功,建议初期只使用高置信度成功轨迹做行为克隆,将失败样本留作后续奖励学习或鲁棒性研究。(bair.berkeley.edu) +平衡不同任务/机器人:避免某个任务或机器人因为样本过多主导训练,可以在 DataLoader 中实现按任务/机器人类别均匀采样(这一点在第 9 章会更系统地讨论)。


7.4.3.3 实验设计

在有了“干净子集”之后,接下来是如何设计一个结构清晰、可逐步扩展的 VLA 实验。以下给出三种循序渐进的典型路线。

1.路线一:单任务 / 单机器人 VLA 入门

目标是先把**最小可行系统(MVP)**搭起来:

  • 数据:在 RLBench 里选一个带语言描述的任务(比如“打开抽屉”),采集若干演示。(arXiv)
  • 模型:
    • 视觉部分可以使用预训练 ResNet / ViT 提取图像特征。
    • 语言部分使用小型 Transformer 或句向量模型将指令编码为向量。
    • 动作输出使用简单的末端增量控制(例如 4–7 维连续动作,或粗粒度离散化成动作 token)。
  • 训练方式:
    • 行为克隆(BC):最简单直接,把“图像 + 语言 + 状态 → 下一步动作”当作监督学习。
    • 评价:在同一任务新初始化条件下测试多次,统计成功率与平均完成时间。

这一阶段主要目的是熟悉数据管线 + 模型训练 + 仿真部署的完整闭环,而不是追求 SOTA 指标。

2.路线二:多任务 VLA(同一机器人)

当单任务跑通后,可以迈向“一个模型管多个任务”的设置:

  • 数据:在 RLBench 或 Open X-Embodiment 中选择一台机器人和若干任务(如 10–20 个日常操作任务),保证每个任务有足够演示。(arXiv)
  • 设计要点:
    • 使用语言指令作为统一的“任务条件”,避免为每个任务单独加一个 one-hot ID。
    • 在训练时采用按任务均衡采样,防止模型只学会样本量大的简单任务。
    • 增加一个“任务泛化”测试:预留一部分任务只在测试时出现,检验零样本能力(只提供语言描述不提供演示)。
  • 评价:除成功率外,可以统计模型在“训练任务 vs 新任务”上的性能差距,观察是否存在明显的过拟合。

3.路线三:多机器人 VLA 与跨具身泛化

最后一步是利用 Open X-Embodiment 或 RoboNet 做“多机器人单模型”实验:(arXiv)

  • 数据选择:
    • 选取 2–3 台结构差异适中的机械臂,保证它们都有类似的桌面操作任务(抓取、放置、推物体等)。
    • 若使用 Open X-Embodiment,优先选择含语言标注的子集,便于复用前面多任务 VLA 的架构。
  • 模型设计:
    • 在输入中加入具身编码(embodiment token),例如一个表示机器人 ID 的向量,或基于机器人几何信息提取的嵌入。
    • 输出端要么统一使用末端增量空间,要么为不同机器人设计轻量映射层,将共享“动作 token”映射到各自控制命令。
  • 训练与评测:
    • 训练时混合不同机器人轨迹;
    • 测试时既评估“见过的机器人”,也评估仅在少量数据上微调的新机器人的表现,考察跨具身迁移能力——这与 RT-X 的实验思路类似。(arXiv)

4.与后续章节的衔接

上述三条路线在复杂度上刚好吻合本书后续章节的难度递进:

  • 单任务 VLA → 第 8 章 VLA 架构中“单步决策 vs 序列决策”的最小例子;
  • 多任务 VLA → 第 9 章多任务预训练与行为克隆阶段的实践案例;
  • 多机器人 VLA → 第 10 章部署与跨平台评测中的“跨机器人迁移能力评估”。

【图 7-18 占位】 用一张“学习曲线 + 路线图”示意图,把三条路线画成由浅到深的阶梯,每一级标注“数据来源、模型复杂度、评测重点”等,帮助读者从宏观上把握学习路径。


通过本节,你可以将“抽象的数据集名字”和“看论文里的成功率曲线”转化为具体可操作的实验方案: 从哪个数据集下载数据、该怎么清洗、如何设计最初的实验问题、用什么指标衡量。等你真正动手跑完一两个这样的 VLA 实验,再回头看 RoboNet、RLBench、Open X-Embodiment、RT-X 等论文时,它们就不仅仅是公式和曲线,而是你自己已经踩过的一条经验路径的拓展与延伸。

本章小结与自测

三行小结

  1. 本章聚焦仿真、采集、标注和数据组织方法。
  2. 重点是数据质量与可复现性,而非只追求规模。
  3. 学完后应能搭建一个可持续扩展的数据流水线。

检查题

  1. 用你自己的话总结本章最核心的一个公式/机制。
  2. 给出一个“如果要落地到项目里,你会怎么用”的具体例子。

常见误区

  1. 只扩数据量,不控数据质量。
  2. 时间同步与标注规范缺失。
  3. 实验配置缺少版本化管理。

公式到代码(最小示例)

samples = [
    {"t": 0.00, "img": "f0", "act": "a0"},
    {"t": 0.10, "img": "f1", "act": "a1"},
]
# 统一时间轴后再切片训练样本
window = samples[:2]
print(window)

本章外部参考(集中)

  1. arXiv
  2. Proceedings of Machine Learning Research
  3. bair.berkeley.edu
  4. TensorFlow
  5. arXiv
  6. arXiv
  7. arXiv
  8. Open X-Embodiment
  9. arXiv
  10. robo-eval.github.io
  11. 科学直通车
  12. GitHub
  13. 本章其余链接可在正文中按上下文继续查阅。

8.1 VLA 的输入输出与总体结构

8.1.1 输入模态:视觉、语言、状态、历史轨迹

学习导航

  • 本章主题:8.1.1 输入模态:视觉、语言、状态、历史轨迹
  • 前置知识:建议先完成第 3-7 章对应先修内容。
  • 建议用时:91-111 分钟
  • 阅读顺序:先看概念框架,再看公式/代码,最后做自测。

关键图示:VLA 总体架构

关键图示:VLA 总体架构

在 VLA 中,输入不再只是“图像 + 文字”这么简单,而是一个多模态的时序信息流。形式上,可以把当前时刻的决策看成是下面这个映射:

\[ a_t = \pi\big( I_{1:t}, L, s_{1:t}, a_{1:t-1} \big) \]

其中 \(\displaystyle I\) 是视觉观测(图像/视频),\(\displaystyle L\) 是语言指令,\(\displaystyle s\) 是机器人状态,\(\displaystyle a\) 是历史动作。不同工作会对这些量做不同的简化,但整体思路类似:把“机器人看到的、听到的、感觉到的、以及刚刚做过什么”统一编码成一串 token,再交给 Transformer 这类序列模型处理。Gato、RT-1、RT-2、OpenVLA 等代表性系统都采用了类似的多模态序列建模范式。(OpenReview)

【示意图:VLA 输入结构。左侧一列为多帧相机图像,中间为一行文本指令,上方为机器人关节状态曲线,下方为历史动作时间轴,右侧箭头指向“Transformer 编码器”。】


8.1.1.1 视觉输入

视觉输入是 VLA 的“眼睛”。它通常来自:

  • 单目 / 双目 / 多相机 RGB 图像
  • RGB-D(带深度)图像
  • 直接的点云或投影到图像平面的 3D 特征

(1)单帧 vs 多帧 在最简单的设置里,模型每次看到一帧图像,基于这张图像和指令输出动作。但对于大多数操作任务,一张图不足以捕捉运动趋势:比如杯子是不是被刚刚推了一点、抽屉是打开还是正在打开。 因此,很多系统会输入最近的若干帧图像,让模型通过时间上的差异感知动态信息。比如 RT-1 就将一段短历史图像序列与任务描述一起输入 Transformer,再输出当前一步的动作。(LibreTranslate Community)

(2)原始像素 vs 中间表征 从工程角度看,视觉输入有两种常见形态:

1.原始像素(raw RGB/RGB-D)

  • 优点:信息最完整;端到端训练时,模型可以自己学“看到什么重要”。
  • 缺点:维度高,对数据和算力要求大。 2.中间视觉特征(例如由 ResNet、ViT、DINOv2 等 backbone 提取的特征图或 token)(维基百科):
  • 优点:可以直接复用大规模视觉预训练的能力(如自监督学习得到的泛化特征),显著提升样本效率。
  • 缺点:感知模块与决策模块之间形成“模块边界”,端到端微调时需要注意稳定性与接口设计。

目前主流 VLA,如 RT-1/RT-2、OpenVLA,多采用“预训练视觉 backbone + Transformer 决策头”的结构,在机器人数据上只微调部分层。(Google Research)

(3)多视角与 3D 信息 对于抓取、插入等 3D 要求较高的任务,仅靠单视角 RGB 信息往往不够可靠,因此会引入:

  • 双目相机:由视差估计深度;
  • 额外的顶视/侧视相机:从不同角度减少遮挡;
  • 深度相机 / LiDAR:直接提供点云或深度图。

这些 3D 信息要么被编码成额外的通道(如将深度图与 RGB 堆叠),要么单独通过 3D backbone(如 PointNet/3D-CNN)编码,再与图像特征在后续进行融合。

【示意图:上图为桌面场景真实 RGB 图像,下方为对应深度图和点云示意,箭头指向“视觉编码器”,输出若干视觉 token。】


8.1.1.2 语言输入

语言输入是 VLA 的“耳朵和任务说明书”。与传统机器人“通过 API 调参”不同,这里希望人类可以直接用自然语言描述任务,如:

“把最靠近红杯子的蓝色方块放进抽屉里。”

语言在 VLA 中主要承担三类角色(将在 4.4 展开,这里只做结构层面说明):

1.任务目标描述(goal specification) 用一句话或几句话给出当前要完成的任务,这是最基础的形式。 2.约束与偏好 例如“轻拿轻放”“不要碰到桌上的笔记本电脑”等,可视为对规划和控制的软约束。 3.交互式纠偏 / 解释 在任务执行过程中用户追加指令:“速度再慢一点”“换另一只手抓”等,这些更新需要和当前状态一起被送入模型。

(1)语言编码方式 在现代 VLA 中,语言通常通过预训练大语言模型或轻量 Transformer 编码成 token 序列或句向量。RT-2 的一个关键设计,就是把机器人动作和自然语言统一表示为“文本 token”,这样模型在训练时可以在同一输出空间内既学回答问题,又学输出控制命令。(arXiv)

(2)上下文与多轮指令 VLA 常会把整个指令对话历史拼接起来,一并作为语言输入,让模型理解“之前已经说过什么”。这与 ChatGPT 等对话式 LLM 的做法类似,只是这里下游任务变成了“输出动作 token 序列”,而不仅仅是自然语言回复。

【示意图:一条时间轴,上方是用户多轮语言指令气泡(如对话框),下方是机器人执行示意,箭头连接至“语言编码器”输出 token 序列。】


8.1.1.3 机器人状态

如果视觉是“外感知”,机器人状态就是“本体感知(proprioception)”:机器人自己知道关节在哪里、动得快不快、有没有受力等。

典型的状态变量包括:

  • 关节角度 \(\displaystyle q\)、关节速度 \(\dot{q}\)、(可选)关节力矩 \(\tau\);
  • 末端执行器的位姿(位置 + 姿态)、末端速度;
  • 轮式底盘的位置和速度(对移动平台而言);
  • 手爪开合程度、吸盘是否吸附成功等执行器状态;
  • 力/力矩传感器、碰撞开关等触觉/接触信息。

在很多通用 agent(如 Gato)中,这些状态会被离散化或量化为 token,和文本、图像一起作为序列输入。(Patrick LLGC)

从工程上看,状态向量通常会:

  • 做归一化(normalization),例如线性缩放到 \(([-1, 1])\) 区间,便于不同关节、不同机器人共享模型;
  • 做子集选择,只保留与当前任务高度相关的维度(例如只给出末端姿态而不必给全部关节角)。

在决策逻辑上,状态信息对“接触与力控”特别关键:视觉可能看不到当前接触力,但力/力矩传感器可以直接告诉模型“已经顶到墙了,不能再推”。


8.1.1.4 历史轨迹

现实世界通常是部分可观测的:一帧图像未必包含全部信息。例如机器人刚才是否已经把抽屉打开了一半,从当前视角可能看不清,但历史图像和动作是知道的。这就是为什么许多通用模型会把“历史轨迹”也一并编码进去。

所谓历史轨迹,可以简单理解为:

\[ \mathcal{H}_{t} = \big\{(I_1, s_1, a_1), (I_2, s_2, a_2), \dots, (I_{t-1}, s_{t-1}, a_{t-1})\big\} \]

在序列建模框架下,这些元素被串成一个长序列,交替出现“观测 token、分隔符 token、动作 token”等,Transformer 每一步在整个上下文上自注意力,然后输出下一步动作 token。Gato 就明确采用这种“观测–动作交错 token 序列”的形式,并在一个固定的上下文窗口(如 1024 token)内滚动地进行决策。(arXiv)

实践中,历史轨迹建模有几个常见技巧:

  • 使用滑动窗口:只保留最近 \(\displaystyle K\) 步历史,越久远的信息越不重要,避免序列过长导致计算量爆炸;
  • 引入时间编码:类似位置编码,在每个 token 上叠加时间步 index 或相对时间,使模型区分“刚刚发生的”和“很久以前发生的”;
  • 将长历史压缩为摘要 token:例如用一个小网络对过去几十步进行编码,输出一个“记忆向量”,再附加到当前输入中。

【示意图:时间轴上依次排列观测 token(图像/状态)、动作 token,颜色不同表示不同模态,外层一个大括号表示”Transformer 上下文窗口“。】


8.1.2 输出模态:动作 token / 连续动作的离散化

输入统一成 token 序列之后,一个核心问题就是:机器人动作如何也变成“token”,从而可以用同一套语言建模技术来预测。

真实机器人控制量通常是连续的(力矩、速度、位置等),而 Transformer/LLM 天然擅长预测离散 token 序列。VLA 的一大关键设计,就是在“连续动作空间”与“离散 token 空间”之间搭建桥梁。


8.1.2.1 连续动作空间

在传统控制和强化学习中,机器人动作一般被表示为一个实数向量:

\[ a_t \in \mathbb{R}^d \]

其中 \(\displaystyle d\) 可以是:

  • 机械臂末端的 6D 位姿增量(位置 3 维 + 姿态 3 维),再加一个抓手开合,凑成 7 维;
  • 每个关节的目标位置/速度/力矩,一共若干维;
  • 移动底盘的线速度 \(\displaystyle v\) 和角速度 \(\omega\) 等。

连续动作的优点:

  • 表达精细,可直接对应物理量,易与现有控制器(如力矩控制、速度控制)对接;
  • 在局部光滑条件下,易于用梯度方法优化(例如在模型预测控制 MPC 里做连续优化)。

缺点也很明显:

  • 连续空间需要数值优化或函数逼近,直接塞进“下一个 token 预测”框架比较别扭;
  • 不同机器人、不同任务的动作空间维度和范围差异巨大,想要共享一个统一策略会比较困难。

因此,很多 VLA 工作会在“机器人实际控制接口”和“模型内部表示”之间,再加一层动作离散化 + 解码模块。


8.1.2.2 动作离散化

动作离散化(action discretization)的核心思想是: 把连续向量划分为若干有限的“动作符号”,这些符号可以当作 token 来预测

常见方式包括:

(1)逐维均匀量化 以 RT-1 为例,它将每个动作维度(如末端位移、旋转、抓手状态)离散成 256 个 bins,相当于把实数区间切成 256 段,每段对应一个离散 index。(Google Research)

  • 优点:实现简单、直观;
  • 缺点:维数较高时,动作组合空间非常大,需要一些结构设计(如逐维预测、分组预测)才能训练得动。

维基百科对 VLA 的总结同样指出,许多系统会把 6-DoF 末端位姿和抓手状态量化为 256 个离散等级,再通过“动作解码器”恢复到连续控制命令。(维基百科)

(2)非均匀量化与 codebook 学习 另一个思路是从数据中学习一组“常用动作原语”:

  • 先对示教轨迹中的动作进行聚类(如 k-means),得到若干中心向量;
  • 每个聚类中心视为一种“动作 token”;
  • 训练时模型只需选择这些 token 的 index。

这种方式本质上是做“动作向量的向量量化(VQ)”,能够把模型注意力集中在训练数据中出现频繁的动作模式上,而不是覆盖整个理论上的连续空间。

(3)高层离散技能 在层级控制框架中,还可以把“技能(skill)”看作高层离散动作,比如:

  • open_drawer
  • pick(red_block)
  • place_in(box)

每个技能内部由专门的低层控制器或策略实现,VLA 只需要在技能级别做离散决策。这种做法在 SayCan 等“LLM+技能库”的工作中已经得到验证。(SayCan)

【示意图:左侧是连续动作空间中的点云,右侧是若干离散“簇中心”(动作原语)和均匀量化区间,分别标注为不同 token ID。】


8.1.2.3 动作 token 序列

在完成离散化之后,动作就可以像语言一样被表示为 token 序列:

  • 每一个动作维度(或动作原语)对应一个 token;
  • 整个动作向量可以是多个 token 的组合;
  • 跨时间步的动作序列自然就变成一个长 token 序列。

Gato 这样的通用 agent 就是用统一的 token 库来表示文本、图像特征索引、机器人状态以及动作,并在同一个 Transformer 中按 autoregressive 方式预测“下一个 token”。(arXiv)

RT-2 更进一步,直接把机器人动作编码成“伪文本 token”,与自然语言 token 混在一起训练,使得同一个模型既能输出文字(回答问题),也能输出可执行动作序列。(arXiv)

典型的控制循环可以被描述为:

  1. 将最新的视觉、语言、状态以及历史动作编码为 token 序列;
  2. Transformer 在这些 token 上自回归地生成接下来若干动作 token;
  3. 将这些动作 token 解码为连续控制量,发送给机器人;
  4. 环境反馈新的图像和状态,周而复始。

【示意图:一条 token 序列,前一部分是“文本 token + 视觉 token + 状态 token”,后面是待预测的“动作 token”,Transformer 自回归地一个一个生成,最后再通过“动作解码器”恢复到连续动作向量。】


8.1.3 单步决策 vs 序列决策

有了统一的输入和动作 token 表示之后,还要回答一个问题: 模型每次决策,是只输出“下一步动作”,还是直接输出“一整段动作序列”?

这对应到控制理论,就是“闭环单步控制”与“开环/有限时域规划”的区别。不同任务、不同平台、不同安全需求,对这两种方式的偏好会不同。


8.1.3.1 单步决策

单步决策(step-wise / reactive policy)是当前现实机器人中最常见的方式。形式上,它实现的是:

\[ a_t \sim \pi(a_t \mid I_{1:t}, L, s_{1:t}, a_{1:t-1}) \]

每次只输出当前时刻的一个动作(或一组动作 token),然后等待环境给出新的传感输入,再进行下一步。这本质上是一个闭环反馈控制过程。

以 RT-1 为例,它每一控制周期读取最近几个图像帧和当前任务描述,Transformer 输出一个离散化动作向量,立即执行,再继续下一轮。(LibreTranslate Community)

优点:

  • 对扰动、噪声和建模误差更鲁棒——环境有变化,下一步动作可以立刻调整;
  • 更接近传统 RL/BC 的框架,算法和分析比较成熟;
  • 易于与安全约束和低层控制器结合(例如每一步都可以进行可行性检查)。

缺点:

  • 需要频繁调用大模型进行前向推理,算力和延迟开销较大;
  • 难以显式表示“长远计划”,特别是在长时间、长距离导航或复杂多阶段操作任务中。

8.1.3.2 序列决策

序列决策(sequence prediction / trajectory generation)的思路是: 模型在当前时刻一次性生成未来若干步的动作序列

\[ (a_t, a_{t+1}, \dots, a_{t+H}) \sim \pi(\cdot \mid I_{1:t}, L, s_{1:t}, a_{1:t-1}) \]

这些动作可以在一段时间内作为“开环计划”执行,也可以在 MPC(模型预测控制)风格的框架中,只执行前几步再重规划。

利用序列决策的工作经常会:

  • 把未来动作序列看作“要预测的 token 序列”,用自回归或扩散模型在动作 token 空间上进行生成;(NIPS 论文集)
  • 或者同时预测未来动作和未来观测(如未来视频帧),利用“想象的未来”来评估不同计划的好坏,再选择其中最优的一条。

优势:

  • 便于在计划阶段统一考虑长期约束,例如避障、能量消耗、任务时间等;
  • 可以减少在线调用大模型的频率:一次生成多步动作,在低层快速执行。

但它的弱点也很明显:

  • 对环境建模误差更敏感,一旦真实世界偏离预测,后续的开环动作可能变得不合理甚至危险;
  • 序列越长,对模型的长期预测能力要求越高,对数据质量也越敏感。

8.1.3.3 折中方案

在实际系统里,常见的做法不是“纯单步”或“纯序列”,而是各种折中与层级设计。几种典型思路:

(1)有限时域滚动规划(MPC 风格 VLA)

  • 模型每次生成一个有限长度 \(\displaystyle H\) 的动作序列;
  • 实际执行时只执行前 \(\displaystyle k\) 步(通常 \(k < H\));
  • 然后重新获取传感信息,再生成新的序列。

这样既能利用“多步规划”的优势,又保持对环境变化的适应性。很多现代操作系统隐含地采用了这种模式,只是把“序列”压缩为“几个关键帧”或“里程碑子目标”。

(2)高层序列 + 低层单步控制(层级架构) SayCan 是一个代表性例子:LLM 在高层输出一串“技能序列”(如“移动到桌边 → 抓取杯子 → 放入抽屉”),然后每个技能由经过 RL/BC 训练的低层策略在闭环方式下执行。(SayCan)

在更一般的层级 VLA 中,高层可能输出:

  • 一串子目标位姿(waypoints);
  • 一组动作原语的调用序列;
  • 或者自然语言形式的子任务列表。

低层则专注于:给定局部目标,每个控制周期做单步闭环决策。

(3)在线修正的计划执行 另一类折中是让 VLA 生成一段动作序列,但同时引入:

  • 在线视觉/力觉监控模块,在发现偏离预期或出现危险时打断计划;
  • 或者一个额外的“纠偏网络”,根据当前偏差对后续计划进行重参数化。

这类设计可以理解为“计划–执行并行”:计划提供长远结构,执行提供即时报错和调整。

【示意图:上半部分是“高层序列规划模块”,输出一串关键帧/技能;下半部分是“低层闭环控制模块”,每一小步根据当前观测微调动作;两者通过时间轴连接。】


8.1.4 统一模型 vs 模块化架构思路

到目前为止,我们都在假定“存在一个 VLA 模型 \(\pi\)”,它吃进一堆输入 token,吐出动作 token。但在现实系统中,这个“模型”到底是一整个端到端的大网络,还是多个模块的组合,是一个非常重要的系统设计问题。

简化地说,有三种典型风格:

  1. 完全统一的端到端模型;
  2. 明确拆分的模块化架构;
  3. 兼顾两者优点的折中设计(部分统一、部分模块化)。

8.1.4.1 统一端到端模型

统一端到端(monolithic, end-to-end)模型的代表包括 Gato、RT-1、RT-2、OpenVLA 等。(Google DeepMind)

共同特点是:

+统一序列建模: 把图像特征、语言 token、机器人状态、历史动作统统映射到一个统一的 token 序列里; +单一 Transformer 主干: 一个大型 Transformer 网络负责所有模态间的交互和时序建模; +统一输出空间: 输出的 token 既可以代表文字,又可以代表动作、按钮、离散化连续量等。

优势:

1.表示共享:不同任务、不同机器人、不同模态之间共享参数,利于涌现出通用的感知与决策能力; 2.端到端优化:理论上可以把“视觉–语言–决策–动作”的整个链路一起训练,最大化最终任务成功率; 3.系统结构简洁:对外暴露的是一个统一的“黑盒策略接口”,使用者只需要关心输入与输出。

但代价也不小:

  • 需要巨量数据与算力支持大模型训练;
  • 调试困难——出了问题很难定位是视觉没看懂、语言没理解,还是决策策略本身有缺陷;
  • 在安全关键场景(如人机协作、医疗机器人)中,监管机构往往更倾向于“可解释、可验证”的模块化设计。

8.1.4.2 模块化架构

模块化架构更接近传统机器人系统:

感知(Perception) → 世界建模 / 语义理解 → 规划(Planning) → 控制(Control)

在引入大模型之后,模块化思路通常会:

  • 使用 VLM/LLM 做高层语义理解与规划
  • 使用传统或基于学习的视觉模块做目标检测、场景重建;
  • 使用经典运动规划(如 MoveIt, RRT*, TrajOpt)和控制(如 PID、力控制)作为低层执行器。

SayCan 就是一个典型的模块化/层级系统:LLM 根据语言指令和环境文本描述计算“技能有多有用”,再结合 RL 训练得到的 value function 评价“技能在当前状态下有多可行”,两者合成后选择要执行的技能。(SayCan)

近期的一些层级框架(如 RoBridge、分层 MA-LLM 等)进一步将“高层认知规划、符号中间表示、低层具身执行”拆成三个相对独立的子系统:(arXiv)

  • 高层:大规模 VLM/LLM 做任务理解与策略规划;
  • 中层:构造与物理直觉一致的符号表示(如拓扑地图、可操作对象集合);
  • 低层:具身 agent 根据中层指令进行精确控制与执行。

模块化的优势:

1.可解释、可验证:每个模块有清晰的输入/输出接口,便于单独测试和验证; 2.工程复用性高:可以直接用成熟的 SLAM、路径规划、控制库,而不是全靠大模型“自己学”; 3.安全与调试友好:系统出错时容易定位在哪一环节,并可针对性增加“安全壳层”。

缺点在于:

  • 模块之间的接口常常是“手工定义”的,中间表示不一定是最利于学习和泛化的;
  • 端到端优化困难,可能导致整体性能被最弱的模块限制;
  • 不同模块的分布偏移和误差会相互放大(error compounding)。

【示意图:典型模块化系统框图,左侧为「视觉模块」和「语言理解模块」,中间是「任务规划 / 技能选择」,右侧是「运动规划」和「低层控制」,箭头表示信息流向。】


8.1.4.3 折中设计

现实中,很多最新的 VLA 系统都采用了介于“完全统一”和“完全模块化”之间的折中方案。几类常见设计:

(1)预训练 backbone + 端到端决策头 例如 RT-2:

  • 视觉与语言部分采用预训练的 VLM(如 PaLM-E / PaLI-X)作为 backbone;
  • 在其输出的多模态特征之上,增加一个轻量的动作头,把动作也当作 token 进行训练;
  • 整体上保留端到端的 VLA 训练,但大部分参数来自稳定的预训练模型。(arXiv)

类似地,OpenVLA 采用 DINOv2 + CLIP 的组合视觉特征,再加上 Llama-2 语言 backbone,在统一的 Transformer 里输出离散动作 token,但同时支持参数高效微调和量化,以适应不同机器人平台。(维基百科)

(2)统一高层脑 + 模块化低层身体 另一类折中是:

  • 高层完全交给一个大 VLA/LLM 模型,负责理解任务、规划子目标或技能序列;
  • 低层则继续使用传统运动规划与控制器,对每个子目标进行精确执行和安全校验。

RoBridge 等工作就采用了“高层认知规划(基于 VLM)、中层符号桥接、低层具身控制”的三层架构。(arXiv)

这种方式既能充分利用大模型在语义和知识层面的优势,又不会完全丢弃现有机器人系统几十年积累下来的可靠控制和规划技术。

(3)统一模型内部的“软模块化” 还有一些设计在一个统一模型内部,通过:

  • 不同的 prompt 模式(推理模式、执行模式);
  • 不同的输入前缀(如“你现在是一个规划器” vs “你现在是一个控制器”);
  • 或者不同的 adapter 分支

来实现一种“软模块化”:在参数上高度共享,但在功能上分工明确。

总体来看,统一与模块化不存在绝对优劣。对于读者将来自己设计系统,可以参考如下经验性判断:

+以研究和原型为主:倾向统一或半统一模型,尝试涌现出更通用的能力; +以安全可靠部署为主:倾向模块化或层级架构,将 VLA 放在高层决策位置,与传统感知/规划/控制模块协同工作; +从长远发展看:更大规模、更统一的具身基础模型很可能会逐步取代一部分手工模块,但在可预见的未来,“统一模型 + 安全壳层 + 工程模块”的混合形态将长期共存。

【示意图:一张二维坐标图,横轴为“统一程度”(从完全模块化到完全端到端),纵轴为“安全/可解释性”,在中间区域标出 RT-2 / OpenVLA / RoBridge 等代表工作,说明它们处于不同折中点。】


本节从输入模态、输出动作表示、决策粒度到整体架构,对 VLA 的“接口与形态”做了系统梳理。后续章节将在此基础上更具体地讨论视觉/语言编码模块(8.2)、动作解码与控制(8.3),以及多模态融合与条件建模(8.4),帮助读者把“接口层的直觉”逐渐深化为具体可实现的模型设计。

本章小结与自测

三行小结

  1. 本章是 VLA 架构设计核心:输入、融合、动作解码。
  2. 重点在多模态对齐与条件策略建模。
  3. 学完后应能比较不同 VLA 架构的设计权衡。

检查题

  1. 用你自己的话总结本章最核心的一个公式/机制。
  2. 给出一个“如果要落地到项目里,你会怎么用”的具体例子。

常见误区

  1. 盲目堆模型参数。
  2. 忽略动作空间定义与约束。
  3. 多模态融合后不做可解释性检查。

公式到代码(最小示例)

# 多模态特征拼接最小示例
vision = [0.1, 0.2, 0.3]
language = [0.5, -0.1]
state = [0.0, 1.0]
fusion = vision + language + state
print(fusion)

本章外部参考(集中)

  1. OpenReview
  2. LibreTranslate Community
  3. 维基百科
  4. Google Research
  5. arXiv
  6. Patrick LLGC
  7. arXiv
  8. SayCan
  9. NIPS 论文集
  10. Google DeepMind
  11. arXiv

8.2 视觉与语言编码模块

8.2.1 视觉编码器:CNN / ViT / 预训练视觉 backbone 使用方式

学习导航

  • 本章主题:8.2.1 视觉编码器:CNN / ViT / 预训练视觉 backbone 使用方式
  • 前置知识:建议先完成第 3-7 章对应先修内容。
  • 建议用时:72-92 分钟
  • 阅读顺序:先看概念框架,再看公式/代码,最后做自测。

在 VLA 模型中,视觉编码器的任务不是“给一张图打个标签”那么简单,而是要把来自相机的高维像素压缩为对决策最有用的表征:既要包含物体类别、空间布局、可抓取区域等语义信息,又要在实时性和算力约束下高效运行。典型做法是选取成熟的视觉 backbone(ResNet、ViT 等),在其输出特征基础上接入后续的多模态与决策模块。

【图 8-2-1 占位:CNN 与 ViT 作为视觉编码器的对比示意图。左:ResNet 结构示意(卷积 + 残差块 + 特征金字塔);右:ViT 结构示意(图像切成 patch,加入位置编码后送入 Transformer)。】

8.2.1.1 卷积网络 CNN

卷积神经网络(CNN)依靠“局部感受野 + 权重共享”的结构,在图像分类、检测、分割等任务上长时间占据主流地位,很多经典的视觉 backbone(如 VGG、ResNet、EfficientNet 等)都属于这一范畴。(PMC)

在具身智能场景中使用 CNN 时,重点在于理解“它产出的特征张量能为机器人决策提供什么信息”:

+层级特征与语义抽象 底层卷积核往往学习到边缘、角点等局部纹理;中层逐渐组合成轮廓、部件;高层则对应整物体或复杂结构。对机器人而言:

  • 中低层特征有利于几何对齐(如抓取点回归、物体边缘检测);
  • 高层特征则承载“这是一个杯子/抽屉/门把手”这类语义。 +残差网络 ResNet 的 backbone 角色 ResNet 通过残差连接显著减轻了深层网络的梯度消失问题,成为大量检测与分割网络的标准 backbone,如 Faster R-CNN、Mask R-CNN 等。(아무블로그) 对于机器人应用而言常见选型是:
  • ResNet-18 / 34:较浅,延迟低,适合嵌入式部署和高控制频率场景;
  • ResNet-50 / 101:表征能力更强,适合复杂场景或云端推理。 +空间分辨率与特征金字塔 Backbone 通常通过步长为 2 的卷积或池化层逐步下采样,最终 feature map 的空间分辨率较低。对于需要精确抓取点的任务,单一低分辨率特征往往不够,需要:
  • 使用特征金字塔(FPN)融合不同尺度特征;
  • 或从 backbone 中间层(stride 较小的 feature map)读取特征,用于精细的像素级预测(可抓取检测、位姿估计等)。 +机器人场景下的工程折中 在 VLA 系统中,视觉编码通常是端到端 pipeline 最重的一环。需要根据硬件限制进行折中:
  • 控制周期较高(>10 Hz)时优先选择浅层 backbone 或减小输入分辨率;
  • 对场景变化不剧烈的任务,可降低视觉更新频率(如每 3–5 步更新一次视觉),中间时间步依赖预测或低维状态。

实践中,一个典型的“CNN 视觉编码器”实现是:相机图像缩放到固定尺寸(如 224×224),送入预训练的 ResNet,截取某一层的特征(如 C3/C4/C5),做全局平均池化得到一个固定维度的视觉 embedding,作为后续多模态 Transformer 的视觉 token。

8.2.1.2 视觉 Transformer ViT

Vision Transformer(ViT)提出直接把图像切分为固定大小的 patch,将每个 patch 映射为向量,加上位置编码后送入标准 Transformer Encoder,从而完全抛弃卷积运算。(arXiv)

其关键思想是:“把图像当成序列”,让 self-attention 在所有 patch 之间建模全局关系。这种设计天然与语言、动作 token 的建模方式兼容,非常利于构建统一的多模态 Transformer 架构(在 8.5 节会进一步讨论)。

ViT 作为 VLA 视觉编码器时有以下特点:

+全局建模能力强 self-attention 可以在任意两个 patch 之间建立直接联系,不受卷积感受野限制。这对需要理解大范围关系的任务尤其有利,例如:

  • 判断目标物体与障碍物的相对位置;
  • 理解“桌面整体整洁程度”这类全局属性。(arXiv) +对大规模预训练依赖更强 原始工作表明,ViT 在数据量不足时容易过拟合,需要在大规模数据(如 ImageNet-21K 或更大的私有数据集)上预训练,然后再在中小规模数据上微调。(arXiv) 对于机器人领域这种数据昂贵的场景,这反而与“强预训练 + 轻微调”的趋势高度契合。 +token 粒度与决策接口 ViT 输出通常包括:
  • 全局 [CLS] token:可视作整幅图的压缩语义,用于与语言 embedding 对齐;
  • 所有 patch token:可在 cross-attention 中作为“可被指令聚焦的视觉记忆”,例如根据语言“红色杯子”在 patch token 上做注意力聚焦。 +计算开销与部署 ViT 的复杂度与 token 数量成二次方增长,分辨率越高、patch 越小,计算越重。实际 VLA 系统常选:
  • 中等规模模型(如 ViT-B/16);
  • 较大的 patch 大小(16 或 32 像素)以减少 token 数;
  • 或使用分层结构的视觉 Transformer(如 Swin Transformer)兼顾局部归纳偏置和全局建模能力。(MDPI)

对于想构建“一个 Transformer 统一处理视觉、语言、动作”的读者而言,选择 ViT 或其变种作为视觉 backbone,会在结构上带来极大便利。

8.2.1.3 预训练骨干使用

在具身智能中,“从零训练一个视觉编码器”几乎没有现实意义:机器人真实数据极其昂贵,且采集环境有限,如果不加约束,很容易过拟合某个特定实验室、某几件物体。因此,合理使用预训练视觉 backbone 是 VLA 系统设计中的核心共识。

常见的预训练来源包括:

1.监督预训练(ImageNet 等)

  • ResNet、ViT 等在 ImageNet-1K、ImageNet-21K 上进行分类预训练,学习到通用的视觉语义特征。(arXiv)
  • 这类模型在许多下游任务中表现良好,是最常用的初始化方式。 2.自监督预训练(MAE 等)
  • Masked Autoencoder(MAE)等方法通过随机遮挡图像 patch、让模型重建缺失区域,学习高质量视觉表征,而无需人工标签。(arXiv)
  • 自监督模型在迁移到各种视觉任务时往往比纯分类预训练有更好的泛化性,尤其适合与机器人多样环境结合。 3.多模态预训练(CLIP 图像塔)
  • CLIP 使用大规模图文对数据,通过对比学习共同训练图像编码器和文本编码器,使两者对齐到同一语义空间。(arXiv)
  • 其图像塔(可以是 ResNet 或 ViT)已经学会“用自然语言描述世界”,在 VLA 中使用这样的 backbone 能显著提升“看懂指令所说之物”的能力。

使用预训练 backbone 时有几种典型策略:

+冻结 backbone,只训练顶层投影/决策网络 适用于数据较少时,最大限度保留预训练知识,缺点是无法针对特定机器人场景做细致适配。 +部分解冻:只微调高层 把低层特征看作通用的边缘纹理,高层特征根据机器人任务进行微调,是实际工程中最常见的折中方案。 +全量微调 仅在具备大量机器人视觉数据或强正则化时使用;否则容易导致“灾难性遗忘”,把通用视觉知识破坏掉。

【图 8-2-2 占位:预训练视觉 backbone 在 VLA pipeline 中的使用方式:左侧为相机图像流,经 backbone 变为特征;右侧连接多模态 Transformer 与动作解码头。】

在后续章节中,我们会多次强调:视觉 backbone 的选择和微调策略,往往决定了一个 VLA 系统在“看得懂世界”这件事上能走多远。


8.2.2 语言编码器:LLM 或轻量文本编码器

语言编码器负责把自然语言指令、环境描述、安全约束等文本信息变成向量形式,使之可以与视觉特征融合并指导动作生成。与纯 NLP 任务不同,机器人场景的语言往往简短(命令式)、结构清晰,但对细节和歧义极其敏感,例如“轻轻地把玻璃杯放到桌子角落”。

因此,本节重点不在于重新讲解 Transformer 原理,而是讨论:在具身智能系统中,如何选用合适的语言编码器,并与视觉、动作模块对接。

8.2.2.1 大型语言模型作为编码器

BERT 及后续的一系列大型 Transformer 语言模型证明,通过在海量文本上进行自监督预训练,可以得到极强的语义表征能力。(arXiv) 随着参数规模和数据量持续增大,现代 LLM(GPT 系列、PaLM、LLaMA 等)已经具备丰富的世界知识和强大的推理能力。

在 VLA 框架中,LLM 通常以两种方式参与:

1.作为“冻结的文本编码器”

  • 给定一条指令,将其 tokenize 后输入 LLM,提取:
    • [CLS] 或特殊位置的向量;
    • 或所有 token 向量的平均/加权和;
  • 得到的句子 embedding 作为后续多模态 Transformer 的语言条件。大量工作表明,使用 BERT 类模型的上下文化 embedding 可显著优于静态词向量。(ACL Anthology)
  • 在这种设置下,LLM 的参数往往被冻结,仅在上方加一层小型投影网络适配当前任务。 2.作为“高层规划器/解释器”
  • 更进一步,可以让一个对话式 LLM 接收环境摘要(视觉描述、当前状态)和人类指令,输出结构化的子任务列表或符号计划,然后由下游 VLA 模型执行。
  • 这属于“LLM + 具身控制器”的层次化架构,本节不展开细节,但需要读者意识到:即便 LLM 不直接输出关节命令,其强大的语言理解与推理能力仍然可以在宏观层面塑造机器人行为。

LLM 作为编码器的优点是明显的:对复杂长指令、模糊描述、指代现象(“把它放回原处”)等有更好的理解;并且可以利用其世界知识补足训练数据中没有明说的常识(如“玻璃杯易碎,动作要慢”)。代价则是:

  • 参数量巨大,推理延迟高(尤其是云端部署时还要加上网络延迟);
  • 很难在机器人本体有限算力上直接部署全尺寸模型;
  • 安全与可控性需要额外设计(将在第 10 章讨论)。

因此,实际系统中常采用“离线或远程 LLM 负责高层规划 + 本地小模型负责实时控制”的混合方案。

8.2.2.2 轻量级文本编码

与大型语言模型相比,小型 Transformer 编码器(如 DistilBERT、ALBERT、MobileBERT 等)通过知识蒸馏和结构压缩,在保持大部分语义能力的同时,显著降低了参数量与推理延迟。(Hugging Face)

在机器人场景中,这类模型非常适合用作“在线指令编码器”:

+性能与效率折中 例如 DistilBERT 通过在预训练阶段对 BERT 进行知识蒸馏,参数量减少约 40%,但在多种 NLP 任务上仍保留约 97% 的性能。(arXiv) 对于指令长度通常不长的 VLA 任务,这样的性能完全足够。 +专用句向量模型 Sentence-BERT 等“句子 Transformer”直接以“句子相似度”为优化目标,输出的 embedding 更适合距离度量与检索,也非常适合将语言指令编码为一个定长的语义向量,在多模态空间中与视觉 embedding 对齐。(sbert.net) +领域内微调与蒸馏 一种常见策略是:

  • 先用大模型(LLM)对机器人指令数据做离线标注或生成“伪标签”(例如对指令进行语义解析);
  • 再将这些信号蒸馏到一个小型文本编码器上,使其在本领域指令上表现接近大模型;
  • 部署时仅保留小模型,兼顾性能与实时性。

对于想在真实机器人上本地运行 VLA 的读者,小型 Transformer 编码器 + 适度微调,往往是比直接调用 LLM 更务实的起点。

8.2.2.3 子词级别处理

无论是大模型还是小模型,现代神经语言模型几乎都采用子词(subword)级别的分词方案,而不是传统的“空格切词”。这样做的原因包括:

  • 新词、拼写变体、混合语言非常常见;
  • 机器人指令里常出现大量“物体名 + 型号 + 符号”(如“drawer_3”“箱子A-2”);
  • 单纯按词分割会导致词表巨大且 OOV(未登录词)严重。

**Byte Pair Encoding(BPE)**是最常用的子词分词算法之一,最初源自数据压缩,后被引入神经机器翻译和语言建模。其基本过程是从字符级词表出发,迭代地将频繁共现的 token 对合并为新的子词单元,直到词表达到预设大小。(Data Science Dojo)

Google 提出的SentencePiece则进一步将 BPE 和 unigram 语言模型封装为一个“语言无关的子词分词工具”,可以直接在原始句子上训练分词器,不依赖预分词。(arXiv)

在 VLA 语言编码模块中,子词分词带来以下工程影响:

+指令数据的准备

  • 通常直接使用预训练模型自带的 tokenizer(BPE / SentencePiece),而不是自己重新分词;
  • 如果机器人任务涉及大量专业名词或物体别名,可以在训练 tokenizer 时把这些词加入“用户词表”,避免被拆得过碎。 +跨语言与混合输入
  • 对中文、日文等不以空格分词的语言,子词方法可直接在字符/字节级进行建模;
  • 对“中英混杂”的指令同样适用,对于具身任务中常见的“英文编号 + 中文描述”的情况尤为方便。 +与多模态对齐的稳定性
  • 物体名称、动作名等重要 token 的切分若不稳定,会给图文对齐带来噪声;
  • 实践中常对这类 token 使用一致的格式(如 <OBJ_cup>)、或在分词器中锁定其为单一 token,以获得稳定的语义锚点。

【图 8-2-3 占位:语言编码示意图。左:原始文本指令;中:经 BPE/SentencePiece 分词得到 token 序列;右:经 Transformer 编码获得句向量和 token 向量。】


8.2.3 对齐视觉与语言特征空间的方法(投影层、对比训练)

当视觉编码器和语言编码器分别输出特征向量后,下一步问题是:如何把这两种模态“放进同一个语义空间”,从而支持:

  • 以文找图、以图找文;
  • “指令聚焦”到图像中的相关区域;
  • 在统一 Transformer 中同时处理视觉、语言、动作 token。

本节介绍三类常见对齐方式:投影层、对比训练、共享 Transformer。

8.2.3.1 投影层

投影层(projection head)是紧接在视觉/语言编码器之后的小网络,一般由 1–2 层线性层或小型 MLP 组成,其作用包括:

  • 将不同编码器输出的特征统一到相同维度(例如都映射到 512 或 1024 维向量空间);
  • 施加适当的归一化(LayerNorm、L2 归一化),便于用点积或余弦距离衡量相似度;
  • 引入极少量可训练参数,使得下游任务可以“调整”预训练特征而不破坏 backbone。

在 CLIP 中,图像编码器和文本编码器各自后接一个线性投影层,并对输出向量进行 L2 归一化,从而将两者对齐到同一单位球面上。(arXiv) 在此基础上,可以直接用内积作为相似度,进行对比学习。

对 VLA 来说,投影层还有几种常用扩展:

+模态特定投影 + 共享多模态空间 不同机器人、不同相机可以各自有一套视觉投影层,但共享语言投影层和后续决策模块,从而在“对齐空间”中抽象掉硬件差异。 +将机器人状态注入投影层 对于视觉特征,可以在投影时拼接当前机器人状态(关节角、夹爪开合等),让特征更接近实际可操作性(例如同一图像下,伸手前/伸手后看到的场景语义略有不同)。

设计时的经验原则是:保持 backbone 尽量通用,把领域特定的适配集中在小而灵活的投影层中。

8.2.3.2 对比训练

投影层只是几何上的“对齐”,要真正让视觉与语言在语义上对齐,通常需要对比学习(contrastive learning)作为训练目标。

CLIP 的训练方式是典型代表:(arXiv)

  • 给定一个 batch 的图文对 \(\displaystyle (I_i, T_i)\),分别通过图像编码器和文本编码器 + 投影层得到向量 \((v_i, t_i)\);
  • 计算所有图像–文本向量之间的相似度矩阵 \(S_{ij} = \langle v_i, t_j \rangle\);
  • 对每一行、每一列分别做 softmax 和交叉熵,使得:
    • 正确配对 \(\displaystyle (I_i, T_i)\) 的相似度最大;
    • 其他“错配”作为负例,被拉远。

这种 InfoNCE 风格的对比损失在实践中非常有效地学习到了图文对齐的语义空间,支持零样本分类、跨模态检索等能力。(维基百科)

在 VLA 预训练中,对比学习可以以多种方式使用:

+互联网图文数据上的 CLIP 式预训练 先用大规模图文对训练基础视觉–语言对齐,再将该空间与机器人动作空间衔接。这一步更多是“通用语义”层面的学习。 +机器人示教数据上的任务级对比 利用指令–视觉–轨迹三元组构造正/负样本:

  • 正样本:能成功完成某指令的轨迹起始帧与该指令;
  • 负样本:同一帧配上其他不相关指令,或同一指令配上失败/不相干场景; 通过对比损失强化模型对“哪种视觉场景对应哪种任务意图”的辨别能力。

工程上,需要注意对比学习对 batch size、温度参数等非常敏感:

  • batch 越大,负例越丰富,训练信号越强;
  • 温度参数控制相似度的“锐度”,过大或过小都会影响收敛;
  • 可以通过 hard negative mining 选取语义上接近但错误的图文对作为负例,提升模型判别能力。

8.2.3.3 共享 Transformer

与双塔(dual-encoder)结构中“先各自编码、再对齐”的思路不同,共享 Transformer直接把视觉 token 和语言 token 拼接成一个长序列,送入统一的 Transformer 中进行 self-attention,从而在内部同时完成融合与对齐。

这类结构是许多视觉–语言模型(VLM)的基础:将图像 patch token(来自 CNN feature map 或 ViT)、语言 token 一并输入,让每个 token 可以对任意其他 token 建立注意力连接。

优点包括:

+自然的跨模态交互 无需显式设计对齐损失,注意力机制会自动学习“哪个语言 token 应该关注哪些视觉 token”,例如指令中的“红色杯子”会在图像中激活对应区域。 +表达能力更强 单一 Transformer 可以同时为视觉和语言建模高阶组合关系,适合复杂推理任务,如多步操作计划、视觉问答等。相关工作表明,基于 Transformer 的视觉编码在足够数据条件下可以达到或超过传统 CNN。(MDPI) +易于扩展到动作 token 在 VLA 中,还可以进一步将动作 token 加入序列,实现“视觉–语言–动作”统一建模,这在 8.5 节会系统化地抽象。

缺点则主要是计算开销:视觉 token 数量远多于语言 token,长序列 self-attention 的复杂度为 \(O(n^2)\),必须通过 patch 下采样、稀疏注意力、分块注意力等方式控制成本。

【图 8-2-4 占位:特征对齐结构对比图。左:双塔结构(独立图像/文本编码器 + 投影 + 对比学习);右:共享 Transformer 结构(视觉/语言 token 拼接输入统一 Transformer)。】


8.2.4 时间维度处理:多帧图像、视频编码器的设计

机器人不是在看静态照片,而是在不断从视频流中感知世界。抓取、插拔、开门、跟随等操作都隐含了明确的时间顺序和动力学过程:物体是否已经被握紧?抽屉是不是已经完全打开?前方障碍物是在远离还是靠近?单帧图像往往不足以回答这些问题。

因此,VLA 模型在视觉编码阶段必须考虑时间维度。本节介绍从简单到复杂的几类设计。

8.2.4.1 视频输入需求

从任务角度看,可大致区分两类:

+准静态任务 如“从桌面抓起红色方块”,环境变化缓慢,单帧图像足够决策,只需偶尔更新视觉即可。 +强时序任务 如“旋开瓶盖”“把抽屉慢慢关上”“沿着人移动的方向跟随”,需要理解连续状态变化、物体速度和接触顺序,仅依靠当前帧容易模糊任务进度。

视频输入能够为模型提供:

  • 运动信息:物体速度、方向、是否滑动、是否即将跌落;
  • 交互阶段:如夹爪是否已经接触物体、有无碰撞、是否松手;
  • 相机/机器人自身运动:在移动机器人或手眼相机场景中尤为重要。

在系统实现上,视频输入还受到帧率、带宽和算力限制:

  • 视觉编解码和神经网络推理本身占用大量时间;
  • 控制环路不能因“等视觉”而严重阻塞;
  • 常见做法是:
    • 只保留最近 \(\displaystyle K\) 帧(例如 2–8 帧)作为时序窗口;
    • 或者对视频做时间下采样(每隔若干帧取一帧);
    • 对于高频控制,视觉更新频率通常低于控制频率。

随着专用视频 Transformer(如 TimeSformer)和自监督视频模型(如 VideoMAE)的发展,直接使用视频 backbone 进行时空特征编码正成为趋势。(arXiv)

8.2.4.2 多帧图像编码

多帧编码可以从非常朴素的方案做起,再逐步演进到复杂的视频 Transformer。

1.**多帧堆叠 + 2D CNN(早期融合)**最简单的方式是将最近 \(\displaystyle K\) 帧图像在通道维度上堆叠,例如将 3×H×W 的 RGB 图像变为 \(3K \times H \times W\),然后交给标准 2D CNN 处理。卷积核在通道维的线性组合会捕捉到帧间差分,从而隐式利用时间信息。

  • 优点:无需改动 backbone 结构,可直接复用现有的 2D CNN 权重(在某种程度上);
  • 缺点:时间维度被混合在通道维中,很难捕捉长距离依赖,对“动作阶段”的理解有限。 2.3D 卷积与时空 CNN3D 卷积在 \(\displaystyle (t, h, w)\) 三个维度上卷积,可直接建模局部时空体积,是传统视频动作识别中的主力工具。相比堆叠多帧,3D Conv 明确区分了时间与空间维度,对短时间窗口内的运动(如抓取瞬间的对准、物体滑动)建模更准确。在机器人场景中,3D CNN 常用于:
  • 对几百毫秒尺度的动作阶段做精细分类(接近、抓取、提起、放置);
  • 建立视觉与动作之间更紧密的定时关系。 3.时序 Transformer / 视频 Transformer近年来的 TimeSformer 等工作把 Transformer 直接用于视频:将每一帧划分为 patch,并在空间和时间上统一做 self-attention,或采用“空间注意力 + 时间注意力分离”的分解结构,以降低计算复杂度。(arXiv)
  • 空间注意力负责捕捉同一帧内的空间关系;
  • 时间注意力建模不同帧之间的状态演化;
  • 对于需要长期动作理解的任务(如人类演示的长视频)尤其有用。

在 VLA 中,一个务实的路线是:

  • 入门阶段:使用“多帧 2D CNN + 简单时序池化”(例如对每帧特征做平均或拼接,再输入决策 Transformer);
  • 进阶阶段:引入 3D CNN 或视频 Transformer 作为视觉 backbone,把“时间理解”尽可能下沉到视觉编码层。

【图 8-2-5 占位:多帧图像编码结构对比图。上:多帧堆叠 + 2D CNN;中:3D CNN 时空卷积;下:TimeSformer 风格的时空注意力结构。】

8.2.4.3 隐状态记忆

即便使用了多帧视频编码,模型看到的时间范围仍然有限。而机器人任务往往跨越数十秒甚至数分钟,仅依靠固定长度的视频窗口难以捕捉完整上下文。因此,决策模块还需要一个跨时间步的隐状态记忆(hidden state / memory)

典型方案包括:

1.RNN / GRU / LSTM 上接视觉特征在每个控制周期,将视觉编码器输出的向量(或向量序列)送入一个轻量 RNN(如 GRU 或 LSTM),其隐状态在时间上递归更新:

\[ h_t = \mathrm{GRU}(x_t, h_{t-1}) \]

  • 优点:实现简单、计算稳定,适合作为 CNN/ViT 之后的“时序头”;
  • 缺点:对极长序列的建模能力有限,梯度传播容易衰减。 2.Transformer 的 KV-cache 记忆对于基于自回归 Transformer 的 VLA 模型,可以采用与 LLM 推理相同的 KV-cache 技术:

这种做法具备:

代价是显存随历史长度线性增长,需要定期“截断上下文”或对旧信息做压缩。

  • 在时间步 \(\displaystyle t\),将视觉 token、语言 token、历史动作 token 组成输入序列,通过 Transformer 得到当前输出;
  • 同时缓存每一层的 Key/Value;
  • 在时间步 \(t+1\) 时,仅追加新的 token,复用已有 KV,从而在意义上保留了完整历史。
  • 强大的长程依赖建模能力;
  • 与大模型推理的工程栈兼容(同一套优化工具可用于机器人推理)。

3.显式记忆槽与摘要为了避免 KV-cache 无节制膨胀,可以设计显式记忆槽(memory slots)或状态摘要:

  • 通过一个小网络将若干步历史视觉–动作信息压缩成固定维度的摘要向量;
  • 将摘要作为额外 token 输入决策 Transformer,代替全部历史原始 token;
  • 对于长时间任务(例如“打扫整个房间”),这样的摘要可以记录“已清扫区域”“已搬运物体”等高层状态。

在具身系统中,隐状态记忆的设计还与控制频率与 episode 管理紧密关联:

  • 视觉更新频率低于控制频率时,隐状态必须在视觉未更新的时间段内继续演化,预测“环境近似连续”的变化;
  • 每次任务开始时要正确重置记忆,避免“上一次任务的残留状态”干扰当前决策;
  • 对多机器人/多环境训练,需要在记忆中显式编码当前机器人 ID、环境 ID,以免跨环境信息污染。

从长远看,“隐状态记忆”与第 12 章将讨论的世界模型和长序列建模紧密相关。未来的具身基础模型很可能会把“视频编码器 + 记忆网络”统一视为一个长序列模型,在几分钟甚至更长时间跨度内,端到端地建模视觉、语言和动作的相互作用。

【图 8-2-6 占位:时间维度与隐状态记忆示意图。左:摄像头连续帧经视觉编码器得到特征序列;中:RNN/Transformer 维护隐状态;右:隐状态影响当前动作输出。】


通过本节的内容,读者应该对 VLA 中“看”和“听”的前端结构有了完整图景: 用 CNN 或 ViT 作为视觉 backbone;用 LLM 或轻量 encoder 作为语言模块;通过投影层和对比学习对齐跨模态特征;再在时间维度上用视频编码与隐状态记忆把片段连成故事。 在此基础上,下一节(8.3)将转向“如何把这些感知结果真正解码成可执行的动作”,完成从“看懂/听懂”到“做对”的关键一跳。

本章小结与自测

三行小结

  1. 本章是 VLA 架构设计核心:输入、融合、动作解码。
  2. 重点在多模态对齐与条件策略建模。
  3. 学完后应能比较不同 VLA 架构的设计权衡。

检查题

  1. 用你自己的话总结本章最核心的一个公式/机制。
  2. 给出一个“如果要落地到项目里,你会怎么用”的具体例子。

常见误区

  1. 盲目堆模型参数。
  2. 忽略动作空间定义与约束。
  3. 多模态融合后不做可解释性检查。

公式到代码(最小示例)

# 多模态特征拼接最小示例
vision = [0.1, 0.2, 0.3]
language = [0.5, -0.1]
state = [0.0, 1.0]
fusion = vision + language + state
print(fusion)

本章外部参考(集中)

  1. PMC
  2. 아무블로그
  3. arXiv
  4. MDPI
  5. arXiv
  6. arXiv
  7. arXiv
  8. ACL Anthology
  9. Hugging Face
  10. arXiv
  11. sbert.net
  12. Data Science Dojo
  13. 本章其余链接可在正文中按上下文继续查阅。

8.3 动作表示与解码

8.3 动作表示与解码(导言)

学习导航

  • 本章主题:8.3 动作表示与解码(导言)
  • 前置知识:建议先完成第 3-7 章对应先修内容。
  • 建议用时:69-89 分钟
  • 阅读顺序:先看概念框架,再看公式/代码,最后做自测。

前面在第 6 章我们已经从“机器人学”的视角讨论过关节空间、末端空间、Delta Pose / Velocity 命令等概念。到了 VLA 模型这一章,我们关心的是另一件事:如何把这些连续的控制量变成“token”,再用 Transformer 一类的大模型去“说出”动作序列

这一节可以理解为“动作的语言学”:

  • 8.3.1 解决“如何把连续动作变成离散 token(tokenization)”;
  • 8.3.2 解决“模型头(decoder head)如何按 token 生成动作”;
  • 8.3.3 讨论多步动作生成时的采样与剪裁;
  • 8.3.4 讨论把离散 token 再变回可执行、平滑、满足约束的轨迹。

8.3.1 动作离散化:tokenization 策略(关节空间 / 末端空间)

从控制角度看,机器人动作通常是连续向量(关节角速度、末端速度等);但从“语言模型”角度看,我们更希望它是有限词表上的离散 token。这一小节讨论如何从连续空间到 token 空间。

【图 8-7 占位:关节空间与末端空间动作离散化示意图。 左:每个关节角度 / 速度被均匀分成若干区间; 右:工作空间中末端位姿被划分为 3D 网格与若干离散朝向。】

8.3.1.1 逐关节离散

逐关节离散(per-joint / per-dimension discretization)是目前最经典、也最容易工程落地的一种方案:

1.确定每个动作维度的取值范围 例如 RT-1 中针对一台移动机械臂,将 7 维末端位姿(x, y, z, roll, pitch, yaw, gripper)、3 维底盘(x, y, yaw)以及一个模式选择变量统统视为动作维度,先在数据中统计它们的取值范围。(谷歌研究) 2.将每个维度量化为固定个数的 bin 常见做法是为每一维设定 128 或 256 个离散区间(bin),每个区间对应一个 token ID。例如 RT-1 采用每维 256 个 bin 的量化,构成统一的“动作词表”,使不同任务、不同机器人共享同一种离散表示。(谷歌研究) 3.量化策略:均匀 vs 分位数 +简单均匀量化:直接按区间长度均分整个范围;实现简单,但如果数据分布高度非均匀,会浪费很多 bin。 +分位数量化:先统计训练数据的分布,只在 [1%, 99%] 这样的高频区间内均匀划分,把极端异常值舍弃或单独处理,这也是不少 VLA 实践中常用的策略。(Research Square) 4.token 序列的结构 对于每一步动作,可以直接把“所有维度的 token 串联起来”视作一段短序列:

\[ a_t = [\text{tok}^{(1)}_t, \text{tok}^{(2)}_t, \dots, \text{tok}^{(D)}_t] \]

其中 \(\displaystyle D\) 是动作维度数。解码器可以选择并行预测所有维度(见 8.3.2.2),也可以把每个维度也放在自回归链上逐个生成(虽然这样通常没必要)。

逐关节离散的优点与不足:

+优点

  • 实现简单,和 LLM 的 token 概念天然对齐。
  • 各维度可独立量化,易于处理高维动作。
  • 对于不同机器人,只要做同样的量化,就能共享一部分“动作语言”。 +不足
  • 默认假设各维度近似独立,无法显式编码“某些组合更常见、更合理”的结构。
  • 多维联合空间仍然是连续的;如果每维都需要高分辨率,bin 数急剧膨胀。
  • 不能直接编码更高级别的语义,比如“沿桌面边缘平行滑动”这种空间模式。

近期的一些工作(如 FAST)开始探索用离散余弦变换(DCT)等压缩方式,把多维动作先映射到频域再量化,在保持精度的同时大幅压缩 token 数量,这类方法在高频、高维度的灵巧操作上很有优势。(arXiv)

8.3.1.2 末端空间离散

和逐关节离散相比,末端空间离散(end-effector space discretization)是在更“几何直观”的空间中划分 token:

1.工作空间网格化

  • 在机器人可达的笛卡尔空间中建立 3D 网格(如 [x, y, z] 坐标的体素 grid),每个网格单元对应一个“粗略位置 token”。
  • 姿态(roll, pitch, yaw)可以单独以球面网格或预定义有限集合(例如若干典型抓取姿态)离散。 2.增量式末端命令 实际控制中更常见的是离散化Delta Pose
  • 例如对 \((x,y,z)\) 的每轴位移离散成 {−2 cm, −1 cm, 0, +1 cm, +2 cm};
  • 姿态变换则离散为若干固定的旋转增量。 这样 token 更像是“方向键”而不是绝对坐标,和 6.3 节中的增量命令思想相呼应。 3.通用性与跨机器人共享 末端空间离散的一个重要优势是比较容易在不同机械臂之间共享:不同机器人在位姿空间具有相似的语义(靠近桌边、朝向物体等),只要 IK 求解器能把末端命令映射到各自关节空间,就可以用同一套动作 token 控制多种形态的机器人。 4.挑战
  • 必须依赖逆运动学(IK)和碰撞检测来保证动作可执行;
  • 网格太粗会降低精度,太细又使词表爆炸;
  • 对于高度冗余机械臂,同一末端 token 会对应大量关节解,可能导致执行时姿态不稳定。

在大规模 VLA 实践中,末端空间离散往往与逐关节离散同时存在:例如用末端增量 token 处理大尺度运动,再用关节级连续控制或更细粒度 token 做微调。

8.3.1.3 经验设计 vs 学习生成

动作离散化有两条路线:经验设计(hand-crafted)学习生成(learned tokenization)

1.经验设计:Uniform / heuristic binning这类方法以 RT-1、RT-2 等工作为代表:

优点是可解释、易调参,不同实验室可以用相似规范复现;缺点是:

  • 人工设定每个维度的范围与 bin 数,通常是“每维 256 bin + 分位数裁剪”之类的规则。(谷歌研究)
  • Grounding Multimodal LLMs in Actions 中称这种方法为“Uniform Action Tokenization”:对每个连续维度进行均匀或分位数切分,再将每一步动作表示成一串 token。(arXiv)
  • 没有利用到数据的结构;
  • 为了兼容各种任务,往往需要牺牲一部分分辨率或压缩率。

2.学习生成:VQ / RVQ / Learned Codebook更近一步,可以把动作 token 看成“代码本(codebook)中的索引”,代码本则通过学习得到。典型思路是训练一个向量量化(VQ)或 VQ-VAE,用来压缩动作序列:(arXiv)

这样,每个 code 就是一个**“典型动作模式” token**,可以同时捕获多维之间的相关性,甚至可以直接在时间维做编码(一个 token = 一个短 action chunk)。

研究表明,基于语义对齐的动作 token 通常比简单回归或均匀量化取得更高的任务成功率。例如,针对 CALVIN 等长时操作基准时,学习到的 tokenization 在成功率上明显优于直接回归和 naive uniform binning。(ResearchGate)

这类方法的代价在于:

  • 编码器:将连续动作或短动作片段映射到一个潜在向量;
  • VQ 模块:在一个离散代码本中找最近的若干 code(或级联 Residual VQ 的多级 code);
  • 解码器:从 code 重构回原始动作。
  • 需要大量轨迹数据来训练 tokenizers(VQ-VLA 使用了比以往工作多两个数量级的合成轨迹数据);(arXiv)
  • tokenizer 本身增加了一层建模误差,需要保证重构精度足够高。

3.实践建议

  • 如果数据规模有限或系统原型阶段,优先考虑简单的逐关节均匀离散,避免在 tokenizer 设计上耗尽精力。
  • 当数据量很大、任务多样或需要长时规划时,可以引入学习型 tokenization(VQ / DCT 压缩等),把“动作词汇”当作一个需要预训练的模块,就像视觉 backbone 和语言 backbone 一样。

8.3.2 动作解码头:自回归解码 vs 并行预测

有了动作 token,还需要一个“解码头”(policy head)将视觉–语言–历史状态的融合表示,转换为下一段动作 token 序列。这里的关键设计是:这些 token 是按顺序一个一个吐出来,还是一次性并行给出?

【图 8-8 占位:三种解码方式对比示意图。 左:自回归解码,按时间和维度逐个 token 生成; 中:并行解码,一次输出整个动作向量 / 短序列; 右:混合解码,先并行给出草案,再通过少量自回归 / diffusion 步骤细化。】

8.3.2.1 自回归解码

**自回归解码(autoregressive decoding)**是最接近传统语言模型的方式:把动作当作“句子”,下一个 token 的概率由“前文上下文 + 已生成的动作 token”共同决定。(Emergent Mind)

1.形式化 设当前时间步的动作序列为 \(a_t = (a_{t,1}, \dots, a_{t,L})\),则自回归模型建模:

\[ p(a_t | \text{obs}, \text{instr}, \text{history}) = \prod_{i=1}^{L} p(a_{t,i} | a_{t,<i}, \text{obs}, \text{instr}, \text{history}) \]

2.优点

  • 能自然表达多峰分布和复杂相关性,例如“如果前两个关节选择了某一组合,后面关节就自适应配合”。
  • 序列长度可以灵活,和语言 token 混在一起训练(如 RT-2 中同时生成文字和动作 token)。(arXiv)
  • 完全沿用 LLM 的训练管线,工程复用度高。 3.缺点
  • 推理延迟高:一个 token 一次前向。对于高频控制(>50 Hz)或长动作 chunk,这会成为关键瓶颈。
  • 错误累积(exposure bias):一旦前面某个 token 掉坑,后面整个序列都会围绕错误展开。
  • 在动作维度不多、依赖结构相对简单时,自回归有点“杀鸡用牛刀”。

因此很多机器人工作采用折中的做法:在时间上自回归,在同一时间步的各维度上并行输出,即一步生成所有关节 / 末端的 token,而不是逐维自回归。

8.3.2.2 并行解码

**并行解码(parallel decoding)**强调在一个前向中直接给出整段动作序列。典型例子包括:

1.Action Chunking Transformer(ACT / MT-ACT) ACT 把一段连续控制序列视为一个“chunk”,用条件 VAE 或 Transformer 一次性生成整段动作,而不是逐步滚动生成。多任务版本 MT-ACT 则结合了多摄像头、语言指令等模态,在 encoder–decoder 结构上一次性吐出多个时间步的动作。(Radek Osmulski)

  • 解码器输入是一组“时间查询向量”,输出是对应时间步的动作;
  • 从解码时看,这是一种时间维度并行解码:所有未来 H 步一起预测。 2.并行固定点解码(Parallel Fixed-Point Decoding) 近期有工作(如 PD-VLA 框架)把原本自回归的解码过程等价重写为一个非线性方程,再用并行迭代的方式求解,使得在不改网络结构的前提下也可以近似并行地预测所有动作 token。(arXiv) 3.离散 diffusion / mask-based refinement “离散 diffusion 到动作解码”的思路是:

这也是一种并行 + 迭代 refinement的解码方式,和图像生成中的 discrete diffusion 完全类似。

  • 从“全噪声”或“全 mask”动作序列开始;
  • 多轮迭代中,每轮并行更新所有 token(或一部分 token),逐渐从噪声收敛到可执行的动作序列。(arXiv)

并行解码的优势在于延迟极低、适合高频控制或长时 chunk;缺点是:

  • 需要专门的训练目标(如重构整个序列),对超长序列时可能不易收敛;
  • 在真正复杂的多步逻辑任务上,有时会暴露出“局部矛盾、不一致”的问题,需要配合后处理或额外约束(见 8.3.4)。

8.3.2.3 混合方式

在语言领域,已经出现大量半自回归(semi-autoregressive)、分组自回归等折中方案;这一思想同样可以迁移到动作生成:(MDPI)

1.分组 / 分层解码

  • 把动作序列分成若干组(例如每组 4 步或每组若干关节),组内并行生成,组间自回归;
  • 或者先生成一个粗分辨率的动作草图(低频、长时间步),再在每个时间插值点上用自回归 / diffusion 小网络做局部精细化。 2.“草稿 + 校对”式解码
  • 第一阶段用并行解码或 diffusion 生成一个候选动作序列;
  • 第二阶段使用一个轻量自回归“校对头”检查并局部修改高风险区域(例如接触发生前后的几步)。 3.chunk 级别自回归 ACT 的一个视角是:在 chunk 级别自回归,在 chunk 内部并行生成。即 policy 不是一步一步走,而是按宏观步骤(chunk)推进,每个 chunk 由专门的解码器一次生成。(Radek Osmulski)

对实际系统而言,“混合方式”最大的价值在于: 同时兼顾决策延迟、序列一致性和网络复用,而且容易和后续的轨迹优化、约束投影(8.3.4)结合。


8.3.3 多步动作生成与剪裁(temperature、top-k 等)

一旦采用类似语言模型的解码方式,就不可避免要面对“如何从分布中采样动作 token”的问题。本节从采样策略、长序列剪裁、以及探索–确定性平衡三个角度展开。

【图 8-9 占位:不同采样策略对 token 分布的影响。 图中展示同一 softmax 分布下:贪心、不同 temperature、top-k、top-p 的选取差异,以及对生成动作轨迹的影响。】

8.3.3.1 取样策略

给定解码器输出的 logits,我们可以有多种采样选择:

1.贪心 / Argmax 解码(Greedy) 直接选取概率最高的 token:

\[ a = \arg\max_i p_i \]

  • 优点:确定性强,行为可复现;
  • 缺点:在多模态任务中容易倾向“平均动作”,比如抓取时输出“介于两个物体之间”的中庸轨迹。 2.温度缩放(Temperature Scaling) 将 logits 除以温度 \(\displaystyle T\):
  • \(T < 1\):分布变尖锐,更接近贪心;
  • \(T > 1\):分布变平滑,增加随机性。 机器人场景中通常选用较低温度(如 0.1–0.5),保留一点探索以避免陷入坏局部解,但不过度随机。 3.Top-k / Nucleus(Top-p)采样 +Top-k:只在概率最高的 k 个 token 中重新归一化再采样; +Top-p(Nucleus):在累积概率达到 p(如 0.8)的一组 token 中采样。 对动作生成来说,这可以防止模型偶尔抽到极不合理的尾部 token,从而减少“抽风动作”。 4.对连续动作的采样 对于使用 diffusion policy 等连续生成方式的模型,其“采样”体现为多步噪声注入 + 梯度更新过程。这类方法往往天然具备多模态输出能力,能够处理高维连续动作空间,在实际机器人操作实验中取得了显著优势。(arXiv)

训练阶段还可以使用“教师强迫 + 抽样”的混合策略:一部分步长用专家动作监督,一部分步长从模型分布中采样,以减轻纯教师强迫带来的分布漂移。

8.3.3.2 长序列剪裁

VLA 模型在决策时通常不会只输出“下一步”,而是生成一个长为 H 的动作序列,类似于 MPC(模型预测控制)中的预测地平线。

1.最大长度限制与 EOS token

  • 在设计动作 token 序列格式时,可以加入类似文本中的 “” 终止符;
  • 同时在训练和推理阶段限定一个最大地平线 H,超过这一步就强制剪裁。 这样可以防止模型在长序列上“自言自语”过久,而不去接受新的感知信息。 2.滑动窗口与 receding horizon 常见做法是:
  • 模型每次出一个 H 长度的序列;
  • 实际只执行其中前 \(h \ll H\) 步;
  • 然后重新观察环境,再由模型生成最新一段序列。 ACT / MT-ACT 一类 action-chunk 模型可以视作这种 receding horizon 策略在“chunk 级”的自然实现。(Radek Osmulski) 3.基于任务阶段的剪裁 对复杂操作可以人为拆成若干阶段(approach / grasp / lift / place 等),每一阶段对应一个较短的动作序列。阶段之间通过语言指令、状态条件或高层 planner 触发切换,从而避免在一次解码中生成特别冗长的序列。

8.3.3.3 平衡探索和确定性

和强化学习中相似,动作生成也需要在“探索多样性”和“执行可靠性”之间平衡:

1.不同场景使用不同解码模式 +离线数据增强 / 仿真探索:可以适当提高温度、用 top-k / top-p 增加多样性,得到多条略有差异的轨迹,用来扩充训练数据。 +真实机器人执行:通常采用低温度甚至纯贪心解码,减少突发异常动作的概率。 2.不确定性感知与自适应采样

  • 可以用输出熵、logits margin 等度量解码不确定性;
  • 在不确定性高时:
    • 生成多个候选序列,再用一个价值函数(例如预测成功率的网络)做重排序;
    • 或者缩短预测地平线,让系统更快地重新观察和 replanning。 3.与安全约束结合 解码自主增加随机性必须和安全层配合:
  • 例如即使模型采样到速度较大的 token,后处理层仍会限幅(见 8.3.4.2);
  • 对高风险动作(接触、快速运动等)可以强制使用确定性解码。

8.3.4 动作后处理:插值、平滑、约束修正

到这里,VLA 模型已经输出了一串“动作 token”。但真实机器人并不能直接执行 token,它需要的是平滑、连续、满足动力学/安全约束的轨迹。本节可以视作“把离散句子翻译成电机指令”的步骤。

【图 8-10 占位:动作后处理整体流程图。 上:模型输出的离散 token 序列; 中:通过插值和平滑生成连续关节 / 末端轨迹; 下:加入关节限位、速度/加速度限幅和碰撞检查后的最终执行轨迹,同时标出执行监控的反馈回路。】

8.3.4.1 插值与平滑

离散 token 通常只对应稀疏时间点上的动作(每 50–100ms 一个),而低层伺服控制需要 1kHz 级别的目标轨迹。因此必须进行插值和平滑处理:

1.线性插值(Piecewise Linear) 最简单的方案是在相邻两个动作之间做线性插值:

\[ a(\tau) = (1-\alpha)a_t + \alpha a_{t+1},\quad \alpha\in[0,1] \]

  • 优点:实现简单、实时性好;
  • 缺点:速度和加速度在关键点存在不连续,可能导致机械结构抖动。 2.多项式 / 样条插值(Cubic Spline, B-Spline) 使用三次样条或 B-spline 可以生成速度和加速度连续的轨迹; 一些最近的动作 tokenization 工作直接把动作表示为 B-spline 控制点的离散编码,在 token 层面就内置平滑轨迹先验,相当于“把平滑性学进 tokenizer 里”。(arXiv) 3.滤波与低通处理 对于关节速度、末端速度等指令,可以在插值后的轨迹上施加:
  • 低通滤波器(如一阶滤波、Butterworth);
  • 或 Savitzky–Golay 平滑滤波,在尽量不扭曲轨迹形状的前提下降噪。 这些操作可以视为在轨迹空间对高频成分限幅,从而避免激发结构共振或电机噪音。

实际系统会根据硬件约束和任务特点选择合适的插值方案:高速、刚性系统更依赖样条和平滑;慢速、柔顺系统可以接受略粗糙的线性插值。

8.3.4.2 约束修正

无论离散化和解码做得多精致,都不能保证输出动作天然满足所有物理和安全约束,因此需要在执行前做一次约束修正(constraint projection / correction)

典型的约束包括:

1.关节限位与软限位

  • 对每个关节设置硬限位(物理极限)和软限位(安全范围);
  • 对插值后的关节角度、速度、加速度进行逐点检查,若超出范围则进行裁剪(clipping)或缩放(scaling)。 2.速度 / 加速度限幅与轨迹重定时
  • 原始轨迹在几何上合理,但速度峰值可能超出驱动能力;
  • 可以通过“时间重缩放”(time scaling)的方法:延长执行时间,使得在任何时刻速度、加速度都不超阈值。 这和传统轨迹规划中的“时间参数化”完全一致,只不过这里的输入轨迹是 VLA 模型给的。 3.碰撞和可达性检查
  • 在末端空间离散;某些 token 对应的末端位姿可能落在障碍物内部或超出可达域;
  • 可在执行前对关键点(尤其是接近目标物体和环境边界的位置)调用快速碰撞检测;
  • 对不可行的动作,可以:
    • 就近投影到安全边界;
    • 或直接标记该 token 无效,重新采样 / 重新解码。 4.与 tokenization 的联动
  • 如果使用学习型 tokenizer(比如 VQ 或采用 B-spline 的 BEAST),可以把“物理可行性”作为重建损失和代码本学习的一部分,使多数 token 本身就对应“好轨迹”;(arXiv)
  • 但在工程上,仍然需要显式的约束层做最后把关,避免“罕见失败”带来严重后果。

8.3.4.3 执行监控

最后,即便轨迹已经过插值和平滑、约束修正,在执行过程中也需要实时监控(execution monitoring),这部分相当于一个“安全监督者”和“现实检验器”。

1.跟踪误差监控

  • 监控关节空间或末端空间的跟踪误差(误差超过阈值说明执行不如预期);
  • 一旦误差持续高企,可以触发:
    • 暂停执行并进入安全姿态;
    • 向高层 VLA 请求重新规划;
    • 切换到传统稳定控制(如一个保守的抓取/放置脚本)。 2.环境结果监控
  • 利用视觉 / 触觉感知检查关键事件是否发生:例如抓取后物体是否真正离开桌面、放置物体是否稳定;
  • 如果检测到“动作没有产生预期效果”(比如物体滑落),可以在语言层反馈(“抓取失败”)并重新发起局部操作。 3.安全监控与急停
  • 监控力矩、电流、关节温度等指标,检测潜在碰撞或机械过载;
  • 一旦检测到异常,优先触发硬件或软件急停,而不是继续执行后续 token;
  • 在具备人机协作场景时,需要配合前面第 10.3 节的安全策略一起设计,形成从高层决策到低层驱动的多重防线。

从系统整体角度来看,本节介绍的动作后处理层可以视为 VLA 模型与传统机器人控制模块之间的“缓冲区”——上游是高维 token 序列,下游是电机电流和力矩指令,中间这一层负责:把“语言式的决策”翻译成“物理上合理、平滑、安全的动作”


本节完成后,读者应该能够从“动作作为 token”到“动作在机器人上真实执行”建立一条完整链路的直觉。在第 9 章中,我们会进一步从训练角度讨论:在有了这些动作表示和解码方式之后,如何设计行为克隆、强化学习、自监督目标,让模型在数据中习得高质量的动作分布。

本章小结与自测

三行小结

  1. 本章是 VLA 架构设计核心:输入、融合、动作解码。
  2. 重点在多模态对齐与条件策略建模。
  3. 学完后应能比较不同 VLA 架构的设计权衡。

检查题

  1. 用你自己的话总结本章最核心的一个公式/机制。
  2. 给出一个“如果要落地到项目里,你会怎么用”的具体例子。

常见误区

  1. 盲目堆模型参数。
  2. 忽略动作空间定义与约束。
  3. 多模态融合后不做可解释性检查。

公式到代码(最小示例)

# 多模态特征拼接最小示例
vision = [0.1, 0.2, 0.3]
language = [0.5, -0.1]
state = [0.0, 1.0]
fusion = vision + language + state
print(fusion)

本章外部参考(集中)

  1. 谷歌研究
  2. Research Square
  3. arXiv
  4. arXiv
  5. arXiv
  6. ResearchGate
  7. Emergent Mind
  8. arXiv
  9. Radek Osmulski
  10. arXiv
  11. arXiv
  12. MDPI
  13. 本章其余链接可在正文中按上下文继续查阅。

8.4 多模态融合与条件建模

8.4.1 早期融合、晚期融合与中间融合方式

学习导航

  • 本章主题:8.4.1 早期融合、晚期融合与中间融合方式
  • 前置知识:建议先完成第 3-7 章对应先修内容。
  • 建议用时:77-97 分钟
  • 阅读顺序:先看概念框架,再看公式/代码,最后做自测。

关键图示:融合策略对比

关键图示:融合策略对比

在 VLA 中,“多模态融合”不仅仅是一个抽象概念,而是一个非常具体的工程设计问题:视觉、语言、机器人状态 / 动作这几路信息到底在什么阶段合在一起? 从时间位置来看,主流做法可以分为三类:早期融合(early fusion)、中间融合(intermediate / mid-level fusion)、晚期融合(late fusion)(arXiv)。三者各有优劣,并且已经在不同的 VLA 架构中得到应用。

【插图占位 8.4-1:一张流水线示意图,分别画出早期融合(原始模态直接拼接)、中间融合(各自编码后在特征层合并)、晚期融合(各自输出决策后再融合)的结构对比】

8.4.1.1 早期融合

定义: 早期融合是指在“输入阶段”就把各模态的数据合在一起,再交给统一的主干网络学习。例如:

  • 将图像 patch token、语言 token、机器人状态 token 直接串联成一个长序列,送入同一个 Transformer;
  • 或者在进入策略网络之前,先用一个 VLM(如 CLIP)对视觉与语言进行对齐,再将得到的联合视觉–语言特征与动作 / 状态一起输入策略网络,这类专门强调“Early Fusion VLA”的工作已经出现(OpenReview)。

形式上可以理解为:

\[ \text{输入序列} = [\text{语言 token},\ \text{图像 patch token},\ \text{状态 / 历史 token}] \]

统一送入一个 Transformer,通过自注意力让所有模态在第一层就开始交互。

优点:

+细粒度对齐能力强。 例如“抓起碗左边的红色杯子”,语言 token 中的“红色杯子”“左边”,可以直接在自注意力中与对应图像 patch 建立紧密联系,有利于精准 grounding。 +信息损失少。 由于在非常早的阶段就共同建模,模型可以自己决定保留什么细节、丢弃什么细节,而不是先分别压缩各模态后再合并。 +对 VLM 预训练能力利用充分。 一些工作在 CLIP 之上做早期融合,将预训练好的图文对齐特征直接用于控制决策,而不是“晚点才考虑语言”(OpenReview)。

缺点与工程挑战:

+维度高、计算重。 所有模态 token 放一起,自注意力复杂度是 \(O(n^2)\),视觉 patch 多时,对显存和算力要求很高。 +对噪声敏感。 早期融合意味着低层表示就互相影响,视觉噪声、语言歧义都可能放大到整个网络。 +训练更加“脆弱”。 如果机器人数据量不够大,很容易把预训练 VLM 学到的“通用知识”扰乱。实际工程中,常见做法是:

  • 冻结大部分预训练视觉–语言编码器;
  • 只训练少量适配层或策略头,或者采用参数高效微调(如 LoRA)。

在本书语境下,可以把早期融合看成**“极端端到端”**的 VLA 设计:从最原始的多模态输入开始,就只交给一个统一的 Transformer 去学。

8.4.1.2 晚期融合

定义: 晚期融合(late fusion)是指先让每个模态(甚至每个模态自己的决策网络)各自算完,再在输出层或决策层做组合(arXiv)。在 VLA 中常见几种形式:

  • 视觉–语言用一个现成的 VLM 做理解;
  • 动作策略用另一个网络,仅接收“任务 embedding”或“检索结果”;
  • 最终决策由一个小网络或手工规则,把“视觉–语言建议”和“低层控制建议”做加权或门控。

可以形式化为:

\[ \pi(a|o, x) = g\big(\pi_{\text{vision}}(o),\ \pi_{\text{language}}(x),\ \pi_{\text{state}}(s)\big) \]

其中 \(\displaystyle g\) 是一种融合函数,可以是简单加权平均,也可以是门控网络或 Mixture-of-Experts。

优点:

+模块化强,易维护。 视觉–语言理解模块、策略模块可以相对独立演化。比如更新 VLM 到更大的版本,不一定要重训整套策略。 +利用已有系统更方便。 工程中常见:保留已有的 SLAM、规划器或传统控制器,只用 VLA 模块提供“高层建议”,这本质上就是一种晚期融合。 +训练稳定性好。 各模态先在自己的任务上得到较稳定的表示(例如 VLM 保持冻结),最终只微调一个小的融合 / 决策头,出错范围相对可控。

缺点:

+跨模态细粒度交互能力弱。 如果视觉和语言各自“先压缩成一个向量”,再合并,模型很难在像素级精确理解“哪个杯子才是‘左边的红色杯子’”。 +容易产生“决策割裂”。 视觉模块说 A 更重要,语言模块说 B 更重要,若融合函数设计不当,整体行为可能不稳定。 +对 VLA 的统一性有限。 从理念上,晚期融合更接近“模块堆叠”,而不是一个真正统一的“视觉–语言–动作基础模型”。

晚期融合在机器人系统整合阶段非常常见,在第 10 章中讨论“VLA 与传统规划 / 控制模块”接口时,可以与这里形成呼应。

8.4.1.3 中间融合

定义: 中间融合(mid-level / intermediate fusion)介于二者之间:先为每种模态提取中层特征,再通过特征级别的交互模块(往往是 cross-attention 或特征拼接)进行融合(arXiv)。 典型做法是:

  1. 视觉 backbone(CNN/ViT)将图像映射为一组视觉 token;
  2. 语言编码器(LLM 或小型 Transformer)将指令映射为一组语言 token 或一个全局 embedding;
  3. 再用专门的多模态 Transformer / cross-attention 层,将二者、中加机器人状态 token 在中层融合,最后输出动作。

许多代表性的 VLM/VLA(如 Flamingo、PaLI-X 及在其基础上扩展的 RoboFlamingo、RT-2、OpenVLA 等)都属于此类结构:视觉、语言分别有自己的 encoder,然后在若干层 cross-attention 模块中交互(CVF开放获取)。

中间融合的特点:

+保留每个模态的“专业 backbone”。 可以直接复用 ImageNet / 自监督预训练视觉模型,和通用语言模型,不必从头端到端训练。 +融合层承担“任务对齐”的角色。 中间的 cross-attention / 特征拼接层负责把视觉、语言、动作历史等映射到对决策友好的公共空间。 +在表达能力与工程复杂度之间折中。 相比早期融合,序列长度与相互影响范围更可控;相比晚期融合,又能实现更细粒度的跨模态信息流动。

在实践中,多数 VLA 系统采用“中间融合 + 局部早期 / 晚期融合”的混合结构:例如在视觉内部多尺度早期融合不同传感器,在输出层再做一点晚期融合(如安全过滤),而核心策略部分仍然是中间融合。

【插图占位 8.4-2:典型 VLA 中间融合结构示意图。图像通过 ViT 得到 patch token,语言通过 Transformer 得到 token,状态 / 历史为若干额外 token,中间一个 Cross-Attention Transformer 将所有 token 交互,输出动作 token】


8.4.2 Cross-Attention 在 VLA 中的角色

在第 2 章我们已经介绍了自注意力(self-attention),Cross-Attention 可以看作“查询来自一方,键 / 值来自另一方”的注意力,是多模态模型最常用的“胶水”。当前大量 VLM / VLA 使用 cross-attention 将视觉、语言、动作串联起来(arXiv),例如 RT-2、VLA-Grasp 等都采用了基于 cross-attention 的多模态 Transformer(Embodied AI in Robotics)。

8.4.2.1 语言引导注意力

在 VLA 中,一个非常重要的模式是:“语言作为 Query,引导模型在视觉 / 状态空间中寻找与任务相关的部分。”

具体来说:

  • 语言编码器输出一组语言 token \(\{l_i\}\);

  • 视觉编码器输出一组图像 patch token \(\{v_j\}\);

  • 在 cross-attention 中,以语言 token 为 Query,视觉 token 为 Key/Value:

    \[ \text{Attn}(L,V) = \text{softmax}\big(\frac{Q_L K_V^\top}{\sqrt{d}}\big) V_V \]

    这样每个语言 token 会“指向”与其语义相关的图像区域。

直观理解:

  • “红色杯子”这个 token,会给那些呈现红色圆柱形物体的 patch 更高权重;
  • “在碗左边的”会让注意力分布偏向图像左侧相关区域;
  • 机器人状态 token(如末端位姿)也可以被语言 token 查询,用于回答“已经抓住了吗?”这类隐式问题。

RT-2 这类大规模 VLA 将视觉 token、语言 token 和离散动作 token 一起放在 Transformer 中,通过 cross-attention 让语言指令在视觉 patch 上选择与任务相关的区域,从而实现复杂的指令执行(Embodied AI in Robotics)。

【插图占位 8.4-3:Cross-Attention 可视化图。左边是图像上高亮的注意力热力图(红色杯子区域被高亮),右边是一句指令的词向量,箭头表示“红色杯子”“左边”等词 Query 到图像 patch 的注意力连接】

8.4.2.2 多模态交互

Cross-attention 不一定总是“语言查视觉”,在 VLA 中常见几种交互方向:

1.动作解码器 Query 视觉 + 语言。

  • 把“历史动作 token + 语言 token + 状态 token”输入一个解码器;
  • 解码器通过 cross-attention 查询视觉特征,得到用于下一步动作预测的上下文;
  • 这种模式类似机器翻译中的 Encoder–Decoder 架构,只不过这里的“源语言”是视觉 / 状态。 2.视觉 Query 语言(反向引导)。
  • 有时希望视觉特征根据语言“重构”或“筛选”自身,例如只保留与当前指令相关的物体特征;
  • 这可以通过视觉 token Query 语言 token,实现“从指令中抽取与当前 patch 相关的语义”。 3.三模态交互:视觉–语言–动作。
  • 部分 VLA(如 VLA-Grasp 等)显式为视觉、语言、候选动作建立多通道编码器,再用多层 cross-attention 互相查询,以捕获三者之间的内在联系(SpringerLink);
  • 例如针对不同候选抓取姿态,分别计算“该动作与当前视觉–语言任务的匹配程度”,从而选出更合理的动作。

从信息流角度看,cross-attention 提供了一个可控的“信息输送通道”

  • 谁是 Query,谁就有“提问权”;
  • 通过不同方向的 cross-attention,可以有选择地把信息从一个模态灌输到另一个模态。

8.4.2.3 实现细节

在工程上,Cross-Attention 在 VLA 中的落地细节主要体现在以下几个方面:

1.插入位置与层数设计。

  • 常见做法是在 Transformer block 中,将自注意力扩展为两段: 1)对解码器内部 token 做 self-attention; 2)再对编码器输出(视觉 / 语言)做 cross-attention;
  • 对于“统一 Transformer”架构,也可以在部分层中专门使用 cross-attention,在其他层继续使用 self-attention,从而控制不同层的模态交互强度(arXiv)。 2.模态类型编码(type embedding)。
  • 为视觉 token、语言 token、状态 / 动作 token 添加不同的“模态 ID embedding”,帮助网络区分信息来源;
  • 在 cross-attention 中往往保留这些模态 embedding,使网络学习到“对不同模态应该采用不同的查询策略”。 3.尺度与下采样。
  • 如果直接用全部视觉 patch 做 Key/Value,成本过高,因此多数系统会在视觉侧做下采样或压缩,例如:
    • 使用 [CLS] 或若干 pooled token;
    • 使用稀疏注意力,只保留最有信息的 patch;
    • 采用 FPN/多尺度金字塔,只在部分尺度上做 cross-attention。 4.参数与训练策略。
  • 实践中,往往会冻结视觉–语言 backbone,只训练 cross-attention 和策略头,以保护预训练知识,一些“知识隔离(knowledge insulating)”的工作更系统地研究了这一点(physicalintelligence.company);
  • 对 cross-attention 层使用比 backbone 更小的学习率,或采用分层学习率,减少训练初期的“剧烈破坏”。 5.复杂度与实时性权衡。
  • Cross-attention 的复杂度是 \(O(T_Q \cdot T_K)\)。在机器人应用中,往往控制 Query 长度(例如只用少数动作 token 作为 Query),并压缩 Key/Value,确保在目标控制频率下可以实时运行。

这些实现细节与第 10 章中“在线推理与部署”的实时性要求有关,设计 cross-attention 时需要兼顾表达能力与计算开销。


8.4.3 使用语言作为条件(instruction-conditioning)

前面第 4.4 节讨论了“语言作为任务描述、约束和解释”的角色,本节进一步聚焦在**“如何把语言指令形式化为 VLA 模型的条件”**上——也就是所谓的 instruction-conditioned policy。 许多研究已经证明,将机器人策略显式地条件化在自然语言指令上,可以得到可泛化、可重用的控制策略(NeurIPS 会议论文集)。

8.4.3.1 条件编码

第一步是把自然语言指令 \(\displaystyle x\) 编码为模型可用的“条件表示”。典型做法包括:

1.全局指令向量(sentence embedding)。

  • 使用语言编码器(如 BERT、轻量 Transformer 或大型 LLM 的编码部分)对整句指令编码,得到一个向量 \(c \in \mathbb{R}^d\);

  • 这个向量可以看作“任务 ID 的连续版本”,比手工 one-hot 任务标签表达更丰富的语义(NeurIPS 会议论文集)。 2.指令 token 序列。

  • 直接保留子词级 token 序列 \(\{l_i\}\),供 Transformer 进一步处理;

  • 与视觉 token、动作 token 串联或通过 cross-attention 交互,可以实现更精细的对齐(如“最大杯子”“最右边的物体”)。 3.前缀 / 提示(prompt)形式。

  • 在统一 Transformer 中,可以将语言 token 放在序列开头,作为“prompt”;

  • 后续的视觉 / 动作 token 在自注意力中,可以随时读取这个 prompt 的信息。 4.特征调制(Feature-wise conditioning)。

  • 使用类似 FiLM(Feature-wise Linear Modulation)的方式:

    \[ h' = \gamma(c) \odot h + \beta(c) \]

    其中 \(h\) 是视觉或状态特征,\(\gamma(c),\beta(c)\) 由指令向量生成,用于对特征进行按通道缩放和偏移;

  • 直观理解为“指令决定网络的工作模式”,例如“收拾桌面”模式、“分类整理”模式等(clip-rt.github.io)。

无论采用哪种方式,目标都是构造一个**“语义条件”**,能够在不同任务之间平滑插值:

  • “把红杯子放进盒子”和“把蓝杯子放进盒子”对应的条件向量应该“相近”;
  • “打开抽屉”和“关上抽屉”既有相似部分(对象是抽屉),又在动作方向上有明显差异。

8.4.3.2 控制方法

有了“条件编码”之后,下一步是让语言条件真正影响策略。这里可以理解为“如何在网络内部给语言一个有效的控制通道”:

1.输入级控制:拼接 / 加和。

  • 最简单的方式是把指令向量 \(\displaystyle c\) 与其他模态特征直接拼接,或在输入层相加:

    \[ z_0 = [c,\ v,\ s,\ \text{history}] \]

  • 或者对每个视觉 / 状态 token 都加上同一个条件向量(广播),使整个网络在“有条件”的空间中工作。 2.门控与加权(gating)。

  • 使用语言条件输出门控系数,控制不同子策略或专家网络的权重:

    \[ \pi(a|o,x) = \sum_k \alpha_k(x)\pi_k(a|o) \]

  • 在多任务、多 robot 的 VLA 中,常见“语言 + robot ID”双门控的 Mixture-of-Experts 结构,用以在联邦场景下共享部分参数,同时根据指令和平台自动选择专家(CVF开放获取)。 3.Cross-Attention 级控制。

  • 如前节所述,让动作解码器在 cross-attention 中以“语言 + 历史动作 token”为 Query,对视觉特征进行选择性检索;

  • 指令的不同部分会导致注意力模式变化,从而显式地改变策略关注的视觉区域。 4.层级控制(高层语言 + 低层动作)。

  • 一些工作将语言用于高层策略:先由语言模型或语言条件策略输出一个子任务序列或“skill ID”,再由每个 skill 对应的低层策略负责具体控制;

  • 这种“语言 → 动作原语”层级结构,会在第 6.3 和第 11 章“动作原语与层级策略”部分进一步展开。

从控制角度看,instruction-conditioning 实际是在做一种“条件化策略 \(\pi(a|s,x)\)”,其中 \(x\) 不再是一个离散任务索引,而是一个包含丰富语义的自然语言向量。

8.4.3.3 多任务场景

在多任务、多环境的 VLA 系统中,语言条件发挥的作用尤为关键(hulc.cs.uni-freiburg.de):

1.用语言统一表示任务。

  • 传统多任务 RL 或 IL 往往为每个任务分配一个整数 ID 或 one-hot 编码;
  • 语言条件则将任务描述提升为自然语言空间,例如:
    • “把桌面上的所有杯子收集到托盘中”;
    • “只整理蓝色的物体”;
  • 这样模型在训练时就学习到“不同任务之间的相似性”,而不是完全独立的标签。 2.长尾任务和零样本任务。
  • 对于训练数据中只出现少数样本的长尾任务,通过共享语言空间,模型可以从其他相似指令中迁移知识;
  • 在极端情况下,即使从未见过某个具体指令,只要其语义可以用已知词汇组合表达,模型也可能进行零样本推理和执行(zero-shot instruction following)。 3.多机器人、多环境共享策略。
  • 在 Open X-Embodiment 这类跨机器人多任务数据集上,语言指令不仅描述任务,还往往隐含环境信息(“厨房中把盘子放到架子上” vs “实验台上整理试管”);
  • 结合第 8.5.2 节的“多机器人共享策略”,语言条件可以与“embodiment encoding(机器人 ID / 描述)”组合,形成在不同机器人、不同场景下的统一策略表示。 4.与反馈 / 偏好学习结合。
  • 在 RLHF 或人类偏好标注场景中,语言不仅作为任务输入,还可以作为反馈通道(例如人类用语言指出“不够小心”“动作太快”)(MDPI);
  • VLA 模型可以同时条件化在“任务指令 + 风格 / 安全偏好”,实现更细致的人机协同。

【插图占位 8.4-4:二维 embedding 可视化图,展示不同语言指令在条件空间中的分布,同一类任务(如收拾桌面)聚成簇,不同任务簇之间有一定距离】


8.4.4 历史动作 / 状态作为上下文的编码方式

现实机器人任务往往是部分可观测的长时序过程

  • 单帧图像看不出“这个抽屉是被我刚刚打开过,还是原来就开着”;
  • 单次力觉读数也难判断“这是刚接触到物体,还是已经推了很久”。

因此,VLA 模型通常需要将历史观察与历史动作纳入上下文,学习策略 \(\pi(a_t | o_{\le t}, a_{< t}, x)\)。近年来大量基于 Transformer / SSM 的机器人策略都探索了如何编码历史序列(NeurIPS 会议论文)。

8.4.4.1 序列串联

最直接的方式,就是把过去若干步的观察–动作对直接作为更长的输入序列,交给 Transformer 处理:

\[ \underbrace{[x]}_{\text{指令}} ,\; \underbrace{[o_{t-K}, a_{t-K}, \dots, o_{t-1}, a_{t-1}, o_t]}_{\text{历史 + 当前}} \rightarrow \text{Transformer} \rightarrow a_t \]

实现上的常见选择:

  • 每个时刻 \(t'\) 的观察 \(o_{t'}\)(图像 + 状态)编码为若干 token;
  • 动作 \(a_{t'}\)(离散或离散化后的关节命令)编码为一个或多个 action token;
  • 然后将这些 token 按时间顺序串联,送入 Transformer 解码器或统一 Transformer。

相关工作表明,这种“简单串联 + 位置编码”的方式,在多任务策略学习中相当有效,如 BAKU 等工作会把一段观察历史一起输入 Transformer,用以预测下一步动作(NeurIPS 会议论文)。

优点:

  • 架构非常统一,与第 2 章中的序列建模完全一致;
  • 不需要 hand-crafted 特征,只要定义好每个时刻的编码方式即可;
  • 对于中等长度任务(几十步到上百步)已经足够。

缺点:

  • 序列长度随历史窗口线性增长,很快达到上百甚至上千 token,计算和显存压力激增;
  • 长期依赖依然难以完全捕获,模型可能只利用最近几步信息。

在工程实践中,序列串联通常与“滑动窗口”和“时间编码”结合使用(见本节后两小节)。

【插图占位 8.4-5:时间轴示意图,将过去 K 步的图像+动作拼成 token 序列输入 Transformer,箭头指向当前时刻动作输出】

8.4.4.2 时间编码

为了让模型区分“哪一步更早、哪一步更近”,必须显式或隐式地引入时间信息。在第 2.4.3 节介绍位置编码时我们已经看到,位置编码本质上就是一种时间标记,这里在 VLA 语境下强调几个实践要点:

1.绝对时间步编码。

  • 为每个 token 加上一个表示其时间步的 embedding(如 sinusoidal 或可学习位置编码):

    \[ h_{t'}^{(0)} = \text{Embed}(o_{t'}) + p(t') \]

  • 这样模型可以“知道”哪些是最近的观察、哪些是更久之前的观察。 2.相对时间 / 时间间隔编码。

  • 有些任务中,动作间的时间间隔并不一致,需要编码“delta time”;

  • 可以为每个时刻增加一个额外的“时间间隔 token”或把时间差作为数值特征拼接。 3.token 类型编码。

  • 除了时间,还需要区分“语言 token / 视觉 token / 动作 token / 历史摘要 token”等,常用type embedding来实现;

  • 在一些 history-aware 的策略中,会为“历史 token”和“当前 token”使用不同的类型 embedding,帮助网络在注意力中重点关注最近几步(arXiv)。 4.压缩历史的时间编码。

  • 对于非常长的轨迹,不可能保留全部细节,部分工作会先将历史通过对象跟踪、点轨迹(point tracking)等方式压缩成少量“历史 token”,再给这些 token 添加时间或顺序编码(arXiv);

  • 这可以理解为“对时间维做一次降维”,详见第 12 章世界模型与记忆部分的讨论。

在设计时间编码时,应与动作离散化、控制频率相协调:例如控制频率较高时,更需要精细的时间表示;频率较低时,则可以把若干步合并视为一个“宏步长”。

8.4.4.3 滑动窗口与记忆

单纯增加历史步数会迅速推高复杂度,因此实践中常结合滑动窗口(sliding window)记忆(memory)机制,在“保留必要历史信息”和“控制计算成本”之间做折中(arXiv)。

1.滑动窗口:只看最近 \(\displaystyle K\) 步。

  • 设定一个窗口长度 \(\displaystyle K\),模型每一步只接收最近 \(\displaystyle K\) 步的观察–动作历史,其余更久的历史被丢弃;

  • 对于很多桌面操作、短程导航任务,几步到几十步的窗口就足够;

  • 优点是实现简单,与序列串联方式直接兼容;缺点是无法捕获“极长时间跨度”的依赖(如几分钟之前做过的准备工作)。 2.显式记忆单元:压缩历史。

  • 为模型引入一个“记忆向量”或“记忆 token”,在每个时间步根据当前观察 / 动作和之前记忆更新:

    \[ m_t = f(m_{t-1}, o_t, a_{t-1}) \]

  • 一些工作采用 RNN、LSTM、Transformer-XL 样式的记忆;更多近期方法使用状态空间模型(SSM)或 Mamba这类结构,将整条历史轨迹编码为一个压缩隐状态,用于条件化当前动作预测(arXiv);

  • 这样可以在计算复杂度可控的前提下利用更长的历史。 3.分层记忆:短期窗口 + 长期记忆。

  • 短期内使用滑动窗口(例如最近 10 步)保留细节;

  • 长期则通过记忆模块存储更加抽象的信息,如“抽屉已经打开”“那只杯子已经被放进盒子里”等;

  • 在世界模型或长序列 VLA 中,这种“局部细节 + 全局摘要”的模式越来越普遍,也是未来统一具身基础模型的重要方向之一。 4.历史与指令的联合建模。

  • 在指令导向的历史感知策略中,还会将语言指令和历史一起写入记忆,形成“instruction-oriented memory”,例如 History-aware multimodal instruction-oriented policies 这类工作(MDPI);

  • 这使得模型可以理解“我之前执行的是哪个子指令、现在到了哪一步”,为长任务分解和进度跟踪提供基础。

【插图占位 8.4-6:一张时间轴+滑动窗口+记忆示意图。时间轴上标出一长串时刻,窗口覆盖最近 K 步,窗口前的历史被压缩为一个“Memory token”,在当前决策时既读窗口内 token,也读 Memory token】


本节从融合时机(早/中/晚)cross-attention 的具体角色语言条件化策略历史序列编码四个维度,补足了 VLA 在“多模态融合与条件建模”层面的核心设计要素。后续 8.5 节会以完整架构为例,把这些组件组合起来,形成贯通视觉–语言–动作的统一 Transformer 视角,与第 9 章的训练范式共同构成一个从“架构设计”到“数据与优化”的完整闭环。

本章小结与自测

三行小结

  1. 本章是 VLA 架构设计核心:输入、融合、动作解码。
  2. 重点在多模态对齐与条件策略建模。
  3. 学完后应能比较不同 VLA 架构的设计权衡。

检查题

  1. 用你自己的话总结本章最核心的一个公式/机制。
  2. 给出一个“如果要落地到项目里,你会怎么用”的具体例子。

常见误区

  1. 盲目堆模型参数。
  2. 忽略动作空间定义与约束。
  3. 多模态融合后不做可解释性检查。

公式到代码(最小示例)

# 多模态特征拼接最小示例
vision = [0.1, 0.2, 0.3]
language = [0.5, -0.1]
state = [0.0, 1.0]
fusion = vision + language + state
print(fusion)

本章外部参考(集中)

  1. arXiv
  2. OpenReview
  3. CVF开放获取
  4. arXiv
  5. Embodied AI in Robotics
  6. SpringerLink
  7. physicalintelligence.company
  8. NeurIPS 会议论文集
  9. clip-rt.github.io
  10. hulc.cs.uni-freiburg.de
  11. MDPI
  12. NeurIPS 会议论文
  13. 本章其余链接可在正文中按上下文继续查阅。

8.5 典型 VLA 架构案例分析(理论层)

8.5.1 “视觉–语言–动作”统一 Transformer 架构抽象

学习导航

  • 本章主题:8.5.1 “视觉–语言–动作”统一 Transformer 架构抽象
  • 前置知识:建议先完成第 3-7 章对应先修内容。
  • 建议用时:70-90 分钟
  • 阅读顺序:先看概念框架,再看公式/代码,最后做自测。

在前面的章节里,我们已经分别从“视觉–语言多模态”“动作解码”与“条件建模”的角度拆开讨论了 VLA 的各个部件。本小节尝试把这些内容重新“合体”,抽象出一类越来越主流的统一 Transformer 架构——把视觉、语言、动作、状态统统看成一个长序列,交给单个 Transformer做统一建模。

代表性的工作包括 RT-2、PaLM-E、RT-X / Open X-Embodiment、OpenVLA 等,它们都在不同程度上体现了这种“所有东西都是 token”的思路。(arXiv)

【图 8-5-1 占位】 统一 Transformer 架构示意图:语言 token、视觉 patch token、机器人状态 token、历史动作 token 被串成一条长序列,输入同一个 Transformer;输出为下一步动作 token。


8.5.1.1 序列建模扩展

基本想法:把机器人问题改写成“下一个 token 预测”问题。

在经典自回归语言模型中,输入是一串文本 token,模型学习“给定前面所有 token,预测下一个 token”。统一 VLA 的思路是:

  • 先把视觉帧拆成 patch,再嵌入成一串视觉 token;
  • 语言指令分词,得到一串文本 token;
  • 机器人状态(关节角、末端位姿、夹爪开合、是否抓到物体等)编码成若干状态 token;
  • 历史动作离散化或量化成动作 token;
  • 最后把它们按某种规则串联成一条长序列,交给 Transformer 处理,预测“下一步动作 token”。

典型的实现方式是构造一条“多模态句子”,例如(只示意结构):

[LANG …] [IMG …] [STATE …] [ACT_t-1 …] → [ACT_t …]

其中语言指令通常是固定前缀(例如一开始给出“把红色杯子放到盘子里”),视觉 token 和状态 token 随时间更新,动作 token 被自回归地逐步生成。RT-2 就是将机器人的连续动作编码成“伪文本 token”,和自然语言答案一起作为统一的输出空间,在同一个序列上做下一个 token 预测。(arXiv)

PaLM-E 更进一步直接把图像特征、机器人状态向量嵌入到语言模型的 token 序列里,形成“多模态句子”,由一个巨大的 LLM 主干统一处理。(arXiv)

在实践中,序列通常还会带有以下辅助信息:

+模态嵌入(modality embedding):指示当前 token 属于视觉、语言、动作还是状态; +时间步嵌入(timestep / position embedding):编码“这是第几步控制”“这是最近 N 帧中的第几帧”; +机器人/任务嵌入(embodiment / task embedding):在多机器人、多任务场景下加入全局条件,这部分在 8.5.2 详细展开。

序列组织方式的变体。

统一序列并不意味着只有一种排法,常见有两类:

1.按时间展开

\[ \underbrace{[\text{LANG}, \text{IMG}_t, \text{STATE}_t, \text{ACT}_{t-1}]}_{\text{第 }t\text{ 步}} \quad \underbrace{[\text{IMG}_{t+1}, \text{STATE}_{t+1}, \text{ACT}_{t}]}_{\text{第 }t+1\text{ 步}} \quad \dots \]

每个时间步是一个“小句子”,所有时间步再串联。这样强调时序结构,类似“视频 + 控制命令”的联合建模。 2.按模态分块[LANG 全部] + [若干帧 IMG] + [若干 STATE] + [若干 ACT]。 这种更接近 RT-1/RT-2 的做法:指令常常一次性给出,视觉帧也可以只取最近几张,动作 token 在尾部自回归生成。(谷歌研究)

注意还需要在注意力掩码上做区分:

+语言与视觉 token通常允许双向注意力(类似 Encoder),便于充分融合视觉–语言信息; +动作 token常使用因果掩码,不能看到未来的动作,以满足“预测下一步动作”的因果性要求。


8.5.1.2 单 Transformer 优势

用单个 Transformer 承担“感知–语言–决策”三件事,乍看有些暴力,但在实际系统里已经被证明非常有吸引力。

1.统一表示空间,天然跨模态对齐。 当视觉、语言、动作 token 一起在同一堆 self-attention 层里反复交互时,模型自然会学到“哪些图像区域与哪些文字、哪些动作有关”。RT-2 的结果表明,经过互联网视觉–语言数据与机器人轨迹的联合训练后,模型能把 web 上学到的语义知识迁移到现实机器人动作中,在未见场景上的成功率由 RT-1 的 32% 提升到 62%。(Google DeepMind) 2.共享一个大模型,跨任务和多模态正迁移。 PaLM-E 显示,随着参数规模从几十亿扩展到 562B,同一个模型在视觉问答、文本任务和机器人任务上的表现同时提升,而且不同任务之间存在明显的正迁移——更多的互联网多模态数据可以帮助机器人任务,机器人数据反过来也不会破坏语言能力。(arXiv) 这一点对“从网络知识走向具身智能”非常关键。 3.工程上结构简单、接口干净。 统一 Transformer 的架构非常接近“LLM + 视觉前端 + 动作头”的模板,如 OpenVLA 在一个 7B 级别的开源 VLM 主干上仅增加了少量输入适配层和动作解码头,就实现了多机器人、多任务的控制能力。(arXiv) 这意味着:

  • 可以直接复用主流 LLM/VLM 的工程基础(分布式训练、推理框架等);
  • 模型升级(比如换一个更强的 LLM 主干)时,只需相对局部的改动。 4.训练范式统一,易于“混合数据”。 把一切都当 token 后,网络训练目标本质上就是“预测下一个 token 或填补被 mask 的 token”,和语言模型完全一致。RT-2 就是在 VLM 的 web 预训练任务(描述图像、问答)上插入机器人轨迹数据,以几乎相同的损失函数联合训练,从而复用成熟的 LM 训练流水线。(arXiv) 5.为后续扩展留出空间。 一旦序列接口确定,未来加入新的模态(深度图、触觉、力传感器)、新的控制信号,只需要定义新的 token 类型和嵌入方式,而不用重新发明整套网络结构。这与第 12 章讨论的“统一感知–语言–动作–记忆大模型”是完全一致的设计哲学。(VLA Models Survey)

8.5.1.3 挑战

统一 Transformer 非常“优雅”,但现实里要在机器人上真正跑起来,还会遇到不少硬骨头。

1.序列过长带来的计算瓶颈。 自注意力复杂度是 \(O(N^2)\)。视觉 patch(几十到几百个)、语言 token(几十个)、状态和动作 token,再乘上时间维度,很容易就堆出几百乃至上千长度的序列。 对于需要 10–30 Hz 实时控制的机器人,这会迅速压垮显存和算力。最近的 VLA 综述也把“计算约束”列为走向真实部署的一大障碍。(arXiv) 实际系统中常用的折中包括:

  • 只保留最近 1–2 帧图像,远历史用压缩状态代替;
  • 降采样视觉 token(更粗的 patch、更小的分辨率);
  • 使用稀疏注意力或分块注意力,只在局部时间窗口做完全注意力。 2.模态频率与时间尺度不匹配。
  • 视觉:通常 5–15 Hz,信息密度高但刷新慢;
  • 状态与动作:可以高达 50–1000 Hz;
  • 语言指令:大多是“低频、几乎静态”的条件。 如果一股脑儿全塞进同一序列,要么动作过度压缩(影响控制精度),要么视觉/语言 token 被大量重复(增加冗余计算)。 工程中常见的做法是:
  • 在统一 Transformer 前加一个**“低频感知、高频控制”分层**:高频控制层只看最近一次感知和短历史动作;
  • 或者在统一序列内部,引入只更新子序列的机制(例如每 K 帧插入一次视觉 token,其余时间只滚动动作和状态)。 3.从“相关”到“因果”的困难。 统一 Transformer 通常使用自监督或模仿学习目标(BC),擅长捕捉“统计相关性”:某种图像+语言组合对应某种动作序列。但在长时间任务中,需要模型理解动作对未来结果的因果影响,这在纯“下一个 token 预测”框架中并不直接体现。 因此,很多工作把统一 Transformer 视作强表示 + 先验,再在其上做 RL 微调或规划(详见第 9 章),以弥补长期 credit assignment 的不足。(VLA Models Survey) 4.数据分布与模态对齐问题。 互联网数据中的图像与文本,和机器人场景下的相机画面、操作轨迹分布完全不同:
  • web 图像多为拍照、插图;机器人视角则是“俯视桌面”“贴近物体”;
  • 自然语言描述关注“是什么”“好不好看”,而机器人指令要求“怎么做”“具体动哪”。 RT-2 通过共同微调(co-fine-tuning),在训练时同时保留部分 web 视觉–语言任务与机器人数据,以减少灾难性遗忘和分布错位;但要做到完美对齐仍是开放问题。(arXiv) 5.安全与可控性。 把动作 token 当作“语言的一部分”虽然统一了接口,也把语言模型那种“有时很会瞎编”的特性原封不动带到机器人控制中:
  • 在“开放式指令”下模型可能产生意料之外的动作序列;
  • 统一 Transformer 很难自带强约束(如速度上限、禁入区域等)。 因此,在实际系统部署时,通常会在统一 Transformer 外再包一层动作约束与安全检查(第 10.3 节),在解码时限制动作范围或直接过滤掉危险动作,仅让统一 Transformer 在安全的“可行域”内发挥聪明才智。(arXiv)

8.5.2 单模型多机器人、多任务共享的设计原则

统一 Transformer 只是“脑袋长成什么样”的问题。如果我们希望**“一个脑袋带 N 个身体”**——同一模型可以控制多种机器人、执行成百上千种任务,那就必须进一步考虑:输入输出如何“对齐”、参数如何共享、怎样避免互相干扰。

近期的 Open X-Embodiment / RT-X、OpenVLA 等工作,已经在22 种机器人、百万量级轨迹上验证了多机器人统一策略的可行性,并给出了相对成熟的“多机器人工程模式”。(arXiv)

【图 8-5-2 占位】 多机器人共享 VLA:左侧是不同形态的机器人(多关节机械臂、双臂、移动底盘+机械臂等),通过“输入适配器”映射到统一 token 序列;右侧是共享的 Transformer 主干和若干“输出适配器”,分别产生各机器人可执行的动作。


8.5.2.1 输入适配

多机器人输入的关键,是把“千奇百怪的传感器和坐标系”映射到统一、规范化的表示中,同时显式告诉模型“我现在是哪个机器人”。

1.统一视觉与状态坐标系。 虽然每个机器人相机的安装位置、视场角、分辨率各不相同,但我们可以在预处理时强制统一到某种规范:

  • 统一图像尺寸和颜色空间(如全部缩放到 256×256、RGB);
  • 尽量使用相似的视角配置(例如“手眼相机俯视桌面”);
  • 把关节角、末端位姿、夹爪状态等归一化到统一量纲(例如 \([-1,1]\))。 Open X-Embodiment 在整合 22 种机器人数据时,把观测统一为“相机图像 + 7-DoF 末端状态 + 夹爪开合”等少数字段,作为所有模型的公共输入界面。(arXiv) 2.Embodiment 编码(机器人身份与形态嵌入)。 模型必须知道“我现在是那只机器人”,否则统一表示会混淆不同机械结构。常见做法包括:
  • 为每个机器人分配一个离散的 ID token,类似语言模型里的 [ROBOTA][ROBOTB],学习一个对应的 embedding;
  • 使用更细致的形态描述向量,编码关节数、关节类型(旋转/移动)、连杆长度等,甚至直接从 URDF 中提取。 PaLM-E 实验表明,在同一模型中同时训练多种 embodiment 时,适当的形态/模态嵌入有助于实现正迁移,而不是互相拖累。(arXiv) 3.任务与场景条件嵌入。 多任务场景下,还需要通过语言+任务 ID 来告诉模型“现在该做什么”:
  • 主通道使用自然语言指令(例如“把蓝色杯子放在盘子里”);
  • 也可以附加一个任务类别 token(例如来自 Open X-Embodiment 中 527 种 skill 的 ID),帮助模型在长尾任务上稳定收敛。(arXiv) 4.输入适配器(input adapters)。 在工程实现上,经常会在统一 Transformer 之前加一层轻量的输入适配模块:
  • 对不同分辨率的相机使用独立的 CNN/ViT backbone,然后都投影到统一维度;
  • 对不同类型的状态向量(仅机械臂 / 机械臂+底盘)使用不同 MLP,再concat 到统一长度。 这些适配器可以视作“硬件驱动层”,而后面的 Transformer 主干则是“共享算法层”。

8.5.2.2 输出适配

输入统一之后,还需要解决更棘手的一个问题:不同机器人动作空间完全不同。有的 7 自由度机械臂,有的多加一个滑轨,有的带移动底盘,还有夹爪、吸盘、双臂等各种组合。

1.优先统一到“任务空间动作”。 当前多机器人工作中比较成功的一条路线,是把动作统一定义为末端位姿或其增量(Delta pose)+ 夹爪开合

  • 模型输出一个规范化的 \(\Delta x, \Delta y, \Delta z, \Delta \text{roll/pitch/yaw}, \Delta g\) 向量或对应 token;

  • 每个机器人本地再用 IK 或已有控制器把这个末端增量转换成实际关节命令。 Open X-Embodiment 的 RT-X 系列就采用了类似思路,将不同机器人动作粗略对齐为“7-DoF + 夹爪”格式,再训练统一策略。(Google DeepMind) 2.共享动作头 + 机器人特定投影。 更一般的结构是:

  • Transformer 主干输出一个**共享动作向量 \(a_\text{shared}\)**或一串动作 token;

  • 对每个机器人 \(\displaystyle r\) 配一个小型的输出适配器 \(g_r\)(通常是 1–2 层 MLP),将 \(a_\text{shared}\) 转换为该机器人的实际命令:

    \[ u_r = g_r(a_\text{shared}), \]

    其中 \(u_r\) 可以是关节速度、关节位置、底盘速度等。 如此一来,大部分决策能力都在共享主干中,输出适配器仅负责“单位换算 + 形态映射”,既保留可移植性,又允许适配差异较大的平台。 3.离散化动作空间下的适配。 若采用 RT-1、RT-2 类“离散动作 token”设计,输出适配问题会有不同表现:(谷歌研究)

  • 可以为不同机器人定义一套统一的 token vocabulary,例如每个 token 对应“末端沿 X 轴 +1cm”“夹爪闭合 10%”等;

  • 或者为每个机器人单独定义 token 集合,但将它们嵌入到统一的动作 embedding 空间(共享 embedding 矩阵 + 部分专用行),用机器人 ID 来选择子集。 RT-2 把动作表示为文本样式的 token,是一种更极端的形式:输出空间事实上就是自然语言词表的子集;真正的低层控制由外部解析器负责解释这些 token 并转换为关节命令。(arXiv) 4.安全范围与单位归一化。 无论采用哪种表示,都应当在输出适配层中处理:

  • 单位换算(如归一化到 \([-1,1]\) 再按各机器人上限缩放);

  • 限幅与裁剪(保证速度、加速度、力矩在允许范围内);

  • 特定自由度屏蔽(例如对不带底盘的机器人,将底盘相关维度强制为 0)。 这部分内容在第 10 章关于安全与系统部署中会再详细展开,这里只提醒读者:输出适配既是形态问题,也是安全问题。


8.5.2.3 参数共享与分支

实现多机器人、多任务的单模型共享时,一大难题是:

  • 共享太多:容易互相干扰,导致“谁都学不好”;
  • 分得太开:又失去了跨任务、跨平台正迁移的好处。

现有工作逐渐形成了一些实践经验。

1.“大共享,小特化”的基本格局。 多数成功的 VLA 系统采用类似模式: +完全共享视觉 backbone、语言 backbone 和大部分 Transformer 层;

  • 只在靠近输入/输出的少数层中加入机器人或任务特定分支。 例如 OpenVLA 使用一个 7B 的统一 VLA 模型,在多机器人数据上预训练后,通过LoRA / Adapter 等参数高效微调方法为新机器人或新任务添加极少量额外参数,就能快速适配而不破坏已有能力。(arXiv) 2.多机器人共享的经验:RT-X 与 Open X-Embodiment。 RT-X 在 Open X-Embodiment 数据集上训练统一模型,实验表明:
  • 统一模型在多种机器人上的平均表现优于分别为每个机器人训练单独模型;
  • 特别是在数据较少的机器人上,能从其他机器人数据中获得显著增益。(arXiv) 这说明适当共享确实能带来“数据放大效应”,是构建通用机器人大脑的关键。 3.MoE / gating 与任务分支。 为了进一步减轻“互相拖累”的问题,可以考虑在统一 Transformer 中加入**专家混合(Mixture-of-Experts)**或软门控结构:
  • 为不同机器人、任务准备若干组专家 FFN / 注意力子层;
  • 根据机器人 ID、任务嵌入或当前观察自动选择或加权这些专家;
  • 这样既保持参数共享,又允许模型在不同场景下使用不同子网络。 这类结构目前在大语言模型中已经被广泛使用,在 VLA 领域也逐渐开始探索(可参考第 12 章对“更通用具身基础模型”的讨论)。(arXiv) 4.训练策略:采样均衡与防止灾难性遗忘。 多机器人、多任务训练容易出现“大数据任务压死小数据任务”的现象。实践中常用手段有: +分任务/分机器人均衡采样:保证每个 batch 中各机器人数据比例相对均衡;
  • 对长尾任务或少样本机器人给予更高 loss 权重;
  • 逐步解冻策略:先在大数据机器人上预训练主干,再逐步加入其他机器人数据和适配参数,避免一开始就“乱拉扯”。 OpenVLA 和后续基于它的实验都报告,合理的采样与微调策略可以显著提升在长尾任务和新机器人上的表现。(Medium)

总的来说,多机器人共享的设计哲学可以概括为:用尽可能统一的输入/输出接口和大规模共享主干,叠加尽可能小的特化分支。这与后续第 10 章中讨论的“云端大模型 + 端侧小适配”的系统架构,也是高度一致的。


8.5.3 模型尺度(参数量)与性能 / 部署成本权衡

统一 Transformer + 多机器人共享听上去很美,但实现“从 zero 到 hero”的另一块硬约束,就是模型规模

  • 做得太小,学不会复杂语义和泛化能力;
  • 做得太大,机器人本体根本带不动,或者控制频率降到不能用。

这一节不追求给出具体“最佳参数量”的数字,而是希望帮助读者形成一套思考模型规模的框架

+**性能潜力:**大模型究竟在 VLA 里带来了什么? +**成本约束:**训练与推理各花在哪里? +**实践决策:**面对真实硬件和任务,我们如何选一个“够用而不过度”的规模。


8.5.3.1 大模型性能潜力

大模型的优势,在 VLA 场景中已经通过多个代表性工作得到实证。

1.更强的语言与视觉理解能力。 PaLM-E 把一个数百亿甚至 562B 参数的 LLM 与视觉、机器人模态结合,结果显示:

  • 在视觉问答基准(OK-VQA、VQAv2)上达到或超过专门微调模型的水平;
  • 在机器人任务上,比仅在单一任务上训练的小模型表现更优;
  • 随着参数规模增大,语言能力几乎不被破坏,甚至还能继续提升。(arXiv) 这说明,“大脑更大”并不一定会被“机器人任务”拖累,相反多任务联合训练可以利用规模优势。 2.更强的零样本 / 组合泛化。 RT-1、RT-2 等工作一再强调:当模型容量足够大、训练数据足够多时,机器人策略在未见任务和未见物体上的成功率显著提高:

这类“模糊指令 + 复杂语义”的能力,很难用小规模、专用型模型手工编码出来。

  • RT-1 在未见指令上的成功率可达到 76%,比下一最佳基线高出 24 个百分点;(arXiv)
  • RT-2 在 unseen 场景上的成功率从 RT-1 的 32% 提升到 62%,大量例子表明模型能理解“最小的”“离 X 最近的”“可以当锤子用的东西”等抽象语义并正确选择物体。(Google DeepMind)

3.更强的多机器人、多任务正迁移能力。 Open X-Embodiment / RT-X 表明,在 22 种机器人、百万轨迹上训练的统一模型,相比单机器人模型不仅没有退步,反而在平均性能上提升,并显著提高数据稀缺机器人上的表现。(arXiv) OpenVLA 进一步展示,单个 7B 级 VLA 模型在多个机器人、多个场景上的成功率可以超过一些 50B+ 封闭模型和 diffusion policy 方法。(arXiv)

从理论与经验上看,在数据足够丰富、训练做得好的前提下,增加参数量确实能换来更强的泛化与综合能力。但问题在于:机器人不是搜索引擎或聊天系统,它对实时性与能耗的约束远严苛得多。


8.5.3.2 训练推理成本

要把一个 VLA 模型从“纸上谈兵”训练到能在真实机器人上跑,需要分别面对训练成本推理成本两座大山。

1.训练成本:算力、数据与工程复杂度。

工程上,这意味着:

对研究生或小团队而言,通常需要借助已经预训练好的大模型(如开源的 OpenVLA-7B)来降低前期成本。(arXiv)

+预训练阶段通常在大规模图文数据(CLIP 风格)与纯文本(LLM)上进行,这部分已经是工业级别的算力消耗;(arXiv) +机器人阶段往往需要在百万级轨迹、上万小时的机器人交互记录上进行微调或共同训练,例如 Open X-Embodiment 的 100 万+ 真实轨迹、RT-1 的 13 万集真实操作等。(arXiv)

  • 必须使用分布式训练、混合精度(FP16/BF16)、流水线并行等技术;
  • 数据管线须支持从多源数据集中高吞吐读取、在线随机化与过滤;
  • 只为训练这样一个模型就可能需要数十到上百张 GPU/TPU,持续数天甚至数周。

2.**推理成本:时延、频率与硬件约束。**机器人控制对推理有几个硬约束:

现实里,一台带中高端 GPU 的桌面工作站可以勉强实时运行 1–7B 级别的 VLA 模型(视输入长度而定);几十亿以上的模型很难在本地高频控制(RT-2 这类通常采用云端推理或较低频规划式控制)。(得克萨斯大学计算机科学系)

因此:

+控制频率:典型操作任务希望 VLA 在 5–10 Hz 输出高层命令(低层由控制器插值); +端到端时延(从采集图像到输出动作)要远小于机器人动态变化时间常数,通常希望在几十毫秒到一两百毫秒内; +边缘设备资源有限:很多机器人仅搭载 8–32 GB 显存的嵌入式 GPU 或移动 GPU。

  • 统一 Transformer 的层数、宽度、注意力头数与序列长度必须一起考虑,不能简单照搬语言模型配置;
  • 需要结合 10.4 节中的量化、蒸馏、模型剪枝等手段,把训练好的“大脑”压缩到机器人能吃得下的规模。OpenVLA 就展示了 7B 模型在 4bit 量化后,成功率几乎不降(71.9% vs 71.3%),显存占用却下降了一半以上。(alphaXiv)

8.5.3.3 最优规模选择

在具体项目中,如何决定“我的 VLA 模型要做多大”?这个问题没有一个放之四海皆准的数字,但可以用几条实用原则来指导决策。

1.**先从“实时性预算”反推模型规模。**可以做一个简化思路:

对于实验室早期研究,可以先不管硬件约束,直接在大 GPU 上试验较大模型,等验证方法有效后再做压缩和架构优化。

  • 目标控制频率为 \(\displaystyle f\)(例如 10 Hz),则单次推理允许的最大时延约为 \(T = 1/f\) 的一半到三分之一(预留传感与通信开销);
  • 在目标硬件上测量不同大小 Transformer(不同层数、隐藏维度、序列长度)的前向时间;
  • 选一个既能满足时延预算,又能放入显存的规模。

2.任务复杂度和开放度越高,模型越需要“宽一点”。

此外,可以采用“两级架构”:

  • 若任务场景较封闭(固定工厂产线、物体种类有限、指令模式固定),通常几十到几百 M 级别的模型就足以胜任;
  • 若目标是开放环境 + 自然语言 + 新物体/新任务泛化(类似 RT-2、OpenVLA 的定位),则实践上会倾向 1B–10B 范围的模型作为“机器人大脑”,并辅以大规模多模态预训练。(arXiv)
  • 大模型负责高层规划、子任务分解与自然语言理解(可以云端或离线执行);
  • 小模型负责本地实时控制与安全执行(在机器人上部署),二者通过中间表示(子目标、动作原语)交互。第 10 章和 12 章会再次讨论这种分层模式。

3.**善用蒸馏与量化:大模型“教”,小模型“跑”。**一种越来越常见的工程套路是:

这样,模型的表达上限由大模型决定,而实际运行成本由小模型承担,两者之间通过知识蒸馏建立联系。这与第 10.4 节中的“教师–学生”模型压缩框架是一致的。

+先用大模型(如 OpenVLA-7B) + 大数据训练一个强策略,在仿真和少量真实环境中获得满意表现;

  • 再通过行为蒸馏把大模型在大量状态上的动作分布“蒸馏”到一个小模型(例如 200M–1B),让小模型模仿大模型的策略;(Medium)
  • 最后对小模型进行量化、结构优化(如减少层数、使用更高效注意力)以满足机器人部署的硬件约束。

4.**围绕数据和团队能力做现实选择。**最后,规模选择还必须考虑非常朴素的现实因素:

  • 你手上有多少高质量机器人数据?如果只有几千条示范,那么上十亿参数只会带来严重过拟合和无端复杂度;
  • 团队是否有足够工程能力维护一个超大模型的训练与调参流程? 在很多学校/实验室场景里,一个数亿级参数、结构简洁、训练可控的 VLA,往往比盲目追逐巨模型更能帮助你快速完成科研闭环,并为将来对接更大基础模型打好接口。

综上,本小节从理论抽象与工程实践两个角度,介绍了统一 Transformer 架构、多机器人共享设计以及模型规模权衡这三块“结构性问题”。 在接下来的第 9 章,我们会转向“训练范式”的视角,讨论在这样的架构之上,如何通过预训练、模仿学习、强化学习以及人类反馈等方式,把一个“空壳的统一模型”真正训练成具备通用操作能力的 VLA 系统。

本章小结与自测

三行小结

  1. 本章是 VLA 架构设计核心:输入、融合、动作解码。
  2. 重点在多模态对齐与条件策略建模。
  3. 学完后应能比较不同 VLA 架构的设计权衡。

检查题

  1. 用你自己的话总结本章最核心的一个公式/机制。
  2. 给出一个“如果要落地到项目里,你会怎么用”的具体例子。

常见误区

  1. 盲目堆模型参数。
  2. 忽略动作空间定义与约束。
  3. 多模态融合后不做可解释性检查。

公式到代码(最小示例)

# 多模态特征拼接最小示例
vision = [0.1, 0.2, 0.3]
language = [0.5, -0.1]
state = [0.0, 1.0]
fusion = vision + language + state
print(fusion)

本章外部参考(集中)

  1. arXiv
  2. arXiv
  3. 谷歌研究
  4. Google DeepMind
  5. arXiv
  6. VLA Models Survey
  7. arXiv
  8. arXiv
  9. Google DeepMind
  10. Medium
  11. arXiv
  12. 得克萨斯大学计算机科学系
  13. 本章其余链接可在正文中按上下文继续查阅。

9.1 预训练阶段

9.1 预训练阶段概述(承上启下小结)

学习导航

  • 本章主题:9.1 预训练阶段概述(承上启下小结)
  • 前置知识:建议先完成第 8 章模型架构。
  • 建议用时:101-121 分钟
  • 阅读顺序:先看概念框架,再看公式/代码,最后做自测。

关键图示:训练阶段

关键图示:训练阶段

在上一章我们主要从结构上讨论了 VLA 模型“长什么样”。从本节开始,我们转向一个更工程化的问题:如何让这样一个模型“有东西可用”——也就是预训练阶段。

由于机器人真实交互数据昂贵、危险且难以规模化,当前主流做法是先依托互联网海量图文数据,把模型训练成一个强大的视觉–语言基础模型,再在机器人数据上做模仿学习和 RL 微调。(arXiv)

本小节聚焦四个问题:

  1. 用什么样的互联网图文语料来做预训练?
  2. 视觉 backbone 和语言 backbone 应该如何初始化?
  3. 自监督 / 半监督任务如何提升预训练效果?
  4. 如何在多任务预训练中合理设计和加权损失?

9.1.1 利用互联网图文数据进行视觉–语言预训练

9.1.1.1 图文语料

1)互联网图文数据的来源形式

互联网提供了大规模的“天然多模态数据”:

  • 图片 + alt 文本(HTML 中的 alt 属性)
  • 图片 + 标题 / 正文片段(新闻、博客、商品页面)
  • 图片 + 用户评论(社交媒体)
  • 图片 + 自动生成的弱描述(如搜索引擎爬虫产生的元数据)

早期数据集如Conceptual CaptionsYFCC100M等,就是从网页中抽取“图片 + 描述文字”对,经过一定规则过滤构建而成。ALIGN 工作沿用了类似流程,但减少了清洗程度,用极大规模弥补噪声问题。(arXiv)

近几年,LAION 系列数据集将这一思路推向了“互联网级”规模:

+LAION-400M:约 4 亿图文对,通过 CLIP 过滤保证基本语义相关性。(arXiv) +LAION-5B:扩展到约 58 亿多语种图文对,是目前公开可用的最大多模态数据集之一。(laion.ai)

这些数据集的共同特点:

+规模极大:使模型可以在非常多样的场景中看到各种物体、动作、风格。 +标注极弱且含噪:文本并不是精心写的“图像描述”,而往往只是上下文碎片。 +覆盖面广:从生活照片到截图、表格、梗图、漫画,应有尽有。

对机器人而言,这类数据为“理解世界长什么样”提供了极其丰富的先验,为之后的具身学习打下语义基底。

2)数据清洗与安全过滤

大规模网络语料必然包含:

  • 不相关的图文对(图和文完全不匹配)
  • 噪声文字(乱码、广告、SEO 垃圾)
  • 不适宜内容(成人、暴力、隐私等)

典型清洗步骤包括:

  • 文本层面:去掉过短或过长的文本,过滤非自然语言、广告模板等。
  • 图像层面:约束分辨率范围,去掉纯色图、损坏图。
  • 语义相关性过滤:用一个已训练好的 CLIP 模型,对图文对打分,只保留相似度超过阈值的样本(LAION 系列采用此类方法)。(arXiv)
  • 安全过滤:利用专门模型过滤 NSFW、暴力或隐私内容。

【图 9-1 占位:互联网图文数据预处理流程示意图。从“原始网页抓取”到“图像/文本预筛选”“CLIP 相似度过滤”“安全过滤”,最后得到干净的图文对。】

在面向机器人应用时,还可以增加额外的“领域过滤”,例如优先保留包含室内场景、桌面物体、工具、人体日常动作等图像,以提高对后续操作任务的相关性。

9.1.1.2 预训练任务

在具备大规模图文语料后,关键问题是:用什么任务来驱动模型学习有用的视觉–语言特征?

当前主流预训练目标大致分为三类:对比式、匹配式和生成式。

1)对比式预训练:CLIP / ALIGN / LiT

典型代表是 OpenAI 的CLIP(Contrastive Language–Image Pre-training)和 Google 的ALIGNLiT等。(arXiv)

核心思想是:

  • 使用一个图像编码器 \(f_\text{img}\) 和一个文本编码器 \(f_\text{text}\)。

  • 对于一个 batch 中的 \(\displaystyle N\) 个图文对 \(\displaystyle (I_i, T_i)\),分别编码得到向量 \(\mathbf{v}_i = f_\text{img}(I_i)\)、\(\mathbf{u}_i = f_\text{text}(T_i)\)。

  • 将匹配的 \(\displaystyle (I_i, T_i)\) 作为正样本,不匹配的组合作为负样本

  • 使用 InfoNCE 形式的对比损失:

    \[ \mathcal{L}_\text{img2text} = - \frac{1}{N} \sum_i \log \frac{\exp(\text{sim}(\mathbf{v}_i,\mathbf{u}_i)/\tau)} {\sum_j \exp(\text{sim}(\mathbf{v}_i,\mathbf{u}_j)/\tau)} \]

    文本到图像方向类似,\(\text{sim}\) 通常为向量点积,\(\tau\) 为温度系数。

直观理解:模型被迫将语义上相关的图像和文本“拉近”到同一个向量空间,而把不相关的推远。训练完成后,我们可以:

  • 用一句文本在图像库中检索匹配图片(文本→图像)
  • 用一张图像在文本库中检索匹配描述(图像→文本)
  • 甚至做零样本分类:将类别名称转为文本,编码后与图像特征做相似度比较。(arXiv)

ALIGN 则证明,即便图文配对噪声较大,只要数据规模足够大,对比学习仍然能够学到非常强的视觉表示。(arXiv)

LiT(Locked-image Text Tuning)进一步提出:锁死一个强大的预训练图像模型,只训练文本侧,用对比目标将文本 embedding 对齐到图像 embedding 空间中,从而极高效地获得强大的图文模型。(arXiv) 这一思路在 9.1.2 节会再次出现。

【图 9-2 占位:CLIP/ALIGN 双塔结构示意图。左侧为图像编码器,右侧为文本编码器,中间用对比损失对齐。】

2)匹配式预训练:图文匹配(ITM)

除了软对比损失,还可以显式训练一个二分类任务:给定一对 \(\displaystyle (I, T)\),预测它们是否匹配(Image–Text Matching, ITM)。许多单流 VLM(如 ViLBERT、UNITER 等)都使用类似目标。

优点:

  • 学习更细粒度的对齐(部分错误描述也会被判为“不匹配”)。
  • 匹配得分可以直接用作检索排序或后续模块的置信度。

3)生成式预训练:BLIP 等统一理解–生成模型

对机器人尤其重要的一类目标,是从图像生成自然语言描述,以及反过来从文本生成与图像一致的语言/特征

BLIP(Bootstrapping Language-Image Pre-training)提出了一个统一的 VLP 框架,同时支持理解和生成任务:它使用多模态编码–解码架构,联合优化图文对比、图文匹配和语言建模等多个目标,并通过“生成新 caption + 过滤噪声 caption”的方式提升 Web 图文数据质量。(arXiv)

对于机器人而言,这类生成能力可以用于:

  • 让模型给自己看到的场景配上语言描述,帮助理解操作环境;
  • 利用语言模型对机器人执行过程进行解释(第 4.4.3 节会展开)。

9.1.1.3 通用语义特征

对比式 / 匹配式 / 生成式预训练的共同目标,是获得一个**“通用视觉–语言语义空间”**:

  • 空间中的每个向量既有“视觉含义”,又对应“语言含义”;
  • 相似向量对应相近的语义概念(如“杯子”“coffee mug”“水杯”会聚在一起)。

CLIP 类模型已经展示出强大的零样本迁移能力:在未见过标注的分类任务上,仅通过语言描述类别名称,就能接近甚至匹敌监督训练的 ResNet-50。(arXiv)

ALIGN、LiT 等工作证明,只要视觉 backbone 足够强、图文对齐做得好,这一语义空间即可广泛迁移到下游任务。(arXiv)

对具身智能而言,这一通用语义空间有几种直接用途:

1.作为视觉 encoder 初始化:将机器人摄像头图像送入预训练的图像编码器,得到语义丰富的特征,再供下游决策网络使用。 2.作为语言条件接口:用户的自然语言指令编码后与视觉特征处于同一空间,方便 VLA 模型进行“以文找物”的对齐(第 8.4 节)。 3.作为跨任务共享表示:同一语义空间既可以支持分类/检测,也可以支持操作策略学习,避免为每类任务单独训练视觉模型。

【图 9-3 占位:通用图文语义空间示意图。不同类别图像与对应文本在高维空间中形成簇,机器人操作任务在该空间中选取目标对象。】


9.1.2 视觉 backbone 与语言 backbone 的初始化策略

真实机器人项目通常不会从随机初始化训练一个 VLA 模型,而是高度依赖预训练好的视觉 / 语言 backbone。合理的初始化策略可以显著降低数据需求、提高收敛速度。

9.1.2.1 视觉模型初始化

可以大致分为三种来源:

1)纯视觉预训练模型

+监督预训练:如在 ImageNet 上监督训练的 ResNet、ViT 等。 +自监督预训练:如对比学习(SimCLR、MoCo、DINO)、掩码图像建模(MAE、BEiT 等)。MAE 通过随机遮挡高比例图像 Patch,并让模型重建被遮挡区域,学习到泛化性很强的视觉特征。(arXiv)

优点:

  • 表征偏向纯几何/纹理/语义信息,对语言分布不过度依赖;
  • 适合作为“中性”的视觉基石,再与语言对齐(如 LiT 的做法)。

2)视觉–语言联合预训练的视觉 encoder

CLIP、ALIGN、BLIP 等模型内置的视觉编码器,已经在图文任务上做过对齐训练,通常更擅长“对着语言找对应区域”。

例如:

  • 使用 CLIP-ViT 作为视觉 backbone,可以直接获得与文本空间对齐的特征,方便后续指令条件控制。(arXiv)
  • InternVL 等近期大模型则从头联合训练大规模视觉 encoder 和 LLM,使视觉 backbone 更适配下游多模态任务。(CVF开放获取)

3)如何为机器人场景做选择?

实践中常见的几种组合:

+桌面操作 / 室内服务机器人:环境与互联网图片相似度较高,可优先选择 CLIP / BLIP 类视觉 backbone。 +专业领域(手术机器人、工业检查等):可以先用自监督方法在领域内的无标注图像上做额外预训练,再与语言对齐。 +资源受限平台:可能需要从较小的 CNN/ViT 结构开始,再通过知识蒸馏等手段迁移大模型的表示(见 10.4 节)。

9.1.2.2 语言模型初始化

语言侧的选择更加多样,大致可以分为两类:

1)轻量级文本编码器

如 BERT / RoBERTa 风格的编码器,输入为子词 token 序列,输出句子 embedding 或每个 token 的 contextual 表示。特点:

  • 模型尺寸中等,适合嵌入式部署;
  • 适合作为“指令编码器”,将任务描述转为固定维向量,供决策模块条件使用。

这类模型通常已经在大规模文本语料上预训练,具备较强的语义理解能力,对于“把红色方块放进盒子”这类简单指令完全够用。

2)大语言模型(LLM)作为语言 backbone

更激进的路线是直接使用 GPT/T5/LLAMA 级别的大语言模型作为语言 backbone:

  • 优点:具备丰富世界知识和推理能力,可对任务指令做更复杂的改写、分解和解释。
  • 缺点:推理开销较大,延迟和内存压力重,对实时控制是挑战。

许多最新 VLM / VLA 工作的做法是:冻结大部分 LLM 参数,只在其输入侧或中间插入少量可训练模块(如 LoRA、Adapter),在保证语言能力的前提下调节其对视觉和动作信号的响应(第 2.5.3 节已介绍参数高效微调思想,这里不再赘述)。

9.1.2.3 冻结 vs 微调

初始化只是第一步,接下来要决定:这些预训练的 backbone,要不要继续训练?如何训练?

可以从以下几个层次理解:

1)完全冻结(全冻结)

做法:

  • 视觉 encoder 和文本 encoder 完全不更新;
  • 仅在其上方训练一个较小的多模态融合 + 动作解码头。

优点:

  • 最稳定、安全,不会破坏预训练好的通用能力;
  • 计算和显存开销小,适合数据非常少的场景。

缺点:

  • 对特定机器人视角、噪声形态、指令风格的适应能力有限;
  • 对具有明显领域偏移的场景(工业、医疗)效果可能较差。

LiT 的结果表明,在某些情况下,“锁死图像模型,只训练文本侧”可以达到很强的零样本性能,这对机器人提示我们:合理的冻结策略本身就是一种强有力的先验。(arXiv)

2)部分微调 / 分层解冻

  • 只微调 backbone 的高层(靠近输出的几层),保留底层边缘/纹理特征;
  • 或者采用“逐层解冻”(逐步解冻):先只训练新增头部,稳定后再逐层解冻 backbone 深层。

优点:在保持大体分布的同时,让模型适应机器人视角、相机畸变、特定语言风格。

3)参数高效微调(PEFT)

如 LoRA、Adapter、Prefix Tuning 等,只在 backbone 内部插入小规模可训练参数。优点:

  • 几乎不改变原有权重,避免灾难性遗忘;
  • 可以为不同机器人 / 任务维护多套“适配器”,共用同一个基础模型。

在机器人 VLA 中常见做法是:

  • 冻结大部分 CLIP/LLM 参数;
  • 在跨模态对齐层或动作解码层插入 LoRA/Adapter;
  • 使用机器人多模态数据训练这些轻量参数。

4)如何选择策略?一个实用经验

  • 机器人数据极少(几十到几百条演示):倾向冻结 backbone + 仅训练头部或 PEFT
  • 有中等规模数据(上万条演示):可以部分微调高层,尤其是靠近动作解码器的一侧。
  • 仿真可生成极大规模数据:可以尝试全模型微调,甚至在仿真中从强初始化开始继续预训练。

9.1.3 自监督 / 半监督任务在预训练中的作用

互联网图文预训练提供的是**“人类视角的语义先验”**,而机器人自身的传感数据(机器人的第一人称视角、低机位、特定传感器噪声等)往往分布不同。

为了充分利用大量无标注或弱标注的机器人数据,自监督与半监督任务成为连接互联网预训练与具身学习的重要桥梁。

9.1.3.1 掩码建模

掩码建模(Masked Modeling)是一类非常通用的自监督方法,包含两种典型形式:

1)掩码语言建模(MLM)

  • 在输入句子中随机遮盖部分 token(例如用 [MASK] 替代);
  • 训练模型根据上下文预测被遮盖 token;
  • BERT 系列模型就是通过 MLM 预训练的代表。

对机器人而言,MLM 可用于让模型熟悉任务描述的语言模式,并强化对动作说明、约束条件等关键字的敏感度。

2)掩码图像建模(MIM):以 MAE 为代表

MAE(Masked Autoencoders)将掩码思想引入图像:

  • 将图像分割为多个 Patch,随机遮挡其中大部分(例如 75%);
  • 编码器只处理可见 Patch,解码器从潜在表示 + 掩码 token 中重建完整图像;(arXiv)
  • 通过重建误差作为训练信号。

这类方法的直觉是: 要填补被遮挡区域,模型必须学会图像中物体的结构与上下文关系,而不是仅仅记住局部纹理。

进一步地,还有同时对图像和文本做掩码建模的多模态 MAE(如 M3AE 等),在 awesome-VLP 汇总中可以找到一系列工作,它们利用多模态掩码任务学习可迁移的视觉–语言表示。(GitHub)

在机器人场景中,可以将机器人第一视角摄像头的连续画面作为 MIM 的训练对象,让模型更好地适应真实硬件和环境下的视觉分布,为后续 VLA 预训练提供“贴地气”的视觉基座。

【图 9-4 占位:多模态掩码建模示意图。一侧是被遮挡 Patch 的图像,另一侧是遮挡 token 的指令文本,解码器联合重建。】

9.1.3.2 顺序预测

具身智能本质上是时序决策问题,因此“顺序预测”(Sequential Prediction)类自监督任务与机器人高度契合。

常见形式包括:

1)语言序列的下一个 token 预测

这是自回归语言模型(GPT 类)的经典预训练目标:给定前面一串 token,预测下一个 token。它让模型习得语法、知识及一定程度的推理能力(第 4.2 节已详细介绍)。

2)视觉 / 视频序列预测

  • 未来帧预测(Future Frame Prediction):给定过去几帧图像,预测下一帧图像或其特征;
  • 视频片段顺序判别:打乱一段视频的帧顺序,让模型判断是否在正确顺序或恢复正确顺序。

对机器人而言,这类任务相当于训练一个粗略的“世界模型”:在不执行真实动作的情况下,想象环境会怎样变化

3)动作 / 轨迹序列预测

在拥有大量机器人交互轨迹(甚至无任务标签)的情况下,可以构造纯自监督任务:

  • 给定过去若干步的观察和动作,预测下一步动作(或状态);
  • 给定轨迹的前半段,预测后半段动作 / 状态。

这些任务不需要外部奖励或成功标注,但能让模型学习到动作–状态之间的因果结构,后续行为克隆或 RL 微调会更高效。

9.1.3.3 半监督学习

在许多领域,图像远多于配对文本,或者只有少量专家标注的图文或轨迹。半监督学习的目标是:

利用少量标注 + 大量未标注数据,获得接近全监督的效果。

在视觉–语言预训练中,典型例子包括:

1)S-CLIP:少量 caption + 大量无标注图像

S-CLIP 针对专业领域(遥感、时尚、科学图表等)提出了一种半监督 CLIP 训练方法:

  • 有少量带 caption 的图像,以及大量没有 caption 的图像;
  • 通过最优传输和部分标签学习等策略,为未标注图像生成“伪 caption”或关键词;
  • 结合对比学习和伪标签训练,大幅提升目标领域的零样本性能。(arXiv)

这一思路可以直接迁移到机器人: 例如,在一个工厂或家庭环境中,只为少数场景人工编写多模态说明,其余大量相似场景通过 VLM 自动生成伪标签,作为额外训练信号。

2)VLM 辅助伪标注:BLIP 的 Caption Bootstrapping

BLIP 提出用已经训练好的 captioner 为 Web 图像生成新描述,并利用过滤器剔除明显不可信的 caption,从而在“噪声 Web 文本”之上**“自举”出更干净的监督信号**。(arXiv)

在机器人数据上可以采取类似做法:

  • 用预训练 VLM / LLM 自动为机器人轨迹打上语言标签(任务描述、错误原因等);
  • 使用人工审核少部分样本,训练一个过滤模型;
  • 将高置信度伪标注加入训练,充当“廉价的弱监督”。

3)一致性正则与教师–学生模型

与图像分类中的半监督类似,VLA 预训练也可以引入:

  • 对未标注样本做多种数据增强(不同视角、裁剪、颜色变换等),要求模型输出的一致性;
  • 使用 teacher–student 架构(例如 EMA 均值教师),teacher 生成伪标签,student 学习,并不断更新 teacher。

总的来说,自监督 / 半监督任务使我们能充分压榨机器人摄像头全天候采集的海量未标注数据,在不增加太多标注成本的情况下显著增强预训练效果。


9.1.4 多任务预训练与损失加权

到目前为止,我们分别介绍了对比学习、掩码建模、顺序预测、半监督等任务。实际系统中,往往不会只训练一个目标,而是在同一个模型上并行优化多个任务,形成多任务预训练框架。

这带来两个问题:

  1. 如何设计多任务结构?
  2. 多个损失之间如何加权?

9.1.4.1 多任务预训练

多任务预训练(Multi-Task Pre-training)的基本思路是:共享一个主干网络,并在其上附着多个任务头,同时优化多种损失。

以 BLIP 为例,它在一个多模态编码–解码架构上同时优化:(arXiv)

  • 图文对比损失(Image–Text Contrastive, ITC)
  • 图文匹配损失(Image–Text Matching, ITM)
  • 语言建模损失(LM)

部分工作还会加入:

  • 掩码语言建模(MLM)或掩码多模态建模(M3AE、SIMLA 等);
  • 视觉侧的分类或检测辅助任务;
  • 动作预测或行为克隆损失(在已经拥有机器人轨迹数据时)。

【图 9-5 占位:多任务预训练结构示意图。底部为共享视觉–语言编码器,顶部挂接 ITC、ITM、MLM、动作预测等多个任务头。】

对于 VLA 预训练,一个典型的多任务组合可能是:

  • 任务 A:图文对比,学习通用图文对齐;
  • 任务 B:掩码建模(图像 / 文本 / 视频),学习局部结构和长程依赖;
  • 任务 C:行为克隆预训练,输入(图像,指令,历史动作),预测下一步动作;
  • 任务 D:离线 RL 或奖励预测(如果有奖励信号)。

通过共享 backbone,模型在优化任务 C/D 时可以同时利用任务 A/B 学到的概念和物理直觉;反过来,任务 A/B 的泛化能力也会因接触“动作和后果”的数据而增强。

9.1.4.2 损失函数加权

多任务预训练中的难点在于:不同任务的损失尺度、收敛速度、难度都不同,如果简单地把它们相加,可能导致:

  • 某个损失主导梯度更新,其他任务几乎“学不到东西”;
  • 有的损失指数级下降,有的基本不动,训练不稳定。

常见的损失加权策略包括:

1)手工设定固定权重

最朴素也最常见的做法:

\[ \mathcal{L}_\text{total} = \lambda_1 \mathcal{L}_\text{ITC} \quad + \lambda_2 \mathcal{L}_\text{ITM} \quad + \lambda_3 \mathcal{L}_\text{MLM} \quad + \lambda_4 \mathcal{L}_\text{BC} \quad + \cdots \]

优点是实现简单;缺点是需要大量实验调参,且不同数据规模、模型大小下最佳权重不同。

2)基于不确定性的动态加权(Kendall 等)

Kendall 等提出了一种基于任务 homoscedastic 不确定性的加权方式,把不同任务的损失缩放系数视为需要学习的参数:(CVF开放获取)

对任务 \(\displaystyle i\) 的损失 \(\mathcal{L}_i\),总损失可写为

\[ \mathcal{L}_\text{total} = \sum_i \left( \frac{1}{2\sigma_i^2} \mathcal{L}_i + \log\sigma_i \right) \]

其中 \(\sigma_i\) 是可学习的“任务不确定性”,训练过程中会自动调整,使得:

  • 损失较大的任务(噪声大或难学)获得相对较小权重;
  • 损失较小、易优化的任务权重相对更大。

这一方法的优势在于:

  • 不需要手动指定各任务权重;
  • 可以自适应不同任务在不同训练阶段的重要性。

3)梯度平衡与学习进度驱动的加权

其他方法(如 GradNorm、基于任务学习进度的动态权重等)通过平衡不同任务的梯度范数或收敛速度,让每个任务都能“公平地”参与训练。

在 VLA 预训练中,常见的实际工作流是:

  1. 先采用简单的固定权重,快速跑通训练流水线;
  2. 在较稳定的基础上,引入不确定性加权或梯度平衡方法,进一步提升性能;
  3. 在特定阶段(如开始加入 RL 目标时)动态调整权重,避免新目标“毁掉”已有能力。

9.1.4.3 课程学习

多任务预训练之外,**课程学习(Curriculum Learning)**强调的是“任务顺序”而不是单步的损失加权。

直觉:先让模型学习简单的任务与样本,再逐步提高难度,可以获得更稳定、更好的训练效果。

在 VLA 预训练中,可以从任务维度数据维度设计课程。

1)按任务复杂度分阶段

一个典型的课程可以是:

+阶段 1:单模态预训练 视觉侧做 MAE / 对比学习,语言侧做 LM / MLM,训练出各自稳定的 backbone。 +阶段 2:图文对齐 加入 CLIP 式对比任务和 ITM,让图像与文本进入统一语义空间。 +阶段 3:加入动作预测 / 行为克隆 在共享 backbone 上添加动作解码头,开始使用机器人轨迹数据,学习“视觉 + 语言 → 动作”的映射。 +阶段 4:加入奖励或 RL 目标(第 9.3 节) 在已有策略基础上引入奖励优化,细化策略的稳定性和效率。

各阶段之间也可以有重叠,例如阶段 2 后期就少量混入阶段 3 的损失,使过渡平滑。

2)按样本难度设计数据课程

例如:

  • 在图文对齐时,先使用“描述比较准确、文字较规范”的网络数据(如精挑的 caption),再逐渐加入噪声更大的 alt 文本;
  • 在机器人数据上,先训练简单场景(物体少、布局固定),再逐步引入复杂场景(遮挡、多物体、动态干扰);
  • 在动作预测上,先用短轨迹、任务步骤清晰的数据,再加入长序列或包含失败案例的数据。

【图 9-6 占位:VLA 预训练课程学习时间轴示意图,展示预训练阶段如何从“单模态”逐步走向“多模态 + 动作 + RL”。】

通过多任务预训练和课程学习的组合,我们可以将“互联网世界”中的视觉–语言知识与“机器人世界”中的物理–动作经验逐步融合,为后续模仿学习和强化学习阶段打下坚实基础。这也是当下具身基础模型研究的一个核心思路:先尽量在离线数据中把能学的都学掉,再把机器人宝贵的在线交互用在“最后那一点点差距”的弥合上。

本章小结与自测

三行小结

  1. 本章讨论从预训练到微调的完整训练范式。
  2. 重点是数据工程、采样策略和训练稳定性。
  3. 学完后应能制定端到端训练计划并做复盘。

检查题

  1. 用你自己的话总结本章最核心的一个公式/机制。
  2. 给出一个“如果要落地到项目里,你会怎么用”的具体例子。

常见误区

  1. 训练计划缺少阶段目标。
  2. 采样策略和损失权重固定不变。
  3. 只看平均指标,不看长尾任务。

公式到代码(最小示例)

tasks = {"pick": 1200, "open_drawer": 200, "pour": 80}
alpha = 0.5
weights = {k: v ** alpha for k, v in tasks.items()}
z = sum(weights.values())
probs = {k: round(v / z, 4) for k, v in weights.items()}
print(probs)

本章外部参考(集中)

  1. arXiv
  2. arXiv
  3. arXiv
  4. laion.ai
  5. arXiv
  6. arXiv
  7. arXiv
  8. CVF开放获取
  9. GitHub
  10. arXiv
  11. CVF开放获取

9.2 模仿学习阶段

9.2.1 使用机器人示教轨迹进行行为克隆

学习导航

  • 本章主题:9.2.1 使用机器人示教轨迹进行行为克隆
  • 前置知识:建议先完成第 8 章模型架构。
  • 建议用时:98-118 分钟
  • 阅读顺序:先看概念框架,再看公式/代码,最后做自测。

这一小节把前面第 5 章中比较抽象的“行为克隆(BC)”真正落到 VLA 训练流水线上:有了多模态示教轨迹(视觉、语言、状态、动作),如何把它们组织好、喂给模型、再检查模型输出是否“像个靠谱的机器人”。


9.2.1.1 准备示范数据

1)示教轨迹的基本结构

在 VLA 场景下,一条完整的示教轨迹通常可以写成:

\[ \tau = \left\{(o_t, x_t, a_t, c)\right\}_{t=1}^T \]

  • \(o_t\):时刻 \(\displaystyle t\) 的视觉观测(RGB 图像、深度图,甚至多相机画面)
  • \(x_t\):机器人状态(关节角、末端位姿、夹爪开合、是否抓到物体等)
  • \(a_t\):专家给出的动作(关节指令、末端增量、动作 token 等)
  • \(\displaystyle c\):与整条轨迹关联的条件信息,如自然语言任务指令、任务 ID、机器人 ID、环境参数等

第 7 章已经介绍了遥操作(Teleoperation)、人手带动(Kinesthetic teaching)和程序生成三种主流示教方式,这里可以认为我们已经通过这些手段获得了大量轨迹,现在的重点是标准化和对齐

2)时间同步与多模态对齐

实际采集时,各模态的时间频率并不统一:相机 10–30 Hz,关节控制 100–1000 Hz,语言指令可能只有一条。常见做法是:

  • 为所有消息打时间戳
  • 按目标训练频率(例如 10 Hz)建立一个统一时间轴
  • 对每个时间点,找到最接近的图像帧和状态;动作通常记录为上一控制周期发出的指令

这样可以得到一条对齐好的时间序列,供行为克隆模型直接使用。大规模机器人数据集(如 RT-1、Open X-Embodiment 等)都会采用类似的标准化设计,使不同实验室、不同机器人采集的数据能放到同一个训练池里使用。(ResearchGate)

3)轨迹切片与窗口化

行为克隆往往不是“一条轨迹当成一个样本”,而是把轨迹切成许多长度为 \(\displaystyle K\) 的小片段:

\[ {(o_{t:t+K-1}, x_{t:t+K-1}, a_{t:t+K-1}, c)} \]

  • 这样做可以让模型在一个窗口内看到短期历史,而不是只看当前帧
  • 也方便使用 Transformer 这类序列模型统一处理“多帧视觉 + 历史动作”

窗口长度 \(\displaystyle K\) 的选择与任务时间尺度相关:抓取类任务可能十几步即可,开门、抽屉这类长时任务可能需要更长窗口,或者再引入记忆机制。

4)元数据与质量标注

为了后续采样策略(见 9.2.2)和长尾处理(见 9.2.3),示范数据在存储时最好附带以下元信息:

  • 机器人 ID、机械结构信息(自由度数、是否带移动底盘等)
  • 任务 ID、任务类别(抓取、插入、开合容器等)
  • 环境配置(物体类别、摆放布局、光照条件等)
  • 成功 / 失败标记,必要时添加“部分成功”标签(仅抓取成功、放置失败等)

近年来的示教学习综述工作都强调:数据的结构化和标注质量,比单纯堆量更关键。否则大量“脏数据”只会拖慢训练,让模型学到错误的偏好。(科学直通车)

【图 9-1 占位:示教轨迹数据结构示意图。时间轴横向展开,上方是图像帧,下方是机器人状态与动作,轨迹整体关联一条自然语言指令和任务 ID。】


9.2.1.2 行为克隆训练

1)从模仿学习到有条件的 VLA 行为克隆

有了清洗好的示教数据,VLA 的行为克隆本质上是一个有条件的监督学习问题

\[ \min_\theta \mathbb{E}_{\tau \sim \mathcal{D}} \left[ \sum_{t} \ell\big(f_\theta(o_{1:t}, x_{1:t}, c), a_t\big) \right] \]

  • \(f_\theta\) 是 VLA 模型,输入为历史观测、机器人状态和任务条件(语言指令等),输出当前动作
  • \(\ell\) 是损失函数,动作是离散 token 时多用交叉熵;是连续向量时多用 L2/MSE

像 RT-1、RT-X 等大规模机器人 Transformer,本质上就是在几十万条示教轨迹上做这样的大规模行为克隆,只不过它们把动作离散化为 token 序列,与语言 token 一并用 Transformer 处理。(ResearchGate)

2)Teacher Forcing 与动作 token

实际训练时,最常用的是teacher forcing

  • 解码器在预测 \(a_t\) 时,条件中用的是专家的历史动作\(a_{1:t-1}\),而不是模型自己先前预测的动作
  • 好处:梯度路径清晰稳定,训练过程完全在“专家分布”下进行,便于优化
  • 代价:上线执行时,模型只能看到自己以前的动作,会产生分布偏移(这一点在第 5 章 DAgger 中已经讨论过)

如果动作被量化为序列 token(例如“关节 1 的档位”“末端 x 方向增量档位”等),可以直接借用语言模型工具链:

  • 把“视觉 token + 语言 token + 历史动作 token”拼成一个长序列
  • 用自回归方式预测下一个动作 token
  • 损失函数就是标准的 token-level 交叉熵

3)冻结与解冻:利用预训练骨干

在第 9.1 节中我们已经通过图文数据对视觉和语言 backbone 做了预训练。行为克隆阶段常见的实践是:

1.阶段一:冻 backbone,只训决策头

  • 视觉和语言编码器参数冻结,仅训练动作解码头和少量多模态融合层
  • 好处是训练稳定,防止少量机器人数据把大规模预训练知识“洗掉” 2.阶段二:逐层解冻
  • 在行为克隆 loss 稳定下降后,逐层解冻靠后的视觉 / 语言层,允许模型为机器人任务做适度“特化”
  • 解冻时要减小学习率,避免对 backbone 做过猛更新

多任务机器人策略的研究(如基于多任务 Transformer 的 BAKU、LBM 系列)都表明,合理利用预训练骨干并控制解冻节奏,可以在相同示教数据量下显著提升性能和泛化。(NeurIPS 会议论文)

4)数据加载与 batch 构造要点

  • 同一 batch 中的样本可以来自不同机器人、不同任务(多任务学习模式),也可以暂时限制为相同任务做 curriculum 学习
  • 序列模型训练时,通常会对每段轨迹随机选择起始时间 \(\displaystyle t\),避免模型只在固定时间段看到类似情形
  • 对于长轨迹,可使用“子序列重叠采样”:相邻窗口部分重叠,提高数据利用率并保持时序连续性

【图 9-2 占位:行为克隆训练流程示意图。从轨迹池抽取一批窗口,经过视觉 / 语言编码器和 Transformer 决策头,计算动作 token 交叉熵 loss、反向传播更新。】


9.2.1.3 模型输出验证

行为克隆完成后,不能只看 loss 数值“好不好看”,更关键的是:模型在闭环控制下是否真的能完成任务

1)离线指标:一步预测 vs 轨迹层面

离线评估时,常用指标包括:

+一步动作预测准确率 / Top-k 准确率: 模型在验证集上对专家动作的预测是否正确或落在前 k 个候选中 +连续动作误差: 若动作是连续的,可统计平均 L2 误差、角度误差等 +负对数似然(NLL): 尤其在动作是概率分布(例如高斯)时,用来评估动作分布拟合程度

这些指标只衡量“模仿得像不像”,并不能保证闭环执行时不会“越走越偏”。

2)回放评估与闭环模拟

更实际的办法是进行两种回放实验:

+离线回放(open-loop replay)

  • 使用记录好的观测 \(o_t\)、状态 \(x_t\),让模型在每一步输出动作 \(\hat a_t\)
  • 把 \(\hat a_t\) 与专家动作 \(a_t\) 比较,看轨迹整体偏差
  • 适合快速检查“模型有没有学错行为风格”(例如方向完全相反) +仿真闭环执行(closed-loop rollout)
  • 把模型部署到仿真环境中,从与示教轨迹相同的初始状态出发
  • 每一步用模型输出作用于环境,观测新状态,再继续决策
  • 统计任务成功率、完成时间等指标,这才真正反映策略可执行性

从大规模机器人 BC 系统(如 RT-1、Open X-Embodiment 上的 RT-X)经验看,离线行为克隆指标与实际成功率只有部分相关:有时 NLL 改善不多,但成功率提升显著,反之亦然。因此必须保留一套“闭环验证 protocol”。(robotics-transformer-x.github.io)

3)错误分析与可视化

建议在验证阶段刻意构建一些“典型失败案例”进行可视化分析:

  • 关键帧对比:同一时间点下,人类示教 vs 模型执行的末端位姿、物体位置
  • 轨迹叠加:在 2D/3D 中画出示教轨迹和模型轨迹,观察偏差模式(是否总是靠近桌边、抓高了等)
  • 任务分解层面:看是出错在“找物体”、“对准”还是“放置”阶段

【图 9-3 占位:闭环评估可视化示意图。左列是示教轨迹关键帧,右列是模型执行关键帧;下方叠加两条末端轨迹曲线,标记偏差最大的时刻。】


9.2.2 混合多机器人、多任务数据训练的采样策略

随着 Open X-Embodiment 等数据集的公开,研究者开始尝试在二十多个机器人、上百甚至上千个任务的数据上训练单一通用策略。(robotics-transformer-x.github.io) 这带来的好处显而易见:模型能共享知识、提升泛化;但随之而来的是一个现实问题——怎么抽数据?


9.2.2.1 数据混杂问题

如果我们粗暴地把所有轨迹混在一起,每个时间步都“从全集中等概率采样”,会遇到至少三个问题:

1.机器人分布极不均匀 某些实验室贡献了大量某一款机械臂的数据,另一些机器人只有少量轨迹。如果不加区分,模型会几乎完全“变成”那台主流机械臂的专家,对其他机器人性能堪忧。 2.任务分布严重倾斜 像“抓取桌面物体”这样的基础任务数据常常巨多,而复杂任务(抽屉、插销、开盖)数据很少。模型自然而然会学会在任何情境下“抓个东西再说”,而忽略长尾任务的细节。 3.动作空间与标度差异 不同机器人使用的动作定义可能不同:有的输出关节增量,有的输出末端速度,有的还带移动底盘。即便经过统一 token 化,原始分布差异仍然存在,会导致梯度更新被某些高方差任务主导。

多任务机器人策略研究已经反复观察到,这类分布不均匀 + 异质性会让“多任务训练”从理论上的利好,变成实践中的“互相拖后腿”。(OpenReview)


9.2.2.2 分布均衡采样

为缓解上述问题,可以在 DataLoader 层面设计更聪明的采样策略。

1)任务 / 机器人均衡采样

最直接的做法是分层采样:

  • 均匀采样任务 ID 或(机器人,任务)二元组
  • 再在所选任务的轨迹池中随机采样一个时间窗口

这样,每个 batch 中不同任务、不同机器人出现的概率大致相近,避免“头部任务独占梯度”。

具体实现上,可以为每个任务维护一个索引列表,并在每个 epoch 重新随机打乱,实现类似“per-task round-robin”的采样方式。

2)温度重标采样(temperature-based sampling)

严格均衡并不总是理想:样本极少的任务如果被采得过多,容易过拟合;样本极多的任务被采得过少,又浪费了宝贵数据。因此可以使用“温度采样”:

\[ p_i \propto n_i^\alpha,\quad 0 < \alpha < 1 \]

  • \(n_i\):任务 \(\displaystyle i\) 的样本数
  • \(\alpha\) 越接近 0,越接近完全均衡;越接近 1,越接近原始按样本数比例采样

在自动驾驶和机器人长尾学习中,这类“次线性重标”的采样策略已经被证明在“利用大量头部数据”和“照顾长尾任务”之间做出了比较合理的折中。(arXiv)

3)重采样 vs 重加权

除了改变“抽样概率”,也可以保持抽样不变,只在 loss 中给不同任务加权(这一点在 9.2.3 中会详细展开)。实践中常见的组合是:

  • 适度均衡采样(例如温度采样)
  • 再叠加一个较温和的 loss 权重(例如对真正极少样本的任务略微放大 loss)

这样避免单一手段过度极端,导致 training dynamics 不稳定。


9.2.2.3 元学习思路

前面讨论的采样策略,本质上是在“让各任务在训练中被看到得更公平”。进一步的思路是:让模型学会“见到一个任务就知道该怎么快速适应”,即引入元学习(meta-learning)视角。

1)任务级 episode 训练

可以把“一个任务的数据子集”看成一个 episode:

  1. 在该任务数据上做若干步“内循环”更新(inner loop),模拟在新任务上微调
  2. 再在多个任务 episode 上做“外循环”(outer loop)梯度更新,让模型参数偏向于“对任何任务都易于适应”的状态

这类似于第 12 章会提到的 MAML 风格元学习,只不过这里的任务条件通常以语言指令 + 任务 ID + 机器人 ID embedding的形式输入模型,而不是单纯的标签。

2)检索增强与“学会选数据”

近年来一些工作尝试从大规模示教库中为特定目标任务智能检索最相关的示范,再用这些数据做 BC 微调,本质上是一种“数据级元学习”。例如 COLLAGE 会根据少量目标任务 demo,从大库中检索语义相似的轨迹,构成增强训练集。(OpenReview)

这种方法在 VLA 场景中非常自然:语言指令本身就是任务描述,可以直接用作检索 query,让模型在训练和测试时都“带着记忆中的类似经验”做决策。

【图 9-4 占位:多任务 / 多机器人采样与元学习示意图。一侧是按任务均衡的 DataLoader,另一侧是以任务为单位的内外循环元学习流程。】


9.2.3 数据不平衡与长尾任务的处理

现实世界的数据几乎都会呈现长尾分布(long-tail):大量普通场景 + 少量复杂罕见场景。这在视觉领域早已是经典问题,在机器人领域则显得更敏感,因为尾部任务往往正是“难但关键”的场景(例如障碍物突然出现、物体滑落、夹爪打滑)。(LG AI Research)


9.2.3.1 数据长尾现象

在具身数据中,长尾可以出现在多个层面:

+任务层面: “抓起桌面方块”之类简单任务数据巨大,而“开门”、“插销”、“从抽屉里取物”数据稀缺 +环境层面: 标准光照、整齐摆放的数据极多,杂乱桌面、暗光、遮挡严重的数据极少 +动作 / 状态层面: 正常操作姿态是高频状态,而“接近碰撞边缘”“夹爪半滑落”等微妙状态十分罕见

如果直接在原始长尾数据上做行为克隆,模型的策略等价于“尽量在头部场景表现好”,在尾部场景则容易完全失常,甚至表现得比简单的手工策略还差。近期针对不平衡数据的行为克隆研究也证明,不做 rebalancing 的 BC 会显著偏向频繁行为模式。(arXiv)


9.2.3.2 重采样或重加权

1)重采样(resampling)

+过采样尾部任务: 在 DataLoader 中人为提高尾部任务被采到的概率,甚至允许同一条轨迹多次出现在不同 epoch +欠采样头部任务: 对样本过多的任务有意识地丢弃一部分,防止它们压倒一切

这一做法的优势是简单直观,缺点是容易导致尾部任务过拟合(总是同几条轨迹),而头部任务信息浪费严重。

2)损失重加权(loss re-weighting)

另一条路径是保持抽样大致按原始分布,只对 loss 加权:

\[ \mathcal{L} = \sum_{k} w_{c(k)} \cdot \mathcal{L}_k \]

  • \(\mathcal{L}_k\):第 \(\displaystyle k\) 个样本的 BC 损失
  • \(c(k)\):该样本所属任务 / 类别
  • \(w_{c}\):对应类别的权重

常见的权重选择包括:

  • 反频率权重:\(w_c \propto 1 / n_c\)
  • 平滑反频率权重:\(w_c \propto 1 / \sqrt{n_c}\) 或使用类似温度调节的形式
  • 动态 reweighting:根据训练过程中各类任务的当前性能动态调整权重,使模型更关注“当前表现差”的任务 (CVF开放获取)

在大规模机器人 BC 中,经验表明“适度的重加权最稳妥”——把尾部权重调大一两级通常有益,但过度放大会导致梯度噪声急剧变大,引发训练不稳定。


9.2.3.3 数据增强

因为尾部数据常常数量极少,仅靠重采样与重加权仍然容易过拟合,这时**数据增强(augmentation)**是必要补充。

1)视觉层增强

  • 经典图像增强:随机裁剪、平移、旋转、色彩抖动、噪声等
  • 机器人特有增强:在仿真中做域随机化——改变光照、材质、背景等,从有限尾部场景生成多样视觉变体(与第 5 章 Sim2Real 内容呼应)

注意:增强必须保证语义和任务标签不变。例如,把“开抽屉”的视频旋转 180° 就完全改变了语义,不再是原任务。

2)动作 / 轨迹层增强

  • 对动作轻度加噪:在不破坏任务成功的前提下,给专家动作加小扰动,让模型见到更丰富的“近似 optimal”的行为
  • 轨迹时间裁剪 / 拼接:截取长轨迹的中间部分作为独立训练样本;或将一些标准“接近 + 抓取”子序列库重用到其他类似任务
  • 在仿真中针对尾部任务设计大量程序化演示,再与少量真实示教混合使用

最新的大规模驾驶与机器人策略工作表明,在数据量巨大时,简单的视觉增强很难触及真正的“规则尾部行为”,这时需要有针对性的行为层增强和仿真合成,才可能让 BC 策略在尾部任务上有像样表现。(SpringerLink)

【图 9-5 占位:长尾任务处理示意图。左侧是头–尾分布直方图,中间展示重采样 / 重加权示意,右侧展示模拟增强生成的大量尾部任务变体。】


9.2.4 训练稳定性:梯度尺度、loss 爆炸、收敛诊断

VLA 模型通常是大参数量 + 长序列 + 多模态的组合,对优化器来说压力不小。略微调错学习率、初始化或归一化,就可能看到 loss 曲线“离谱起飞”或者“纹丝不动”。

本节不再重复第 2 章的优化基础,而是聚焦于:在大规模行为克隆中,如何监控梯度、避免 loss 爆炸,并判断模型是否真的在收敛。


9.2.4.1 梯度规范

1)梯度范数监控

在每次反向传播后,我们可以计算整体梯度的 L2 范数:

\[ |\nabla_\theta|_2 = \sqrt{\sum_i g_i^2} \]

其中 \(g_i\) 为每个参数的梯度。实际工程中,常见做法是:

  • 在日志中记录每个训练 step 或每 N 个 step 的梯度范数
  • 建立一个“合理区间”(例如在初期根据试验经验设定)
  • 一旦出现持续的异常尖峰或长期过小,就需要检查是否有 bug 或超参数不合理

最近关于大模型训练稳定性的经验也指出,长期不稳定的梯度峰值往往与损失突然爆炸高度相关,及早发现能避免浪费训练预算。(arXiv)

2)梯度裁剪(gradient clipping)

应对梯度爆炸的经典办法是梯度裁剪,常用的是按全局范数裁剪

\[ \tilde g = \begin{cases} g & \text{if } |g|_2 \le c \dfrac{c}{|g|_2} g & \text{if } |g|_2 > c \end{cases} \]

  • \(\displaystyle c\) 是设定的阈值(如 1.0 或 5.0),可根据实验调整
  • 裁剪只改变梯度的“长度”,不改变方向

大量深度学习实践表明,梯度裁剪可以在不明显影响最终性能的前提下,显著降低 loss 爆炸、参数发散的概率,尤其是 RNN / Transformer 和大 batch 训练中几乎是标配。(neptune.ai)

3)与混合精度和归一化的配合

在 VLA 训练中经常使用混合精度(FP16/BF16),此时要注意:

  • 宜搭配loss scaling,防止小梯度在 FP16 下下溢为 0
  • 与 LayerNorm、BatchNorm 配合时,可在归一化之后监控激活值 range,避免中间激活过大导致梯度过大

简单的经验法则是:先看激活再看梯度。如果中间某层激活已明显发散,那么裁剪梯度只是“止血”,仍需要从网络结构和输入归一化上找原因。


9.2.4.2 Loss 爆炸

1)什么是 loss 爆炸

loss 爆炸通常表现为:

  • 训练 loss 在若干 step 内突然大幅上升
  • 出现 InfNaN,训练中断
  • 同时伴随梯度范数的异常尖峰

这在深层网络和长序列模型中非常常见,尤其是学习率过大或初始化不当时。(ultralytics.com)

2)常见成因与排查顺序

工程上可以按以下顺序排查:

1.学习率过大

  • 尝试降低一个数量级(例如从 1e-4 降到 1e-5),观察 loss 是否恢复正常下降
  • 确认是否正确使用了 warmup,避免刚开始就大步更新 2.输入 / 标签异常
  • 检查是否存在输入为 Inf / NaN 的样本(例如传感器异常、数据预处理错误)
  • 检查 loss 计算是否有 log(0)、除 0 或指数溢出(例如 exp() 过大) 3.梯度未裁剪
  • 添加全局梯度裁剪,监控裁剪比例,如果经常被裁剪说明学习率或模型设计需要进一步调整 4.不合适的初始化或归一化
  • 检查是否使用了针对 Transformer 的推荐初始化
  • 在模型中适度增加 LayerNorm 或残差连接位置调整,避免某些路径累积过多放大

3)回滚与恢复训练

一旦出现 loss 爆炸,最稳妥的做法是:

  • 回滚到最近一个健康的 checkpoint
  • 根据排查结果调整超参数(学习率、clip 阈值等)
  • 从该 checkpoint 继续训练,而不是从头再来

从大规模 BC 系统经验看,从“坏掉的 checkpoint”硬撑着继续训往往得不偿失,模型参数已经跑到不靠谱区域,继续训练只会越修越乱。


9.2.4.3 收敛诊断

行为克隆的“收敛”有两层含义: 一是优化意义上的 loss 收敛;二是任务意义上的成功率收敛。二者不必严格一致。

1)典型曲线形态

训练过程中至少应该同时监控以下曲线:

  • 训练集 loss vs step
  • 验证集 loss vs step(按任务分解更好)
  • 部分代表性任务的离线成功率 / 动作预测准确率

常见情形:

+正常收敛:训练 loss 平稳下降,验证 loss 在某个点后进入平台期;对应的任务成功率逐步上升后趋于稳定 +过拟合:训练 loss 持续下降,而验证 loss 与成功率在某个时间点后恶化 +不收敛或欠拟合:训练 loss 长期高位波动或缓慢下降,验证指标几乎无明显改善

针对过拟合,可以使用第 2 章介绍的早停、正则化、数据增强等手段;针对欠拟合,则需考虑加大模型容量、改进结构或收集更多高质量数据。

2)行为克隆的“低 loss 并不等于好策略”

与传统分类略有不同,BC 的损失是局部一步一步的模仿误差,而我们真正关心的是长轨迹上的累计效果。因此有几个易踩的坑:

  • 在数据分布上,模型可以在每一步都“略微偏离”专家动作,但长时间滚动后偏差累积成“完全做错事”
  • 这类偏差在一步预测 loss 中表现不明显,但在闭环 rollout 成功率上极为明显

因此在收敛诊断时,建议:

  • 每隔固定步数,从验证集随机选取若干起始场景,在仿真中执行固定长度的 rollout
  • 对比相同 checkpoint 下的成功率曲线,而不仅仅看 loss 曲线

3)多任务情境下的收敛

在多任务、多机器人场景中,还需要关注任务间干扰

  • 某些任务的性能突然下降,可能是训练后期在别的任务上“学坏了”
  • 可以在日志中记录每个任务的 loss / 成功率,观察是否有任务长期处于“被遗忘”状态

如果出现这种现象,可以考虑:

  • 调整 9.2.2 和 9.2.3 中的采样 / 重加权策略,加强对这些任务的关注
  • 或者在训练后期采用“task-wise fine-tuning”,在保持多任务能力的前提下,对重要任务单独做几轮小学习率微调

【图 9-6 占位:训练稳定性与收敛诊断图。上半部分展示训练 / 验证 loss 曲线,下半部分展示若干任务的成功率随 checkpoint 变化的折线图,用不同颜色表示不同任务。】


到这里,本节从示教轨迹 → 行为克隆训练 → 多机器人多任务采样 → 长尾处理 → 训练稳定性打通了一条完整路径。接下来的 9.3 节会在此基础之上,引入强化学习、自监督和人类反馈等进阶范式,把一个“会模仿”的 VLA 模型逐步打磨成“会试错、会总结”的更强智能体。

本章小结与自测

三行小结

  1. 本章讨论从预训练到微调的完整训练范式。
  2. 重点是数据工程、采样策略和训练稳定性。
  3. 学完后应能制定端到端训练计划并做复盘。

检查题

  1. 用你自己的话总结本章最核心的一个公式/机制。
  2. 给出一个“如果要落地到项目里,你会怎么用”的具体例子。

常见误区

  1. 训练计划缺少阶段目标。
  2. 采样策略和损失权重固定不变。
  3. 只看平均指标,不看长尾任务。

公式到代码(最小示例)

tasks = {"pick": 1200, "open_drawer": 200, "pour": 80}
alpha = 0.5
weights = {k: v ** alpha for k, v in tasks.items()}
z = sum(weights.values())
probs = {k: round(v / z, 4) for k, v in weights.items()}
print(probs)

本章外部参考(集中)

  1. ResearchGate
  2. 科学直通车
  3. NeurIPS 会议论文
  4. robotics-transformer-x.github.io
  5. OpenReview
  6. arXiv
  7. OpenReview
  8. LG AI Research
  9. arXiv
  10. CVF开放获取
  11. SpringerLink
  12. arXiv
  13. 本章其余链接可在正文中按上下文继续查阅。

9.3 进阶训练:RL、自监督与反馈学习

9.3.1 在仿真环境中对 VLA 进行 RL 微调的思路

学习导航

  • 本章主题:9.3.1 在仿真环境中对 VLA 进行 RL 微调的思路
  • 前置知识:建议先完成第 8 章模型架构。
  • 建议用时:97-117 分钟
  • 阅读顺序:先看概念框架,再看公式/代码,最后做自测。

已经有了基于示教 / BC 训练好的 VLA 模型,本节讨论下一步:如何在仿真环境中用强化学习做“有目标的微调”,把模型从“能做”推到“做得更好、更稳、更符合约束”。


9.3.1.1 场景搭建

(1)观测与动作接口对齐 VLA

对 VLA 做 RL 微调的第一前提,是仿真环境暴露出的“观测–动作”接口,与模型训练时的输入输出严格对齐:

+观测侧

  • 视觉:仿真中的相机分辨率、视角、FOV 尽量贴近示教数据(第 7 章中采集的图像);
  • 机器人状态:关节角、末端位姿、夹爪开合状态等按同样的编码方式拼到输入;
  • 语言:每个 episode 开始时给出一条指令,编码为文本 token 或指令 embedding,整个 episode 内保持不变,作为条件。 +动作侧
  • 若前面章节采用离散动作 token(例如 7 个关节的离散速度档位),则仿真环境需要一个“token→物理控制命令”的解码层;
  • 若采用末端 Δ pose / 速度指令,同样需要在环境侧实现将这些增量命令映射到关节控制器。

很多开源 VLA 框架(如 OpenVLA)在代码层面已经实现了这类“统一的 Env wrapper”,既能喂 BC 数据,也能在同样接口上进行 RL 交互,这一点值得参考。(arXiv)

【图片占位:一个方框图,左边是“仿真环境(MuJoCo/Isaac Gym)”,中间是“Env Wrapper(观测打包 + 动作解码)”,右边是“VLA 模型”,箭头表示数据流。】

(2)任务实例与重置逻辑

RL 需要大量 episode,因此要把“任务”刻画得足够清晰:

  • 设计初始随机化:物体摆放位置、姿态、颜色微扰,甚至背景纹理、光照随机化,为后续的 sim2real 泛化铺路(与 7.1.4 呼应);
  • 定义终止条件
    • 成功:例如目标物体进入目标区域、门完全关闭、按钮被按下;
    • 失败:例如超过最大步数、物体掉落桌面之外、发生严重碰撞;
  • 重置逻辑:提供 reset() 函数,能自动将环境回到新的初始随机状态,支撑成千上万次 RL episode。

(3)并行环境与多任务场景

为提高样本效率,通常会采用向量化环境:一次并行运行几十甚至上百个仿真实例,每一步将所有实例的观测批量喂入 VLA,再把动作批量返回,使 GPU / TPU 利用率更高。很多多阶段操作任务的 RL 工作都是在这种并行环境下完成的。(OpenReview)

对于通用 VLA,还需要在同一个仿真框架内注册多个任务(如“抓取并放置”“开门”“拉抽屉”)。不同任务可以通过不同的语言指令区分,也可以通过额外的任务 ID embedding 作为条件输入(与 8.5 中的多任务 VLA 架构呼应)。

【图片占位:多任务仿真场景示意图:同一机器人在不同环境中执行“抓取”“开门”“按钮”等任务,每个环境上方标注一条语言指令。】


9.3.1.2 奖励设计

强化学习阶段的“目标”通过奖励函数体现。对 VLA 而言,奖励不只是“成功/失败”,还会影响动作风格(是否平稳、安全、节能)。

(1)稀疏奖励 vs. 稠密奖励

+稀疏奖励:只有成功时给 +1,其余为 0。实现简单,但是探索难度大; +稠密奖励:在成功奖励之外,增加“离目标的距离缩短多少”“把手接近目标物体多少”之类的中间信号,帮助策略更快学会合理路径。多阶段操作任务往往会设计分阶段形状奖励,例如:

  • 接近阶段:末端到目标物体的距离减少给正奖励;
  • 抓取阶段:夹爪与物体对齐、闭合后仍保持接触给予奖励;
  • 放置阶段:物体在目标区域停稳、没有过大速度时给终止奖励。(OpenReview)

(2)语言条件与任务判定

在 VLA 场景中,奖励必须与语言指令所指定的任务对齐,而不是只看某个几何条件。例如指令是“把红色积木放进蓝色盒子”,奖励不能在机器人把绿色积木放进盒子时给成功信号。常见手法包括:

  • 环境中维护“语义对象 ID”(颜色、类别等),成功判定时检查是否符合指令;
  • 对于多物体任务,可以让环境根据语言解析结果自动选中“目标物体集合”,仅对这些对象的状态计算奖励。

(3)安全与舒适性奖励

机器人 RL 不能只追求成功率,还要考虑安全性与动作质量:

  • 碰撞惩罚:与桌面、大力撞击目标物体时给予负奖励;
  • 动作惩罚:对过大的关节速度、加速度施加 L2 正则,鼓励平滑动作;
  • 力/扭矩正则:约束末端作用力,避免损坏物体。

(4)手工奖励 vs. 学习奖励

手工奖励设计对简单任务足够,但对“整洁、自然、让人放心”这类高层目标很难写成公式,这正是 9.3.3 将要讨论的**“基于人类偏好的奖励模型”**的作用:用 RLHF 思路让模型直接学“人喜欢什么样的行为”,再在仿真中用这个学习到的奖励进行 RL 微调。(NeurIPS论文集)


9.3.1.3 微调流程

(1)总体流程概览

在实践中,一个典型的“BC + RL 微调”流程大致如下:

1.加载预训练 VLA:视觉、语言编码器和决策 Transformer 已经在大规模示教数据上通过 BC 训练好; 2.搭建 RL 仿真环境:如前小节,保证观测–动作接口一致; 3.选定 RL 算法:常用 PPO(近端策略优化)或 SAC 等连续控制方法; 4.确定可训练参数范围

  • 全量更新(高算力场景);
  • 只更新动作解码头或部分层;
  • 使用 LoRA / Adapter 等参数高效微调,仅在少量插入矩阵上做 RL 更新。(arXiv)

【图片占位:RL 微调流程时间轴:左边“BC 预训练模型”,中间“仿真交互采样 + 经验池”,右边“策略更新 + 新策略部署”,循环箭头表示迭代。】

(2)一次 RL 更新的细节

以 PPO 为例,一次更新循环可以分解为:

+采样阶段

  • 在并行环境中用当前 VLA 策略执行若干步,收集序列 \((o_t, a_t, r_t, \log\pi_\theta(a_t|o_t))\);
  • 为了兼顾历史动作和语言条件,把完整的“视觉–语言–动作历史”都打包成 VLA 的输入(与 8.4 中的条件建模保持一致); +优势估计
  • 通过一个值函数头(可以复用 VLA 的 backbone)估计各状态价值 \(V_\theta(o_t)\),再计算优势 \(A_t\); +策略更新
  • 按 PPO 损失对策略参数做若干次梯度下降,同时限制新旧策略的 KL 距离不超过阈值,避免更新过猛导致行为崩溃; +(可选)价值头更新
  • 单独优化值函数,使其更好地拟合长期回报。

(3)保持“模仿锚点”:BC + RL 联合损失

如果只用 RL 损失更新,大模型容易在探索过程中学出“奇怪但高奖励”的动作,偏离人类示范分布过远。一个常用技巧是,在 RL 微调时继续加入少量 BC 损失

\[ \mathcal{L} = \mathcal{L}_{\text{RL}} + \lambda_{\text{BC}}\mathcal{L}_{\text{BC}} , \]

其中 \(\mathcal{L}_{\text{BC}}\) 在随机抽取的一部分示教样本上计算“动作交叉熵”,\(\lambda_{\text{BC}}\) 控制 RL 与模仿之间的平衡。这种做法在多阶段 manipulation 任务中被证明可以显著稳定训练、提高成功率。(OpenReview)

(4)课程式 RL 微调

复杂任务(例如多阶段装配)的 RL 微调往往采用课程学习

  • 第一阶段只在相对简单的子任务上微调(如“接近目标物体”);
  • 达到一定成功率后解锁更难子任务(如“抓取 + 放置”);
  • 最终在完整任务上进行微调。

这类“分阶段微调 + 课程设计”的思想,与多阶段 RL 和层级策略训练的工作是一致的,会在 9.3.4 中与多范式联合调度一起讨论。(科学直通车)


9.3.2 利用未标注视频做未来预测 / 掩码建模等自监督任务

示教数据和 RL 交互数据通常是昂贵的,而机器人在实验室或现实环境中运行时,会自然产生大量“未标注视频”。这一节讨论如何把这些视频变成 VLA 的“自监督教材”,让模型在不额外依赖人工标注的情况下,获取更强的时空表征与物理直觉。


9.3.2.1 未来帧预测

(1)为什么要预测未来?

直观理解:一个懂“物理”的模型,应该能看到几帧视频就猜到“下一帧会发生什么”。未来帧预测就是把这种直觉变成训练目标:

  • 输入:过去若干帧图像 / 视频片段,以及(可选的)动作序列;
  • 输出:下一帧图像,或接下来若干帧的压缩 latent 表示;
  • 损失:像素级 L1 / L2、感知损失(如在预训练视觉 backbone 上的特征差异)等。

大量工作表明,先学会预测视频,再在此基础上学习控制,可以显著提升机器人策略的样本效率,例如“先训练视频预测模型,再训练逆运动学 / 控制模块”的方法。(GitHub)

【图片占位:世界模型示意图:左侧输入若干历史帧和动作,中间是动态模型,右侧是未来帧或未来 latent 的预测。】

(2)显式像素预测 vs. 潜变量预测

  • 显式预测:直接生成下一帧图像,适合展示效果,但易出现模糊、训练开销大;
  • 潜变量预测:只在压缩后的特征空间中预测下一步 latent(例如 VAE / Transformer latent),不必重建像素,效率更高,也更容易与 VLA 的视觉 encoder 对接。

在实际系统中,常见做法是:

  1. 把视频帧送入视觉 backbone(CNN/ViT)得到特征;
  2. 在这些特征上用一个时序模型(RNN / Transformer)做未来 latent 预测;
  3. 只在训练时加一个预测损失,推理时则把预测模块当作辅助的“物理感知”结构,不一定需要显式解码出图像。(arXiv)

(3)与 VLA 的结合方式

未来预测可以与 VLA 结合为:

+预训练阶段

  • 冻结或共享视觉 encoder,在海量机器人或人类操作视频上做未来预测;
  • 训练好的 encoder 再被用作 VLA 的视觉 backbone,比 ImageNet 或 CLIP 的表征在控制任务上更有效。(Proceedings of Machine Learning Research) +微调阶段的辅助头
  • 在 RL 或 BC 训练时,加一个共享 backbone 的“未来 latent 预测头”,用自监督损失稳定视觉表示,减少由于策略变化带来的分布偏移。

9.3.2.2 时间掩码建模

(1)从图像 MAE 到视频 MAE

在第 3 章中已经介绍过掩码图像建模(MAE)的思想:随机遮挡图像的一部分,让模型重建缺失区域,从而学到结构化表征。对于视频和机器人任务,可以把这个思想推广到时间维度:(ResearchGate)

  • 随机遮挡某一帧内部的一部分 patch(空间掩码);
  • 或完全遮掉若干连续帧(时间掩码),要求模型根据前后上下文恢复它们。

(2)时间掩码建模的训练形式

典型的时间掩码建模流程:

  1. 从未标注视频中切出长度为 \(\displaystyle T\) 的序列;
  2. 随机选择若干时间步 \(t_1,\dots,t_k\) 和空间 patch,设为掩码;
  3. 用一个视频 Transformer(或 3D CNN)对完整序列编码;
  4. 在被掩盖的位置上预测对应的像素 / 特征;
  5. 用 MSE 或交叉熵等损失优化。

这类方法已经在通用视频表征学习和 3D 点云表征中被证明对下游机器人任务非常有帮助,如针对点云的 Masked Point Modeling 可以提供强大的 3D 几何感知能力。(CVF开放获取)

(3)扩展到“视觉–动作–语言”的跨模态掩码

在 VLA 中,我们不仅有视频帧,还有动作 token 和语言 token。可以进一步设计跨模态掩码建模任务

  • 掩码某些时间步的动作 token,让模型根据前后观察与语言推测出缺失动作;
  • 掩码部分语言指令(例如物体颜色),逼迫模型从视频中“反向推理”被掩盖信息;
  • 同时对视觉、动作、语言做联合掩码,让模型学会模态间的约束关系。

这种“统一序列的掩码重建”形式,与 8.5.1 中的“视觉–语言–动作统一 Transformer”结构天然契合:把所有模态统一看作 token 序列,在预训练阶段用掩码建模,微调阶段改为输出动作策略。(arXiv)


9.3.2.3 多视角一致

在机器人实验室中,常常会为同一个任务布置多个相机视角(俯视、侧视、腕部手眼相机等)。多视角视频不一定都有人工标注,但非常适合做自监督的几何一致性学习

(1)对比式多视角一致

最直接的思路是:

  • 把同一时间戳的不同视角帧视为“正样本”,不同时间或不同任务的帧视为“负样本”;
  • 通过对比学习(类似 CLIP / SimCLR)拉近正样本的嵌入距离、推远负样本;
  • 最终得到“对多视角不敏感、但对物体和动作语义敏感”的视觉表征。(Proceedings of Machine Learning Research)

(2)基于几何的视角变换任务

如果相机外参已知,可以要求模型完成更强的任务,例如:

  • 给定 A 视角的图像和相机位姿,预测同一时刻 B 视角的图像(视图合成);
  • 在 3D 点云场景中,对某一视角点云做掩码建模,同时要求在另一视角下也能进行一致的重建。

这类方法在 3D 视觉预训练中被证明可以学到与抓取、定位相关的几何信息,对机器人操作尤为重要。(CVF开放获取)

(3)与 VLA 的集成

多视角一致性损失可以作为 VLA 视觉 backbone 的自监督正则:

  • 在预训练阶段,把来自不同视角的图像都送入同一个视觉 encoder;
  • 通过一致性损失约束 encoder 输出,使其在不同视角上形成“同一物体 / 状态”的聚类;
  • 微调到 VLA 任务时,即使部署环境只保留一个视角,模型也会对视点变化更鲁棒。

需要注意的是,视频自监督表征未必自动适合控制任务,一些工作专门分析了“视频预训练分布与控制任务分布不匹配”的问题,强调需要在数据选择和任务设计上谨慎,避免学到与机器人决策无关的特征。(tonyzhaozh.github.io)

【图片占位:多相机围绕操作工作区的俯视示意图,箭头表示多视角图像映射到同一特征空间。】


9.3.3 人类偏好 / 反馈数据在机器人任务中的采集方式

即使有了精心设计的奖励函数和大量自监督预训练,机器人行为仍可能与人类期望有偏差:动作过快、看起来危险、虽然完成任务但“很别扭”等。为此,需要把“人觉得好不好”直接变成数据 —— 这就是机器人领域中的 RLHF / 偏好学习。(IBM)


9.3.3.1 人类偏好标注

(1)基本范式:轨迹片段对比

最经典的偏好标注模式源自“深度强化学习来自人类偏好”(Deep RL from Human Preferences)。(NeurIPS论文集) 核心形式是:

  • 让机器人在仿真或真实环境中执行策略,记录许多 episode;
  • 自动将每条轨迹切成短片段(例如 1–3 秒的视频片);
  • 向标注者展示成对片段(A vs. B),并提供对应指令文本;
  • 让标注者选择“哪个更符合指令 / 更安全 / 更平稳”。

只要能收集到足够多这类“偏好对”,就可以训练奖励模型(见 9.3.3.2)。

【图片占位:标注界面示意图:两段机器人视频并排播放,下方有“更好 / 一样好 / 更差”的选项按钮。】

(2)多种标注形式

除了二选一,还可以设计不同形式的偏好:

+排序标注:一次展示 3–4 个短片段,标注者按好坏排序; +打分标注:对每个片段给 1–5 星的评分,评价“自然度”“安全感”等维度; +文本反馈:允许标注者写一句简短文字,如“太快”“夹爪撞到杯子”,后续可以用语言模型把这些评论转为奖励信号或规则。

实践中,为了减轻标注负担,通常倾向于成对比较 + 简单按钮,这也是当前 RLHF 系统中使用最广的形式。(GitHub)

(3)谁来标注?标注质量如何控制?

  • 机器人领域的偏好标注可以由实验室成员完成,也可以通过众包平台收集非专家标注;
  • 为保证质量,可以:
    • 设计“金标准”片段,偶尔混入标注界面,用来检测标注者是否认真;
    • 计算标注者间一致性,过滤掉与多数人差异极大的标注;
    • 使用简单的界面提示说明标注标准,例如“更接近目标、更少多余动作、更安全”。

9.3.3.2 反馈融入训练

(1)奖励模型:从偏好到标量奖励

偏好数据本身是“谁更好”的相对信息,需要通过**奖励模型(Reward Model)**转成标量奖励。典型做法是:(IntuitionLabs)

  1. 复用 VLA 的视觉–语言–动作 encoder,对每个候选片段输出一个标量 \(R_\phi(\tau)\);
  2. 偏好交叉熵损失训练:
    • 若人类偏好片段 A 胜过 B,则让模型输出的 \(R_\phi(\tau_A)\) 大于 \(R_\phi(\tau_B)\),通过 logistic / softmax 形式拟合“被选中概率”;
  3. 训练完成后,奖励模型即可对任意新轨迹估计“人类偏好程度”。

(2)基于人类奖励的 RL 微调(RLHF for Robotics)

得到奖励模型后,可以像在语言模型 RLHF 中那样,对机器人策略进行第二阶段 RL 微调:

  • 在仿真环境中执行当前策略,记录轨迹;
  • 用奖励模型 \(R_\phi\) 评估轨迹,并将输出作为奖励信号;
  • 使用 PPO / SAC 等算法优化 VLA 策略,使其倾向于产生高奖励轨迹。

有研究系统性分析了 RLHF 和偏好奖励在机器人任务中的作用,表明在缺少精确手工奖励,或手工奖励难以刻画人类主观标准时,这种方式更加灵活。(arXiv)

(3)偏好直接约束策略 / 过滤数据

除了用奖励模型做 RL,还可以更直接地把偏好用于监督或数据过滤:

+偏好加权 BC:在行为克隆损失中对“人类喜爱的轨迹”加大权重,对被判定为糟糕的轨迹降权甚至直接丢弃; +采样时过滤:在从虚拟回放缓冲区采样 RL 数据时,用奖励模型筛选掉奖励明显过低的样本; +动作后验过滤:在策略输出候选动作后,用奖励模型预估短期走势,将明显不符合偏好的动作拒绝掉(类似“安全过滤器”)。

这些方式在工程上往往比全量 RLHF pipeline 更简单,适合资源有限的实验环境。(GitHub)


9.3.3.3 实践难点

在机器人任务中应用人类偏好 / 反馈,常见问题主要集中在以下几点:

(1)反馈成本高、样本效率低

  • 每次偏好标注都需要人观看视频并作出判断,尤其是长任务会极大消耗时间;
  • 解决思路包括:
    • 将轨迹切成 1–3 秒短片段,减少每次评估的认知负担;
    • 对策略变化不大的阶段减少标注频率,只在模型行为发生明显变化时采集新偏好;
    • 使用主动学习策略,从大量候选片段中挑选“最有信息量”的少数来标注。(NeurIPS论文集)

(2)偏好不一致、奖励模型不稳定

不同人对“好行为”的理解不完全一致,甚至同一个人在不同时间的判断也会摇摆,从而造成奖励模型训练的不稳定。解决办法包括:

  • 在奖励模型中加入正则化或先验约束,使其在未充分观测区域不过度自信;
  • 显式建模“不同人群的多样偏好”,例如在 latent 空间对奖励模型的输出做平滑,减小少数极端标注的影响。(IJCAI)

(3)奖励黑客与安全风险

如果奖励模型定义得不够全面,策略可能学会“骗奖励模型”而非真正做好任务,这在 RLHF 文献中被反复强调。(IntuitionLabs)

在机器人场景下的表现形式包括:

  • 看起来“勉强完成任务”但动作很危险,如幅度过大、距离人体过近;
  • 过度追求奖励模型看中的某个指标(如速度),牺牲其它重要方面。

因此在实践中,通常需要将人类偏好奖励与安全硬约束(第 10.3 节)结合:即使奖励模型高分,只要触碰安全界限,动作仍然会被硬件 / 规划层拒绝。


9.3.4 多范式联合训练的调度(先 BC 再 RL,再自监督等组合)

前面几节分别讨论了 BC、RL、自监督、偏好学习等单一范式。本节的重点,是如何把这些范式在时间轴上合理编排,使 VLA 在有限算力和数据下高效成长,而不是“先做一堆预训练,再做一堆 RL”这么粗糙。


9.3.4.1 阶段划分

一种典型的“分阶段”训练 pipeline 可以概括为:

1.阶段 0:自监督 / 多模态预训练

  • 使用海量未标注视频、图文数据做掩码建模、对比学习、未来帧预测等,得到通用视觉–语言–时序表示(对应 9.1 节);(Proceedings of Machine Learning Research) 2.阶段 1:行为克隆(BC)
  • 在机器人示教轨迹上训练 VLA,使其基本能完成各类任务(对应 9.2); 3.阶段 2:RL 微调
  • 在仿真环境或部分真实环境中,根据手工或学习的奖励进一步优化策略,提升成功率和鲁棒性(9.3.1);(OpenReview) 4.阶段 3:基于人类反馈的对齐
  • 通过 RLHF 或偏好加权 BC,使策略更符合人类主观标准(9.3.3)。

每个阶段可以有自己的“收敛判据”:例如自监督阶段看重自监督损失与线性探针性能,BC 阶段关注离线动作预测准确率与离线成功率,RL 阶段关注在线成功率曲线。

【图片占位:时间轴示意图:Stage0 自监督 → Stage1 BC → Stage2 RL → Stage3 RLHF,每个阶段标注输入数据类型和主要目标。】


9.3.4.2 交替训练

现实中,完全“分块训练”往往利用不充分,越来越多的工作采用交替式 / 迭代式训练策略:

(1)BC 与 RL 的交替

常见模式是:

  • 先用 BC 训练一个可用的初始策略;
  • 然后在 RL 微调时,每隔若干更新 iteration 插入一段 BC 训练:
    • 要么在同一个模型上加一个 BC 损失;
    • 要么维护一个“演示缓存”,用较高权重回放演示数据,防止策略严重偏离人类行为。

这类“示教–自我探索–再示教”的循环,在多阶段 manipulation 和层级 RL 方法中已经得到验证。(Proceedings of Machine Learning Research)

(2)RL 与自监督的交替

另一种交替是RL 更新策略,自监督更新表征

  • 当策略收集到新的交互数据后,不仅用它来做 RL,也将视觉帧加入自监督训练(如新的掩码建模、未来预测);
  • 自监督更新后的视觉 backbone 再惠及 RL 策略,使其在新的环境配置上仍能提取有效特征。

这类“自生成数据 + 自监督表征”的循环,有助于缓解“互联网视频分布与机器人真实分布不一致”的问题。(tonyzhaozh.github.io)

(3)在线偏好收集与 RLHF 交替

偏好学习也可以与 RL 交替进行:

  • 在策略更新一定轮次后,采样新的轨迹片段,收集新一轮人类偏好标注;
  • 用新数据微调奖励模型,再用更新后的奖励模型对策略进行 RLHF;
  • 反复迭代,使奖励模型和策略一起逐步逼近人类期望。(arXiv)

9.3.4.3 动态权衡

多范式联合训练的核心困难,是如何动态地平衡各个损失项和训练信号,避免某一范式“压倒性主导”,导致模型遗忘或偏科。

(1)多目标损失的基本形式

一个典型的联合损失可以写成:

\[ \mathcal{L} = \lambda_{\text{BC}}\mathcal{L}_{\text{BC}} + \lambda_{\text{RL}}\mathcal{L}_{\text{RL}} + \lambda_{\text{SSL}}\mathcal{L}_{\text{SSL}} + \lambda_{\text{reg}}\mathcal{L}_{\text{reg}} , \]

其中:

  • \(\mathcal{L}_{\text{BC}}\):来自示教数据的行为克隆损失;
  • \(\mathcal{L}_{\text{RL}}\):策略梯度 / 值函数相关损失;
  • \(\mathcal{L}_{\text{SSL}}\):掩码建模、未来预测、对比学习等自监督损失;
  • \(\mathcal{L}_{\text{reg}}\):正则化 / KL 约束等。

关键在于如何设置并动态调整这些 \(\lambda\)。

(2)基于训练阶段的权重调度

最简单的做法是“手工调度”:

  • 训练早期:\(\lambda_{\text{BC}}\) 较大,强调模仿示范,保证基本可行;
  • 中期:逐步增大 \(\lambda_{\text{RL}}\),鼓励策略在安全范围内探索更优解;
  • 自监督项 \(\lambda_{\text{SSL}}\) 则保持相对稳定,作为“表征稳定器”;
  • 如果观察到策略出现严重偏离人类演示(例如动作风格明显怪异),可以暂时提升 \(\lambda_{\text{BC}}\) 或对策略施加更严格的 KL 正则,使其回到演示附近。(OpenReview)

(3)基于统计信号的自适应权衡

更高级的做法是让系统根据训练信号自动调整权重

  • 使用多任务学习中的“梯度归一化”技巧,根据各损失项的梯度范数动态调整 \(\lambda\),防止其中某个损失的梯度过大或过小;
  • 根据验证集性能(例如离线成功率、在线 RL 成功率)做闭环控制:
    • 若发现 RL 奖励持续上升而偏好评分下降,则适当增加 BC / 偏好相关损失的权重;
    • 反之,如果 BC 准确率很高但 RL 成功率停滞,则增加 RL 损失权重或探索强度。(科学直通车)

(4)“策略先验”视角:BC / 自监督作为正则,而非单独阶段

从更抽象的角度看,BC 和自监督都可以视作对策略施加的“先验”:

  • BC 先验:鼓励策略保持接近人类示范(在策略空间上的 KL 正则或 L2 正则);
  • 自监督先验:鼓励视觉–语言–动作表征保持对结构 / 物理规律的良好刻画;
  • RL 则在这些先验下寻找“在任务目标下最优”的后验策略。

这样理解,多范式联合训练就不再是“几个阶段拼接”,而是一个统一的贝叶斯视角:先用自监督与 BC 捕获强先验,再用 RL 和人类偏好进行后验更新。未来更通用的具身基础模型,很可能会在一个超长时间尺度上不断循环这个过程 —— 永远一边观察世界、一边接受指令、一边在行动中调整自己。

本章小结与自测

三行小结

  1. 本章讨论从预训练到微调的完整训练范式。
  2. 重点是数据工程、采样策略和训练稳定性。
  3. 学完后应能制定端到端训练计划并做复盘。

检查题

  1. 用你自己的话总结本章最核心的一个公式/机制。
  2. 给出一个“如果要落地到项目里,你会怎么用”的具体例子。

常见误区

  1. 训练计划缺少阶段目标。
  2. 采样策略和损失权重固定不变。
  3. 只看平均指标,不看长尾任务。

公式到代码(最小示例)

tasks = {"pick": 1200, "open_drawer": 200, "pour": 80}
alpha = 0.5
weights = {k: v ** alpha for k, v in tasks.items()}
z = sum(weights.values())
probs = {k: round(v / z, 4) for k, v in weights.items()}
print(probs)

本章外部参考(集中)

  1. arXiv
  2. OpenReview
  3. NeurIPS论文集
  4. arXiv
  5. 科学直通车
  6. GitHub
  7. arXiv
  8. Proceedings of Machine Learning Research
  9. ResearchGate
  10. CVF开放获取
  11. tonyzhaozh.github.io
  12. IBM
  13. 本章其余链接可在正文中按上下文继续查阅。

9.4 数据工程与 MLOps

9.4.1 数据版本管理与元数据记录

学习导航

  • 本章主题:9.4.1 数据版本管理与元数据记录
  • 前置知识:建议先完成第 8 章模型架构。
  • 建议用时:92-112 分钟
  • 阅读顺序:先看概念框架,再看公式/代码,最后做自测。

关键图示:VLA MLOps

关键图示:VLA MLOps

在前面几节里,我们更多讨论“如何训练一个好模型”。从本节开始,我们关注的是另一半:如何保证这些训练过程在一年之后还能被别人、甚至是你自己可靠地重现。对具身智能 / VLA 来说,这意味着要能追踪:某一次机器人“翻车”或表现很强,是用的哪一版数据、哪一版代码、哪一版模型。

【图 9-A 占位:一个“训练谱系”示意图——从“数据版本”→“预处理流水线”→“训练配置”→“模型版本”的有向图,用箭头连起来,表示可追溯关系】


9.4.1.1 数据版本

**数据版本(Data Versioning)**的目标,是做到对数据“像对代码那样”进行版本管理:任何一次训练用的是哪一批轨迹、哪一批视频、哪一批语言指令,都可以精确地定位与恢复。(labelyourdata.com)

(1)为什么具身智能特别需要数据版本

对于 VLA / 机器人数据,这个需求比传统 CV/NLP 更强,原因包括:

+数据成本高:真实机器人收集一条轨迹的成本远高于从互联网抓一张图。删错一批、覆盖一批,等于烧了一堆硬件与人力。 +分布变动大:你会不断增加新场景(不同桌面、不同物体)、新机器人(不同自由度)、新任务,数据分布会明显随时间演化。 +安全与合规:一旦机器人产生危险行为,需要追溯“是哪一版数据教的”,版本可追踪是基本前提。(Labellerr)

(2)版本粒度与命名

实践中常见的版本粒度包括:

+数据集级:例如 openx_kit_real_v1.0lab_panda_drawer_v2.3,一版对应一次较大的采集 / 清洗周期。 +子集级:按机器人平台、任务、场景划分子版本,例如:

  • openx_kit_real_v1.0/panda/pick_place/…
  • openx_kit_real_v1.0/franka/drawer_open/… +时间切片:按采集窗口切分,如 2025Q12025-10-week2,便于定位问题到某一批采集活动。

一个简单而实用的做法是:为每个可训练的数据集维护“语义化版本号”(如 SemVer:MAJOR.MINOR.PATCH),并且在任何训练配置里都写明“数据集名称 + 版本号”,而不是模糊的 “latest”。(labelyourdata.com)

(3)实现方式:从手工到专门工具

1.最基础的文件夹+README 做法

优点是门槛低;缺点是难以自动追踪“文件级别”的变化,也难以和实验管理工具自动打通。

  • 每个版本一个独立目录:
    • data/openx/v1.0/…
    • data/openx/v1.1/…
  • data/README.md 中记录各版本的:
    • 创建时间
    • 主要差异(新增任务、修复标注、过滤了哪些异常)
    • 对应的采集脚本 / 仿真配置哈希

2.DVC / lakeFS / Pachyderm 等数据版本工具这类工具本质上是“Git for data”,会为每次数据变更创建“提交(commit)”,存储在对象存储或分布式文件系统中,并保留可回滚的历史。(labelyourdata.com)

在具身智能项目中,一个常见模式是:

+DVC:通过 .dvc 文件将数据的哈希写入 Git 仓库本身,数据本体存到 S3 / OSS / NFS 等;优点是与现有 Git 工作流兼容。 +Pachyderm / lakeFS:直接把数据湖当成“可提交的仓库”,天然支持数据血缘和审计追踪,非常适合大型 MLOps 平台。

  • 原始轨迹(如 ROS bag)和视频存入对象存储;
  • 用 DVC / Pachyderm 对“已清洗 + 对齐 + 标注完成的训练子集”做版本管理;
  • 在训练代码里,仅通过逻辑名字引用数据版本,例如 dataset: openx_kit_real@2.1.0

【图 9-B 占位:对比“文件夹命名式版本管理”与“DVC/Pachyderm 提交式版本管理”的简化示意图】


9.4.1.2 元数据

元数据(Metadata)就是“关于数据的数据”:当你只看一条轨迹的图像与动作时,很难知道它是哪台机器人、在什么场景、执行什么任务、是否成功。元数据承担的就是这个“说明书”的角色。(Medium)

在具身智能场景中,元数据大致可以分为三层:

1.**数据集层元数据(dataset-level)**描述某一版数据集的全局信息,可以用 YAML/JSON manifest 文件表示,例如 openx_kit_real_v1.2.0/meta.yaml

  • 基本信息:名称、版本号、维护者、发布时间、许可证;
  • 适用机器人:支持的机器人型号列表(如 franka_panda, ur5, aloha);
  • 任务分布:每种任务的轨迹数量、成功率大致统计;
  • 采集环境:真实/仿真、主要场景类型(桌面、货架、抽屉)、主要光照条件;
  • 预处理信息:是否进行过时间对齐、下采样、坐标变换、归一化等。 2.**轨迹层元数据(episode-level / trajectory-level)**对于单条轨迹,典型的元数据字段包括:
  • trajectory_id:唯一 ID(通常是 UUID);
  • task_id / task_name:例如 pick_place_blockdrawer_open
  • robot_id 与硬件信息:机械臂型号、末端夹爪类型、固件版本;
  • env_params:仿真时的摩擦系数、物体质量范围,现实中可记录手眼标定版本号;
  • success:任务是否成功,以及失败原因标签(碰撞、抓取失败、超时等);
  • language_instruction_ids:该轨迹所关联的指令文本 ID,便于多语言指令对齐。 3.**样本层元数据(step-level)**对于对时间非常敏感的任务,可以在每个 time step 记录:
  • 时间戳(与图像帧、力觉、关节状态统一);
  • 传感器同步状态(是否丢帧、是否插值);
  • 特殊事件标记(接触发生、抓取闭合、抽屉开启瞬间等)。

良好的元数据设计可以显著简化后续的数据筛选、子集构建与可视化分析,也是构建可靠审计追踪的前提。


9.4.1.3 审计追踪

**审计追踪(Audit Trail)**的目标是:给定某个模型版本或机器人行为,你能一路“倒推”到:

哪次实验 → 用了哪份代码 → 哪份配置 → 哪一版数据 → 哪些预处理步骤。

这在金融、医疗等高监管行业已经是常态,在“会真的撞到人的机器人”上,只会更重要。(VerifyWise)

(1)审计追踪需要记录什么

一个最低限度的“可用审计条目”通常包含:

+模型信息:模型名称、版本号、训练时间、模型文件的哈希(如 SHA256); +代码版本:Git 仓库 URL + commit hash + 分支 / tag; +数据版本:数据集逻辑名 + 数据版本号(或 DVC/Pachyderm commit);(DagsHub) +训练配置:完整的超参数配置文件快照; +实验环境:主机类型、GPU 型号、深度学习框架版本、操作系统等; +责任人:触发训练的用户、触发方式(手动运行 / CI 作业); +关键训练指标:最终验证集指标、训练过程中的异常(NaN / 恶性发散等)。

这些信息通常由实验追踪工具 + 数据版本工具 + Git共同提供,稍后 9.4.2、9.4.3 会展开。

(2)如何落地“可查账”的链路

一个常用的工程实践是:

1.每一次实验 run 都生成一个全局唯一 run_id(例如 2025-10-20_23-15-42_franka_bc_v3 或直接 UUID)。 2. 在实验追踪系统中,以 run_id 为主键,写入:

  • 训练脚本所在的 Git commit;
  • 使用的数据集逻辑名与数据版本号;
  • 完整的配置文件内容(或其哈希);
  • 模型 checkpoint 的存储路径和哈希。
  1. 在部署系统中,同样把 run_id 随模型一起记录下来:
    • 部署日志中记录“当前线上版本 model_deploy_id 对应 run_id”;
    • 机器人执行日志中写入“当前使用模型 run_id”。

这样,当现实世界中发生任何“异常行为”时,你就可以沿着 run_id → 训练记录 → 数据版本 → 原始轨迹 的路径逐步排查。

【图 9-C 占位:一个“从机器人行为日志回溯到数据与代码”的审计链路图,展示 run_id 在各系统间贯穿的示意】


9.4.2 大规模训练的参数配置与日志记录

大规模 VLA / 具身模型训练的一个典型特征是:配置项多到肉眼记不住,日志多到肉眼看不过来。靠“记住我大概怎么设的学习率”已完全不现实,这一节的目标,是给出一套稳健的“配置 + 日志”体系。


9.4.2.1 超参数配置

超参数配置管理的核心要求只有一句话:任何一次训练,必须能够被一份“可复用的配置文件 + 某个代码版本”完全描述。(neptune.ai)

(1)配置内容的分层

建议把配置拆成几个层次(在 YAML / JSON 中体现):

  • data: 数据相关
    • 数据集名与版本号
    • 训练/验证/测试划分方式
    • 数据增强参数(随机裁剪、颜色扰动、域随机化范围等)
  • model: 模型结构
    • 视觉 backbone 类型(ResNet/ViT)及其预训练权重版本
    • 语言模型选择及其冻结/解冻策略
    • 动作解码器结构(自回归 / 并行、token 词表大小等)
  • train: 训练流程
    • 学习率、学习率调度策略
    • batch size、梯度累积步数
    • 优化器种类(AdamW / LAMB 等)、权重衰减
    • 训练轮数、warmup 步数、梯度裁剪阈值
  • rl: 若包含 RL 微调
    • 奖励系数、折扣因子
    • 收集样本的并行环境数
    • 每步更新的采样与更新频率等
  • env: 运行环境
    • GPU 数量、每块卡的 batch
    • 分布式后端(NCCL、Gloo)
    • 混合精度 / 全精度开关
(2)配置系统与工具

简单起步可以用纯 YAML + argparse/JSON 解析。在项目复杂之后,可以考虑使用专门的配置管理库,例如 Hydra、Sacred 等,它们支持:

  • 多个基础配置的组合(例如 robot=franka + task=drawer_open + backbone=vit);
  • 命令行覆写单个字段,同时自动记录覆写内容;
  • 为每次 run 自动生成一个“已展开的完整配置快照”。(GitHub)

这样可以极大降低“忘了某个参数到底是默认值还是手动改过”的风险。

(3)配置与实验追踪的绑定

最后一条实践经验是:把“配置文件快照”当作实验日志的一部分,而不是只写在磁盘上。多数实验管理工具(如 MLflow、Weights & Biases、Neptune 等)都支持将配置作为 JSON/YAML artifact 上传,并可在网页界面中直接浏览和对比不同实验的配置差异。(mlflow.org)


9.4.2.2 日志系统

日志系统(logging)承担两件事:

1.短期内帮助你 debug 与监控训练; 2.长期为你提供可视化对比、审计追踪与论文作图素材

(1)记录什么

典型需要记录的内容包括:(JFrog)

+标量指标

  • 训练 loss、验证 loss;
  • 每个任务的成功率、平均回报;
  • 学习率、梯度范数、参数范数; +直方图 / 分布
  • 模型权重分布、梯度分布(有助于发现梯度消失/爆炸); +图像与视频(具身智能项目非常重要):
  • 训练过程中随机抽取的观察帧、分割结果、注意力热力图;
  • 每若干 steps 的 rollout 视频,展示机器人在仿真 / 现实中的行为; +文本日志
  • 关键阶段的摘要(比如“第 1000 步成功率首次超过 80%”);
  • 异常信息(Loss 爆炸、NaN、训练重启等); +系统指标
  • GPU 利用率、显存占用、CPU/内存压力,方便判断是否受限于 I/O 或算力瓶颈。
(2)工具选择

在工程实践中,常见的组合是:

+基础日志:用 logging 模块写入本地文件(如 train.log),用于快速 grep 与排错; +可视化日志:使用 TensorBoard、MLflow、Weights & Biases、Comet 等工具记录标量、图像和模型参数,支持在网页中对比多次实验的曲线;(mlflow.org) +基础设施监控:对于大型集群训练,引入 Prometheus + Grafana 等监控 GPU/节点状态,避免训练“悄悄挂掉”。

(3)日志频率与成本控制
  • 标量指标(loss、成功率)可以每几步记录一次;
  • 高成本对象(视频、整张图像)的记录频率要谨慎,一般每 N 个 step 或每轮训练只记录少量样本;
  • 日志文件要限制大小并定期归档或上传到对象存储,避免占满磁盘导致训练中断。

【图 9-D 占位:一个典型训练日志仪表盘截图示意——上方是 loss/成功率曲线,下方是若干机器人 rollout 视频缩略图】


9.4.2.3 模型检查点

**模型检查点(checkpoint)**是大规模训练的“存档点”:既是故障恢复的安全带,也是模型选择的样本库。(mlflow.org)

(1)检查点内容

一个“完整”的 checkpoint 通常包含:

  • 模型参数(state_dict);
  • 优化器状态(包括动量、二阶矩估计等);
  • 学习率调度器状态(当前步数、当前学习率);
  • 训练进度(当前 epoch / step);
  • 重要随机数生成器状态(PyTorch、NumPy、Python random 等);
  • 若为 RL 训练,还可包括 replay buffer 片段、归一化参数等。

这样,在断电或 Crash 后,可以尽可能“无损地”恢复训练。

(2)命名与保留策略
  • 建议使用包含run_id + step/epoch + 关键指标的命名方式,例如: ckpt_run1234_step200k_valSucc0.81.pt
  • 一般会保留:
    • 最新 checkpoint(便于继续训练);
    • 若干个基于验证指标排序的“最优 checkpoint”(比如前 3 名);
    • 若干“里程碑 checkpoint”(例如每 100k steps 一份,用于分析训练过程)。

对于大模型,checkpoint 本身可能非常大(数十 GB),这就需要:

  • 使用压缩格式(如 fp16 权重、分 shard 存储);
  • 使用云端 / 对象存储,并在实验日志中记录其路径和哈希,以便后续校验完整性。

【图 9-E 占位:时间轴上按训练 step 排列的一系列 checkpoint 图标,其中部分被标记为“best”/“latest”/“milestone”】


9.4.3 实验管理工具(配置、对比实验、可视化)

如果说 9.4.2 讲的是“你在代码里手动 log 的东西”,那么本节的重点是:把这些日志、配置、结果,用一套统一的实验管理工具“捆绑成一个故事”。这样,无论是自己复盘,还是给别人解释,都能“点开一个实验就看到全貌”。(JFrog)


9.4.3.1 配置管理

配置管理在这里的含义略有扩大:不仅是本地的 YAML 文件,还包括与实验追踪工具的联动。

(1)单一信息源(Single Source of Truth)

建议建立“单一信息源”的理念:

+所有实验都必须由配置文件驱动(即便是简单实验,最好也有一个最小配置);

  • 所有配置变化,要么通过修改配置文件 + Git 提交,要么通过命令行覆写并在实验追踪工具中自动记录;
  • 禁止将关键超参数硬编码在训练脚本中(magic numbers)。
(2)与实验追踪工具结合

以 Sacred、MLflow、Weights & Biases 等为例,常见做法是:

  • main() 函数入口处初始化实验追踪器;
  • 将配置对象完整地 log 进去;
  • 让工具自动为本次 run 建立目录 / 面板,后续的所有日志、checkpoint 路径都挂在这个 run 名下。(mlflow.org)

这样,当你浏览某个 run 时,可以随时查看其完整配置并与其他 run 做逐字段对比。


9.4.3.2 对比实验

**对比实验(experiment comparison)**是整套体系的核心产出之一:你不是单独看一条曲线,而是同时比较“不同设计决策”对训练与最终性能的影响。

(1)变量控制与标签体系

要做可解释的对比实验,必须做到:

  • 每次 run 只改变少数几个超参数(如 backbone 从 ResNet50 换成 ViT-B);
  • 为 run 打上清晰的标签(如 robot=franka, task=drawer, algo=BC, backbone=ViT),方便后续在 UI 中筛选子集对比。

多数实验管理工具都原生支持为 run 添加 key–value 形式的标签,并提供基于标签的筛选与分组统计。(neptune.ai)

(2)典型对比维度(以 VLA 为例)

+架构对比:纯视觉→视觉+语言→完整 VLA 模型,观察各自对多任务成功率的提升; +预训练策略对比:无预训练 vs 纯视觉预训练 vs 视觉-语言对比学习预训练; +训练范式对比:纯 BC vs BC+RL 微调 vs BC+自监督预训练+RL; +数据版本对比dataset_v1.0 vs dataset_v1.1(加入 domain randomization 或新增场景)对泛化性能的影响。

对比实验的结果,既是论文中消融实验(ablation study)的来源,也是工程决策(上线哪个模型版本)的依据。


9.4.3.3 可视化

在具身智能项目中,“看曲线”只是可视化的一部分,**“看机器人行为”**同样重要。

(1)训练过程可视化

常规的训练曲线包括:

  • 全任务平均成功率 vs 训练步数;
  • 按任务拆分的成功率曲线(看是否某些任务明显学得更慢);
  • Loss、梯度范数随时间变化;

实验管理工具(如 MLflow、W&B、TensorBoard 等)都提供实时曲线绘制与导出功能。(mlflow.org)

(2)具身任务特有的可视化

+rollout 视频墙:将不同模型版本在相同任务上的执行视频,拼成网格对比。可以直观看出模型是否学会了更“柔和”的操作、更稳健的路径。 +注意力热力图:对于 Transformer 类模型,可视化语言 token 对视觉 patch 的注意力,观察模型是否“看到了”正确的区域(比如“红色杯子”)。 +状态分布可视化:对于大量轨迹,可以用 PCA / t-SNE 对高维状态表示降维,绘制散点图,直观展示数据覆盖哪些状态区域。

【图 9-F 占位:一页“实验管理 dashboard”示意图,上方为按任务分组的成功率曲线,下方为不同模型版本在同一任务上的视频缩略图对比】


9.4.4 可复现性与代码结构规范

**可复现性(Reproducibility)**是现代机器学习、尤其是具身智能研究的“硬门槛”:如果你自己在不同时间、不同机器上都复现不了结果,那无论模型多 fancy,都很难说服别人相信。(docs.pytorch.org)

本节从三个层面保障复现:随机性控制、代码版本控制、项目结构规范。


9.4.4.1 随机种子控制

深度学习中的“不确定性”来源很多,包括:

  • 参数初始化;
  • 数据打乱 / 数据增强;
  • mini-batch 分配;
  • GPU 并行的非确定性算子;
  • 仿真环境中的随机扰动(域随机化)。

完全做到“比特级稳定”在某些平台上并不现实,但可以做到主导因素可控。(docs.pytorch.org)

(1)基础做法:统一设定随机种子

以 PyTorch 为例,典型的“set_seed” 函数会:

  • 设置 Python random 的种子;
  • 设置 NumPy 的随机种子;
  • 设置 PyTorch CPU/GPU 的随机种子;
  • 配置 DataLoader 的 worker_init_fngenerator,确保数据加载进程也使用可控种子;
  • 配置 cuDNN 的 deterministic / benchmark 选项,避免非确定性算子(以牺牲一些性能为代价)。

注意:PyTorch 官方文档明确指出,即便这样做也不能保证百分百确定性,尤其是在使用某些特定 GPU 算子或多机多卡训练时。你需要根据具体框架版本与硬件情况阅读最新的 reproducibility 指南。(docs.pytorch.org)

(2)仿真与域随机化的种子

在具身智能场景中,还有一层:仿真环境的随机数。例如:

  • 把物体初始位置、摩擦系数、光照等做域随机化;
  • 将传感器噪声随机化。

这里的建议是:

  • 在训练时,保存每次 roll-out 所用的“环境随机种子”或“随机参数向量”,以便复现同一条轨迹;
  • 在分析某一失败案例时,可以用相同环境种子、相同 policy 与相同初始状态复现问题。

9.4.4.2 代码版本控制

代码版本控制的“默认选项”就是 Git,这里不再赘述用法,而是强调与实验、数据、模型的联动。(DagsHub)

(1)每个实验必须绑定一个 Git commit
  • 要求所有训练都在“干净的工作区”上运行(git status 无修改),否则很难知道实际运行的代码究竟是什么;
  • 在运行训练脚本时自动记录当前的 commit hash、分支与 tag;
  • 建议在针对论文或重要结果时,为对应 commit 打上 tag,例如 paper_icra25_v1
(2)Git + 数据 / 模型版本工具

对于大文件(数据与模型权重),有几种常见组合方式:

  • 代码在 Git 中管理,数据用 DVC / Pachyderm 等工具版本化,并在 Git 中记录数据指针;(Medium)
  • 模型参数可以:
    • 存在对象存储,比如 S3 s3://lab-models/vla/openx/v1/run1234.pt
    • 使用模型版本工具(如 MLflow Model Registry)维护“当前生产版本”和历史版本映射。

实验追踪工具一般会同时记录“Git commit + 数据版本 ID + 模型 artifact 路径”,形成完整链路。(mlflow.org)


9.4.4.3 项目结构规范

最后一块,是让整个项目看起来“不像一堆随手写的脚本”。一个良好的项目结构能显著降低新成员上手成本,也让你在一年后回来看代码时不至于完全迷路。(DEV Community)

(1)典型目录结构

以一个中大型 VLA / 机器人项目为例,可以采用类似结构:

project_root/
  configs/          # 所有 YAML/JSON 配置(模型、数据、训练、部署等)
  src/
    data/           # 数据加载与预处理(含 ROS bag/视频解析等)
    models/         # 模型定义(编码器、解码器、VLA 主体架构)
    training/       # 训练循环、loss 计算、分布式封装
    eval/           # 评估脚本与指标实现
    deployment/     # 在线推理、与 ROS/机器人接口的封装
    utils/          # 通用工具函数(日志、seed、配置解析等)
  scripts/
    train_vla.py    # 训练入口脚本
    eval_vla.py     # 离线评估脚本
    collect_data.py # 数据采集或仿真数据生成脚本
  notebooks/
    exploration/    # 数据探索、可视化用 notebook
    reports/        # 生成图表与论文结果的 notebook
  data/
    raw/            # 原始数据(通常不直接进 Git,可由 DVC 管理)
    processed/      # 预处理后用于训练的数据
  experiments/      # 本地运行产生的日志、checkpoint(线上可迁移到远程存储)
  tests/            # 单元测试与简单集成测试
  docs/             # 使用说明、API 文档、设计文档
  requirements.txt / environment.yml / pyproject.toml
  README.md

在机器人项目里,还会额外有:

  • robot/:URDF/XACRO、机械臂/夹爪参数;
  • simulation/:仿真环境配置、场景模型、任务脚本;
  • ros_ws/:若使用 ROS/ROS2,对应的工作空间与包结构。
(2)环境与依赖管理

要实现可复现性,仅仅有源代码远远不够,你还需要描述清楚:

  • Python 依赖版本(requirements.txtpoetry/conda 环境);
  • C/C++/系统依赖(某些仿真库或驱动版本);
  • CUDA / cuDNN / GPU 驱动版本。

一个常见做法是使用 Docker / 容器来封装环境:为每个主要版本的系统构建一个基础镜像(如 vla-base:cuda12.2-py310),在镜像中固定所有依赖版本,再在容器内运行训练与评估脚本。(hackmd.io)


本节从数据、配置、日志、代码和项目结构五个维度,搭建了一套“能查、能复现、能对比”的工程框架。后续第 10 章在讨论部署与评测时,会在此基础上进一步要求:不仅训练过程可复现,线上行为与线下实验之间的差异也要尽量可解释和可控

本章小结与自测

三行小结

  1. 本章讨论从预训练到微调的完整训练范式。
  2. 重点是数据工程、采样策略和训练稳定性。
  3. 学完后应能制定端到端训练计划并做复盘。

检查题

  1. 用你自己的话总结本章最核心的一个公式/机制。
  2. 给出一个“如果要落地到项目里,你会怎么用”的具体例子。

常见误区

  1. 训练计划缺少阶段目标。
  2. 采样策略和损失权重固定不变。
  3. 只看平均指标,不看长尾任务。

公式到代码(最小示例)

tasks = {"pick": 1200, "open_drawer": 200, "pour": 80}
alpha = 0.5
weights = {k: v ** alpha for k, v in tasks.items()}
z = sum(weights.values())
probs = {k: round(v / z, 4) for k, v in weights.items()}
print(probs)

本章外部参考(集中)

  1. labelyourdata.com
  2. Labellerr
  3. Medium
  4. VerifyWise
  5. DagsHub
  6. neptune.ai
  7. GitHub
  8. mlflow.org
  9. JFrog
  10. docs.pytorch.org
  11. Medium
  12. DEV Community
  13. 本章其余链接可在正文中按上下文继续查阅。

10.1 模型集成与系统架构

10.1.1 高层策略(VLA)与低层控制器之间的接口

学习导航

  • 本章主题:10.1.1 高层策略(VLA)与低层控制器之间的接口
  • 前置知识:建议先完成第 8-9 章训练相关内容。
  • 建议用时:110-130 分钟
  • 阅读顺序:先看概念框架,再看公式/代码,最后做自测。

关键图示:部署栈

关键图示:部署栈

这一小节的核心问题是:“大脑”(VLA 模型)怎么跟“肌肉”(伺服控制器、电机驱动)说话? 如果接口设计不好,要么 VLA 决策很聪明但落不了地,要么控制很稳定但能力被严重浪费。

在本书前面,第 6 章已经介绍过机器人运动学和控制基础,这里默认读者已经理解关节空间 / 笛卡尔空间、位置 / 速度 / 力矩控制等概念,本节重点放在系统层面的“约定与协作”

10.1.1.1 接口定义

从工程角度看,“接口”就是一份清晰的契约,约定:

  • VLA 输出什么格式的命令;
  • 低层控制器接受什么、如何解释;
  • 双方在坐标系、单位、频率、约束上的共同假设。

可以把接口分成几类维度来理解。

(1)命令空间:控制“什么”

典型选择包括:

+关节空间命令

  • 目标关节位置:q_target(位置模式)
  • 关节速度:dq_target(速度模式)
  • 关节力矩 / 电流:τ_target(力矩模式) +末端空间命令
  • 绝对位姿:T_target(齐次变换或 position + orientation)
  • 增量位姿:ΔT(Delta Pose)
  • 末端速度 / 扭矩:twist_target(线速度 + 角速度)

在 VLA 场景中,最常见的是“增量式”命令(Δ pose / Δ joint)和末端速度命令: 高层每一帧给出“往桌子中心再移动一点”“手爪再向下 1 cm”,低层控制在高频率下把这些增量平滑跟踪。

(2)坐标系与单位:防止“说的不是一个世界”

接口必须明确:

  • 坐标系:
    • 世界坐标系(map / world)
    • 机器人基座坐标系(base)
    • 工具坐标系(TCP / end-effector)
  • 单位:
    • 位置(m / mm)、角度(rad / degree)、速度(m/s、rad/s)、力矩(N·m)
  • 方向约定:
    • 右手坐标系,旋转正方向的定义等

实际工程中,许多“莫名其妙”的事故(机械臂猛然乱动)都来自单位或坐标系搞错。 因此接口规范里通常会明确列出:

“所有角度使用弧度制;位置在 base 坐标系下,以米为单位;姿态采用四元数 \((w, x, y, z)\) 表示。”

(3)命令约束与安全边界

接口还要规定 VLA绝对不能越界的范围

  • 最大关节速度 / 加速度 / 力矩
  • 允许的工作空间(例如机械臂末端在某个立方体范围内)
  • 力 / 速度安全阈值(用于人机协作)

低层控制器通常在 500 Hz–1 kHz 的频率下运行闭环控制,这样可以对约束做非常快的监控与裁剪。(Robotics Stack Exchange) VLA 在接口层面不必实现全部安全逻辑,但必须承认这些约束,接受低层“削减命令”的权利。

(4)接口形式:消息结构与调用方式

在 ROS/ROS2 等系统中,接口往往体现为:

  • 一条“动作命令”话题(Topic)或 Action:
    • 消息中包含:时间戳、机器人 ID、目标位姿 / 增量、手爪开合状态等;
  • 一条“状态反馈”话题(见 10.1.1.3);
  • 可选服务 / Action:执行复杂技能(如“抓取”原语)。

此处不再重复第 6.4 章中对 ROS 节点 / 话题的概念,而更强调:VLA 作为一个“高层节点”,只要完全遵守这份契约,就可以在不同机器人上复用。

【图 10-1 占位: “VLA–控制器接口契约示意图”。 左侧是 VLA 模型(输入视觉与语言),输出一个结构化动作消息;右侧是控制器堆栈(轨迹生成器 + 伺服 + 驱动),中间用一条“动作命令”消息通道连接,并在旁边标注坐标系、单位、约束等。】

10.1.1.2 时序协调

高层策略与低层控制最大的不一致在于时间尺度

  • 低层伺服:
    • 控制周期典型为 0.5–1 ms(1–2 kHz),对控制稳定性和安全性负责。(Robotics Stack Exchange)
  • 运动规划 / MPC:
  • VLA 决策:
    • 受限于深度模型推理,在边缘 GPU 上通常 5–20 Hz(50–200 ms 一次前向),复杂模型在 CPU 或云端可能更低。

因此,接口必须解决两个问题:

1.命令插值与保持(hold)

  • VLA 每隔 100 ms 输出一条“末端速度 / 增量位姿”;
  • 中间 99 个伺服周期怎么办?
  • 常见做法:
    • 低层控制器对高层给出的目标轨迹做时间插值,生成更高频率的中间参考点;
    • 如果高层暂时没更新,就保持上一条命令(zero-order hold),但要设定超时机制,超时后自动减速或停车。 2.异步与实时性
  • VLA 通常运行在非实时操作系统或 GPU 上,推理时间存在抖动;
  • 低层控制必须在硬实时线程中运行,以保证周期固定。(Open Robotics Discourse)
  • 典型工程做法:
    • 使用共享内存或无锁环形缓冲区传递 VLA 输出;
    • 低层在每个伺服周期读取“最新一条合法命令”,避免受上层抖动影响;
    • VLA 线程则尽可能在软实时约束下完成前向推理。

一个简单的时间线心智模型

  • t = 0 ms:相机采集图像,关节状态打上时间戳;
  • t = 5–10 ms:预处理完成,送入 VLA;
  • t = 15–80 ms:VLA 推理完成,写入共享缓冲;
  • t = 80–100+ ms:低层控制周期读取该命令,插值并输出力矩;
  • 下一帧图像再开始新一轮推理。

接口定义中往往会明确两个参数

  • 高层决策周期 T_policy(如 100 ms);
  • 低层控制周期 T_control(如 1 ms);

设计目标:在 T_policy 这一时间尺度上,系统仍然“像一个闭环控制系统”那样稳定。

10.1.1.3 状态反馈

高层策略要实现闭环,必须获得足够的状态反馈。 但不需要把所有传感器原始数据都推给 VLA,否则带宽和推理负担都无法承受。

可以按“层级”来组织状态反馈:

(1)底层反馈:供控制与安全使用

  • 关节级:q, dq, τ
  • 末端位姿:T_ee
  • 触觉 / 力觉:末端力 / 力矩
  • 安全信号:急停状态、碰撞触发标志

这类反馈在 100–1000 Hz 下被低层控制器使用,VLA 一般只看到被下采样摘要化后的结果,例如每 100 ms 读取一次当前关节角和末端位姿。

(2)高层反馈:供策略与语义决策使用

  • 场景级:当前图像 / 语义分割 / 物体检测结果;
  • 任务级:
    • 当前是否已抓住目标物体;
    • 当前子任务完成度(例如“已清理 4/5 个碗”);
  • 机器人内部状态:
    • 当前执行的子技能名称(grasp / move / place);
    • VLA 上一次输出动作的执行结果(成功 / 被裁剪 / 因碰撞中止等)。

从接口的角度,常见设计是:

  • 输出接口:ActionCommand(高层 → 低层);
  • 输入接口:Observation(低层 + 感知 → 高层);
  • 二者保持结构上的对称性
    • Observation 中也包含与 VLA 动作空间相同的坐标系与单位。

在实现中,Observation 通常会统一打包为 VLA 模型的输入张量(如 stacked images + 状态向量),细节在第 8 章架构部分已经展开;本节更强调一点:Observation 不是“随便往里堆数据”,而是由接口契约约束的、与动作空间配套的反馈。

【图 10-2 占位: “闭环接口与状态反馈示意图”。 画出 VLA、低层控制器、机器人本体三个模块,VLA → Controller 为 ActionCommand 箭头,Controller + Robot 回到 VLA 为 Observation 箭头,其中 Observation 分为“高频硬件反馈”与“低频抽象反馈”两层。】


10.1.2 在线推理框架:从传感器到动作命令的数据流

这一节从“流水线”的角度看 VLA 部署: 一帧图像从相机出来,到机器人真的动起来,中间到底发生了什么?

我们可以把整个在线推理过程拆成三段:

  1. 感知输入管道;
  2. 模型推理;
  3. 执行输出与闭环。

10.1.2.1 感知输入管道

感知输入管道是从物理世界 → 数字表示的过程,目标是为 VLA 提供时间对齐、格式统一、噪声可控的观测。

(1)数据采集与时间戳

  • 摄像头:RGB / RGB-D 图像,分辨率与帧率根据任务选择(如 640×480 @ 30 FPS);
  • 机器人状态:关节角、末端位姿、手爪状态等;
  • 其他传感器:力矩传感器、激光雷达等(若参与决策)。

关键是:所有数据必须带有时间戳,以便在后端进行对齐。 在 ROS2 等中间件里,这通常通过统一时钟(/use_sim_time / 系统时钟)实现。(Open Robotics Discourse)

(2)预处理与同步

预处理常见步骤:

  • 几何校正:去畸变、裁剪无用区域;
  • 尺度调整:缩放到模型接受的分辨率(如 224×224);
  • 归一化:减均值 / 除方差、通道换序 (HWC → CHW);
  • 传感器融合:如相机 + 深度图对齐,拼到同一坐标系中。

时间同步通常有两种方式:

+硬同步:硬件触发多个传感器同时采样; +软同步:在软件层根据时间戳在附近时间窗口内找“最近帧匹配”。

对于 VLA 来说,最关键的不是毫秒级同步,而是语义上的一致: 同一 Observation 中的图像与状态,应对应同一物理时刻,这样 VLA 才能把语言目标、视觉场景和机器人的身体状态联系起来。

(3)数据裁剪与带宽控制

在第 7 章我们讨论了数据采集与存储,这里强调在线推理时,还要考虑:

  • 不必把全分辨率图像送入模型,可以先做 ROI 裁剪(例如只截取桌面区域);
  • 对于云端推理场景,可以在本地做部分编码(JPEG、H.264)或特征提取,再上传;
  • 通过合理压缩减少网络带宽占用。(Medium)

【图 10-3 占位: “感知输入管道数据流示意图”。 从左到右:Camera / Joint States / Force Sensor → 时间戳标注 → 预处理模块(校正、缩放、裁剪)→ 构造 Observation 张量 → 输入到 VLA。】

10.1.2.2 模型推理

这一部分是 VLA 的“前向过程”,但在部署场景下,需要额外关注资源、时间预算和并发

(1)推理拓扑

常见设计是:

  • 一个前端进程负责接收感知数据、构造模型输入;
  • 一个推理进程 / 线程负责加载模型权重,在 GPU / NPU 上执行前向;
  • 中间用队列或共享内存传递 batch。

为了降低延迟,在线 VLA 推理一般采用:

  • batch size = 1(单样本推理),减少排队等待;
  • 固定图像分辨率与张量尺寸,避免频繁重新分配内存。(arXiv)

(2)时间预算与监控

在线控制场景中,每一步决策都有严格的时间上限,例如:

  • 规划 / MPC:50 Hz,即 20 ms 内必须完成一次优化;(Taylor & Francis Online)
  • VLA 决策:假设设定为 10 Hz(100 ms 一次),则必须保证**“图像进来 → 动作输出”**整体在 100 ms 内完成,并留出裕度。

工程上通常会:

  • 记录每次前向推理耗时,统计平均值、最大值;
  • 设定超时策略:
    • 如果单次推理超时,则放弃当前输出,用上一帧动作;
    • 若连续多次超时,系统进入降级模式(减速、停止等),参见 10.3 节安全性讨论。

(3)模型版本与热更新

在实际系统中,VLA 模型可能在云端持续改进,需要热更新到机器人上:

  • 接口约定保持稳定(动作 / 状态格式不变);
  • 使用版本号标记 VLA 模型(v1, v2…);
  • 更新流程:先在仿真 / 数字孪生环境验证,再灰度部署到少量机器人,最后全量更新。(PMC)

这里不展开 MLOps 细节,读者可结合第 9.4 节一起理解。

10.1.2.3 执行输出

VLA 输出的是抽象动作(token 序列 / 连续向量),要变成电机电流,至少还要经过三层处理:

1.动作解码与约束裁剪 2.轨迹生成与平滑 3.发送命令与结果反馈

(1)动作解码与约束裁剪

在第 8.3 节我们讨论了动作 token 的设计,这里从系统角度看:

  • 将模型输出的 token 序列还原为:
    • 末端位姿增量 ΔT;
    • 或关节增量 Δq / 速度命令;
  • 对结果进行: +数值裁剪(clip 到物理允许范围); +安全检查:若某一维度超出设定阈值(例如瞬时速度过大),可直接拒绝并记录日志。

(2)轨迹生成与平滑

直接执行“阶跃命令”容易导致机器人动作生硬甚至振荡,需要在接口下游加入轨迹生成模块

  • 使用插值(线性、三次样条)在两个高层命令之间生成平滑轨迹;
  • 结合动力学约束(最大速度、加速度、jerk)优化轨迹,例如使用 MPC 或时间缩放方法。(arXiv)

轨迹生成模块很像一个“传统规划器的缩小版”,主要目标是把 VLA 的高层意图转化为可执行的、物理可行的微小动作

(3)命令发送与执行结果回流

最后一步是:

  • 将轨迹(或当前目标点)封装为机器人控制器的原生命令:
    • 如 ROS 中的 FollowJointTrajectory / Twist 命令;
  • 底层控制器执行后,每个周期更新当前状态;
  • VLA 模块在下一次前向时,将“上一条命令的实际执行结果”作为 Observation 的一部分,形成真正的闭环(而不是假设输出动作一定被成功执行)。

【图 10-4 占位: “在线推理完整数据流:从传感器到动作命令”。 左侧多源传感器,经预处理后进入 VLA;中间为 VLA 推理模块;右侧是“动作解码 → 轨迹生成 → 控制器 → 机器人”的执行链路,整个流程形成闭环箭头。】


10.1.3 本地推理 vs 云端推理、延迟与带宽问题

在较大的 VLA 模型出现后,“模型放哪里跑”变成一个系统架构的核心设计问题。

+本地推理(on-board / edge):部署在机器人自身或附近的边缘计算节点; +云端推理(cloud):部署在数据中心 GPU 集群; +混合模式(hybrid):高频 / 安全关键逻辑本地,低频 / 重计算逻辑云端。

边缘计算和云机器人(cloud robotics)的文献已经系统讨论过这一问题: 边缘侧提供低延迟和更好的隐私与带宽利用,而云侧提供大规模算力与集中学习能力。(MDPI)

10.1.3.1 本地推理

优势:

1.低延迟、低抖动

  • 数据在本地采集、本地推理,本地执行,链路仅包括设备内部总线和局域通信;
  • 避免公网不稳定带来的长尾延迟,对于抓取、避障等闭环控制至关重要。(MDPI) 2.安全性与可用性
  • 即使断网,机器人仍可执行基础功能;
  • 敏感数据(室内环境、人员信息)可以不出本地网络,降低隐私风险。(Medium) 3.简化带宽需求
  • 不需要持续上传高分辨率视频流,只在必要时上传摘要或统计信息。

劣势:

  • 算力受限:嵌入式 GPU / NPU 的功耗和算力与数据中心差距较大;
  • 模型大小受约束:需要在第 10.4 节中所说的压缩、量化和蒸馏后才能部署;(promwad.com)
  • 维护复杂:大量机器人各自部署模型,版本管理、更新和监控的工程成本较高。

适用场景:

  • 高速移动机器人(无人机、移动底盘)需要 50–100 Hz 以上的决策;(科学直通车)
  • 人机协作、与人近距离接触的机械臂,要求可预测、可控的反应时间;
  • 网络质量不可保证(工厂、家庭 Wi-Fi 环境)的场景。

10.1.3.2 云端推理

优势:

1.强大算力与模型规模

  • 云端可以部署百亿甚至千亿参数的综合 VLA / 多模态模型,提供更强的推理与规划能力;(ResearchGate)
  • 支持复杂的长时规划、多机器人协同调度等。 2.集中管理与协同学习
  • 多台机器人共享云端模型与经验,云端可根据海量日志持续训练 / 微调模型,再统一下发更新;(ResearchGate)
  • 支持跨机器人联合学习、联邦学习等机制。 3.运维便利
  • 模型部署、版本回滚在云端统一进行,对终端设备影响较小。

劣势:

1.延迟与抖动

  • 端到端延迟包括上传数据、队列排队、推理、下行返回;
  • 在复杂网络环境下,延迟和抖动难以控制,很难用在 20 Hz 以上的硬实时控制。(伯克利自动化) 2.网络依赖与故障模式
  • 一旦网络中断或拥塞,云端推理不可用,需要本地有应急策略;
  • 安全关键任务不能完全依赖云端决策。 3.隐私与带宽成本
  • 持续上传高分辨率视频与传感数据消耗大量带宽,并带来隐私与安全风险。(Medium)

适用场景:

  • 决策频率可较低的任务,如高层任务规划、策略生成、任务解释;
  • 机器人队列规模较大,希望在云端做全局调度和优化
  • 对模型能力要求极高,而本地算力不足以运行完整大模型。

10.1.3.3 混合模式

实际工程中,越来越多系统采用云–边–端的混合架构

+端(robot):机器人本体及其嵌入式控制器; +边(edge):靠近机器人部署的边缘服务器 / 网关; +云(cloud):远端数据中心。

FogROS2、混合机器人平台等系统都强调:让低延迟、安全关键决策留在边 / 端,高层策略和学习放在云侧。(伯克利自动化)

典型分工模式:

1.端:基础控制 + 安全保护

  • 1 kHz 伺服控制、碰撞检测、急停逻辑;
  • 简单的动作原语执行(如固定抓取、固定放置);
  • 网络断开时的降级策略(缓慢停止、原地等待)。 2.边:中等规模 VLA 推理 + 局部规划
  • 在边缘 GPU 上运行压缩版 VLA 模型(10–100M 参数级);
  • 执行视觉感知 + 短期动作决策,如“抓起桌上的杯子”;
  • 与端设备通过有线或局域网通信,延迟可控制在 10–20 ms 级别。 3.云:大模型推理 + 全局优化 + 持续学习
  • 接收略下采样的感知数据和执行日志;
  • 给出长期任务分解、策略建议或新模型版本;
  • 不直接参与闭环控制,而是作为策略更新与知识源

【图 10-5 占位: “云–边–端混合架构示意图”。 底部是机器人本体(servo + safety),中间是边缘计算节点(运行轻量 VLA、局部规划),顶部是云端(大模型、策略学习)。箭头标注高频低延迟数据流与低频高层策略流。】


10.1.4 模块化系统:感知、规划、控制与 VLA 的关系

在传统机器人软件架构中,已形成比较成熟的模块划分:感知 → 规划 → 控制。(科学直通车)

VLA 的出现,并不意味着这些模块会被完全替代,而是带来一个新问题:

“VLA 究竟站在什么位置?怎样与已有模块协同,而不是互相掣肘?”

可以把系统想象成一个多层结构:

  • 底层:控制(Control)——电机级控制、轨迹跟踪;
  • 中层:运动规划(Motion Planning)——生成无碰撞轨迹;
  • 上层:任务 / 策略(Task / Policy)——决定做什么、怎么做;
  • 侧向:感知(Perception)——不断提供对环境的理解。

VLA 最自然的位置是**“上层任务 / 策略”的新实现方式**,但它可能渗透到中层与侧向模块。

10.1.4.1 感知模块

前面第 3 章已经详细介绍过视觉感知,这里从系统架构角度总结一下感知模块的角色:

+构建环境的多层表示

  • 几何层:地图、障碍物位置、物体 6D 位姿;
  • 语义层:物体类别、“可放置区域”、“可抓取区域”等语义信息; +提供统一的世界模型接口
  • 规划器与 VLA 不直接操作原始图像,而是使用“物体列表 + 语义标签 + 几何信息”等结构化表示。

在与 VLA 的关系上,有三种典型模式:

1.VLA 直接读取原始感知(端到端)

  • 图像直接送入 VLA 的视觉 backbone;
  • 感知模块仅负责相机标定与基础预处理;
  • 优点:模型可以学到任务相关特征;缺点:可解释性差,难以复用传统感知成果。 2.VLA 读取感知模块的中间表示
  • 感知模块输出目标检测框、物体位姿等;
  • VLA 接收这些结构化信息,结合语言和历史,输出动作;
  • 这是经典模块化与 VLA 的折中:部分端到端,部分符号化 / 结构化。 3.VLA 指导感知模块
  • VLA 可以输出“关注区域”(attention ROI)、“要识别的物体类别”等,反过来驱动感知模块调整算法重点;
  • 特别是在计算资源有限时,VLA 可以作为“感知调度器”。

在系统实现中,感知模块与 VLA 之间同样通过明确的接口契约联系: 例如定义统一的场景图(scene graph)或物体列表结构,包含 ID、类别、位姿、尺寸等信息。

10.1.4.2 规划模块

规划模块是“把目标变成可执行路径”的那一层。 包括:

  • 运动规划(如 RRT / PRM / TrajOpt / MPC);(arXiv)
  • 任务规划(如基于 PDDL 的符号规划,或基于图模型的多步任务分解)。

VLA 与规划模块的关系大致有三种:

1.VLA 取代任务规划,但保留运动规划

  • VLA 接受语言指令与场景信息,输出一系列子目标 / 子任务
    • 例如:“先移开杯子,再擦桌子”;
  • 运动规划器负责把每个子任务转化为无碰撞轨迹;
  • 优点:兼顾 VLA 的通用性和传统规划的可靠性;
  • 缺点:需要为 VLA 设计清晰的“子任务接口”(类似 skill API)。 2.VLA 与规划器并联,互为备选
  • 对于简单场景,传统规划器可以独立完成任务;
  • 对于复杂、模糊目标(如“收拾桌面”)由 VLA 产生更鲁棒的动作序列;
  • 系统可以根据环境状态(拥挤、障碍复杂)、性能指标(时间 / 成功率)动态选择调用哪个规划来源。 3.VLA 内部隐式实现规划能力
  • 对某些简单任务,经过大量示教 + RL,VLA 可以近似实现一个端到端的“学习型规划器”;
  • 例如学会在各种桌面布局下抓取、排序物体,而无需显式调用 RRT;
  • 此时传统规划模块更多作为安全 fallback特殊场景的补充

无论采用哪种模式,工程上一个重要思想是:不要把传统规划直接废掉,而是让它在系统中保留“安全网”的角色——在 VLA 输出的动作可能导致碰撞时,规划器可以给出安全替代方案或拒绝执行。(科学直通车)

10.1.4.3 VLA 集成

综合前几小节,可以把 VLA 在整个模块化系统中的位置总结为三种典型集成模式(它们并不互斥,可以在同一系统中共存):

模式 A:VLA 作为“高层策略模块”

  • 输入:
    • 语言指令;
    • 感知模块输出的场景表示;
    • 机器人当前任务状态;
  • 输出:
    • 子任务序列(调用现有 skill / motion primitive);
    • 或短期子目标(某个物体的目标位姿);
  • 运动规划与低层控制保持原样,只是把原来手工编写的规则 / 状态机换成了 VLA 学到的策略。

这种模式对已有工业系统最友好:只替换最上层的大脑,不动底层“肌肉和脊髓”。

模式 B:VLA 作为“端到端控制策略”,传统模块做安全监护

  • VLA 直接从图像和任务语言输出末端速度 / delta pose;
  • 运动规划器主要做“离线验证”和“在线可行性检查”:
    • 异步预估 VLA 输出在多少步后是否可能碰撞;
    • 一旦检测到危险,修改或打断 VLA 的动作序列;
  • 感知模块仍可以为 VLA 提供高级语义,例如标签、可抓取区域。

很多最近的具身智能系统在实验室阶段采用这种模式:主角是 VLA,但背后仍有一套“影子规划与监控系统”在兜底。(arXiv)

模式 C:VLA 与传统模块高度融合的“混合系统”

  • 部分子任务完全由 VLA 决策(如整理桌面中的抓取顺序);
  • 部分子任务仍由传统模块负责(如全局导航、SLAM 建图);
  • VLA 与传统模块互相调用:
    • VLA 通过 API 请求“移动到某个导航目标”;
    • 规划模块通过 API 请求 VLA 生成“下一步操作建议”。

这种系统往往更复杂,但有更好的可扩展性: 新任务可以通过增加新的技能模块 + 训练 VLA 如何调用这些技能来实现,而不必完全重新训练一个端到端策略。

【图 10-6 占位: “模块化系统中 VLA 的三种集成模式”。 画出三个小图:

  • 左图:VLA 在感知之上、规划之下;
  • 中图:VLA 直接输出控制,规划器作为“安全监护”包裹在旁边;
  • 右图:VLA、感知、规划之间有双向箭头,表示互相调用的混合系统。】

本节从接口、数据流、部署位置和模块化架构四个角度,讨论了 VLA 如何“落地”到真实机器人系统中。 与前面章节的区别在于:不再只关注模型本身,而是把它视为整个机器人软件栈中的一个**“高层智能组件”**,强调与感知、规划、控制以及边缘 / 云基础设施的协同关系。

理解这一层,对后续在第 10.2 节设计评测协议、在第 10.3 节系统性考虑安全与鲁棒性,都是必要的铺垫。

本章小结与自测

三行小结

  1. 本章面向部署与评测,关注系统级约束。
  2. 重点是延迟、安全与鲁棒性设计。
  3. 学完后应能写出可执行的评测协议。

检查题

  1. 用你自己的话总结本章最核心的一个公式/机制。
  2. 给出一个“如果要落地到项目里,你会怎么用”的具体例子。

常见误区

  1. 离线评测通过就直接上机。
  2. 缺少异常回退路径。
  3. 忽略部署时延预算。

公式到代码(最小示例)

runs = [
    {"success": 1, "latency_ms": 82},
    {"success": 0, "latency_ms": 95},
    {"success": 1, "latency_ms": 76},
]
sr = sum(r["success"] for r in runs) / len(runs)
lat = sum(r["latency_ms"] for r in runs) / len(runs)
print({"success_rate": round(sr, 3), "avg_latency": round(lat, 1)})

本章外部参考(集中)

  1. Robotics Stack Exchange
  2. Taylor & Francis Online
  3. Open Robotics Discourse
  4. Medium
  5. arXiv
  6. PMC
  7. MDPI
  8. promwad.com
  9. 科学直通车
  10. ResearchGate
  11. 伯克利自动化
  12. 科学直通车
  13. 本章其余链接可在正文中按上下文继续查阅。

10.2 实验场景与评测协议

10.2.1 单任务 vs 多任务评测场景设计

学习导航

  • 本章主题:10.2.1 单任务 vs 多任务评测场景设计
  • 前置知识:建议先完成第 8-9 章训练相关内容。
  • 建议用时:105-125 分钟
  • 阅读顺序:先看概念框架,再看公式/代码,最后做自测。

关键图示:评测协议

关键图示:评测协议

本节讨论“评什么”的问题:在真实机器人或高保真仿真上,如何设计合理的评测场景,既能看清模型长处,也能暴露其短板。你可以把它理解为给 VLA 模型设计“期末考试卷子”:是只考一道大题,还是一整套综合题,还是一个完整项目。


10.2.1.1 单任务评测

(1)概念与适用场景

单任务评测指:在固定任务定义下(例如“抓取桌面上的杯子并放进盒子”),对同一个模型进行多次重复试验,只改变一些随机因素(初始位姿、噪声等)。这类评测特别适合:

  • 新模型/新模块的功能验证与调试
  • 与传统方法(经典规划器、手工策略)的对比基准
  • 分析 VLA 系统中某一环节(视觉、语言或动作解码)的瓶颈

(2)任务要素的形式化

设计单任务时,建议写成一个清晰的“任务规范”,包括:

+初始条件

  • 机器人初始状态(关节角、底盘位置等);
  • 环境状态(物体摆放、门是开是关等); +允许的动作空间:例如只允许关节速度命令,不允许直接 teleop 接管; +终止条件
  • 成功:目标物体到达目标集合内(位置、姿态、接触关系满足容差);
  • 失败:超时、碰撞、明显离题(执行到安全区域外)等; +约束与安全规则:禁止进入某些区域、力矩/速度上限等。

这些信息在后续定义成功率、完成时间等指标时会反复用到。

(3)随机性与重复次数

单任务评测并不意味着“场景完全不变”。通常为了避免模型记住某个特定初始状态,需要:

  • 在合理范围内随机化初始条件(例如物体位置在一个矩形区域内均匀采样);
  • 对每个策略至少运行几十到上百次实验,估计成功率及其置信区间。

在 embodied AI 的导航与操作基准中,普遍采用“同一任务定义,多随机种子反复试验”的方式汇总统计量。(ResearchGate)

(4)示意图建议

[图 10.2-1:单任务评测示意图。同一张桌面上,杯子初始位置在一个小区域内随机采样,机器人多次尝试抓取并放入盒子,用不同颜色轨迹表示不同试验的手爪路径。]


10.2.1.2 多任务评测

单任务只能回答“这个模型是不是在这一件事上很强”;而 VLA 的目标,是在一套任务家族上表现稳定。多任务评测就是给模型一整张“卷子”。

(1)任务集设计

多任务评测中,通常需要构造一个任务集合

  • 类型多样:包含抓取、放置、推拉、开关、开门、导航到目标等不同操作类型;
  • 难度分层:从简单(单步动作)到复杂(多步骤组合),方便分析模型在不同难度上的退化情况;
  • 语义多样:任务指令覆盖不同对象、属性(颜色、大小)和空间关系。

例如 RLBench、ProcTHOR 等框架中,都提供了几十甚至上百种操作/导航子任务,用于训练和评测多任务策略。(OpenReview)

(2)采样与汇总方式

常见的做法:

+均匀采样:每个任务在评测时被选择的概率相同,避免模型“刷分”只靠擅长的任务拉高平均成功率; +分任务统计

  • 每个任务单独统计成功率/时间等;
  • 再计算宏平均(每任务等权)与微平均(每条轨迹等权)两个指标。

(3)指令与场景的联动

在多任务设置中,任务通常通过自然语言指令体现:

  • 一种做法:每条指令隐含任务 ID(如 “open the drawer” 对应开抽屉任务);
  • 更通用的做法:同一任务可以有多种自然表述,后面 10.2.3.3 会专门讨论新指令泛化。

(4)示意图建议

[图 10.2-2:多任务评测任务集示意图。横轴为不同任务(抓取、开门、推拉等),纵轴为评测指标(成功率、时间),通过柱状图展示同一 VLA 模型在多任务上的性能分布。]


10.2.1.3 复杂场景

复杂场景可以理解为“把多个任务拼成一条剧情线”。它更接近真实应用中的长程任务,例如“从厨房拿一瓶水端到客厅桌上”。

(1)多阶段任务与子目标

复杂场景通常由多个子任务顺序构成:

  1. 导航到冰箱;
  2. 打开冰箱门;
  3. 找到并抓起水瓶;
  4. 关闭冰箱门;
  5. 导航到客厅桌子旁;
  6. 放下水瓶。

评测时既要记录整体任务是否完成,也可以记录每个子任务的成功率、平均用时,形成一个“阶段成绩单”,帮助分析模型在哪个环节失误最多。许多交互式 3D 仿真平台(如 iGibson、AI2-THOR)都支持这类长程交互场景,并以阶段式任务评估复杂行为。(Jim Fan)

(2)动态环境与多主体

复杂场景中还可以引入:

+动态环境:人类或其他机器人在场景中移动,导致遮挡与动态障碍; +人机交互:人在任务中插入新指令、纠偏,要求模型在运行中理解语言变化; +多机器人协作:多个机器人共享环境,相互避障甚至协同完成任务。

这类设置更接近现实,但评测协议也更复杂,往往需要单独章节(可与第 12 章“多机器人协作与群体智能”呼应)。

(3)示意图建议

[图 10.2-3:复杂场景任务流程图。用流程图展示从“接收任务指令”到“多阶段执行”的状态转移,每个节点标注对应的子任务与可能失败点。]


10.2.2 成功率、完成时间、路径质量等指标

有了任务场景,还需要量尺来比较不同方法。本节给出几类在 embodied AI 中高度通用的指标,并解释其计算方式与优缺点。


10.2.2.1 成功率(Success Rate, SR)

(1)定义与计算公式

对于第 \(\displaystyle i\) 次试验(episode),定义一个二值变量 \(S_i\):

  • 若在最大步数/时间内满足任务成功条件,则 \(S_i = 1\);
  • 否则 \(S_i = 0\)。

在总共 \(\displaystyle N\) 次试验中,成功率定义为

\[ \text{SR} = \frac{1}{N} \sum_{i=1}^{N} S_i. \]

这一定义被大量导航和操作基准采用,例如 Habitat、ObjectNav 等任务都是以成功率作为首要指标。(Vladlen Koltun)

(2)成功条件的设计

关键在于:“什么算成功?”

  • 导航任务:
    • 目标条件通常是机器人停止时与目标位置的距离小于某阈值(例如 0.2–0.5 m),且无碰撞。(ORCA)
  • 操作任务:
    • 物体到达目标区域且姿态满足要求(如杯子底面在桌面上、未倾倒);
    • 抓取任务可用“物体离开原位并稳定在夹爪或目标容器内”作为成功。(themoonlight.io)

当任务更复杂时,可以采用层级成功

  • “完全成功”:所有子目标都完成;
  • “部分成功”:完成部分子目标,例如仅成功抓取但未成功放置。

在报告结果时,应尽量区分这两类,以免把“半拉子工程”算作成功。

(3)不确定性与置信区间

由于评测次数有限,SR 本身有统计波动。建议:

  • 报告 SR 的同时给出置信区间(例如 95% CI,可用二项分布或正态近似估计);
  • 在比较不同方法时,注意统计显著性,而非只看小数点后三位的差异。

10.2.2.2 完成时间(Completion Time)

成功率告诉我们“能不能做成”,完成时间则回答“做得快不快”。

(1)定义与测量方式

对于一次成功的试验,记录从 episode 开始到满足成功条件的时间 \(T_i\):

  • 在仿真中通常用步数仿真时间
  • 在真实机器人中用壁钟时间(秒)更直观。

可以报告:

  • 平均完成时间 \(\bar{T}\);
  • 中位数时间(更鲁棒于极端慢的样本);
  • 完成时间分布的直方图或 CDF。

如果某次试验失败或超时,一般将其排除在平均完成时间之外,同时在 SR 中体现失败。

(2)效率相关复合指标

类似导航基准提出的 SPL(Success weighted by Path Length),也可以构造按时间加权的成功指标

\[ \text{SWT} = \frac{1}{N} \sum_{i=1}^{N} S_i \cdot \frac{T_i^*}{\max(T_i, T_i^*)}, \]

其中 \(T^{*}_i\) 是在该场景下的最短可行完成功能时间(例如用规划器或人工脚本计算)。这样既鼓励成功,又鼓励接近最优时间。类似思想已在多种导航与社交机器人评测中使用。(EvalAI)

(3)安全与舒适度的权衡

完成时间越短不总是越好:

  • 机器人过快动作可能导致安全风险(更容易碰撞);
  • 在人机共存场景,动作过快可能降低人的舒适度。(ACM Digital Library)

因此在报告中通常:

  • 把完成时间作为次级指标,在相近成功率的策略之间比较;
  • 同时报告碰撞率、最小安全距离等指标。

(4)示意图建议

[图 10.2-4:完成时间分布示意图。横轴是完成时间,纵轴是累计比例(CDF),对比两种策略的曲线,一条整体偏左代表更快完成。]


10.2.2.3 路径 / 动作质量

即使成功、时间也合理,机器人“走得好不好”仍然是一个维度。这里主要关注轨迹质量

(1)路径长度与 SPL

对导航与末端执行器轨迹,可以定义:

+路径长度\(L_i\):轨迹上相邻位置的欧氏距离累加; +最短路径长度\(L^{*}_i\):由规划器或图搜索得到的最短可行路径。

SPL(Success weighted by Path Length)定义为:(Vladlen Koltun)

\[ \text{SPL} = \frac{1}{N} \sum_{i=1}^{N} S_i \cdot \frac{L^{*}_i}{\max(L_i, L^{*}_i)}. \]

  • 若成功且走的是最短路径,则该项为 1;
  • 若路径更长,则按比例衰减;
  • 若失败,则该项为 0。

SPL 在多种 embodied navigation 基准中已成为标准指标,也可以自然扩展到机械臂末端路径。

(2)轨迹平滑度与控制质量

从控制角度看,平滑、连贯的轨迹有利于减少机械冲击和能耗,也更接近人类动作习惯。常见做法:

  • 使用关节空间轨迹平滑度指标
    • 例如总加速度或总 jerk(加速度的导数) \(\sum_t |\ddot{q}_t|^2\), \(\sum_t |\dddot{q}_t|^2\);
  • 统计速度/加速度的极值:越少“骤停-急动”越好;
  • 测量碰撞次数、接触过载等安全相关指标。(ResearchGate)

在最新的机器人策略评测工作中,常将成功率、时间、轨迹平滑度等组合为一组指标,全面刻画策略质量。(ResearchGate)

(3)能耗与硬件友好度

对真实机器人来说,微小的轨迹差异可能意味着非常不同的能耗与磨损

  • 可以对每个关节积分 \(\int \tau_t^2 dt\) 或 \(\int |\tau_t \cdot \dot{q}_t| dt\) 作为能量 proxy;
  • 长期评测中,能耗更低的策略意味着电池续航、材料寿命更好。

(4)示意图建议

[图 10.2-5:路径质量对比示意图。展示同一导航任务中两条路径:一条接近最短路径且平滑,另一条绕行、频繁转向;同时给出相应的路径长度与 SPL 指标。]


10.2.3 泛化评测:新物体、新布局、新任务指令

VLA 模型真正有价值的地方,在于泛化:训练时见过的只是有限案例,部署时面对的是无穷变化。本节从三个维度构造“看新东西”的考题。

很多 embodied AI 基准(Habitat、iGibson 等)已经形成了一套惯例:将训练和测试在对象类别、场景布局和指令分布上进行明确分离。(ResearchGate)


10.2.3.1 新物体(Unseen Objects)

(1)实例级 vs 类别级泛化

+实例级泛化

  • 训练见过“红色杯子 A、B、C”,测试时出现“红色杯子 D”;
  • 类别相同、属性相似,但几何细节不同; +类别级泛化
  • 训练阶段从未出现“剪刀”,测试时间接收到指令“把剪刀放进抽屉”;
  • 要求模型基于语言/视觉语义理解新类别。

前者更多依赖于视觉“类内泛化”能力,后者则依赖于大模型对语言与世界知识的掌握,在 VLA 中越来越重要。(ResearchGate)

(2)物理属性变化

除了外观形状,物体的质量、摩擦系数、刚度等物理属性变化同样重要:

  • 对抓取任务,可通过改变物体重量、表面材料(光滑/粗糙)来构造测试集;
  • 对推拉任务,可改变地面摩擦系数、物体底面材料。

相关评测设计在近期操作与模拟综述中被反复强调,用于检验策略对物理不确定性的鲁棒性。(ResearchGate)

(3)评测协议建议

  • 明确列出“训练物体集合”和“测试物体集合”;
  • 报告在仅使用训练物体完全替换为新物体两种条件下的成功率对比;
  • 若使用语言描述新物体(“把刀状物体放入盒子”),可额外考查模型的知识迁移能力。

[图 10.2-6:新物体泛化示意图。一列为训练中见过的杯子/碗/瓶子,另一列为测试时出现的新款式,通过箭头标注“类别已见/类别未见”。]


10.2.3.2 新布局(Unseen Layouts / Scenes)

(1)场景级拆分

在导航类 embodied AI 中,已经很常见的做法是:按场景 ID划分训练/验证/测试集合,例如 HM3D、Habitat 中的“训练房屋”和“测试房屋”完全不同。(datasets-benchmarks-proceedings.neurips.cc)

对操作任务也可以类似处理:

  • 训练时在若干桌面/台面布局上采集数据;
  • 测试时更换家具布局、桌子高度、物体摆放模式。

(2)静态 vs 动态布局变化

+静态布局泛化:场景几何结构不同,但在一个 episode 内不变化; +动态布局泛化:在任务执行过程中,其他实体(人类、机器人)在环境中移动,导致布局实时改变。

前者主要评估视觉与策略对位置关系变化的适应,后者进一步检验策略的在线感知与 replanning 能力。(OpenReview)

(3)难度控制与分层

完全随机生成新布局可能导致难度分布失控,评测时应注意:

  • 使用与训练集类似复杂度的测试场景(房间大小、障碍物数量等参数尽量匹配);
  • 或者明确划出“简单/中等/困难”三档场景,分别报告泛化性能。

[图 10.2-7:新布局泛化示意图。左侧为训练时使用的几个房间平面图,右侧为测试时的不同房间布局,标注门、障碍物和目标位置变化。]


10.2.3.3 新指令(Unseen Instructions)

对于 VLA 模型,语言是“任务接口”。单纯在训练 seen 指令上表现良好,不能代表真正理解语言。

(1)表达多样性:同义改写与风格变化

最基础的一类测试是:

  • 训练指令: “把红色杯子放进盒子里。”
  • 测试指令:
    • “请把红色的杯子放到盒子里面。”
    • “把那个红色杯子移到盒子中。”
    • “能帮我把红杯放进盒子吗?”

也可以引入口语化、礼貌句、倒装句等风格变化,考查模型是否真正依赖语义,而非死记模板。

(2)组合与逻辑结构泛化

更进一层的,是组合式新指令

  • 训练时只见过单步指令:“拿起 A”、“放下 A”;
  • 测试时出现组合:“先拿起 A 放到 B 上,再把 C 放到 A 左边”。

这要求模型具备一定的任务分解与时序逻辑理解能力,而不仅是逐句映射为动作。有关基准通常会构造“seen 组合”和“unseen 组合”两个分布,对比泛化性能。(ResearchGate)

(3)评测注意点

  • 尽量将词表覆盖控制在训练/测试交集大,但在句法与组合上保持差异;
  • 在报告结果时,区分:
    • 语义等价改写上的泛化;
    • 真正新组合(未见过的步骤序列)上的泛化。

[图 10.2-8:新指令泛化示意图。用一个图示展示:训练阶段只有简单单步指令,测试阶段出现“先……再……”的多步指令,并用箭头表示模型需要在内部拆解成两个子任务。]


10.2.4 跨机器人迁移能力评估

通用 VLA 的一个重要愿景,是“一个大脑,多种身体”:同一模型在不同机械臂、移动平台甚至多足机器人上工作。如何评估这种跨机器人(跨具身)迁移能力,是近几年出现的一个新问题。(Open X-Embodiment)


10.2.4.1 模型迁移测试

(1)基本设定:train-on-A, test-on-B

最经典的跨具身评测方式是:

  • 训练阶段:主要在机器人 A(或若干机器人)上收集数据并训练模型;
  • 测试阶段:不再改变模型参数,直接部署到机器人 B 上执行相同或相似任务。

例如 Open X-Embodiment、AnyBody 等工作中,采用“留一机器人(或类)不训练,只在其上评测”的方式,系统性研究跨具身性能。(Robot Learning)

评价时通常:

  • 报告 A 上的基准性能(例如 SR_A);
  • 报告 B 上的零样本性能(SR_B-zero-shot);
  • 比较两者差值或比值。

(2)插值 vs 外推场景

最新的 cross-embodiment 基准会细分:(arXiv)

+插值(interpolation)

  • 测试机器人与训练机器人在连杆结构、自由度上相似,只是参数略有变化(长度、质量等); +外推(extrapolation)
  • 测试机器人有不同的连杆拓扑或完全不同形态(例如从 6-DOF 机械臂迁移到 7-DOF,甚至从轮式移动平台迁移到腿足机器人)。

在报告结果时,区分插值/外推有助于理解模型在“细微差异”与“形态突变”上的表现。

(3)少样本适应(few-shot adaptation)

更实际的设定是:允许在新机器人 B 上收集少量数据进行微调或校准:

  • 给定 K 条 B 的示教轨迹,用 BC 或 LoRA 微调 VLA;
  • 记录成功率随 K 的变化曲线(sample-efficiency curve);
  • 比较不同模型的适应速度

这一 protocol 在跨具身 RL 与 imitation 工作中越来越常见,用于衡量“从 0 到可用”所需的示例数量。(NeurIPS 论文集)

[图 10.2-9:跨机器人迁移测试示意图。左侧是训练时使用的机器人 A(例如 UR5),右侧是测试机器人 B(例如 Franka Panda),中间用箭头表示“零样本迁移”和“少样本适应”的两种路径。]


10.2.4.2 适应性指标

光看“能不能迁移”还不够,还要定量回答“迁移得有多好、多快、多安全”。

(1)性能保持率与性能跌落

可以定义:

+性能保持率

\[ R_{\text{keep}} = \frac{\text{SR}_B}{\text{SR}_A} \]

  • 性能跌落

    \[ \Delta_{\text{SR}} = \text{SR}_A - \text{SR}_B. \]

其中 SR_A 是在源机器人 A 上的成功率,SR_B 是零样本或适应后的成功率。

(2)适应速度与样本效率

对少样本微调情形,可用:

  • 达到某目标成功率(如恢复到 SR_A 的 80%)所需的轨迹数量交互步数
  • 成功率随训练轮次的曲线下面积(AUC),衡量整体学习效率。

在 RL 与 cross-embodiment 基准中,通常会报告“在固定预算内的最终性能”与“达到某性能门槛所需时间”两个数字。(NeurIPS 论文集)

(3)安全与稳定性指标

迁移过程中,策略可能产生不少失败甚至危险动作,因此还需统计:

  • 适应期内的碰撞率、严重错误次数;
  • 每 episode 的最大关节超限程度、力矩超限次数;(ResearchGate)
  • 在现实机器人上,可额外统计急停触发次数等。

这些指标可以看作“迁移过程中付出的代价”,与最终性能共同构成迁移能力的评估。

[图 10.2-10:适应性曲线示意图。横轴为在目标机器人上使用的示教轨迹数量,纵轴为成功率,比较两个模型的上升速度,并在图中标注达到 80% 性能所需的样本点。]


10.2.4.3 差异因素

最后,需要认识到:跨机器人迁移难度高度依赖于机器人之间的差异。没有理解这些差异,仅凭一个“平均成功率”会非常误导。

(1)运动学结构差异

  • 自由度数量不同(6-DOF vs 7-DOF);
  • 关节类型不同(转动、伸缩关节);
  • 机械臂关节排列不同,导致某些方向的工作空间更受限。

例如,AnyBody 与 PEAC 等基准会精确记录各机器人连杆拓扑,并区分“同类结构的插值迁移”和“跨拓扑外推迁移”。(arXiv)

(2)动力学与控制接口差异

  • 质量分布、惯量、摩擦、关节刚度不同;
  • 最大速度/加速度、扭矩上限不同;
  • 控制接口不同:有的接受关节位置目标,有的接受速度或力矩命令,还有的只有末端空间控制接口。

这会直接影响“相同动作 token”在不同机器人上的实际效果,因此许多跨具身方法会显式引入具身描述向量或“universal action”中间表示,减弱这种差异的影响。(CVF开放获取)

(3)感知与几何差异

  • 相机位置与视野不同(头顶相机 vs 末端相机 vs 外部相机);
  • 分辨率、噪声水平、深度传感器种类不同;
  • 末端执行器几何差异(两指夹爪、三指夹爪、吸盘)。

这些都会改变“看到的世界”和“能做的动作”。跨机器人评测时,建议:

  • 在基准说明中清晰给出各机器人传感器配置与末端几何;
  • 如果使用统一的视觉输入(例如场景固定相机),要说明这是为了隔离感知差异,只考察控制迁移。

[图 10.2-11:差异因素示意图。在一张图中列出几个典型机器人(移动底盘、7 自由度机械臂、双臂系统),分别标注其自由度、相机安装位置、末端执行器类型,用箭头指示它们在任务空间中的差异。]


本节从场景设计指标体系,再到泛化维度跨具身迁移,构成了 VLA 系统“如何考试”的整体框架。前面的训练范式(第 9 章)更多回答“如何教会学生”,而本节则搭好了“如何判卷”的标准。接下来在 10.3 节,我们会进一步关注安全性与鲁棒性,讨论当模型做错事、环境出问题时,系统应该如何设计防护与降级机制。

本章小结与自测

三行小结

  1. 本章面向部署与评测,关注系统级约束。
  2. 重点是延迟、安全与鲁棒性设计。
  3. 学完后应能写出可执行的评测协议。

检查题

  1. 用你自己的话总结本章最核心的一个公式/机制。
  2. 给出一个“如果要落地到项目里,你会怎么用”的具体例子。

常见误区

  1. 离线评测通过就直接上机。
  2. 缺少异常回退路径。
  3. 忽略部署时延预算。

公式到代码(最小示例)

runs = [
    {"success": 1, "latency_ms": 82},
    {"success": 0, "latency_ms": 95},
    {"success": 1, "latency_ms": 76},
]
sr = sum(r["success"] for r in runs) / len(runs)
lat = sum(r["latency_ms"] for r in runs) / len(runs)
print({"success_rate": round(sr, 3), "avg_latency": round(lat, 1)})

本章外部参考(集中)

  1. ResearchGate
  2. OpenReview
  3. Jim Fan
  4. Vladlen Koltun
  5. ORCA
  6. themoonlight.io
  7. EvalAI
  8. ACM Digital Library
  9. ResearchGate
  10. ResearchGate
  11. datasets-benchmarks-proceedings.neurips.cc
  12. Open X-Embodiment
  13. 本章其余链接可在正文中按上下文继续查阅。

10.3 安全性与鲁棒性

10.3.1 动作约束与可行性检查

学习导航

  • 本章主题:10.3.1 动作约束与可行性检查
  • 前置知识:建议先完成第 8-9 章训练相关内容。
  • 建议用时:56-76 分钟
  • 阅读顺序:先看概念框架,再看公式/代码,最后做自测。

在一个由 VLA 驱动的机器人系统中,高层模型生成的是“倾向动作”(preferred action),而真正送到电机上的控制信号必须经过一层“安全外壳(safety shell)”。这一层的核心工作就是:给动作加上清晰的约束,并在执行前做可行性检查,必要时进行纠正或拒绝。

【图片占位:一张“VLA 输出 → 动作约束与可行性检查模块 → 机器人控制器”的框图,标出各类约束(关节、速度、碰撞、安全区等)】

10.3.1.1 动作约束

“动作约束”可以理解为:在机器人的状态 \(\displaystyle x\) 与控制输入 \(\displaystyle u\) 上定义的一组条件

\[ g_i(x, u) \le 0,\quad h_j(x, u) = 0 \]

只要不满足,就视为“不安全”或“不可执行”。

可以从几个层次来理解这些约束:

1.本体级约束(robot-level constraints) 来自机械结构和驱动能力,是最基础、最“硬”的约束: +关节位置范围:每个关节有最小 / 最大角度(或伸缩量),越界可能撞到机体或损坏丝杠。 +速度与加速度上限:限制关节运动的最大速度、加速度和加加速度(jerk),避免机械冲击和超出驱动能力。 +力 / 力矩上限:对末端执行器或者各关节输出的力矩做限制,协作机器人标准(如 ISO 10218 与 ISO/TS 15066)会对与人接触时的最大力、最大压力给出建议范围,以降低夹伤、撞击风险。(国际标准化组织) 2.工作空间与区域约束(workspace & zone constraints) +可达工作空间:根据机械结构,给出末端可达的体积区域;超出区域的目标位姿应当直接判定为不可达。 +禁入区域(keep-out zones):例如人工作区域、精密仪器区域、危险设备附近;在规划时强制不生成穿越这些区域的轨迹。 +速度分区:靠近人或狭窄环境时自动切换到低速区域;部分协作机器人控制器就是通过“安全区 + 限速”配置来满足标准。(sick.com) 3.任务级约束(task-level constraints)

  • 姿态约束:比如端执行器抓杯子时要保持基本竖直,不让液体洒出;装配时保持插销与孔大致同轴。
  • 接触约束:插入、打磨、擦拭等任务要求接触力在一定范围内,不得对工件或环境施加过大压力。
  • 序列约束:某些动作必须在前置条件满足后才能执行(例如“只有抓取成功,才允许移动到远处放置”),可以在高层任务图或时序逻辑中显式表达。(h2r.cs.brown.edu) 4.舒适与质量约束(soft constraints) 这些约束不是“违法就报错停机”,而是进入代价函数,例如:
  • 尽量减少频繁的大幅度关节摆动;
  • 让运动轨迹更平滑、对人类观感更自然;
  • 避免在用户附近进行“过于激烈”的动作。

在实现上,通常会把这些约束参数化并配置在机器人控制器或中间件中(很多协作机器人产品的“功能限制 / functional limits”页面就列出了电流、扭矩、速度的安全上限和相关模式)。(manual.doosanrobotics.com)

10.3.1.2 可行性检查

有了约束,还需要检查一个候选动作是否满足这些约束。典型流程可以理解为:

VLA 输出动作候选 \(\hat{u}\) →可行性检查器→ 通过则执行,否则纠正 / 拒绝。

常见的可行性检查包括:

1.几何与运动学检查 +关节约束检查:例如 VLA 输出的是关节增量 \(\Delta q\),先计算 \(q_{\text{new}} = q_{\text{current}} + \Delta q\),然后检查每个关节是否超出范围。 +逆运动学可行性:当 VLA 输出末端位姿目标时,需要求解逆运动学。若无解,或者唯一解处在奇异位形附近,则认为该动作不可行。 +路径内插检查:不仅要看起点和终点,线性插值或更细时间步的路径上,是否有中间状态违反关节或工作空间约束。 2.动力学与执行能力检查

  • 根据当前状态与目标动作,估算所需关节扭矩、功率等,判断是否超出电机与驱动器的额定能力(这部分可利用动力学模型,也可用经验上限)。
  • 对于高速操作或重载操作,尤其要检查制动距离和制动扭矩是否足够,否则在紧急停止时会出现“刹不住车”的风险。 3.碰撞与接触预测
  • 运行一个简化的短时仿真(few steps look-ahead),利用当前环境的几何模型判断新的动作是否会导致与环境或自身发生碰撞、越过安全距离等。
  • 一些工作会把形式化验证和时序逻辑(LTL)结合,利用“安全约束模块”在任务层就排除任何可能导致违反碰撞 / 区域限制的行为,使动作“先天安全”。(h2r.cs.brown.edu) 4.实时性考虑 可行性检查通常必须在毫秒级完成,因此不能用过于复杂的大规模仿真;工程上常采用:
  • 预先离线生成查表(look-up table);
  • 把检查问题转化为一个小规模的二次规划(QP),快速求解最近的可行动作;
  • 对 VLA 输出只做局部微调,而不是从零重新规划。

10.3.1.3 违约处理

当某个候选动作违反约束或无法通过可行性检查时,系统需要有“违约处理策略”,而不是简单崩溃。常见做法可以分为三个层级:

1.投影 / 裁剪到安全集合(action projection) 最温和的做法是把不安全动作“拉回”安全区域,例如:

  • 对速度、加速度进行裁剪(clipping);

  • 用一个带约束的优化问题寻找距离原动作最近的安全动作:

    \[ u^* = \arg\min_{u} |u - \hat{u}|^2 \quad \text{s.t. } g_i(x, u)\le 0 \]

    这样可以最大程度保持 VLA 原意,同时满足安全条件。 2.切换到安全策略(fallback policy) 当动作严重违反约束,或连续多次无法找到可行修正时,系统应切换到预定义的安全策略,例如:

  • 停止当前任务,缓慢收回机械臂至“安全姿态”;

  • 对移动机器人执行原地制动,然后缓慢退回到安全区域;

  • 不再接受新的自动命令,等待人工确认或重置。 3.解释与人机交互 对于具身智能系统,仅仅“拒绝执行”是不够的,还应向用户解释原因并给出建议:

  • 例如:“我无法把箱子放在这个位置,因为会超出工作空间,请选择离机器人近一点的位置。”

  • 有研究专门探讨如何用自然语言解释任务不可达或违反约束的原因,从而帮助非专业用户理解机器人局限。(Robotics Proceedings)

这一节与 4.4.2 中“语言作为约束”的思想呼应:高层语言中隐含的安全规范,最终会在动作层体现为清晰可检查的约束与违约处理逻辑。


10.3.2 碰撞检测与紧急停止机制

动作约束与可行性检查主要针对“事前预防”。然而现实世界总是有意外:某个物体突然闯入轨迹、传感器读数失真、人的干预不在模型预期之内。因此,还需要“事后防御”:一旦发生异常接触,要在极短时间内检测出来并采取紧急措施。

【图片占位:时间轴示意图:正常运动 → 外力接触 → 传感器检测 → 控制器触发碰撞事件 → 减速 / 停机。对比有/无紧急停止机制的区别】

10.3.2.1 被动碰撞检测

“被动”是指:机器人并不主动规划绕开障碍,而是在碰撞发生或即将发生时,通过本体传感器感知异常,从而触发反应。

典型的信息来源包括:

1.关节扭矩 / 电流残差

  • 在理想无接触状态下,关节扭矩可以由动力学模型计算得到;实际测量的电机电流或扭矩与模型预测值之间的差异称为外力残差
  • 当这类残差超过某个阈值、并且持续一定时间,就可以判定发生了非计划的接触或碰撞。大量工作使用基于关节扭矩传感器或电流残差的碰撞检测与碰撞定位方法。(ResearchGate)
  • 工业协作机械臂中,“力限位”“冲击检测”等功能,往往正是基于这种方法实现。 2.末端力 / 力矩传感器
  • 在末端安装六维力 / 力矩传感器,可以直接测量手爪受到的外力。
  • 只要外力超过安全阈值,就可以触发“力控模式”或紧急停止,避免持续压迫人体或损坏工件。 3.行为模式异常检测
  • 通过学习正常运行时的轨迹、速度、扭矩模式,构建典型分布;当实时数据出现明显偏离时,即可视为异常。
  • 类似的思想也常见于传感器故障检测与预测性维护中(利用深度学习或统计模型识别异常模式)。(MDPI)

工程上,被动碰撞检测的设计关键在于:**尽量快地检测真实碰撞,又要尽量少误报。**阈值过低会让系统频繁误停;过高则无法保证人机协作安全。

10.3.2.2 主动避障

“主动避障”是事前预防的一部分,但它通常运行在比 VLA 更低的一层,与安全直接相关,因此放在本节一起讨论。

1.环境感知与距离场

  • 利用深度相机、激光雷达等传感器构建周围环境的点云或网格地图,并计算到障碍物表面的最小距离。
  • 将机器人本体简化为若干碰撞几何体(球体、圆柱等),实时估算机器人各部分与环境之间的最小距离,并与安全距离阈值比较。 2.速度与距离耦合(speed & separation monitoring)
  • 在协作机器人应用中,常用“速度与分离监控”:人与机器人之间距离越近,机器人允许的最大速度越小,当小于某个阈值时必须停止。相关原则在 ISO 10218 与 ISO/TS 15066 等标准中有明确讨论。(sick.com)
  • 简单实现方式是基于激光扫描或安全光幕进行“区域触发”,高级实现则结合 3D 视觉与人体关键点检测动态估计人位置。 3.局部避障与轨迹修正
  • 即使 VLA 给出的高层动作不考虑局部障碍,低层也可以利用局部规划器在短时间范围内进行微调,例如基于势场法、动态窗口法(DWA)等。
  • 对机械臂,可以在约束优化中加入障碍距离约束,让每个控制周期生成的关节速度都在“远离障碍物”的方向上。

10.3.2.3 紧急停止

紧急停止(Emergency Stop, E-stop)是安全设计的最后一道防线,也是工业标准中最关键的要求之一。(Automate)

1.硬件级紧急停止

  • 物理急停按钮、拉绳开关、安全继电器等属于“硬件链路”,一旦触发会直接切断电机动力或使系统进入受控停机模式。
  • 工程上通常采用双通道冗余设计:只要任一通道检测到急停信号,就会进入停机过程,并通过安全 PLC 或继电器确保不会被软件覆盖。 2.软件级紧急停止与安全监控线程
  • 在机器人操作系统中,一般会有一个高优先级的“安全线程”,独立于 VLA 推理和普通任务调度,专门监控:
    • 碰撞检测信号;
    • 传感器严重失效、通信中断;
    • 速度 / 位置越界;
    • 语言层“立即停止”指令。
  • 一旦条件满足,该线程向底层控制器发出“紧急停止”命令,优先级高于一切普通指令。 3.停止类别与停机策略
  • 实际系统中,常区分“立即断电停机”和“受控减速后停机”两种类别,以兼顾安全性和机械寿命。
  • 对具身智能机器人而言,还应考虑停机后的状态:是保持当前位置锁死,还是缓慢回到安全姿态,以及如何在语言层向用户说明“刚刚发生了什么”。

10.3.3 对传感器噪声、遮挡、失效的鲁棒性设计

具身智能系统高度依赖多种传感器:相机、激光雷达、IMU、关节编码器、力觉……这些传感器现实中会被噪声、遮挡、老化、故障等问题困扰。如果不做鲁棒性设计,VLA 决策再聪明也可能被“垃圾输入”误导。

这一节可以与 3.4(视觉工程考虑)以及 7.3(数据清洗与异常轨迹)形成呼应:前者强调“如何获得好输入”,本节强调“输入变坏时系统如何自保”。

【图片占位:一个状态机图:正常模式 →(轻微异常)受限模式 →(严重异常)安全停机;旁边标注不同传感器异常的触发条件】

10.3.3.1 传感器校验

校验的目标很简单:先判断“这路传感器是否还可信”,再考虑怎么用。

1.数值范围与物理一致性检查

  • 对每类传感器配置合理的数值范围与变化速率:例如距离传感器不可能突然从 1m 跳到 -5m,图像亮度直方图不应长期为全零或全饱和。
  • 利用简单的物理关系进行交叉校验:
    • 轮速计与视觉里程计对比;
    • IMU 测得重力方向与机器人姿态估计比对;
    • 关节编码器与末端位姿之间的几何关系是否一致。 2.时序和刷新率监控
  • 每条数据带时间戳,可以检测是否长期不更新(“卡帧”),或者更新频率突然下降(网络或驱动异常)。
  • 对实时性要求高的控制回路,一旦传感器数据延迟或丢包超过阈值,应立即触发降级或停机。 3.故障检测与隔离(FDI)机制
  • 在控制与自动化领域,多传感器故障检测与 Isolation(FDI)是一门成熟方向,常使用残差分析、统计检测或深度学习模型识别异常传感器。(MDPI)
  • 关键思想是:与其直接信任某个传感器,不如先学一个“正常模式”的统计模型,偏离模型的传感器数据就被标记为可疑。

10.3.3.2 多传感器融合

多传感器融合不仅提升估计精度,更重要的是:当某一个传感器变差时,系统仍能依靠其他传感器维持一个“够用”的认知。

可以从三层来看融合方式:(科学直通车)

1.数据层融合(raw data fusion)

  • 典型如把 LiDAR 点云投影到相机图像上,得到带语义标签的彩色点云;或者把多路麦克风信号合成波束。
  • 此时 FDI 也可直接在原始数据上进行:例如同一物体在不同传感器视角下的几何形状应当一致。 2.特征层融合(feature-level fusion)
  • 各传感器分别用神经网络编码为特征,再在后续网络中拼接或加权。
  • 如果某个传感器被判定为异常,可以降低或清零它的特征权重,从而减小对决策的影响。 3.决策层融合(decision-level fusion)
  • 不同传感器流水线各自给出独立判断(例如“前方 1.2m 有障碍物” vs “前方安全”),再由一个上层逻辑做投票或加权决策。
  • 这种方式实现较简单,适合在已有“黑盒模块”基础上加一层安全逻辑。

在具身智能场景中,一种常见架构是:底层定位与地图构建由传统滤波或图优化方法负责(如 EKF / SLAM),上层 VLA 读取的是经过滤波、融合后的状态估计,从而减少大模型与传感器噪声直接打交道的机会。

10.3.3.3 降级模式

即便已经做了校验与融合,仍需承认:某些情况下,系统无法再安全地完成原定任务——这时就需要“降级模式(degraded modes)”。

1.分级运行模式设计 +正常模式:所有关键传感器工作正常,允许全功能操作。 +受限模式:某一路关键传感器退化或失效,但其余传感器仍可支撑基本安全;此时限制速度、缩小工作空间、停止高风险任务(如人与机器人紧密协作的操作)。 +安全停机模式:多路传感器失效或定位严重不可靠,只允许执行“收回机械臂、关闭夹爪、停止移动”等保守动作,最终停机等待人工介入。 2.故障容错与控制重构

  • 对移动机器人或多机器人系统,可以针对某类传感器(例如 LiDAR)设计专门的容错控制(fault-tolerant control),在检测到某个机器人雷达故障时,通过其他传感器或队友信息重构控制律。(Nature)
  • 对单机器人来说,类似思路是:当视觉定位失效时,短时间内利用里程计与 IMU 进行“盲走”,同时减少动作幅度。 3.VLA 层的自适应与通告
  • 在高层,VLA 模型应当获得当前系统“健康状态”的摘要(例如一组 health flags),从而在降级模式下自动偏向更保守的动作策略。
  • 与此同时,机器人应通过语言或 UI 通知用户:“目前视觉传感器受到遮挡,我会降低速度并限制动作,仅执行简单搬运任务。”

10.3.4 语言层面安全:禁止指令与约束模板

随着大语言模型融入机器人系统,越来越多的指令将直接以自然语言形式发给机器人。这极大提升了易用性,也带来了一个新问题:

并不是所有“听起来合理”的语言指令都是安全的。

例如,“把这箱电池扔到楼下垃圾桶”“你能推开那个人吗?”——这些都不应被机器人照单全收。近期有工作专门研究“利用语言模型拒绝违反社会规范或安全规范的指令”,用于机器人指令过滤与拒绝。(ACM Digital Library)

【图片占位:一张“用户语言指令 → 语言过滤 / 约束模块 →(安全指令)VLA → 动作”流程图,旁边标出“黑名单指令”“约束模板”“安全确认”三个组件】

10.3.4.1 黑名单指令

**黑名单(deny-list)**是语言层安全最直接的手段:

1.显式关键词与模式

  • 定义一批明显危险的关键词或短语,如“伤害”“攻击”“摧毁”“扔出窗外”等,在特定领域还可以加入专业危险动作(例如“解除安全围栏”“提升到最大速度运转”)。
  • 一旦用户指令中出现这些模式,系统可以直接拒绝执行,或者进入更严格的审核流程。 2.语义级黑名单
  • 关键词匹配容易被用户绕过,例如“轻轻地撞开那个人”和“让他离开”在词面上差别很大,但前者显然危险。
  • 可以训练一个小型分类器或利用 LLM 对指令进行“安全性判定”,将其归类为“安全 / 不安全 / 存疑”,而不是简单字符串匹配。相关研究表明,LLM 在识别违反社会规范、暴力或违法命令方面具有一定的能力,可作为一层“道德过滤器”。(ACM Digital Library) 3.与物理约束联动
  • 黑名单不应只停留在文本层面,而是与实际机器人能力结合,例如:
    • 即使用户指令中没有出现“伤害”“攻击”等字样,只要推理后对应的是“用机械臂对人施加大力”,也应被判为黑名单。
  • 这就需要把动作空间中的“禁忌区域”映射回语言空间,从而构造更智能的黑名单。

10.3.4.2 语言过滤

在黑名单之外,还可以通过更柔性的“语言过滤(language filtering)”来引导机器人行为落在安全范围内,而不是简单拒绝。

1.语言到形式化约束的映射

  • 一类工作尝试将自然语言约束(如“不要进入红线以外的区域”“不要碰到桌上的易碎物品”)映射为时序逻辑(如 LTL)约束,然后在规划或控制时强制满足这些约束。(h2r.cs.brown.edu)
  • 例如,“始终保持与人至少 50cm 距离”可以转为“在所有时间步上,人机距离 \(d(t) \ge 0.5\) m”的约束,规划器或安全芯片会自动剪除任何违反该约束的候选动作。 2.为 RL / VLA 提供文本形式的安全约束
  • 在强化学习与决策模型中,可以把安全需求写成自然语言约束,让算法同时学习“如何完成任务”和“哪些事情不能做”。这样的算法会在策略优化时保证违反约束的概率控制在安全范围内。(NeurIPS 会议录)
  • 对于 VLA 模型而言,可以把这些约束模板拼到输入 prompt 中,使模型在推理动作时自动考虑“禁止行为列表”。 3.指令重写与弱化
  • 对于“危险但可重写”的指令,可以由语言前端先进行改写,例如:
    • 用户:“把这瓶玻璃矿泉水砸碎试试。” 机器人重写为:“将瓶子轻放到桌上,并说明我无法安全地砸碎它。”
  • 这类“指令重写”可以有效降低误用风险,同时保持对话体验自然(不会频繁出现硬拒绝)。

10.3.4.3 安全确认

在很多场景中,指令并非明显非法或危险,而是存在歧义或潜在风险。这时更合理的做法是:让机器人主动发起安全确认(safety confirmation),补齐上下文。

1.模糊指令的澄清

  • 当任务目标不清晰、可能有多种实现方式,且某些方式存在风险时,机器人应回问:
    • “你希望我把它‘丢掉’是指放进垃圾桶,还是放回原来的盒子里?”
  • 这本质上是把“选择风险等级”的权力交还给用户,同时让人承担必要的决策责任。(arXiv) 2.高风险操作的双重确认
  • 对于某些“高能量、高影响”的动作(例如移动重物、靠近人脸、操作危险工具),可以强制采用“双确认”机制:
    • 语言上用户确认一次;
    • 物理按键或图形界面再确认一次(类似医疗设备和工业大机组的操作流程)。
  • 系统还可以在确认前用自然语言解释风险,比如:“执行这个操作时,机器人需要高速运动并靠近你,请确认周围无人并站在安全区域。” 3.对不可达任务的解释与替代方案
  • 当一个命令在物理、法规或伦理层面不可执行时,直接说“不行”会让用户感到挫败。更好的方式是:
    • 明确说明哪一条约束被违反(如安全距离、负载能力、法规限制);
    • 给出至少一个安全的替代方案(如“我可以把物体放到窗台而不是扔出窗外”)。(Robotics Proceedings)

本节从动作层、碰撞层、传感器层到语言层,给出了一套多层次的安全与鲁棒性设计思路。与 6 章的“机器人控制基础”和 10.1–10.2 的“系统集成与评测”相结合,你可以把具身智能机器人想象成一个被多重安全壳包裹的系统:最内层是 VLA 的“聪明大脑”,外围是一层层约束、监控、降级与解释机制,共同保证它在真实世界中既“能干事”,又“不闯祸”。

本章小结与自测

三行小结

  1. 本章面向部署与评测,关注系统级约束。
  2. 重点是延迟、安全与鲁棒性设计。
  3. 学完后应能写出可执行的评测协议。

检查题

  1. 用你自己的话总结本章最核心的一个公式/机制。
  2. 给出一个“如果要落地到项目里,你会怎么用”的具体例子。

常见误区

  1. 离线评测通过就直接上机。
  2. 缺少异常回退路径。
  3. 忽略部署时延预算。

公式到代码(最小示例)

runs = [
    {"success": 1, "latency_ms": 82},
    {"success": 0, "latency_ms": 95},
    {"success": 1, "latency_ms": 76},
]
sr = sum(r["success"] for r in runs) / len(runs)
lat = sum(r["latency_ms"] for r in runs) / len(runs)
print({"success_rate": round(sr, 3), "avg_latency": round(lat, 1)})

本章外部参考(集中)

  1. 国际标准化组织
  2. sick.com
  3. h2r.cs.brown.edu
  4. manual.doosanrobotics.com
  5. Robotics Proceedings
  6. ResearchGate
  7. MDPI
  8. Automate
  9. 科学直通车
  10. Nature
  11. ACM Digital Library
  12. NeurIPS 会议录
  13. 本章其余链接可在正文中按上下文继续查阅。

10.4 工程优化与压缩

10.4.1 模型压缩与蒸馏(distillation)

学习导航

  • 本章主题:10.4.1 模型压缩与蒸馏(distillation)
  • 前置知识:建议先完成第 8-9 章训练相关内容。
  • 建议用时:59-79 分钟
  • 阅读顺序:先看概念框架,再看公式/代码,最后做自测。

在前面章节中,我们更多讨论了“怎么让 VLA 变强”;本节开始讨论另一面:怎么让它变“轻”、变“快”,但不变“傻”。模型压缩与知识蒸馏是目前在大模型落地中最成熟的一类技术路径。(MDPI)


10.4.1.1 压缩必要性

VLA 模型通常同时包含视觉 backbone、语言 backbone 和动作解码器三部分,很多工作使用数十亿参数量级的 Transformer 作为核心,例如 7B 规模的 OpenVLA、以及更大的 RT-2 系列。(arXiv) 这类模型在训练时可以依赖数据中心 GPU 集群,但在真实机器人上部署,就会遇到几个非常现实的问题:

+算力与能耗限制:移动机器人、机械臂控制箱上常见的是 Jetson、Coral TPU、嵌入式 CPU+小 GPU 等边缘设备,其功耗和峰值算力远低于服务器级 GPU。(ThinkRobotics.com) +时延约束:具身智能强调“感知–决策–控制”的闭环,闭环延迟需要控制在几十毫秒到百毫秒以内,否则机器人看到的永远是“过去的世界”,容易动作滞后甚至撞人。(MDPI) +存储与内存瓶颈:一个 7B 级别全精度模型单权重就需要数十 GB 存储,更不要说中间激活占用,对 8 GB~16 GB 内存的嵌入式平台来说几乎是灾难。(MDPI) +系统级共享资源:机器人还要运行 SLAM、运动规划、传感器驱动等模块,VLA 只是其中一员,不能“独占”全部资源。

综上,对于部署在机器人端的 VLA 来说,参数量、计算量和带宽都是必须正面面对的工程约束。模型压缩的目标,就是在尽量保持任务性能的前提下,系统性地降低模型复杂度。主流压缩手段可以概括为:剪枝(Pruning)、量化(Quantization)、低秩分解(Low-Rank Decomposition)、结构化轻量设计和知识蒸馏(Knowledge Distillation)。(SSRN)

【图 10-4-1 占位:绘制“模型大小–推理延迟–任务成功率”三者关系的示意图,展示压缩之后延迟明显下降,但成功率只略有下降的趋势曲线。】

在 VLA 场景下,知识蒸馏尤为重要,因为它不仅能“压缩参数”,更能“迁移大模型中已经学到的多模态知识和策略”,这是下一小节要重点展开的内容。(ACM Digital Library)


10.4.1.2 蒸馏方法

**知识蒸馏(Knowledge Distillation)**的典型形式是:用一个性能更强、规模更大的“教师模型(Teacher)”,去指导一个更小、更轻量的“学生模型(Student)”学习。学生不仅学习标注数据上的“正确答案”,还学习教师模型对各类候选答案的“偏好分布”,从而在小规模参数下尽量接近大模型性能。(ACM Digital Library)

从“学什么”的角度,常见蒸馏知识类型可以分为三类:(ACM Digital Library)

1.响应级(Response-based)蒸馏

  • 直接对齐教师和学生的输出分布,例如分类任务中的 softmax 概率、VLA 中动作 token 的概率分布。
  • 通常使用带温度的 KL 散度或交叉熵作为蒸馏损失,使学生模仿教师的“软标签”,而不是仅仅拟合 one-hot 的硬标签。 2.特征级(Feature-based)蒸馏
  • 对齐中间层特征,如视觉 encoder 最后一层的特征图、融合后的多模态表示、动作解码器中间隐藏状态等。
  • 通过 L2 损失、注意力矩阵对齐等方式,使学生在内部表征空间上接近教师,有利于迁移高层语义与多模态对齐能力。 3.关系级(Relation-based)蒸馏
  • 不直接约束特征本身,而约束样本之间、模态之间的关系,例如特征相似度矩阵、注意力图、token 间的相对关系等。
  • 对于 VLA 来说,可以蒸馏“视觉 token 与语言 token 之间的相关性模式”,帮助学生学会在图像和指令之间建立类似的注意力结构。

在机器人 VLA 场景中,还经常会用到两类“面向策略”的蒸馏变体:

+策略蒸馏(Policy Distillation):教师可以是一个使用 RL/IL 训练出来的高性能策略,学生学习在同样的状态输入下输出接近的动作分布,用于把多个任务或多个机器人上的策略压缩到一个统一学生模型中。 +多模态联合蒸馏:同时对视觉编码器、语言编码器和动作解码部分进行蒸馏,例如在视觉、语言和动作三个通道都加入蒸馏损失,保证学生不仅“会做”,还“看得懂、听得懂”。

【图 10-4-2 占位:教师–学生结构示意图。左侧为大 VLA,右侧为小 VLA,标注“输出蒸馏”“中间特征蒸馏”“注意力关系蒸馏”等不同连线。】


10.4.1.3 蒸馏过程

从工程视角出发,可以把一个 VLA 的蒸馏工程拆解为几个明确步骤:

1.确定教师模型与学生模型架构

  • 教师模型通常是已经在大规模数据上训练好的通用 VLA,例如一个 7B 级 OpenVLA 或更大的 RT-2 风格模型。(arXiv)
  • 学生模型采用更小的隐藏维度、更少的层数、更窄的多头注意力,甚至采用专门为嵌入式设计的轻量结构(如 MobileNet 样式视觉 encoder + 小型 Transformer 解码器)。 2.构建蒸馏数据集 +离线蒸馏:在已有的机器人示教数据(图像、语言指令、动作轨迹)上,额外调用教师模型生成输出分布和中间特征,作为蒸馏监督。 +在线/交互式蒸馏:在仿真环境中让教师与环境交互,教师执行策略、学生在旁“抄作业”;甚至可以采用多次 rollout,不断扩充训练集。 3.设计损失函数与权重 通常会将“任务损失”和“蒸馏损失”进行加权组合:

\[ L = \lambda_{\text{task}} L_{\text{task}} + \lambda_{\text{distill}} L_{\text{distill}} \]

  • \(L_{\text{task}}\):来自真实标签的监督损失,如动作 token 的交叉熵、任务成功/失败的 BCE 等。
  • \(L_{\text{distill}}\):包括输出分布的 KL 散度、特征对齐的 L2 损失、注意力矩阵对齐等。
  • 温度参数 \(\displaystyle T\) 通常会用来“软化”教师输出,让学生更容易学习类别或动作之间的细微偏好差异。(ACM Digital Library) 4.训练流程与策略
  • 先在蒸馏数据上进行若干轮“纯蒸馏训练”,使学生快速对齐教师的整体行为。
  • 再加入小批量真实环境数据或额外 BC/RL 微调,以防学生只会模仿教师的习惯,而无法适应真实机器人噪声和物理细节。
  • 若目标是量化部署(见 10.4.2),可直接在蒸馏过程中采用低精度学生模型(如 int8 仿真),进行“量化感知蒸馏”,让学生一开始就适应量化带来的噪声。(ResearchGate) 5.评估与安全验证
  • 在标准基准(如 VLA Bench 或实验室自建任务集)上对比教师与学生的任务成功率、泛化能力、失误类型。(CVF开放获取)
  • 在真实机器人上逐步“放权”:先低速、单任务、无人体场景测试,再逐步增加复杂度,确认蒸馏过程中没有引入危险行为或异常策略。

【图 10-4-3 占位:蒸馏流程时序图,从“数据采集/仿真 -> 教师打标签 -> 学生训练 -> 部署验证”的流程图。】

蒸馏在本章后面会与量化、边缘部署结合,构成“小模型 VLA”的主力技术路线,为机器人提供可负担的智能大脑。


10.4.2 Quantization(量化)与推理效率优化

如果说蒸馏是“换一个更小的脑袋”,那么量化就是“用更节省的数字来存储和运算同一个脑袋”。在当前软硬件生态下,量化几乎是所有边缘部署流水线的标配。(NVIDIA Developer)


10.4.2.1 模型量化

**模型量化(Model Quantization)**指的是将模型中的权重和激活从高精度的浮点数(如 FP32)映射为低比特表示(如 FP16、INT8,甚至 4 bit),从而大幅降低存储和计算成本:(MDPI)

+存储节省:从 FP32 到 INT8,理论上权重存储可减为原来的 1/4,意味着在相同显存/内存条件下可以加载更大的模型,或者运行更多模型。 +计算加速:许多边缘硬件(如 Jetson Tensor Cores、Edge TPU)对低精度整数矩阵乘法做了专门优化,INT8 运算吞吐远高于 FP32。(NVIDIA Developer Forums) +带宽降低:更短的表示意味着从内存到计算单元的数据传输压力减轻,有助于提高整体吞吐。

量化本质上是在一个有限整数区间(如 \(([-128, 127])\))上,用一个线性比例因子(scale)和零点(zero-point)去近似原始的浮点范围。不同层、不同张量可以有不同的 scale/zero-point,以减小量化误差。(Hugging Face)

【图 10-4-4 占位:示意一维浮点分布被线性映射到 INT8 离散格点的示意图,标出 scale 与 zero-point。】

对于 VLA 这类 Transformer 模型,量化时还要考虑:

  • Embedding 层、输出 logits 层、LayerNorm 参数等通常更敏感,往往保留在 FP16/BF16,而对大部分线性层、注意力投影层做 INT8 量化,形成**混合精度(Mixed-Precision)**方案。(NVIDIA Developer)
  • 对视觉 backbone(CNN/ViT)则更容易采用静态 INT8 量化,因为特征分布相对稳定,硬件支持也更成熟。

10.4.2.2 量化方法

从“在训练流程中的位置”看,常用的量化策略可以分为三大类:(Hugging Face)

1.训练后量化(Post-Training Quantization, PTQ) 不再重新训练模型,只在训练完成的 FP32/FP16 模型基础上进行转换。 +动态量化(Dynamic Quantization) + 典型用法:权重在离线阶段量化为 INT8,激活在运行时根据当前 batch 的实际取值动态计算量化参数。 + 优点:不需要额外的“校准(calibration)”数据,适合 Transformer 和 RNN 等序列模型。(onnxruntime.ai) +静态量化(Static Quantization) + 在转换阶段使用一个小的代表性数据集,通过若干次前向推理统计各层激活的 min/max 或直方图分布,离线确定量化区间。 + 推理时权重和激活都使用固定的 INT8 区间,适合 CNN 和视觉 backbone,可获得更好的推理加速。(Google AI for Developers) 2.量化感知训练(Quantization-Aware Training, QAT) 当简单的 PTQ 带来的精度下降无法接受时,可以在训练阶段“模拟量化”:

  • 在前向中插入“假量化(fake quantization)”算子,把权重和激活“截断”为低比特表示,在反向传播时仍使用高精度更新。
  • 通过这种方式,模型在训练中逐渐适应量化噪声,最终在真实 INT8/INT4 部署时精度损失更小。(datature.com)
  • 对 VLA 这种长序列 Transformer,QAT 成本较高,但在关键组件(如动作解码器)上进行局部 QAT,往往能取得不错的折中。 3.混合精度与分层量化
  • 在 GPU 上常见的 FP16/BF16 + FP32 混合精度,本质上也是一种量化形式,只不过比特数仍然较高。(NVIDIA Developer)
  • 在更激进的方案里,可以对不同层使用不同 bit-width(如主干 INT8,部分线性层 INT4),甚至结合蒸馏,让低比特学生从高精度教师中学习对量化噪声不敏感的表示。

在工程实践中,一个较为稳妥的路线是:先做 FP16 混合精度 + 图优化,如果仍无法满足实时性,再尝试 INT8 PTQ,最后针对关键模块上 QAT 或更低比特。


10.4.2.3 推理优化

量化只是“瘦身”的一部分,要真正达到实时控制的要求,还需要一整套**推理优化(Inference Optimization)**手段,从模型图到系统调度都要动手术。(onnxruntime.ai)

1.图级与算子级优化

  • 利用 TensorRT、ONNX Runtime、TVM 等工具进行图优化:算子融合(如 Conv+BN+ReLU)、常量折叠、消除冗余分支等。(onnxruntime.ai)
  • 针对特定硬件选择高效 kernel,例如在 Jetson 上启用 Tensor Cores 的 FP16/INT8 kernel,在 Edge TPU 上使用 TFLite 编译器生成专用计算图。(NVIDIA Developer Forums) 2.输入输出与批处理策略
  • 机器人控制多为 batch=1 的在线模式,但同一时刻可以并行处理多路传感或多步规划,需合理设计异步队列。
  • 适当降低图像分辨率、缩短语言上下文长度、限制历史轨迹长度,都可以有效减小 VLA 的序列长度和计算量。 3.系统级调度与并行
  • 将视觉预处理、VLA 推理和低层控制放在不同线程/进程,用共享内存或零拷贝(zero-copy)减少数据复制开销。
  • 使用优先级队列,对时延敏感的控制循环(例如避障)给予更高优先级,大模型推理则在后台或较低频率运行。(MDPI) 4.缓存与重用
  • 对语言指令等不变部分,可以预先编码缓存,仅对每一帧变化的视觉和状态信息重新计算。
  • 对长 horizon 任务,可采用增量注意力缓存(KV cache),在每一步仅对新 token 做注意力计算,减少平方级开销(具体细节可回顾 Transformer 部分的复杂度分析)。

【图 10-4-5 占位:机器人系统推理流水线示意图,从“相机帧 -> 预处理 -> VLA 推理 -> 控制命令”,标注在哪些位置做量化、在哪些位置使用推理引擎优化。】

通过“蒸馏 + 量化 + 推理优化”三板斧,往往可以把一个原本只能在服务器跑的 VLA,压缩到可以在 Jetson 级别硬件上达到 10 Hz 以上的闭环频率,为后面的边缘部署打下基础。(MDPI)


10.4.3 边缘设备上的部署实践要点

前两小节更多聚焦于“模型本身怎么变小、变快”,这一节转到系统工程视角:在真实边缘硬件上,如何把一个 VLA 模型稳稳当当地跑起来


10.4.3.1 硬件选型

边缘部署的硬件选型,本质上是在性能、功耗、成本、开发便利性之间做多目标折中。可以粗略分为以下几类:(ThinkRobotics.com)

1.嵌入式 GPU 平台(如 NVIDIA Jetson 系列)

  • 优点:CUDA 生态成熟、TensorRT 支持良好,适合运行 CNN、Transformer、VLM/VLA 等通用深度模型。
  • 典型应用:中高性能移动机器人、机械臂控制柜。(Ultralytics Docs) 2.专用 NPU / Edge TPU 加速器(如 Google Coral TPU)
  • 优点:功耗极低、对 INT8 推理高度优化,适合部署压缩后的 CNN/VLM 和小型 VLA。(ResearchGate)
  • 不足:模型需转换为特定格式(如 TFLite),对模型结构限制较多(不支持某些算子或动态控制流)。 3.CPU + 小 GPU / VPU 组合
  • 如树莓派 + USB 加速器(Movidius NCS 等),适用于简化版本政策或只在云端运行大模型、边缘执行轻量策略的场景。 4.FPGA / 定制 ASIC
  • 对大规模量产、极致能效的商用机器人有吸引力,但开发成本高、迭代慢,目前更偏向产业界工程化方案。

对于具身智能研究者来说,常见实践路线是:实验阶段用桌面 GPU,原型部署用 Jetson,极低功耗产品再考虑 NPU/TPU/FPGA。在选型时要结合上一节的压缩方案估算:目标模型在目标硬件上的推理时延、峰值内存占用和长期散热能力

【图 10-4-6 占位:表格形式对比 Jetson、Coral TPU、CPU+GPU 方案的算力(TOPS)、功耗、生态支持等参数。】


10.4.3.2 内存管理

即使选对了硬件,如果内存管理不到位,VLA 也可能在关键时刻因为 OOM(Out of Memory)直接崩溃。以下是边缘部署时需要重点关注的方面:(onnxruntime.ai)

1.预算与分析

  • 将运行时内存拆解为:模型权重(常驻)、中间激活(临时)、输入输出缓存、系统与其他进程占用。
  • 使用框架提供的 profile 工具(如 TensorRT profiler、onnxruntime profiling)测真实峰值,而不是仅凭理论估算。 2.控制模型内存占用
  • 利用前面介绍的量化减小权重体积,选择合适的最大序列长度(图像 patch 数、语言 token 数、历史步数)。
  • 对视觉 backbone,减少特征通道数、采用分辨率自适应(近处高分辨率、远处低分辨率)策略。 3.运行时内存复用与分配策略
  • 启用框架的内存池/缓存机制,避免频繁 malloc/free 带来的碎片化。
  • 定期监控内存碎片率,在多次加载/卸载模型的场景中考虑进程级重启或使用“模型常驻 + 动态配置”架构。 4.多进程/多节点协同
  • 对于计算负载较大的视觉和 VLA,可以单独放在一个“推理节点”中,通过 ROS topic / RPC 接口服务其他模块,清晰隔离内存与错误边界。

10.4.3.3 运行监控

任何长期在线的机器人系统,都必须具备一定程度的运行监控与自诊断能力,否则一旦模型在部署后出现性能衰退或异常行为,很难定位问题。(MDPI)

监控主要包括三个层面:

1.资源层监控

  • CPU/GPU/NPU 利用率、内存/显存占用、设备温度、电池电量与电流等。
  • 典型工具:Jetson 上的 tegrastats、Linux 上的 top/htop、厂家提供的 SDK API。 2.性能指标监控
  • 每次 VLA 推理的时延分布(平均值、P95、P99)、吞吐(每秒处理的观测步数)。
  • 离线评测到的任务成功率与在线实际成功率的差异,用于监控“性能漂移”。 3.行为与安全监控
  • 记录发生紧急停止、碰撞检测触发、动作超限的次数和上下文数据(视觉帧、状态、指令)。
  • 建立简单的异常检测规则,如在短时间内连续多次发生动作规划失败或传感器异常,触发退避策略或人工介入。

【图 10-4-7 占位:一个简单监控面板示意图,包含 CPU/GPU 利用率、推理时延曲线、任务成功率趋势以及安全事件计数。】

在有了这套监控基础之后,团队才能在后续迭代中量化地评估不同压缩策略、不同硬件平台对整体系统行为的影响,而不是依靠主观体验。


10.4.4 小模型 VLA 与大模型 VLA 的协同(如规划–执行分离)

随着 OpenVLA、RT-2 等大型 VLA 的出现,一个现实问题是:这些模型很强,但不一定适合直接“塞进”机器人里。越来越多的系统开始采用“小模型 + 大模型”的协同架构,将规划与执行、推理与控制分层。(维基百科)


10.4.4.1 分级规划执行

一种自然的架构是**“大模型做高层规划,小模型做低层执行”**:

+大模型 VLA / VLM + LLM(云端或高性能本地工作站)

  • 负责理解复杂自然语言任务、检索世界知识、推理长时序计划(例如完成一个“整理房间”的多步骤任务)。
  • 可以基于互联网上的大规模图文数据和机器人数据进行训练,具有更强的泛化和推理能力,例如 RT-2 将 web 视觉–语言知识迁移到机器人动作中。(arXiv) +小模型 VLA(部署在机器人本体)
  • 负责将高层计划分解为连续的控制动作,如抓取、放置、移动、避障等,在几十 Hz 的频率下闭环控制。
  • 通过前文介绍的蒸馏与压缩,从大模型继承视觉–语言–动作对齐能力,但参数量和延迟显著下降。

具体流程上,大模型输出的可以是:

  • 语言化的分步指令(如“先把红色杯子放到桌子右侧,再关灯”);
  • 结构化的任务图(task graph),包含一系列子任务、先后约束与条件分支;
  • 关键子目标(sub-goals),如中间位姿、关键物体状态(“杯子在架子上”“杯子在桌上”)。

小模型 VLA 则在每个子任务内,通过自身感知与控制实现局部闭环。这样,大模型只需低频运行(例如 0.1–1 Hz 做一次整体再规划),而小模型负责高频反馈控制。

【图 10-4-8 占位:层级架构图,上层“大模型”接收人类语言指令并输出子任务序列,下层“小模型 VLA”连接机器人,执行每个子任务。】


10.4.4.2 信息传递

大小模型之间的信息传递形式,直接决定了系统的灵活性与工程复杂度。常见的几种接口设计包括:

1.以语言为接口

  • 大模型输出自然语言或受限模板语言(如 DSL),小模型再对其进行解析。
  • 优点是通用性强、易于人类 debugging;缺点是需要保证小模型对语言的解析鲁棒性。 2.以符号 / 结构化状态为接口
  • 大模型输出结构化的任务描述,如 JSON 形式的 {"action": "pick", "object": "red_mug", "target": "table_right"}
  • 小模型根据这些参数在自己的感知空间中查找对应目标(如在图像中找 red_mug),并规划动作。 3.以高维嵌入 / 潜变量为接口
  • 大模型输出某种“目标嵌入”(goal embedding),小模型通过训练好的策略将当前状态推向这个目标嵌入。
  • 这种方式更接近端到端学习,但可解释性较弱,多用于研究型系统。

信息传递还涉及反馈通道

  • 小模型需要向大模型汇报子任务执行状态(成功/失败、耗时、遇到的障碍),大模型据此更新整体计划。
  • 为了降低带宽与隐私风险,通常不会传输原始视频帧,而是传输压缩后的特征、关键检测结果或语言化的场景描述。(MDPI)

10.4.4.3 优势互补

“小模型 VLA + 大模型 VLA”的协同,本质上是对单一大模型直接部署的现实折中,它带来的优势包括:

+性能与资源的分工

  • 大模型负责认知层面的“想”(理解复杂指令、做长程规划);
  • 小模型负责控制层面的“做”(考虑传感噪声、动力学约束、实时安全)。 +在线学习与自适应的空间
  • 小模型可以在部署过程中通过少量在线数据微调(例如适应新的照明环境或新机器人),而大模型保持相对稳定,避免每次环境变化都要大规模重训。 +安全与可靠性
  • 在网络中断或大模型不可用时,小模型仍可执行基础技能(如紧急制动、保持静止、简单避障)。
  • 规划–执行分离也便于在执行层加入更多物理安全约束和形式化验证,而不必对整个巨型大模型做不可行的形式验证。

【图 10-4-9 占位:比较单一大 VLA 与“大+小”协同架构的示意图,展示在性能、时延和安全性三方面的对比雷达图。】

在长期发展视角下,随着硬件继续进步,未来某些机器人平台可能直接搭载中大型 VLA;但在可预见的一段时间内,“云端/服务器大模型 + 端侧小模型”会是非常现实、工程上可行的一条路径。本节介绍的蒸馏、量化、边缘部署与协同架构,也构成了从“VLA 论文”走向“VLA 产品”的关键工程桥梁。

本章小结与自测

三行小结

  1. 本章面向部署与评测,关注系统级约束。
  2. 重点是延迟、安全与鲁棒性设计。
  3. 学完后应能写出可执行的评测协议。

检查题

  1. 用你自己的话总结本章最核心的一个公式/机制。
  2. 给出一个“如果要落地到项目里,你会怎么用”的具体例子。

常见误区

  1. 离线评测通过就直接上机。
  2. 缺少异常回退路径。
  3. 忽略部署时延预算。

公式到代码(最小示例)

runs = [
    {"success": 1, "latency_ms": 82},
    {"success": 0, "latency_ms": 95},
    {"success": 1, "latency_ms": 76},
]
sr = sum(r["success"] for r in runs) / len(runs)
lat = sum(r["latency_ms"] for r in runs) / len(runs)
print({"success_rate": round(sr, 3), "avg_latency": round(lat, 1)})

本章外部参考(集中)

  1. MDPI
  2. arXiv
  3. ThinkRobotics.com
  4. MDPI
  5. SSRN
  6. ACM Digital Library
  7. ResearchGate
  8. CVF开放获取
  9. NVIDIA Developer
  10. NVIDIA Developer Forums
  11. Hugging Face
  12. onnxruntime.ai
  13. 本章其余链接可在正文中按上下文继续查阅。

11.1 入门项目建议

下面我直接把你给出的 11.1.x 扩写成教材正文风格。整体假定读者已经看过前面关于 BC、VLA、仿真平台、ROS 等章节,这里主要做“落地项目手把手”,避免重复理论。


11.1 入门项目建议

本节的目标,是让读者在不依赖真实机器人硬件的前提下,走完几条完整的实践路线: 从最基础的行为克隆(BC),到一个玩具级 VLA,再到利用开源数据训练多任务策略,最终把模型部署在仿真机器人上完成抓取 / 放置任务。

可以把这几小节理解为四个渐进式“关卡”:

  1. 会用仿真 + BC 让机器人“照着做”
  2. 会用简单 VLA 让机器人听懂一句话再行动
  3. 会在开源多任务数据集上训练一个小“通用策略”
  4. 会把模型真正接到仿真机械臂上跑在线控制闭环

11.1.1 在仿真环境中实现简单的 BC 控制策略

学习导航

  • 本章主题:11.1.1 在仿真环境中实现简单的 BC 控制策略
  • 前置知识:建议至少完成第 1-10 章关键章节。
  • 建议用时:84-104 分钟
  • 阅读顺序:先看概念框架,再看公式/代码,最后做自测。

这一小节的目标,是让读者完成第一条最基础的 pipeline:

仿真环境搭建 → 采集示范轨迹 → 训练行为克隆策略 → 部署回仿真验证

11.1.1.1 任务场景

为了把复杂度压到最低,建议选用单臂 + 桌面 + 单物体的简单抓取任务,例如:

  • 机器人:Franka Panda、UR5 或仿真平台自带机械臂
  • 环境:一张桌子,桌上放一个小方块或圆柱体
  • 任务:从固定初始姿态出发,抓起桌上的物块并抬到空中

仿真引擎可以选择:

+MuJoCo:现代机器人强化学习中最常用之一,支持 Franka、UR 系列等模型,仿真稳定,许多 benchmark 都基于它。(科学直通车) +Isaac Gym / Isaac Lab:适合大规模 RL,但对初学者略有上手成本。 +Gazebo / Ignition + ROS:更贴近真实机器人系统,和 ROS 集成好,但仿真效率偏低。(GitHub)

为了让读者感到“看得见的进步”,可以建议如下约束:

  • 只使用单视角 RGB 图像 + 机械臂关节角作为输入
  • 只做二维平面内抓取(物体固定在桌上某个区域)
  • 控制指令采用关节增量(Δq)或末端位姿增量(Δpose)

图片占位建议:

【图 11-1】典型机械臂仿真环境示意图:Franka Panda 机械臂固定在桌旁,桌面上摆放单个方块,画出机器人基座坐标系与摄像头视场。

11.1.1.2 数据采集

行为克隆的核心是:有一批“好示范”,模型只要拟合它们即可。在仿真环境中采集示范相对轻松,主要方式有两种:

1.遥操作(Teleoperation)方式

  • 用键盘 / 鼠标 / 手柄 或 VR 控制机械臂末端移动与夹爪开闭。
  • 在每一个控制周期记录:
    • 当前图像 \(I_t\)(RGB 或 RGB-D)
    • 机器人状态 \(s_t\):关节角、关节速度、夹爪状态等
    • 人类给出的动作 \(a_t\):比如末端速度或关节角增量
  • 数据存储成轨迹:\(((I_0, s_0, a_0), \dots, (I_T, s_T, a_T))\) 2.脚本 / 规划器生成示范
  • 对于规则简单的任务,可以写定程序化轨迹:例如从上方垂直下降、夹紧、上抬。
  • 也可以利用轨迹规划器生成碰撞安全轨迹,然后把规划出的动作当作专家示范(RLBench 就是用规划器自动生成无限示范的代表性系统)。(arXiv)

记录格式建议:

  • 采用统一的结构体或字典,例如:
{
    "image": <H x W x 3>,
    "q": <n_dof>,        # 关节角
    "qdot": <n_dof>,     # 关节速度(可选)
    "gripper": <1>,      # 夹爪开合
    "action": <m>,       # 控制命令
    "timestep": <int>
}
  • 保存为一系列 episode_xxx.h5npz 文件,方便后续 batch 加载和随机打乱。

小建议:

  • 尽量采集几十到上百条成功轨迹;
  • 在仿真中随机扰动若干初始条件(方块位置、小幅度初始姿态变化),为后续泛化留一点空间;
  • 记录任务是否成功,方便训练前筛掉明显失败示范。

11.1.1.3 模型训练

这一部分可以引导读者实现一个最朴素的 BC 模型

1.输入设计

  • 图像经一个轻量 CNN(如 ResNet18)或 ViT Tiny 提取特征向量 \(f_{\text{img}}\)。
  • 机器人的状态向量 \(s_t\)(关节角、夹爪状态)经一个小型 MLP 转为嵌入 \(f_{\text{state}}\)。
  • 拼接两者:\(z_t = [f_{\text{img}}, f_{\text{state}}]\)。 2.输出设计
  • 若动作是连续值(如关节角增量 \(\Delta q\),末端速度),则使用回归头:多层感知机输出实数向量。
  • 若动作预先离散化(例如八个方向步进 + 抓/放),则使用分类头(Softmax 输出每个离散动作的概率)。 3.损失函数
  • 连续动作:使用均方误差(MSE)损失 \(\mathcal{L} = |a_t - \hat{a}_t|^2\)。
  • 离散动作:使用交叉熵损失。 4.训练流程
  • 将所有轨迹打散成样本对 \(\text{obs}_t, a_t\)。
  • 小批量训练,使用 Adam 优化器;
  • 对图像进行基础数据增强(随机裁剪、轻微颜色抖动),增强鲁棒性。

可以明确强调:BC 本质上就是监督学习,不需要奖励函数和环境交互,这一点和前面 RL 章节做一个呼应。

图片占位建议:

【图 11-2】简单 BC 网络结构示意图:左侧为图像输入经 CNN,右侧为关节状态输入经 MLP,两者拼接后输出动作向量。

11.1.1.4 验证效果

训练完模型后,需要让读者真正“看到机器人动起来”,验证步骤:

1.离线评估

  • 在验证集轨迹上计算:
    • 连续动作误差(MSE),
    • 或动作分类准确率。
  • 可视化几条轨迹:比较专家动作与模型动作的曲线差异。 2.在线回放(仿真控制)
  • 在仿真中重置环境:机器人回到初始位置,物体放在预定位置;
  • 在每一个控制周期:
    • 获取当前图像和机器人状态;
    • 前向传播得到模型动作;
    • 将动作发送给仿真控制器。
  • 重复直到终止条件(抓取成功、时间超时、仿真出界)。 3.指标与现象
  • 任务成功率:例如在 50 次初始化中成功抓起并抬起物体的比例;
  • 执行轨迹是否平滑、是否有明显震荡或发抖;
  • 模型错误典型场景:对物体位置略有偏差、抓取偏边缘导致滑落等。

可以引导读者思考:

  • 模型失败时,是否进入了训练数据没覆盖到的状态分布(呼应前文 BC 的分布偏移问题);
  • 若要提高表现,可以在后续章节引入 DAgger 或强化学习微调。

图片占位建议:

【图 11-3】仿真中 BC 策略成功抓取物体的动作序列截图(接近 → 抓取 → 提起),配合时间轴标注。


11.1.2 复现一个小规模“视觉 + 语言 + 动作”的玩具 VLA

在学生已经完成纯 BC 项目后,可以引导他们搭建一个最小可用的 VLA 原型——它不追求 SOTA,只追求“能跑、能看、能听话”

11.1.2.1 场景设定

场景依然建议控制在非常简单的桌面操作环境。例如:

  • 桌上有多种颜色或不同形状的积木:红色方块、蓝色圆柱、绿色长条等;
  • 摄像头固定俯视桌面;
  • 机械臂可以抓取并移动物体到左/右侧区域;
  • 自然语言指令类似:
    • “把红色方块放到右边”;
    • “把蓝色圆柱移到左上角”;
    • “把绿色积木抓起来”。

这样一来,语言主要承担两个作用:

  1. 指定目标物体(颜色 + 类别);
  2. 指定目标区域(左/右/上/下)。

图片占位建议:

【图 11-4】玩具 VLA 场景示意:桌面多个彩色积木、机械臂与摄像头视角,示意不同目标区域位置。

11.1.2.2 数据生成

这里鼓励使用完全程序化的合成数据,方便读者生成足够多样本:

1.程序化场景采样

  • 随机采样:
    • 积木的颜色 / 形状 / 尺寸;
    • 每个积木在桌面上的位置;
    • 要执行的任务类型(抓取 / 放置位置)。 2.动作自动生成
  • 使用简单几何规划:
    • 根据物体 2D 坐标,设定机械臂末端在上方某个高度对齐;
    • 垂直下降、闭合夹爪、抬起;
    • 若需要放置位置,则移动到目标区中心、下降、松爪。
  • 所有这些动作都可以由脚本生成,从而形成专家轨迹。 3.语言指令生成
  • 采用模板:
    • “把 {颜色} {形状} 放到 {区域}”;
    • “抓起 {颜色} 的积木”;
  • 对同一条轨迹可以生成多条同义指令,通过同义词 / 词序变化等扩充训练集;
  • 若想更真实,可在模板基础上用语言模型改写,形成更自然的多样指令表达。(OpenCV学习) 4.同步与对齐
  • 对每一条轨迹,记录:
    • 起始时刻的场景图像 \(I_0\);
    • 对应语言指令文本 \(\displaystyle L\);
    • 动作序列 \(a_0, \dots, a_T\)。
  • 对于玩具级 VLA,可以简化成“指令 + 初始图像 → 整条动作序列”的离线映射,或“指令 + 当前图像 → 下一步动作”的在线决策。

11.1.2.3 模型搭建

这里的目标是一个最小 VLA,可选架构之一:

1.视觉编码

  • 使用一个预训练的 ResNet18 / ViT-Tiny 作为 backbone(在第 3 章已有详细介绍,在此直接引用即可);
  • 输出一个固定维度向量 \(f_{\text{img}}\)。 2.语言编码
  • 使用轻量 Transformer 或直接调用小型预训练文本编码器,如 MiniLM、DistilBERT 等(读者可以通过开源框架获取预训练权重)。(科学直通车)
  • 将指令 \(\displaystyle L\) 转换为子词 token 序列,经嵌入和 Transformer 层,提取 [CLS] 或平均池化得到语言向量 \(f_{\text{lang}}\)。 3.多模态融合
  • 最简单方法:直接拼接 \(z = [f_{\text{img}}, f_{\text{lang}}]\),输入 MLP 输出动作。
  • 稍微进阶一点,可以用一个 2 层的 Transformer,将图像特征视为一个 token、语言序列为其余 token,通过自注意力实现简单的跨模态交互。 4.动作解码
  • vs 11.1.1 类似,可以输出:
    • 单步动作(Δpose 或 Δq);
    • 或固定长度的动作 token 序列。
  • 为了简单起见,建议初学项目仍采用单步决策,在仿真中循环调用模型。

图片占位建议:

【图 11-5】玩具 VLA 模型结构示意:图像编码器与语言编码器分别输出特征,经过拼接与 MLP 输出动作。

11.1.2.4 训练评估

训练过程本质仍是行为克隆,只是输入多了一路语言:

1.训练

  • Loss 仍是动作监督损失(MSE 或交叉熵);
  • 在 batch 中混合不同指令与不同场景;
  • 适当使用 dropout 与数据增广防止过拟合。 2.评估方式 +离线正确率:在验证集上,给定图像 + 指令,统计模型选出的目标物体是否正确(例如是否接近正确颜色与位置)。 +在线执行成功率:在仿真中随机生成新场景和新指令,统计任务成功率。 +指令泛化测试
    • 在训练中只用模板 A;
    • 在测试中使用同一含义,但完全未出现过的自然表达 B(例如“请把那个红色的小方块挪到右边去”),检验语言理解泛化。 3.现象讨论
  • 指令缺失或模糊时(如“把它拿走”),模型会如何表现?
  • 如果场景中不存在符合指令的物体(如没有红色积木),模型是否会输出无意义动作?
  • 这为后续章节中“安全性”和“语言约束”埋下伏笔。

11.1.3 使用开源数据集训练一个简单多任务策略

在读者掌握自建数据和玩具 VLA 之后,可以把视角扩展到真正的开源机器人数据集,体会多任务学习和数据工程的味道。

11.1.3.1 选择数据

目前机器人社区已有多种开放数据集可以用于多任务策略学习,比如:

+RLBench:CoppeliaSim 上构建的多任务操作环境,包含 100 种以上任务(开抽屉、开门、插销、放物体等),每个任务有大量示教轨迹,支持视觉 + 动作学习。(arXiv) +RoboNet:Berkeley 等机构联合的数据集,包含多个不同机器人平台的桌面操作数据,主要任务是物体迁移(pushing 或 grasping-and-placing),提供 1500 万帧左右的视频及状态信息。(bair.berkeley.edu)

入门阶段可以建议:

  • 从 RLBench 选取 3–5 个简单任务(如 “reach target”、“pick & place”、“open drawer”);
  • 或从 RoboNet 切出一个子集,只保留若干机器人和物体类别。

预处理步骤包括:

  • 统一图像尺寸和通道顺序;
  • 统一状态与动作向量的格式;
  • 明确每条轨迹对应的任务 id(或任务名称),为后续多任务训练提供条件标签。

11.1.3.2 模型架构

这里不强求 VLA,一种基础多任务策略可以只是视觉 + 状态 → 动作,并增加任务条件输入,形成一个小型 generalist policy:

1.视觉编码器

  • 重用上一小节中的 CNN / ViT;

  • 若数据量充足,可考虑在数据集上做自监督预训练(例如 MAE 或对比学习),再用作下游策略 backbone。(科学直通车) 2.任务编码器

  • 将任务 id 映射为 one-hot 或 learnable embedding;

  • 任务嵌入向量 \(f_{\text{task}}\) 与视觉特征、机器人状态特征一起拼接成总特征:

    \[ z_t = [f_{\text{img}}, f_{\text{state}}, f_{\text{task}}] \]

3.策略头

  • MLP 输出当前动作;
  • 也可采用小型 Transformer 编码短时间窗口的历史观测与动作,实现时序建模。

图片占位建议:

【图 11-6】简单多任务策略网络结构示意:视觉特征、状态特征与任务嵌入拼接后通过 MLP 输出动作。

11.1.3.3 训练过程

多任务训练的难点在于数据不平衡与任务干扰,本节可以指导读者做几个基本设计:

1.采样策略

  • 按任务均匀采样:在每个 batch 内保证多任务数据均衡,避免大量数据的任务“淹没”长尾任务;
  • 或使用基于任务难度的加权采样(视为进阶内容)。 2.训练目标
  • 仍然是标准 BC 损失:\(\mathcal{L} = \sum_t |a_t - \hat{a}_t|^2\) 或交叉熵;
  • 可以在损失中增加任务正则项,例如鼓励同一任务的行动分布更紧凑(非必需)。 3.日志与监控
  • 为每个任务单独记录训练/验证误差与离线评估指标;
  • 如果某个任务一直学不好,有可能是任务数据过少或任务本身过难,可在报告中引导学生分析原因。 4.工程注意事项
  • 数据集可能较大,需要注意 IO 和缓存(例如提前将图像转为压缩格式,使用多进程 data loader);
  • 必要时对长轨迹进行截断或下采样,以控制训练时间。

11.1.3.4 测试泛化

多任务策略真正有趣的地方在于泛化能力测试,可以设计几类实验:

1.任务内泛化

  • 在与训练任务相同的任务 id 上,但使用新的初始姿态、物体位置、光照变化等,测试成功率;
  • 观察模型是否相较单任务策略更稳健。 2.任务间迁移
  • 在 RLBench 等系统中,选择一两个未参与训练的任务,直接使用同一模型(或者在少量示范上做快速微调),比较其学习效率与单任务基线。(GitHub) 3.分布外场景
  • 对视觉输入做强扰动(不同桌布纹理、不同背景颜色);
  • 对任务组合做变化(例如在桌子另一侧重复相同任务),观察策略是否仍能执行关键步骤。

读者通过这一节,会第一次感受到:

“原来我可以用同一个模型,控制不同任务甚至不同机器人,哪怕很粗糙,也算朝‘通用策略’迈了一小步。”


11.1.4 将模型部署在仿真机器人上完成抓取 / 放置任务

前面三个项目大多停留在“训练脚本 + 离线评估”层面,本节的目标是:让模型真正以一个在线控制模块的身份,接入仿真机器人系统。这是走向真实机器人实验的前置练习。

11.1.4.1 部署准备

部署的关键,是把模型包装成一个可在实时循环中调用的服务,与仿真平台对接。典型组合是:

  • 仿真平台:Gazebo / Ignition / Isaac Sim / MuJoCo + 外部控制程序;
  • 中间件:ROS / ROS2,负责图像、状态与控制命令的话题传输;(科学直通车)

准备步骤:

1.选择仿真机器人模型

  • 如 Franka Panda、UR5 等已有成熟 URDF + 控制接口的机械臂模型;许多开源项目和基准都基于这些平台。(GitHub) 2.定义模型接口
  • 输入:
    • 相机图像(订阅 /camera/rgb 或类似话题);
    • 关节状态(订阅 /joint_states)。
  • 输出:
    • 关节目标位置或关节速度(发布到 /arm_controller/command 之类的话题);
    • 或末端位姿目标,由下层控制器完成 IK 和轨迹跟踪。 3.模型打包
  • 将训练好的 PyTorch / JAX 模型保存为 checkpoint;
  • 部署脚本在 ROS 节点中加载模型,并在回调中执行前向计算。
  • 为满足实时性,可考虑使用 ONNX/TensorRT 等推理引擎进行加速(在 10 章已有详细介绍,这里只作实践提醒)。

图片占位建议:

【图 11-7】模型部署架构示意:仿真器 → ROS 话题 → VLA / BC 模型节点 → 控制器 → 仿真机械臂。

11.1.4.2 在线控制

在线控制循环通常如下:

1.感知

  • 以固定频率(如 5–10 Hz)从相机和关节传感读取当前状态;
  • 做必要预处理:图像 resize、归一化;状态向量拼接。 2.决策
  • 将当前观测(以及语言指令/任务 id 等条件)输入模型;
  • 得到动作向量(Δpose 或 Δq);
  • 做简单约束:裁剪到关节速度 / 末端位移限制。 3.执行
  • 将动作转为控制指令发送给仿真控制器:
    • 若用关节空间位置控制:当前关节角 + Δq 得到目标位置。
    • 若用末端速度控制:发送速度指令,由 robot controller 积分执行。 4.循环与终止
  • 直到检测到抓取成功 / 放置完成 / 时间超时;
  • 若失败,可回到初始状态重新尝试,计算成功率。

这里可以强调高层策略与低层控制的分工(与第 6 章呼应):VLA/BC 模型只需输出“想要往哪走”,真正的轨迹细化与电机控制由底层完成。

11.1.4.3 任务执行

最后,可以要求读者把这一套部署在一个具体任务上,比如:

“在仿真中,让机械臂根据视觉输入自动抓取桌上的物体,并将其放置到指定区域。”

建议设置的观测与评价包括:

1.成功率统计

  • 多次随机初始化物体位置,记录完成抓取 + 放置任务的成功率;
  • 可与手工脚本或规划器生成的基线策略进行比较。 2.行为可视化
  • 录制仿真视频,选取几条成功与失败案例;
  • 在视频上叠加当前模型预测的目标点、动作向量等信息,帮助分析行为逻辑。 3.故障模式分析
  • 例如:
    • 张开 / 闭合夹爪时机不对;
    • 接近物体路径绕来绕去,说明策略不稳定;
    • 抓取过于激进导致与桌面碰撞。
  • 这些现象为后续章节关于“安全性、鲁棒性与 RL 微调”提供直观动机。

图片占位建议:

【图 11-8】仿真抓取 / 放置任务执行结果对比图:上排为成功案例序列,下排为失败案例序列,并在图中标注关键失败原因(如偏移过大、夹爪没对准)。


综合来看,本节四个项目像是一个小型“具身智能实验通关手册”: 从最基础的单任务 BC,到加上语言组成玩具 VLA,再到利用开源多任务数据做 generalist policy,最后真正接入仿真系统跑在线闭环。 读者只要按顺序完成其中任意两三个,就已经从“纸面理解”跨到了“能把抽象 VLA 概念落成可运行系统”的阶段。

本章小结与自测

三行小结

  1. 本章把学习内容转为项目与科研实践能力。
  2. 重点是复现能力、实验设计与技术表达。
  3. 学完后应能独立完成小规模研究闭环。

检查题

  1. 用你自己的话总结本章最核心的一个公式/机制。
  2. 给出一个“如果要落地到项目里,你会怎么用”的具体例子。

常见误区

  1. 复现时跳过最小可运行基线。
  2. 不做消融直接下结论。
  3. 展示材料只给结果不给方法。

公式到代码(最小示例)

ablation = [
    {"cfg": "full", "sr": 0.78},
    {"cfg": "-language", "sr": 0.61},
]
for row in ablation:
    print(row["cfg"], row["sr"])

本章外部参考(集中)

  1. 科学直通车
  2. GitHub
  3. arXiv
  4. OpenCV学习
  5. bair.berkeley.edu

11.2 代码阅读与复现能力

11.2.1 阅读开源 VLA / 机器人基础模型仓库的方式

学习导航

  • 本章主题:11.2.1 阅读开源 VLA / 机器人基础模型仓库的方式
  • 前置知识:建议至少完成第 1-10 章关键章节。
  • 建议用时:120-140 分钟
  • 阅读顺序:先看概念框架,再看公式/代码,最后做自测。

关键图示:复现与研究迭代

关键图示:复现与研究迭代

这一小节的目标,是教读者“拿到一个陌生的开源 VLA / 机器人基础模型仓库,如何从不会到能跑起来、看得懂、改得动”。可以结合前面章节对 VLA 架构与训练范式的理解,这里则更加工程化、落地化。


11.2.1.1 选取项目

并不是任何一个 GitHub 仓库都适合作为学习对象。选择起点时,可以遵循几个简单的原则。

(1)优先选择有论文 / 网站支撑的“标志性”项目 这类项目往往有较完整的文档、清晰的实验设定和稳定的代码实现,例如:

+OpenVLA:开源 7B 参数 VLA 模型,基于 Open X-Embodiment 约 97 万条机器人轨迹预训练,支持多机器人、多任务控制,并提供推理与 LoRA 微调脚本。(GitHub) +RT-1(Robotics Transformer):Google Robotics 提出的视觉-语言-动作 Transformer,官方及非官方仓库给出了训练与推理代码。(GitHub) +Octo:开源的通用机器人策略(generalist robot policy),基于 Transformer + diffusion policy,在 80 万条 Open X-Embodiment 轨迹上训练,支持多机器人、多观测空间与多任务。(GitHub) +robomimic:更偏“框架”的模仿学习平台,包含多种离线模仿 / offline RL 算法与标准数据集,适合作为训练/评测 pipeline 的参考。(GitHub)

另外,还可以参考“awesome / survey”类仓库(如 Generalist Robotic Foundation Models 列表),从中挑选代表性模型。(GitHub)

(2)优先选“功能可闭环”的项目

即:

+至少包含:数据加载 → 模型构建 → 训练 / 微调 → 推理 / 评估 全流程代码;

  • 最好提供:示例脚本examples/scripts/tutorials/ 目录)、预训练权重下载方式以及一键 demo

这类项目可以让你做到:

读几页 README → 配好环境 → 跑通一个 demo → 再回头看代码结构,印象会清晰很多。

(3)从“小而完整”到“大而复杂”的渐进路径

建议的学习顺序可以是:

1.单任务、单机器人项目(比如基于 robomimic 的模仿学习基线)——先熟悉最简 pipeline。(robomimic) 2.单机器人、多任务 VLA 模型(如某些 RT-1 实现、Octo 子集)。(GitHub) 3.多机器人、多模态的大型基础模型(OpenVLA、Octo 全量等)。

(4)检查“可维护性信号”

打开 GitHub 后,可以快速扫描:

  • Star / fork 数量是否过低(过少可能仓库尚不成熟);
  • 最近是否有 commit(过于久远可能与当前依赖版本不兼容);(GitHub)
  • README 是否有安装、数据准备、训练、评估等完整说明;
  • 是否有 issue / discussion 在积极回复。

图片占位

[图 11-2-1 占位:某开源 VLA 仓库的 GitHub 首页截图,标出 README、src/configs/scripts/ 等关键入口。]


11.2.1.2 入口与主流程

选定项目后,第一步不是“逐文件通读”,而是找到程序的主干流程。通常可以按下面的套路来。

(1)从 README / 教程脚本反推入口

大多数项目都会在 README 中给出类似命令:

python train.py --config configs/openvla_libero.yaml
# 或
python -m openvla.train experiment=openvla_libero

这条命令中的脚本(train.py)或模块(openvla.train)就是训练主入口。(GitHub)

推理同理,例如 Octo 中的 inference.pydemo_* 脚本通常是第一站。(GitHub)

(2)用“从外到内”的方式跟踪主流程

打开入口脚本后,可以标出几个关键函数:

  • 参数 / 配置加载:parse_argsOmegaConf.loadhydra.main 等;
  • 初始化:setup_loggerset_seedbuild_modelbuild_dataset
  • 训练循环:for epoch in ...:train_one_epochevaluate;
  • 保存与日志:save_checkpointlog_metrics

建议画一个简单的流程图(哪怕是纸上手绘):

“命令行参数 / 配置 → 构造 Dataset / DataLoader → 构造 Model → 配置 Optimizer / Scheduler → 训练循环(forward + loss + backward + step)→ 定期验证 + 保存权重”。

图片占位

[图 11-2-2 占位:训练主流程框图,从命令行入口到训练循环、评估与保存。]

(3)用简化伪代码重构理解

可以尝试把入口脚本抽象成伪代码,加深对整体结构的理解,例如:

def main(config):
    # 1. 环境初始化
    setup_seed(config.seed)
    setup_distributed(config.dist)
    logger = setup_logger(config.log)

    # 2. 构建数据与模型
    train_loader, val_loader = build_dataloaders(config.data)
    model = build_model(config.model).to(device)
    optimizer, scheduler = build_optimizer(config.optim, model)

    # 3. 训练循环
    for epoch in range(config.optim.num_epochs):
        train_one_epoch(model, train_loader, optimizer, scheduler, logger, epoch, config)
        if (epoch + 1) % config.eval.freq == 0:
            evaluate(model, val_loader, logger, epoch, config)
        save_checkpoint_if_needed(model, optimizer, epoch, config, logger)

阅读仓库时,可以一边看原始代码,一边自己在笔记里写下类似伪代码,逐渐把陌生代码抽象成熟悉的结构。

(4)优先看“数据一帧的生命周期”

主流程的核心,是一条数据从磁盘到 loss 的路径。在入口脚本中找到:

  1. Dataset.__getitem__:从文件中读出图像、状态、语言指令、动作等;
  2. collate_fn:将多条样本打包成 batch;
  3. model.forward:如何对视觉 / 语言 / 状态 / 历史动作编码并融合;
  4. loss_fn:如何对动作 token 或连续动作计算损失;
  5. loss.backward()optimizer.step()

优先搞清楚这一条“完整 pipeline”,再去深挖细节,会更有方向感。


11.2.1.3 模块划分

当你知道“程序从哪里进、大概要干什么”之后,下一步是给仓库做一个功能模块地图

(1)典型 VLA / 机器人基础模型仓库的目录结构

很多仓库会有类似的分层(以伪目录为例):

openvla/
  configs/            # YAML / JSON 配置
  data/               # 数据相关(dataset 定义、预处理)
  models/             # VLA 模型、backbone、头部等
  train/ 或 engine/   # 训练 / 推理引擎(循环、分布式封装)
  eval/               # 评估脚本、指标实现
  envs/ 或 robots/    # 仿真环境或真实机器人接口
  utils/              # 通用工具(日志、分布式、检查点等)
  scripts/            # 命令行脚本、demo

Octo、RT-1 的公开实现以及 robomimic 等框架基本都采用类似的层次结构,只是在命名和粒度上略有差别。(GitHub)

图片占位

[图 11-2-3 占位:一个典型 VLA 仓库目录树示意图,用颜色标出 config / data / models / train / eval 等模块。]

(2)按“重要性和依赖顺序”规划阅读顺序

推荐的阅读顺序:

  1. configs/conf/:了解有哪些实验配置、使用了什么模型 / 数据集 / 优化器;
  2. models/:搞清楚主干网络结构(Transformer / diffusion policy / CNN + Transformer)与输入输出定义;
  3. data/:理解轨迹数据的组织形式,包括视觉帧、语言指令、动作序列、状态等; 4.训练引擎train/ / engine/:如何把 data / model / optimizer 拼接起来,如何做分布式、日志、保存;
  4. eval/envs/ / robots/:评估指标、仿真或真实机器人接口是怎样集成进来的;
  5. utils/:最后再看,里面通常是通用工具,对整体理解帮助较小。

(3)为每个模块写一行“功能注解”

在个人笔记中,可以给每个核心模块写一句话的总结,例如:

  • openvla/models/transformer_vla.py:实现视觉-语言-动作统一 Transformer 的主体结构,定义输入 token 化与动作解码;
  • octo/data/trajectory_dataset.py:负责从 Open X-Embodiment 之类数据集中读取轨迹,并打包成 transformer-friendly 的序列。(octo-models.github.io)
  • robomimic/algos/bc.py:标准行为克隆算法实现,可作为所有模仿学习类算法的参照基线。(GitHub)

随着阅读深入,你会发现许多项目尽管细节不同,但在模块划分和数据流设计上高度相似,理解一个之后,再看新的 VLA 仓库就容易很多。


11.2.2 从配置文件与训练脚本理解整体 pipeline

前面强调了“从入口梳理主流程,本小节更系统地讲:如何仅凭配置文件和训练脚本,把一个大型项目的训练 pipeline在脑中“还原”为清晰的结构。


11.2.2.1 配置文件

现代 VLA / 机器人基础模型项目高度依赖配置系统(YAML + Hydra / OmegaConf,或 JSON / Python dict),这是理解 pipeline 的最好入口之一。

(1)典型配置文件结构

以一个假想的 configs/openvla_libero.yaml 为例,你通常会看到以下模块:(GitHub)

  • experiment:实验名、输出目录、随机种子;
  • data
    • 数据集名称(如 liberorobomimic_kitchen);
    • 数据路径、训练 / 验证拆分;
    • 图像分辨率、帧数(history length);
    • 是否使用语言指令、状态信息;
  • model
    • 视觉 backbone 类型(ResNet / ViT / FiLM EfficientNet / patch tokenizer 等);(GitHub)
    • Transformer 层数、hidden dim、注意力头数;
    • 动作 token 化方式(关节空间 / 末端空间 / diffusion policy 的 action embedding);(GitHub)
  • optim
    • 优化器类型(AdamW 等)、学习率、权重衰减;
    • batch size、训练步数 / epoch 数;
    • 学习率调度器(cosine、linear、warmup 步数);
  • train / dist
    • 使用的 GPU 数量、分布式后端;
    • 混合精度(fp16/bf16)、梯度累积步数;
  • eval / logging
    • 评估频率、保存模型的策略;
    • 日志后端(TensorBoard、W&B)。

阅读配置时的一个小技巧:统一标记“和你关心的科研问题直接相关的字段”,例如你要做“历史长度 ablation”,就重点关注 data.history_len

(2)练习:从配置推测训练设定

拿到一个配置文件,可以尝试用文字复述一遍实验设定,例如:

“本实验使用 LIBERO 仿真数据,单目 RGB 图像,输入 3 帧历史,将语言指令作为文本 token 拼入序列,采用 12 层 Transformer,hidden dim=1024,以 1e-4 学习率在 8 GPU 上训练 200k 步。”

如果你能做到这一点,说明你已经基本“读懂”了配置文件。

图片占位

[图 11-2-4 占位:标注注释后的 YAML 配置片段截图,用颜色高亮 data/model/optim/dist 等字段。]


11.2.2.2 训练脚本

配置文件给出了“实验的静态参数”,而训练脚本则描述“这些参数如何被用来真正跑起来”。

(1)训练脚本的典型结构

无论是 OpenVLA、Octo 还是 robomimic,训练脚本往往包含几个固定组成部分:(GitHub)

1.解析配置

  • 从命令行 / Hydra 获取 config;
  • 设置随机种子、确定设备(CPU / GPU)。 2.构建数据 pipeline
  • 调用 build_dataset(config.data)
  • 构建 DataLoader,指定 batch size、num_workers、shuffle 等。 3.构建模型与优化器
  • 调用 build_model(config.model) 返回一个 VLA 模型实例;
  • 将模型移动到设备;
  • 使用 build_optimizer(config.optim, model) 创建优化器和学习率调度器。 4.(可选)分布式 / 混合精度封装
  • 使用 DistributedDataParallel 或强封装(如 accelerate、Lightning);
  • 开启 AMP(自动混合精度)上下文。 5.训练 / 评估循环
  • for step in range(max_steps):for epoch in range(num_epochs):
  • 在循环中完成前向计算、loss 计算、反向传播、优化器更新;
  • 定期做验证、日志记录与 checkpoint。

(2)跟踪“一个 batch”在脚本中的路径

阅读训练脚本时,可以重点追踪以下几个函数调用:

for batch in train_loader:
    obs = batch["obs"]          # 视觉、状态等
    lang = batch["language"]    # 语言指令
    actions = batch["actions"]  # 轨迹中下一步动作

    outputs = model(obs, lang)
    loss = compute_loss(outputs, actions)
    loss.backward()
    optimizer.step()
    scheduler.step()

你可以在 IDE 中用“跳转定义”功能,从 model(...) 追到模型源码,再从 compute_loss 追到 loss 实现,再从 batch 的结构追到 Dataset 定义。

(3)注意训练脚本中“工程细节”的位置

比如:

+日志与监控:通常集中在 log_metricslogger.log 这一类函数里; +梯度裁剪:可能埋在单独的 optimizer_steptrain_one_epoch 中; +checkpoint 管理:保存 / 加载逻辑往往分散在 save_checkpointload_checkpointresume_if_needed 等函数。

这些地方虽然看上去“业务不性感”,但对可复现性和调试至关重要(与第 9.4 节的 MLOps 内容可以互相参照)。


11.2.2.3 Pipeline 连贯性

当你基本理解配置和训练脚本后,需要进一步做到:在脑中形成完整、连贯的“实验 pipeline 心智模型”

(1)画出三条主线:数据流、模型流、优化流

可以在笔记中画三条并行的线:

1.数据流

  • 磁盘 → DatasetDataLoader → batch → 模型输入;
  • 其中包括:图像解码、归一化、数据增强、token 化(语言 / 动作)。 2.模型流
  • 视觉编码 → 语言编码 → 多模态融合(Cross-Attention、统一 Transformer)→ 动作解码(token / diffusion)→ loss。 3.优化流
  • loss → backward → 梯度规约(分布式)→ 梯度裁剪 → optimizer step → scheduler step → 更新后的模型参数。

图片占位

[图 11-2-5 占位:三条主线(data/model/optim)的时序图,展示一次训练 step 内各模块的调用关系。]

(2)用“极简运行”检验你的理解

一种非常有效的练习是:

  • 在配置中设置非常小的 batch size / 步数(例如 run 10 step 就停);
  • 在关键位置打印 tensor shape、loss 数值;
  • 在笔记里按顺序记录:
    • 输入图像 / token 的维度;
    • 模型内部每层输出的维度(可以用 hook 或简单 print);
    • loss 是否随着 step 单调下降(至少在一小段上)。

如果你能解释“为何在这一层维度从 768 变成了 1024”“为何这里会多出一维表示时间步”,说明你对 pipeline 的连贯性已经比较清楚。

(3)避免“黑盒跑通”的幻觉

很多同学会陷入“脚本能跑 = 我理解了”的误区。一个简单的自测方法:

关闭代码,单凭配置和你刚画出的流程图,能否准确回答: – “训练时每步输入多少帧图像?” – “语言指令是如何被编码并融合到 Transformer 中的?” – “动作是 token 化还是直接回归?如果是 token 化,codebook 大小是多少?” – “优化器与学习率调度策略是什么样的?”

如果能回答、大致能写出伪代码,那就真正掌握了该仓库的整体 pipeline。


11.2.3 Debug 常见问题:NaN、梯度爆炸、收敛失败

在 VLA / 机器人基础模型的训练中,训练失败并不是例外,而是常态。本节针对最常见的三类问题,给出系统的排查思路与建议,帮助读者建立“工程级”的 debug 能力。


11.2.3.1 遇到 NaN

(1)现象与第一反应

典型症状包括:

  • loss 突然变为 NaNinf
  • 指标为 nan
  • log 中出现 “gradient overflow” 或 “Detected NaN in …”;
  • 参数 / 梯度中出现非有限值。

第一反应:先停下来保存现场(log、配置、最近 checkpoint),不要盲目继续训练。

(2)定位 NaN 来源的基本步骤

1.检查输入数据

  • Dataset.__getitem__collate_fn 中打印 / 断言:
    • torch.isfinite(img).all()torch.isfinite(actions).all()
  • 特别注意:
    • 深度图 / 点云中是否有 inf
    • 关节角 / 速度是否有奇异值(非常大的数 / NaN)。 2.检查预处理与归一化
  • 图像除以标准差时,是否有 std = 0 的情况;
  • 对数操作 log(x) 是否保证 x > 0
  • 平方根 sqrt(x) 是否有负数输入;
  • 归一化时是否有 除以样本数 0 的情况。 3.分拆 loss
  • 如果总 loss 是多个项之和(模仿 loss + 正则项 + 对比损失等),可以单独打印每一项:
    • 哪一项先变为 NaN?
  • 在 VLA 中要特别注意:
    • 动作 token 的 cross-entropy;
    • KL 散度 / log-likelihood 之类的项是否做了 clamp 防止 log(0)。 4.开启框架的 NaN 调试工具
  • PyTorch 有 torch.autograd.set_detect_anomaly(True),可以在出现 NaN 时给出对应的运算图堆栈(虽然会变慢);
  • 使用 torch.isfinite(tensor).all() 在模型关键层输出后做断言,一旦失败就报错中断。

(3)典型修复手段

+降低学习率:过高学习率容易导致参数一步跳到数值不稳定区域; +关闭或简化混合精度:FP16 / BF16 下的 underflow / overflow 更常见,可以暂时切回 FP32 验证; +对 denominator 加 epsilon:如 x / \\(std + 1e-6\\); +对概率做 clamp:如 p = p.clamp(min=1e-6, max=1-1e-6) 再做 log; +梯度裁剪:防止某一步梯度过大引发参数爆炸(与下一小节相关)。


11.2.3.2 梯度爆炸

(1)如何判断是梯度爆炸?

  • loss 不是逐渐 NaN,而是出现“大尖峰”:某些 step loss 突然暴涨几个数量级;
  • 监控梯度范数(grad_norm)发现某一步骤后飙升;
  • 模型权重中出现非常大的值,或者出现 “gradient overflow” 提示。

(2)常见原因

  • 初始学习率过高;
  • 使用了非常深的 Transformer / 时间序列长度很长,未配套合理的归一化;(arXiv)
  • loss 赋予了极端大的权重,例如某个正则项系数设置错误;
  • reward scaling 或 advantage normalization 未处理好(在 RL 微调阶段尤为常见);
  • 分布式训练中累计梯度步数设置错误,导致有效学习率被放大。

(3)防治手段

1.梯度裁剪(Gradient Clipping)

在每次反向传播后、优化器 step 之前:

torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)
optimizer.step()

可根据模型大小适当调节 max_norm

2.学习率与 warmup 调整

  • 先用较小初始学习率,配合 warmup 逐渐升高;
  • 对大模型(如 OpenVLA / Octo 这类 10^8 ~ 10^9 级别参数)尤其重要。(openvla.github.io)

3.检查输入尺度与归一化

  • 图像 / 状态是否已经做了标准化;
  • 动作 / 关节命令是否做了合理 scaling(例如 [-1, 1] 范围)。

4.局部禁用“可疑模块”

  • 暂时关闭某些新加的 loss、正则或梯度增强模块(如 gradient penalty);
  • 观察是否还会爆炸,逐步恢复,以定位为哪一部分引起。

11.2.3.3 收敛失败

相比 NaN 和梯度爆炸那种“明显坏掉”,收敛失败往往更隐蔽:损失在缓慢震荡,但迟迟不降到期望水平,或者训练 / 验证表现出现异常。

(1)先做“过拟合一个小数据子集”测试

这是调试深度学习系统非常经典的技巧:

  • 从训练集随机抽取极少量样本(如 100 条轨迹或几百个 batch);
  • 在这个小数据集上训练,观察模型能否将 loss 降到接近 0、成功率接近 100%。

如果连小数据都过拟合不了,说明问题不是“模型太弱”而是实现有 bug,可能在:

  • label / 动作 token 错位(off-by-one);
  • mask / padding 不正确;
  • loss 计算错误(比如使用了错误的索引)等。

(2)系统地排查“工程层面”的可能原因

+学习率太低 / 过早衰减

  • loss 一直缓慢下降但非常慢,可以尝试提高初始学习率,或者延长 warmup、推迟衰减时间; +batch size 太小 / 归一化失效
  • BatchNorm 在 batch 太小时表现不佳,可以改用 LayerNorm 或 GroupNorm; +正则化过强
  • 例如 weight decay 过大、dropout 过多、强数据增强把任务难度拉得过高。

(3)从模型与数据匹配性角度思考

  • 模型容量是否足以解决任务?
    • 对非常复杂的多任务 / 多机器人场景,用一个极小的模型可能就是欠拟合;(octo-models.github.io)
  • 数据是否足够、是否正确标注?
    • 有无大量失败轨迹混入训练集而未区分;
    • 语言指令与动作是否对齐(时间戳 / ID 是否一致)。

(4)建立“调参顺序”而非盲目乱调

可以采用固定顺序:

  1. 先验证数据 / 标签正确性(过拟合小集合);
  2. 再调整学习率 / batch size / epoch 数等最基础超参数;
  3. 再调整模型结构(层数、宽度),最后才动复杂模块(多任务权重、各种额外 loss)。

这样可以避免“一次改很多项,结果更难判断问题出在哪里”的情况。


11.2.4 做 ablation study(消融实验)的方法

消融实验不仅是论文中的“标配”,也是你自己判断一个设计是否有价值的基本工具。对 VLA / 机器人基础模型而言,模块众多、数据混杂,更需要严谨的消融方法。


11.2.4.1 确定消融点

(1)从“设计假设”出发,而非从代码细节出发

在第 11.3 节中我们会讨论如何提出研究假设,这里你可以先给当前模型的关键设计列一个“假设清单”,例如:

  • 引入语言条件能提升多任务泛化能力;
  • 使用 3D 点云相较纯 RGB 能提升抓取鲁棒性;
  • 使用跨机器人混合数据能提高在新机器人上的零样本表现;
  • 使用历史 4 帧,而不是 1 帧,有助于处理动态场景。

消融点就是这些假设对应的具体模块或配置字段。

(2)典型的 VLA 消融点示例

参考 OpenVLA、Octo 等工作中的实验设置,可以列出一些常见维度:(openvla.github.io)

+模态消融

  • 去掉语言(只用视觉 + 状态);
  • 去掉历史帧(仅用当前帧)。 +架构消融
  • 不使用 Cross-Attention,仅 concat 后喂入 Transformer;
  • 减少 Transformer 层数 / 隐含维度。 +数据消融
  • 只使用单一机器人数据 vs 使用多机器人混合数据;
  • 剪裁训练轨迹长度、减少任务种类。 +训练范式消融
  • 只用行为克隆 vs 行为克隆 + RL 微调;
  • 有无自监督预训练。

在确定消融点时,应优先选择与你论文主要贡献直接相关的设计,而不是把所有能关的开关都关一遍。


11.2.4.2 实验对照

(1)保持“单变量变化”原则

一条底线:每组对照实验之间,必须确保除了消融点之外,其余设置都尽量一致

  • 相同的训练数据、训练步数 / epoch 数;
  • 相同的优化器 / learning rate schedule;
  • 相同的 batch size、分布式策略、随机种子(或在同一 seed 集合上重复)。

例如,在验证“是否需要语言指令”时,实验可以是:

  • baseline:视觉 + 语言 + 状态;
  • ablation:视觉 + 状态(完全去掉语言相关模块与输入),其它配置完全相同。

(2)控制随机性:多次重复、固定 seed

机器人任务往往噪声很大,单次成功率差异可能只是运气。

实践中可以:

  • 设定一组固定种子(如 {0, 1, 2, 3, 4}),每个配置在这些种子上训练一次;
  • 或者在同一个训练好的模型上,对每个任务环境运行多次 episode(如 50–100 次),统计平均成功率。

RT-1、Octo 和 OpenVLA 等工作中,通常会在大量 episode 上报告平均成功率以及置信区间,避免单次评测带来的偶然性。(robotics-transformer1.github.io)

(3)实验命名与管理

结合第 9.4 节的数据工程与实验管理建议,对消融实验进行规范命名,例如:

  • exp_baseline_vla_full
  • exp_ablate_lang
  • exp_ablate_history
  • exp_ablate_multirobot

并在日志系统(如 W&B / TensorBoard)中使用统一标签,便于后续可视化和对比。

图片占位

[图 11-2-6 占位:一个对照实验表格示意图,列出不同消融配置与对应成功率,用颜色高亮 best / second best。]


11.2.4.3 统计显著

有了多组对照实验的结果,还需要回答一个关键问题:这些差异到底是“真的有用”,还是随机波动?

(1)简单但必要的统计量

在机器人任务评测中,可以至少做到:

  • 对每个实验配置,给出均值 ± 标准差
    • 例如,在 5 个 seed 或 100 个 episode 上统计任务成功率;
  • 显式展示样本数量(如“100 episodes,5 seeds”),让读者对方差大小有直觉。

例如:

baseline:\( 76.2 \pm 3.1% \) ablate_lang:\( 59.8 \pm 4.5% \)

即便不做形式化显著性检验,这样的差距已经足以说明“语言模态确实很重要”。

(2)t 检验 / bootstrap 的直观理解

如果你希望更严谨一些,可以使用简单的统计检验:

+配对 t 检验

  • 当两个配置在同一组 seed / episode 上评测,得到两组结果 \( {x_i} \) 和 \( {y_i} \);
  • 检验它们的平均差值是否显著非零; +bootstrap 置信区间
  • 从 episode 结果中反复采样,构建成功率差值的分布,查看 95% 置信区间是否跨 0。

不必在书中推导公式,只要读者理解:

“统计显著性检验是在问: 若这两个配置在本质上没差别,仅靠随机波动,我们观察到这么大的差距的概率是不是很小?”

(3)避免过度解读“小数点后”的差异

当两个配置的平均成功率差异小于一个标准差时,通常不应做过多解读。例如

A:\( 72.3 \pm 4.0% \) B:\( 74.1 \pm 3.8% \)

从工程实践角度,很难说 B 真的“压倒性更好”,更可能是波动范围内的差异。

相比之下,如果

A:\( 55.0 \pm 5.0% \) B:\( 75.0 \pm 4.0% \)

则无论是否做正式检验,人眼已经可以判断:B 明显优于 A

(4)回到假设:不只是“谁更高”,而是“为什么”

最后,消融实验的意义不仅在于“证明你的方法更好”;更重要的是:

  • 哪些设计是关键贡献(删掉就明显退化);
  • 哪些设计只是锦上添花
  • 哪些设计甚至可以去掉以简化系统

在 VLA / 机器人基础模型这种复杂系统中,好的消融可以帮助你:

  • 理清“语义理解”“多机器人混合训练”“长时序建模”等因素各自的作用;
  • 为后续迭代提供清晰路径:是优先增加数据、多模态信息,还是改进架构本身。

本节从“如何选项目、读入口、划分模块”,到“如何通过配置与训练脚本还原 pipeline”,再到“调试与消融实验”的系统方法,构成了从“会跑开源代码”迈向“能可靠复现并改进系统”的关键一环。后续 11.3 节会在此基础上,进一步讨论如何将这些工程能力与论文阅读、选题能力结合起来,完成真正的科研闭环。

本章小结与自测

三行小结

  1. 本章把学习内容转为项目与科研实践能力。
  2. 重点是复现能力、实验设计与技术表达。
  3. 学完后应能独立完成小规模研究闭环。

检查题

  1. 用你自己的话总结本章最核心的一个公式/机制。
  2. 给出一个“如果要落地到项目里,你会怎么用”的具体例子。

常见误区

  1. 复现时跳过最小可运行基线。
  2. 不做消融直接下结论。
  3. 展示材料只给结果不给方法。

公式到代码(最小示例)

ablation = [
    {"cfg": "full", "sr": 0.78},
    {"cfg": "-language", "sr": 0.61},
]
for row in ablation:
    print(row["cfg"], row["sr"])

本章外部参考(集中)

  1. GitHub
  2. GitHub
  3. GitHub
  4. GitHub
  5. GitHub
  6. robomimic
  7. GitHub
  8. octo-models.github.io
  9. arXiv
  10. openvla.github.io
  11. robotics-transformer1.github.io

11.3 论文阅读与研究选题

11.3 论文阅读与研究选题

前面在 0.2.1 中,我们从“能读懂论文”的角度讨论了理论、公式和实验理解。本节进一步往前走半步:不是“读懂一篇论文”,而是“系统地利用论文,找到自己的研究课题”。这涉及四个环节:分层阅读、利用综述和基准、提出可行的新 idea,以及设计严谨的验证实验。


11.3.1 阅读论文的层次:摘要 – 方法 – 实验 – 附录

学习导航

  • 本章主题:11.3.1 阅读论文的层次:摘要 – 方法 – 实验 – 附录
  • 前置知识:建议至少完成第 1-10 章关键章节。
  • 建议用时:52-72 分钟
  • 阅读顺序:先看概念框架,再看公式/代码,最后做自测。

在具身智能和 VLA 这样快速发展的领域,论文数量巨大,不可能逐篇从头到尾逐行精读。实践中更有效的是“多层次、多遍阅读”的策略:先粗读建立全局感,再针对方法和实验做有目的的精读。类似的“多 pass 阅读”方法在机器学习社区中已被反复推荐,用于降低认知负担、提高信息提取效率。(saiamrit.github.io)

【图 11-3-1:论文三层阅读流程示意图。第一层:标题/摘要/结论快速浏览;第二层:方法与核心公式精读;第三层:实验与附录核查,用于复现和批判性分析。】

11.3.1.1 粗读摘要与结论

第一遍阅读的目标不是细节,而是判断“这篇论文值不值得我花时间深入”。可以按如下顺序快速浏览:

  • 标题与作者、单位:判断大致方向是否与你当前关注的 VLA / 具身智能主题相关。
  • 摘要:聚焦三个问题——解决了什么问题?用了什么大致方法?比之前好在哪里?
  • 引言的首段和贡献列表:确认问题背景是否确实重要,贡献是否清晰、具体,而不是空泛表述。
  • 结论 / Discussion:看作者如何总结结果、承认哪些局限、提出哪些未来工作建议。

粗读时可以刻意避免被公式绊住,只要能回答下面几句话即可:

这篇论文针对 _______ 场景/任务,提出了 _______ 方法,在 _______ 数据集/平台上,相比 _______ 基线,在 _______ 指标上提升了大约 _______。

如果连这句话都填不完整,要么你阅读不够专注,要么论文写作本身就比较混乱。对于具身智能方向,可以再加一句:“是否涉及真实机器人或只在仿真中验证?”

粗读的输出最好是一两行笔记,记录在自己的文献表格或笔记系统中,为之后的“方法/实验精读”做筛选。

11.3.1.2 聚焦方法

当一篇论文在粗读阶段被判定为“值得投入时间”,下一步就是围绕“方法”做精读。这一层阅读的目标是:

1.弄清楚方法在做什么:从输入到输出,整个流水线是什么样。 2.搞清楚它和已有工作的本质区别:是新的网络结构?新的训练目标?新的数据构造方式?还是系统工程集成? 3.判断这些差异是否合理、有潜在可推广性

具体操作上,可以采用如下习惯:

  • 把方法画成一个方框图:输入(图像、语言、机器人状态)→ 编码模块 → 融合/规划模块 → 动作解码 → 输出控制指令。 【图 11-3-2:将一篇 VLA 论文方法画成“模块方框图”的示意图,可标注出与前人工作的差异模块。】
  • 遇到公式时,不急于推导每一步,而是先确认每个符号代表什么量、单位是什么、在哪个模块使用。
  • 对照 Related Work,确认作者自己声称的“创新点”到底对应到方法的哪些具体改动,而不是停留在写作层面的新名词。

对于具身智能类论文,方法精读时尤其要注意:

+动作空间是如何建模的(连续/离散、Delta Pose 还是关节角度)。 +与真实机器人系统的接口是什么(是否依赖某些难以获取的传感器或昂贵平台)。 +假设条件:例如是否假设精准的相机标定、完美的抓取检测、无延迟的控制等,这些都直接影响后续可复现性和扩展性。

如果你能在不看论文的情况下,用自己的话把方法讲给同专业同学听并画出流程图,就说明“方法这一层”真正读懂了。

11.3.1.3 分析实验

第三层阅读以实验为中心,目标不再是“搞懂作者做什么”,而是“评估这套方法到底有多可信、多有用”。

可以从以下几个维度系统检查:

1.任务与数据集

  • 对于 VLA/具身智能论文,区分仿真任务 vs 真实机器人任务,单任务 vs 多任务。
  • 观察任务难度:是固定初始布局,还是随机摆放?有无遮挡、光照变化、视觉噪声? 2.对比基线是否合理
  • 是否包含当前公认的 SOTA 方法和简单但强的 baseline(例如“行为克隆 + 预训练视觉”这类标准组合),避免“欺负弱基线”的情况。
  • baseline 是否用同样的训练数据、超参数规模和计算预算,否则对比不公平。 3.评价指标与统计可靠性
  • 具身任务中常见的是成功率、平均完成时间、路径长度等指标。注意是否报告方差或置信区间,而不是只有单个数字。
  • 多次重复实验(不同随机种子、不同场景实例)是基本要求,否则结论的统计意义有限。 4.消融实验(Ablation Study)
  • 理想情况下,每个声称的“创新部件”都应该有移除/替换实验,验证它真有贡献,而不是“锦上添花的细节”。

【图 11-3-3:实验分析示意图。左侧为不同方法在多个任务上的成功率柱状图,右侧为消融实验表格,突出关键模块的贡献。】

阅读实验部分时,可以刻意思考三个问题:

  • 如果让我复现实验,我还缺哪些信息?(超参数、网络宽度、数据预处理等通常在附录或开源代码中。)
  • 结论能否推广到我感兴趣的机器人平台或任务?有哪些隐含前提?
  • 有没有“反例场景”没有被测试,例如极端光照、物体外观分布显著不同等?这些都是潜在研究切入点。

11.3.2 如何从综述与基准工作中找到空白点

单篇论文告诉你“局部地形”,而综述(Survey)和大规模基准(Benchmark)则提供整个领域的“地图”。要找到真正有意义的研究课题,一个常见做法是:先用综述构建全局视图,再结合基准结果,定位“尚未被攻克的高价值山头”。系统化文献综述本身就是识别研究空白的重要工具。(科学直通车)

11.3.2.1 查找 Survey 综述

对于具身智能 / VLA 方向,查找综述时不必只依赖某一个数据库,而是可以采用“多渠道 + 关键词”的组合策略,例如:

  • 数据库:Google Scholar、arXiv、ACM Digital Library、IEEE Xplore 等。
  • 关键词组合:
    • “embodied AI survey”、“robotic manipulation review”、“vision-language-action survey”;
    • 中文可用“具身智能 综述”、“机器人 操作 基准”等。
  • 限定时间与 venue:优先关注近 3–5 年在顶会(NeurIPS、ICLR、ICRA、RSS、CoRL、CVPR 等)或顶刊上发表的综述,因为具身智能领域变化很快。

阅读综述时,不需要一开始就逐字精读,可以重点关注:

  • 综述如何划分子方向(例如按“导航/操作”、“仿真/真实”、“视觉主导/语言主导”等)。
  • 每个子方向下的代表性方法、关键数据集、通用评价指标。
  • 综述作者在结尾部分总结的“开放问题”和“未来研究方向”,一般都直接点出了若干重要空白。

这些信息将成为你构建“本领域知识图谱”的主结构。

11.3.2.2 比较方法优劣

在掌握了综述中的“方法清单”后,下一步是主动比较各方法的优劣,而不是被动接受综述作者给出的评价。建议动手做一张简单的对比表,将若干代表性方法按统一的维度进行比较,例如:

  • 模型维度:是否使用预训练 VLM/VLA、参数规模、是否端到端。
  • 数据维度:需要多少示教数据、是否依赖真人遥操作、是否支持多机器人。
  • 任务维度:适用的任务类型(抓取、插拔、开门等)、场景复杂度。
  • 工程维度:是否开源代码和模型、是否报告真实机器人实验、对硬件要求如何。

【图 11-3-4:基于综述构建“方法 × 维度”对比表的示意图。行对应不同论文,列对应数据需求、泛化能力、是否支持多任务等指标。】

通过这种结构化比较,你会发现一些有规律的“trade-off”:

  • 某些方法在仿真中表现很好,但一到现实机器人就明显掉点——典型的 sim2real 差距问题。
  • 某些方法需要大量高质量示教,难以在资源有限的实验室复制。
  • 某些方法依赖特定硬件(例如稠密力觉传感),在一般平台上不现实。

这些“缺点”和“限制条件”,就是潜在的改进机会和研究突破口。

11.3.2.3 寻找空白

在综述和基准结果的基础上,我们可以更有针对性地寻找“真正的空白点”,而不仅是“给现有方法改个名字”。从宏观上看,研究空白大致可以分为几类:(phdassistance)

1.场景空白 某类现实环境重要但鲜有研究。例如:大部分具身智能工作集中在桌面操作,而对“狭窄空间(抽屉内部、柜子深处)操作”的系统研究较少。 2.能力空白 某种关键能力在现有方法中表现普遍较差。例如:对长期任务的跨阶段记忆、对语言中隐含约束(“轻拿轻放”)的遵循等。 3.方法空白 某类思路在相关领域已被实践证明有效,但在具身智能中尚未系统尝试。例如:世界模型 + 规划在 RL 社区很活跃,但在真实机器人多任务操作上还相对缺乏系统验证。 4.评价空白 某些重要指标(安全性、能耗、动作平滑度、对人类友好程度)在现有工作中很少作为主要评价指标出现。

判断一个“空白”是否值得做,可以用三问法过滤:

  • 现实意义:填补这个空白会不会显著提高真实机器人系统的可用性/安全性?
  • 学术意义:它是否涉及新问题或迫使我们提出新的方法,而不是简单工程堆砌?
  • 可行性:现有资源和时间内能否以合理代价搭建实验平台并得到可验证的结论?

真正好的选题,往往是上述三点之间的平衡,而不是某一维度的极端。


11.3.3 提出可行新 idea 的能力:缩小范围、明确假设

找到“有价值的空白”只是第一步,下一步是把它收缩为一个可操作的具体课题。这需要从“宽泛兴趣”逐渐下钻到“明确问题 + 可检验的假设”。研究方法论中普遍强调,选题要经历从初始兴趣、文献梳理到范围收缩、可行性评估的过程。(timscdrmumbai.in)

11.3.3.1 明确问题

一个好的研究问题至少要回答四个“W”:

+研究对象是什么? 例如:“语言条件下的桌面抓取任务中的遮挡鲁棒性问题”。 +想改进的指标是什么? 如成功率、对新物体的泛化、对遮挡比例的鲁棒性等。 +相对于谁更好? 要有明确的比较参考(现有 SOTA 方法、某一真实系统基线等)。 +在什么环境下成立? 仿真还是现实?单臂机械臂还是移动操作平台?感知传感器配置如何?

把这些内容写成一句规范的“研究问题表述”,例如:

在桌面抓取任务中,当存在严重部分遮挡时,现有基于单视角视觉条件的 VLA 策略成功率显著下降。本研究的问题是:在不增加大规模示教成本的前提下,能否利用多视角信息提高对遮挡物体的抓取成功率?

这样的表述,比“提高机器人在复杂场景中的鲁棒性”之类的泛泛说法,已经具体和可操作得多。

11.3.3.2 假设切入

问题明确之后,需要提出若干“可检验的假设”(hypothesis),说明你认为为什么现状不好,以及你打算通过什么机制改进。

假设要尽量简洁、有因果指向,并且可以被实验推翻。例如:

  • 假设 1:在训练阶段增加多视角图像输入,可以改善模型对遮挡部位的表征,从而提高遮挡场景下的抓取成功率。
  • 假设 2:引入一个专门预测“遮挡区域显著性”的辅助任务,可以提高模型对关键几何结构的关注,从而提升鲁棒性。

对于具身智能中的 VLA 模型,常见的假设切入点包括:

  • 表征层假设:更好的视觉/语言表征会带来更好的决策。
  • 结构层假设:更合理的模态融合、记忆机制会改善长期任务表现。
  • 训练策略假设:更合理的模仿 / RL / 自监督组合会提升样本效率和泛化。

这里不需要一上来就设计一个庞大的“大一统架构”,而是先围绕一两个关键假设设计最小改动。

11.3.3.3 可行性评估

在正式开始实现之前,必须冷静评估 idea 的可行性。这一步既是对时间和精力的保护,也是避免“论文写了一半发现做不完”的关键。

可以从三个维度快速评估:

1.资源

  • 计算资源:需要训练的模型规模是否超出实验室 GPU 能力?训练一版模型要几天还是几周?
  • 数据资源:是否已有合适的数据集?若需自采,采集和标注成本多大? 2.复杂度
  • 软件工程复杂度:是否需要从头搭建完整机器人系统,还是在已有开源框架上做增量?
  • 硬件复杂度:是否依赖难以维护的复杂硬件(多臂协作、特殊传感器)? 3.时间线
  • 将整个项目拆成几个里程碑(baseline 复现 → 最小版本实现 → 完整实验 → 写作),估算每一步的时间。

一个实用的做法是给每个候选 idea 在“创新性 / 重要性 / 可行性”三个维度各打 1–5 分,再结合导师建议选出综合得分最高、风险可控的方向。


11.3.4 设计实验验证假设:对照组、变量控制

科学研究的核心不在于“提出多么炫的想法”,而在于“用严谨实验证明或否定这些想法”。在具身智能领域,这一点尤为重要:机器人实验昂贵、噪声大,如果实验设计不严谨,很容易得出偶然性结论。

【图 11-3-5:实验设计示意图。左侧为 baseline 流水线,右侧为在关键模块上添加新方法的改进流水线,二者共享相同的数据和评价协议。】

11.3.4.1 最小可行实验

验证假设不一定要一开始就上真实机器人全流程。更高效的方式是设计一个最小可行实验(Minimal Viable Experiment, MVE)

  • 环境可以简化:例如只用 3 种物体、固定光照和背景,而不是复杂家庭环境。
  • 任务可以简化:先验证“抓起目标物体”这一基本操作,再逐步扩展到“抓起 + 放置”、“序列操作”。
  • 模型可以简化:例如先将新表征模块接在一个较小的决策网络上,验证是否确实带来性能提升。

最小可行实验的目标不是展示“很酷的 demo”,而是尽快验证核心假设是否成立。如果在高度受控、简化的环境中假设都站不住脚,就没有必要投入巨大工程量扩展到复杂场景。

11.3.4.2 控制变量

要让实验结论可信,关键是实现“除了我要检验的因素之外,其余条件尽量保持不变”。在具身智能 / VLA 实验中,常见的控制变量包括:

+数据集与任务配置:同一批训练数据、相同的训练/验证/测试划分、相同的随机种子或至少相同的随机化策略。 +模型容量与训练预算:比较方法时,应尽量保持参数量级和训练轮次接近,避免“多一倍参数”的方法天然占优。 +系统环境:在真实机器人实验中,需要保持相似的物体摆放难度、场景布置和硬件状态(如关节润滑、传感器标定状态)。

形式上,你可以为每个假设设计一个或少量对照实验,例如:

  • baseline:原始 VLA 模型。
    • 模块 A:只加入新的视觉辅助任务。
    • 模块 B:只加入新的历史编码模块。
    • A + B:同时加入两者,看是否有叠加效果。

通过这种可控的“加减法”,读者才能清楚地看到每个改动对结果的真实贡献,而不是被一个“大杂烩模型”弄得云里雾里。

11.3.4.3 数据充分性

最后一个容易被忽视但非常关键的问题是:你收集的数据和运行的实验是否足以支撑结论?

在具身智能实验中,常见的“数据不充分”表现包括:

  • 每个设置只在极少数任务、极少数初始场景上测试;
  • 只跑了 1 次或 2 次随机种子,结果差异可能只是运气;
  • 没有报告失败案例,也没有分析模型在哪些条件下会崩溃。

更稳妥的做法包括:

  • 对每种方法在多个任务、多个随机场景上进行足够次数的试验,报告均值和标准差或置信区间。
  • 对关键任务绘制性能随训练步数变化的曲线,而不是只给出“最终数值”,帮助读者判断收敛速度和稳定性。
  • 对典型失败案例进行可视化分析,解释可能的失败原因,为后续改进提供线索。

在条件允许的情况下,也可以采用简单的统计检验(例如 t-test)来验证两种方法在多次重复实验中的差异是否具有统计显著性,而不是凭直观“看上去高了 3 个点”就下结论。


本节从“如何分层阅读单篇论文”出发,延伸到“如何借助综述把握全局、从基准中发现空白”、“如何把空白压缩为明确假设”,再到“如何设计最小、但足够有力的实验验证这些假设”。掌握这一整套流程,意味着你不仅能理解他人的工作,更能在具身智能这个快速演化的领域中,稳步构建属于自己的研究方向。后续 11.4 将进一步讨论如何将研究过程中的成果凝练为论文与报告,使你的工作在学术共同体中被清晰地传播与评价。

本章小结与自测

三行小结

  1. 本章把学习内容转为项目与科研实践能力。
  2. 重点是复现能力、实验设计与技术表达。
  3. 学完后应能独立完成小规模研究闭环。

检查题

  1. 用你自己的话总结本章最核心的一个公式/机制。
  2. 给出一个“如果要落地到项目里,你会怎么用”的具体例子。

常见误区

  1. 复现时跳过最小可运行基线。
  2. 不做消融直接下结论。
  3. 展示材料只给结果不给方法。

公式到代码(最小示例)

ablation = [
    {"cfg": "full", "sr": 0.78},
    {"cfg": "-language", "sr": 0.61},
]
for row in ablation:
    print(row["cfg"], row["sr"])

本章外部参考(集中)

  1. saiamrit.github.io
  2. 科学直通车
  3. phdassistance
  4. timscdrmumbai.in

11.4 写作与展示

11.4 写作与展示

本节讨论的不是“怎么做实验”,而是“怎样把已经做好的工作讲清楚”:写成论文、画成图、讲成报告,并且在团队中高效协作。对于具身智能方向的研究生而言,这几乎决定了你的工作能否真正被看到、被复现、被认可。


11.4.1 研究报告与论文结构(问题、方法、实验、讨论)

学习导航

  • 本章主题:11.4.1 研究报告与论文结构(问题、方法、实验、讨论)
  • 前置知识:建议至少完成第 1-10 章关键章节。
  • 建议用时:75-95 分钟
  • 阅读顺序:先看概念框架,再看公式/代码,最后做自测。

现代科学论文普遍采用 IMRaD 结构:Introduction(引言 / 问题)、Methods(方法)、Results(结果)、Discussion(讨论)。(The Writing Center) 不同期刊会有额外小节(相关工作、实验设置等),但核心逻辑是一致的:把科学探索过程压缩成一条清晰的故事线

11.4.1.1 问题动机

“问题动机”往往对应引言部分。它要完成三件事:

1.放置背景(Context): 在具身智能领域,背景可以是:

  • 机器人操作任务越来越复杂(家庭服务、多步骤装配等);
  • VLA 模型在视觉、语言、动作之间的统一建模正在成为趋势;
  • 现实部署时仍然存在样本效率、鲁棒性和安全性问题。 2.指出缺口(Gap): 不是简单地说“尚缺研究”,而是具体指出:
  • 现有方法在什么场景失败?例如只能处理短时操作,无法应对长时任务;
  • 现有数据集 / 评测标准有什么盲点?比如只在仿真中评测,缺现实机器人结果;
  • 现有模型在什么维度(样本效率、泛化、可解释性)明显不够好。 3.提出问题与贡献(Question & Contribution): 用一两句明确写出你要解决的问题,例如:

“我们研究如何让 VLA 模型在有限真实数据下,仍能泛化到新的桌面整理任务。” 随后用条目总结你的主要贡献(模型、数据集、理论分析等),让审稿人一眼看懂你做了什么。

写“问题动机”时需要注意:

+避免空泛口号:诸如“人工智能对人类社会很重要”这种句子对任何论文都成立,但不能帮助读者理解你的具体研究位置。 +尽量贴近“场景”:具身智能的天然优势是有具体物理场景,可以用 1–2 句描述一个真实情境(如“家庭机器人整理餐桌”),读者能立刻代入。 +适度关联前人工作:可以先概括几类主流方法,再指出它们的共同局限,将详细的 Related Work 放到单独小节展开。

(插图占位: 【图 11-4-1:具身智能论文的“背景–缺口–贡献”三段式结构示意图】 用简单框图展示:现实场景 → 现有方法 → 存在问题 → 本文方案与贡献。)

11.4.1.2 方法描述

“方法”部分要让读者既能理解你在做什么,又有机会复现。在具身智能论文中,常见的结构是:

1.整体框架图 + 概述 先用一张系统框图总览:输入(多模态观测、语言指令、机器人状态)→ VLA 模型结构 → 输出动作 → 与机器人控制器的接口。 用一小节(如 “Overview”)用文字走一遍图中信息流,不涉及细节,只讲模块之间如何协同。 2.模型结构与关键思想

  • 分别说明视觉编码、语言编码、历史轨迹编码、动作解码等模块;
  • 对具身智能特有的设计要重点解释,例如:
    • 动作 token 的离散化方式;
    • 如何在 Transformer 中融合视觉与语言(Cross-Attention、早期/中期融合等);
    • 如何兼容多机器人、多任务。
  • 若提出了新的损失函数、正则项、训练范式(如 BC + RL + 自监督联合训练),给出清晰公式和符号表,保持全篇符号一致。(queensu.ca) 3.训练与数据细节(但不变成“实验”) 在具身智能论文中,一些训练细节往往写在方法或“Implementation Details”小节:
  • 使用哪些数据源(开源数据集 + 自建数据);
  • 预训练与微调的阶段划分;
  • 重要超参数量级(学习率范围、batch size 数量级、训练总步数)。 细节不必穷尽,但要足够让他人可以复现主结果。 4.系统与硬件设置 对具身智能尤其重要:
  • 说明所用机器人平台(机械臂型号、自由度、末端执行器类型),传感器(相机类型、安装方式);
  • 若涉及手眼标定、控制频率等关键工程设置,可在方法末尾概述,详细信息可放附录。

(插图占位: 【图 11-4-2:典型 VLA 具身智能系统结构框图(视觉、语言、动作与控制器的关系)】

11.4.1.3 实验结果

IMRaD 中的“结果”部分,主要任务是把数据呈现清楚,而不做过度解读,解读放到讨论。(The Writing Center)

在具身智能领域,实验结果一般包括几层:

1.实验设置简述 在 Results 开头简要提醒:

  • 有哪些任务场景(抓取、分类搬运、开门等);
  • 使用哪些数据集 / 仿真环境 / 真实机器人;
  • 评价指标是什么(成功率、路径长度、完成时间、安全约束违反次数等)。 2.核心定量结果 通常以表格 + 若干曲线图呈现:
  • 与主流 baseline(例如 BC-only、纯 RL、无语言版本等)进行对比;
  • 在多任务、多物体、多环境条件下拆分指标;
  • 如果有消融实验(去掉语言条件、去掉历史轨迹、换 Visual backbone),建议用单独表格列出。 绘图时要遵守“图形完整性”原则,避免通过截断坐标轴等方式夸大差异。(PMC) 3.定性结果与可视化
  • 展示典型任务执行序列(关键帧截图);
  • 展示注意力热图、动作分布等,帮助读者理解模型在“看哪里、做什么”;
  • 展示成功和失败案例,并在讨论部分进一步分析原因。 4.泛化与鲁棒性实验 对具身智能来说,泛化常是审稿人关注重点:
  • 新物体、新布局、新指令的表现;
  • 仿真到现实(Sim2Real)的迁移结果;
  • 噪声、延迟、遮挡条件下的表现。

结果部分的写作风格应尽量中性、克制,少用“极大地、革命性”等夸张形容词,让数据自己说话。

11.4.1.4 讨论启示

“讨论”是从结果出发,回到你在引言中提出的问题,回答:这些结果说明了什么?有什么局限?对未来有什么启发?(sokogskriv.no)

可以考虑以下结构:

1.核心发现的总结 用 2–3 句话高度概括:

  • 在什么场景下你的方法明显优于 baseline;
  • 哪些能力(如长时规划、语言理解、多机器人泛化)得到显著提升。 2.为什么会这样:机制与直觉 尝试给出合理解释,而不仅是重复数字,例如:
  • 多模态预训练让模型在新任务上表现更好,是因为视觉–语言对齐减少了“找错物体”的错误;
  • 行为克隆 + RL 的组合在样本效率上优于纯 RL,是因为 BC 提供了合理的初始策略。 3.局限性与失败案例 对具身智能尤其重要:
  • 指出在什么任务上仍然失败(如复杂接触操作、强遮挡);
  • 分析原因(感知不稳定、控制接口延迟、训练数据分布偏差);
  • 能适度提出你计划如何解决,但不要在这篇文章里承诺太多。 4.对领域的启示与未来方向 把你的工作放回到“通用机器人 / 具身智能”的大图景中:
  • 你的结果是否支持某种建模路线(例如“统一 Transformer”确实在多任务上更有优势);
  • 对数据集设计、评测协议、系统架构的启示;
  • 未来可以如何扩大到更复杂环境、多机器人协作等(可和本书第 12 章的前沿方向呼应)。

11.4.2 图表与可视化的表达方式

图表的作用,是把长篇的数字和文字压缩成一眼可见的结构。数据可视化研究强调:图形应该以最少的“视觉噪声”,准确传达尽可能多的有用信息,包括避免所谓“chart junk”(为装饰而存在的多余元素)。(Luís Cruz)

具身智能论文里的图表常包括:

  • 训练曲线 / 学习曲线;
  • 成功率、奖励等统计曲线;
  • 对比 baseline 的指标表格;
  • 机器人执行任务的关键帧、轨迹示意等。

11.4.2.1 曲线图

曲线图适合表达随时间或某个变量变化的趋势,比如:

  • 训练步数 vs 成功率 / 回报;
  • 任务难度(物体数量、遮挡程度) vs 成功率;
  • 不同方法在同一任务上的学习速度对比。

设计曲线图时,可以遵循以下原则:(SPIE Digital Library)

1.坐标轴信息完整

  • 轴名称 + 单位要写清楚,例如 “Environment Steps (×10⁵)”、“Success Rate (%)”;
  • 若坐标轴截断或采用对数坐标,要在图上明确标明,否则容易误导。 2.曲线数量适中,易于区分
  • 一张图中最好不要超过 4–5 条曲线;
  • 使用不同线型(实线 / 虚线 / 点线)或色彩,配合清晰图例(legend);
  • 同一篇文章内尽量保持颜色含义一致(例如蓝色永远代表你的主方法)。 3.呈现波动与不确定性
  • 可以绘制平均值 + 标准差(或标准误差)带状区域,让读者看到结果的稳定性;
  • 避免只画单次运行的锯齿曲线,可在多次运行基础上平滑(移动平均)并注明处理方式。 4.图注(caption)要“可独立阅读” 很多写作指南建议:读者应该只看图和图注,也能大致理解结果含义。(SPIE Digital Library) 图注中应包含:
  • 图的目的(比较什么 vs 什么);
  • 实验设定的关键信息;
  • 主要观察结论(例如“我们的方法在大多数步数段均明显优于传统 BC”。)

(插图占位: 【图 11-4-3:不同方法在机器人抓取任务上的训练曲线对比示意图】 横轴为环境步数,纵轴为成功率,多条曲线表示不同算法。)

11.4.2.2 表格

表格适合展示离散的、多维的最终结果对比,例如:

  • 多个任务、多种方法、多种指标(成功率、耗时、能耗)的对照;
  • 消融实验不同配置(有 / 无语言条件、有 / 无历史轨迹)的结果;
  • 不同机器人平台上的性能。

设计表格时,建议注意:(queensu.ca)

1.结构清晰

  • 行一般是方法 / 配置,列是任务或指标;
  • 对于多任务多指标,可以分块或用分组表头(multi-level header)。 2.突出重点
  • 用粗体标记最优值,下划线或斜体标记次优值;
  • 可以增加“平均分”或“排名”一列,帮助读者快速形成整体印象。 3.必要的统计信息
  • 对关键结果提供标准差或置信区间;
  • 若有统计显著性检验(如 t-test),可在表中用符号注明(例如“*”表示 p < 0.05)。 4.表注说明变量和设定
  • 在表格下方用简短表注解释缩写(如 “SR=Success Rate”)、实验设定(如“每个任务评估 50 次尝试”);
  • 若空间有限,可以在附录中放完整表格,在正文展示简化版。

(插图占位: 【表 11-4-1:多任务具身操作中不同 VLA 模型成功率对比示意表】

11.4.2.3 图像示例

对于具身智能论文,图像示例可以让读者直观看到机器人在做什么,弥补纯文字和数字难以传达的细节。例如:

1.任务执行序列

  • 选取 3–6 张关键帧(初始、接近、抓取、放置等)拼成一行;
  • 在每帧下标注时间步和动作摘要(如“t=5,末端执行器向左平移”)。 2.轨迹与注意力可视化
  • 在图像上叠加末端执行器轨迹、抓取点、避障路径;
  • 可视化模型内部注意力:比如在图像上用热图表示语言 token “red block” 所对应的视觉注意区域。 3.成功与失败对比
  • 并列展示成功和失败的两个序列,帮助讨论模型在什么情况下容易失误(例如光照强烈反光、物体遮挡严重)。

在设计这些图像时,可以借鉴数据可视化的一个基本原则:在不牺牲准确性的前提下,尽量减少多余装饰,突出真正承载信息的部分。(GeeksforGeeks)

(插图占位: 【图 11-4-4:机器人执行“将红色积木放入盒子”的关键帧序列示意图】 【图 11-4-5:VLA 模型在不同语言指令下的视觉注意力热力图示意图】


11.4.3 组会报告与学术汇报的准备

写论文是静态表达,报告与汇报则是动态表达。二者的核心逻辑类似:讲清楚问题、方法和结果;但报告需要在有限时间内,让不同背景的听众跟得上你的节奏。

11.4.3.1 针对听众

准备报告前,先问自己三个问题:

1.听众是谁?

  • 组会:大多是同门、导师,熟悉具身智能和你所在项目的背景,可以讲得更技术、更细;
  • 学术会议:来自不同子领域(控制、视觉、NLP、强化学习),对你具体系统细节不熟,但对方法思想和实验设计很敏感;
  • 企业或跨学科听众:可能更关心应用前景、系统稳定性和可落地性,而不是公式推导。 2.他们已经知道什么? 工程演讲指南通常建议:开头几分钟要明确说明你的目标和假定背景。(米苏里科技大学)
  • 对组会报告,可以假定大家了解基本的 RL / BC / Transformer;
  • 对跨学科报告,则需要简要解释具身智能、VLA 和机器人任务设定。 3.他们最关心什么?
  • 导师:你是否有实质性进展、遇到什么阻碍、下一步计划是什么;
  • 程序委员会 / 会议听众:你的方法真的解决了一个清晰的问题吗?实验是否充分?
  • 企业听众:系统在真实场景中表现如何?硬件成本和工程复杂度如何?

根据这些判断,你可以调整报告中“理论细节 vs 实验 vs 工程实现”的比例。

11.4.3.2 讲稿结构

一次典型的技术报告(10–15 分钟)可以采用以下结构:(engineering.purdue.edu)

1.标题与动机(1–2 张)

  • 标题页:题目、作者、机构、机器人平台照片(增加直观印象);
  • 动机页:一张真实场景图片或视频截图,说明“我们想让机器人完成什么任务”,配合 2–3 句话说明现有方法的问题。 2.问题定义与挑战(1–2 张)
  • 用图示说明任务设定:输入、输出、环境;
  • 列出 2–3 个核心挑战,例如:多模态对齐、长时规划、Sim2Real 差距。 3.方法概览与关键模块(3–4 张)
  • 打一张总框图,类似论文方法小节中的系统图;
  • 每个关键模块一张图,例如“视觉编码器”、“语言条件模块”、“动作解码器”;
  • 对具身智能系统,可以单独介绍“如何与真实机器人控制器接口”。 4.实验与结果(3–4 张)
  • 1 页总结实验设置(任务、数据、指标);
  • 1–2 页展示关键定量结果(表格或曲线),突出结论性的比较;
  • 1–2 页展示关键定性结果(任务执行视频 / 截图)。 5.讨论、局限与未来工作(1–2 张)
  • 一页总结“我们学到了什么”(3 个要点);
  • 一页说明局限与下一步计划,例如“尚不支持多机器人协同”、“真实环境样本仍偏少”。 6.总结与提问(1 张)
  • 用 3 条 bullet 总结贡献;
  • 明确写出“欢迎提问”,并保留时间。

实际准备时,可以粗略以“1 分钟 ≈ 1 张内容丰富的幻灯片”来估计总页数。

(插图占位: 【图 11-4-6:具身智能项目技术报告的示例目录结构】

11.4.3.3 演讲技巧

技术演讲的目标不是表演,而是让尽可能多的听众真正理解你的工作。一些通用的工程演讲建议在机器人场景同样适用:(米苏里科技大学)

1.节奏与时间控制

  • 正式场合的 10–12 分钟报告,建议提前至少完整试讲 2–3 次,计时;
  • 对每一页幻灯片有一个明确的“核心句子”,讲完这句就可以翻页,避免在某一页停留过久;
  • 避免在最后几分钟仓促跳过关键实验,只能匆匆给出结论。 2.语言与表达
  • 使用短句 + 明确主语,避免长而复杂的从句;
  • 尽量少念 PPT 上的文字,而是用自己的话解释图和公式;
  • 对于复杂公式,只讲它“代表什么关系”,不必逐项朗读。 3.图像与动画
  • 具身智能报告非常适合带视频或动画演示,但应准备好备用方案(静态截图 + 说明),以防现场播放失败;
  • 动画要简洁:比如展示轨迹演化、注意力随时间的变化,而不是花哨的转场效果。 4.面对提问
  • 遇到没有想过的问题,可以先复述问题确认理解,再用你已有的分析框架尝试回答;
  • 对于暂时无法回答的问题,可以坦诚说明:“我们还没有在那个场景下测试,但根据目前结果,我的直觉是……”,并可以记录下来作为后续工作线索。 5.线上报告 对远程会议,要特别注意:
  • 提前测试网络与音频设备;
  • 减少 PPT 上过小的文字,保证在小窗口里仍可看清图和公式;
  • 使用激光笔/鼠标标记关键区域,帮助听众跟随。

11.4.4 与导师和同组同学的协作方式

具身智能项目通常是多人协作的大工程:模型、仿真、硬件、系统集成、数据工程等等。良好的协作能让你事半功倍,糟糕的协作则可能让好想法被埋没。

11.4.4.1 定期沟通

研究生与导师、组员之间如果缺乏结构化沟通,很容易出现“方向偏了很久才发现”的情况。研究生–导师沟通的经验研究普遍建议:定期会议 + 明确记录 + 可执行的下一步任务。(howtowriteaphd.org)

可以参考以下做法:

1.固定节奏

  • 与导师至少保持每 1–2 周一次的正式沟通;
  • 组内项目(尤其是涉及机器人实物操作)可以再单独有每周例会,汇报数据采集和系统状态。 2.会前准备
  • 用一页或一两张幻灯片总结自上次会议以来的进展:完成了哪些实验、发现了哪些问题;
  • 列出你需要讨论的关键问题(例如“动作离散化方案是否需要调整”、“真实机器人实验的安全限制如何设置”),避免会议变成单向汇报。 3.会后记录
  • 会议结束后,整理一份简短的 Meeting Notes,通过邮件或协作平台发给导师和组员:
    • 本次会议的结论(例如“优先在仿真验证多机器人场景”);
    • 明确分配的任务和 deadline;
    • 需要进一步查阅文献或实验验证的开放问题。 这类做法被多篇指导文档视为缓解沟通误差的有效方式。(howtowriteaphd.org)

11.4.4.2 协作开发

具身智能项目往往涉及大量代码、配置和实验脚本。良好实践包括:(Nature)

1.版本控制与代码组织

  • 使用 Git 等版本控制工具,建立统一的代码仓库;
  • 按模块组织目录(data、models、training、robot_interface、evaluation 等),避免“一个巨大脚本包打天下”;
  • 在 README 中写清楚“怎样从零跑起一个最小示例”。 2.统一编码规范
  • 制定或采用现有的代码风格规范(如 Python 的 PEP 8),并在 CI(持续集成)中自动检查;
  • 对涉及机器人控制的关键模块(安全检查、力矩限制等),要求至少一名组员进行 code review,以减少隐蔽 bug。 3.实验记录与可复现性
  • 使用实验管理工具或简单的日志文件记录每次实验的配置(超参数、数据版本、代码提交哈希);
  • 对关键结果建立“再现脚本”,保证新成员或审稿人有机会复现实验。 4.软硬件协作 在具身智能项目中,一部分同学偏算法,一部分偏硬件:
  • 建议建立清晰的接口文档(例如动作命令和传感器数据的消息格式),减少反复对接;
  • 硬件同学在更改机械臂或相机配置时,应同步更新标定和系统参数,并通知算法同学。

良好的协作开发不仅提高效率,也是提升研究可复现性与可信度的重要途径。(Nature)

11.4.4.3 互相审阅

互相审阅包括:论文草稿、报告幻灯片、代码与实验设计。它的价值主要体现在三个方面:

1.提前发现问题

  • 同门往往比审稿人更早看到你的初稿;
  • 他们可以指出“这部分的符号定义看不懂”、“图 3 和图 4 的颜色含义不一致”等细节问题,也能指出实验缺失之处。 2.提升表达质量
  • 邀请对该方向不太熟悉的同学阅读你的摘要和引言,如果他们能大致复述你的工作,你的表达就基本合格;
  • 对于英文论文,请至少让一位写作较强的同学帮忙润色语法与措辞。 3.澄清贡献与署名
  • 在涉及多位同学合作的大项目中,应尽早、透明地讨论各自贡献与论文作者顺序,避免后期产生分歧;(Academia Stack Exchange)
  • 在 code review 和实验设计审阅中,明确哪些贡献应被计入论文署名,哪些属于日常技术支持。

互相审阅的态度也很重要:

  • 给别人意见时,尽量具体、建设性(指出问题 + 给出可选改进方向);
  • 接受意见时,不要把批评当成“针对个人”,而是把其视作帮你提升文章质量和说服力的免费资源。

本节从论文结构、图表设计、口头报告到团队协作,构成了具身智能研究中“表达与沟通”的完整闭环。前面各章教你如何把机器人做“聪明”,而本节的目标,是让这些聪明真正被世界看见、理解并在此基础上继续演化。

本章小结与自测

三行小结

  1. 本章把学习内容转为项目与科研实践能力。
  2. 重点是复现能力、实验设计与技术表达。
  3. 学完后应能独立完成小规模研究闭环。

检查题

  1. 用你自己的话总结本章最核心的一个公式/机制。
  2. 给出一个“如果要落地到项目里,你会怎么用”的具体例子。

常见误区

  1. 复现时跳过最小可运行基线。
  2. 不做消融直接下结论。
  3. 展示材料只给结果不给方法。

公式到代码(最小示例)

ablation = [
    {"cfg": "full", "sr": 0.78},
    {"cfg": "-language", "sr": 0.61},
]
for row in ablation:
    print(row["cfg"], row["sr"])

本章外部参考(集中)

  1. The Writing Center
  2. queensu.ca
  3. PMC
  4. sokogskriv.no
  5. Luís Cruz
  6. SPIE Digital Library
  7. GeeksforGeeks
  8. 米苏里科技大学
  9. engineering.purdue.edu
  10. howtowriteaphd.org
  11. Nature
  12. Academia Stack Exchange

12.1 更通用的具身基础模型

在前面章节中,我们已经看到 VLA 模型如何把视觉、语言和动作统一到一个序列建模框架中。随着数据规模、模型规模以及机器人平台的不断扩展,一个自然的问题是:是否可以像 GPT 之于自然语言一样,构建“具身基础模型”(robotics / embodied foundation models),在不同机器人、不同任务和环境之间共享同一个“大脑”?

近年的 Open X-Embodiment、RT-X、RT-1/RT-2、OpenVLA 等工作已经给出了早期答案:通过汇聚多机器人、多任务的示教数据,在统一的 Transformer 架构上进行大规模预训练,可以得到跨平台迁移能力较强的通用控制策略。(arXiv)

本节将进一步从三个方面展望更通用的具身基础模型形态:

1.统一感知–语言–动作–记忆的长序列建模:模型不再只看“当前几帧图像 + 指令”,而是能在长时间尺度上整合多模态历史和长期记忆。 2.跨模态世界模型与规划能力:模型内部拥有可“想象”未来的世界模型,并在多模态空间(图像、语言、动作)中进行规划与推理。 3.多机器人协作与群体智能:从单一机器人扩展到机器人群体,让基础模型在多智能体场景中学习协同、通信和分工。

12.1.1 统一感知–语言–动作–记忆的长序列建模

学习导航

  • 本章主题:12.1.1 统一感知–语言–动作–记忆的长序列建模
  • 前置知识:建议全书主线章节均已通读一遍。
  • 建议用时:65-85 分钟
  • 阅读顺序:先看概念框架,再看公式/代码,最后做自测。

传统 VLA 更多关注“短序列”:几十到几百步的感知–动作序列,以及一句或几句指令。在真实应用中,机器人往往需要:

  • 记住数小时甚至数天前发生过什么;
  • 融合多种传感器(视觉、力觉、触觉、语音、机体状态等);
  • 跨任务、跨场景复用过去经验。

这意味着仅靠固定长度的 Transformer 上下文已经不够,需要在模态扩展时间尺度扩展上同时进化。

【图 12-1:示意一条统一时间轴,沿时间维度排布图像帧、语言 token、关节状态、力觉读数和动作命令,每个都被编码为 token 输入同一个 Transformer。】

12.1.1.1 模态融合扩展

当前的 VLA 多以“视觉 + 文本 + 动作”为主。例如 RT-1 / RT-2 和 OpenVLA 将图像帧、自然语言指令和机器人关节/末端命令统一编码为 token 序列,输入同一个 Transformer 决策器。(robotics-transformer-x.github.io)

未来更通用的具身基础模型会在模态上进一步扩展:

1.感知层扩展

这些信号可以通过专门编码器(CNN/ViT、RNN/Transformer、MLP 等)转换成一系列向量 token,再按时间对齐后送入统一的序列模型。

+视觉:不再只有 RGB,相机可能包括深度图、鱼眼、全景、多视角甚至事件相机; +触觉与力觉:高维的触觉阵列、关节力矩传感器、六维力/力矩传感器等,反映接触和相互作用; +机体状态:关节角、速度、温度、电流、电池电量等内部状态; +语音与声音:语音命令、环境噪声,可用于人机交互和安全监控。

2.统一时间轴与多频采样

不同传感器的采样频率差异巨大:

典型做法包括:

  • 视觉 10–60 Hz;
  • 力觉和关节状态可到 100–1000 Hz;
  • 语言指令可能是几十秒才更新一次。
  • 在较粗的时间步(如 10 Hz)上建模,使用统计或卷积池化将高频信号压缩到该时间步;
  • 引入层级时间建模:底层网络处理高频控制,顶层网络在低频节奏上决策(与机器人控制章节呼应)。

这样可以在不牺牲关键信息的前提下,把多模态信息统一描述在同一条序列上。

3.高效注意力与结构化融合

当所有模态 token 都放进一个自注意力网络时,复杂度会随序列长度平方增长,这在长序列、多模态下极易失控。 未来的架构通常会采用:

  • 稀疏/分块注意力:例如对视觉 token 只在空间邻域内自注意,对时间和语言采用更稀疏的连接;
  • 分组注意力:不同模态内部先各自进行自注意,再通过跨模态注意力交互;
  • 图结构:把机器人不同部件、不同传感器看作图中的节点,仅在有物理或任务关系的节点间做消息传递。

【图 12-2:多模态 Transformer 结构示意图,分别显示视觉、语言、机体状态、力觉四类 token,经各自编码后在中间层通过稀疏自注意力和跨模态注意力融合。】

12.1.1.2 长期记忆

即便使用更高效的注意力结构,单个 Transformer 上下文仍然难以覆盖数小时乃至“终身”的交互历史。因此需要在序列模型之外设计长期记忆系统,类似于“记忆增强版大模型(memory-augmented models)”。(massimilianovurro.com)

1.短期工作记忆 vs 长期持久记忆

类似检索增强的 RL 与 Decision Transformer,会在当前状态基础上从外部记忆中检索相关子轨迹,提高决策能力。(Proceedings of Machine Learning Research)

+工作记忆:模型当前上下文窗口内的若干百步历史,主要由 Transformer 自注意力负责; +长期记忆:以外部存储形式保留过往的轨迹、地图、用户偏好、失败经验等,可以跨任务甚至跨天、跨月保留。

2.外部记忆的形式

在机器人场景中,长期记忆通常具有多种结构化形式:

近年来大量工作探讨多模态记忆在视觉和机器人中的应用,如为导航与操作提供长期上下文。(GitHub)

+轨迹记忆库:存储过去任务中的感知–动作–奖励序列,可以按“场景相似度”“任务类型”“语言指令”检索; +知识库 / 语义图:存储“某个房间有哪些物体”“某用户习惯把什么放在哪”等抽象语义关系; +地图与对象数据库:比如 SLAM 生成的拓扑/栅格地图,以及已知物体的 3D 模型、位姿分布等。

3.检索与更新机制 长期记忆要解决两大问题:如何取用如何写入。典型思路包括:

  • 检索:
    • 通过 learned embedding 或 kNN,根据当前感知+指令在记忆库中查找“相似场景”;
    • 使用注意力机制在大量候选记忆中软选择少量高相关子轨迹(如 Retrieval-Augmented RL、Retrieval-Augmented Embodied Agent)。(Proceedings of Machine Learning Research)
  • 更新:
    • 机器人完成任务后,将经验以“摘要”形式写入:如一条轨迹 + 成功/失败标记 + 语言总结;
    • 对冗余或过时记忆进行压缩或遗忘,避免无限膨胀和概念漂移。

【图 12-3:带外部记忆的 VLA 框架示意图:Transformer 主体左侧接收当前多模态输入,右侧通过检索接口连接一个“经验库”,检索得到的关键轨迹片段再反馈给 Transformer 用于决策。】

4.记忆类型与机器人行为 可以借鉴认知科学,把机器人记忆分为:

具身基础模型的长期记忆机制,很可能会自然形成这三类记忆的某种分工,从而支持更高层的推理(在 12.2 节将与终身学习联系起来)。

+情景记忆(episodic):具体任务执行过程,如“上周清理厨房时的操作轨迹”; +语义记忆(semantic):抽象的世界知识,如“抽屉一般向外拉开”; +程序记忆(procedural):技能级策略,如“如何平稳端起一杯水”。

12.1.1.3 世界模型

**世界模型(World Model)**指的是机器人内部学习到的、可预测环境未来变化的生成模型。与传统的显式物理仿真不同,世界模型通常通过神经网络从数据中学习,反映“观察–状态–动作–结果”的统计规律。(arXiv)

1.基本构成 典型世界模型会显式或隐式包含三个模块:

例如 World Models、PlaNet、Dreamer 等工作,皆通过这种潜在空间的世界模型实现从图像输入的长视野控制。(arXiv)

+表示模型(encoder):将高维观测(图像、深度图等)编码为紧凑的潜在状态 \( z \) ; +动态模型(transition):给定当前潜在状态和动作,预测下一时刻的潜在状态; +解码模型(decoder):从潜在状态生成预测的观测(未来图像帧、深度图等)以及奖励或任务进展信号。

2.角色:机器人“想象力”的载体

世界模型的关键价值,在于让机器人可以在内部“做梦”或“想象”:

+离线规划与评估:在真实执行之前,机器人可以在世界模型中模拟不同动作序列的结果,从中选出代价较低的一条; +数据效率提升:在有限真实数据基础上,通过世界模型生成额外“虚拟轨迹”,用于训练策略(类似 Dyna、Dreamer 这类模型); +安全性:在执行潜在危险动作前预演可能后果,如预测是否会碰撞或打翻玻璃杯。

3.与长期记忆的关系

当二者结合时,机器人可以既依据一般规律预测未来,又能依据具体经验做出更加贴合现实的决定:例如世界模型知道“抽屉可以被拉开”,长期记忆知道“这个抽屉之前卡住过要用更大力 / 角度”。

+世界模型更像是“环境的物理与语义规律”:如果在状态 \( s \) 做动作 \( a \) 会出现什么; +长期记忆更像是“个体经历”:曾在某个房间做过什么、有过哪些成功或失败案例。

【图 12-4:世界模型结构示意图:左侧从图像编码为潜在状态,中间用 RNN/Transformer 做潜在动态演化,右侧再解码回未来图像和奖励。】


12.1.2 跨模态世界模型与规划能力

上一小节从“长序列和记忆”的角度引出世界模型,本节进一步强调:真正通用的具身基础模型,其世界模型本身也应是“跨模态”的。 换句话说,它不仅能预测未来的视觉帧和物理状态,还可以在语言、符号和动作空间中进行交互式推理和规划

12.1.2.1 世界模型(跨模态视角)

从跨模态的视角来看,一个理想的世界模型应具备以下特点:(科学直通车)

1.统一潜在状态表示

例如,\( z \) 可同时支持问题:“如果执行该动作,下一帧会看到什么画面?”以及“用一句话描述刚才发生了什么?”

  • 将视觉、触觉、机体状态、语言指令等都嵌入到一个共享的潜在空间 \( z \) 中;
  • 这个 \( z \) 能同时被“视觉解码器”还原成图像、“语言解码器”转换成自然语言描述、“状态解码器”还原为物理量。

2.条件化动态

例如,指令从“打扫桌面”改为“只整理左侧书本”,世界模型生成的“合理未来”应明显不同。

  • 在给定指令或任务上下文的条件下,世界模型可以预测在遵循该指令时环境将如何演化;
  • 这类似于“带任务条件的物理模拟器”:同样的物理环境,按照不同任务策略,未来的轨迹会有显著差异。

3.不止会“看”,还能“说”

传统世界模型主要输出图像或状态序列。跨模态世界模型还可以:

这使得人类可以通过语言直接与世界模型交互,更易于理解和调试。

  • 生成自然语言解释(例如对模拟轨迹进行总结);
  • 接受自然语言问题,对未来的模拟结果进行问答。

【图 12-5:跨模态世界模型示意图:中间是统一潜在状态,左侧是图像解码器,右侧是文本解码器,下方是物理状态解码器,上方是动作/指令条件输入。】

12.1.2.2 跨模态交互

跨模态世界模型带来的新能力之一,是让机器人能够以类似“脑内演算 + 语言思考”的方式与世界进行交互。(CVF开放获取)

1.语言条件的想象(language-conditioned imagination) 示例流程:

人类甚至可以直接要求机器人“先给我看一下可能的执行方式”,由世界模型生成几段短视频或帧序列供确认。

  • 人类: “把台面上的玻璃杯挪到右侧架子上,不要打翻任何东西。”
  • 机器人:将指令编码后,调用世界模型生成若干“候选执行方式”的模拟视频/轨迹;
  • 再由语言模块读取这些模拟结果,回答诸如“哪条方案更安全”“是否有可能碰到桌上的花瓶”。

2.从视觉到语言,再回到动作

这样,规划过程是可解释的:每一步都可以用语言解释“为什么这样走”。

  • 机器人通过视觉观测场景,用语言模块生成内部描述(例如“桌上有两个杯子,一个玻璃一个塑料,右侧有一个空架子”);
  • 世界模型在这个语言–视觉–动作的联合空间中模拟未来,输出既有图像又有文本解释的“计划脚本”;
  • 最终 VLA 决策头将这些高层计划翻译为细致的动作序列。

3.跨模态一致性与自监督

在训练过程中,跨模态世界模型还可以利用自监督的跨模态一致约束

这种一致性学习,有助于提升模型对物理规律与语言描述之间关系的理解。

  • 给定一段视频,模型需要同时预测其未来帧和未来的语言解说;
  • 给定语言脚本,模型要生成对应的视觉轨迹。

【图 12-6:跨模态交互示意图:左侧输入当前图像和指令,中间世界模型展开多条候选未来轨迹,右侧语言模块对每条轨迹给出解释和风险评估。】

12.1.2.3 规划推理

有了跨模态世界模型,规划不再只是“在状态空间里搜索动作序列”,而是可以在视觉–语言–动作联合空间中进行更加灵活的推理。(arXiv)

1.基于世界模型的规划(model-based planning)

基本思路与 Dreamer、MuZero 等工作类似:在世界模型中模拟不同动作序列的结果,挑选返回值最高的一条。区别是:

规划方法可以是:

  • 这里的状态不仅是隐变量和奖励,还包括未来观察到的图像和语言解释;
  • 规划时可以显式加入语言约束(例如“避免打碎任何玻璃物品”),并在模拟轨迹上检查是否违反。
  • 随机射击或 CEM(随机生成若干动作序列,保留较优者迭代优化);
  • MCTS 树搜索(在世界模型中扩展搜索树);
  • 结合梯度的轨迹优化(在可微世界模型中直接优化连续动作)。

2.分层规划:语言–符号–几何的协同

通常会采用分层规划框架:

具身基础模型可以在中高层同时发挥作用:既参与子任务分解,又担任模拟器,统一了传统“符号规划 + 物理规划”的分裂结构。

+高层(语言/符号层):由语言模型或符号规划器生成一系列子目标/子任务(如“清空桌面 → 打开放置柜 → 逐个搬运物品”); +中层(世界模型层):在每个子目标下,用世界模型评估不同策略的可行性和风险; +低层(几何/控制层):最终在真实机器人或高保真仿真中生成可执行轨迹。

3.带不确定性的推理与安全规划

世界模型必然是不完美的,它的预测存在不确定性。为了安全起见:

  • 模型可以对未来的预测给出不确定度估计,例如“80% 可能不会碰到花瓶,20% 可能发生轻微碰撞”;
  • 规划算法可以将这种不确定性纳入代价函数,例如对高不确定性轨迹进行惩罚;
  • 在高风险场景中,机器人可以主动请求人类确认,或者选择更保守的策略。

【图 12-7:分层规划框架示意图:顶层语言 LLM 负责任务分解,中层跨模态世界模型负责模拟和评估,底层运动规划模块负责生成可执行轨迹。】


12.1.3 多机器人协作与群体智能

如果说“具身基础模型”解决的是**“单个机器人如何更聪明地行动”**,那么下一步必然要面对的问题是:多个机器人如何在同一模型或同一知识体系下实现协作与群体智能

从产业角度看,无论是仓储物流的海量移动机器人、工厂中协同搬运的机械臂,还是灾害救援中的无人机集群,多机器人系统相较单机具有更强的效率和冗余,但也带来任务分配、通信、冲突避免等一系列挑战。多智能体深度强化学习和群体机器人(swarm robotics)领域已经积累了大量成果,为未来的“群体具身基础模型”提供了理论基础。(MDPI)

【图 12-8:多机器人协作示意图:若干移动机器人在仓库中协同搬运货物,中心有一个共享的世界模型与任务调度模块,各机器人之间通过无线网络交换少量消息。】

12.1.3.1 协同策略

在多机器人系统中,“策略”不再是单个智能体的映射,而是一个联合策略\( \pi(a_1, \dots, a_N | o_1, \dots, o_N) \),或者多智能体分别的局部策略 \( \pi_i(a_i | o_i, m_i) \)(其中 \( m_i \) 代表收到的消息)。为了实现高效协同,常见范式包括:(MDPI)

1.集中训练、分布执行(CTDE)

  • 训练时,所有机器人共享一个(或若干个)具身基础模型,能够访问全局观测和其他机器人内部状态;
  • 执行时,每个机器人仅使用本地观测和少量通信消息进行决策;
  • 这种范式能够在训练中利用全局信息提高样本效率,而在部署时保持分布式的鲁棒性。 2.角色与技能的显式分工
  • 不同机器人可以在模型中被编码为不同“角色”(如“搬运”“侦察”“清扫”),每个角色对应不同的技能集;
  • 具身基础模型可以利用“机器人 ID + 角色 embedding”的方式,在同一参数集下实现多机器人异质决策(这一点与 8.5 节的多机器人共享模型相呼应)。(arXiv) 3.隐式协同:通过共享世界模型
  • 即使不显式引入消息传递,多个机器人在共享的世界模型/价值函数上优化时,也可能出现“涌现式协作”行为;
  • 例如在仓储场景中,机器人可能自动学会错峰通过狭窄通道、轮流进入装卸区,以提高总体吞吐量。

【图 12-9:CTDE 框架示意:训练阶段中央服务器看到所有机器人观测和动作,更新共享策略;执行阶段每个机器人仅用局部信息和共享策略进行独立决策。】

12.1.3.2 通信与分工

多机器人协作离不开信息交换任务分工。在基础模型的框架下,可以把机器人间通信看作另一种“模态”,通过序列建模统一处理。(MDPI)

1.通信形式 具身基础模型可以在内部学习“哪些信息值得通报”,而不是预定义通信协议。例如,多智能体 RL 中常见的图网络架构,可被视为一种“可微通信”机制。(机器学习研究杂志)

+隐式通信:机器人通过观察他人的动作或环境变化推断其意图,无需显式消息(类似人类通过肢体语言协同); +结构化消息:使用固定格式的向量或符号信息(如位置、负载、优先级),通常通过图神经网络进行消息传递; +自然语言 / 类语言通信:在更高层次,机器人可以使用文本或压缩后的“伪语言 token”交流任务意图和状态摘要。 2.动态任务分配与负载均衡

  • 在复杂场景中,任务往往是不断到来的,如新订单、新救援目标;

  • 中心调度器或分布式协商算法需要考虑每个机器人的位置、剩余电量、当前任务负载等因素,动态分配任务;

  • 具身基础模型可以在此扮演“学习型调度器”,通过大量历史数据学习到高效的任务分配策略,例如实时优化通道拥堵和整体效率。(arXiv) 3.共享记忆与协作策略库

  • 12.1.1.2 的长期记忆类似,多个机器人可以共享一个“团队记忆库”,记录过去协作中使用过的策略和结果;

  • 检索增强的具身智能(如 Retrieval-Augmented Embodied Agents)已经尝试让多个机器人从共享策略库中检索过去类似场景下的成功策略,再组合生成新策略。(CVF开放获取)

【图 12-10:多机器人通信与分工示意:机器人以图节点形式存在,边表示通信链路,每个节点从邻居接收消息并更新本地策略,中央或分布节点负责分配新任务。】

12.1.3.3 群体智能

**群体智能(Swarm Intelligence)**是多机器人协作的更极端形态:大量简单机器人通过局部规则和有限通信,实现全局复杂行为。与传统的“少数高能力机器人”相比,群体机器人系统具有更高的鲁棒性和可扩展性。(ResearchGate)

1.经典群体机器人范式

  • 灵感来自蚂蚁觅食、蜜蜂分工、鸟群/鱼群聚集等自然系统;
  • 典型任务包括集群移动、覆盖、搜索救援、分布式建造等;
  • 控制策略多采用局部规则+随机性,无需全局控制器,仅依靠简单行为的叠加产生“涌现行为”。 2.多智能体深度强化学习在群体中的应用
  • 近年来,多智能体深度 RL 已经被用来训练成百上千个机器人在复杂环境中协同工作,如队形控制、障碍绕行、资源分配等;(MDPI)
  • 世界模型可以在此扮演“群体级模拟器”的角色,用于训练和评估大规模群体策略;
  • 相比手工设计局部规则,学习得到的局部策略有望更适应复杂环境、具有更高的任务完成率。 3.群体具身基础模型的愿景 未来的一个重要方向,是构建面向群体的具身基础模型,使得:
  • 同一个模型能够控制从数个到数百个机器人,且性能随规模扩展不明显退化;
  • 模型不仅学习个体如何运动,还学习群体结构如何形成(如自动分组、形成队形、建立临时网络);
  • 高层可以通过简单的语言指令(如“搜索整个楼层”“协助人群疏散”)对群体下达命令,模型自动在群体内部完成分解与分工。(techrxiv.org)

【图 12-11:群体智能示意图:上图展示几十个简单移动机器人在仓库中形成自组织交通流;下图展示一个“群体具身基础模型”通过高层指令控制整个群体的整体行为。】


本节从长序列多模态建模跨模态世界模型与规划以及多机器人协作与群体智能三个维度,对“更通用的具身基础模型”做了系统展望。下一节(12.2)将进一步聚焦模型的泛化与自适应能力,讨论如何让这些基础模型在极少样本、新环境和长期部署的场景中持续保持“越用越聪明”。

本章小结与自测

三行小结

  1. 本章扩展到前沿趋势与长期职业发展。
  2. 重点是建立可持续迭代的研究与工程路线。
  3. 学完后应能形成个人中长期方向规划。

检查题

  1. 用你自己的话总结本章最核心的一个公式/机制。
  2. 给出一个“如果要落地到项目里,你会怎么用”的具体例子。

常见误区

  1. 只追热点,不做能力积累。
  2. 方向切换过频繁。
  3. 缺乏长期项目沉淀。

公式到代码(最小示例)

papers = [
    {"topic": "generalization", "status": "reading"},
    {"topic": "safety", "status": "todo"},
]
next_topics = [p["topic"] for p in papers if p["status"] != "done"]
print(next_topics)

本章外部参考(集中)

  1. arXiv
  2. robotics-transformer-x.github.io
  3. massimilianovurro.com
  4. Proceedings of Machine Learning Research
  5. GitHub
  6. arXiv
  7. 科学直通车
  8. CVF开放获取
  9. arXiv
  10. MDPI
  11. 机器学习研究杂志
  12. arXiv
  13. 本章其余链接可在正文中按上下文继续查阅。

12.2 更强的泛化与自适应能力

12.2.1 少样本 / 零样本任务泛化

学习导航

  • 本章主题:12.2.1 少样本 / 零样本任务泛化
  • 前置知识:建议全书主线章节均已通读一遍。
  • 建议用时:69-89 分钟
  • 阅读顺序:先看概念框架,再看公式/代码,最后做自测。

在前面的章节里,我们主要讨论了“在给定任务和数据下把模型训练好”。但真正投放到现实世界后,更棘手的问题是:新任务、新物体、新环境几乎每天都在出现,不可能为每一种情况都采集海量数据再重训一次模型。

少样本 / 零样本泛化,就是试图回答两个问题:

  • 只有很少甚至没有新数据时,如何让机器人“举一反三”?
  • 怎样把互联网上海量、杂乱的人类经验,转成机器人可以直接利用的能力?

12.2.1.1 元学习(Meta-Learning)

元学习常被称为“学会如何学习”(learning to learn):不是只学某个具体任务的参数,而是学一个更新规则或初始化状态,让机器人在面对新任务时,只用极少数据和几个更新步骤就能适应。(ACM数字图书馆)

一个典型的公式可以这样写:

\[ \min_{\theta} \sum_{T \sim p(T)} \mathcal{L}_T\big(U(\theta, D_T^{\text{train}}), D_T^{\text{test}}\big) \]

  • \(\theta\):“元参数”,比如所有任务共享的初始网络参数;
  • \(U(\cdot)\):“内层更新算子”,比如在新任务上做几步梯度下降;
  • \(D_T^{\text{train}}\) / \(D_T^{\text{test}}\):任务 \(T\) 的少量训练 / 测试数据。

经典方法类别

1.优化式元学习:以 MAML 为代表,显式优化“经过几步梯度更新后的效果”。许多机器人 manipulation 工作将 MAML 和模仿学习结合,形成 meta-imitation learning:在大量不同的抓取/推拉任务上训练,让机器人只靠 1–3 条新示范就能学会一个新任务。(robot-learning.ml) 2.度量式元学习:如 Prototypical Networks,通过学习一个嵌入空间,使得“同一任务中的好动作/好状态”彼此接近,测试时只需在嵌入空间做最近邻检索即可。 3.模型式元学习:直接用 RNN/Transformer 作为“学习器”,把一段交互历史(状态、动作、回报)当作序列输入,网络隐状态本身就扮演“在线更新”的角色。

在具身机器人中的应用

  • 针对“新任务但物理性质相似”的场景,元学习格外有优势。例如针对不同地形上的“舀取沙土”任务,对每种地形只收集少量试验数据,用深高斯过程 + 元学习在不同地形间迁移,能快速在线调节策略,在未见过的目标地形上也能成功采样。(arXiv)
  • 在多任务 manipulation 基准(如 Meta-World)上,Transformer + 元模仿学习模型可以只用几条新示范,就适配到新的组合任务。(robot-learning.ml)

与 VLA 的结合

在 VLA 场景中,一个“任务”通常是“语言指令 + 场景分布”的组合(例如“把任意红色杯子放到任意一层架子上”)。元学习提供几种思路:

  • 冻结大部分视觉–语言 backbone,只对动作解码头或小规模 Adapter 做快速梯度更新;
  • 把“少量新示范轨迹”作为额外 token(上下文)拼进 Transformer,让模型做“in-context meta-learning”,在推理时就完成适配,无需显式梯度更新。

【图 12-10 占位:示意图:上层是很多不同任务的数据块,下层是共享的 VLA 模型,通过“外层更新”学会一个好初始化,面对新任务只需一两步更新即可。】

从工程角度看,元学习适合那些任务切换频繁但每个任务可采集的数据都很有限的机器人系统,例如物流中心里频繁变更的拣货规则、实验室里不断变化的新实验操作流程。


12.2.1.2 零样本迁移(Zero-Shot Transfer)

少样本学习还有几条示范;零样本则更“硬核”:在新任务上没有机器人数据,甚至不做任何额外训练,就要直接表现出合理行为。

在具身机器人中,零样本能力主要依赖两类基础:

1.语义 / 表征层的零样本迁移

  • 典型例子是 R3M 这类视觉表征:先在 Ego4D 等大规模人类视频上,通过时间对比学习 + 视频–语言对齐预训练一个视觉编码器,再在下游机器人任务上冻结这个编码器,只训练控制头。结果表明,相比从头训练或用 ImageNet/CLIP 表征,R3M 能显著提高样本效率和任务成功率,并在只用 20 条示范的情况下完成真实场景中的多种 manipulation 任务。(arXiv)
  • 类似地,用大规模 MAE(Masked Autoencoder)在互联网图像 + 机器人图像上预训练视觉骨干,再把它作为冻结 encoder,也可以在多种真实 manipulation 任务上超过传统 CLIP 和监督预训练。 2.策略 / 行为层的零样本迁移
  • RT-1 将超过 70 万个、覆盖 700+ 种语言条件任务的机器人执行轨迹训练成一个 Transformer policy,在训练中从未见过的组合指令和新物体上也能保持较高成功率,体现出一定零样本任务泛化能力。(robotics-transformer1.github.io)
  • RT-2 更进一步,把 web 规模视觉–语言模型与 RT-1 机器人数据共训练成 VLA 模型,使机器人能把仅在互联网图片或文本中出现过的概念(如特定公司的 logo、危险物品类别)转化为现实中的操作策略,实现“web 知识 → 机器人动作”的零样本迁移。(Google DeepMind)
  • CLIP-RT 利用预训练 CLIP embedding,把语言描述对齐到一组“动作原语”上,通过对比模仿学习,让机器人能对训练集中从未出现过的物体执行合理操作,在零样本设置下优于传统端到端视觉–动作策略。(ResearchGate)
  • SuSIE 则利用预训练的图像编辑 Diffusion 模型作为高层 planner,给定当前观测和语言指令,让模型生成若干“未来子目标图像”,再由低层 goal-conditioned policy 实现这些子目标。由于高层图像编辑模型来自大规模互联网图像预训练,SuSIE 能在大量未在机器人数据中出现过的物体和场景上实现零样本 manipulation。(arXiv)

另外,还有工作直接把预训练 VLM 接入机器人 pipeline,例如 MOO(Manipulation of Open-World Objects)使用 CLIP 从指令和当前图像中识别目标物体,再交给下游 policy 执行,从而在大量“新类别物体”上实现零样本操作。(arXiv)

从这些例子可以看出一个核心思想:把机器人输入/输出映射到人类语义空间。视觉–语言模型已经在互联网数据上学会了“什么是杯子、垃圾、可食用物品、危险物品”等概念;机器人只要在这个语义空间里操作,就能直接继承这些对世界的理解。

当然,零样本也有明显局限:

  • 基础模型的知识本身有限,可能带有互联网数据的偏置;
  • 基本不包含动力学和接触力学等“身体知识”,导致在复杂物理交互(如插拔、拧紧)上仍然需要机器人自身的数据。

12.2.1.3 提示学习(Prompt Learning)

在大模型时代,“改 prompt 比改网络更便宜”已经成为共识。对于机器人,提示(prompt)并不仅仅是自然语言句子,还可以是:

  • 一段示范轨迹(轨迹 prompt);
  • 一串“技能标识”或“原语 token”;
  • 甚至是专门为模型学出的“向量化提示”(软 prompt)。

这里可以从三个层面理解提示学习在具身智能中的角色。

(1)自然语言提示:用指令驱动策略

  • 像 SayCan 这样的框架,将大型语言模型(PaLM)和机器人 affordance 模型结合,语言模型负责在大量“技能描述”上做推理筛选,affordance 模型负责评估当前环境下执行某技能的成功概率,从而实现“Do as I can, not as I say”。(GitHub)
  • Instruct2Act 则更进一步,直接让 LLM 生成 Python 程序,调用感知 API(例如 SAM、CLIP)和运动原语 API,把多模态指令映射为可执行的 perception–planning–action 流程,在桌面操作任务上展示了较强的零样本能力。(arXiv)

在这些系统中,人类给出的只是一个高层提示(自然语言指令),其余细节由 LLM + 基础模型推理补全。

(2)技能 / 原语提示:Think Small, Act Big

近期工作提出“Primitive Prompt Learning(PPL)”来解决终身 manipulation 中的知识复用问题。其核心思路是:(CVF开放获取)

  • 把常用的动作模式(靠近、抓取、插入……)抽象成一组可重用的原语 embedding
  • 新任务学习时,不是从头学一段完整策略,而是学一串“primitive prompts”,即在适当时刻激活哪些原语、如何组合;
  • 这样既缓解了灾难性遗忘,又方便在后续任务中复用已有技能。

对于 VLA 模型而言,可以把这些原语 embedding 看成动作层面的“离散 token”,与语言 token、视觉 token 一起输入 Transformer,通过 prompt 形式控制当前任务的“技能组合方式”。

(3)“软 prompt”与策略 in-context 学习

除了显式语言或离散 token,还可以使用“软 prompt”——一组可学习的向量,拼在输入序列前面,作为对模型的隐式条件。这在以下场景尤其有用:

  • 不同机器人平台共享同一套 VLA 模型时,用 Embodiment prompt 区分当前机器人(类似 PaLM-E 中的硬件 embedding)。(arXiv)
  • 为不同用户或不同环境学习专属“偏好向量”,让机器人在不改动主网络的前提下呈现个性化行为。

一个更极端的形式是轨迹作为 prompt:在输入序列前先放几条“示范观察–动作对”,然后再把当前观测接上,模型通过自注意力做“类比”,在前向推理过程中完成“few-shot 模仿”。这实际上是一种纯靠提示实现的元学习(in-context meta-learning),已经在多任务 Transformer policy 中表现出不错的 few-shot 泛化能力。(robot-learning.ml)

【图 12-11 占位:三类 Prompt 示意图:上方为自然语言指令 prompt,中间为 skill primitive prompt(小方块组合成序列),下方为轨迹 prompt(若干观测–动作配对),统一输入一个 Transformer。】

从实践角度看,提示学习最大的价值在于:可以在不改模型参数的情况下切换任务或行为风格,非常适合部署后的在线使用与快速迭代。


12.2.2 在线适应与终身学习(Lifelong Learning)

少样本 / 零样本泛化更多是“在训练结束后面对新任务如何应对”;而在线适应和终身学习则强调:训练这件事本身在机器人整个生命周期中从未真正结束

机器人每天都在遇到新用户、新环境、新硬件状态(磨损、偏移),如果我们能把这些经历转化为可持续累积的知识,系统就会越用越聪明。

12.2.2.1 在线学习(Online Learning)

在经典机器学习中,在线学习指数据按时间序列到达,每次更新只能看到当前小批量甚至单个样本,且通常不能无限存储全部历史数据。

对机器人而言,在线学习体现为:

  • 部署期间,机器人不断接收新感知数据和交互反馈;
  • 在不完全停机的前提下,对部分模型参数做小幅、频繁的更新
  • 希望既能快速适应新环境,又不破坏已有能力。

典型实现策略包括:

1.局部微调 + 冻结 backbone

  • 利用已经预训练好的视觉–语言 backbone(例如 MAE、R3M 或 VLM),在部署现场只对一小段动作头或 Adapter 层进行在线更新,这样既减轻计算开销,也减少对已有知识的干扰。(arXiv) 2.在线强化学习 / 自监督更新
  • 在安全约束下,允许机器人在环境中进行小规模探索,通过 RL 或自监督任务(例如未来预测、对比学习)持续微调控制模块或状态表征;
  • 例如在深高斯过程元学习 scooping 工作中,机器人在新地形上通过极少交互数据在线更新模型超参数,实现对未建模物理差异的快速适应。(arXiv) 3.增量式重放缓冲(replay buffer)
  • 在有限容量下维护一个“代表性经验集合”,新数据到来时与旧数据竞争存储位置,在线更新时既使用最新数据也适度重放旧经验,减缓短期偏移。

【图 12-12 占位:在线学习流程图:传感器数据流 → 评估模块 → 小批量参数更新 → 新策略上线,旁边有一个有限大小的 replay buffer 支持重放。】

与离线大规模训练相比,在线学习更强调稳定性与安全性:每次更新不能让策略“突然变坏”,否则真实机器人可能当场翻车。这也是在线学习在具身场景中推广较慢的主要原因之一。


12.2.2.2 终身学习挑战(Lifelong / Continual Learning)

在线学习通常只考虑短时间窗口内的适应,而终身学习则关注整个任务序列和生命周期。其目标是:

在源源不断的新任务和新数据到来时,机器人能持续学习保留以往能力,而不是“学一个忘一个”。

在机器学习中,这通常被称为Continual Learning(CL),已经形成较系统的定义和框架:数据分布和学习目标随时间变化,算法需要在保持旧任务性能的同时,习得新任务。(科学直通车)

在机器人 / 深度强化学习中的终身学习更加困难:RL 本身就难训练,再叠加任务序列与安全约束,问题变成“难上加难版 RL”。已有工作分析了 RL 场景下的 lifelong learning 特性,指出忘记旧任务、探索不安全、训练不稳定等问题都被放大。(Proceedings of Machine Learning Research)

关键挑战包括:

1.灾难性遗忘(Catastrophic Forgetting)

  • 参数被新任务梯度强烈推动,旧任务相关表征被覆盖;
  • 尤其在机器人 RL 中,一个新任务就可能需要数十万步更新,如果没有约束,很容易把旧技能“洗掉”。(Nature) 2.容量与结构管理
  • 不可能无限扩展模型大小;何时为新任务分配新参数、何时复用旧参数,是一个动态架构设计问题;
  • 多机器人、多任务共享一个 VLA 模型时,还要考虑不同平台之间的结构差异。(arXiv) 3.任务边界与任务识别
  • 实际部署中“任务切换”往往是隐式的,例如用户换了一个说话方式,或环境布局发生变化,很难人为标出清晰的 task id。 4.评测与度量
  • 终身学习不能只看“最新任务的成功率”,还要评估:
    • backward transfer(新任务训练后旧任务性能是否提升/下降);
    • forgetting measure(对每个旧任务性能下降多少);
    • forward transfer(在看到新任务数据前,模型对它的初始表现如何)。(科学直通车)

在机器人场景中,已经出现了针对终身 manipulation 的专门框架。例如 LOTUS 通过在任务流中持续发现和维护动作技能库,再由高层 meta-controller 组合这些技能完成新任务,在长期多任务序列上显著优于传统方法。(arXiv)

还有工作探索如何在 RL 框架中“同时保留和组合知识”,提出针对机器人终身学习的深度 RL 算法,可以在任务流中长期稳定地保留已学策略。(Nature)

【图 12-13 占位:终身学习评测示意:横轴为任务序列,纵轴为不同任务的成功率,各条曲线显示随着时间对每个任务的遗忘/提升情况。】

对 VLA 而言,终身学习未来很可能表现为:一个统一基础模型 + 不断扩展的技能 / prompt / Adapter 仓库,既维持通用的视觉–语言–世界知识,又不断积累针对具体环境和用户习惯的操作经验。


12.2.2.3 连续自适应(Continuous Adaptation)

相比“按任务阶段分块”的终身学习,现实世界更接近一种连续、无缝的分布漂移:光照逐渐变暗、桌面换了一批新物体、相机被轻微挪动、关节磨损增加……这些变化都不一定构成“新任务”,却会慢慢击穿原有模型的假设。

连续自适应关注的是在这种缓慢、持续漂移下,机器人如何:

  • 一边执行任务,一边悄悄更新自己的感知和控制;
  • 不需要显式“换任务模式”或人工干预。

一些代表性思路包括:

1.域自适应 / 表征迁移

  • 如 PeS(Perception Encoder Transfer)一类方法,不直接迁移整个策略,而是先对感知编码器做迁移,让新的视觉域映射到一个与旧策略兼容的表征空间,随后再小幅调整策略,在新环境中显著提升成功率。(arXiv)
  • 利用自监督目标(例如保持时序一致性、预测未来帧),在执行过程中对 encoder 做小步更新,使视觉表征对新光照、材质变化保持鲁棒。(arXiv) 2.基于原语 / prompt 的渐进扩展
  • Primitive Prompt Learning 在终身 manipulation 中引入“可重用原语 + prompt 组合”的机制,也自然适合连续自适应:新任务往往只需要引入少量新原语 embedding 或新的原语组合方式,而不是完全重写策略网络。(CVF开放获取)
  • 类似地,CL-LoRA 这类“持续 LoRA”技术在图像增量学习中通过低秩 Adapter 连续吸收新知识,也为机器人领域提供了参数高效、适合长时间在线微调的手段。(GitHub) 3.多时间尺度更新
  • 可以把整个系统拆成“快变量”和“慢变量”:
    • 快变量:如部分控制参数、正则项系数,允许在几秒到几分钟尺度上在线更新;
    • 慢变量:如 backbone、世界模型结构,只在长时间聚集足够证据或 offline 维护时更新。
  • 这种结构和前面讲的元学习(内外层更新)概念自然呼应,只不过这里强调的是部署期间的工程实现形式。 4.个性化与用户习惯学习
  • 对服务机器人而言,“连续自适应”还包括学习用户偏好:比如某位用户总是希望机器人把杯子放在桌子左上角,系统可以为这个用户维护一个特定的“偏好 prompt”或小型 Adapter,在识别出用户身份后激活。(DSpace)

【图 12-14 占位:多时间尺度自适应示意:底层基础 VLA 模型参数缓慢演化,中间的 Adapter / LoRA / prompt 持续小步更新,顶层控制策略根据最近经验做快速调整。】

从更长远的角度看,连续自适应是让机器人从“静态模型”走向“不断更新的数字生命体”的必要步骤,而如何在这一过程中保持可控性和可验证性,将是未来具身智能的重要研究主题。


12.2.3 从互联网经验到物理世界的迁移

互联网是一个巨大的“人类经验缓存”:数以亿计的视频、图像、教程文章、问答对话里,记录了人类如何操作物体、完成任务、描述世界。具身智能想要“从零到英雄”,不可能只靠实验室里那几台机器人摸索,必然要想办法让机器人“借用”这些人类经验。

本小节关心的是三个问题:

  1. 互联网中的知识以什么形式存在,如何转成机器人可用的结构?
  2. 如何把 VLM / LLM 等基础模型与机器人控制模块融合
  3. 有哪些已经证明“互联网 → 机器人”迁移可行的典型案例?

12.2.3.1 知识转移(Knowledge Transfer)

互联网经验主要以三种形式存在:

+静态图像 + 文本:图像配 caption、alt 文本、文章插图等; +视频:人类演示各种操作的 egocentric 或第三人称视频; +纯文本:教程、说明书、问答等,包含大量程序性知识。

对应地,在机器人领域出现了三条主要的知识转移路径。

(1)视觉表征迁移:R3M、MAE 等

  • R3M 利用 Ego4D 等大规模人类视频,通过时间对比学习、视频–语言对齐和稀疏正则化,训练出一个通用视觉 encoder;在 12 个模拟 manipulation 任务和真实 Franka Panda 机械臂上,使用 R3M 表征显著提高了任务成功率和数据效率。(arXiv)
  • Real-World Robot Learning with Masked Visual Pre-training 使用 MAE 在互联网和机器人图片上预训练 ViT,再在多个真实场景任务中冻结视觉 encoder、只训练控制头,证明了大规模自监督视觉预训练对机器人学习的巨大加成

这些方法的共同点是:把视觉问题“解决”在互联网上,然后把机器人训练问题简化为“在一个已经很有语义和结构的表征上学控制”。

(2)奖励与 affordance 迁移:RoboCLIP、MOO 等

  • RoboCLIP 利用预训练 VLM 对“视频示范或文本描述”与当前观察之间的相似度来构造奖励函数,使得 RL agent 在没有人工手写 reward 的情况下就能学会对应任务;更重要的是,它可以利用“人类示范视频”作为出域示范,实现跨领域的奖励构造。(arXiv)
  • MOO(Manipulation of Open-World Objects)使用 CLIP 等 VLM 从自然语言命令和相机图像中抽取“目标物体标识”,把这些抽象信息输入 robot policy,从而实现对从未见过的新类别物体的操作,一定程度上弥补了机器人数据覆盖不全的问题。(arXiv)

这类方法把互联网知识转化为了“奖励信号”和“物体语义标签”,在 RL 和模仿学习中扮演裁判或教师的角色。

(3)行为 / 轨迹迁移:学习从视频到控制

  • R3M 之后,许多工作直接用人类操作视频构建“手–物体交互的先验”,例如 VideoDex 和后续工作从互联网人手视频中学习 dexterous manipulation 先验,再迁移到机器人手。(Proceedings of Machine Learning Research)
  • 大量综述系统梳理了“Learning from Video (LfV)”在机器人中的应用,强调通过从互联网视频提取物体 affordance、动作先验和时序结构,可以显著降低机器人实际需要的交互数据。(OpenReview)

【图 12-15 占位:三条转移路径示意:左侧是互联网图像/视频/文本,中间分别流向“视觉 encoder”、“reward/affordance 模型”、“world model / trajectory priors”,右侧汇入机器人控制模块。】

总的来说,知识转移的哲学是:让机器人尽量少地“重复人类已经在互联网上做过一万遍的事情”,只在必要处进行具身补课


12.2.3.2 模型融合(Model Fusion)

有了互联网预训练的 VLM/LLM,还有机器人自身的数据和控制模块,接下来问题变成:这些模型到底怎么拼在一起?

实践中逐渐形成了几种主流的融合范式。

(1)规划–控制分离:LLM/VLM 作为高层 planner

  • SayCan 使用 PaLM 语言模型去评估“在当前语言指令下,一组候选技能序列是否合理”,同时用一个从机器人数据训练的 affordance 模型评估每个技能在当前场景的可行性,通过两者结合选择下一步技能。(GitHub)
  • SuSIE/相关工作使用 Diffusion 模型生成未来“子目标图像”,低层则是 goal-conditioned policy 或传统控制器。(arXiv)
  • Instruct2Act 让 LLM 直接生成 Python 程序,调用 SAM、CLIP 等视觉基础模型和预定义动作原语,形成一个“由 LLM glue 在一起的感知–规划–控制 pipeline”。(arXiv)

这种结构的特点是:互联网模型只负责“想”,机器人模型负责“做”,两者通过有限接口(技能列表、子目标、代码 API)耦合。

(2)端到端共训练:VLM → VLA

另一条路线是直接将 web 预训练的 VLM整体嵌入 VLA 模型中,通过在机器人数据上的联合微调,使其输出动作 token:

  • RT-2 以 PaLI-X 等大规模 VLM 为基础,在 web 图文 + RT-1 机器人数据上共同训练,使模型在保留 web 任务能力(如图文问答、识别)的同时,能够直接输出机器人 action token,实现“真正意义上的 VLA 基础模型”。(Google DeepMind)
  • 后续工作如 RT-X、DexVLA、π₀-FAST 等,在多机器人、多数据源上扩展这一思路,引入动作 token 压缩、跨具身编码等技术,让一个大模型尽可能服务更多平台。(arXiv)

这类模型的优点是统一、强大,缺点是难以部署和更新:任何微小改动(例如适配新机器人)都可能需要大规模重新训练或复杂的 Adapter 设计。

(3)模块化 / 分层融合:世界模型 + 代码 + 控制

  • 使用 VLM 作为“多模态感知模块”,LLM 作为“符号规划模块”,传统运动规划 / RL 作为“连续控制模块”,三者通过明确 API 拼接成分层结构;
  • 例如有工作将 PaLM-E 这类多模态模型作为统一语义中枢,同时为不同机器人平台接入不同“embodiment embedding”和动作 head,在 VLA 综述中被视为一种“跨具身统一大脑”的实现方式。(arXiv)

这一范式本质上是在深度学习基础模型之上重建一个“模块化机器人系统”,兼顾可解释性和灵活性,预计会在工业落地中占比较大。

【图 12-16 占位:三种融合范式对比图:左边是 planner–controller 分离,中间是端到端 VLA,大模型直接出动作,右边是多模块分层系统。】


12.2.3.3 案例:从互联网到真实机器人的完整链路

下面选几个具有代表性的系统,串联回本节的三个核心问题。

案例一:RT-2——web 知识直接变成机器人动作

  • 基础:PaLI-X 等 web 规模 VLM,拥有强大的视觉理解与语言推理能力。(Google DeepMind)
  • 机器人数据:使用 RT-1 收集的大规模语言条件操作轨迹。(robotics-transformer1.github.io)
  • 训练:将动作序列 token 化,与文字 token 一起喂入 Transformer,通过共训练让 VLM “顺带学会”输出动作;
  • 效果:在只在 web 数据中出现过、但从未在机器人数据中出现过的概念(如某些 logo、抽象类别“可回收物”)上,RT-2 仍能做出合理操作,体现“web → robot”的零样本迁移。

案例二:R3M + 下游 RL / IL——互联网视频提取通用视觉

  • 预训练阶段:在 Ego4D 等大规模人类视频上,用时间对比学习、视频–语言对齐等目标训练视觉 encoder;(arXiv)
  • 下游阶段:在模拟和真实 manipulation 任务上冻结 encoder,只训练控制头(RL 或 BC),得到显著更高的成功率和样本效率;
  • 意义:说明仅仅在感知层使用互联网视频预训练,就可以极大缓解真实机器人数据短缺问题,为后续世界模型和 VLA 打下基础。

案例三:SuSIE ——用图像编辑 Diffusion 做高层规划

  • 预训练:基于互联网图像训练 InstructPix2Pix 等图像编辑 Diffusion 模型;(arXiv)
  • 强化阶段:在少量人类/机器人视频上微调,使得模型可以在给定当前观测图像和指令时,生成“合理的未来子目标图像”;
  • 控制:用 goal-conditioned policy 实现这些子目标;
  • 结果:在长时序 manipulation 任务中实现很强的零样本泛化,说明用图像编辑模型来“想象未来画面”是一种有效的高层规划方式

案例四:Primitive Prompt Learning(PPL)——互联网技能与终身学习的桥梁

  • PPL 在终身 manipulation 中引入“原语 prompt”机制,将复杂任务分解为可重用原语,并通过 prompt 组合原语来适应工作流。(CVF开放获取)
  • 当这些原语一部分来自互联网数据预训练的基础模型,一部分来自机器人自身的操作经验时,PPL 实际上扮演了互联网知识与机器人终身技能库之间的“适配层”

【图 12-17 占位:多案例拼图:左上 RT-2(web & robot 双箭头),右上 R3M(视频 → encoder → 控制),左下 SuSIE(图像编辑生成未来子目标),右下 PPL(原语库 + prompt 组合)。】

通过这些案例可以看到,本小节前面讨论的三个层面——知识转移、模型融合、在线/终身适应——在真正的系统中是紧密交织在一起的:互联网经验提供了大规模、廉价的“世界先验”,终身学习则是在此基础上进行具身微调和个性化演化。在接下来的章节中,我们还将从安全、伦理和社会影响的角度,重新审视这种“世界知识直接驱动物理行动”的新范式可能带来的风险与机遇。

本章小结与自测

三行小结

  1. 本章扩展到前沿趋势与长期职业发展。
  2. 重点是建立可持续迭代的研究与工程路线。
  3. 学完后应能形成个人中长期方向规划。

检查题

  1. 用你自己的话总结本章最核心的一个公式/机制。
  2. 给出一个“如果要落地到项目里,你会怎么用”的具体例子。

常见误区

  1. 只追热点,不做能力积累。
  2. 方向切换过频繁。
  3. 缺乏长期项目沉淀。

公式到代码(最小示例)

papers = [
    {"topic": "generalization", "status": "reading"},
    {"topic": "safety", "status": "todo"},
]
next_topics = [p["topic"] for p in papers if p["status"] != "done"]
print(next_topics)

本章外部参考(集中)

  1. ACM数字图书馆
  2. robot-learning.ml
  3. arXiv
  4. arXiv
  5. robotics-transformer1.github.io
  6. Google DeepMind
  7. ResearchGate
  8. arXiv
  9. arXiv
  10. GitHub
  11. arXiv
  12. CVF开放获取
  13. 本章其余链接可在正文中按上下文继续查阅。

12.3 安全、伦理与社会影响

12.3.1 物理机器人系统安全标准与法规

学习导航

  • 本章主题:12.3.1 物理机器人系统安全标准与法规
  • 前置知识:建议全书主线章节均已通读一遍。
  • 建议用时:98-118 分钟
  • 阅读顺序:先看概念框架,再看公式/代码,最后做自测。

具身智能把“只活在显卡里的模型”拉进了真实世界:机器人会移动、抓取、接触人和环境。从研究走向应用的第一道门槛就是安全与合规。本节先从标准体系讲起,再看政策法规,最后介绍如何做系统性的安全评估,为后文责任与信任、产业落地打基础。


12.3.1.1 安全标准

1.机械安全标准体系的整体框架

国际上,机器安全标准大致形成了一个“三层结构”:

+A 类标准(基础安全标准):给出通用的安全术语、风险评估方法和设计原则,代表性标准是 ISO 12100《机械安全——设计通则 风险评估与风险降低》。它提出了经典的三步策略: 1)本质安全设计; 2)防护装置与附加保护措施; 3)使用信息(警示、说明书等)。 +B 类标准(通用安全标准):针对某一类安全要素,如安全距离、急停按钮、双手启动装置,或安全控制系统的性能等级等。 +C 类标准(专用机械标准):面向具体设备(工业机器人、AGV 等),给出该类设备的详细安全要求。

ISO/TR 22100 系列则专门说明 A/B/C 标准之间如何配合使用,指导设计者通过风险评估与风险降低达到“可接受风险”水平。

【图 12-X】国际机器人相关安全标准的层级关系示意图(占位:包括 ISO 12100、ISO 10218、ISO 13482、ISO 3691-4、ISO 14971 等的关系箭头图)

2.工业机器人与协作机器人的安全标准

工业机器人是最早被系统化规范安全的机器人门类。

+ISO 10218-1/2是工业机器人和工业机器人系统的核心安全标准:第 1 部分针对“机器人本体”,第 2 部分针对“机器人系统与集成”。它要求在设计阶段识别和控制典型危险(挤压、碰撞、意外启动等),并规定防护围栏、安全互锁、急停和安全控制系统等措施。

  • 随着**人机协作机器人(cobot)**的兴起,ISO/TS 15066进一步对协作模式下的安全提出细化要求,包括人体各部位允许的碰撞力/压强阈值、协作操作模式(力/功率限制、手导示教、速度与距离监控等)的具体设计指导。

在中国,对应的**GB 11291《工业机器人安全要求》**系列等同或修改采用了 ISO 10218-2 的内容,用于指导国内工业机器人及生产线的设计与验收。

对具身智能和 VLA 来说,这意味着:即便高层是“会聊天、会看图”的模型,底层动作也必须被限制在满足 ISO 10218/ISO/TS 15066 等标准的安全包络内,例如限制协作机械臂末端最大速度、碰撞检测阈值等。

3.服务与个人护理机器人安全标准

当机器人走出工厂、进入家庭和公共空间,与非专业用户长期共存时,安全要求发生了质变。

+ISO 13482是个人护理机器人(Personal Care Robot)的重要标准,涵盖:移动服务机器人、物理辅助机器人、载人机器人等三大类。 标准除了机械风险外,还特别强调:

  • 对易受伤人群(老年人、儿童)的接触力限制;
  • 稳定性、防跌落、防夹压设计;
  • 对心理伤害和隐私侵犯的预防要求。

这类标准为养老机器人、陪伴机器人等提供了基本安全门槛,也为后续人形服务机器人、安全认证和产品责任提供了基础参照。

4.移动机器人、AGV/AMR 的安全标准

在仓储、工厂和医院中,**自动导引车(AGV)与自主移动机器人(AMR)**已经成为“地面具身智能”的主力军。

+ISO 3691-4专门规范无人驾驶工业车辆(AGV/AMR 等)的安全要求,如路径规划、制动性能、速度限制、障碍物检测和紧急停止等,并规定了安全功能的验证方法,属于典型 C 类标准。

对于部署在仓库、工厂甚至医院走廊中的 VLA 机器人,这些标准意味着其行驶轨迹和速度必须满足严格的碰撞风险控制与制动距离约束,不能只依赖“模型觉得安全”。

5.医疗机器人与医疗器械风险管理标准

医疗机器人一方面是机器人,另一方面又是医疗器械,同时受到机械安全与医疗监管的双重约束。

+IEC 60601 系列定义了医疗电气设备的基本安全与性能要求,各种手术设备、监护设备都在此框架下设计。

  • 针对手术机器人等,IEC 80601-2-78 等专用标准给出了额外要求,例如系统冗余、故障安全状态等。 +ISO 14971则是医疗器械领域通用的风险管理过程标准,从设计到报废全过程要求持续风险识别、控制与残余风险评估。

这类标准对未来“VLA+手术机器人”的演进非常关键:再聪明的决策模型,也必须嵌入可以被审计和验证的风险管理流程中

6.国家与前沿领域标准的发展趋势

在国家层面,除了等同采用国际标准外,各国正针对新型机器人形态制定补充规范:

  • 我国近年来陆续发布了巡检机器人、腿式机器人、一体化关节等国家标准,补齐新形态机器人在安全与性能方面的空白。
  • 2025 年,中国启动了人形机器人标准化委员会,准备在总体架构、安全与核心技术等方面制定国家标准,从制度层面为类人具身智能扫清障碍。

【图 12-Y】具身智能相关安全标准图谱(占位:按工业机器人、移动机器人、个人护理机器人、医疗机器人分区列出对应的 ISO/IEC/GB 标准)


12.3.1.2 政策法规

安全标准告诉我们“如何做才安全”,而法律法规决定“什么是合法、谁负责任”。对打算让机器人真正进入产业与社会的研究者来说,了解基本监管框架是必需的。

1.欧盟:从机械法规到 AI 法案

+欧盟《机械法规》2023/1230/EU将在过渡期后取代旧的《机械指令》,规定了在欧盟市场投放机械产品(包括机器人)时必须满足的基本健康和安全要求(EHSR)。新法规一大特点是:

  • 明确考虑数字化、联网和 AI 带来的新风险;
  • 特别强调人机协作、远程更新和网络安全。 +**欧盟《AI 法案》(AI Act)**则从“算法”角度出发,对 AI 系统进行分级监管:
  • 若 AI 系统是某种产品(如机器人)的安全部件,或本身是安全相关产品,则被归为高风险 AI
  • 高风险 AI 必须落实风险管理、数据治理、日志记录、透明性和人类监督等要求。

由于企业和各方压力,部分高风险条款的实施时间被推迟到 2027 年左右,但整体方向并未改变:将“看得见、摸得着”的机器人与其背后的“看不见的 AI”一起纳入安全监管

2.产品责任与 AI 责任的现代化

即便机器人满足安全标准,也可能因为设计缺陷、软件更新、训练数据偏差而造成损害。欧盟正在通过一系列新规来重塑责任规则:

+新版《产品责任指令》(PLD, 2024/…)将软件、数字文件和 AI 明确纳入“产品”范围,并扩展潜在责任主体(包括平台运营者、非欧盟制造商代理等),对于技术高度复杂导致因果关系难以证明的案件,引入了缺陷与因果关系的推定

  • 拟议中的AI 责任指令则试图调整 AI 相关损害中的举证规则和责任分配,使受害人不至于在面对复杂系统时完全无从下手。

加上学界对“AI 是产品还是服务”的讨论,这些改革共同决定了:当一台搭载 VLA 的机器人出事时,责任可能如何在制造商、系统集成商、运营商、模型提供方之间分配。

3.其他地区与本土监管举措

  • 在医疗领域,美国 FDA 已经对手术机器人等设备形成了较成熟的审批路径,并通过认可 IEC 60601、IEC 80601 等国际标准来判定“安全与性能”。
  • 国内方面,工信部等部门发布了机器人产业规范条件和相关技术政策,地方政府(如上海)也针对人形机器人发布治理指引,强调技术标准、风险管理和价值观对齐的重要性。

对具身智能研究者而言,一个简单的经验是:

“早在论文阶段,就要想清楚:如果把这套系统真正做成产品,它会落在哪些法规框架下?需要满足哪些强制性要求?”


12.3.1.3 安全评估

有了标准和法规,还需要一个可操作的安全评估流程,来回答三个问题: 1)哪些地方有危险? 2)风险是否可接受? 3)如何证明我们已经做得足够安全?

1.基于 ISO 12100 的通用风险评估流程

ISO 12100 提供了一个经典的迭代流程:

1)危险识别:识别所有可能导致伤害的源头,包括机械、控制、电气、热、噪声以及使用错误等。 2)风险估计:对每个危险,综合考虑伤害严重度、发生概率和暴露频率,给出风险等级。 3)风险评价:判断现有设计下风险是否在“可容忍范围”内。 4)风险降低:按照“本质安全设计优先”的原则,依次考虑结构改动、防护装置、安全控制系统和警示信息。 5)验证与文档化:通过测试、计算、审查等手段验证风险降低措施有效,并形成可追溯文档。

对于具身智能机器人,这个流程需要扩展到软件与算法层面,包括对模型失效模式、数据缺陷和更新机制的分析。

2.医疗器械中的风险管理:ISO 14971 视角

ISO 14971 要求医疗器械制造商在整个生命周期中持续执行风险管理:

  • 在设计阶段进行系统性的危险分析和风险估计;
  • 对每一项不可接受风险制定控制措施(设计更改、防护、信息);
  • 评估残余风险是否与收益相比仍可接受;
  • 上市后通过上市后监测和事件报告,不断更新风险管理文件。

对手术机器人、康复机器人等来说,这意味着每一次软件更新、模型再训练或控制策略变更,都需要重新评估风险影响,而不仅仅是“线上热更新一个模型”。

3.具身智能系统特有的安全评估要点

相较传统机械,具身智能/ VLA 机器人的风险评估面临三类额外挑战:

+功能不确定性:决策模型往往是统计式或深度学习式的,难以穷举所有输入–输出组合的行为,容易出现“分布外输入”或“幻觉式决策”。 +学习与更新:模型可能在部署后继续学习或更新(在线学习、联邦学习),风险特性随时间变化,必须将更新过程纳入风险管理边界。 +网络与数据安全:ISO/TR 22100-4 专门提醒制造商关注与机械安全相关的网络安全问题,例如远程攻击导致安全功能失效,这在云端控制的机器人中尤为关键。

4.方法工具:从 FMEA 到场景库测试

工程实践中常用的一些方法可以直接迁移到具身智能系统:

+FMEA(失效模式及影响分析)/ FTA(故障树分析):自顶向下分析哪些组件失效会引发危险行为,尤其适用于安全控制链路(传感器–控制器–执行器–监控系统)。 +STPA 等系统理论视角方法:从控制结构和约束角度分析事故原因,适合处理复杂人–机–组织系统。 +仿真+场景库测试:对移动机器人、自动驾驶和 AGV/AMR,常通过大规模仿真场景库覆盖各种极端工况,结合 ISO 3691-4 等标准规定的试验项目来验证安全功能。 +AI 合规测试:在 AI Act 的框架下,高风险 AI 还需要专门的性能、鲁棒性与偏差测试,并形成技术文档与日志,证明系统在设计范围内“足够安全”。

【图 12-Z】机器人系统安全评估与风险管理流程示意图(占位:左侧为危险识别与风险评估,右侧为设计/控制/使用三层风险降低措施,底部是文档与合规)


12.3.2 人机协作场景中的责任与信任

当机器人不再被关在笼子里,而是与人共享空间、共同完成任务时,技术问题会自然升级为责任与信任问题

  • 出事了谁负责?
  • 用户应不应该相信它、相信到什么程度?
  • 社会能不能接受这样的伙伴和“同事”?

本节从责任划分、信任建立和社会接受度三个层面展开。


12.3.2.1 责任划分

1.人机协作中的多方主体

典型的人机协作场景包括:

  • 车间里协作机械臂与工人共同装配;
  • 仓库里 AMR/人形机器人与拣货员共同搬运;
  • 手术室中外科医生与手术机器人协同操作;
  • 自动驾驶接驳车与安全员共同值守……

在这些场景中,至少涉及以下几类责任主体:

+制造商 / 算法开发者:机器人本体、控制系统、VLA 模型等的设计者; +系统集成商:将机器人集成进具体产线或业务流程的一方; +部署与运营方:工厂、物流公司、医院等,负责配置环境、下发任务、维护设备; +人类操作员/监督者:负责给机器人发指令、监控状态、在必要时接管; +关键部件/模型提供方:传感器供应商、通用大模型服务提供商等。

不同法律体系下,损害发生后责任如何划分会有差异,但一个共识是:不能把一切都推给“前线操作员”

2.“道德缓冲区”(Moral Crumple Zone)现象

机器人伦理研究提出了“道德缓冲区(moral crumple zone)”概念:在高度自动化、多方参与的系统中,一旦事故发生,道德和法律责任往往集中落在那个“看起来在控制系统的人类”身上,即使他/她对整个系统的实际可控程度有限。

在机器人–人类协作中,这种现象表现为:

  • 协作机械臂伤人时,人往往指责“当班操作员没注意”;
  • 自动驾驶出事时,舆论首先问的是“安全员在干什么”;
  • 而系统设计者、算法提供方、组织层面的决策失误常常被淡化。

未来在设计 VLA 系统时,需要在技术和制度层面避免这种“责任挤压”:

  • 在系统架构中明确控制权边界,例如哪些动作是机器人自主做出的,哪些动作必须经过人类确认;
  • 完整记录决策与指令日志,让事后分析能够还原“谁在什么时候做了什么决定”;
  • 在产品说明和培训中清楚告知操作员其职责和能力范围,避免“挂名负责但没有相应控制手段”的状态。

3.从研究原型到合同与保险

当研究原型向产品转化时,责任问题会具体体现在:

  • 合同如何约定事故责任与保险条款;
  • 维护和更新职责如何划定(例如谁负责升级 VLA 模型,以及升级后如果出现异常由谁负责);
  • 是否需要针对高风险场景购买专门责任保险。

对研究生和工程师来说,在设计系统时就考虑“责任可分解、可追溯”,会极大降低后续产业化阻力。


12.3.2.2 建立信任

信任不是“用户喜欢它就行”,而是用户对系统能力与边界形成符合现实的预期。对具身智能机器人来说,这种信任既有技术层面,也有人文层面。

1.信任的三个维度

相关研究表明,人们对社交机器人整体态度较为正面,但同时存在大量“犹豫”与“条件接受”。 可以把信任拆成三个维度:

+技术可信

  • 行为可预测、重复性好;
  • 遇到极端情况时能安全退避或求助,而不是“赌一把”;
  • 有清晰的安全保障机制(力/速度限制、急停、冗余传感器等)。 +交互可信
  • 机器人能用人类能理解的方式表达自己的状态和意图,如提示“我现在在学习环境、可能动作慢一些”;
  • 不通过“过度拟人化”误导用户,把自己包装成真实的人类或“全知全能的 AI”;
  • 尊重用户自主性(用户可以拒绝、修改命令)。 +组织可信
  • 背后机构有明确的客服和事故处理机制;
  • 有透明的隐私政策和数据使用说明;
  • 在发生错误时愿意承担责任并改进系统。

4.技术手段:让信任“有依据”

对 VLA 型机器人来说,可以利用模型本身的语言能力来增强透明度和信任,例如:

+自描述:在执行高风险动作前,用简短语言说明自己的理解和计划,如“我将以低速移动到你右侧,距离约 0.5 米”。 +不确定性提示:当视觉识别或语言理解置信度较低时,主动提示并请求确认,如“我不确定黄色小盒是不是你说的药箱,需要你确认一下”。 +多层自主等级:在医疗、协作工业场景中,允许用户选择“自动模式”“建议+确认模式”“纯手动模式”,并简明说明各模式下机器人会做什么。

这些设计可以帮助用户形成**“不过度信任,也不过度怀疑”**的合理预期。

【图 12-T】人–机器人协作中“控制权–责任–信任”关系示意图(占位:三角形结构,一角是人类操作者,一角是机器人,一角是组织/厂商,中间标注信息流和决策权)


12.3.2.3 社会接受度

单个用户的信任可以通过设计慢慢建立,但要大规模部署具身智能机器人,还需要社会整体的接受与认可。

1.总体态度与关键顾虑

多项综述表明,人们对社交机器人和服务机器人总体态度偏向积极,但存在明显的分化和情境依赖

  • 在医疗、养老场景中,如果机器人能缓解人力紧缺、提升照护质量,公众往往较为支持;
  • 在监控、治安等敏感场景,则更担心隐私与权力滥用;
  • 在就业压力较大的地区,人们会更关注机器人是否“抢工作”。

2.养老与照护场景的特殊敏感性

老年人、认知障碍患者等人群往往在技术讨论中被视作“受益者”,但伦理研究提醒我们:

  • 机器人带来的陪伴与照护不能替代人类关系;
  • 长期监测可能损害隐私与尊严;
  • 设计不当的机器人可能强化年龄歧视或“幼儿化”老年人。

对具身智能来说,这意味着:

在养老场景中,VLA 应当被设计为“赋能型”伙伴,帮助老年人保持自主,而不是替其做所有决定。

3.工业与物流中的社会影响

在工厂和仓库中,机器人既改善了安全与效率,也引发了对就业与技能结构的担忧:

  • 有研究表明,在部分地区工业机器人显著降低了工伤事故率,改善了工作环境。
  • 同时,亚马逊等企业在仓库大规模应用机器人和 AI 调度系统,引发对工作节奏加快、岗位替代和劳动关系变化的讨论。

对政策制定者来说,配套措施包括:

  • 将机器人部署与职业培训、岗位转型政策联动;
  • 在引入具身智能系统前进行社会影响评估,与工会和员工充分沟通;
  • 把安全收益与就业结构变化一并纳入成本–收益分析,而不是只看短期效率。

4.人形机器人的接受度与“拟人边界”

随着人形机器人大量进入仓储、制造和未来的服务业,新一轮社会讨论正在展开:

  • 支持者强调其与人类共享环境、复用人类工具的潜力;
  • 批评者担忧其外形会让人高估其能力,从而导致危险;
  • 有人认为在照护场景中过度拟人化会制造“情感错觉”。

对具身智能研究来说,这提示我们:

不要把“更像人”当作唯一优化目标,而要兼顾安全、伦理与社会接受度。


12.3.3 面向产业与社会的落地场景分析

具身智能和 VLA 模型真正的价值,在于落地到具体产业与社会场景中。本节选取医疗机器人、辅助与养老、工业自动化与物流三个典型领域,分析其应用特点、安全与伦理挑战,以及对本书所讨论技术路线的需求。


12.3.3.1 医疗机器人

1.典型类型与应用场景

医疗机器人大致可分为:

+手术机器人:如微创外科、骨科、神经外科机器人,用于提高精度、减少创伤; +介入与影像引导机器人:辅助穿刺、导管导航等; +康复机器人:外骨骼、下肢康复机器人等,用于训练和恢复运动功能; +医院物流机器人:在医院内部运输药品、标本、被服等。

以手术机器人为例,文献梳理了 2015–2023 年间 FDA 批准的多种机器人系统,并提出“手术机器人自主等级(LASR)”,从单纯工具辅助到高度自主分级,显示目前主流系统仍然强调“人主导,机器人辅助”。

2.监管与标准框架

医疗机器人通常被视为医疗器械,其监管路径包括:

  • 符合 IEC 60601 系列的电气安全和基本性能要求;
  • 按照 ISO 14971 执行风险管理,对每一种潜在危害进行识别和控制;
  • 满足相关专用标准(如手术机器人 IEC 80601-2-78 等);
  • 在欧盟,还要符合 MDR 和 AI Act 中针对高风险医疗 AI 的额外要求。

对 VLA 医疗机器人而言,一个现实的中短期路线是:

把 VLA 放在“辅助决策与人机界面层”,而关键控制回路仍由可验证的安全控制系统承担。

3.具身智能在医疗场景中的角色

具身智能可以在多个层次增强医疗系统:

+术前与术中理解:通过视觉–语言模型理解影像(CT/MRI/内窥镜)与医生口头/文本指令,将“病灶概念”和空间位置联系起来; +人机协作界面:医生用自然语言提出高层目标(如“沿血管轴向推进 2 cm”),系统转换为一系列安全约束下的低层控制命令; +术后与训练:通过语言解释手术过程,辅助术者反思;利用 VLA 在仿真环境中为年轻医生提供训练场景。

但在监管层面,只要机器人动作直接作用于患者,高风险 AI 规则和医疗器械风险管理就会严格约束其自主程度,短期内很难完全替代医生。

【图 12-M】手术机器人系统组成与 VLA 集成示意图(占位:左为医生控制台,右为机械臂和患者,中间标注 VLA 模块对影像和语言指令的处理)


12.3.3.2 辅助与养老

1.老龄化背景与技术需求

在许多国家,老龄化和护理人力短缺正在成为结构性问题,社会机器人、服务机器人被视作缓解照护压力的重要工具。系统综述显示,人们期待这些机器人在陪伴、认知刺激和日常协助方面提供帮助,但同时指出大量伦理挑战。

典型应用包括:

  • 生活提醒与陪伴(吃药提醒、聊天、娱乐活动组织);
  • 移动与体力辅助(助行器、上肢/下肢助力设备);
  • 安全监测(跌倒检测、异常行为提醒);
  • 远程沟通(与家属、医生的视频连接)。

2.伦理与隐私问题

养老场景中,机器人往往长期驻留在家庭或机构中,这带来一系列伦理问题:

+隐私与监控:连续的音视频采集和位置跟踪可能让老人感觉被“时时刻刻监督”; +自主性与依赖:过度依赖机器人可能削弱老人的自理能力,或让照护机构以技术替代人际互动; +尊严与刻板印象:如果机器人用过度幼儿化的语气或过分照看,会伤害老人尊严; +数据与偏见:用于训练模型的数据可能带有年龄歧视或文化偏见,影响机器人对老人的态度和决策。

3.标准与治理框架

  • 在安全层面,个人护理与辅助机器人可首先参照ISO 13482及相关解释文档,以限制接触力、速度和行驶区域等。
  • 在治理层面,地方性指引(如上海关于人形机器人的治理指南)开始加入伦理原则和风险管理要求,强调技术标准与人类价值观的一致性。
  • AI Act 在高风险 AI 章节中也强调,涉及弱势群体的系统必须特别关注基本权利与歧视问题。

4.VLA 在养老辅助中的机会与风险

VLA 对养老机器人极具吸引力:

  • 能理解自然语言指令和闲聊,降低使用门槛;
  • 能结合视觉识别环境(药盒、轮椅、门锁)执行复杂任务;
  • 能根据历史交互形成一定“记忆”,实现个性化陪伴。

但这也放大了风险:

  • 语言能力越强,用户越容易把机器人视为“懂自己的人”,从而过度信任;
  • 长期存储和分析个人生活数据会极大提高隐私泄露的后果;
  • 若模型更新缺乏严格控制,可能在无意间引入新的偏见或行为模式。

因此,在设计具身智能养老系统时,应坚持:

“用具身智能提升老人的自主与尊严,而不是用技术掩盖照护体系本身的问题。”

【图 12-E】家庭环境中辅助机器人与老年人交互示意图(占位:标注视觉感知、语音/文本对话、行动规划模块,以及家庭成员/护理人员在闭环中的位置)


12.3.3.3 工业自动化与物流

1.从固定机器人到“机器人同事”

在工业和物流领域,机器人已经从围栏内的机械臂发展到与人共享空间的 AMR、人形机器人和协作机械臂:

  • 仓储与配送中心大规模部署 AMR、分拣机械臂、自动装卸设备,显著提升效率与准确率;
  • 在一些国家,引入机器人还与改善工人安全、降低工伤事故相关。
  • 新兴的人形机器人开始在仓库执行搬运、上下货等任务,作为“通用工人”的候选形态。

2.安全与标准化基础

这些场景中的机器人通常需要同时满足多类标准:

  • 生产线上的机械臂遵循ISO 10218ISO/TS 15066,在协作区域内按规定限制速度和力。
  • 仓库 AMR/AGV 依据ISO 3691-4做路径规划、防撞系统和紧急停车设计。
  • 对于人形或多功能机器人,未来可能会综合适用服务机器人、移动机器人和人形机器人新的专用标准。

同时,AI Act 可能会把控制装配线、化工过程或高风险仓储系统的 AI 归类为高风险 AI,要求更严格的合规管理。

3.VLA 在工业和物流中的角色

在这些场景中,VLA 可以发挥出相当务实的价值:

+任务理解与调度:把文本/语音订单(如“从 A 区取 10 箱 B 商品送到打包工位”)转化为一系列机器人可执行的高层和低层任务; +环境理解:通过视觉–语言模型识别货架、托盘、标签和异常情况(破损、遮挡),自动调整计划; +多机器人协作:用语言或符号协议协调多台机器人和人类工人的分工,实现“机器人车队”的高层调度; +人机协作界面:工人可以直接用自然语言调整机器人行为(“你先帮我做 C 订单,这批货比较急”),而不是通过僵硬的终端界面。

但所有这些能力都必须在安全控制层的约束之内

  • AMR 的最高速度和制动性能由 ISO 3691-4 等标准确定;
  • 协作机械臂的接触力上限由 ISO/TS 15066 决定;
  • VLA 只能在这些硬约束之内调度动作,而不能突破它们“自由发挥”。

4.社会与劳动力市场影响

在物流与制造领域,机器人带来的影响不仅是效率,还包括:

  • 套用仓储行业的经验:机器人可以接手高强度、重复性和危险的工作(如搬重箱、进出冷库、装卸卡车),减少工伤和人员流失。
  • 在劳动力短缺和人口老龄化严重的地区(如日本),自动化甚至被视为维持供应链运转的必要条件。
  • 同时,岗位结构向更高技能迁移:需要更多机器人运维人员、数据工程师和系统集成工程师。

对具身智能研究者而言,这里隐含着两类机会:

  • 一类是技术机会:如何用 VLA 改善人机协作体验、降低部署门槛;
  • 另一类是制度与社会机会:如何在项目中主动设计培训、岗位转型和参与式决策机制,让机器人真正成为“放大人类能力”的工具,而不是简单的替代品。

【图 12-L】智能仓储中多种机器人与人协作的示意图(占位:包括机械臂、AGV/AMR、人形机器人与工人,标注安全区域和任务分配)


本节从标准、法规到责任、信任与应用场景,描绘了具身智能从“实验室原型”走向“现实世界系统”所必须面对的外部约束。后续章节在讨论更通用的基础模型与长期发展时,可以把这些安全与社会因素视为“边界条件”:真正成功的具身智能,不是只在 benchmark 上得分最高,而是能在复杂社会系统中长期、安全、可持续地运行。

本章小结与自测

三行小结

  1. 本章扩展到前沿趋势与长期职业发展。
  2. 重点是建立可持续迭代的研究与工程路线。
  3. 学完后应能形成个人中长期方向规划。

检查题

  1. 用你自己的话总结本章最核心的一个公式/机制。
  2. 给出一个“如果要落地到项目里,你会怎么用”的具体例子。

常见误区

  1. 只追热点,不做能力积累。
  2. 方向切换过频繁。
  3. 缺乏长期项目沉淀。

公式到代码(最小示例)

papers = [
    {"topic": "generalization", "status": "reading"},
    {"topic": "safety", "status": "todo"},
]
next_topics = [p["topic"] for p in papers if p["status"] != "done"]
print(next_topics)

本章外部参考(集中)

  1. 本章暂无外部链接,建议优先完成本章自测与代码实践。

12.4 个人发展与方向选择

具身智能并不只是算法、系统和实验室的故事,也是你个人职业叙事的一部分。 站在本书这一章,你已经大致看完了从数学、机器学习,到 VLA 模型、数据工程、部署评测的完整技术路径。接下来,问题从“怎么让机器人更聪明”,变成“我在这场长期演化里要扮演什么角色”。

本节不提供唯一正确答案,而是帮助你看清几条典型路线: 学术路径(博士 / 博后 / 科研机构)、工业路径(公司与研究院)、面向具体行业的交叉方向,以及无论走哪条路都离不开的持续学习方式。

【图 12-4-1 占位:一张“学术 – 工业 – 交叉应用”三条路径的对比雷达图,维度包括:稳定性、自由度、创新风险、工程深度、与现实场景贴近程度等】


12.4.1 学术路径:博士、博后与科研机构

学习导航

  • 本章主题:12.4.1 学术路径:博士、博后与科研机构
  • 前置知识:建议全书主线章节均已通读一遍。
  • 建议用时:74-94 分钟
  • 阅读顺序:先看概念框架,再看公式/代码,最后做自测。

关键图示:长期发展路线

关键图示:长期发展路线

学术路径的核心,是把“好奇心 + 系统性 + 长期耐心”变成一条用原创工作累积声誉的生涯。从博士开始,你逐步从“会用工具的人”变成“发明工具的人”。

12.4.1.1 攻读博士

(1)什么时候适合读博?

大致有几类典型动机:

  • 你对某个具身智能子方向有很强的“钻到底”的冲动,比如:VLA 统一架构、世界模型、Sim2Real、机器人安全与验证等;
  • 你希望未来在高校、研究所、头部工业研究院担任科研岗,而这些岗位普遍需要博士学位(UNI EN);
  • 你喜欢提出新问题、验证新想法,而不是主要以工程交付或产品迭代为主。

如果这些描述听起来很像你,博士是一个值得严肃考虑的选择。

(2)博士阶段究竟在做什么?

可以用一句话概括:在导师和学术共同体的环境里,完成几次从“提出问题 → 解决问题 → 对外论证”的完整闭环。 具体通常包括:

+确定研究方向与问题:在本书涉及的巨大知识图谱里,选一小块做“深挖”,例如:

  • 基于大模型的策略学习与指令对齐;
  • 高保真世界模型与长视野规划;
  • 复杂物理交互中的安全验证与控制;
  • 多机器人协作与群体具身智能等。 +提出可发表的问题与方法:将问题抽象成清晰的研究设定,给出算法 / 模型 / 系统设计,并与已有工作进行细致比较(这部分可以回扣第 11 章关于论文阅读与选题的内容)。 +实验与系统验证:在仿真与真实机器人上进行系统实验,设计合理评价指标,确保结果既可信,又有说服力。 +写作与传播:将成果写成论文投稿到顶会/期刊(例如 ICRA、IROS、RSS、NeurIPS、ICLR 等),并通过报告、海报、开源代码等形式对外传播。

在具身智能方向,博士往往不仅是“做几个算法”,而是要亲手搭建和维护一个中等规模的实验系统:包括数据采集、仿真环境、机器人平台和训练管线,这一点与纯软件 AI 方向相比,要更重工程。

(3)选导师与方向的一些原则

+**导师 > 学校 > 城市。**顶级名校固然有资源,但更重要的是导师是否:

  • 在你感兴趣方向有持续产出;
  • 有时间指导学生(组太大可能导致稀释);
  • 在学术和工程上都重视具身智能,而不是只把机器人当“论文 demo”。 +方向要兼顾“有趣 +可做 +有影响”:只“有趣”但太空泛,很难落到可操作课题;只“好做”但边缘,很难支撑完整博士;只“热门”但你无感,很难熬过数年的反复试错。 +理想的博士课题,往往是本书某条技术主线的一个深度延伸: 比如,你可以专注于“多机器人共享 VLA 模型的架构与训练范式”,或者“面向医疗手术机器人的安全 VLA 控制”。

(4)申请准备的现实侧

很多高校与研究机构的机器人 / AI 博士项目会强调:扎实的数学、机器学习、编程与机器人背景,以及一定研究或工程经历是前提(nccr-robotics.ch)。因此在读博之前,你可以尽量做到:

  • 在硕士阶段完成一到两个具身智能相关的项目或论文(哪怕是小规模的复现 / 改进);
  • 参与开源项目或实验室工程,证明你能“把系统跑起来”,而不仅仅会写作业;
  • 在方向相近的导师手下先做一段时间科研助理 / 实习,用实际合作来降低双方不确定性。

【图 12-4-2 占位:博士阶段能力成长路径示意图,从“执行者”到“独立研究者”,标出论文、系统、合作、人脉等几个维度的变化曲线】

12.4.1.2 博士后和科研人员

博士之后,如果你仍然希望以研究为主要工作内容,通常会经历或考虑两个角色:博士后正式科研人员

博士后:从“学生”到“独立 PI”的过渡

  • 在多数国家和机构中,博士后是 2–3 年左右的固定期限职位(academicpositions.com);
  • 相比博士生,博士后:
    • 课业负担基本消失,时间更多用于研究;
    • 需要更清晰地建立自己的研究方向,不再完全依附导师;
    • 开始承担项目管理、学生指导、合作沟通等工作;
  • 对具身智能而言,博士后往往负责:
    • 领导大型数据采集与实验平台搭建;
    • 承担跨组 / 跨机构合作项目,如多实验室共享机器人数据集或联合训练基础模型;
    • 将研究从“单机器人 demo”扩展到具有代表性的 benchmark 或开放平台。

科研人员:在大学、研究所和企业研究院中长期深耕

正式科研岗可以分成几类:

+**高校:**助理教授 / 青年研究员 → 副教授 / 副研究员 → 教授 / 研究员; +**政府 / 国家实验室:**研究科学家 / 研究工程师,偏重长期战略课题和国家级项目; +**工业研究院:**Research Scientist / Applied Scientist 类型岗位,介于“学术自由”与“公司战略目标”之间。

这些岗位的共性是:用持续的、有影响力的成果,换取长期稳定的研究位置。 对具身智能方向来说,这些成果往往包括: 高质量论文、开源系统与数据集、广泛采用的算法框架以及对行业标准制定的参与。

12.4.1.3 学术成果:从“发论文”到“建设生态”

在具身智能领域,“成果”不只是论文篇数,而是你对整个社区生态的贡献。

常见的几类成果包括:

1.学术论文

  • 在机器人顶会 / AI 顶会上发表系统性工作:如新的 VLA 架构、世界模型方法、具身基准等;
  • 真正有影响的工作往往不是“刷题式”的小修小补,而是回答了一个社区长期关心的核心问题。 2.代码、数据集和基准平台
  • 对具身智能而言,高质量的开源代码、数据集与仿真环境本身就是一等公民;
  • 如本书前面提到的多机器人多任务数据集、统一控制接口平台等,往往能深刻影响后续研究方向(Robotics Jobs)。 3.系统与工具链
  • 更工程向的成果:例如部署在多个实验室 / 公司使用的 VLA 训练框架、高效仿真引擎插件等;
  • 很多具身智能的突破,恰恰来自于底层工程基础设施质量的升级。 4.社区贡献
  • 组织 workshop、tutorial、暑校、挑战赛;
  • 担任程序委员会、审稿人、领域主席等;
  • 这些工作难以量化,但对你建立领域声誉和人脉非常重要。

从个人发展角度,一个健康的规划是:围绕一个清晰主线,产出一系列互相支撑的成果组合,而不是在完全无关的题目之间跳来跳去。


12.4.2 工业路径:机器人公司、研究院与大模型公司

工业路径的共同特点,是:真实用户、真实场景和真实约束会不断推着你做取舍——性能、成本、交付时间、安全性,经常不能同时拉满。

12.4.2.1 机器人创业公司

在全球范围内,机器人与自动化相关创业公司覆盖了仓储物流、协作机械臂、服务机器人、特种机器人、人形机器人等多个赛道(Automate)。 很多具身智能相关的突破,将首先在这类公司里变成产品。

典型角色

  • Robotics / Embodied AI Research Engineer
  • Perception / SLAM Engineer
  • Motion Planning / Control Engineer
  • Robot Software Engineer(系统与平台)
  • Machine Learning / Foundation Model Engineer(偏算法)

这些岗位往往要求技术栈跨越本书多个章节:既要能理解论文里的 RL / IL / VLA 细节,又要能读懂 ROS 接口、硬件规格和安全文档(机器人手册)。

工作方式与节奏

  • 团队规模小,角色边界模糊: 你可能同时负责模型训练、真机调试、客户现场部署和 bug 修复;
  • 评估标准更偏向**“系统能否在某个 demo / 场景中稳定工作”**,而不是论文指标;
  • 决策链路短,试错快: 一个想法不需要写长篇提案,只要能在下一个版本中快速上线验证。

优劣势对比

  • 优点:
    • 成长曲线陡峭,对系统性能力要求高;
    • 有机会把具身智能真正“装进机器人”,直面现实问题;
    • 如果公司发展顺利,个人在股权 / 职业声誉上的回报也较高。
  • 挑战:
    • 不确定性大,产品方向和技术路线可能多次 pivot;
    • 工程压力与迭代速度高,对个人时间管理和心理韧性要求大;
    • 纯学术成果(论文)可能不是首要关注,需要自己平衡。

12.4.2.2 大型研究院

大型工业研究院(例如科技巨头旗下的 AI / Robotics Lab,以及汽车 / 制造企业的前瞻研究中心)处在**“工业”和“学术”之间的中间地带**(EIT Campus)。

它们通常具备几个特征:

+资源充足: 高性能计算平台、高质量机器人平台、多源传感器与自建数据中心; +科研友好: 鼓励在顶会发表论文、开放部分代码或基准,有学术自由度; +又必须对公司战略负责: 研究方向需和公司中长期目标挂钩,例如自动驾驶、智能制造、家庭机器人、通用具身智能等。

在这类机构的日常工作,通常包括:

  • 设计和验证新算法 / 模型,撰写论文与技术报告;
  • 参与搭建通用工具链:统一仿真平台、统一数据平台、统一 VLA 训练与部署框架;
  • 与产品线团队对接: 将研究成果逐步下沉为可维护的组件,或为内部客户提供技术咨询。

适合的人群特征:

  • 喜欢相对稳定的环境,又不想完全脱离学术前沿;
  • 乐于在“基础研究”与“实际落地”之间做折中与沟通;
  • 能适应公司制度、项目管理和跨部门协作。

12.4.2.3 大模型企业

近年来,很多大模型公司开始重启或加大机器人与具身智能投入,将其视为迈向更通用 AI 的关键路径之一(WIRED)。 典型的趋势包括:

  • 基于海量互联网图文和视频预训练的视觉–语言–动作基础模型
  • 借助云端算力和仿真平台,进行大规模策略训练、世界模型学习;
  • 通过遥操作、众包等方式采集真实机器人数据,优化 VLA 模型。

在这些公司中,具身智能相关岗位常见的关键词包括:

+Embodied AI / Robotics Foundation Model Researcher 设计和训练大规模 VLA / 世界模型; +Simulation / Data Platform Engineer 负责构建 Isaac Gym 等大规模仿真和数据流水线; +Teleoperation / Embodied Data Engineer 设计遥操作采集系统、质量评估与数据治理; +Systems / Infrastructure Engineer 支撑数千 GPU 级别的分布式训练、模型部署。

这一方向的显著特点是:“以大模型为中心”的具身智能观—— 技术栈从底层分布式系统,一路向上到 VLA 结构设计与机器人控制。 适合那些对“规模 + 系统 + 算法”三者都感兴趣的人,同时也能接受高度竞争与高强度的环境。


12.4.3 交叉方向:医疗机器人、辅助机器人、工业自动化等

如果说学术路径关注“知识边界”,工业路径关注“产品与市场”,那交叉方向更多关注**“具体行业的问题”**:医疗、养老、制造、农业…… 具身智能在这些场景中落地,需要你既懂机器人和 AI,又懂行业本身的规则与需求。

12.4.3.1 医工结合

医疗是具身智能应用中技术门槛和安全要求最高的领域之一,典型包括:

  • 手术机器人(例如微创手术系统、骨科导航机器人等)(ATALUP);
  • 康复机器人(如下肢外骨骼、上肢康复臂);
  • 智能假肢、辅具与远程超声 / 介入机器人。

这一方向的特点:

+安全与合规极其重要: 系统必须满足严格的医疗器械法规、认证流程与临床试验标准; +跨学科协作强: 需要与医生、护士、康复治疗师、生物力学专家、医院管理者密切沟通; +时间尺度长: 从实验室到真正临床部署,往往需要数年甚至十年以上。

具身智能技术在其中的角色包括:

  • 高精度感知与定位(视觉 / 影像引导下的位姿估计与路径规划);
  • 与医生共享控制的人机协作(力控、阻抗控制、安全约束);
  • 个体化康复方案建模(世界模型 + 强化学习 + 安全约束)。

适合的人,往往对医学和“改变患者命运”有很强的价值认同,能接受节奏较慢但回报极具社会意义的工作。

12.4.3.2 辅助 / 服务机器人

辅助 / 服务机器人面对的,是日常生活中的真实人群:老人、小孩、患者、普通家庭用户。典型场景包括:

  • 家庭助理机器人:简单家务、取放物品、环境监测;
  • 养老 / 康复辅助:提醒服药、情感陪伴、移动辅助;
  • 公共服务:酒店、医院、商场中的引导与配送机器人。

这一方向特别强调:

+人机交互(HRI)与心理学: 如何让机器人动作、语言和外形让人感到安全、友好,而不是冰冷或压迫; +语言与多模态理解: 很多任务以自然语言为主要接口,本书前面讲的 NLP / VLM / VLA 技术在这里发挥核心作用; +隐私与伦理: 机器人摄像头和传感器深入家庭和个人空间,需要严格的数据保护与伦理规范(可与 12.3 节的讨论呼应)。

对这类工作感兴趣的人,通常既喜欢做技术,又对人文社科、产品设计有好奇心。

12.4.3.3 工业 4.0 与自动化

工业 4.0 强调的是柔性、智能、互联的生产系统。 在工厂、仓储、能源等场景下,机器人与自动化早已大规模应用,并持续产生新的岗位与职责(Automate)。

典型角色包括:

+自动化 / 控制工程师: 设计和维护工业机器人、PLC、输送线、传感器网络,确保产线稳定运行; +工业视觉 / 质检工程师: 使用机器视觉和深度学习进行质量检测、缺陷识别; +智能制造系统工程师: 结合 MES / ERP / 仓储系统,设计整体调度与优化策略,将具身智能嵌入更大系统。

这一方向的特点是:

  • 更强调可靠性、可维护性和成本效益
  • 并不一味追求“最前沿”的模型,而是优先选择可验证、可长期运行、符合标准的方案;
  • 就业市场相对稳定,短期风险比创业小,但创新空间仍然存在,例如将本书介绍的 VLA 模型用于灵活产线和仓储机器人。

【图 12-4-3 占位:三条交叉方向对比表,列出“医疗 / 辅助 / 工业自动化”的目标用户、监管强度、技术侧重点(感知 / 控制 / 语言 / 安全)、典型岗位】


12.4.4 持续学习与知识结构迭代

无论你选择哪条路径,有一个事实恐怕无法逃避: 具身智能相关技术在可预见的未来仍会高速演化。 从早期的经典控制和规划,到深度强化学习,再到大规模 VLA 与世界模型,每隔几年就会出现一次范式升级。

因此,比“掌握某一具体框架”更重要的,是建立一套可持续更新的知识结构

12.4.4.1 紧跟前沿

“紧跟前沿”不等于每天被 arXiv 热门论文刷屏,而是要有节奏地摄入信息、筛选并消化

可参考的做法:

1.建立固定的信息源组合

  • 机器人与控制:ICRA、IROS、RSS、CoRL 等;
  • AI / VLA:NeurIPS、ICLR、ICML、CVPR 等;
  • arXiv 相关分类(cs.RO、cs.LG、cs.AI、cs.CV 等);
  • 高质量博客 / 技术报告 / 公司白皮书(很多具身智能实践经验出自工业界)。 2.分层阅读策略
  • 扫描层”:每周花固定时间浏览标题和摘要,标记看起来与你主线方向相关的工作;
  • 精读层”:从扫描层选出少量关键论文,深入阅读方法与实验,对照本书前面介绍的理论与实践知识进行消化;
  • 实践层”:对最重要的工作,尝试复现部分结果或将其嵌入自己的系统(可回扣第 11 章关于代码复现与消融实验的内容)。 3.线上线下社区
  • 参加学术会议、暑校、workshop;
  • 关注开源社区、技术论坛、专业微信群体 / mailing list; 研究表明,机器人与自动化相关岗位类型和数量仍在增长,形成了从初级工程师到研究科学家的完整职业梯度(NEIT)。

12.4.4.2 扩展技能树

可以把你的能力结构想象成一个不断生长的“技能树”。

+纵向:至少一个深度方向 例如:

  • 深度强化学习和策略优化;
  • 世界模型与长时预测;
  • 机器人控制与安全验证;
  • 大模型训练与微调。 这是你未来的“招牌”。 +横向:多条支线能力本书已经隐含列出了一些你迟早要接触的支线:
  • 工程向:分布式训练、云端部署、嵌入式与实时系统、ROS / ROS2 生态等;
  • 行业向:根据你感兴趣的交叉方向,补充医学基础、工业流程、物流与供应链知识等;
  • 软技能:项目管理、团队协作、跨学科沟通、写作与演讲。 +**刻意追求“可以被替代的技能组合很少”**单一技能(“会写 PyTorch 代码”、“懂一点 SLAM”)很容易被替代。 而例如“既能设计大规模 VLA 模型,又能亲自把模型部署到真实机械臂上调到可用”这样的组合,就会变得非常稀缺。

【图 12-4-4 占位:一个“技能树 / 雷达图”示意,展示算法、工程、行业知识、沟通协作等维度的能力分布,以及从学生到成熟工程师 / 研究者的变化】

12.4.4.3 知识更新:把自己的认知当作“可重构系统”

具身智能领域的技术迭代速度,意味着你必须定期对自己的知识结构做“重构”:

1.接受范式迁移

  • 早年经典控制 → 纯 RL → 模仿学习 + RL → 大模型 + IL + RL + 世界模型 你会多次经历“旧习惯被新范式部分替代甚至颠覆”的过程;
  • 面对新的技术潮流时,既要保持好奇,也要保持理性:区分“概念包装”与真正的本质变化。 2.定期整理自己的知识图谱
  • 通过笔记、思维导图、知识管理工具把本书中的模块和你接触到的新内容统一整理;
  • 标记哪些已经熟练掌握,哪些还停留在“听说过”的阶段;
  • 对过时的认知(例如某些已被证明效果欠佳的范式)主动做“降级处理”,避免长久沿用。 3.将实践经验纳入“知识库”
  • 很多对你最有价值的知识,并不在论文里,而在你自己搭系统、踩坑、修 bug 的过程中;
  • 养成习惯:在每个项目结束后,写一份“工程后记”,总结:
    • 哪些设计是对的;
    • 哪些假设是错误的;
    • 哪些地方可以提炼成可复用的组件或方法论。 4.在不确定性中规划长期路线
  • 具身智能未来 10 年肯定会经历若干次技术浪潮起落,但几个“相对稳定”的长期主题几乎不会过时:
    • 更强的世界模型与长时规划;
    • 更安全、更可信的物理交互;
    • 与具体行业深度融合的应用系统;
    • 可扩展、可协作的机器人群体。
  • 当你选择方向和规划技能树时,可以将这些长期主题作为锚点,在不同浪潮之间保持相对稳定的积累。

本节从学术、工业到交叉应用,从路径选择到持续学习,给出了一个“人”的视角——你如何在本书铺陈的这张具身智能知识地图上,找到自己的位置,并随时间持续移动。

在后续的结语中,我们将回望整本书中关于 VLA 与具身智能的技术细节与实践经验,尝试回答一个更大的问题:当人类把智能从数字世界延展到实体世界,我们究竟在构建什么样的未来?

本章小结与自测

三行小结

  1. 本章扩展到前沿趋势与长期职业发展。
  2. 重点是建立可持续迭代的研究与工程路线。
  3. 学完后应能形成个人中长期方向规划。

检查题

  1. 用你自己的话总结本章最核心的一个公式/机制。
  2. 给出一个“如果要落地到项目里,你会怎么用”的具体例子。

常见误区

  1. 只追热点,不做能力积累。
  2. 方向切换过频繁。
  3. 缺乏长期项目沉淀。

公式到代码(最小示例)

papers = [
    {"topic": "generalization", "status": "reading"},
    {"topic": "safety", "status": "todo"},
]
next_topics = [p["topic"] for p in papers if p["status"] != "done"]
print(next_topics)

本章外部参考(集中)

  1. UNI EN
  2. nccr-robotics.ch
  3. academicpositions.com
  4. Robotics Jobs
  5. Automate
  6. 机器人手册
  7. EIT Campus
  8. WIRED
  9. ATALUP
  10. NEIT