ViT × MEM Attention Playground
从数字出发,看懂
ViT 注意力与 MEM 视频编码器
这页把“传统 ViT 的空间注意力”和“MEM 的时间注意力”拆成最小可计算例子。
你可以直接改 token 数值,观察相似度、softmax 权重、最终输出向量如何变化。
Q / K / V
Scaled Dot-Product Attention
Spatial Attention
Temporal Attention
Memory-aware Token
Attention 公式
Attention(Q,K,V)
= softmax(QKᵀ / √d) V
在本页的玩具例子里:
Wq = Wk = Wv = I
因此 Q = K = V = X
最后你会看到:
当前 token → 融合同帧空间信息
当前 token → 融合历史时间信息
1. 先把核心概念压缩成一句话
普通 ViT
同一张图里,patch 互相看
当前帧 patch a 会关注当前帧里的 a、b、c...,得到带有空间上下文的表示。
MEM 时间注意力
同一个 patch 位置,跨时间看
当前帧的 aₜ 会关注过去的 aₜ₋₂、aₜ₋₁、aₜ,得到带有短期记忆的表示。
最后输出
只保留当前帧 token
历史帧 token 被压缩掉,但当前帧 token 已经吸收了过去视觉信息。
2. Attention 到底在算什么?
每个 token 都会变成三种角色:
Query
Q:我在找什么?
当前 token 发出的问题。例如:当前 patch aₜ 想知道应该从哪些 token 读取信息。
Key
K:我能被怎样匹配?
每个候选 token 提供“检索标签”,用来和 Query 做相似度比较。
Value
V:真正被汇总的内容
softmax 权重最终乘在 Value 上,产生新的 token 表示。
Score = Q · K / √d
Weights = softmax(Score)
Output = Σ(weightᵢ × Vᵢ)
3. 传统 ViT:单帧 Spatial Attention 的具体数字
我们只看当前帧的两个 patch:
输入 token
当前帧 t
aₜ = [1, 0],bₜ = [0, 1]
10
01
把它们排成矩阵 X,且令 Q = K = V = X。
计算过程
QKᵀ = [[1, 0],
[0, 1]]
QKᵀ / √2 ≈ [[0.707, 0],
[0, 0.707]]
对第一行 softmax,得到 aₜ 的注意力权重:
softmax([0.707, 0]) ≈ [0.67, 0.33]
最终:
aₜ' = 0.67·[1,0] + 0.33·[0,1] = [0.67, 0.33]
这说明 patch a 不再只保留自己,而是融合了一点同帧 patch b 的信息。
4. MEM:Temporal Attention 的具体数字
现在我们固定同一个空间位置 a,看它在 3 个时间点上的 token:
Query
当前 patch aₜ 发问
q = aₜ = [0.2, 0.8]
它会去看过去和现在的同位置 patch:aₜ₋₂、aₜ₋₁、aₜ。
分数
q·aₜ₋₂ = 0.2
q·aₜ₋₁ = 0.32
q·aₜ = 0.68
/ √2 后:
[0.141, 0.226, 0.481]
Softmax 权重
softmax([0.141, 0.226, 0.481])
≈ [0.29, 0.31, 0.40]
当前 aₜ 最关注自己,但也读取了前两帧的视觉记忆。
输出 token
aₜ' = 0.29·[1,0]
+ 0.31·[0.8,0.2]
+ 0.40·[0.2,0.8]
≈ [0.618, 0.382]
当前帧 token 变成了带历史记忆的视觉 token。
5. 交互实验:自己改数字,看 attention 如何变化
下面可以直接改三个时间点的 patch a 向量,然后查看当前 aₜ 对历史的注意力权重与输出。
6. 三种 attention 的区别,一张表收住
| 方法 |
当前 token 看谁 |
表达能力 |
计算代价 |
最终输出 |
| 普通单帧 ViT |
当前帧的所有 patch |
理解图像内部空间关系 |
O(n²) |
当前帧空间 token |
| Full Spatiotemporal Attention |
所有帧、所有 patch |
最强,但非常贵 |
O(K²n²) |
完整时空上下文 token |
| MEM Video Encoder |
先看同帧 patch,再看同位置历史 patch |
保留短期视觉记忆,同时控制成本 |
O(Kn² + nK²) |
只保留当前帧 token,但已吸收历史 |
7. 最后把 MEM 视频编码器的流程串起来
每帧 patchify
每张图像切成 patch token,和 ViT 一样。
Spatial Attention
每一帧内部 patch 互相看,提取空间关系。
Temporal Attention
同一 patch 位置沿时间方向看过去帧,融合短期视觉记忆。
丢弃过去帧 token
只保留当前帧 token;它们已经被注入历史信息。
送进 VLA Backbone
后续大模型看到的 token 数与单帧近似,但获得了短期 memory。