ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Agent AI与Agent Transformer:具身动作预测及跨现实训练

Agent AI与Agent Transformer:具身动作预测及跨现实训练

简介:围绕 Agent AI 多模态交互主题的综述性 PDF 文档,面向人工智能、多模态学习、具身智能与智能体方向的研究者、研究生及工程实践者,帮助读者系统理解智能代理如何借助基础模型在物理与虚拟环境中感知、行动并推进通用人工智能探索。压缩包内共 1 个 PDF 文件,大小约 50.96MB,内容为完整综述论文,便于集中阅读与归档。该文档由斯坦福、微软研究院等机构研究者合作完成,作者团队包括李飞飞,围绕 Agent AI 的定义、系统组成、跨现实训练框架、多模态感知与行动、生成式 AI 与多源数据利用等展开,涉及用户行为、环境物体、音频表达与场景情感等感知维度,并讨论数据融合、模型泛化、高效训练等挑战及未来方向。目前已有 424 人学习,适合需要快速建立领域全景、梳理关键概念与研究线索,或从计算机视觉、自然语言处理、人机交互与机器人学等交叉视角理解智能代理系统的读者参考。

1. 从「会说话」到「会动手」:Agent AI 到底多加了哪一层

给一个多模态模型接上摄像头和机械臂,它不会自动变成智能体。真正把「能对话」和「能干活」区分开的不是参数量,而是它输出的「下一个具身动作」能不能在环境里被验证——动作执行完,世界状态变了,模型得为这个变化负责。人工智能过去几年的进展集中在被动任务上:给定输入,产出答案;Agent AI 把这条链路反过来,要求系统感知视觉刺激、语言输入和其他环境数据,再产出有意义的具身动作,并靠外部知识、多感官输入和人类反馈持续修正。这个定义看着温和,落地时却要回答一堆硬问题:动作空间怎么表示、幻觉在物理世界里怎么暴露、一套在虚拟环境里训出来的策略凭什么搬到现实。这份上百页的综述把这些硬问题摊开成了一张地图,后面几章就沿着地图上的几条主干道拆。

2. 具身动作预测:为什么「下一帧」比「下一词」难那么多

语言模型的成功很容易让人产生一种错觉:既然下一个词能预测,下一个动作照着来一遍就行。真动手会发现两者根本不是同一个问题。词表是固定的、标签是稠密的、错了还能撤回重说;动作是连续量加离散模式的混合、观测是部分可观测的、执行完就覆水难收。综述把「基于下一具身动作预测来改进智能体」作为核心命题,这句话的分量在于:它把训练目标从「生成合理的文本」换成了「生成在环境中可执行、可验证、可承担后果的动作」。

2.1 从 next token 到 next embodied action:目标函数的形状变了

先看语言模型的一步。词表是有限集合,每个位置都有监督信号,损失函数是标准的交叉熵,梯度稠密且即时。模型说错一个词,下一句还能找补回来,用户感知到的只是「这句话有点怪」。

具身动作完全是另一种形状。一个机械臂的动作可能是七维连续向量加一个夹爪开合的二值决策;一个游戏 NPC 的动作是离散指令集合;一个 GUI 智能体的动作是「点击坐标 + 输入文本」这种异构结构。监督信号来自人类示教轨迹、交互日志或者稀疏的回合奖励,中间过程大量无标签。更麻烦的是部分可观测:摄像头看不到柜子后面,智能体只能靠历史推断。

import torch import torch.nn.functional as F def lm_step(logits, target_ids): # 语言模型:固定词表上的分类,每个位置都有标签,监督稠密 return F.cross_entropy(logits.view(-1, logits.size(-1)), target_ids.view(-1)) def embodied_step(policy_out, action_spec, demo_action=None, reward=None): """ policy_out: 策略头输出,包含连续分量 mu/sigma 与离散分量 logits action_spec: 动作空间描述,含维度、上下界、离散模式列表 demo_action: 人类示教动作,可能为 None(纯 RL 场景) reward: 回合级回报,通常稀疏且延迟 """ loss = 0.0 # 连续分量:用高斯负对数似然,方差由策略自己学,避免固定尺度 if demo_action is not None: cont_loss = -torch.distributions.Normal( policy_out["mu"], policy_out["sigma"] ).log_prob(demo_action["cont"]).sum(dim=-1).mean() loss = loss + cont_loss # 离散分量:只在动作模式上做分类,模式数与具身形态强相关 loss = loss + F.cross_entropy(policy_out["mode_logits"], demo_action["mode"]) if reward is not None: # 稀疏回报通过策略梯度回传,需要基线做方差缩减 logp = policy_out["logp"] loss = loss - (reward - policy_out["baseline"]) * logp return loss

