第 25 讲 · 视频生成与理解 · Video Generation and Understanding

Generative AI · Lecture 25。个人学习讲义与配套实验,按主题整理并持续修订。

课程源码 ZIP ↓

个人整理的学习笔记,非官方讲义;课程来源与整理说明见课程介绍。配套示例未逐一运行验证。

本篇目录

对应 Maps to:CMU 10-423 / 10-623 / 10-723 Generative AI(Aran Nayebi、Matt Gormley),Lecture 25 · Wed 15-Apr · Generative Models for Videos(slides:lecture25-video)。 阅读材料:Çiçek et al. (2016), 3D U-Net;Arnab et al. (2021), ViViT;Ho et al. (2022), Video Diffusion Models;Blattmann et al. (2023), Align your Latents(Video LDM);Peebles & Xie (2023), DiT;OpenAI (2024), Video generation models as world simulators(Sora);Open-Sora 团队 (2025), Open-Sora 2.0;Chen et al. (2024), Panda-70M;Liu et al. (2024), World Model on Million-Length Video and Language with RingAttention(Large World Model);Rivard et al. (2025), NeuralOS。 依据说明:本讲按原课第 25 讲公开的 slides 展开:视频扩散模型(视频数据集、3D U-Net、ViViT 与分解的时空注意力、Video Diffusion Model 的联合训练与条件采样、Video LDM、DiT、Sora、Open-Sora 的成本与评估);视频与视觉语言模型(Large World Model);智能体式的视频生成与理解(Neural OS、Neural Computers)。所有实验是本讲义自己设计的,不代表课堂上讲了什么。为了在 CPU 上几分钟内训练,扩散实验用的是”一维视频”(§3.1 解释为什么)。 配套代码 Code:code/lecture25/(3 个脚本 + 1 个模块;02 第一次运行约 2.5 分钟,其余几秒到半分钟) 预计阅读时间:1.5 小时(含运行代码)


0. 本讲导航 · How to read this lecture

0.1 学习目标 Learning goals

学完这一讲,你应该能够:

  1. 算出一段视频有多少个 token,解释为什么视频模型要压缩到潜空间、并把注意力分解成空间和时间两部分。
  2. 写出 ViViT 的两种 reshape,说明分解注意力为什么是”带掩码的完整注意力”。
  3. 解释视频扩散模型怎样在图像模型的基础上加时间层、怎样和图像联合训练;说明”没有时间层”的模型会生成什么。
  4. 说明条件生成(视频预测、插帧)的替换法为什么不连贯,以及重建引导怎样修正它。
  5. 描述 Video LDM、Sora、Open-Sora 的思路和代价;说出视频生成的评估方式。
  6. 说明 Large World Model 和 Neural OS 怎样把视频模型变成”理解”和”交互”的工具。

0.2 先修与本讲范围 Prerequisites & scope

默认你已经会 Assumed本讲只给直觉,不展开 Previewed only
第 5 讲:ViT;第 7、8 讲:DDPM、DDIM、无分类器引导视频自编码器的结构细节
第 12、14 讲:潜空间扩散、DiT视频超分辨率、插帧模型的级联细节
第 19 讲:长上下文、RingAttentionSora 的未公开细节

0.3 本讲地图 Map

§1  视频数据:数据集与"用模型写字幕"
§2  视频的 token:3D U-Net、ViViT、分解的时空注意力          ← 代码 01
§3  视频扩散模型:时间层、联合训练、条件采样                  ← 代码 02、03
§4  扩大规模:Video LDM、DiT、Sora、Open-Sora
§5  视频与 VLM:Large World Model
§6  智能体式的视频:Neural OS、Neural Computers
§7–11  小结、误区、练习、延伸阅读、下一讲

1. 视频数据 · Datasets for video models

slides 展示了一张视频-文字数据集的对比表:从 2016 年 MSR-VTT 的 1 万段人工标注的视频,到 WebVid-10M(2021,1070 万段,用网页上的替代文字当描述)、HD-VILA-100M(2022,1 亿段,用语音识别的文字),再到 Panda-70M(2024,7000 多万段 720p 视频)。

