跳到主要内容

空间生成缺的,是那个能证明你错了的地方

林默
林默

· 阅读约 6 分钟

上个月底我又干了件后来觉得挺蠢的事:让一个空间生成模型按“有落地窗的客厅”出场景,拿 CLIP 分数筛了一轮,挑了个最高的。0.87,挺好看。我把它导成 OBJ 丢进引擎想随便跑一下——椅子是悬空的,楼梯的碰撞体往外偏了半米,落地窗那面墙的法线是反的。

先停一下,问个问题:我到底是拿什么在判“生成得好不好”?

当时我答不上来。跟人讲起这事,人家说你不就是拿 CLIP 在判吗,我还理直气壮地回了一句,那只是过滤,不是质量判断。这会儿想起来都脸热——那 0.87 是真的,椅子浮着也是真的,中间没有东西把它们连起来。我拿一个看相似度的东西,给一个需要物理规则的任务当了裁判,还用得挺顺手。

这个场景在我脑子里转了俩礼拜。不是气那个模型——它干的就是它被训练成该干的事——我气自己居然在 2026 年还信这个分数。

后来我读到那篇论文。它没解决我全部的难受,但它把其中一半说得比我清楚:代码智能体从来没这么狼狈过,因为代码有编译器和运行时。类型对不上就报错,跑起来崩就是崩。这个“没得商量”恰恰是奖励信号里最值钱的部分——它能证伪你,果断地告诉你:你错了。

空间生成这一侧,大家一直拿 CLIP 分数当裁判。它告诉你“看起来像不像”,永远不能告诉你“椅子是不是浮着”。相似度是从数据分布里学出来的相关性;而“椅子浮着”是物理规则问题,跟分布没什么关系。这俩压根不在同一层,我们却拿前者给后者当奖励。说难听点,比拿卷尺量体温还别扭。

我后来补了那个检查,几行丑脚本,贴一下是因为它比任何解释都直白:

# 我说的“跑一下”其实就是这个
for obj in scene.objects:
    if not has_floor_collision(obj):
        print(f"{obj.name} is floating")

跑完输出一行 armchair_02 is floating。那一刻我没有任何需要“感觉”的地方——它就是错的。CLIP 0.87 给不了我这种明确性。

再往下想一层:为什么代码智能体的后训练能快速滚起来,空间生成却一直在拿模糊代理扛着?我一开始也以为答案只是“大家还没找到更好的指标”。后来发现不是。

代码领域是先有运行时、后有智能体的。编译器、解释器、测试框架这些东西在 LLM 出现之前就存在了几十年,它们本来就是验证装置。模型一接入这个装置,对错的信号就自动有了归属。空间生成缺的根本不是更强的生成模型,也不是更高的算力,它缺的就是这个东西——一个能证伪它的地方。没有它,再好的模型也只能在一片“看起来不错”里继续舒服地犯错。

游戏引擎是不是就是它?

论文把游戏开发说成“缺失的奖励环境”。我一开始也以为这又是“换评价指标”的 proposal,后来才发现不是。它不是说让你用引擎算个新指标去替代 CLIP;它是说,引擎让空间生成第一次有了“运行时刻”。场景在引擎里就是一个可执行的世界规格,碰撞、物理、可导航性、有限的可玩性——这些都能被高效检查,而且检查结果是规则性的,不是相关性。你可以指着穿模说“错了”,不用盯着两个向量之间的夹角说“可能不太对”。

再往下剥一层,这个区别对强化学习造成的后果才是真正要紧的。奖励函数最怕不可归因的噪声。CLIP 是连续值,0.82 和 0.79 之间那点差,你没法告诉模型到底哪一步做对了或做错了。而引擎给的是结构化的、指向具体物体的失败:椅子悬空,那椅子的放置策略就得担责。这个可归因性,才是“可验证轨迹数据引擎”里“可验证”三个字的含金量——它允许你沿着轨迹往回追信用。没有这一层,奖励信号的信用账根本记不清。

但想到这,我又得把自己拽一下:引擎能证伪的,只是局部约束。椅子别浮、别穿墙、楼梯能上去——这些是硬条件。可它管不了“这间客厅好不好住、合不合用”。那种全局判断仍然得靠人。论文把这事融进开发流程里,说开发者在决定一个场景接不接受时,就提供了稀疏的全局奖励。我挺喜欢这个安排,因为它把人从显式标注里解放出来——你本来就会在开发过程中决定这场景过不过,这个行为本身就是信号。

不过先别急着叫好。人的“接受”真的那么干净吗?这层我至今没想透。开发者接受一个场景,可能是因为它真的好;也可能是因为他累了、deadline 到了,或者正被另一个 bug 搞得心烦,随手就过了。HEV 里的 H 比 CLIP 强,这点我不怀疑。但它强在哪儿,可能不是“人比模型会判断”,而是噪声来源变了:从“跟任务无关的相似度模型”,换成了“真实工作流里的人”。后者的噪声更稀疏、更贵,而且裹着人的偏好。这是不是一笔好买卖,得看你是不是真愿意为可归因性付这个价。别急着替所有人回答。

到这里我差不多把最想说的说完了。长时程轨迹那块反而没展开——游戏开发给的轨迹确实比代码任务长很多,中间的因果链也更深。但深因果链对 RL 意味着信用分配更难做,这件事本身够再写一篇。今天先不碰,免得又绕进去。

绕回开头。我上个月被一把悬空椅子气着,根子不在生成模型不够好。是我拿“看起来像”当成了“做得对”的证据,而真正能给我证据的东西——碰撞、物理、可导航性——我根本没去要。一个会证伪你的地方,比一个评价分高零点几的地方重要得多。前者逼你出错,后者只会让你舒服地错下去。游戏引擎摆在那儿几十年了,做空间生成的人一直绕开它走。直到有人把它当成奖励环境本身,这事才真的开始有点意思。

林默
林默

从具体轶事入口,一问一答把默认对的判断剥到设计权衡,主动暴露走过的弯路。

查看主页 →