这段代码里最值得看的是action_spec这个参数的存在。它意味着策略网络不是凭空输出一个向量,而是必须知道当前具身形态的动作边界——关节能不能反折、速度上限多少、离散模式有几个。综述里反复强调「在 grounded 环境中训练」,落到底层就是这类约束必须显式建模,而不是指望模型从数据里猜。

sigma由策略自己学也值得说一句。固定方差等于人为设定探索尺度,在精细操作任务里会直接导致策略学不会小幅修正;让方差可学,等价于让模型自己决定「这个关节该有多大把握」。这是具身策略和语言模型解码策略的一个关键差异。

2.2 感知—记忆—规划—动作的时序闭环

单步动作预测只是零件,真正跑起来的是一个多频率嵌套的循环。视觉观测可能 30 帧每秒,语言指令只在开头出现一次,规划器几秒才更新一次子目标,动作控制器则以更高频率输出。这些模块的频率不匹配,是很多系统在演示里流畅、上线后卡顿的根源。

综述里对智能体系统的拆解基本遵循「感知—上下文记忆—规划—动作—环境反馈」这条链。感知模块把多模态输入压成紧凑表示;记忆模块负责短期上下文和长期经验检索;规划模块做任务分解,把「收拾桌子」拆成「拿起杯子」「放进水槽」;动作模块把子目标翻译成具体控制量;环境返回新观测,闭环重来。

class AgentLoop: def __init__(self, perceiver, memory, planner, actor, env, max_steps=200): self.perceiver, self.memory = perceiver, memory self.planner, self.actor, self.env = planner, actor, env self.max_steps = max_steps def run(self, instruction): obs = self.env.reset() self.memory.write({"role": "instruction", "content": instruction}) for step in range(self.max_steps): # 1) 感知:多模态观测压成状态向量,保留原始帧用于回溯 state = self.perceiver.encode(obs) self.memory.write({"role": "observation", "content": state}) # 2) 规划:不是每步都调用,按子目标是否完成触发,省算力也降抖动 if self.memory.subgoal_done() or step == 0: subgoal = self.planner.decide( instruction=instruction, recent=self.memory.recent(k=8), retrieved=self.memory.retrieve(state, top_k=3), ) self.memory.set_subgoal(subgoal) # 3) 动作:以子目标为条件解码,输出带置信度的动作 action, conf = self.actor.act(state, self.memory.subgoal) # 4) 低置信度时先探再动,避免把错误动作执行成不可逆后果 if conf < 0.4: action = self.actor.probe(state) obs, reward, done, info = self.env.step(action) self.memory.write({"role": "action", "content": action, "reward": reward}) if done: break return self.memory.trajectory()

memory.recent(k=8)和retrieve(top_k=3)这两个参数是刻意分开的。近期窗口保证时序连贯,检索保证能捞到很久以前的相似经验;只做其中一个,要么上下文被早期观测淹没,要么丢掉刚刚发生的因果链。conf < 0.4的探针分支也是血泪经验:在不可逆环境里,低置信度硬执行一次的代价,往往比多花三步试探高得多。

2.3 外部知识、多感官输入与人类反馈怎么进目标函数

综述把「结合外部知识、多感官输入和人类反馈来改进智能体」列为 Agent AI 的关键特征。这三类信号进入系统的方式完全不同,混为一谈是常见误读。

外部知识主要进输入侧。检索到的场景图、物体属性表、工具说明书,被拼进规划器的上下文,让模型不必靠参数记忆去猜「这个开关一般往哪边拧」。多感官输入进的是编码侧,音频、触觉、本体感受被投影到与视觉语言同一空间,否则规划器看到的是几路互不相干的向量。人类反馈则同时出现在三处:作为示教轨迹进监督损失、作为偏好对进排序损失、作为在线纠正进交互日志。