最大的那些数据集,字幕是模型生成的。 Panda-70M 用多个”跨模态教师模型”给每段视频写候选字幕,再用一个检索模型挑出最贴切的那一条。slides 的提醒是:字幕的质量和风格会因为用了哪个模型而差别很大——数据集里的”文字”在多大程度上反映视频内容,本身就是一个变量。(第 13 讲的 CLIP 数据、第 22 讲的偏见,都和这个问题有关。)


2. 视频的 token · How many tokens is a video?(代码 01)

2.1 3D U-Net 与 ViViT

3D U-Net(Çiçek et al., 2016)原本是为三维医学图像(例如高分辨率的三维组织扫描)做分割设计的:它和普通的 U-Net 几乎一样,只是把二维卷积(高、宽、通道)换成三维卷积(高、宽、深度、通道)。把”深度”换成”时间”,就能处理视频。

视频 ViT(ViViT,Arnab et al., 2021) 把一串帧切成小块当 token。普通的图像 ViT 只在一帧之内做注意力(每帧独立);ViViT 有两种注意力交替进行(slides 写出了 reshape):

空间注意力:b t h w c → (b t) (h w) c → 多头注意力 → b t h w c      同一帧内的 token 互相看
时间注意力:b t h w c → (b h w) t c → 多头注意力 → b t h w c      同一位置的 token 跨帧互相看

2.2 分解注意力 = 带掩码的完整注意力

01 第 2 部分按 slides 的 reshape 写了分解注意力,又写了”对全部 t·n 个 token 做完整注意力、再用掩码挡掉不在同一帧(或不在同一位置)的 token 对”,两者相差 6.7e-16——分解注意力不是近似,而是完整注意力的一个特例。交替叠几层以后,信息照样能从任何一帧的任何位置传到任何地方:先在帧内传到正确的位置,再沿时间传到正确的帧。代价是一层之内,一个 token 不能直接看”另一帧的另一个位置”(例如运动物体下一帧所在的位置),要靠两层接力。

2.3 为什么必须分解、必须压缩

完整注意力的代价随总 token 数的平方增长;分解以后是 t⋅n2+n⋅t2t\cdot n^2 + n\cdot t^2,省下约 t⋅n/(n+t)t\cdot n/(n + t) 倍(01 第 3 部分,d = 1024 时每层注意力分数的计算量):

视频总 token完整三维注意力空间 + 时间省了多少
16 帧、潜空间 32 × 32、2 × 2 小块4,0966.9e104.6e915×
2 秒 × 24 帧/秒、潜空间 64 × 64、2 × 249,1529.9e122.2e1146×
10 秒 × 24 帧/秒、时间压缩 4 倍、潜空间 90 × 160、2 × 2216,0001.9e143.2e1259×

一段几秒钟的高清视频就有几十万个 token。所以视频模型几乎都要两步:先用自编码器把视频压缩到潜空间(空间和时间都压缩,§4.1),再把注意力分解成空间和时间两部分(或者像 Sora 那样,在压缩后的”时空小块”上用扩散 Transformer——它的技术报告没有公开注意力是否分解)。


3. 视频扩散模型 · Video Diffusion Models(代码 02、03)

3.1 架构:图像模型 + 时间层

slides:Video Diffusion Model(Ho et al., 2022)= 3D U-Net + 时空注意力;时间轴上用相对位置编码。具体地,每一层先做逐帧的空间卷积和空间注意力(这部分和图像扩散模型一样),再加一层时间注意力。

一个小实验。 为了在 CPU 上几分钟内训练出来,02 把视频压成了一维:每一帧只有一行 16 个像素,里面有一段长 2–4 的”物体”,每帧左移或右移一格,碰到边缘反弹。16 帧叠起来正好是一张 16 × 16 的时空图——纵轴是时间、横轴是空间;匀速运动是一条斜线,反弹是一个折角。(我们先试过真正的二维小视频:在 16 × 16 和 8 × 8 的像素上用扩散 Transformer、用卷积 + 时间注意力,训练几分钟都没能生成帧间连贯的视频——code README 记录了这几次失败。现象和结构都不受”一维”的影响。)

