RMBench: Memory-Dependent Robotic Manipulation Benchmarkwith Insights into Policy Design
研究背景:
现有机器人操纵策略,如 π0.6、RDT2,已经具备较强的精细操作能力,但大多面向短时任务,并依赖当前观测或固定长度的历史窗口,这实际上近似假设任务是马尔可夫任务(当前状态已经包含做下一步决策所需的全部信息),即当前或最近观测足以决定下一步动作(抓红色杯子)。
核心问题: 现实中大量机器人任务是 memory-dependent / non-Markovian 的,当前观测不足以完成决策,机器人必须利用过去的信息。
典型情况包括:
- 遮挡:之前看到目标在 A 箱子中,后来箱子关闭。
- 状态变化:机器人之前已经打开抽屉,但当前视角无法判断,需要记住之前完成的操作。
- 顺序依赖:之前观察到红→蓝→绿,之后要求按照相反顺序操作。
因此机器人需要具备保存、检索和利用历史信息。
现有研究不足: MemoryVLA、MemER、CronusVLA、SAM2Act 等已经开始加入显式 Memory,但目前仍缺少:
- 系统评测机器人 Memory 能力的 benchmark;
- 对不同 Memory 设计为何有效的机制分析。
现有 benchmark 的局限:
- MemoryBench:任务较少,部分任务难以稳定复现,缺少明确的任务设计原则。
- MIKASA:包含较多 memory-related tasks,但主要面向 reinforcement learning。
- LIBERO-Long:虽然任务很长,但任务相关信息始终可见,因此不一定真正需要 Memory。
最关键的观点是:Long-horizon不等于Memory-dependent
任务执行时间长,不代表必须依赖历史信息;真正的 Memory-dependent task 是:
当前观测无法决定正确动作,必须利用过去的任务相关信息
比如:“把桌上 10 个积木依次放进盒子。”可能需要 500 步,是 long-horizon。
但如果机器人随时都能看到剩下哪些积木,那么它并不是真正 memory-dependent。
反过来:“看一下哪个盒子里有目标,然后盒子全部关闭,再去取目标。”
可能只需要几十步,但是这才是真正的 memory-dependent task。
方法部分:
Task Memory Complexity (TMC)
现有基准通常通过特定的策略体系结构来评估memory,但缺乏以任务为中心的标准来表征随时间推移必须保留多少与任务相关的信息。为了弥补这一差距,作者引入了任务记忆复杂性(TMC),它衡量的是最优决策所需的最少过去信息。
Setup.
作者将一个操纵任务建模为一个部分可观测的马尔可夫决策过程,其潜态为st∈S,观察点为∈O,动作点为∈A。
![]()
作者不是假设可以访问完整的历史记录,而是考虑一种总结过去观察到的与任务相关的信息的记忆状态。设Mt表示由ht构造的记忆表示,M(K)t表示对来自最多k个与任务相关的过去观察的信息进行编码的记忆状态。
Definition.
假设一个最优机器人原本可以利用全部历史 ht 做出正确动作。如果我们只给它 Memory Mt(m),它仍然能够做出同样的最优决策,那么这 m 个历史信息就已经足够了。
作者寻找最小的:m,这个最小值就是: Task Memory Complexity
Interpretation.
M(0):不需要 Memory
M(1):需要记住一个关键历史 observation
M(n):需要多个历史 observation
RMBench Benchmark Tasks
作者一共设计了 9 个任务,分成两类:5 个 M(1)+4 个 M(n)
Mem-0 Policy

Planning Module
Planning Module 的作用是:根据任务目标和之前已经完成的子任务,决定机器人下一步应该执行什么子任务。
作者定义:![]()
- o0:任务开始时的初始图像
- g:全局任务指令
- Mt−1:之前已经完成的子任务记忆
- st:当前需要生成的下一子任务
可以理解成:
初始场景+任务目标+历史记忆→下一子任务
![]()
- si:第 i 个已经完成的子任务
- oi^{end}:第 i 个子任务完成时的图像
可以理解成:
M={完成的子任务,该子任务结束时的画面}
Memory既保存文字又保存图像,si 告诉模型:“我计划并完成了什么。” 而: oi^{end}告诉模型:“完成之后,环境实际变成了什么样。”
Execution Module
Planning Module 决定“下一步要做什么”,Execution Module 负责把这个子任务真正转换成连续的机械臂动作。
它的核心不是再做高层规划,而是解决一个更具体的问题:
当前该怎么动机械臂,才能把这个 subtask 做完?
而作者认为,仅看当前画面还不够,所以在执行阶段又加入了两种 Memory:
Anchor Memory+Sliding Memory
分别负责“记住子任务开始时的重要参照”和“记住最近几步发生了什么”。
作者先用一个 VLM 对当前图像和当前子任务进行编码:
,之后作者对 token 做 mean pooling:
Anchor Memory:记住“子任务开始时是什么样”,每个 subtask 开始时,把第一帧视觉特征保存下来:
,这个 A 就是 Anchor Memory。它在整个 subtask 中都保持不变。
Sliding Memory:记住“最近几步发生了什么”,它不是固定不变,而是不断保存最近的视觉特征。每个 timestep 之后:
。意思是先把当前视觉表示
加入 Memory然后只保留最近 K 个。所以 Sliding Memory 相当于它是一段短期动态历史。
Memory 使用 Cross-Attention和当前图像融合:
![]()
会分别做两次:
以及:![]()
直观理解就是:用“当前画面”去查询 Anchor 和 Sliding Memory 中哪些历史信息对当前动作有用。最终模型得到两种增强后的视觉表示:
和![]()
最后拼接生成ct:
即:长期参照+短期动态+当前任务语义。这个 ct 就是最终提供给 Action Model 的 conditioning。
最终使用 DiT 生成 action chunk:![]()
其中:
- at:t+H−1:加噪声后的 action sequence;
- xt:当前机器人 state;
- ct:前面得到的 memory-conditioned 表示;
- a^t:t+H−1:去噪得到的一段未来动作。
作者固定:H=30,也就是说,一次生成未来 30 步的 action chunk。但不会一定把 30 步全部执行完,而是执行其中前: a^t:t+Δ−1,1≤Δ≤H,然后再重新获取 observation,再继续预测。
Subtask 结束后,Execution Module 里的两个 Memory 都会清空,然后下一 subtask 开始时,再重新建立新的 Anchor 和 Sliding Memory。所以这两种 Memory 都是:subtask-level memory
而不是跨整个 episode 永久保存。
Subtask End Classifier
Subtask End Classifier 判断当前 subtask 是否已经完成,并连接 Planning Module 与 Execution Module,控制什么时候结束执行并重新规划。
Classifier 使用 Execution Module 的 conditioning vector:![]()
通过一个轻量 MLP 输出:
,0=subtask ongoing 1=subtask finished
为避免单帧噪声造成提前结束,作者采用 temporal consistency:只有连续 L=8 个 timestep 都预测为完成,才真正结束。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)