资讯动态

视觉-语言导航如何从离散走向连续:演化拓扑规划与强化微调实践

发布时间:2026/10/21 11:02:29 来源:尧图企业网站定制
视觉-语言导航VLN这个方向做过的人都知道跟普通视觉导航完全是两码事。因为它不是单纯找到路而是要先听懂人话再把指令翻译成空间里的运动规划。更麻烦的是一旦从离散的图节点环境换到连续环境智能体就不再是从A点跳到B点而是真的在自由空间里走动作空间、观测范围、障碍物处理全都变了。我们最近项目组在做的ETP-R1就是把演化拓扑规划跟强化微调组合在一起解决连续环境下的视觉-语言导航问题。这篇文章我就不按照论文那套写了直接把这些方案选型、训练细节、还有实际调试时踩过的坑都摊开来聊一遍。准备做VLN、或者打算在连续空间里搞具身智能策略的朋友这篇应该能帮你少走不少弯路。1. 项目背景与整体思路1.1 连续环境下视觉-语言导航的痛点先说任务本身。视觉-语言导航给定一段自然语言指令比如绕过沙发穿过厨房到卧室门旁边的椅子那里停下智能体要根据摄像头图像和指令在环境里一步步走过去。评估时看的是能不能在指定位置停下、路径是否够短。离散环境版本把这个任务简化了不少环境被预先抽象成了一张图节点就是固定视角点智能体只是在节点之间跳转。这相当于把连续运动问题退化成了图上的路径搜索问题。但在真实世界里机器人不可能每一次转弯都刚刚好停在预设节点上连续环境要求智能体对任意时刻的姿态、任意方向上的障碍物、以及累计里程误差都有处理能力。简而言之连续环境才更接近真实部署场景也正是VLN任务最难啃的一块。实际跑起来问题主要集中在三块跨模态匹配不稳定。语言指令和视觉画面之间存在很大的语义鸿沟同样一句灰色的沙发不同房间里的沙发外观差异巨大模型在训练环境里见过换到没见过的房间就不认识了。探索与利用难平衡。指令通常只描述目标不会告诉你完整路径智能体必须一边走一边推理。如果探索太激进路径会绕远如果不敢探索就会卡在局部区域出不去。训练信号稀疏。传统监督学习靠模仿专家轨迹但专家轨迹数量有限而且模仿只能学到见过的情况无法直接优化导航最终目标。长距离导航中奖励通常直到抵达终点才出现中间过程几乎无梯度信号。这些痛点决定了单纯调大模型参数解决不了问题必须在规划结构上做文章并在训练目标里加入更直接的优化信号。1.2 ETP-R1的核心设计逻辑我们内部管这套方案叫ETP-R1拆开看其实是三件事Evolution演化、Topology拓扑、Planning规划再加一个基于**Reinforcement Fine-tuning强化微调**的训练阶段。名字里带R1意思是这是强化微调路线落地的第一版验证系统后面可能还会有R2、R3但核心设计框架在这一版就定型了。整体设计逻辑其实可以归纳成一句俗话先画地图再决定往哪走最后用奖励把每一步走扎实。第一层是感知与地图构建。智能体在移动过程中不断把当前观测转换成视觉特征点将这些特征点作为节点插入在线维护的拓扑图中。图里的边表示我能从某个位置走到另一个位置这样智能体就拥有了一个随探索不断生长的环境地图。第二层是规划。拿到指令编码后规划器先判断目标大概在哪块区域然后在拓扑图上运行路径搜索得到一条由节点组成的粗粒度路径。这一步不直接输出运动指令而是给低层策略一个前往下一个关键点的子目标。第三层是动作执行。低层策略接收子目标、深度图和RGB图输出具体的转向和前进动作。这一层是可以端到端训练的也是强化微调的核心优化对象。这个分层逻辑的好处在于拓扑图本身是一个很好的中间表征它让智能体不会完全黑箱式地走一步看一步而是具备显式的空间记忆。强化微调则作用于低层策略以及部分高层规划选择让整体行为向更快到达目标这个方向收敛。相比纯端到端黑箱策略这种结构更容易调试也更容易分析每个环节的错误来源。2. 关键技术模块拆解2.1 多模态特征编码怎么把画面和指令对齐这个项目的第一个关键环节是获得一个可以用于空间匹配的视觉特征以及一个能够指导导航的语言特征。视觉编码器我们用的是预训练的视觉Transformer把当前帧图像切patch后映射成语义token。但做VLN只用单帧图像不够还需要把左右视角拼接或用全景图考虑到连续环境中智能体位置可任意变动我们采用多视角输入在编码器前做一个简单的view merging把前方、左前、右前三路图像拼接成一张宽视角图再统一编码。语言编码器相对简单用标准的Transformer文本编码器跑一遍指令得到整句指令的CLS向量作为全局目标表征同时保留每个词的token序列用于后续细粒度对齐。训练初期我们不直接端到端微调这两个编码器而是先冻结大部分权重只微调中后层的cross-attention原因是数据集规模有限全量微调会严重过拟合让视觉特征在陌生环境下退化。对齐方面我建议不要只依赖单个全局向量。指令中左转后右转这种空间词很难编码进一个稠密向量里。我们让视觉特征和语言token先过一个交叉注意力层把语言token作为query去关注图像patch得到跨模态融合特征。这个特征会被同时用于两处一是节点匹配判断当前观测是否曾经见过二是与语言全局向量拼接输入规划模块做决策。实际观察下来只用全局向量做匹配回环检测错误率大概高了三到五个点交叉注意力确实能抓住视觉上看起来不同但语义上属于同一位置的特征。2.2 在线拓扑构建环境图是怎么长出来的拓扑图是整个ETP-R1的空间记忆核心。这里说的拓扑不是静态SLAM建出来的高精度地图而是一个比较宽松的导航图。节点保存的是视觉特征、位姿和一段局部语义描述边保存的是两个节点之间的可行路径长度。在线构建流程是这样的智能体拿到当前视觉融合特征。与拓扑图里所有节点计算余弦相似度。如果最高相似度超过阈值我们通常取0.6判定为回到已知节点用当前位姿对节点做一次位姿修正。如果最高相似度低于阈值则创建新节点并把上一观测位置到当前位置的移动记录成一条边。每三十步运行一次小规模图优化把互相夹角的节点融合、把长时间未被访问且置信度很低的节点删除。关键点在于把这些步骤组合成演化逻辑。拓扑图不是一下子生成的而是随智能体的运动逐渐生长、合并、淘汰。一开始节点稀疏路径搜索可能找不到目标但随着探索加深图的连通性会快速提升。为什么说演化而不是增量构建因为我们引入了两个生物学化的机制节点若不经常被访问置信度会随时间衰减最终被淘汰如果两个节点位置靠近且视觉相似度高则合并成一个节点。这样地图既能自适应新环境又不会因为噪声观测无限膨胀。实际测试时有个坑相似度阈值设太高例如0.8会导致同一物理位置被反复创建成好几个节点图里出现大量冗余路径规划很容易选到绕路分支阈值设太低例如0.4则会把完全不同的房间误认为同一个位置造成拓扑污染。最终我们选择动态阈值——刚开局拓扑图为空阈值取0.7探索到200个节点后逐步下调到0.6让匹配更宽松。2.3 强化微调训练策略时不光看模仿也要看奖励ETP-R1的另一个核心是强化微调这个训练思路。常规做法是先做行为克隆BC也就是让模型模仿专家轨迹但纯BC有两个问题一是专家轨迹的分布覆盖不了所有状态模型一旦遇到没见过的状态就容易出错二是BC只是拟合动作并不直接优化更快到达目标这类最终目标。所以我们的训练分两阶段。第一阶段在专家轨迹集上跑行为克隆学到一个能初步执行指令的初步策略。第二阶段把这个初步策略作为初始参数在仿真环境里使用强化学习PPO做策略优化。这里的微调不是指只调神经网络最后几层而是指整个可训练参数的少量更新学习率比BC阶段降一个数量级仅训练少量轮数避免策略剧烈震荡导致视觉特征损坏。奖励函数设计上我们没有采用单一稀疏奖励而是组合了三部分到达终点奖励如果离目标点小于0.5米10分。每步时间惩罚每走一步-0.01促使策略用更短路径。进度奖励把当前智能体位置朝向终点方向的位移变化作为增量奖励每一步额外给0.05 × (当前距离上一时刻距离的减少值)。这个进度奖励对收敛帮助很大。纯稀疏奖励下PPO在一百步内基本学不出有效行为因为探索到终点的概率太低。加上进度奖励后策略很快学会往终点方向靠近。PPO的具体配置我们是这样做的GAE lambda取0.95clip范围0.2value function loss系数0.5训练batch size 512采样子批次64学习率2e-5。为了稳定训练每条轨迹结束后的奖励会做一次running normalization把平均奖励和方差归一化到接近标准正态分布这比手动调奖励权重见效快得多。2.4 规划与执行高层路径到低层动作的衔接很多初做VLN的人会把规划器和动作策略混在一起其实这两层必须分离。高层规划解决沿着拓扑图的哪个路径走低层策略解决怎么绕过眼前那把椅子走到下一个拓扑点。两层耦合太紧会导致指令在长走廊里来回震荡分成两层上层给方向性指引下层做反应式避障系统稳定性好很多。在ETP-R1中规划器工作方式如下拿到语言编码后先用一个预测头估算目标方位输出目标相对于当前朝向的角度分布。然后以当前位置为起点在拓扑图上运行Dijkstra选出一条通向目标方位附近节点的最短路径。路径中第一个转角点会作为当前子目标下发给低层策略。低层策略的结构是输入包括编码后的深度图、RGB融合特征、当前子目标方位、当前拓扑节点距离。经过一个小型transformer块输出离散动作。动作空间我们定义成7种前进0.25米、左转15度、右转15度、左转30度、右转30度、原地等待、停止。为什么用离散动作因为连续动作空间能精调但训练时探索效率低而且价值函数估计误差大离散动作在真实和仿真环境中都很容易映射执行调试也直白。训练完成后低层策略通过强化微调逐步学会朝子目标方向前进遇到障碍物进行短期绕开的微观行为。高层规划器则主要靠BC阶段学到的指令理解能力RL对它的参数更新幅度很小。这样做的结果是整个导航过程既有一个保持长程一致性的大脑又有一个能自适应局部地形的小脑。3. 实操全过程从环境搭建到训练完成3.1 环境与数据准备这套系统涉及仿真器、多模态模型和强化学习采样环境准备比通常的单模型训练要琐碎一些。数据处理环节我们做了三件事把指令文本做标准化统一大小写、归一化空格把带有数字的turn 45 degrees转成标准动作短语。对图像做裁剪和色彩归一化同时保留深度通道。收集专家轨迹时增加数据增强把指令中方位词作同义替换如左转换成向左拐图像加随机亮度扰动增强泛化能力。拓扑初始化为空每个场景独立建图。一局结束之后清空拓扑图再开始下一局避免不同场景的节点互相污染。3.2 模型参数与训练超参一览我给出一份我们实测下来比较稳定的参数配置可以直接作为起步值使用。配置项取值说明视觉编码器预训练ViT-L/14冻结前8层只微调后段语言编码器文本Transformer, hidden 512保留12层微调后6层跨模态融合头4层cross-attentionhidden 512全部训练拓扑图节点上限300超过后触发融合策略节点匹配阈值0.6~0.7动态调节节点数越多阈值越低动作空间7类离散动作前进0.25m转向等BC阶段epoch数30早停看验证成功率BC学习率5e-5AdamW线性warmupRL阶段总帧数800万大约8个PPO轮次RL学习率2e-5降到BC学习率的40%GAE lambda0.95优势估计平滑PPO clip0.2限制策略更新幅度奖励折扣gamma0.99长程导航需要较大折扣模型总参数量大概在2.6亿左右单卡训练显存占用约16G。批量并行采样需要四线程仿真器同时运行每线程一次采样长度512步这样数据吞吐差不多能满足训练不空闲。3.3 分阶段训练与效果验证训练过程完全按照先BC、再RL的路线走。BC阶段不需要探索直接把专家轨迹切成固定长度片段喂进模型。这里有个经验不要在BC阶段训练太多epoch否则策略对专家轨迹过拟合RL阶段的熵初始值过低策略探索能力大打折扣。我们是在验证集成功率连续3轮不提升时就早停而不是死磕训练集loss。RL阶段开始前把BC模型参数复制一份作为初始化同时把拓扑图和经验回放缓冲区清空。每个训练轮次分三步采样在仿真器中用当前策略跑若干条指令记录每一步的观测、动作、奖励、价值估计、动作概率。更新拓扑每条轨迹执行过程中在线维护拓扑图把新节点、新边写入中央经验缓冲区。学习从缓冲区采样小批量数据用PPO更新策略和价值网络。中间检查点的验证每两万个仿真步做一次。验证时不更新参数只统计不同场景的成功率和平均路径长度。我们记录了两个关键指标成功率SR和SPL成功率加路径长度惩罚的加权指标。RL阶段刚开始几轮SR可能反而小幅下降这是策略在探索的副作用不必惊慌继续训练到第五轮左右指标会回升并超过BC水平。3.4 训练调度与自动化评估工程上还做了一套简单的自动化评估脚本。每个评估周期读一次最新模型权重在固定的一批验证指令上跑5次随机种子取平均结果。这样做有三个好处一是减少单次评估波动带来的误判二是可以验证拓扑构建的稳定性因为随机种子会影响智能体的初始朝向三是能自动生成失败案例录像方便后续人工分析。我将训练脚本的核心循环逻辑简化成伪代码放在下面供参考整体调度结构。# 简化版训练主循环伪代码 model load_pretrained_multimodal() if cfg.phase bc: for epoch in range(30): batch sample_expert_trajectories(cfg.batch_size) loss bc_loss(model, batch) loss.backward() optimizer.step() if eval_success_stop_improving(): break elif cfg.phase rl: model.load_state_dict(save_best_bc_model) for step in range(total_steps): buffer rollout_episodes(cfg.simulators) update_topology_from_buffer(buffer) # 在线演化拓扑 ppo_update(model, buffer) # 策略和价值网络更新 if step % cfg.eval_interval 0: eval_and_log(model)最后补一句BC和RL切换时不要忘记切换优化器状态否则Adam的二阶梯度估计会带来自偶然的震荡。我们一开始直接沿用BC的优化器RL阶段前几百步loss波动特别剧烈清零优化器状态后马上恢复正常。4. 实验结果怎么看4.1 评价指标速查与选择建议拿到实验数据后怎么读指标、哪些指标更重要这是很多人容易忽略的。VLN最基础的指标是成功率SR也就是智能体最终停在目标点周围0.3米范围内的百分比。但光看成功率容易骗自己一个绕了十圈才到的路径和一条直达路径成功率都是100%效率完全不同。所以引入了SPL具体公式是最优路径长度/实际路径长度 × 成功率。SPL同时惩罚绕路和失败是个比SR更苛刻的综合指标。连续环境还多出两个变体指标记作cSR和cSPLc代表continuous。它们的区别是距离阈值从离散环境的3米收紧到连续环境的0.3米这更贴近真实定位精度。我们评估时以cSR为主、cSPL为辅原因是在连续环境中大致到了和精确到了差异很大离目标2米和0.5米对真实机器人来说体验完全不同。训练过程中我建议多盯SPL少单独盯SR。原因是SPL对路径长度敏感如果策略有绕路倾向SPL会立刻快速下降但SR可能还在缓慢上升。很多团队报告SR很高、部署后发现机器人非常笨拙就是因为忽略了SPL这类效率指标。4.2 横向对比ETP-R1与几种常见方案我们在同一个标准公开室内导航数据集上对比了几类主流方案方便看清楚不同技术路线之间的差距。为了避免给特定方案站台这里不点完整名用代号说明。方案代号技术路线cSRcSPLBaseline-A纯端到端BC41.232.6Baseline-BBC 离散建图导航53.845.1Baseline-CBC 预训练拓扑57.548.9Baseline-DBC RL无拓扑55.043.7ETP-R1BC 演化拓扑 RL微调61.353.8各方案在同一测试集上的对比结果ETP-R1在cSR和cSPL上均领先。特别值得注意的地方是Baseline-D这种只加RL不加拓扑的方案成功率反而不如Baseline-C这种只用拓扑不RL的方案。这说明了拓扑结构带来的空间记忆是RL难以替代的RL擅长优化怎么走但如果模型对曾到过哪、哪条路通完全没有概念奖励信号很难在长距离上传递。ETP-R1相比Baseline-C也就是有拓扑但不做强化微调的版本提升主要出现在长指令和跨房间指令上面。这归功于RL让低层策略学会了更高效地朝向子目标不再像BC版本那样频繁原地转圈或走弧线。4.3 消融实验哪些组件在起作用为了搞清楚每个模块对最终结果的贡献我们同时做了几组消融实验。结果比较有启发性按表格整理如下配置cSRcSPL拓扑平均规模ETP-R1完整版61.353.8142去掉RL微调58.050.1139去掉拓扑演化用固定图57.649.2155去掉进度奖励54.544.0138去掉节点淘汰机制59.851.7214从消融结果可以得出几个结论第一RL微调贡献大约3个点的成功率主要提升在路径效率第二动态阈值和淘汰机制让拓扑平均规模从214降到142同时没有显著损失成功率说明拓扑精简对规划稳定性很重要第三进度奖励的价值很大去掉后cSR掉了6.8个点而且是所有消融里影响最大的单个因素。需要提一句节点淘汰机制有一个副作用是偶尔会把关键入口节点过早删掉导致路径规划绕远。后来我们在淘汰逻辑上加了一个关键节点保护策略如果某节点的度数相连边数大于5则延迟三倍衰减周期再淘汰。这一小改动让cSPL进一步提高了1.1个点。5. 踩坑清单与排查实录5.1 拓扑更新最容易出错的三个点拓扑演化是ETP-R1最有特色的模块也是我们调试耗时最长的部分。我总结最常见的三个错误点第一回环检测阈值不随环境变化自适应。固定阈值会导致两种典型问题环境复杂时误匹配上升环境简单时节点冗余。解决方法是让阈值跟当前拓扑图平均节点相似度联动。相似度普遍偏低时阈值同步下降反之提高。相当于地图先保守建点再逐步合并。第二边权只用物理距离忽略了导航代价。物理距离相等不代表实际难走程度一致。比如两段同样两米的路一段是开阔走廊另一段堆满障碍物对低层策略来说后者可能要多花五倍时间。如果边权只用位移标定规划器会频繁选择穿过障碍区失败率极高。我们在边权上引入了实际执行时间作为校正项效果立竿见影。第三拓扑更新和策略学习不同步。RL训练会采样大量轨迹拓扑缓冲区也在同步更新如果拓扑更新频率低策略学到的状态空间分布就滞后于地图变化导致动作策略跟当前拓扑节点不匹配。我们将拓扑更新的频率从每1000步一次调整到每个rollout片段结束就更新问题随之缓解。5.2 奖励设计的隐性坑奖励设计是整个系统中最容易跑飞的一个环节。有几个隐性坑非常难排查。一个是终点距离阈值跟评价指标不一致。训练时如果到目标2米以内就算成功给奖励但评测时严格按0.3米判定策略会学到停在附近就算赢到了离目标2米的地方就提前停止cSR非常难看。后来我们把训练奖励里的成功判定也收紧到0.3米虽然早期训练成功样本减少收敛变慢但最终效果反而更好。另一个是进度奖励被原地转圈刷爆。进度奖励定义为离目标距离差的增益理论上模型每步接近目标才能拿奖励。但有一类行为可以骗过这个信号策略通过旋转改变朝向让预测位移少算从而拿到虚假进度奖励。解决办法是给进度奖励加一个增益绝对值上限单步不超过0.2并且只计算实际向前运动产生的位移增益。还有一种是奖励权重失调导致的路径抖动。实际上把时间和进度奖励权重调得太高策略会尽量在小范围快速移动出现高频抖动。这时SR反而下降。我的经验是奖励权重宁可比理论值偏小不要让某个单项主导整体梯度。5.3 训练不收敛与过拟合的判断训练中容易遇到两类问题疑难杂症主要在RL阶段。如果RL阶段loss曲线一路下降但cSR不变先检查优势估计。GAE的lambda取值过大时价值估计方差高容易让策略陷入局部震荡。这时候把lambda从0.95降到0.9同时增大clip从0.2到0.3通常能缓解。如果还是不行回滚到最近一次cSR提升的检查点降低学习率再继续。过拟合的信号往往不是训练集loss下降而是验证集cSR在某一轮后开始掉头向下。这种情况在BC阶段特别典型。有效手段是在BC阶段加dropout虽然推理时降噪会损失零点几个点但整体泛化收益更高。数据层面把指令中的方位词做同义替换、随机交换临近短语也可以显著提升指令理解在新场景中的鲁棒性。另外一个很难注意到但是非常常见的问题是价值估计器的输入范围不统一。拓扑距离的取值范围可能从0.5米到几十米直接喂进value网络会让梯度更新受大数值样本主导。我们做了一层值域缩放到[0,1]的预处理价值函数的收敛速度提升了不少。5.4 工程化细节与提速技巧最后聊几个工程化经验。VLN强化学习训练的计算量比较大尤其是连续环境仿真器推进速度往往比模型推理慢得多。我们当时处理了几个瓶颈采样端尽量用多进程仿真器而不是线程因为仿真器的物理引擎大多不是完全线程安全的。每进程独立维护拓扑图训练主线程只汇总学习用的通用数据。拓扑更新放在子进程本地做避免频繁跨进程传输图数据。模型端把视觉编码器的权重在BC阶段结束之后固化下来RL阶段只训练融合头、规划头、价值头不反传视觉骨干。这样单帧推理速度从52毫秒降到27毫秒而且效果几乎不受影响。数据端经验回放缓冲区不要存储完整图像存预提取的特征向量和深度降采样图显存占用直接降为原来的四分之一。视觉特征在每次rollout时实时提取存入回放训练时直接取用。这条经验让我们的多场景并行采样成本大大降低。最后再分享一个调参小技巧每个新实验在开始大规模训练前先跑五百步小额预算画出奖励曲线和价值曲线观察是否有明显上升趋势。如果五百步内奖励完全没有上升趋势大概率是奖励设计或任务设定有问题不值得投入完整训练时间。这个做法帮助我们省下了至少三次大训练轮次。回过头来看ETP-R1这套方案最让我满意的地方并不是某一个模块有多先进而是拓扑演化、强化微调和连续环境执行这几件事最终形成了一个正循环。拓扑给RL提供了稳定的空间抽象RL则让规划出的路径能够被低层策略更好地执行两者缺一不可。后续我们计划把这个系统扩展到多机器人协同导航场景让每个机器人共享语义拓扑并且在模型层面加入更细粒度的指令-路径对齐预测。如果你正在做类似的VLN项目建议从拓扑结构入手先把空间记忆做好再上强化微调这条路比一味堆参数要实在得多。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