拓冰建站拓冰建站
首页 / 资讯中心 / 正文

R^3:用强化学习训练机器人自然语言推理与动作策略

机器人策略如果只会输出动作遇到失败时很难定位问题也无法把经验翻译给上层任务规划器。R^3Training Robots to Reason in Natural Language via Reinforcement Learning这条研究思路把“自然语言推理”直接放进机器人策略里模型在输出动作之前先生成一段解释当前决策的文本再用强化学习把推理和动作作为同一段 token 序列一起训练。换句话说推理不是事后注释而是策略的一部分训练目标也不是模仿人类写的推理而是让推理真实帮助任务成功。这篇文章会围绕 R^3 的训练机制展开先解释为什么“用强化学习训练机器人推理”比“用监督数据教推理”更合理再给出一个最小可运行的 R^3 风格训练示例最后落到评估方法、常见排错和生产化建议。适合正在做 VLA视觉语言动作模型、机器人操作策略、或者想给决策模型增加可解释性的研究者与工程师。1. 为什么机器人推理要选择强化学习而不是纯监督1.1 让模型先说话再动手解决的不只是可解释性很多机器人策略模型只输出动作比如抓取坐标、关节角度或者一段结构化指令。这种模型的优点是执行直接缺点是遇到失败时只能回放传感器数据很难回答“模型当时为什么这么选”。如果模型能在动作前输出一段自然语言推理比如“目标物体是红色杯子当前夹爪高度偏高需要先下压再合拢”那么调试者、上层规划器甚至用户都能更快理解模型行为。自然语言推理还能承担更多职责在不同任务描述之间传递经验、在长期任务中作为中间记忆、让模型学会把复杂指令拆成子目标。R^3 的定位正是把“推理”做成策略内部的中间产物并让这个中间产物经受任务结果的检验。1.2 监督微调能教推理但教不出“有用”的推理用人类专家标注的推理样本来做监督微调是让模型“学会说推理”的最直接方式。示例数据长这样观测: 桌面有一个红色杯子 推理: 杯子在桌子边缘应该从正上方抓取 动作: pick(cup, approachtop)这种方式的问题不在数据量而在于三个深层矛盾第一人类推理不等于最优推理。人类在真实环境中会有大量冗余、猜测甚至错误的中间判断把它们当作监督信号的唯一来源模型学到的往往是“像人的推理”不是“对任务有用的推理”。第二推理和动作的关联没有被奖励约束。监督学习只要求输出文本接近标注并不要求“因为说了这句话动作成功率变高”。模型完全可以学会一段流畅但和动作没有因果关系的推理。第三数据覆盖有限。真实机器人的状态空间巨大人类很难预先为每一种失败模式和中间状态写推理。R^3 的出发点正在这里与其让人去写推理不如让任务结果来“筛选”推理。1.3 R^3 的核心主张推理是动作的扩展R^3 把一次决策看成完整 token 序列观测文本、推理文本、动作文本被拼接在一起由同一个策略模型生成。任务最终是否成功作为强化学习的奖励信号通过策略梯度反向传播到包括推理 token 在内的所有位置。这样得到的效果是模型在训练初期可能会输出没有意义的推理但那些碰巧让任务成功的推理模式会被保留并且逐步演化成稳定、简洁、可执行的推理策略。推理不再依赖人工标注而是从环境反馈中“长”出来。需要说明的是这条思路并不否定人类先验的作用。提示模板、动作格式、奖励函数里的约束都是先验只是不再要求人类逐句提供推理文本。2. 核心机制推理、动作与奖励如何组织成一次更新2.1 输出序列的结构一次决策生成的文本可以约定为三段[系统提示] [指令和观测] reason 这里写中间推理比如对物体位置、夹爪状态、下一步意图的分析 /reason action pick(cup, pos(0.3, 0.5, 0.1)) /action三段合起来才是一条完整样本。模型采样时推理段和动作段都参与生成也都参与 loss 计算。提示部分只用于构造上下文计算 log-prob 时需要把提示 token 的贡献 mask 掉避免无关 token 被提升概率。实现上常见做法是分两次生成先生成推理段遇到/reason后停止再把推理段拼回输入继续生成动作段遇到/action后停止。两次生成的序列拼接起来作为本次决策的完整轨迹。2.2 奖励信号的主次之分奖励设计是这套方法里最容易失控的部分。一个稳妥的分配方式如下主奖励任务是否成功。成功给 1失败给 0这是最稀疏也最可靠的信号。过程奖励每个动作是否解析成功、是否产生有效交互可以给很小的正负奖励帮助模型尽快学会动作格式。惩罚项动作越界、碰撞、步数超限等可以给负奖励但幅度不要压过主奖励。推理质量不建议直接用“语言流畅度”或“推理和动作一致性”作为强奖励否则模型会钻空子生成流畅但与任务无关的文本。推理质量更适合放在评估阶段用人工或大模型打分而不是放进训练奖励里。训练阶段用任务结果约束推理才能保证推理是“有用”的。2.3 为什么策略梯度能训练自然语言推理强化学习里策略梯度更新公式对生成任务同样适用。模型生成一条完整序列环境给出奖励然后计算这条序列中每个 token 的对数概率与优势值的乘积更新参数。关键在于推理 token、动作 token 和观测 token 在序列中是连续存在的。策略梯度不需要知道哪段文本“重要”或“正确”它只知道这条序列最终取得了比平均水平更好的结果。于是整条序列里的 token 概率都会上升其中就包括推理部分。这也解释了为什么不能用普通的 supervised loss 替代监督 loss 把“标注文本”当标准答案策略梯度把“高回报轨迹”当标准答案。前者要求你知道正确答案后者只要求你能判断结果好坏。机器人任务里结果好坏通常比正确答案更容易获得。3. 最小可运行的 R^3 风格训练示例下面给出一个说明性框架用于展示 R^3 风格训练的主干逻辑。它不是一个完整论文复现实际项目需要根据模型、环境、动作空间做调整。3.1 环境与依赖推荐环境如下依赖用途说明Python 3.10运行环境部分 RL 库对 Python 版本有要求PyTorch 2.x模型训练需要支持 bfloat16 和自动混合精度transformers加载语言模型也可以换成 vLLM 做推理加速vLLMrollout 采样加速模型较大时强烈建议gymnasium环境抽象封装仿真环境peftLoRA 微调控制显存占用便于快速迭代wandb / tensorboard日志记录 reward、parse rate、loss如果显卡显存有限建议对整个策略模型使用 LoRA 或 QLoRA。推理和动作都在同一个模型上生成训练时只更新低秩适配器能大幅降低显存压力。3.2 任务设计与提示模板为了演示使用一个简化桌面操作任务给定一张俯视图和一句指令“把红色方块移到蓝色区域”模型先输出推理再输出动作move(x, y)。# prompt.py SYSTEM_PROMPT 你是一个桌面操作机器人。 请先分析当前状态再输出一个动作。 动作格式必须严格为: move(x, y) x 和 y 是 0 到 1 之间的浮点数。 def build_prompt(instruction, obs_text): return ( SYSTEM_PROMPT f\n指令: {instruction}\n f观测: {obs_text}\n reason\n )这里把reason写在提示末尾让模型在推理段内续写。动作段由代码在推理结束后拼接。3.3 策略封装与采样# policy.py import torch import torch.nn as nn from transformers import AutoModelForCausalLM, AutoTokenizer class ReasoningPolicy(nn.Module): def __init__(self, model_name, reasoning_budget48, action_budget20): super().__init__() self.tokenizer AutoTokenizer.from_pretrained(model_name) self.model AutoModelForCausalLM.from_pretrained( model_name, torch_dtypetorch.bfloat16, device_mapauto ) self.tokenizer.pad_token self.tokenizer.eos_token self.reasoning_budget reasoning_budget self.action_budget action_budget def generate_sequence(self, instruction, obs_text, temperature0.8): prompt build_prompt(instruction, obs_text) reason_inputs self.tokenizer( prompt, return_tensorspt ).to(self.model.device) # 采样推理段遇到 /reason 停止 reason_output self.model.generate( **reason_inputs, max_new_tokensself.reasoning_budget, do_sampleTrue, temperaturetemperature, eos_token_idself.tokenizer.convert_tokens_to_ids(/reason), ) # 拼接动作引导 action_prefix \naction\n action_prefix_ids self.tokenizer( action_prefix, return_tensorspt ).input_ids.to(self.model.device) full_input_ids torch.cat( [reason_output, action_prefix_ids], dim1 ) # 采样动作段遇到 /action 停止 action_output self.model.generate( full_input_ids, max_new_tokensself.action_budget, do_sampleTrue, temperaturetemperature, eos_token_idself.tokenizer.convert_tokens_to_ids(/action), ) return action_output[0]关键点推理段和动作段通过不同的停止 token 分开保证动作格式可解析。采样温度要适中。温度太低输出不够多样策略梯度更新效率下降温度太高动作格式容易乱。生成时关闭梯度训练时才重新计算 log-prob这是 rollout 和 update 分离的标准做法。3.4 PPO 训练主循环# train_loop.py 示意 for iteration in range(total_iterations): buffer [] for _ in range(rollout_batch_size): instruction, obs_text, env_state sample_task() seq_ids policy.generate_sequence(instruction, obs_text) action_text parse_action(seq_ids) # 只取动作段 reward, done compute_task_result(action_text, env_state) buffer.append((seq_ids, reward, done)) # 计算优势使用简单归一化 rewards torch.tensor([b[1] for b in buffer], dtypetorch.float32) advantages (rewards - rewards.mean()) / (rewards.std() 1e-8) # 更新策略 for _ in range(ppo_epochs): for seq_ids, advantage in zip(buffer, advantages): logp_new policy.compute_logprob(seq_ids) ratio (logp_new - logp_old[seq_id]).exp() pg_loss -torch.min( ratio * advantage, ratio.clamp(1 - clip_ratio, 1 clip_ratio) * advantage, ).mean() loss pg_loss kl_coef * policy.kl_with_reference(seq_ids) loss.backward() optimizer.step()这里省略了compute_logprob、kl_with_reference、样本存储等细节但它们对训练稳定性同样重要。必须注意buffer 里要保存旧策略的 log-prob否则无法计算 importance ratio。提示 token 对应的 log-prob 必须 mask 掉否则模型会通过提高“观测文本”的概率来作弊。参考模型用于计算 KL 惩罚防止新策略偏离初始模型太远。这是抑制 reward hacking 的最有效手段之一。4. 关键参数和实现细节决定实验成败4.1 生成参数速查参数推荐值调大的影响调小的影响temperature0.7 ~ 1.0探索更强动作解析失败率升高输出更稳定但 RL 探索不足top_p0.9 ~ 1.0增加多样性降低多样性容易收敛到局部最优reasoning_budget32 ~ 128推理更充分但 rollout 变慢推理容易被截断信息不足action_budget16 ~ 32可表达更复杂动作但难解析解析率高但动作空间受限entropy_coef0.001 ~ 0.01保持探索防止崩溃过小容易过早收敛kl_coef0.01 ~ 0.2越稳但学习越慢容易偏离参考模型产生乱码推理clip_ratio0.2更新更平滑更新激进容易震荡4.2 损失掩码与 KL 惩罚RLHF 和 R^3 风格训练的代码里最容易出错的是 mask。完整序列包含四类 token系统提示与观测 token不参与 loss。推理 token参与 loss也应该被策略梯度影响。动作 token参与 loss。特殊标记如reason、/reason可以参与也可以不参与建议参与否则模型可能根本不输出这些标记。KL 惩罚建议用参考模型对“推理 动作”段计算而不是对整段含提示的序列计算否则会把大量梯度花在固定文本上。4.3 推理预算为什么不能无限生成推理预算指每步最多生成多少推理 token。把预算设成无限会让模型学会用超长文本拖时间环境仿真速度也会被文本生成拖慢。更关键的是长推理增加探索空间但每一步的长尾 token 回报稀疏训练效率会下降。实际项目推荐的做法是先用一个较小的预算跑通流程比如 48 token再逐步增大观察效果。训练成熟后可以在推理段末尾加入“总结”要求让模型在动作前输出一个精简判断提高后续可解释性。5. 验证与评估怎么证明模型真的在推理训练曲线上升只说明“动作成功率高了”不能说明“推理起作用了”。要回答这个问题需要一套组合评估。5.1 指标清单指标含义建议阈值task success任务成功率主指标越高越好action parse rate动作能否被解析器解析通常应高于 95%reasoning length每步推理 token 数应收敛到合理区间避免无限膨胀reasoning-action alignment推理与动作是否一致抽样人工打分或 LLM 打分generalization未见过物体、指令、布局上的成功率与训练集成功率差距不应过大5.2 三组对照实验第一组是去掉推理。让模型直接生成动作其他设置不变对比成功率。如果推理版本明显更好说明推理对决策有贡献如果差距很小说明推理只是“附属品”。第二组是固定随机推理。把推理段固定成一段随机文本动作仍由模型正常生成。如果成功率明显下降说明模型把推理内容真正用于动作决策而不是忽略推理文本。第三组是干预推理。在 rollout 时把模型生成的推理替换成相反的描述比如把“目标在右侧”改成“目标在左侧”查看动作是否发生变化。如果动作不变说明推理文本没有进入动作的条件依赖模型只是在“自言自语”。5.3 训练过程的定性观察除了数值指标建议定期保存中间 rollout 样本。重点看三个时间段训练初期、成功率快速上升期、收敛期。成功率上升时推理文本应当出现明显变化比如从“颜色是红色”变成“红色方块在右下角偏移为 0.2”。如果成功率上升但推理文本始终没变就要怀疑模型是否绕过了推理路径。6. 常见问题与排查链路6.1 六类典型问题问题现象常见原因检查方式处理建议推理变成乱码或重复短语KL 惩罚太小策略偏离初始模型奖励梯度压过语言能力查看 KL 曲线和生成样本增大 kl_coef限制推理预算加 repetition penalty动作解析失败率居高不下采样温度过高、动作格式过复杂、未对动作段做约束解码统计 parse error 类型降低 temperature简化动作格式增加格式惩罚成功率突然下降reward hacking模型找到仿真器漏洞对比最近 checkpoint 的成功率与人为规则复现情况清理奖励函数换一个更严格的验证环境loss 出现尖峰advantage 未归一化、batch 里有极端奖励打印 advantage 分布做 advantage 归一化清理异常样本rollout 太慢vLLM 未启用、推理预算过大、单进程采样观察单步生成耗时接入 vLLM多进程并行压缩推理预算实验无法复现未固定 seed、采样随机、环境版本不一致检查设备、库版本、seed 日志固定全局 seed记录依赖版本和模型 commit6.2 从现象倒推根因的排查顺序遇到问题时按下面的顺序排查比直接改代码更高效输入是否正确指令文本、观测文本是否拼接错位。输出格式是否合法推理段是否生成、动作段是否被截断。环境状态是否正确复位每个 episode 是否独立奖励是否泄漏了上一轮信息。奖励数值范围是否合理奖励被稀疏 0/1 主导时过程奖励容易掩盖主信号。梯度是否只作用于目标 token检查 mask 是否把提示 token 也算进 loss。日志里有没有明确的异常NaN、CUDA OOM、tokenizer 警告都要优先处理。这条链路覆盖了 R^3 风格训练里 80% 以上“看起来像算法问题实际上是实现问题”的情况。7. 最佳实践、工程约束与后续扩展7.1 训练可复现性日志、种子与框架R^3 这类“生成式智能体 RL”实验的复现难度往往大于普通监督学习。原因包括生成采样随机性、模型并行时的随机性、仿真环境的非确定性。建议从一开始就记录下来完整超参数、随机种子、数据集切分版本、模型权重的 commit hash、环境版本、采样温度。每个迭代都保存 rollout 样本和策略 checkpoint方便回滚到“能够正常复现旧结果”的时间点。社区里已经出现面向智能体 RL 的统一复现框架例如 ARLArena 这类工具它把环境封装、rollout 采样、优势估计、训练器拆成独立模块目标是让类似 R^3 的训练流程更容易稳定复现。实现这套思路时可以参考这种模块划分先保证环境与训练解耦再加入自己的奖励和提示模板。7.2 从学习环境走向部署环境下表归纳了学习环境与生产环境的主要差异维度学习/仿真环境生产/真机环境状态来源仿真器直接给出相机、里程计、力传感器融合奖励来源仿真器判定成功需要额外设计检测器或人工确认延迟要求宽松推理必须在决策周期内完成安全约束低必须加动作限幅、碰撞检测模型要求单机可跑需要推理服务、降级策略监控训练曲线需要结构化日志、告警和回滚方案从仿真迁移到真机时至少先处理四件事一是固化推理预算避免模型在真机上生成不可控文本二是增加动作解析的兜底逻辑解析失败就执行安全动作而不是报错三是对奖励函数做一次“仿真器漏洞审计”确保训练时没有依赖仿真器特有信息四是保留一个纯规则策略作对照一旦 RL 策略失败可以立即切换。7.3 多智能体与模型融合方向R^3 的单智能体框架向多智能体扩展时推理可以承担协调功能机器人 A 在推理里描述自己将要占据的路径机器人 B 参考这段文本调整动作。但多智能体环境下的奖励分配更困难一个智能体的失败会拖垮整条轨迹的回报分配。如果走上这条路一个值得对照的技术是 Bayesian Action Decoder for Deep Multi-Agent Reinforcement Learning。它把每个智能体动作选择的不确定性显式建模通过贝叶斯推断来采样动作。R^3 风格的方法更关注“推理文本 动作文本”的联合生成两者可以结合推理文本负责高层协调贝叶斯动作解码器负责底层动作采样从而同时获得可解释性和动作稳定性。7.4 给新手的落地建议不要一开始就追求大型仿真器或复杂任务。先做一个能表达“推理 动作”的最小环境比如表格中的桌面搬运任务跑通 PPO 更新、格式解析和成功率评估这三件事再逐步加入视觉输入、长指令和真机部署。训练过程中最重要的一个判断标准是如果去掉推理成功率没有明显变化那说明推理还没有真正成为策略的一部分。此时优先检查输出序列的依赖关系、mask 和干预实验而不是继续加大模型容量。只有对“推理如何影响动作”这个因果链路有了把握R^3 的思路才会在更复杂的机器人任务里产生真正的价值。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门