# MultiPLY 技术讲解:面向 3D 世界的多感官、以物体为中心的具身大语言模型 > 论文全称:*MultiPLY: A Multisensory Object-Centric Embodied Large Language Model in 3D World* > 发表会议:CVPR 2024 > 机构:UMass Amherst、UCLA、MIT-IBM Watson AI Lab > 作者:Yining Hong, Zishuo Zheng, Peihao Chen, Yian Wang, Junyan Li, Zhenfang Chen, Chuang Gan > arXiv:[2401.08577](https://arxiv.org/abs/2401.08577)(2024-01-16) > 项目主页: > 代码仓库: 本讲解面向具身智能 / 多模态大模型方向的研究者,目标是把 MultiPLY 的动机、核心设计、数据构造、模型结构、训练范式与实验结论讲清楚,并对它在技术谱系中的位置与局限做出评估。 --- ## 1. 一句话概括 MultiPLY 是第一批把"**主动交互式多感官感知**"塞进大语言模型的工作之一。它让一个由 LLM 驱动的具身智能体(embodied agent)在 3D 场景里**主动行动**——导航、靠近、敲击、触摸物体——并在每一步把视觉、听觉(撞击声)、触觉、温度等**多感官反馈**重新喂回 LLM,从而在"词语—动作—感知"三者之间建立关联。 与"被动多模态 LLM"(一次性把所有传感数据当输入塞进去)相比,MultiPLY 的关键差异是:**多感官细节只有在智能体真正去交互时才被"揭示"出来**,这使得感知是按需的、序列化的、可推理的。 --- ## 2. 它想解决什么问题 ### 2.1 被动感知的局限 当下绝大多数多模态 LLM(图文模型、3D-LLM 等)都是**被动吸收**传感数据:图像、点云、音频在推理开始时就被一次性编码为输入 token。这带来两个问题: - **缺乏主动性**:模型无法"决定去摸一下这个杯子有多烫"或"敲一下这个箱子是不是空的"。而物体的很多属性(材质、温度、是否中空、软硬)本质上必须通过交互才能获得。 - **信息纠缠**:把所有模态一次性融合成单一 embedding,会让细粒度区分(材质 vs 温度 vs 声音)混在一起,难以分步推理。 ### 2.2 整体点云表示的代价 同组的前作 **3D-LLM**(把整体 3D 点云编码进 LLM)证明了 3D 推理的可行性,但代价是:**训练昂贵、对单个物体的推理效率低**。当任务其实只关心场景里少数几个物体时,编码整张场景的稠密点云是浪费。 ### 2.3 数据稀缺 要训练一个"会交互的多感官具身 LLM",需要"动作 + 多感官观测 + 语言"三元对齐的数据。这类数据现实中几乎不存在。MultiPLY 的相当一部分贡献其实在于**用仿真 + LLM 自动化地把这套数据造出来**。 --- ## 3. 核心思想总览 MultiPLY 把三件事拼在一起: 1. **以物体为中心的抽象场景表示**(object-centric scene representation)——场景一开始只给"有哪些物体、在哪里"的抽象信息,不给细节感官数据。 2. **动作 token(action tokens)**——让 LLM 直接"生成动作",驱动智能体去交互。 3. **状态 token(state tokens)**——把交互后获得的多感官观测,编码后**追加回上下文**,供 LLM 生成后续文本或下一个动作。 这三者构成一个**闭环**: ``` 抽象场景表示 → LLM 生成 [动作 token] → 智能体在仿真中执行动作 ↑ │ └──── [状态 token](多感官观测编码回填) ←──────┘ │ LLM 继续生成文本 / 下一个动作 ``` 这正是它区别于"一次性塞输入"的被动模型的根本所在:**感知是行动的结果,而行动是 LLM 推理的产物。** --- ## 4. 数据:Multisensory Universe(500k 条交互数据) 数据是 MultiPLY 的基石,整条生成流水线值得拆开看。 ### 4.1 场景底座:HM3D 使用 **Habitat-Matterport 3D(HM3D)** 提供的真实室内 3D 场景作为环境底座,在 **Habitat-sim** 仿真器里运行。 **问题**:HM3D 原生场景里的物体传感信息不足、多样性有限,而且在 Habitat-sim 里**不可交互**。 ### 4.2 注入可交互的多感官物体 为此作者往场景里**添加新的可交互物体**,来源有两个: - **ObjectFolder**:约 1k 个物体网格,其**撞击声(impact sound)以隐式神经场(implicit neural field)形式存储**,并标注了材质信息。这是音频与材质感官的主要来源。 - **Objaverse**:约 80 万个 3D 物体的超大物体库,从中筛选适合出现在室内场景的物体,扩充视觉多样性。 ### 4.3 多感官信号怎么来 不同模态由不同仿真/编码手段生成: | 模态 | 信号来源 | 触发动作 | |------|----------|----------| | 视觉 / 点云 | 物体网格渲染 + 以物体为中心的特征 | OBSERVE | | 音频(撞击声) | ObjectFolder 的隐式神经声场 | HIT | | 触觉 | **DiffTactile**(基于 MLS-MPM 仿真刚性 / 弹性 / 弹塑性物体,使用带位置标记点的 bubble gripper) | TOUCH | | 温度(热成像) | 物体逐个标注 / 模拟的温度数据 | TOUCH | ### 4.4 用 ChatGPT 批量生成任务 作者用 **ChatGPT** 来"出题":生成各类任务的输入与输出(指令与目标回答),覆盖多感官描述(captioning)、问答(QA)、对话(dialogue)、操作(manipulation)、任务分解(task decomposition)等。随后让一个**具身智能体在仿真环境里真正去探索、交互**,采集这些任务对应的多感官观测,形成"指令 — 动作序列 — 多感官观测 — 回答"的完整训练样本。 最终得到 **Multisensory Universe:约 50 万条多感官交互数据**。 > 这套"用 LLM 自动造指令数据 + 仿真采集观测"的思路,是 LLaVA "用 GPT-4 造图文指令数据再做 instruction tuning" 范式向**具身、多感官、3D 交互**的延伸。 --- ## 5. 模型架构 ### 5.1 以物体为中心的场景编码 MultiPLY **不**把整张场景编码成稠密点云,而是构建抽象的、以物体为中心的表示。论文叙述上对标 **ConceptGraphs**(开放词表 3D 场景图、CLIP grounding)的思路:从带位姿的 RGB-D 序列出发,分割出物体区域、用 CLIP 编码并跨多视角融合,得到"3D 物体 + 视觉/语言描述符"的集合。 不过**公开仓库里 `simulator/semantic_extractor.py` 与 `feature_extractor.py` 的真实实现更直接**:智能体在房间的可导航网格点上逐点"球形扫描"(左转 3 次凑满 360° + 上看 + 下看,共 6 视角),每帧拿 RGB + 深度 + **仿真器给出的 ground-truth 语义分割**;对每个实例 mask 抠图,送入 **LLaVA 的 CLIP 视觉编码器(`LlaVa_Encoder`)** 编码,再对该物体的多视角特征取均值,得到一个 **1024 维**的物体级特征(逐物体存成 `.pt`);点云则由深度图反投影(`Reconstruct3D.depth_map2points`)后下采样得到。也就是说,released 版用**仿真器真值语义掩码**替代了 SAM/检测器这一步,是一种工程上更省事的近似。 这套表示的两大好处不变:**开放词表/语义丰富** + **稀疏高效**(只保留物体级抽象,而非全场景稠密点云)。在 MultiPLY 里,它的作用是先让 LLM 知道"场景里有哪些物体、大致在哪",而**把每个物体的细节多感官信息留到交互时再揭示**。 ### 5.2 各模态编码器 每条感官流都被编码成 **1024 维**特征,再通过各自的投影层映射进 LLM 的隐藏维度(hidden size)。从代码(`llava_arch.py`)看,投影层分两套: - **场景 / 视觉(`` / ``)**:复用 LLaVA 原有的视觉投影器 `mm_projector`(线性或 `mlp2x_gelu`)。特征来源是上文的多视角 CLIP 物体特征。 - **触觉(``)**:来自触觉仿真读数(`tactile_reading/marker4.pt`,对应论文里的 **DiffTactile**,基于 MLS-MPM 仿真、bubble gripper 标记点),经一个**新增的 2 层 GELU MLP**(`tactile_projector`)投影。 - **声音(``)**:来自 ObjectFolder 的撞击声特征(`impact_sound .pt`),或场景环境音的 audioset embedding;经**新增 2 层 GELU MLP**(`sound_projector`)投影。论文层面对应用 **CLAP** 把声音对齐到语言空间。 - **温度(``)**:论文中作为第四种感官,但 released `llava_arch.py` 中**没有**对应的 `temperature_projector`,公开训练循环也未真正喂入温度特征——属于代码未完整释出的部分。 > 关键工程细节:训练时 `del model.model.vision_tower`,即**把 LLaVA 自带的在线 CLIP 视觉塔删掉**——所有感官特征都是**离线预提取**好的 `.pt`,训练时直接加载。这大幅降低了显存与计算开销,但也意味着特征提取与 LLM 训练是解耦的两个阶段。 ### 5.3 LLM 主干与 token 体系 MultiPLY 构建在 **LLaVA 框架**之上,主干语言模型为 **Vicuna-7B(即 `liuhaotian/llava-v1.5-7b`,源自 LLaMA-2)**,并在其上做指令微调。各感官观测由各自的传感编码器编码,再通过投影层(sensor-to-image adapter)连接进 LLM——即把各模态特征对齐到 LLaVA 原本处理图像特征的接口上。它在 LLM 的词表里通过 `tokenizer.add_tokens(..., special_tokens=True)` + `resize_token_embeddings` 引入了两类**特殊 token**(token 字符串均来自仓库 `dataset.py`,是真实命名): - **状态 token(state tokens)**:占位符,前向时其 embedding 会被对应的感官特征**替换**。包括 ``(场景里各物体的抽象特征)、``(观察得到的物体点云/视觉特征)、``(触觉)、``(撞击声)、``(温度)、``(环境音)。 - **动作 token(action tokens)**:让 LLM"说出"要执行的动作,驱动智能体交互。包括 ``(观察、取物体点云)、``(触摸,取触觉/温度)、``(敲击,取撞击声)、`