def total_loss(batch, model, w_bc=1.0, w_pref=0.5, w_ground=0.2): # 行为克隆:人类示教轨迹,提供稠密但有限的监督 bc = embodied_step(model(batch["obs"]), batch["spec"], demo_action=batch["demo"]) # 偏好损失:人类对两条轨迹的排序,用 Bradley-Terry 形式,抗噪声能力强 s_w = model.score(batch["obs"], batch["traj_win"]) s_l = model.score(batch["obs"], batch["traj_lose"]) pref = -torch.log(torch.sigmoid(s_w - s_l)).mean() # 接地损失:动作前必须能指向观测中的实体,压住语言先验导致的幻觉 ground = F.binary_cross_entropy_with_logits( model.ground_logits(batch["obs"]), batch["entity_mask"] ) return w_bc * bc + w_pref * pref + w_ground * ground

三个权重不是调参玄学,它们对应三种失效模式:w_bc太小策略学不到基本动作分布,w_pref太小行为粗鲁不符合人类预期,w_ground太小模型会一边说着「拿起红色杯子」一边把手伸向蓝色杯子。综述里把幻觉列为 Agent AI 要解决的核心问题之一,本质就是接地损失缺位时语言先验压过视觉证据。

提示:接地损失的标签不一定要人工标。用现成的检测或分割模型对观测做一次前向,得到实体掩码,就能构造弱监督,成本远低于逐帧标注。

3. Agent Transformer:把模型、环境、动作空间焊进同一个接口

如果说第 2 章讲的是「预测什么」,这一章讲的是「用什么结构去预测」。综述提出了 Agent Transformer 这个概念,字面上像是又一个模型架构,实际上它更像一份接口契约:把基础模型、环境状态、动作空间和记忆统一到同一个可训练的容器里,让不同来源的能力能够拼装。

3.1 基础模型当积木:语言、视觉、动作各管一段

现有系统的通行做法是拿预训练模型当积木,而不是从零训一个全能模型。语言模型负责符号层面的规划、常识推理和指令解析;视觉语言模型负责把像素落到可指称的实体和关系上;动作头负责把意图翻译成具体控制量。三者之间靠一个共享的中间表示衔接。

为什么不干脆训一个端到端的大一统模型?成本结构决定的。语言和视觉的预训练数据是海量的、公开的,动作数据是昂贵的、私有的、和具体具身形态强绑定的。把动作能力塞进预训练阶段,等于用最贵的数据去影响最需要泛化的部分,性价比极低。综述里强调「利用现有基础模型作为构建具身智能体的基本模块」,说的就是这个取舍。

分工带来的代价是接口处的语义损耗。规划器输出「把杯子放到盘子左边」,动作头需要知道「左边」在当前视角下对应哪个坐标,视觉模块需要确认哪个是杯子哪个是盘子。这三者任何一环含糊,动作就会执行成另一个意思。Agent Transformer 的价值在于把这个接口显式化、可训练化,而不是靠 prompt 里的自然语言硬粘。

3.2 Agent Transformer 的定义与创建流程

从实现角度看,Agent Transformer 至少要包含四个组件:多模态观测编码器、记忆、规划头、动作头。编码器把视觉、语言、本体状态投影到统一维度;记忆提供跨时间步的上下文;规划头输出子目标或推理链;动作头输出动作分布。训练时三部分可以联合优化,也可以分阶段解冻。

import torch.nn as nn class AgentTransformer(nn.Module): def __init__(self, vis_encoder, text_encoder, d_model=1024, n_modes=8, cont_dim=7, mem_slots=64): super().__init__() # 视觉与语言编码器来自预训练权重,初期冻结,只训投影层 self.vis_encoder, self.text_encoder = vis_encoder, text_encoder self.vis_proj = nn.Linear(vis_encoder.out_dim, d_model) self.txt_proj = nn.Linear(text_encoder.out_dim, d_model) # 本体状态(关节角、速度、末端位姿)单独投影,不和视觉混在一起 self.state_proj = nn.Linear(32, d_model) # 记忆:可学习的槽位,配合注意力做读写,槽位数决定长期记忆容量 self.mem = nn.Parameter(torch.zeros(mem_slots, d_model)) self.fuse = nn.TransformerEncoderLayer(d_model, nhead=16, batch_first=True) # 双头输出:离散动作模式 + 连续控制量,模式数与具身形态相关 self.mode_head = nn.Linear(d_model, n_modes) self.cont_head = nn.Linear(d_model, cont_dim * 2) # mu 与 log_sigma def forward(self, frames, instruction, proprio, entity_mask=None): v = self.vis_proj(self.vis_encoder(frames)) # [B, T, D] t = self.txt_proj(self.text_encoder(instruction)) # [B, L, D] s = self.state_proj(proprio).unsqueeze(1) # [B, 1, D] mem = self.mem.unsqueeze(0).expand(v.size(0), -1, -1) # [B, M, D] x = torch.cat([mem, t, v, s], dim=1) h = self.fuse(x)[:, :mem.size(1)] # 只取记忆槽做决策 mode_logits = self.mode_head(h.mean(dim=1)) mu, log_sigma = self.cont_head(h.mean(dim=1)).chunk(2, dim=-1) return {"mode_logits": mode_logits, "mu": mu, "sigma": log_sigma.exp()}

