video中的memory kv cache

注:仅供自己记录学习所用

先把 KV cache 和 memory KV cache 分开理解。它没有神秘的新"memory 模块",核心就是:

把过去视频 chunk 在 Transformer Self-Attention 中产生的 K、V 保存下来,让后续生成的 chunk 可以直接 attention 到过去。

ReMind更进一步,把这个普通 KV cache 训练成可以主动检索较早历史状态的 dynamic memory。论文自己也明确说:每个生成 chunk 把自己的 keys/values 写进 KV cache,后续 chunk 再读取。

1. 先理解:视频里的 KV cache 到底是什么?

假设 autoregressive video 一次生成一个 chunk:

复制代码
Chunk 0 → Chunk 1 → Chunk 2 → Chunk 3 → Chunk 4 → ...

每个 DiT Block 都有 Self-Attention:

正常 attention 是:

问题来了:生成 Chunk 4 时,需要利用 Chunk 0~3。

最笨的方法是把:

复制代码
Chunk 0
Chunk 1
Chunk 2
Chunk 3
Chunk 4

全部重新送进 DiT,再把前面的 K/V 全算一遍。

但前面 Chunk 0~3 的 K/V 之前已经算过了。

所以直接缓存:

复制代码
KV Cache
┌──────────────────────────────┐
│ Chunk 0 : K0, V0             │
│ Chunk 1 : K1, V1             │
│ Chunk 2 : K2, V2             │
│ Chunk 3 : K3, V3             │
└──────────────────────────────┘
                ↑
                │ attention
                │
Current Chunk 4 → Q4

于是 Chunk 4:

这就是 KV cache。

注意一个很重要的地方:

KV cache 不是保存 RGB 视频帧 ,而是保存过去视频 token 经过各层 attention projection 后得到的 Key / Value hidden representations。

而且通常是每个 DiT Block 都有自己的 KV cache:

复制代码
DiT Block 1 → KV cache 1
DiT Block 2 → KV cache 2
DiT Block 3 → KV cache 3
...
DiT Block N → KV cache N

所以说"每个 DiT block 都微调吗",和这里正好联系起来了:memory retrieval 本质上发生在各个 DiT block 的 self-attention 中。


2. 那为什么 KV cache 又被叫作 "memory"?

因为对于当前 Chunk 来说:

复制代码
当前 Chunk
   │
   │ Q
   ↓
Attention
 ↙ ↓ ↓ ↘
C0 C1 C2 C3
↑
过去的信息

过去 chunk 的 K/V 实际就构成了它的历史记忆。

比如:

复制代码
C0          C1          C2          C3          C4
杯子空 → 开始倒水 → 灯关闭 → 黑暗 → 灯重新打开

到了 C4:

复制代码
Q4
 ↓
查询历史 KV cache
 ↓
[K0,V0] [K1,V1] [K2,V2] [K3,V3]

理论上它可以重新找到:

C1 里面"杯子正在加水"的状态。

所以作者说,预训练 diffusion transformer 其实已经有保存历史的能力,问题不在"没有 memory",而在:

模型没有被训练好:什么时候应该访问哪个历史 K/V。

这就是 ReMind 的核心 motivation。 Xu 等 - 2026 - Teaching Video Ge...


3. 推理时 KV cache 是最容易理解的

假设每次生成 3 个 latent frames,也就是一个 chunk。

第一步:生成 C0

复制代码
C0
 ↓ DiT
K0,V0
 ↓
写入 Cache

现在:

复制代码
Cache = [K0,V0]

第二步:生成 C1

C1 的 Query 可以看:

复制代码
Q1
 ↓
[K0,V0] + [K1,V1]

生成完以后:

复制代码
Cache =
C0 : K0,V0
C1 : K1,V1

第三步:生成 C2

复制代码
Q2
 ↓
[K0,V0]
[K1,V1]
[K2,V2]

继续:

复制代码
Cache =
C0
C1
C2
...

论文说的 streaming KV cache 基本就是这个过程:generated chunk 把自己的 K/V 写入 cache,later chunks 再读取。 Xu 等 - 2026 - Teaching Video Ge...

所以推理阶段 KV cache 是真的"存起来再读取"。


4. 那训练的时候 KV cache 怎么回事?

这里最容易混乱。

训练时你已经有完整 GT video:

复制代码
GT:
C0 → C1 → C2 → C3 → C4 → C5

作者把训练改成 chunk-causal attention:

复制代码
C0 只能看 C0

C1 可以看
C0 C1

C2 可以看
C0 C1 C2

C3 可以看
C0 C1 C2 C3

也就是说:

论文明确说:

"We partition the latent video into chunks and train with chunk-causal attention."

而 all-history training 就是每个 chunk attend 所有 previous chunks,用来匹配 streaming inference 的路径。 Xu 等 - 2026 - Teaching Video Ge...

这里你可以先把训练理解成:

复制代码
GT C0
  ↓
得到 K0,V0
  ↓
GT C1 用它
  ↓
得到 K1,V1
  ↓
GT C2 用 K0,V0,K1,V1
  ↓
...

