视频生成的表示与注意力#
本页内容4 个部分
1. 视频生成的核心挑战#
1.1 从图像到视频:多了一个时间轴#
图像生成处理的是 2D 空间 ,视频生成要处理 3D 时空 。这个额外的时间维度带来了一系列根本性挑战:
挑战 1:时间一致性#
相邻帧之间必须视觉连贯。人的感知对时间闪烁(flickering)极其敏感——即使单帧质量很高,如果帧间不一致,视频看起来也会很差。这要求模型不仅理解"一帧该长什么样",还要理解"下一帧该怎么变"。
挑战 2:计算量爆炸#
具体数字感受
图像 latent: 个元素
视频 latent(16帧,无时间压缩): 个元素 → 16 倍
如果做 full 3D self-attention: → 比单帧的 大了 4000 倍
挑战 3:运动建模#
模型需要学习物理世界的运动规律:物体运动的惯性、遮挡与出现、光影变化、相机运动等。这远比学习静态图像的纹理和构图复杂。
挑战 4:长视频一致性#
2-4 秒的短视频相对容易,但生成 10 秒以上的长视频时,场景一致性、角色身份保持、动作连贯性都会随时间累积退化。
挑战 5:训练数据稀缺#
高质量图像数据集有数十亿张(LAION-5B),但高质量视频-文本配对数据远少于此。且视频标注成本更高(需要描述动态过程,不只是静态内容)。
1.2 维度对比#
| 维度 | 图像生成 | 视频生成 |
|---|---|---|
| 数据形状 | ||
| Latent 形状 | ||
| 典型大小 | (短视频) | |
| Token 数(p=2) | 256 | 4096(无时间压缩) |
| 条件信号 | 文本 | 文本 + 首帧 + 运动描述 |
| 评估维度 | FID, CLIP Score | FVD, 时间一致性, 运动质量 |
2. 3D VAE:视频的压缩#
2.1 从 2D VAE 到 3D VAE#
图像生成中,VAE 使用 2D 卷积对空间进行压缩(如 SD 的 VAE 做 8× 空间降采样)。视频生成需要同时压缩空间 + 时间,所以使用 3D 卷积。
压缩率具体计算#
压缩示例
输入视频:16 帧 × 256×256 × 3 通道 = 个值
空间压缩 8×:(每边缩小 8 倍)
时间压缩 4×:(每 4 帧压缩成 1 帧)
通道数:3 → 4(latent 通道)
输出 latent: 个值
总压缩倍数: 倍!
= 时间压缩率, = 空间压缩率, = latent 通道数
2.2 Causal 3D VAE#
普通 3D 卷积在时间方向上既看过去帧也看未来帧。但在实际应用中(如自回归生成、流式推理),我们希望当前帧的 latent 只依赖当前帧和过去帧。这就是 Causal(因果)3D VAE。
实现方式:在时间方向的卷积使用因果 padding——只在"过去"方向 pad,不在"未来"方向 pad。类似 NLP 中 Causal Attention 的思想。
# Causal 3D 卷积示意
# 普通 3D 卷积 (kernel_t=3): 看 [t-1, t, t+1]
# Causal 3D 卷积 (kernel_t=3): 只看 [t-2, t-1, t]
class CausalConv3d(nn.Module):
def __init__(self, in_ch, out_ch, kernel_t=3, kernel_s=3):
super().__init__()
self.pad_t = kernel_t - 1 # 只在过去方向 pad
self.pad_s = kernel_s // 2 # 空间方向对称 pad
self.conv = nn.Conv3d(in_ch, out_ch,
kernel_size=(kernel_t, kernel_s, kernel_s),
padding=(0, self.pad_s, self.pad_s))
def forward(self, x):
# x: [B, C, T, H, W]
x = F.pad(x, (0,0, 0,0, self.pad_t, 0)) # 时间维只在前面 pad
return self.conv(x)
2.3 主流视频模型的 3D VAE 设计#
| 模型 | 空间压缩 | 时间压缩 | Latent 通道 | Causal |
|---|---|---|---|---|
| CogVideoX | 8 | 4 | 16 | 是 |
| HunyuanVideo | 8 | 4 | 16 | 是 |
| Open-Sora | 8 | 4 | 4 | 否 |
| Sora(推测) | 8 | ~4 | 未公开 | 未知 |
**面试关键点:**3D VAE 的核心价值是把视频的计算量从"不可能"降到"可行"。没有 256× 的压缩,在 latent space 做扩散模型是不现实的。Causal 设计则让模型兼容自回归式的长视频生成。
3. 视频 Attention:Full 3D vs Factorized#
3.1 两种方案#
视频 latent 是三维张量 ,对它做 self-attention 有两条路:
方案一:Full 3D Attention(当前主流)#
把所有帧所有位置的 token 展平成一个序列,直接做 self-attention,每个 token 可以 attend 到任意时刻任意位置,时空建模最完整。
为 patchify 后的空间分辨率
为什么现在主流都用 Full 3D?
早期顾虑是计算量太大:假设 16 帧、无时间压缩、每帧 256 个 spatial token,total = 4096,复杂度约 1678 万。但现代 3D VAE 时间压缩 4×、空间压缩 8×,token 数大幅下降。以 CogVideoX 为例(6秒×8fps=48帧,时间压缩4×后 12 帧 latent,spatial ~45×30=1350 tokens/帧):total ≈ 16200,配合 FlashAttention 在现代 GPU 上完全可行。
HunyuanVideo、CogVideoX、Wan2.1 均明确采用 Full 3D Attention,其论文中均指出时空一致性优于 Factorized 方案。
方案二:Factorized Attention(早期/轻量模型)#
将 3D attention 分解为两步交替——先做帧内 Spatial Attention,再做跨帧 Temporal Attention:
计算量对比(未压缩:16帧,16×16 spatial tokens)
Full 3D: 1678 万
Spatial: 105 万 | Temporal: 6.6 万
Factorized 合计:≈ 112 万,省约 15×。3D VAE 压缩率不足时的有效工程妥协,Open-Sora(STDiT)采用此方案。
# Factorized Attention 伪代码(Open-Sora 风格)
# x: [B, T, H', W', D]
# 1. Spatial Attention:每帧独立
x = rearrange(x, 'b t h w d -> (b t) (h w) d')
x = spatial_self_attn(x)
x = rearrange(x, '(b t) (h w) d -> b t h w d')
# 2. Temporal Attention:每个空间位置独立
x = rearrange(x, 'b t h w d -> (b h w) t d')
x = temporal_self_attn(x)
x = rearrange(x, '(b h w) t d -> b t h w d')
3.2 两种方案对比#
| Full 3D Attention | Factorized Attention | |
|---|---|---|
| 时空建模 | 完整,任意 token 互相可见 | 受限,帧间信息需多层传播 |
| 视频一致性 | 更好 | 略差 |
| 计算量 | ,比例取决于 T 与空间 token 数 | |
| 前提 | 需要强力 3D VAE 压缩 token 数 | 可在较大 token 数下使用 |
| 代表模型 | HunyuanVideo、CogVideoX、Wan2.1 | Open-Sora(STDiT) |
| 趋势 | ✅ 当前主流 | 逐渐退出头部模型 |
**面试关键点:**Factorized Attention 是早期 3D VAE 压缩率不足时的工程妥协。现代头部模型的 3D VAE 已将 token 数压缩到 Full 3D 可承受范围,因此普遍回归 Full 3D,以获得更好的时空一致性。
类比:Factorized attention 类似"先在每个班级内讨论(spatial),再选代表跨班交流(temporal)",Full 3D attention 是"所有学生一起开大会"。大会虽然信息更全面,但成本太高。
3.3 位置编码的适配#
视频 Transformer 需要同时编码空间和时间位置。常见做法:
- 分离式:空间位置编码 + 时间位置编码,分别加到 token 上
- 3D RoPE:将旋转位置编码扩展到 3D。做法是把 Q/K 的 维特征沿 channel 方向切成三段,前段用 驱动旋转、中段用 、后段用 —— 每段分别套标准 1D RoPE,位置信息写进 Q/K 的不同频道里。注意"三个维度"指的是原视频网格的三个坐标轴,不是在几何空间转方向:每个 token 的 Q/K 仍然是一个 维向量,rotation 只发生在 channel 维的 2D pair 上。HunyuanVideo 和 CogVideoX 都采用了这种方式
- 3D sinusoidal:对 三个坐标分别做 sinusoidal 编码后拼接
分别作用在 维向量的三个不相交 channel 段上,三个坐标轴各管一段
D → 2D → 3D RoPE 完整推导#
Step 1:1D RoPE(NLP 原版)
对位置 处的 token,把 Q/K 向量的每对维度 旋转角度 。旋转频率随维度索引 单调递减:低维( 小)频率高、转得快,对相邻 token 的位置差异敏感,捕捉局部细粒度关系;高维( 大)频率低、转得慢,只有相距很远的 token 才产生明显的角度差,捕捉全局粗粒度关系。整体是一种多尺度的位置编码,类似时钟的秒针(低维)和时针(高维)分工合作。
数值例子:,位置 ,
第 0 对 (q₀,q₁),i=0:θ₀ = 3/10000⁰ = 3 rad
q₀' = cos(3) ≈ -0.990, q₁' = sin(3) ≈ 0.141
第 1 对 (q₂,q₃),i=1:θ₁ = 3/10000^(2/4) = 0.03 rad
q₂' = cos(0.03) ≈ 0.9996, q₃' = sin(0.03) ≈ 0.030
旋转后:q_rope = [-0.990, 0.141, 0.9996, 0.030]
关键性质:点积只依赖相对位置
两个 token 位置 、,其 Q·K 点积中第 对的贡献为:
与绝对位置无关,只和相对距离 有关。
Step 2:2D RoPE(图像/ViT)
图像 token 有两个坐标 ,把 维切成两半,分别由 和 负责旋转:
维度 [0, D/2) ← 由 h 旋转
维度 [D/2, D) ← 由 w 旋转
数值例子:,token 位置 ,
维度 (0,1) ← h=2:θ = 2 rad
q₀' = cos(2) ≈ -0.416, q₁' = sin(2) ≈ 0.909
维度 (2,3) ← w=3:θ = 3 rad
q₂' = cos(3) ≈ -0.990, q₃' = sin(3) ≈ 0.141
旋转后:q_rope = [-0.416, 0.909, -0.990, 0.141]
验证:token A vs token B :
h 段:cos(2-2) = cos(0) = 1.000 ← 高度相同,满分
w 段:cos(3-5) = cos(-2) ≈ -0.416 ← 宽度相差 2,衰减
Q_A · K_B ≈ 1.000 + (-0.416) = 0.584
Step 3:3D RoPE(视频)
视频 token 有三个坐标 ,把 维切成三段:
维度 [0, D_t) ← 由 t 旋转
维度 [D_t, D_t+D_h) ← 由 h 旋转
维度 [D_t+D_h, D) ← 由 w 旋转
数值例子:,,token 位置 ,
维度 (0,1) ← t=1:θ = 1 rad
q₀' = cos(1) ≈ 0.540, q₁' = sin(1) ≈ 0.841
维度 (2,3) ← h=2:θ = 2 rad
q₂' = cos(2) ≈ -0.416, q₃' = sin(2) ≈ 0.909
维度 (4,5) ← w=3:θ = 3 rad
q₄' = cos(3) ≈ -0.990, q₅' = sin(3) ≈ 0.141
旋转后:q_rope = [0.540, 0.841, -0.416, 0.909, -0.990, 0.141]
验证:token A vs token B :
t 段:cos(1-1) = cos(0) = 1.000 ← 时间相同
h 段:cos(2-2) = cos(0) = 1.000 ← 高度相同
w 段:cos(3-5) = cos(-2) ≈ -0.416 ← 宽度相差 2
Q_A · K_B ≈ 1.000 + 1.000 - 0.416 = 1.584
若 token C 与 A 完全相同位置 (t=1,h=2,w=3):
Q_A · K_C = cos(0)+cos(0)+cos(0) = 3.0 ← 最大值
三者对比
| 版本 | 坐标数 | 维度分割 | 额外参数 |
|---|---|---|---|
| 1D RoPE | 全部 维统一旋转 | 0 | |
| 2D RoPE | 切两半,各段独立旋转 | 0 | |
| 3D RoPE | 切三段,各段独立旋转 | 0 |
核心思想不变:不同坐标占据不同维度段,各自独立旋转,Q·K 点积天然反映多维相对位置,且无需任何额外参数。
4. 视频模型:按具体版本比较#
以下保留可以追溯到官方公开模型的架构例子,不把演示时长、后处理分辨率或排行榜宣传当成统一能力上限。显存还取决于 dtype、offload、分辨率、帧数和 batch。
| 版本 | 已公开的要点 | 一手资料 |
|---|---|---|
| Wan2.1 | 包含 1.3B / 14B 等版本;配置与任务分别核对 | 论文 |
| Wan2.2 A14B | 高/低噪声专家设计;另有 TI2V-5B,不能混用两者 VAE 与显存规格 | 官方仓库 |
| HunyuanVideo 1.5 | 8.3B 参数;不是初代 HunyuanVideo 的 13B | 技术报告 |
| CogVideoX | 2B / 5B 与 1.5 等版本有不同分辨率、帧率和推理配置 | 官方仓库 |
闭源产品没有公开的参数量、训练目标或内部结构,不应由前代报告或行业惯例补全。开源与闭源质量也不能凭单一 VBench 分数概括为“全面追平”;需固定评测版本、提示词、采样设置和人工偏好协议。
4.1 评估指标#
- FVD (Fréchet Video Distance):类似图像的 FID,用预训练视频模型(如 I3D)提取特征,计算生成视频和真实视频特征分布的距离。越低越好。
- CLIPSIM:用 CLIP 计算生成视频帧和文本描述的相似度,衡量文本对齐程度。
- 时间一致性分数:计算相邻帧的 CLIP 特征相似度或光流一致性。
- 人工评估:目前最可靠的方式,包括视觉质量、运动自然度、文本相关性、时间一致性四个维度。