你的机器人学会了推 — 它能滑吗?
我们做了一个实验:在 MuJoCo FetchPush 中训练机器人推物体,然后将它放入 FetchSlide — 一个它从未见过的环境。基线成功率:4%。使用来自错误任务的记忆:12%。
无需模型微调。无需架构更改。机器人使用来自完全不同任务的经验,在新任务中表现更好。
这不应该有效。推和滑是不同的技能 — 不同的动力学、不同的力分布、不同的成功标准。但它确实有效。原因如下。
为什么这很重要
迁移学习是一个被广泛研究的问题:将在任务 A 上训练的模型微调用于任务 B。它有效,但需要重新训练 — 梯度更新、冻结层、域适应。
我们做的不同。我们没有迁移模型权重。我们迁移了记忆。
FetchPush 中的机器人学到了这样的经验:"以 0.34 的角度、12.5N 的峰值力接近,对距离 0.15m 的目标有效。"这些是经验参数 — 不绑定于特定任务,而是与机器人操作的物理特性相关。
FetchPush 和 FetchSlide 共享同一个机器人(7 自由度 Fetch 机械臂)、相似的工作空间几何结构和重叠的物理约束 — 距离估计、力校准、接近策略。记忆存储的不是"如何推"。它们存储的是"在这个空间上下文中,什么物理参数有效。"
这就是为什么推的记忆可以帮助滑的任务。
实验
我们使用 robotmem 在不同环境之间存储和检索经验。三个阶段,每个阶段 50 个 episode:
- 阶段 A — 使用启发式策略的 FetchSlide。完全没有记忆。4% 成功率。
- 阶段 B — 同样的 FetchSlide 任务,但在每个 episode 前,机器人从其 FetchPush 记忆中检索经验。它使用检索到的参数(力、角度、接近距离)来偏置其策略。12% 成功率。
- 阶段 C — FetchSlide 使用其自身积累的 FetchSlide 记忆。更高,但从 4% 到 12% 的跨环境跳跃才是重点。
FetchSlide 成功率。左:无记忆(4%)。右:有 FetchPush 记忆(12%)。跨环境经验迁移提升了 +8 个百分点。
+8 个百分点听起来不多 — 直到你考虑到正在发生什么。机器人在 FetchSlide 中零训练。它使用来自不同任务、不同动力学的记忆,在第一天就提升了表现。这是经验迁移,不是迁移学习。
代码
关键洞察在于记忆的存储和检索方式。当 FetchPush 机器人成功时,它存储带有结构化上下文的物理参数:
from robotmem import learn, recall
# 成功推动后(在 FetchPush 中)
learn(
insight="FetchPush: success, dist 0.012m, 28 steps, force=12.5N, angle=0.34",
context='{"task": {"success": true}, "spatial": {"target": [1.3, 0.7, 0.42]}, "params": {"force_peak": 12.5, "approach_angle": 0.34}}'
)
# 在 FetchSlide 中:检索成功的 FetchPush 经验
memories = recall(
"push object toward target",
context_filter={"task.success": True},
spatial_sort={"field": "spatial.target", "target": slide_target}
)
context_filter 确保我们只检索成功的经验。spatial_sort 按与当前目标的距离对记忆排名 — 物理上较近的经验比较远的更相关。
检索到的参数(力、角度、接近距离)作为初始偏置融合到 FetchSlide 策略中。机器人不是盲目复制 — 它以过去的经验作为起点并进行适应。
自己复现
git clone https://github.com/robotmem/robotmem
cd robotmem
pip install -e . gymnasium-robotics
cd examples/fetch_push
PYTHONPATH=../../src python experiment.py # 先构建 FetchPush 记忆
PYTHONPATH=../../src python cross_env.py # 测试跨环境迁移
# 输出:阶段 A 4% → 阶段 B 12%(+8%)
跨环境实验需要先通过 experiment.py 构建 FetchPush 记忆(约 5 分钟),然后运行 150 个 FetchSlide episode(约 10 分钟)。你会在终端输出中看到提升。