两个同样大小的扩散模型,唯一的区别是有没有时间层:

  • 图像模型:每个块里只有空间卷积(核 1 × 3)——每一帧完全独立地生成;
  • 视频模型:每个块里多一层时间卷积(核 3 × 1)——相邻帧之间可以交换信息。这是”把三维卷积拆成二维空间 + 一维时间”(伪三维 / (2+1)D 卷积),和 ViViT 拆注意力是同一个思路。

各训练 2000 步,用 DDIM(50 步)各生成 128 段视频:

每一帧画得像整段 16 帧都像相邻两帧都像时:恰好移动 1 格长度不变
真实视频1.0001.0001.0001.000
图像模型0.9880.8360.1400.343
图像模型,各帧打乱0.9880.8280.1420.323
视频模型0.9110.2730.8350.738
视频模型,各帧打乱0.9110.2420.1440.357

(“各帧打乱”:把同一时刻的帧在 128 段视频之间随机交换——每一帧的分布不变,帧与帧之间的联系被破坏。它是”如果每一帧都是独立画的”的基线。)

  • 图像模型的每一帧都画得很好(99% 的帧是一段合格的物体),但帧与帧之间毫无关系:恰好移动一格的 14%、长度不变的 34%,和打乱以后一样。在时空图上,它画的是每一行各自随机的一小段。
  • 视频模型多了时间层,帧与帧连起来了:恰好移动一格的 83%(打乱后 14%),在时空图上是连起来的斜线。但每一帧没那么干净(91%),整段都合格的只有 27%——同样的训练步数,它要学的东西多得多,常常在中途断一两帧、或者一条轨迹分叉成两条。

这就是真实视频模型的结构选择背后的道理:单帧的质量可以靠图像数据学好,“连贯”必须靠时间层从视频数据里学。

一个我们踩到的坑:归一化层也会让帧之间”串通”。 第一版的图像模型用了普通的 GroupNorm:它在整段视频(所有帧)上算均值和方差。结果这个”没有时间层”的模型生成的物体长度在帧之间明显相关(长度不变 74%,打乱后 36%)——帧与帧通过归一化的统计量偷偷交换了信息。改成逐帧归一化以后,时间层才是帧之间交换信息的唯一通道。真实的视频模型在”把视频当成一批独立的图像”处理时也要注意这一点。

3.2 和图像联合训练

slides:模型可以同时在图像和视频上训练——在图像上训练时,把时间注意力遮掉,让每个位置的注意力全部落在当前这一帧自己身上(相当于时间层什么也不做);这样的联合训练能提高视频生成的质量。Ho et al. 的表:每段视频之外再加 0 / 4 / 8 张独立的图像一起训练,FVD(越低越好)从约 202 降到 68、再到 58。图像数据多得多、也更多样,单帧的质量靠它学;时间层只从视频里学。

3.3 条件生成:替换法 vs 重建引导(代码 03)

slides 先回忆了无分类器引导(第 8 讲):ϵ~θ(zt,c)=(1+w)ϵθ(zt,c)−wϵθ(zt)\tilde\epsilon_\theta(z_t, c) = (1 + w)\epsilon_\theta(z_t, c) - w\epsilon_\theta(z_t)。然后问:如果要从条件分布 p(xb∣xa)p(x^b \mid x^a) 里采样呢?例如 xax^a 是前 16 帧、要生成后 16 帧(把视频续长);或者 xax^a 是低帧率的视频、xbx^b 是要插进去的中间帧。

替换法(replacement):用一个无条件的视频模型,每一步去噪时把 zz 里”已知帧”那部分换成对 xax^a 加同样强度的噪声,模型对全部帧做一次预测,只用 xbx^b 的部分。问题是:模型只是”看到”了加了噪声的 xax^a;它对 xbx^b 的预测并没有被要求和 xax^a 一致。

重建引导(reconstruction-guided sampling):根据”模型对条件数据的重建”来引导样本——

x~θb(zt)=x^θb(zt)−wrαt2∇ztb∥xa−x^θa(zt)∥22.\tilde{x}^b_\theta(z_t) = \hat{x}^b_\theta(z_t) - \frac{w_r\alpha_t}{2}\nabla_{z_t^b}\big\|x^a - \hat{x}^a_\theta(z_t)\big\|_2^2.