mem_slots=64这个参数值得单独说。槽位太少,长程任务里早期关键信息会被挤掉;槽位太多,注意力被稀释,模型倾向于只看最近几步。综述在讨论持续学习时提到记忆压缩的必要性,落到实现上就是这类超参的权衡。cont_dim=7对应典型的七自由度机械臂,换成别的具身形态要重设,这也是为什么动作头通常不共享权重。

log_sigma用对数参数化而不是直接输出方差,是为了数值稳定:方差必须为正,直接回归容易在训练早期跌到零导致梯度爆炸。fuse之后只取记忆槽做决策而不是取全部序列,是为了让决策路径和记忆更新路径解耦,便于后续做记忆的单独微调。

3.3 推理增强与「无限智能体」的循环结构

综述里提到推理增强和一种可以长时间持续运行的智能体形态。前者指在推理阶段引入检索、工具调用、多步自我校验,让模型不必把所有知识压进参数;后者指突破单次上下文窗口的限制,靠记忆的写入、压缩、摘要维持跨会话的连续性。

这两件事在实现上是同一套机制的两面。推理增强需要把工具返回结果写回上下文,持续运行需要把历史交互压成摘要。共同点是:上下文不再是只读的输入,而是可读写的状态。

class PersistentAgent: def __init__(self, model, memory_store, budget_tokens=32000, summarize_at=0.8): self.model, self.memory_store, self.budget = model, memory_store, budget_tokens self.summarize_at = summarize_at # 上下文占用到八成时触发压缩 def step(self, user_input, tools): ctx = self.memory_store.load_recent() # 推理增强:先判断要不要调工具,避免每步都盲目检索 plan = self.model.plan(user_input, ctx, tool_names=list(tools)) for call in plan.get("tool_calls", []): result = tools[call["name"]](**call["args"]) ctx.append({"role": "tool", "content": result}) answer = self.model.act(user_input, ctx) self.memory_store.append(user_input, answer) # 上下文接近上限时压缩成摘要,保留实体与未完成子目标,丢弃寒暄 if self.memory_store.usage() > self.budget * self.summarize_at: summary = self.model.summarize( self.memory_store.load_recent(), keep=["entities", "open_subgoals"] ) self.memory_store.compact(summary) return answer

summarize_at=0.8是个经验阈值。等到 100% 才压缩,往往压缩动作本身就没地方放了;压得太早,摘要质量差且频繁调用浪费算力。keep参数列出必须保留的字段,是因为通用摘要器倾向于把「未完成的子目标」当成冗余信息删掉,而这恰恰是持续运行最不能丢的东西。

注意:记忆压缩是有损的,且损失不可逆。生产环境里最好保留原始日志,压缩只作用于喂给模型的上下文,别把原始记录也一起删了。

4. 训练信号从哪来:强化学习、模仿学习与跨现实数据

结构搭好之后,接下来的问题是参数从哪来。综述把学习策略拆成强化学习、模仿学习、传统视觉方法、上下文学习和系统级优化几条线,实际的系统通常是几条线的混合。这一章重点讲混合时的边界在哪、跨现实训练为什么可行、以及持续自改进的数据飞轮怎么转。

4.1 强化学习与模仿学习的边界:稀疏奖励对上分布偏移

强化学习的吸引力在于它能超越示教。人类示教只能覆盖人做得到的动作,RL 可以找到人类没想到但更优的策略。代价是样本效率极低,奖励稀疏时更是如此——机械臂抓取任务里,「抓到了」这个信号可能几百步才出现一次,中间全靠探索。

模仿学习反过来,样本效率高,一条示教轨迹就能提供稠密监督,但会累积误差。策略在训练分布上表现好,一旦偏离到示教没覆盖的状态,错误会复合放大,这就是协变量偏移。综述里提到用人类反馈和外部知识来改进智能体,某种程度上就是在补这个洞:让策略在偏离时还能拿到纠偏信号。

