外观
具身智能学习:视觉语言导航综述
写在前面
上一篇我停在 PPO 和 SAC 那里,把连续控制里最常用的几个算法过了一遍。但强化学习只是一半:它回答的是「给定状态和奖励,怎么学一个好策略」,而具身智能的入口问题要更土一点——机器人站在客厅里,人对它说了一句「走出客厅,上楼梯,经过餐桌,在门口左转,进入卧室」,它下一步该往哪儿迈。
这个问题有个正式名字:视觉语言导航(Vision-and-Language Navigation,VLN)。我读的这篇是 Gu 等人 2022 年的综述《Vision-and-Language Navigation: A Survey of Tasks, Methods, and Future Directions》,发在 ACL 上,正文 18 页,我前后翻了三遍。
读的过程里我卡住的地方很具体。综述里每个词我都能查明白——oracle、grounding、attention、HAMT、PREVALENT——但我不知道它们之间的关系。比如看到「Memory-augmented Model」这一节,我第一反应是记忆到底存在模型里,还是存在机器人系统里;看到「Auxiliary Tasks」,我又想,这不就是多挂几个损失函数吗,为什么在导航里值得单独列一类。
后来我发现,问题出在我把它当成了方法清单。这篇综述的分类其实是长在难点上的:先有四组卡住人的地方,再有四类方法。所以这篇文章我不追方法细节,只想把「VLN 到底难在哪」讲清楚,然后说明那四类方法各自在回应哪一组难点。
你不需要学过强化学习。但如果知道状态、动作、策略这三个词指的是什么,读起来会顺很多。
一、VLN 是什么
论文开篇给的图里只有三个角色:oracle(通常是人类,知道正确路线)、agent(机器人)、environment(可导航的 3D 环境)。agent 和 oracle 之间用自然语言通信,agent 和环境之间是观察和移动。我第一次看到这个图的时候有点意外——它没有画任何神经网络,画的是一场对话。
先看一个具体场景。你对机器人说「走出客厅,上楼梯,然后经过餐桌,在门口左转,进入卧室」。它手里同时有四样东西:你说的话、摄像头里的画面、自己走过的路线、当前所在的位置。它要输出的是一个动作。
论文把这件事写成一个式子:
at=π(L,Ot,Ht)
其中 L 是指令(Language),Ot 是第 t 步的观察(Observation),Ht 是到当前为止的历史(History),π 是策略(policy),at 是这一步的动作。
这里有个我一开始判断错的地方:动作空间其实很小。在 R2R 那种图结构环境里,机器人站在一个 viewpoint 上,能去的相邻 viewpoint 通常只有几个,再加上一个停止动作。所以 VLN 难的不是输出空间,是「选哪个」这件事依赖一大堆上下文。
为什么先记住这个式子
后面所有方法都在补全它里面的某一项。Representation Learning 管的是 L 和 Ot 怎么被表示成模型能算的东西,Memory 管的是 Ht 怎么被压缩和读出来,Action Strategy Learning 管的是 π 怎么学。以后看到一个没见过的模型,先问它在动哪一项,比硬记它的结构有用得多。
论文还按「机器人和人怎么交流」分了三个层级,叫 通信复杂度(communication complexity):
| 层级 | agent 能做什么 | 代表数据集 |
|---|---|---|
| Initial Instruction | 只在出发前拿到一次指令,之后全靠自己 | R2R |
| Oracle Guidance | 不确定时能发求助信号,拿到下一步指导 | Just Ask、VNLA |
| Dialogue | 能和 oracle 用自然语言来回好几轮 | CVDN、TEACh |
我原来以为这三个层级只是难度不同,后来发现它改变的是问题的性质。第一层里,语言在出发前就冻结了;第三层里,语言本身变成了一个可以在导航过程中不断刷新的输入。同样是「导航」,前者更像开卷考试前看了一遍题,后者像边做边问老师。
二、对齐
Grounding 直译是「落地」,在 VLN 里的意思很具体:语言里的那个东西,到底对应画面里的哪一个。
指令是「走到沙发旁边,然后向左转」,机器人视野里同时有沙发、椅子、窗户、地板。它得先解决「沙发」指向哪儿,再解决「旁边」是什么空间关系,最后解决「向左转」是相对哪个朝向。
这里有个我一开始没意识到的地方:grounding 不只是认物体。论文列了需要被对齐的五类东西——actions、scenes、observed objects、direction clues,以及 instruction 里的 objects。其中方向线索和指令里的物体这两类最容易被忽略。
拿一句指令试一下:「窗户左边的椅子」。机器人识别出 window 和 chair 只是第一步,它还得知道是哪一张椅子。而且「左边」到底相对哪个参考系,也有讲究——相对它自己,还是相对窗户。
真正让这件事变难的是,硬匹配根本不够用。真实场景里可能有两个桌子、三把椅子,你说「桌子」,它该指向哪一个?论文里常见的做法是用 attention 做软对齐(soft alignment):不算「是或不是」,算「有多像」。
| 指令中的词 | 视觉实体 | 权重 |
|---|---|---|
| 桌子 | Table | 0.80 |
| 桌子 | Chair | 0.10 |
| 桌子 | Sofa | 0.05 |
| 椅子 | Chair | 0.90 |
| 椅子 | Table | 0.05 |
这些权重一般来自一次 softmax 归一化:
wi=∑jexp(sj)exp(si)
si 是第 i 个视觉实体和当前指令词之间的相关性打分。数值上的直觉就是上面那张表:0.80 表示「这个词大概率落在它身上」,0.05 表示「基本无关,但也不是完全排除」。
Attention 在这里的直觉
我一开始把 attention 想得太重。它在这类模型里要回答的其实是很朴素的问题:当前这一步,我应该重点看谁。模型不会平均地看画面里的每个物体,而是按指令给它们分配不同的权重。
一个容易读错的细节
软对齐的权重不是「置信度」。0.80 不意味着模型有 80% 的把握这是桌子,它只是内部相关性的一次分配。读论文时如果把这两种解释混起来,后面看损失函数会一直别扭。
三、序列决策
最省事的做法是让模型一次性吐出整条动作序列:[左转,直走,左转,上楼]。这行不通,因为它不知道未来每一步会看到什么——它现在没走进那个门,就不知道门后面是走廊还是厨房。
实际的过程是一步一步来的:
看环境
拿到当前观察 Ot,可能是几个方向的 RGB 视图拼成的全景
选动作
用策略 π 结合指令 L 和历史 Ht,选出一个动作 at
动起来
环境状态改变,机器人到达相邻节点,拿到新观察 Ot+1
回到第一步
直到发出停止动作,或者超出步数上限
也就是 Ot→at→Ot+1 这个循环。论文把它称为序列决策(sequential decision making),并指出 VLN 可以自然地建模成马尔可夫决策过程(Markov Decision Process,MDP),所以强化学习的方法可以拿进来学导航策略。
MDP 由状态、动作、转移、奖励、折扣五部分构成。放在 VLN 里,状态就是机器人所在的位置和它看到的东西,动作就是往相邻节点移动或者停下,奖励通常在整段路走完之后才给。
它和普通分类任务的差别,我做了一张表:
| 单步分类任务 | VLN | |
|---|---|---|
| 输入 | 一张图 | 指令 + 当前观察 + 历史 |
| 输出 | 一个标签 | 一串动作 |
| 监督信号 | 每个样本都有标签 | 只有回合结束时的成功信号 |
| 出错的代价 | 当前样本错一次 | 会改变之后的所有状态 |
第三行是强化学习进来之后最难受的地方,论文里叫信用分配(credit assignment):机器人走完整段路才知道成功还是失败,但它需要知道是哪一步做对了、哪一步做错了。RCM 那类工作就是给这个过程补中间奖励:在目标导向的外部奖励之外,再加一项指令保真度的内在奖励;另一条路上,有人直接把指令和关键地标的局部对齐拿来当奖励,让每一步都能分到一点反馈。
一句不太中听的体会
这一行也解释了为什么 VLN 论文里到处是奖励塑形的痕迹。当唯一的信号在最后一步,中间每一步的梯度都得靠人手动设计一个代理目标。这不是模型能力的问题,是任务给的监督太稀疏。
四、误差累积
正确路线是 A→B→C→D,机器人走成了 A→B→X。X 不在正确路线上,怎么办?
退回去。X→B,再从 B 走到 C 和 D。这就是回溯(backtracking)。
论文里和它一起出现的还有 exploration、recovery、replanning,它们回答的其实是同一个问题:我发现刚才那个决策可能错了,现在怎么办。
这个场景在真实机器人上比在仿真里常见得多。走廊左右各一个房间,机器人判断左边可能是厨房,进去发现不是——那就得退出来,再试右边。这种「进去看看不对再退出来」的动作在真机上会反复出现,而在仿真里几乎不发生,因为仿真里的机器人很少真的迷路。
原因在论文的 Sim-to-Real 那一节写得挺直白。navigation graph 这类仿真环境默认了三件事:(1) 定位是完美的,而真实世界里位置只是一个有噪声的估计;(2) 移动是 oracle 导航,机器人可以「跳」到一个新节点,而真实机器人不行;(3) 拓扑是已知的,机器人手里有一张预先定义好的可导航节点表,而真实场景里没有。
三条都不满足的时候,一步走错的代价会比仿真里大得多,因为它不只是走错一步,而是把自己扔进了一个「不知道自己在哪」的状态。
我原来低估的一件事
我一开始把「走错就回溯」当成一个工程细节。后来才意识到它是任务本身的性质:环境是部分可观测的(Partially Observable MDP,POMDP),你不可能在起点就知道右边那扇门后面是什么。回溯不是补丁,是必需品。
五、记忆
机器人走了客厅、走廊、厨房、楼梯,又回到一条走廊。现在它看到一条和刚才很像的走廊,需要回答一个问题:我是不是来过这里。
这就是 at=π(L,Ot,Ht) 里 Ht 的用处。如果模型只看当前画面 Ot,它甚至不知道自己刚才从哪儿来——而「经过沙发后左转」这种指令,必须靠「我到底经没经过沙发」来推进。
最简单的做法是把历史压进一个 hidden state,也就是 LSTM 或者 GRU 那类循环结构。问题在于路径一长,早期信息会被慢慢冲淡。论文里的说法是:随着路径长度增加,模型很难记住路径开头的信息。
HAMT 那类工作换了个思路,把 Ht 的结构显式搭出来:先把单个视角编码成 view,再把同一位置的多个 view 编码成 panorama,最后把历史里所有 panorama 编码成整段历史。等于不再指望一个 hidden state 把所有东西挤进去,而是分层存放。
记忆里能存的东西也不只是图像:
| 存什么 | 记的是 |
|---|---|
| 视觉历史 | 之前看到过什么 |
| 位置历史 | 之前去过哪些点 |
| 动作历史 | 之前做过什么 |
| 语言进度 | 指令里的哪几个目标已经完成 |
读到这里我问了自己一个挺关键的问题:这个 memory 到底存在模型内部,还是存在 agent 框架里?
论文的答案是两种都有,而且混着用。我把它整理成了对照:
| 模型内部记忆 | 模型外部记忆 | |
|---|---|---|
| 载体 | hidden state、memory token、recurrent state | 地图、visited 列表、轨迹缓冲 |
| 容量 | 受网络宽度和序列长度限制 | 可以外部扩展 |
| 读法 | 跟着前向传播自动更新 | 需要拿 query 去检索 |
| 可解释性 | 弱,基本是黑箱 | 强,能直接打印出来看 |
所以以后在论文里看到 memory,不要默认它就是 LSTM。至少问清楚三件事:存在哪里、存什么、怎么被读出来。同一个词背后可能是完全不同的机制——一个是网络结构的一部分,一个是机器人外挂的一张地图。
六、任务与方法
到这儿难点讲完了。现在回头看综述的组织方式,会发现它先分清任务,再给方法。
任务这一侧,论文按两个轴来组织 benchmark。第一个轴是前面说的通信复杂度,第二个轴是任务目标(task objective):
| 目标 | 机器人要做什么 | 代表数据集 |
|---|---|---|
| 细粒度导航(Fine-grained) | 严格沿着指令描述的路线走 | R2R、RxR、VLNCE |
| 粗粒度导航(Coarse-grained) | 只给一个模糊目标,路径自己推理 | RoomNav、REVERIE |
| 导航 + 物体交互 | 还要改变环境里物体的状态 | ALFRED、TEACh |
这三类各举一句指令就清楚了。细粒度是「向前走,经过沙发,左转,然后进门」;粗粒度是「去厨房」;物体交互是「把苹果切开」——机器人得先找到厨房,找到冰箱,打开,拿出苹果,再找到刀。
论文管最后这一类叫 VLN 的最后一公里问题(last-mile problem)。Anderson 在 R2R 那篇里问的是机器人能不能学会「Bring me a spoon」,而下一步要问的是它怎么学会「Pick up a spoon」。走到附近和把东西拿起来,中间隔着一整套操作。
方法这一侧,论文先列了四组难点,再让方法一一对应:
| 论文指出的难点 | 对应的方法大类 | 论文里的子方向 |
|---|---|---|
| 多模态信息难以理解和关联 | Representation Learning | 预训练、语义理解、图表示、记忆增强模型、辅助任务 |
| 导航过程需要推理策略 | Action Strategy Learning | 强化学习、导航中探索、导航规划、主动求助 |
| 训练数据稀缺 | Data-centric Learning | 数据增强、课程学习、多任务学习、指令解释 |
| 从已见环境泛化到未见环境 | Prior Exploration | 自监督模仿、环境采样、图或地图先验 |
把这张表和前面四节对一下,会看到一个落差:我卡住的地方(对齐、序列决策、误差累积、记忆)落在前两行里;而论文专门强调的后两行,也就是数据稀缺和泛化,只看已发布的 benchmark 结果几乎感受不到它们的分量——数据集是现成的,测试环境也还是同一个仿真器,泛化差距被压住了。
而这两行恰恰在真实机器人上最要命。这也是我看完这篇综述之后对「先跑通仿真再说」这句话态度变谨慎的原因:仿真里没暴露出来的,不一定是已经解决了。
七、评价指标
论文把指标分成两组,这个分法本身就有信息量。
一组是目标导向指标,衡量离目标有多近:Success Rate(SR,成功率)、Goal Progress(剩余距离减少了多少)、Path Length(PL,路径总长)、Shortest-Path Distance(SPD)、Oracle Success Rate(OSR,路径上任意一点是否曾落在目标附近)。
另一组是路径保真指标,衡量有多像参考路线:Fidelity、Coverage weighted by LS(CLS)、Normalized Dynamic Time Warping(nDTW)。
两组里我觉得最该记住的是 SPL(Success weighted by Path Length):
SPL=N1i=1∑NSi⋅max(pi,ℓi)ℓi
Si 表示第 i 个回合是否成功,ℓi 是最短路径长度,pi 是机器人实际走的长度。只看成功率会鼓励一种很糟的行为:绕远路也要成功。SPL 把成功和路径长度绑在一起,绕的路会直接从分数里扣掉。
数值上的直觉:假设 10 个回合里成功了 9 个,而这 9 次平均走了最短路的两倍,那么 SPL 大约是 0.9×0.5=0.45。成功率看起来是 90%,SPL 只有 45%。论文里和它同思路的是 SED,只是把「路径长度」换成了「与专家动作序列的编辑距离」。
为什么要同时留着两组指标?因为「到达」和「按描述走」在这个领域里是两件事。细粒度导航要求复现路线,粗粒度导航只要求到达。指标分两组,其实是在提醒读者:这个领域对「什么算成功」并没有一个统一答案,你得先看清楚这个 benchmark 想要哪一种。
八、一张人话版词典
学新领域时我习惯自己写一份对照表。这份是读完这篇综述之后我自己用的版本,不是论文的官方译名。
| 术语 | 我现在怎么理解它 |
|---|---|
| Oracle | 知道正确答案的「老师」,可以是人,也可以是一个规则或模型 |
| Grounding | 把语言里的东西对应到环境里的具体东西 |
| Representation Learning | 把语言、图像、动作变成模型能算的数字表示 |
| Attention | 决定「现在应该重点看谁」 |
| Soft Alignment | 不是硬匹配,而是用权重表示「有多相关」 |
| Action Strategy Learning | 学「在当前情况下该采取什么动作」,也就是学策略 π |
| Backtracking | 发现走错之后退回来重新选 |
| Memory-augmented Model | 带记忆机制的模型,记忆可能在网络里,也可能在外挂系统里 |
| Auxiliary Task | 为了帮主任务学好而额外训练的任务,通常表现为多加几个损失项 |
| Prior Exploration | 先让模型在测试环境里转一圈,缩小已见和未见之间的差距 |
其中 Auxiliary Task 是我最后才想通的一个。它的作用不是多一个输出,而是逼模型学到更有用的内部表示:让它同时预测「我看到了什么」「我在哪个场景」「指令完成到哪一步」,这些任务本身就是对环境的理解,而理解得好,导航自然会好一点。损失函数大概长这样:
L=Lnavigation+λ1Lobject+λ2Ldirection+λ3Lprogress
λ 控制每个辅助任务的分量。这件事在机器人上尤其自然,因为它本来就在同时做很多事——定位、识别、判断方向,只是以前这些模块各干各的。
九、读论文的三个提问
这篇综述对我最实际的帮助,不是记住某个模型,而是让我形成了一个提问习惯。现在拿到任何一篇 VLN 论文,我会先问三件事:
- 它在补 at=π(L,Ot,Ht) 里的哪一项?
- 它属于四类方法中的哪一类,回应的是哪一组难点?
- 它报的是哪一组指标,优化的是到达还是保真?
这三个问题不能让我看懂全部细节,但能让我在十分钟内知道这篇论文想站在哪儿。我之前的毛病是从结构图开始读,一路读到实验表格,读完还不知道作者的靶子是什么。先问这三句,靶子就清楚了。
十、还没想明白的
有几个问题这篇综述指出了,但我还没有能力回答。
最后一公里怎么走。论文说下一步要从「Bring me a spoon」走到「Pick up a spoon」,可是导航和操作这两块在方法上目前还是割裂的,我没找到把两者真正缝起来的综述。
环境太单一。论文里提到,室内 VLN 数据绝大多数是美式住宅,几乎没有仓库和医院——而这两类地方恰恰是导航机器人最可能真正派上用场的场景。训练出来的模型在别的城市、别的户型上会怎么样,我目前只有论文的定性判断,没有数字。
还有一个是我自己的怀疑,说不上成熟:我觉得 VLN 现在的瓶颈已经不在模型结构上了,而在数据和环境的真实性。理由是我看到的方法迭代速度很快,但论文里报的仍然是在同一批仿真环境里的提升。这句话我暂时没有实证支撑,写在这里是为了以后回来看有没有被打脸。
下一篇我打算挑一个具体的模型读进去,比如 HAMT,把「层次化的记忆到底怎么实现」这件事落到代码和公式上,而不是停在「它把视角分成三层编码」这种描述上。
这条路我才刚开始走。写下这些,算是对自己思考的一次整理。
版权所有
版权归属:SAKE