如果模型对已知帧的重建 x^a\hat x^a 和真实的 xax^a 不符,就沿着让它们更符合的方向调整 xbx^b。slides 引用论文的图:用替换法做自回归续写,生成的视频缺乏时间上的连贯;重建引导没有这个问题。论文在 BAIR 机器人推物体和 Kinetics-600 的视频预测基准上都取得了当时最好的 FVD。

03 用 02 的无条件视频模型(训练时从没见过”给定前半段”这种任务),给前 8 帧、生成后 8 帧:

方法第一帧接得上(移动一格、长度相同)后半段和真实后续逐帧完全相同后半段内部恰好移动一格⏱
替换法0.2500.0370.8373.5 秒
重建引导,w = 30.5160.0830.8086 秒
重建引导,w = 100.8440.1420.8096 秒
重建引导,w = 300.9610.1990.8086 秒

替换法生成的后半段自己是连贯的(内部 84% 恰好移动一格),但只有 25% 和给定的前半段接得上——它常常另起一条轨迹。重建引导把这个比例提到了 96%(w = 30),代价是每一步多一次反向传播。即使如此,后半段和真实后续逐帧完全相同的也只有约五分之一:引导主要修好了”接口”那几帧,再往后模型仍会自己另起炉灶(真实后续里有反弹,一步走错,后面每一帧都不同)。


4. 扩大规模 · Scaling video generation

4.1 Video LDM:在潜空间里

slides 的 Video Latent Diffusion Model(Blattmann et al., 2023)由两部分组成:

  • 编码器 / 解码器:训练成把视频压缩到潜空间再重建回来(解码器还用一个”看视频的”判别器微调,让解码出的帧与帧之间不闪烁);
  • 潜空间里的视频扩散模型:从一个预训练好的图像 LDM(第 12 讲的 Stable Diffusion)出发,在每一层插入时间层,只训练这些时间层——图像模型的知识原封不动地保留下来,视频数据只用来学”怎样动”。

它的生成是一个”堆栈”(slides 的图):先生成稀疏的关键帧;再分两步做时间上的插值,得到高帧率;最后把潜变量解码回像素,并可选地用一个视频超分辨率扩散模型放大。

4.2 DiT 与 Sora

slides 回顾了第 14 讲的 DiT:把潜变量切成小块,用带 adaLN-Zero 条件的 Transformer 块去噪。Sora(OpenAI, 2024)用 DiT 作为骨干,在图像和视频上训练:先用一个视频压缩网络把视频压到潜空间,再切成”时空小块”作为 token。技术报告的标题是”视频生成模型作为世界模拟器”——第 26 讲会接着讨论这个说法。

4.3 Open-Sora 2.0:成本在下降

slides 的表(Open-Sora 2.0 论文):Movie Gen 用了 6144 块 GPU、约 125 万 GPU 小时,估计 250 万美元;Step-Video-T2V 约 2992 块、50 万 GPU 小时、100 万美元;Open-Sora 2.0 用 224 块 GPU、约 10 万 GPU 小时、约 20 万美元——“随着模型和数据的改进,训练成本在下降”。它的三阶段训练(按每 GPU 小时 2 美元算):

阶段数据GPU·天成本
256px 文本到视频7000 万224010.75 万美元
256px 文本 / 图像到视频1000 万3841.84 万美元
768px 文本 / 图像到视频500 万15367.37 万美元

先在低分辨率、大量数据上学”内容和运动”,再在少量高分辨率数据上学”细节”——绝大部分计算花在低分辨率上。

怎样评估? slides 列了两种:人工评估(人在两个模型的视频之间选更好的,分别看画面质量、是否遵循提示、运动质量)和基准 + 指标(例如 VBench,把视频质量分解成十几个维度的自动指标,汇总成质量分和语义分)。我们的 02 用的”每一帧像不像""相邻帧是否连贯”正是这两个维度的缩小版。


5. 视频与 VLM:Large World Model

slides 的 Large World Model(Liu et al., 2024)把视频理解和生成放进同一个自回归 Transformer:图像和视频帧用 VQGAN 变成离散的图像 token,文字用 BPE 分词,全部排成一条序列,预测下一个 token(图像 token 或文字 token)。