工程上的常见做法是先模仿学习打底,再用强化学习做精调,中间插一层在线纠偏——让策略自己跑,人类只在它明显要出错时接管,接管数据回灌训练。这个流程的成本主要在人力,但比纯 RL 从零探索便宜得多,也比纯 IL 稳得多。

维度强化学习模仿学习上下文学习
监督信号回合奖励,稀疏延迟示教动作,稠密即时提示中的示例,无需更新参数
样本效率低,需要可交互环境高,几十条轨迹起效极高,零训练
主要失效奖励设计不当导致投机行为分布偏移导致误差累积示例选择敏感,长任务易漂移
适用阶段精调、超越示教冷启动、建立基础动作分布快速适配新任务、原型验证

4.2 跨现实训练:一套策略怎么在虚拟与物理世界间迁移

综述里有个说法很关键:通过在跨现实数据上训练,模型可以同时应用于物理世界和虚拟世界。这句话背后的机制是观测抽象和域随机化。

直接拿真实相机图像训策略,换个光照就崩。域随机化在训练时随机扰动光照、纹理、相机内参、物理参数(摩擦系数、质量),逼策略学到不依赖具体外观的特征。观测抽象则更进一步:不把原始像素直接喂给策略,而是先过一层检测或分割,输出物体类别、位姿、相对关系,这些量在虚拟和现实之间语义一致。

import random def randomize_domain(cfg): # 外观层:光照、材质、背景,压住纹理过拟合 cfg["light_intensity"] = random.uniform(0.4, 1.6) cfg["light_color_temp"] = random.uniform(3500, 8000) cfg["texture_swap_prob"] = 0.7 # 几何层:相机位姿与内参,让策略不依赖固定视角 cfg["cam_pos_jitter"] = 0.05 # 米 cfg["cam_fov_jitter"] = 5.0 # 度 # 物理层:摩擦、质量、执行器延迟,这几项对 sim-to-real 影响最大 cfg["friction"] = random.uniform(0.5, 1.2) cfg["mass_scale"] = random.uniform(0.8, 1.25) cfg["actuator_delay_ms"] = random.randint(0, 40) return cfg

actuator_delay_ms是最容易被忽略的一项。仿真里动作立即生效,真机上从指令下发到关节响应有几十毫秒延迟,策略如果在仿真里学成了「看到偏差立刻反向修正」,上真机就会因为延迟而震荡。把这个延迟显式随机化,策略会学到更保守的修正节奏。

cam_fov_jitter同理。很多人只随机相机位置不随机视场角,结果策略对物体在画面中的绝对尺寸产生依赖,换镜头就失效。

4.3 持续自改进:人类交互数据与模型生成数据的配比

综述最后一章讨论了持续自改进,把数据来源分成人类交互数据和基础模型生成数据两类。这个划分对应一个现实:人类标注贵且慢,模型生成便宜但会放大自身错误。

数据飞轮的典型结构是:人类示教和偏好提供种子数据,模型在环境里 rollout 生成大量轨迹,验证器筛选出成功或高质量的片段,回灌训练集,模型变强后再生成更多。关键在于验证器——没有可靠的成功判定,飞轮转起来就是在自我污染。

def data_flywheel(model, env, human_seed, rounds=5, gen_ratio=0.8, keep_top=0.3): dataset = list(human_seed) for r in range(rounds): # 生成:按比例混合人类种子与模型 rollout,避免过早丢失人类分布 n_gen = int(len(dataset) * gen_ratio) rollouts = [env.rollout(model, task) for task in sample_tasks(n_gen)] # 验证:用环境真值或独立判别器打分,别用生成模型自己给自己打分 scored = [(t, verifier(t)) for t in rollouts] scored.sort(key=lambda x: x[1], reverse=True) # 只保留高分片段,比例太低会欠采样,太高会把错误一起带进来 kept = [t for t, s in scored[: int(len(scored) * keep_top)] if s > 0.6] dataset = dataset + kept model = finetune(model, dataset) # 每轮留一部分人类数据做回归测试,防止能力漂移 eval_on(model, human_eval_set) return model

keep_top=0.3和s > 0.6两个阈值一起用,是在「要足够多的数据」和「别把噪声带进来」之间找平衡。verifier必须独立于被训练的模型,否则模型会学会讨好自己的评分器,这在文献里反复被提到。每轮跑一次人类数据上的回归测试也很有必要,防止模型在自生成数据上越训越偏,把原本会的任务忘掉。