虽然工程实现上训练不一定真的像推理一样逐 chunk 一个一个慢慢跑 ,可以用 causal mask 并行实现,但逻辑效果是一样的:

当前 chunk 只能访问历史 chunk 的 K/V,不能偷看未来。


5. ReMind 真正特殊的地方来了

普通 KV cache 的问题是:

虽然 C0 一直存在 cache 里,但模型未必会去看 C0。

例如:

复制代码
C0      C1       C2       C3       C4       C5
杯子 → 倒水 → 黑暗 → 黑暗 → 黑暗 → 重新亮
 ↑                                      ↑
重要历史                                当前

普通模型可能:

复制代码
Q5 attention:

C0   C1   C2   C3   C4
↓    ↓    ↓    ↓    ↓
0.05 0.08 0.15 0.25 0.47
                     ↑
                 最近帧最大

这就是 recency bias。

所以虽然:

复制代码
C0/C1 的 KV 还在

但:

复制代码
模型不去 retrieve
≈
有记忆但不会回忆

ReMind Fig.5 正是在验证这个问题:Base model attention 主要集中在对角线附近,也就是偏向最近历史;ReMind 在 occlusion 后会明显重新 attention 到更早的 clean anchor。 Xu 等 - 2026 - Teaching Video Ge...


6. 所以 ReMind 训练时故意"逼它使用旧 KV"

例如原始视频:

复制代码
C0 → C1 → C2 → C3 → C4 → C5

作者故意把:

复制代码
C2 C3 C4

变成 interruption/noise:

复制代码
C0 → C1 → Noise → Noise → Noise → C5
      ↑                         ↑
  reliable anchor            recovery

现在预测 C5:

复制代码
最近历史:
C4 = noise
C3 = noise
C2 = noise

但是:
C1 = reliable state

模型如果继续只看最近 K/V:

复制代码
Q5 → K4/K3

就预测不好。

训练 loss 就会逼着 attention 学成:

复制代码
             ┌─────────────┐
Q5 ─────────→│ K1,V1       │
             └─────────────┘
                 ↑
            old anchor

这就是为什么论文说 node-drop / noisy-memory 会保留至少一个 event anchor,同时破坏中间历史,迫使模型从 surviving historical evidence 恢复。 Xu 等 - 2026 - Teaching Video Ge...


7. 这也是"KV cache"和"Memory KV cache"的本质区别

其实从数据结构上看,它们未必是两个东西:

复制代码
普通 Video AR:

过去 K/V
   ↓
KV Cache
   ↓
主要为了 causal generation + 避免重复计算

ReMind:

复制代码
过去 K/V
   ↓
同一个 Streaming KV Cache
   ↓
不仅当上下文
而且训练模型:
"哪个历史状态可靠,就回去 retrieve 哪个"
   ↓
Dynamic Memory

所以论文那句话非常重要:

"reconceptualizes the KV cache as dynamic memory"。 Xu 等 - 2026 - Teaching Video Ge...

不是:

复制代码
Wan KV Cache
      +
额外 Memory Bank

而更接近:

复制代码
Wan KV Cache
     ↓
通过特殊训练
     ↓
Dynamic Memory KV Cache

最后你可以用一句非常简单的话记住

推理:

前面 chunk 生成过的 K/V 留下来,后面 chunk 直接查询它们。

训练:

用 causal/chunk-causal 训练模拟这种"当前 chunk 只能读历史 K/V"的关系,并通过特殊的数据破坏方式,训练模型学会应该查询哪一段历史 KV。

ReMind 的创新点:

不是"发明 KV cache",而是把已有 KV cache 从一个偏向最近上下文的缓存 ,训练成一个能够检索远处可靠历史状态的动态记忆。

所以你可以把它类比成:KV cache 是硬盘里已经存着历史;ReMind 主要解决的是"检索策略"------什么时候不要看最近几帧,而应该翻回很久以前的可靠状态。 这个理解基本就抓住这篇论文了。

相关推荐
Cerman1 个月前
UEFI GOP driver基础协议解读
video·uefi·gop·edid·gfx
mengyuxuan2 个月前
在浏览器里做视频压缩,我踩的三个坑
video·compressor·compress
山顶夕景2 个月前
【全模态】音视频理解模型Audio-Visual Flamingo
音视频·video·vlm·多模态理解
mengyuxuan2 个月前
我写了个不用上传的浏览器视频压缩工具,顺便记一个坑了我小半天的 bug
video·compressor·private·compress
YMWM_3 个月前
video.preset的值为null和ultrafast的区别
linux·video
跟着珅聪学java10 个月前
HTML5 Video Controls 属性深度教程
video
core51210 个月前
[硬核解析] 从感知到交互:InternVideo 1/2/2.5 全系列架构演进与原理解析
架构·大模型·交互·视频·video·intern
davenian10 个月前
< Chrome Extension: Video DownloadHelper > 获得 Premium 权限 Ver10.0.271.2
chrome·edge·windows 11·video·downloadhelper
打小就很皮...10 个月前
React VideoPlay 组件封装与使用指南
前端·react.js·video