难点是长度:一小时的视频有几十万到上百万个 token。它分两个阶段训练:先把一个语言模型的上下文逐步扩展到 100 万 token(用长书籍);再在越来越长的图文、视频-文字数据上训练(从单张图像到几千帧的视频问答)。能处理这么长的序列,靠的是第 19 讲的 RingAttention——把序列切开分给多块 GPU,键值块在 GPU 之间轮转。slides 展示了它既能根据文字生成图像和短视频(“烟花在夜空中绽放""海浪拍打着海岸”),也能回答关于长视频内容的问题。


6. 智能体式的视频生成与理解

6.1 Neural OS

slides 的 Neural OS(2025)是”可交互的视频扩散”:用户的动作 + 隐状态 → 下一帧屏幕。它模拟一个操作系统的图形界面:

  • 一个 RNN(两层 LSTM)读入用户的输入(鼠标移动、点击、键盘),维护”电脑现在处于什么状态”的隐状态;
  • 一个扩散渲染器以 RNN 的输出和一张”光标位置图”为条件,生成下一帧屏幕画面。

slides 的例子:模型生成的画面序列里,用户把鼠标移到”Home”文件夹、双击打开,再启动并关闭一个游戏程序——每一帧都是模型画出来的,没有真正的操作系统在运行。

6.2 Neural Computers

slides 最后提到 Neural Computers(2026):更进一步的设想——把传统计算机分离的计算、存储和输入输出,统一成一个学出来的”运行时状态”,让神经网络本身扮演计算机。这些工作把视频模型从”生成一段好看的视频”推向”模拟一个可以交互的世界”——下一讲的主题。


7. 小结 · Summary

  1. 视频 = 很多帧 + 帧间连贯;最大的视频数据集用模型写字幕,字幕质量取决于写字幕的模型。
  2. 一段视频的 token 数是”帧数 × 每帧 token”,完整注意力按它的平方增长;所以要先压缩到潜空间,再把注意力分解成空间和时间——分解注意力是带掩码的完整注意力。
  3. 视频扩散模型 = 图像扩散模型 + 时间层;没有时间层,每一帧都对,连起来却不是视频。可以和图像联合训练(遮掉时间层),单帧质量靠图像,连贯靠视频。
  4. 归一化层也是一条帧间通道:逐帧归一化才能让时间层成为唯一的帧间交流方式。
  5. 条件生成:替换法只让模型”看到”条件,重建引导要求生成的部分和条件一致。
  6. Video LDM 在预训练的图像 LDM 里插入时间层;Sora 用 DiT 处理时空小块;Open-Sora 2.0 用三阶段训练把成本降到约 20 万美元。
  7. Large World Model 用 RingAttention 在百万 token 上统一视频理解和生成;Neural OS 用”RNN + 扩散渲染器”把视频生成变成可交互的模拟。

8. 常见误区 · Common pitfalls

  • “视频生成就是逐帧生成图像。” 逐帧独立生成的视频每帧都对,帧与帧却毫无关系(§3.1)。
  • “分解的时空注意力是完整注意力的近似。” 它是带特殊掩码的完整注意力,多层叠起来信息仍然能传到任何地方(§2.2)。
  • “没有时间层,帧之间就一定没有信息交流。” 在整段视频上算统计量的归一化层也会传递信息(§3.1)。
  • “无条件模型 + 替换已知帧,就能做视频预测。” 生成的部分自己连贯,却常常和已知帧接不上(§3.3)。
  • “视频模型的训练成本只会越来越高。” 更好的数据、更好的压缩和分阶段训练让同等质量的成本在下降(§4.3)。

9. 练习 · Exercises

练习 1(token 数)。 一段 5 秒、24 帧/秒、1280 × 720 的视频,自编码器在时间上压缩 4 倍、空间上压缩 8 倍,再切成 2 × 2 的小块。一共多少个 token?完整注意力和分解注意力的注意力分数计算量之比约是多少?

参考答案

帧数 120 / 4 = 30;每帧潜空间 160 × 90,切成 2 × 2 后 80 × 45 = 3600 个 token;总共 108,000 个。比值 ≈ t⋅n/(n+t)t\cdot n/(n + t) = 30 × 3600 / 3630 ≈ 29.8 倍。

