视频世界模型的长时空间记忆机制复现与工程实践

发布时间:2026/10/19 8:21:53
视频世界模型的长时空间记忆机制复现与工程实践 开始前先说下背景。2025年的NeurIPS论文列表出来之后我们一个小团队盯上了这篇《Video World Models with Long-term Spatial Memory》因为标题里的两个词正好戳在我们最近一年的痛点上视频世界模型以及长期空间记忆。我们自己的视频预测模型跑短片段还算稳定一旦生成超过60帧场景就开始崩——物体凭空消失、颜色漂移、空间关系错乱。所以看到“long-term spatial memory”这个方向时我们几乎是第一时间就决定动手复现。这篇博客不是论文解读而是我们基于公开标题和自身理解做的一整套复现实践记录包括机制拆解、最小实现、实验现象和一堆踩坑过程希望能给同样在做视频世界模型的人一些参考。1. 视频世界模型里的“世界”为什么会丢1.1 视频世界模型和普通视频生成器的本质区别很多刚接触这个方向的人会把视频世界模型和视频生成器混为一谈。视频生成器追求的是“这一帧画面好看、符合文本提示”你给它一句话它给你一段高质量的片段帧与帧之间只要视觉上连贯就行。视频世界模型追求的不一样它要学的是环境本身的演化规律物体运动轨迹、遮挡关系、光影变化、物理交互。换句话说它生成的每一个未来帧应该是对“当前世界状态”做一次推演而不是在画布上随机补细节。这个区别在短视频上不明显因为短视频只有十几帧画面好看基本就够用了。可一旦把生成长度拉到百帧以上问题就暴露了。我们在自己的模拟项目X上做过一个很典型的实验让模型生成一个室内场景的连续运动前30帧非常正常桌子、椅子、窗户的位置都对第50帧开始椅子边缘出现模糊的色块第80帧椅子直接消失第120帧墙面纹理完全变成另一套风格。这不是画质退化这是模型“忘记”了这个场景里有什么东西。普通生成器面对这种情况会怎么做它没有长期概念它只知道给定前面几帧预测下一帧。前面几帧正在显示一个空荡荡的墙角那下一帧最合理的预测就是继续空荡荡。而世界模型需要知道的是“这个墙角本来有把椅子它只是暂时被挡住了”。这种跨越几十帧的空间记忆恰恰是当前很多视频预测架构缺失的。1.2 短窗记忆的三宗罪漂移、重生、场景坍缩我们把自己模型踩过的坑归纳成了三个比较典型的失败模式这些现象在公开视频生成Demo里也经常能见到只是很多视频比较短不容易暴露。第一个是漂移。模型在预测几十帧之后物体的位置、形状、颜色会逐渐偏离真实状态。最典型的是颜色漂移一辆红色汽车在连续预测中慢慢变成紫红色再过几十帧变成蓝黑色。这不是生成器风格不稳定而是模型在逐帧自回归过程中把外观信息当成了可以丢弃的短期特征误差一步步累积最终完全失真。第二个是重生。某个物体在前面的帧中被遮挡或离开视野模型很快就会彻底忘记它的存在。但在某个偶然的帧里画面出现一块和该物体轮廓相似的纹理模型会突然把它“重新生成”出来仿佛这个物体从未消失过。我们内部管这个叫“幽灵物体复现”。这种问题在真实世界模型里很致命因为真实世界的准则是物体存在就是存在遮挡不会抹除它的物理状态。第三个是场景坍缩。这是最严重的一种整个场景的空间布局彻底错乱。比如第一个镜头是客厅沙发左边有落地灯右边有茶几。预测到一百帧左右落地灯突然出现在茶几上或者墙和地板的交界线开始扭曲。这说明模型已经放弃了维持全局空间结构转而只做局部纹理的平滑插值。场景坍缩的本质原因是模型没有把“空间坐标”和“内容特征”绑定存储每一帧都从零开始推测空间结构。1.3 长时空间记忆到底要解决什么看到这三个问题之后我们对“long-term spatial memory”这个提法有了更具体的理解它要解决的并不是生成质量而是状态保持。模型需要有一个独立于当前帧之外的存储结构持续记录场景中关键实体的空间位置、外观特征和存在状态并且能在后续生成中主动读取这段记忆来约束当前帧的内容。这和我们人类理解一个房间的方式很像。你走进一个房间扫一眼就知道哪里有窗户、哪里有桌子即使你暂时背过身去也依然知道房间布局没变。视频世界模型缺的就是这个“背过身去依然知道布局”的能力。普通注意力机制只能看到过去几十帧一旦物体离开注意力窗口它就从模型的世界里消失了。长时空间记忆要做的事情就是给模型一个“笔记本”把那些已经离开视线但依然存在的东西记下来。2. 长时空间记忆机制拆解我们的结构假设2.1 记忆库与空间锚点的设计逻辑论文标题只给了方向没有给具体结构所以我们结合自己的经验设计了一套可落地的方案。整套机制包含三个核心组件空间锚点、记忆库、读写控制器。空间锚点的作用是为记忆提供位置参照系。我们不用绝对坐标因为视频里的相机可能在运动绝对坐标没有意义。我们用的是归一化的图像坐标加相机位姿嵌入也就是把每一帧里的空间位置映射到一个统一的“场景坐标系”中。某个物体第一次被注意到时我们会计算它在场景坐标系中的位置这个位置连同它的视觉特征一起存入记忆库。记忆库本身是一个固定大小的槽位集合每个槽位存储两部分信息位置编码和内容编码。位置编码告诉模型“这个东西在哪”内容编码告诉模型“这个东西长什么样”。槽位的数量是超参数我们试过32、64、128、256后面会详细说差异。读写控制器负责两个动作。写操作发生在模型观察到新信息时如果当前帧里出现了记忆库中没有的实体就分配一个新槽位如果已有实体发生了位置或外观变化就更新对应槽位。读操作发生在生成下一帧时模型先根据当前帧特征在记忆库中检索最相关的若干槽位把检索到的记忆作为额外输入注入生成过程。2.2 记忆库与注意力机制的整合方式把记忆库塞进Transformer有两种常见路线我们两种都试了这里分别说下感受。第一种是把记忆库当作额外的KV Cache。在生成每一帧时不仅把当前帧之前的token放入注意力还把检索到的记忆槽位也拼接到KV序列里。这种做法的好处是工程改动小记忆信息可以直接参与注意力计算坏处是记忆token会随着检索数量增加而显著拉长序列显存压力上升很快。我们在最开始的版本里每个token检索16个记忆槽每个槽1个token序列长度瞬间多了16倍训练速度直接砍了一半以上。第二种是把记忆库当作一个独立的交叉注意力源。生成器的主干注意力仍然只关注当前片段内的token但在每个Transformer层后面额外加一个交叉注意力层专门从记忆库中读取信息。这种做法的好处是计算量可控而且可以灵活控制记忆读取量坏处是需要多设计一套注意力参数训练难度更高。我们最终采用的是第二种路线把交叉注意力限制在每个解码层的后半部分这样主干网络的预训练权重可以直接复用。关于读取策略我们用的是一个轻量级检索头把当前帧全局平均池化后的特征作为查询向量和记忆库中所有槽位做点积相似度取Top-K个槽位作为交叉注意力的Key和Value。这个策略看起来简单但实际效果比复杂的可学习查询要好因为视频帧和记忆槽之间的匹配本质上是近邻检索复杂映射反而容易过拟合。2.3 训练中的两阶段课程法端到端直接训练长时记忆模型非常容易崩我们试过几次损失在早期就陷入震荡。后来采用的方案是两阶段课程训练。第一阶段是短片段热启动。我们从数据集里随机裁剪16帧长度的片段用普通的自回归方式训练。这个阶段记忆库的读写控制器是冻结的不参与梯度更新。模型只学习基本的视频预测能力确保它先能把短视频生成好。这一步大概需要训练到验证损失进入平台期。第二阶段才放开记忆模块。我们在训练时把片段长度从16帧逐步拉长到64帧、128帧、甚至256帧。同时不再随机裁剪片段起点而是从完整视频的开头连续截取这样模型才能观察到长序列中的状态变化。课程长度的提升不能太激进我们一般每5000步增加16帧否则模型又会在长序列上崩掉。3. 从零搭建一个小型验证系统3.1 主干选型自回归token化还是扩散采样做视频世界模型主干有两种主流选择自回归Transformer和扩散模型。我们最终选了自回归方案理由很实际长时空间记忆需要精确的token级状态读写自回归的离散token结构天然适合和记忆槽交互扩散模型虽然生成质量更细腻但它的迭代采样过程和显式记忆检索的配合要复杂得多。视频token化我们用的是三维因果量化编码器。这个编码器把一段视频在时间和空间上都压缩成离散token因果是指每一帧的token只依赖之前的帧不依赖未来的帧。我们用的压缩倍率是时间4倍、空间8倍也就是说一个16帧的片段会被压缩成4个时间步的token序列。每一帧的视觉内容会被编码成若干个空间token记忆槽存储的就是这些空间token的聚类中心以及它们对应的位置编码。3.2 记忆模块的关键实现细节下面给出一段简化版伪代码它展示了记忆库读写最核心的逻辑实际项目中我们在这个基础上还加了位置归一化和掩码处理import torch import torch.nn as nn import torch.nn.functional as F class SpatialMemoryBank(nn.Module): def __init__(self, num_slots128, d_model768, topk16): super().__init__() # 可学习的槽位初始向量避免训练初期写操作不稳定 self.slots nn.Parameter(torch.randn(num_slots, d_model) * 0.02) # 每个槽位额外存一个位置编码向量记录该实体的空间坐标 self.slot_positions nn.Parameter(torch.randn(num_slots, 4) * 0.01) self.topk topk self.write_gate nn.Linear(d_model * 2, d_model) self.read_proj nn.Linear(d_model, d_model) def write(self, feat, position, update_maskNone): # feat: [B, L, D] 当前帧的视觉特征 # position: [B, L, 4] 归一化空间坐标 (x, y, scale, visibility) # 将当前特征与槽位做相似度匹配找到最近槽位做更新 sim torch.einsum(bld,nd-bln, feat, self.slots.detach()) idx sim.argmax(dim-1) # [B, L] # 门控更新 g torch.sigmoid(self.write_gate(torch.cat([feat, self.slots[idx]], dim-1))) new_slot g * feat (1 - g) * self.slots[idx].detach() self.slots[idx] new_slot.detach() new_slot # 简化示意实际用copy_ if update_mask is not None: self.slots[idx] torch.where(update_mask[..., None] 0, new_slot, self.slots[idx]) def read(self, query, topkNone): topk topk or self.topk q self.read_proj(query.mean(dim1)) # [B, D] sim torch.einsum(bd,nd-bn, q, self.slots) values, indices sim.topk(topk, dim-1) # 返回检索到的槽位内容作为交叉注意力的KV mem self.slots[indices] # [B, topk, D] return mem, values这个实现里最需要注意的一点是写入时对槽位的梯度处理。我们不希望整个记忆库的槽位向量都随每一帧剧烈变化所以计算相似度时用的是detach后的槽位更新时也通过门控来控制写入强度。否则训练初期模型会频繁重写记忆导致记忆库里的内容一直在抖动根本无法收敛。3.3 评测指标怎么定只盯着FVD这一个指标是不够的。FVD衡量的是生成帧和真实帧在特征空间的距离它能反映画质和整体分布但完全无法体现物体是否在长序列中保持存在。我们自己的评测体系里加了三个更针对性的指标。第一个是物体恒存性。我们在视频前30帧标注出某个物体的位置然后要求模型在后续帧中预测时即使该物体被遮挡或移出画面在它应该出现的位置依然保留相应的语义特征。这个指标我们是用分割模型对每一帧生成掩码计算被遮挡物体对应区域的类别置信度是否保持在一个阈值之上。第二个是空间关系一致性。我们在每20帧采样一组关键点任意两两之间的距离在序列中应该保持相对稳定。如果模型的空间感崩溃这些距离会大幅跳动所以用距离波动幅度就可以衡量空间结构是否被长期维持。第三个是记忆利用率。我们把模型在生成过程中所有检索到的记忆槽位记录下来看它们的分布是否集中在少数高频槽位。如果利用率过低说明记忆库形同虚设模型实际上还是在作弊全靠主干网络的短期注意力硬撑。4. 实测结果与消融实验4.1 长序列生成的主观结果对比我们的对比实验非常直接同一个主干网络一组加记忆模块一组不加统一生成200帧连续画面。结果显示在最初的40帧里两者差别不大不加记忆的版本甚至在某些片段上纹理更锐利。但从第60帧开始差距变得明显。不加记忆的版本在60帧后开始出现我们前面提过的重生现象一个在第45帧移出画面的杯子在第78帧突然重新出现在茶几上而且位置明显偏移。到第120帧场景已经开始坍缩整个房间的透视关系变得不合理。加了记忆模块的版本在第60帧之后依然能稳定输出杯子的存在状态即使它一直处于画外模型也能在交叉注意力中读到对应的槽位并在下一次物体回到画面时恢复它的位置和外观。有一个画面让我印象很深。生成到第150帧时视角旋转后重新对准一开始的墙面加了记忆的版本能正确重建墙面上的挂画位置不加记忆的版本在这里生成了一面完全空白的新墙。差异的本质在于前者知道墙上有画它只是短暂看不见了后者不确定墙上有画所以选择了一个视觉上最“安全”的预测——空白。4.2 记忆库容量和检索数量对性能的影响我们做了一组消融变量是记忆库槽位数量和每次检索的Top-K值。结果如下槽位数Top-K200帧FVD物体恒存性空间关系误差328152.60.710.24648128.30.790.1812816113.80.860.1425616117.90.820.1725632149.20.740.2951232187.30.690.35从表格可以清楚看出记忆容量不是越大越好。我们在128个槽位、Top-K为16时拿到最好效果继续增加槽位数量反而导致性能全面下降。一开始我们以为是显存不够导致训练不充分后来分析发现是检索噪声问题槽位太多时相似度匹配容易找到语义相近但位置完全不相干的记忆交叉注意力会被这些无关信息干扰。这个现象还和场景复杂度有关。在我们用的室内场景数据集上一个场景里的主体物体通常不会超过50个128个槽位已经留出了足够冗余。如果是大型开放场景比如城市街道或者自然景观实体数量会更多合适的槽位数可能需要重新标定。这个参数应该根据实际场景的实体密度来定而不是一味往大了调。4.3 一个反直觉的观察更长的记忆并不总是更好这里有个值得展开的结论。我们原本以为记忆窗口拉得越长越好毕竟“长期记忆”看起来意味着“永不忘记”。但实验证明如果模型把所有历史帧的信息都存进记忆库效果反而变差。原因在于记忆库的更新存在两个矛盾。一方面场景里的光照会随时间变化同一个物体在早晚不同时刻的视觉特征差异很大如果记忆库持续接收新特征槽位会被逐渐污染最终得到一个“四不像”的平均特征。另一方面某些物体在场景中的状态确实会变比如椅子被移动了位置如果记忆库不强制更新模型就会一直沿用旧的坐标。所以“记忆”和“遗忘”需要有一个动态平衡。我们的解决方案是给槽位增加一个置信度机制。每个槽位记录了自己最近一次被更新的时间步当生成过程中检索到某个槽位时如果它的最后更新时间和当前时间步距离过远并且当前帧里出现了明显的同类别物体那么模型会更倾向于写入新信息。这种机制让记忆库既能保持长期稳定的实体又能对场景变化做出响应。5. 踩坑记录与工程细节5.1 空间锚点漂移记忆写歪了怎么发现这个坑花了我们将近一周时间。一开始我们信心满满地训练长序列版本结果发现物体恒存性指标不升反降而且模型生成的物体在画面中缓慢平移。后来我们把记忆库里的位置向量拉出来可视化才看到问题所在位置编码在训练过程中发生了系统性漂移原本应该集中在某个坐标区域的同类别物体其槽位位置逐渐扩散成一片模糊的区域。原因出在归一化方式上。我们最初把视频帧里的物体坐标直接除以图像宽高来归一化但模型输入的token是经过空间压缩的压缩比例在不同尺度下不一致导致坐标编码和特征编码之间出现尺度错配。记忆库在写入时使用了错误的尺度更新时又反复累积误差最终整个空间坐标系都歪掉了。修正方案是引入一个可学习的位置标定层。我们在把坐标嵌入送入记忆库之前先用一个两层MLP把原始归一化坐标映射到一个隐空间并且保留了一个全局的尺度向量来调节不同分辨率下的坐标范围。这个修正虽然增加了少量参数但彻底解决了锚点漂移的问题。如果你也要做类似模块建议第一时间检查位置编码的尺度一致性。5.2 检索训练不收敛从“先冻结记忆网络”开始端到端训练记忆模块最让人崩溃的阶段出现在第二阶段刚放开时。模型的主干网络已经预训练完毕能生成很好的短片段一打开记忆读取之后损失反而急剧上升而且长时间不回落。我们试过调低学习率、增加梯度裁剪、更换优化器都没效果。后来我们把每个模块的梯度逐一可视化发现问题是记忆库的写入操作过于频繁导致槽位在训练早期不断被冲掉重写主干网络根本无法稳定读取到一致的记忆。最后采用了一个非常朴素但有效的策略先冻结记忆库槽位的更新只训练读写控制器和检索头让模型先学会“如何使用记忆”再解锁槽位的训练。具体做法是把write函数中的槽位更新操作换成smooth_l1损失作用于槽位和输入特征之间但不把梯度传入槽位本身。相当于把记忆库当作一个固定字典模型先学会在字典中查找和组合信息等检索行为稳定之后再允许槽位跟着数据调整。这个策略让我们的损失在几千步内回到了正常下降轨道。5.3 训练时长与显存规划长时空间记忆模型对显存的要求比普通视频预测模型高不少主要原因是第二阶段序列长度长而且记忆模块引入了额外的交叉注意力层。我们的实验配置大概是这样的主干Transformer是3亿参数视频编码器1亿参数记忆模块3800万参数序列长度从128帧开始训练每帧token数在256左右。这个规模在我们用的单机8卡环境下每卡显存占用稳定在70GB左右。如果显存吃紧有几个可行的调整方向。第一是打开梯度检查点把Transformer层的激活值全部重算显存占用能降一半但训练时间会乘以一点五。第二是限制检索数量Top-K从16降到8交叉注意力的KV长度立刻减半。第三是采用混合精度训练记忆库里的槽位向量保持fp32精度其余参数用bf16这个组合在我们实验里既稳定又省显存。时间方面两阶段加起来约需要3000个GPU时。第一阶段短片段训练在单卡上大约两天收敛第二阶段长序列训练需要双卡并行跑一周多。如果你想快速验证思路建议先把第二阶段的最大序列长度控制在64帧这样在8卡环境上一个晚上就能跑出趋势性结果。6. 现阶段我们的一点判断6.1 从“记忆库”到“记忆预测”这次复现让我对长时空间记忆有了更深的理解。记忆不应该只是存储历史更合理的形态是存储“世界状态的预测”。也就是说模型不仅要记住物体现在在哪还要记住它下一刻可能移动到哪这样才能真正支撑长时间的物理推演。我们下一步打算把记忆库改成两层结构一层是当前记忆存的是当前帧里观测到的实体状态另一层是预测记忆存的是模型已经推理出的未来几帧的实体状态。预测记忆由模型的前向传播写入每过一段时间把预测记忆中的一部分转正到当前记忆。这个方案还在早期阶段但我觉得它比单纯扩大记忆容量更能解决长时一致性问题。6.2 哪些应用场景真正需要长时空间记忆如果你只是做几秒钟的短视频特效或者图像到视频的动画生成长时空间记忆可能没什么用因为这些任务不要求模型维持一个稳定的世界状态。真正需要这个能力的是接管类应用比如机器人视觉预测、自动驾驶场景推演、交互式环境模拟器。这类场景里模型必须理解“物体一直在那里只是暂时看不到”而这恰恰是当前很多生成模型最薄弱的地方。从工程角度说把长时空间记忆模块接入现有视频生成框架的改动量并不大。主体架构可以保持不变只需要在解码器一侧增加一个记忆库和交叉注意力层再配合两阶段训练策略就能跑通。分享这些踩坑过程是希望后来者能少走一些弯路。如果你也在尝试类似方案或者已经用别的方式解决了视频模型长期记忆的问题欢迎在评论里交流。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询