5. 常见问题与排查:智能体从演示到上线之间那些坑

前面几章讲的是机制该长什么样,这一章讲它实际会怎么坏。演示视频里流畅的智能体,上线后出问题的位置高度集中,下面几条是按踩坑频率排的。

5.1 感知与动作链路的坑

现象一:演示环境表现良好,一换相机或换场地就大幅退化。原因通常是观测分布不一致——训练数据的相机内参、光照色温、背景纹理和现场差得远,策略学到了与任务无关的外观特征。解决办法是先把观测抽象层统一,再用域随机化扩充分布;上线前用现场采集的少量数据做一次闭环境 rollout,别只看离线指标。

现象二:长任务执行到中段开始重复同一个动作。原因多半在记忆。上下文被最近几十步的相似观测占满,早期设定的子目标被挤出去了,模型只能根据当前帧做局部决策,于是反复执行同一个「看起来还没完成」的动作。解决思路是分层记忆:子目标单独存一份并显式编码进状态,近期观测做滑动窗口,历史经验走检索而不是全塞上下文。

现象三:模型自信地描述场景里不存在的东西,并据此动作。这是幻觉在具身场景下的表现形式,比纯文本幻觉更危险,因为它直接驱动执行。根因是语言先验压过视觉证据,模型从指令里「推断」出应该有某个物体。解决办法是强制接地:动作输出前必须给出可验证的实体指称,接一个检测器做交叉校验,对不上就降级为探针动作。

注意:接地校验会引入额外延迟,在高频控制回路里要放到规划层而不是控制层,否则会拖垮实时性。

5.2 数据与评测的坑

现象四:离线指标一直在涨,在线成功率不动甚至下降。原因是离线数据几乎全是专家轨迹,策略在训练分布上拟合得越来越好,在线时一旦偏离就没人教它怎么回来。解决办法是补在线纠偏数据——让策略自己跑,人类只在关键时刻接管,接管片段权重调高;评估必须走闭环境 rollout,别用离线损失当唯一依据。

现象五:换个评测环境分数掉一半,但代码和数据都没动。大概率是评测环境的初始状态分布和训练不一致,比如物体初始位置范围、任务指令的措辞模板、甚至随机种子集合。解决办法是固定一组多种子评测集合并报告方差,别只报单次最优;同时把评测环境的配置纳入版本管理,和训练配置一起记录。

现象六:多智能体场景下,单体能完成的任务放进协作环境就崩。原因在于训练时缺少对其他智能体行为的建模,每个智能体都假设环境静态,实际环境里其他智能体也在动。解决办法是在训练时引入行为多样的对手或队友,或者显式把其他智能体的意图预测作为辅助任务,让策略学会「等一等」和「让一让」。

6. 设计取舍:为什么这套范式至今没有统一评测

这套范式最让人不安的地方不是某个模块不够强,而是它没有公认的评测标准。语言模型有困惑度、有基准题库,答案对错可以自动判定;具身智能体的「成功」依赖环境、任务、初始状态和评价口径,同一套策略在三个实验室能跑出三个结论。综述里专门辟出章节讨论数据集与排行榜,本身就说明社区已经意识到这个缺口。

取舍点偏工程的一侧偏研究的一侧实际倾向
动作表示离散指令,易评测易复现连续控制,贴近真实具身按任务分层,高层离散低层连续
训练信号模仿学习打底,稳定可控强化学习精调,上限更高先 IL 后 RL,中间插在线纠偏
环境来源真实环境,结论可信仿真环境,可规模化仿真预训练 + 真机小样本适配
评测口径固定任务集,可复现开放任务,贴近实用两套并行,报告时明确区分

我自己的习惯是:任何智能体项目在讨论模型之前先定三件事——动作空间的物理含义、成功的判定条件、评测时的随机种子集合。这三件事没定,后面的指标全是黑匣子。有一次赶进度跳过了这一步,模型在自建测试集上跑到九成成功率,换了一套初始状态分布直接掉到四成,回头查发现训练数据的物体初始位置根本就是固定几个点,策略学的是「记住位置」而不是「找到物体」。

从那以后我每次启动新任务,都强制先跑一遍初始状态分布的可视化,确认训练和评测的覆盖范围对得上,再动模型。这个习惯救过不止一次,比事后调参便宜太多。希望帮到你。

本文还有配套的精品资源,点击获取

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进