前置知识: 生成式AI

视频生成

00:00
10 min Advanced

从图像扩散到视频扩散,时空建模与Sora架构的核心原理

视频生成

图像扩散在 2022 年解决了照片级真实感问题。视频扩散在 2024 年解决了同样的问题,只是多了一个时间维度。那一个维度改变了所有:内存(帧 × 像素 × 步骤),一致性(对象必须跨帧持续存在),和运动(物理必须看起来正确)。Sora, Veo, Kling, Runway 都运行在相同的配方上——时空 DiT + 流匹配——只是规模不同。

类型: 学习 语言: Python 前置知识: Phase 8 · 07 (潜扩散), Phase 8 · 13 (流匹配) 时间: ~60 分钟

问题

视频是帧序列。朴素方法:独立生成每帧。结果:闪烁,无时间一致性,对象出现又消失。你需要一个在所有帧上联合操作的模型,使得 (a) 对象跨帧持续存在,(b) 运动遵循物理,(c) 相机运动一致。

挑战是规模。一个 16 帧 512×512 的视频有 16 × 786k ≈ 12.6M 像素。一个 60 秒 1080p 视频有约 1.9B 像素。在像素空间中运行扩散是不可行的。所有生产视频模型都在压缩的时空潜空间中运行。

核心概念

时空潜变量。 2D VAE 压缩空间维度。视频 VAE 额外压缩时间维度。Sora 的时空 patch tokenizer 将 2 秒 512×512 视频压缩为约 4000 个 token。WAN VAE (Wide-Angle Network) 将 14 帧 480p 压缩为 60×90×16 潜变量。

时空 DiT。 与图像 DiT 相同的架构,但 patch 现在是 3D(时间 × 高度 × 宽度)。自注意力在所有 patch 上操作,自然混合时间和空间信息。这就是 Sora 的架构:一个在视频 patch token 上运行的 transformer。

时间注意力。 替代方案:使用 2D DiT 但在每个块中添加时间注意力层。空间自注意力处理每帧,时间自注意力跨帧混合。更便宜但表达能力较差。

帧预测 vs 并行生成。 两种范式:

  1. 并行生成。 一次生成所有帧。Sora, Veo, Kling 使用这种方式。优点:全局一致性。缺点:内存与帧数成线性增长。
  2. 自回归帧预测。 一次生成几帧,以之前的帧为条件。优点:任意长度。缺点:误差累积,长视频漂移。

流匹配训练。 大多数 2024-2026 视频模型使用流匹配而非 DDPM,因为 (a) 更直的采样路径意味着更少步数,(b) 更容易条件化初始帧。

Sora 架构 (推测)

OpenAI 没有发布 Sora 的完整架构,但来自论文和逆向工程的关键事实:

  • 时空 patch tokenizer。 视频被分割为 3D patch(例如 2 帧 × 16×16 像素),每个 patch 变成一个 token。
  • Diffusion Transformer。 标准 DiT 架构处理 token 序列。文本条件通过交叉注意力注入。
  • 流匹配。 训练使用整流流(直线路径),不是 DDPM。
  • 可变分辨率和时长。 patch tokenizer 使模型自然处理不同分辨率和帧数——不需要固定网格。
  • 训练数据。 估计数百万小时的视频,加上文本描述。

动手构建

code/main.py 实现了一个玩具 1-D “视频”扩散模型,其中”帧”是 1-D 向量序列,时间一致性通过帧间注意力强制执行。

步骤 1:时空 patch 嵌入

def embed_spacetime(frames, patch_size):
    tokens = []
    for t, frame in enumerate(frames):
        for i in range(0, len(frame), patch_size):
            patch = frame[i:i+patch_size]
            tokens.append([t, i] + patch)  # time + space + content
    return tokens

步骤 2:时间注意力

def temporal_attention(tokens, n_frames):
    # Group tokens by spatial position, attend across time
    for spatial_pos in range(n_spatial_positions):
        frame_tokens = [tokens[f * n_spatial + spatial_pos] for f in range(n_frames)]
        attended = self_attention(frame_tokens)
        for f in range(n_frames):
            tokens[f * n_spatial + spatial_pos] = attended[f]
    return tokens

步骤 3:条件化首帧

def condition_on_first_frame(z_t, first_frame, tau):
    # Replace first frame's latent with noised version of real first frame
    z_t[0] = noise_to_step(first_frame, tau)
    return z_t

常见陷阱

  • 时间闪烁。 帧间不一致导致闪烁。修复:更强的时间注意力,更大的时间感受野,时间损失项。
  • 对象漂移。 对象在帧间变形或消失。修复:跨帧对象追踪约束,或自回归条件化。
  • 运动不自然。 物理不正确的运动。修复:在更多样化的运动数据上训练,或添加运动损失。
  • 内存爆炸。 长视频超出 GPU 内存。修复:分块处理,梯度检查点,或帧并行训练。
  • 长视频退化。 自回归模型在长序列上漂移。修复:定期重新条件化关键帧,或使用滑动窗口。
  • 文本-视频不对齐。 模型忽略提示的某些部分。修复:更强文本条件化(T5-XXL),时间文本注意力。

实际应用

2026 年视频生成技术栈:

模型提供方分辨率时长步骤
SoraOpenAI1080p60s流匹配
Veo 2Google1080p60s+流匹配
Kling 1.5Kuaishou1080p10s扩散
Runway Gen-3Runway1080p10s扩散
CogVideoXZhipu720p6sDiT
Open-Sora 1.2HPC-AI Tech512p16sDiT
HunyuanVideoTencent720p5sDiT

交付物

保存 outputs/skill-video-generator.md。技能接收视频生成需求(分辨率、时长、风格、条件化),输出:模型选择、推理配置、内存预算和后处理步骤。

练习

  1. 简单。 运行 code/main.py,观察有和没有时间注意力的帧间一致性差异。测量相邻帧之间的 L2 距离。
  2. 中等。 实现首帧条件化:给定真实第一帧,生成后续帧。比较条件化 vs 非条件化生成的时间一致性。
  3. 困难。 实现简单的自回归视频生成:一次生成 4 帧,以之前的 4 帧为条件。测量 16 帧序列上的误差累积。

关键术语

术语人们怎么说实际含义
时空 DiT”3D DiT”在 3D patch(时间 × 空间)上操作的 Diffusion Transformer。
时间注意力”帧间注意力”跨帧自注意力,确保时间一致性。
时空 VAE”视频编码器”同时压缩空间和时间维度的 VAE。
Patch tokenizer”视频 tokenizer”将视频分割为 3D patch 并嵌入token
预测”自回归视频”一次生成几帧,以之前的帧为条件
匹配”直线采样”训练直线路径的采样轨迹,比 DDPM 更少步数。

生产笔记:视频推理的内存墙

视频推理的内存需求图像的帧数倍。一个 16 帧 512² 视频在 SDXL 潜空间中需要 16 × 128 × 128 × 4 = 16M变量元素。DiT 的自注意力在所有 token操作——O(N²) 内存,其中 N = 帧数 × 空间 token 数。

实际后果:

  • 注意力。token 分成空间-时间块,在内做注意力,间用线性注意力。将 O(N²) 减少到 O(N × K)。
  • 梯度检查 训练时不在内存中保存中间激活,而是重新计算。内存减少 3-4 倍,训练时间增加 20-30%。
  • 并行推理。 将帧分配个 GPU。每个 GPU 处理部分帧,通过 all-to-all 通信交换时间注意力结果

延伸阅读

知识检测

学习进度

-- 已学文档
--% 知识覆盖率

学习推荐

专注模式