练习 2(分解注意力的掩码)。 t = 2 帧、每帧 n = 2 个 token,按”帧 0 的 token 0、token 1,帧 1 的 token 0、token 1”排列。写出空间注意力和时间注意力的 4 × 4 允许矩阵。两者合起来(先空间后时间)能让 token (帧 0, 位置 0) 的信息传到 (帧 1, 位置 1) 吗?

参考答案

空间:块对角 [[1,1,0,0],[1,1,0,0],[0,0,1,1],[0,0,1,1]]。时间:[[1,0,1,0],[0,1,0,1],[1,0,1,0],[0,1,0,1]]。先空间:(0,0) → (0,1);再时间:(0,1) → (1,1)。两层就能传到。

练习 3(联合训练)。 在图像上训练时”把时间注意力遮掉,使全部注意力落在当前帧上”。为什么这等于时间层什么也不做(假设有残差连接)?如果改成”把时间注意力的输出置零”,效果一样吗?

参考答案

只允许看自己时,注意力权重是 1,输出 = 自己的 V 投影再过输出投影——是一个逐位置的线性变换,不混合任何其他帧,相当于一个”逐帧的 MLP 层”(对单张图像没有害处,也不提供时间信息)。把输出置零则是让残差分支完全消失。两者都不在帧之间传递信息,但前者仍然训练了 V 和输出投影的参数(它们在视频上也会用到)。论文的做法是前者。

练习 4(重建引导的方向)。 为什么重建引导的梯度是对 zbz^b(未知帧的噪声变量)求的,而不是对 zaz^a?如果模型完全不在帧之间传递信息(没有时间层),重建引导还有用吗?

参考答案

我们想改变的是生成的部分,让它和已知部分一致;zaz^a 每一步都被替换成已知帧加噪声,调它没有意义。没有时间层时,x^a\hat x^a 只依赖 zaz^a,对 zbz^b 的梯度为 0——重建引导完全不起作用。它能起作用,正是因为模型在帧之间传递信息:生成的帧”错了”,会让模型对已知帧的重建也跟着变差。

练习 5(成本)。 按 Open-Sora 2.0 的表,每 GPU 小时 2 美元,2240 GPU·天是多少美元?三个阶段里低分辨率阶段占总计算的多少?

参考答案

2240 × 24 × 2 = 107,520 美元(表里的 10.75 万)。低分辨率的前两个阶段 2240 + 384 = 2624 GPU·天,占 2624 / 4160 ≈ 63%。

10. 延伸阅读 · Further reading

  • 架构:Çiçek et al. (2016), 3D U-Net;Tran et al. (2018), A Closer Look at Spatiotemporal Convolutions((2+1)D 卷积);Arnab et al. (2021), ViViT;Bertasius et al. (2021), TimeSformer。
  • 视频扩散:Ho et al. (2022), Video Diffusion Models;Singer et al. (2022), Make-A-Video;Ho et al. (2022), Imagen Video;Blattmann et al. (2023), Align your Latents;Blattmann et al. (2023), Stable Video Diffusion;OpenAI (2024), Sora 技术报告;Open-Sora 团队 (2025), Open-Sora 2.0;Huang et al. (2024), VBench。
  • 数据:Bain et al. (2021), WebVid;Chen et al. (2024), Panda-70M。
  • 理解与交互:Liu et al. (2024), Large World Model;Liu et al. (2023), RingAttention;Rivard et al. (2025), NeuralOS;Valevski et al. (2024), Diffusion Models Are Real-Time Game Engines(GameNGen)。

11. 下一讲预告 · Next lecture

第 26 讲(最后一讲):交互式世界模型 + 对齐科学。世界模型 = 给定当前状态和动作,预测下一个状态。我们会看三种范式(生成 3D 场景、可交互的视频如 Genie、隐空间的表示如 V-JEPA),在一个小网格世界里训练动力学模型、在”想象”中规划、从没有动作标签的视频里学出”潜动作”,并演示 JEPA 的”表示坍缩”。最后是 Aran Nayebi 的”对齐科学”:从复杂度的角度看对齐的内在障碍(任务数、智能体数、状态空间大小),以及”可纠正性”的形式化。

← 返回课程目录