Sora 生成的视频效果好吗?确实好。Sora 算得上 AGI 发展历程上的里程碑吗?我个人觉得算。我们知道它效果好就行了,有必要知道 Sora 到底是怎么做的吗?我觉得最好是每个人能有知情的选择权,任何想知道的人都能够知道,这种状态比较好。那我们知道 Sora 到底是怎么做出来的吗?不知道。

马斯克讽刺 OpenAI 是 CloseAI,为示道不同,转头就把 Grok 开源了。且不论 Grok 效果是否足够好,马斯克此举是否有表演成分,能开源出来这行为就值得称赞。OpenAI 树大招风,目前被树立成技术封闭的头号代表,想想花了上亿美金做出来的大模型,凭啥要开源?不开源确实也正常。所谓 “开源固然可赞,闭源亦可理解”。

但是,我个人一年多来的感觉,OpenAI 技术强归强,然而有逐渐把技术神秘化的倾向,如果不信您可以去读一下 Altman 的各种访谈。在这个 AI 技术越来越封闭的智能时代,技术神秘化导向的自然结果就是盲目崇拜,智能时代所谓的 “信息平权” 或只能成梦想。我不认为这是一个好的趋势,我发自内心地尊敬对技术开放作出任何贡献的人或团体,且认为对技术神秘化的去魅,这应该是 AI 技术从业者值得追求的目标

本文试图尽我所能地以通俗易懂的方式来分析 Sora 的可能做法,包括它的整体结构以及关键组件。我希望即使您不太懂技术,也能大致看明白 Sora 的可能做法,所以画了几十张图来让看似复杂的机制更好理解,如果您看完对某部分仍不理解,那是我的问题。

Sora关键技术逆向工程图解 | 万字长文_编码器

Key Messages

Sora关键技术逆向工程图解 | 万字长文_生成模型_02

这部分把本文关键信息列在这里,特供给没空或没耐心看长文的同学,当然我觉得您光看这些估计也未必能看明白。

Key Message 1:Sora 的整体结构如下(本文后续有逐步推导过程)

Sora关键技术逆向工程图解 | 万字长文_数据_03

Key Message 2:Sora 的 Visual Encoder-Decoder 很可能采用了 TECO(Temporally Consistent Transformer )模型的思路,而不是广泛传闻的 MAGVIT-v2(本文后续给出了判断理由,及适配 Sora 而改造的 TECO 具体做法)。Encoder-Decoder 部分的核心可能在于:为了能生成长达 60 秒的高质量视频,如何维护 “长时一致性” 最为关键。要在信息压缩与输入部分及早融入视频的 “长时一致性” 信息,不能只靠 Diffusion Model,两者要打配合。

Sora关键技术逆向工程图解 | 万字长文_生成模型_04

Key Message 3:Sora 之所以把 Patch 部分称为 “Spacetime Latent Patch”,大概是有一定理由的/Patch 部分支持 “可变分辨率及可变长宽比” 视频,应该是采用了 NaVIT 的思路,而不是 Padding 方案(本文后续部分给出了方案选择原因)。

Sora关键技术逆向工程图解 | 万字长文_生成模型_05

Key Message 4:目前的 AI 发展状态下,您可能需要了解下 Diffusion Model 的基本原理(后文会给出较易理解的 Diffusion 模型基本原理介绍)

Sora关键技术逆向工程图解 | 万字长文_数据_06

Key Message 5:Video DiTs 很可能长得像下面这个样子(本文后续内容会给出推导过程)

Sora关键技术逆向工程图解 | 万字长文_生成模型_07

Key Message 6:Sora 保持生成视频的 “长时一致性” 也许会采取暴力手段(后文给出了可能采用的其它非暴力方法 FDM)

Sora关键技术逆向工程图解 | 万字长文_编码器_08

Key Message 7:Sora 应该包含双向训练过程(后文给出了双向训练的可能实现机制)

Sora关键技术逆向工程图解 | 万字长文_编码器_09

Sora关键技术逆向工程图解 | 万字长文_生成模型_10

为何能对 Sora 进行逆向工程

Sora关键技术逆向工程图解 | 万字长文_编码器_11

Sora关键技术逆向工程图解 | 万字长文_生成模型_12

能否对 Sora 进行逆向工程,要依赖一些基本假设,若基本假设成立,则逆向工程可行,如不成立,则无希望。上面列出了 Sora 可被逆向工程的两个基本假设。

首先,我们假设 Sora 并未有重大算法创新,是沿着目前主流技术的渐进式改进。这条无论是从 OpenAI 的算法设计哲学角度(我来替 OpenAI 归纳下核心思想:简洁通用的模型结构才具备 Scale 潜力,如果可能的话,尽量都用标准的 Transformer 来做,因为它的 Scale 潜力目前被验证是最好的,其它想取代 Transformer 的改进模型都请靠边站。

模型结构改进不是重点,重点在于怼算力怼数据,通过 Scale Transformer 的模型规模来获取大收益。),还是历史经验角度(比如 ChatGPT,关键技术皆参考业界前沿技术,RLHF 强化学习是 OpenAI 独创的,但并非必需品,比如目前有用 DPO 取代 RLHF 的趋势)来看,这个条件大体应该是成立的。

第二个条件,其实 Sora 技术报告透漏了不少关于模型选型的信息,但是您得仔细看才行。

Sora关键技术逆向工程图解 | 万字长文_编码器_13

关于 Sora 技术报告透漏的信息,这里举个例子。它明确提到了使用图片和视频联合训练模型,而不像大多数视频生成模型那样,在训练的时候只用视频数据。这是关键信息,对保证 Sora 效果也肯定是个重要因素,原因后文会谈。既然 Sora 需要图片和视频联合训练,这等于对 Sora 内部结构怎么设计增加了约束条件,而这有利于我们进行逆向工程。

Sora关键技术逆向工程图解 | 万字长文_编码器_14

再举个例子,Sora 应采取了逐帧生成的技术路线,而不像很多视频生成模型那样,采取 “关键帧生成 + 插帧” 的模式。上图中 Sora 技术报告标红圈的部分是支持这一判断的部分证据,如果您参考的文献足够多,会发现一旦提 “generating entire video all at once”,一般和 “at once” 对应的方法指的就是 “关键帧 + 插帧” 的模式。

上图下方给出了 Google 的视频生成模型 Lumiere 的论文摘要(可参考:《Lumiere:A Space-Time Diffusion Model for Video Generation》),也提到了 “at once” 等字眼,表明自己用的不是 “关键帧 + 插帧” 的模式,这是把 “at once” 作为论文创新点高度来提的。

“关键帧生成 + 插帧” 是视频生成模型中普遍采用的模式,但它的问题是会导致生成的视频整体动作幅度很小、而且不好维护全局的时间一致性。我们看到市面上很多视频生成产品都有这个问题,就可以倒推它们大概采用了 “关键帧 + 插帧” 的模式。可以看出,这点也是保证 Sora 视频质量好的重要技术选型决策,但若您看文献不够仔细,就不太容易发现这个点。

Sora关键技术逆向工程图解 | 万字长文_生成模型_15

归纳一下,之所以我们能对 Sora 进行逆向工程,是因为前述两个基本假设大致成立,而每当 Sora 技术报告透漏出某个技术选型,就等于我们在算法庞大的设计空间里就去掉了很多种可能,这相当于通过对主流技术进行不断剪枝,就可逐步靠近 Sora 的技术真相。

接下来让我们根据目前的主流技术,结合 Sora 的技术报告,假设 Sora 模型已经训练好了,来一步步推导出 Sora 可能采用的整体技术架构。

Sora关键技术逆向工程图解 | 万字长文_生成模型_16

逐步推导 Sora 的整体结构

Sora关键技术逆向工程图解 | 万字长文_数据_17

Sora关键技术逆向工程图解 | 万字长文_编码器_18

Sora 给人的第一印象是高质量的 <文本 - 视频> 生成模型:用户输入 Prompt 说清楚你想要生成视频的内容是什么,Sora 能生成真实度很高的 10 秒到 60 秒的视频。至于内部它是怎么做到这一点的,目前我们还一无所知。

Sora关键技术逆向工程图解 | 万字长文_数据_19

首先,我们可如上图所示,技术性地稍微展开一下,细化 Sora 的整体轮廓。

用户给出相对较短且描述粗略的 Prompt 后,Sora 先用 GPT 对用户 Prompt 进行扩写,扩充出包含细节描述的长 Prompt,这个操作是 Sora 技术报告里明确提到的。这步 Prompt 扩写很重要,Prompt 对细节描述得越明确,则视频生成质量越好,而靠用户写长 Prompt 不现实,让 GPT 来加入细节描述,这体现了 “在尽可能多的生产环节让大模型辅助或取代人” 的思路。

那么,Sora 内部一定有文本编码器(Text Encoder),把长 Prompt 对应的文字描述转化成每个 Token 对应的 Embedding,这意味着把文字描述从文本空间转换为隐空间(Latent Space)的参数,而这个 Text Encoder 大概率是 CLIP 模型对应的 “文本编码器”(CLIP 学习到了两个编码器:“文本编码器” 及 “图片编码器”,两者通过 CLIP 进行了文本空间和图片空间的语义对齐),DALLE 系列里的文本编码器使用的就是它。

上文分析过,Sora 应该走的是视频逐帧生成的路子,假设希望生成 10 秒长度、分辨率为 1080*1080 的视频,按照电影级标准 “24 帧/秒” 流畅度来算,可知 Sora 需要生成 24*10=240 帧 1080*1080 分辨率的图片。所以,若已知输出视频的长度和分辨率,我们可以在生成视频前,事先产生好 240 帧 1080*1080 的噪音图,然后 Sora 在用户 Prompt 语义的指导下,按照时间顺序,逐帧生成符合用户 Prompt 描述的 240 张视频帧对应图片,这样就形成了视频生成结果。

Sora关键技术逆向工程图解 | 万字长文_数据_20

从 Sora 技术报告已知,它采用的生成模型是 Diffusion 模型,关于 Diffusion 模型的基本原理我们放在后文讲解,但现在面临的问题是:Diffusion Model 也有不同的做法,到底 Sora 用的是像素空间(Pixel Space)的 Diffusion Model,还是隐空间(Latent Space)的 Diffusion Model 呢?现在我们需要关于此做出技术决策。

Sora关键技术逆向工程图解 | 万字长文_数据_21

在做决策前,先了解下两个空间的 Diffusion Model 对应的特点。上图展示的是在像素空间内做 Diffusion Model 的思路,很直观,就是说在像素范围内通过 Diffusion Model 进行加噪音和去噪音的过程。因为图片包含像素太多,比如 1080*1080 的一张图片,就包含超过 116 万个像素点,所以像素空间的 Diffusion Model 就需要很大的计算资源,而且无论训练还是推理,速度会很慢,但是像素空间保留的细节信息丰富,所以像素空间的 Diffusion Model 效果是比较好的。这是它的特点。

Sora关键技术逆向工程图解 | 万字长文_数据_22

再说隐空间 Diffusion Model 的特点。最早的 Diffusion Model 都是在像素空间的,但速度实在太慢,所以后来有研究人员提出可以在对像素压缩后的隐空间内做 Diffusion Model。

具体而言,就是引入一个图像 “编码器”(Encoder)和 “解码器”(Decoder),编码器负责把图片表征从高维度的像素空间压缩到低维度的参数隐空间,而在经过 Diffusion Model 去噪后,生成隐空间内的图片内容,再靠解码器给隐空间图片内容添加细节信息,转换回图片像素空间。可以看出,Latent Diffusion Model(LDM)的特点正好和 Pixel Diffusion Model(PDM)相反,节省资源速度快,但是效果比 PDM 差点。

Sora关键技术逆向工程图解 | 万字长文_编码器_23

现在来做技术选型,从 Sora 技术报告明显可看出,它采用的是 Latent Diffusion Model,这个也正常,目前无论做图像还是视频生成,很少有用 Pixel Diffusion Model,大部分都用 LDM。但是,LDM 也存在一个压缩率的问题,可以压缩得比较狠,这样速度会更快,也可以压缩的不那么狠。

我猜 Sora 在 Encoder 这一步不会压缩得太狠,这样就能保留更多原始图片细节信息,效果可能会更好些。Sora 大概率会重点保证生成视频的质量,为此可以多消耗些计算资源,“以资源换质量”。Sora 生成视频速度很慢,很可能跟 Encoder 压缩率不高有一定关系。

Sora关键技术逆向工程图解 | 万字长文_数据_24

于是,目前我们得到上图所示的 Sora 整体结构图,主要变化是增加了针对视频的 Encoder 和 Decoder,以试图加快模型训练和推理速度。另外,一般把文本编码结果作为 LDM 模型的输入条件,用来指导生成图片或视频的内容能遵循用户 Prompt 描述。

Sora关键技术逆向工程图解 | 万字长文_数据_25

现在,我们面临新的技术决策点:对视频帧通过 Encoder 压缩编码后,是否会有 Patchify(中文翻译是 “切块”?不确定)操作?Patchify 本质上可看成对视频数据的二次压缩,从 Sora 技术报告可看出,它应有此步骤,这也很正常,目前的视频生成模型一般都包含这个步骤。而且 Sora 将他们自己的做法称为 “Spacetime Latent Patch”,至于为啥这么叫,我在后文关键模块分析会给出一个解释。另外,Sora 还主打一个 “支持不同分辨率、不同长宽比” 的图片与视频生成,为了支持这个功能,那在 Patchify 这步就需要做些特殊的处理。

Sora关键技术逆向工程图解 | 万字长文_编码器_26

于是,加入 Spacetime Latent Patch 后,目前的 Sora 整体结构就如上图所示。Patchify 一般放在视频编码器之后,而且输出时把多维的结果打成一维线性的,作为后续 Diffusion Model 的输入。

Sora关键技术逆向工程图解 | 万字长文_编码器_27

我们接着往下推导,来看下实现 Diffusion Model 时具体采用的神经网络结构,此处需注意,Diffusion Model 是种偏向数学化的算法思想,具体实现时可以采用不同的神经网络结构。其实目前 Diffusion Model 视频生成的主流网络结构一般会用 U-Net,Transformer 做 Diffusion 视频生成目前并非主流。当然,Sora 出现之后,选择 Transformer 来做 Diffusion Model 肯定很快会成为主流结构。

从 Sora 技术报告可知,它采用的骨干网络是 Transformer,应该主要看中了它良好的可扩展性,方便把模型规模推上去。当然用 Transformer+Diffusion 做视频生成,Sora 并不是第一个这么做的,这再次印证了 OpenAI 经常干的那种操作,就是利用 “吸星大法” 从开源届汲取各种前沿思路,但是自己反而越来越封闭的 CloseAI 作风。

Sora关键技术逆向工程图解 | 万字长文_编码器_28

于是,我们把基于 Transformer 网络结构的信息融进去,目前 Sora 整体结构如上图所示。

Sora关键技术逆向工程图解 | 万字长文_生成模型_29

让我们继续。Sora 在宣传时特别强调一个特性:可以支持不同分辨率(Variable Resolution)、不同长宽比(Various Aspect Ratio)、不同时长(Various Duration)的视频训练与生成。目前主流技术里这么做的不能说没有,但是确实极少,三者同时做到的在公开文献里我没有看到过,要做到这一点,对具体技术选型时也有不少要求,所以作为宣传点无可厚非。

后文为了表达简洁些,统一以 “不同分辨率” 来同时代表 “不同分辨率和不同长宽比”,这点在阅读后文的时候还请注意。关于生成视频时长问题我们后文会单独分析。

Sora关键技术逆向工程图解 | 万字长文_生成模型_30

这里先解释下什么是 “不同分辨率和长宽比”。如上图所示,其实好理解,分辨率的话一般跟图片大小有关系,图片小分辨率就低一些,图片大清晰度或分辨率就高一些,而长宽比就比如我们经常看到的短视频的 “竖屏模式” 和长视频的 “横屏模式” 等。Sora 都支持。

Sora关键技术逆向工程图解 | 万字长文_生成模型_31

那为啥要支持 “不同的分辨率和长宽比” 呢?上图给了个例子,目前做视频或者图片生成的主流技术,为了方面内部处理(训练时 Batch 内数据的规则性),会把输入的图片或视频大小统一起来,比如对于不同大小的图片,通过 Crop 操作,就是在图片中心截取一个正方形的图片片段,通过这种方式把输入大小统一。

而这么做的问题上图展示出来了,因为你截图,所以很容易把一个完整的实体切割开,使用这种经过 Crop 数据训练的视频生成模型,生成的人体就很容易看着不完整,而使用 “不同的分辨率和长宽比”,会保持原始数据所有信息,就没有这个问题,实体表达的完整性就会好很多。从这也可看出,Sora 为了保视频质量,真的是在视频生成的全环节都拼了全力。

Sora关键技术逆向工程图解 | 万字长文_编码器_32

我们把 Sora 这一关键特性表达到整体结构图上,就如上图所示。如果要支持这一特点,那么在 Spacetime Latent Patch 以及 LDM 这两个阶段,需要作出一些特殊的设计决策,这也是我们用来在后面推断 Sora 关键技术的重要参考和约束信息。

Sora关键技术逆向工程图解 | 万字长文_生成模型_33

下一个决策点之前我们提到过,Sora 使用了图片和视频联合训练,这对于保证视频生成质量很重要。

Sora关键技术逆向工程图解 | 万字长文_数据_34

为啥说这点重要呢?上图给了个例子(可参考:《Phenaki:Variable Length Video Generation From Open Domain Textual Description》),用户 Prompt 要求输出的视频是 “Water Color Style” 风格的,如果只用视频训练(右侧视频截图),就做不到这一点,而如果混合了 80% 的视频数据和 20% 的图片数据训练的视频生成模型(左侧视频截图),做得就不错。这是因为带标注的 < 文本 - 图片 > 数据量多,所以各种风格的图片数据都包含,而带标视频数据数量少,所以很多情景要求下的数据都没有,就导致了这种生成结果的差异。从此例子可以看出视频和图片联合训练对于视频生成质量的影响。

Sora关键技术逆向工程图解 | 万字长文_生成模型_35

如果 Sora 要支持图片和视频联合训练,则需要在视频编码 - 解码器,以及 Spacetime Latent Patch 阶段做技术选型要作出独特的设计,这进一步形成了关键模块的设计约束。加上越多约束,其实你能做的技术选择就越少,就越容易推断出具体的做法。目前的 Sora 整体结构如上图所示。

Sora关键技术逆向工程图解 | 万字长文_数据_36

Sora 的另外一大特性是能生成长达 60 秒的较长时长的视频,这点众所周知。

Sora关键技术逆向工程图解 | 万字长文_编码器_37

如果把时长要求加进去,Sora 应该会在 “视觉编码器 - 解码器” 阶段,以及 LDM 阶段作出一些独特的设计,才有可能维护这么长时间的视觉连贯性和内容一致性。把所有这些约束都加入后,我们就经过一步步推导,最终得出了 Sora 完整的整体结构,如上图所示。

Sora关键技术逆向工程图解 | 万字长文_编码器_38

如果对文生视频领域比较熟悉,我觉得从技术报告推导出 Sora 的整体结构,这事难度不算大,真正难的地方在于 Sora 关键模块具体采用的什么技术。可列出的关键技术主要有四块:

  1. 视频编码器 - 解码器,在支持 “图片 && 视频联合训练”、“视频长时一致性” 这两个约束条件下,具体模型应该如何设计?
  2. Spacetime Latent Patch,在支持 “图片 && 视频联合训练”、“可变分辨率” 这两个约束条件下,具体模型应该如何设计?
  3. 基于 Transformer 的视频 Diffusion Model,在支持 “可变分辨率” 约束条件下,具体模型应该如何设计?(这块的长时一致性策略放在第四部分了)
  4. Diffusion Model 阶段的长时一致性如何维护?

接下来,我们对 Sora 四个关键技术进行更深入的分析。

Sora关键技术逆向工程图解 | 万字长文_生成模型_39

视频编码器 - 解码器:从 VAE 到 TECO
(Temporally Consistent Transformer )

Sora关键技术逆向工程图解 | 万字长文_编码器_40

Sora关键技术逆向工程图解 | 万字长文_数据_41

Sora 的视频 Encoder-Decoder 采用 VAE 模型概率极大,原因很简单,因为绝大多数图片或视频模型基本都用 VAE,定位到 VAE 不难,难在继续探索 Sora 可能使用的到底是哪个具体模型。

VAE 模型出来后有不少改进模型,总体而言可分为两大类:“连续 Latent” 模型和 “离散 Latent” 模型。VAE 本身是连续 Latent 的,而离散 Latent 模型变体众多,最常用的包括 VQ-VAE 和 VQ-GAN,这两位在多模态模型和图片、视频各种模型中经常现身。“离散 Latent” 之所以比较火,这与 GPT 模型采用自回归生成离散 Token 模式有一定关联,使用离散 Latent 模型,比较容易套到类似 LLM 的 Next Token 的生成框架里,有望实现语言模型和图片、视频生成模型的一体化,典型的例子就是谷歌的 VideoPoet。

考虑到 Sora 主干模型采用 Diffusion Model 而非 Next Token 这种类 LLM 模式,而 Diffusion Model 加噪去噪的过程,本就比较适合在连续 Latent 空间进行,可以推断 Sora 采用 “连续 Latent” 的模式概率较大,倒不是说离散 Latent 模型不能做 Diffusion Model,也是可以的,但如果这么做,一方面把本来是连续 Latent 的 VAE 多做一道转成离散 Latent,感觉没有太大必要性,有点多此一举的味道。另一方面,如果对接 Diffusion Model,离散 Latent 效果肯定是不如连续 Latent 的,原因后面会谈。

之前不少探索 Sora 实现原理的技术文献把 Sora 可能使用的 Encoder-Decoder 定位到 MAGVIT-v2 模型(可参考:《Language Model Beats Diffusion -- Tokenizer is Key to Visual Generation》),它是 VQ-VAE 的一个变种。不清楚得出这个判断的原因是什么,但我个人感觉采用 MAGVIT-v2 的概率应该不大,反而是 VQ-GAN 的变体模型 TECO(Temporally Consistent Transformer)可能性更高些,理由后面会谈到。当然如果适配 Sora 的一些要求,TECO 也需要做出些改动,具体怎么改后文也会谈。

Sora关键技术逆向工程图解 | 万字长文_数据_42

为了便于理解后续内容,先介绍下图片 VAE 模型的基本思路。如上图所示,VAE 是种类似 GPT 的自监督学习,不需要标注数据,只要有足够图片数据就能训练模型。VAE 的基本思想是通过重建图片,来获得一个 Encoder 和对应的 Decoder。

输入随机某张图片 x 后,Encoder 对像素进行压缩,形成一个低维的图片特征压缩表示 z,而 Decoder 与 Encoder 相反,从压缩后的图片 Latent 表征 z,试图还原原始图像 x,产生重建的图像 x’,重建过程中 x 和 x’的差异就可以作为训练模型的损失函数,以此引导 VAE 模型的 encoder 产生高质量的压缩表示 z,decoder 则从压缩表示中尽可能准确地还原 x。一般会采用 CNN 卷积网络来做 Encoder 和 Decoder,所以 VAE 本身产生的图片 Latent 表征,本来就是连续的。

Sora关键技术逆向工程图解 | 万字长文_生成模型_43

说完图片 VAE 的思路,再来谈视频 VAE 的基本思想。如果把一张图片看作是世界某个时刻三维空间的二维压缩表示,那视频就在此之上,加入时间维度,可看做沿着时间轴由若干连续的二维 Space 图片组成的某段物理世界场景的三维 Space-time 表征。

于是,视频可以被看成是由多张图片沿着时间轴组成的有序图片序列,视频 VAE 的任务和图片 VAE 是类似的,就是尽可能准确地重建组成视频的每一帧,在重建视频的过程中学习视频压缩 Encoder 和视频解压缩 Decoder。

一般 Encoder 可以使用 Causal CNN 3D 卷积来做,和图片的 2D 卷积意思类似,最大的不同在于,CNN 的卷积核从 2D 升级成 3D 卷积。就是说在压缩第 i 帧图片的时候,不仅仅像图片 2D 卷积一样只参考第 i 帧图片内容,也可以参考第(i−1)、(i−2)……。(i−k)等之前的 k 帧图片,所以是一种 casual 3D 卷积(Causal 的意思是只能参考前面的,不能参考后面的,因为对于视频生成来说,后面的帧还没生成,所以是不可能参考到的,但是第 i 帧之前的 k 帧已经生成了,所以在生成第 i 帧的时候是可以参考的。一般这种就叫 causal(因果),类似 GPT 生成 Next Token 的时候只能参考之前已经生成的 Token,这是为啥 GPT 的 attention 被称作 Causal Attention。)

3D 卷积因为在重建第 i 帧的时候参考了之前的 k 帧,这其实融入时间信息了,如果 k 可以拉到比较长的时间,那么对于维护生成图像的时间一致性是有帮助的。但是,仅靠 CNN 卷积一般融入的历史比较短,很难融入较长时间的信息,所以需要有新思路,至于新思路是什么,这个晚些会谈。

Sora关键技术逆向工程图解 | 万字长文_编码器_44

简单介绍下 “连续 Latent” 和 “离散 Latent” 的概念。如上图所示,如果使用 CNN 卷积操作对图片进行扫描,因为卷积结果数值是在连续实数范围内,所以得到的卷积结果自然就是连续的 Latent。所谓 “离散 Latent”,就是把 “连续 Latent” 进行 ID 化,从实数向量通过一定方法转换成一个专属 ID 编号,这跟 LLM 里的字符串 Tokenizer 离散化过程是比较像的。

具体而言,一般对 “连续 Latent” 离散化过程的基本思想可参考上图中的右侧子图:模型维护一个 “密码本”(Codebook),密码本由很多 Codeword 构成,每项 Codeword 维护两个信息,一个是这个 Codeword 对应的 Latent 特征 Embedding,这是连续的,另外就是这个 Codeword 对应的专属 ID 编号。Codebook 类似词典信息。在离散化过程中,对于某个待离散化的” 连续 Latent”,会和密码本里每个 Codeword 对应的 Embedding 比对下,找到最接近的,然后把 Codeword 对应的 ID 赋予待离散化 Latent。你看,其实很简单。

这里解释下前面提到的一点:为何说对于 Diffusion Model 来说,“离散 Latent” 的效果应该比不上 “连续 Latent”。其实从上面离散化过程可以看出来,本质上” 连续 Latent” 离散化过程,可以看成对图片片段聚类的过程,赋予的那个 ID 编号其实等价于聚类的类编号。

目前的图像处理而言,Codeword 通常在 8000 左右,如果再大效果反而不好,这里就看出一个问题了,这种聚类操作导致很多 “大体相似,但细节不同” 的图片被赋予相同的 ID,这意味着细节信息的丢失,所以离散化操作是有信息损失的。这是为何说如果对接 Diffusion Model 最好还是用 “连续 Latent” 的原因,因为保留的图片细节的信息含量更多,有利于后续生成更高质量的视频内容。

Sora关键技术逆向工程图解 | 万字长文_生成模型_45

再说 “离散 Latent” 的一个典型模型 VQ-VAE(可参考:《Neural Discrete Representation Learning》),思路如上图所示,其实就是刚提到的如何对 VAE 获得的 “连续 Latent” 进行离散化的过程,思路已说过,此处不赘述。

Sora关键技术逆向工程图解 | 万字长文_生成模型_46

另外一个 “离散化 Latent” 的典型是 VQ-GAN(可参考:《Taming Transformers for High-Resolution Image Synthesis》),其思路可参考上图。可以把它简单理解成加入了 GAN 的改进版本 VQ-VAE。在 VQ-VAE 离散化基础上,集成进 GAN 的思路,以获得更好的编码效果。我们知道,对于 GAN 而言,主要是由一个 “生成器” 和一个 “判别器” 相互欺骗对抗来优化模型效果,VAE Decoder 会生成图像,自然这可作为 GAN 天然的生成器,再引入一个独立的 GAN 判别器即可。

Sora关键技术逆向工程图解 | 万字长文_编码器_47

那 Sora 到底用的哪个 VAE 模型呢?上图展示了传说中被提及率最高的 MAGVIT-2。过程较为简单,它把输入视频帧分组,首帧单独作为一组(这导致它可以支持 “图片 && 视频的联合训练”,因为图片可看成单帧的视频,首帧单独表示就可以对单张图片进行编码了),其它帧比如可以 4 帧分为一组。对于每一组 4 帧图片,通过 Causal 3D 卷积把 4 帧图片先压缩成一个 “连续 Latent”。然后再进行上面讲的 “连续 Latent” 离散化操作,就得到了 MAGVIT 的编码结果。

我们先不考虑离散化操作,对于 Sora 来说,很明显这是不需要的,原因上文有述。单说 Causal 3D 卷积操作,MAGVIT 的这个操作意味着两个事情:

首先,MAGVIG-v2 因为会把 4 帧最后压缩成一帧的 Latent 表示,所以它不仅在空间维度,同时也在时间维度上对输入进行了压缩,而这可能在输入层面带来进一步的信息损失,这种信息损失对于视频分类来说不是问题,但是对视频生成来说可能无法接受。

其次,4 帧压成 1 帧,这说明起码 MAGVIG-v2 的 Latent 编码是包含了 “局部 Time” 信息的,这对于维护生成视频的时间一致性肯定有帮助,但因为仅靠 CNN 很难融入太长的历史信息,貌似只能融合短期的时间信息,对于维护 “长时一致性” 帮助很有限。

综合考虑,我个人觉得 Sora 采用 MAGVIT 的概率不大。为了能够生成长达 60 秒的视频,我们希望在 VAE 编码阶段,就能把长周期的历史信息融入到 VAE 编码里来,这肯定是有很大好处的。

问题是:现在公开的研究里,存在这种模型吗?

Sora关键技术逆向工程图解 | 万字长文_生成模型_48

您别说,还真让我找到一个,就是上图所展示的 TECO 模型(可参考:《Temporally Consistent Transformers for Video Generation)。上图展示了 TECO 和 Sora 两位 Co-Lead 之间的渊源,这是 UC Berkeley 发的文章,主要研究如何生成 “长时间一致性” 的视频,而两位 Co-Lead 都博士毕业于 UC Berkeley,也都研究视频生成相关内容,所以他们起码肯定知道这个工作,TECO 的主题又比较符合他们把 Sora 打到 60 秒长度的技术需求,所以参考 TECO 的概率还是较大的。

Sora关键技术逆向工程图解 | 万字长文_生成模型_49

TECO 结构如上图所示,核心由两个任务组成:一个是视频重建任务,用来训练视频 Encoder-Decoder;一个是使用 MaskGit 生成离散化的图像 Token,主要用于生成视频。TECO 有两个主要特点:

首先,它在 VAE 编码阶段对 Space 和 Time 信息分别编码,而且 Time 编码引入了极长的 Long Time 信息。确切点说,是所有历史信息,比如要生成第 i 帧视频,则 Time 编码会把第 1 到第(i−1)帧的之前所有历史信息都融合到第 i 帧的时间编码里。很明显这样做对于维护长时一致性是很有帮助的。

其次,TECO 在生成视频的长时一致性方面表现确实很不错。上图右下角的效果对比图测试了长达 500 帧的生成视频,TECO 效果比基准模型要好(也请关注下里面的红色曲线模型 FDM,后面我们会提到它)。我们可以推断一下,假设视频是电影级流畅度达 24 帧/秒,那么 500 帧图像对应正好 20 秒时长的生成视频。(Sora 生成的大部分视频都是长度 20 秒左右,推断应该也是总长度 500 帧左右。这是否说明了些什么?)

Sora关键技术逆向工程图解 | 万字长文_数据_50

对 Sora 来说,如果对 TECO 适应性地改造一下,基本就可以把它能在 VAE 阶段就融合超长历史的能力吸收进来。具体而言,需要做两项改动:首先,VAE 离散化是不必要的,所以可以拿掉;其次,MaskGit 部分用于训练模型能够 Token by Token 地生成视频,我们也不需要,只需要保留视频重建部分即可。

Sora关键技术逆向工程图解 | 万字长文_编码器_51

经过上述改造,TECO 在 VAE Encoder 阶段的基本思想就展示在上图中了。首先,是对图片内容的空间 Latent 编码。首帧单独处理,自己成为一组,这就可以支持 “图片和视频联合训练” 了;其它帧两帧一组,比如对于第 i 帧,则把前一帧第(i−1)帧也和第 i 帧放在一组。

这里要注意,尽管也是 2 帧一组,但是这和 MAGVIT 思路是不一样的,TECO 这个 2 帧一组类似一个滑动窗口,窗口间是有重叠的,所以不存在多帧压缩成一帧带来的信息损失问题。TECO 思路正好和 MAGVIT 相反,在 Space Latent 编码阶段不仅考虑第 i 帧,还把第(i−1)帧的信息也带进来,所以它是通过 VAE 增加更多信息的思路。

视频帧分组后,使用 CNN 3D 卷积可以产生每帧图片对应的 “连续 Latent”,这部分是 “Space Latent”,主要编码图像的空间信息;之后,使用 Causal Temporal Transformer 对时间信息进行编码,前面提过,对于同一视频,TECO 会把所有历史内容 Time 信息都融合进来。

Transformer 输出的时间编码是线性的,经过 Reshape 后可以形成和 “Space Latent” 相同大小的高维表示,这部分就是 VAE 的 “Time Latent”。这样,每帧视频经过 TECO 编码后,有一个 “Space Latent” 一个 “Time Latent”,两者并在一起就是这帧视频的 VAE 编码结果。这里可以再次看出,TECO 的思路是增加信息,而不是以压缩减少信息为唯一目的的。

使用 TECO 除了能在 VAE 编码阶段就引入尽可能长的时间信息,更好维护生成视频的一致性外,还有另外一个好处,OpenAI 明显是认准了 Transformer 的 Scale 潜力比较大,所以 Sora 在做 Diffusion Model 的时候把 U-Net 换成 Transformer。如果采用 TECO,则 Sora 的主体结构基本都基于 Transformer 了,这明显是符合 OpenAI 的模型口味的。

Sora关键技术逆向工程图解 | 万字长文_编码器_52

Spacetime Latent Patch:

Spacetime Latent Patch 的含义及 NaVIT

Sora关键技术逆向工程图解 | 万字长文_数据_53

Sora关键技术逆向工程图解 | 万字长文_数据_54

我们先介绍单张图片 Patchify 的具体含义。本质上,Patchify 是对 VAE 压缩编码的二次压缩,在视频生成模型里很常见。具体做法很简单,如上图所示,对于 VAE 压缩后的 “连续 Latent” 平面,可以设定一个 2∗2 大小的 Patch,不重叠地扫描 “连续 Latent” 平面,通常是接上一个 MLP 对 2∗2 的小正方形网格输入做个变换。

这样的话,假设 “连续 Latent” 本来大小是 8∗8,经过 Patchify 操作后,就形成了一个二次压缩的 4∗4 的 Patch 矩阵,然后可以通过线性化操作把 Patch 拉成一条直线,这是因为后面接的是 Transformer,它需要线性的输入 Patch 形式。

目前很多视频生成研究证明了:Patch Size 越小,生成的视频质量越高。所以这里 Sora 采取 2∗2 大小的 Patch Size 基本没疑问。Patch Size 越小说明压缩率越低,也说明保留的原始图片信息越多。可以进一步推断,这说明了 VAE 阶段也好、Patchify 阶段也好,这种原始信息压缩阶段,应该尽量多保留原始信息,不要压缩太狠,否则对视频生成质量会是负面效果。当然付出的代价是比较消耗计算资源,计算速度会慢很多。目前看很难兼顾,你必须要作出取舍。

Sora关键技术逆向工程图解 | 万字长文_生成模型_55

了解单张图片的 Patchify 操作后,我们来看一个简单的视频 Patch 方法。因为视频是由多个视频帧按照时间顺序构成的有序序列,一个最简单的方法是不考虑不同帧之间的关系,每一帧独立通过上述的 Patchify 操作进行二次压缩,如上图所示。

Sora关键技术逆向工程图解 | 万字长文_编码器_56

之前很多解读 Sora 技术的文章倾向于认为 Sora 在这个阶段采用了类似 VIVIT 的 Tubelet Embedding 的思路。含义如上图所示:就是除了第一帧,其它视频帧比如可以 2 帧为一组,不仅在空间维度进行压缩,在时间维度也要进一步压缩,从时间维度的 2 帧输入压缩为 1 帧 Patch,具体技术采取 CNN 3D 卷积就可以实现。

我觉得在这里采用类 VIVIT 的时间压缩可能性较小,主要这么操作,在时间维度进一步压缩,输入侧信息损失太高。VIVIT 搞的是图像分类任务,属于比较粗粒度的任务,所以压缩狠一点问题不大,但是对于视频生成任务来说,就像上文提到的,看似在输入侧要尽可能保留多一些信息,这么狠的压缩大概会严重影响视频生成质量。目前也有研究(可参考:《Latte:Latent Diffusion Transformer for Video Generation》)证明,这么做确实有损害作用,所以在这里,类 VIVIT 方案我觉得可以 Pass 掉。

Sora关键技术逆向工程图解 | 万字长文_生成模型_57

如果假设 Sora 在 VAE 阶段采用的是 TECO 的话,则可以如上图这么做。因为每张图片有两个 Patch 矩阵,一个是 Space Latent,保留的主要是空间信息;一是 Time Latent,保留主要是长时历史信息。所以,我们可以用一个 Patch Size=2∗2∗2 的 Patch,把同一个图片的 Space Latent 和 Time Latent 合并,压缩为一个 Patch 矩阵。

在这里若把这张图片对应的 Patch 矩阵叫做 “Spacetime Latent Patch”,看着貌似问题不大吧?我猜 Sora 这么做的概率还是比较大的,也很可能是 OpenAI 强调的 “Spacetime Latent Patch” 的来源之处。当然这纯属个人猜测,主观性较强,谨慎参考。

这么做有若干好处。首先,每张图片对应一个 Patch 矩阵,融合过程中既包含了空间信息,也包含了 Long Time 时间信息,信息保留非常充分。其次,如果要支持 “图片 && 视频联合训练”,那么首帧需要独立编码不能分组,这种方案因为没有视频帧分组过程,所以自然就支持 “图片 && 视频联合训练”。

Sora关键技术逆向工程图解 | 万字长文_生成模型_58

前文讲过,如果要支持不同分辨率视频,则需要在 Patch 阶段做些独特的工作。之前大家提及率较高的现有技术是 NaVIT,目前看下来,貌似确实也没有比 NaVIT(可参考:《Patch n’ Pack:NaViT,a Vision Transformer for any Aspect Ratio and Resolution》)更合适的方案了。

上图展示了 NaVIT 的基本思路:其实很简单,只要我们固定住 Patch Size 的大小,通过扫描不同分辨率的视频,自然就产生了不同分辨率或长宽比的 Patch 矩阵,然后把它们线性化即可。

Sora关键技术逆向工程图解 | 万字长文_数据_59

与 NaVIT 对应的可以支持可变分辨率的方法是 Padding 方案。如上图右方子图所示,只要设定好一个最大图片大小,其实不管图片长宽比如何,只要让它占据从左上角开始的一个局部位置即可,其它相对最大图片大小空出的位置,用无意义的 Padding 占位符号占住就行。很明显这个方法也可以支持不同分辨率视频。

那么我们应该选择 NaVIT 还是 Padding 呢?很明显应该选择 NaVIT 方案。NaVIT 在提出之初,就是为了改进 Padding 方法的。Padding 方法有什么问题?就是在训练模型的时候,一个 Batch 里被 Padding 这种无意义的占位符号浪费的空间太多了,而 NaVIT 不需要对每张图片进行 Padding,该是多少 Patch 就是多少 Patch,顶多在 Batch 末尾加少量 Padding 来填充到 Batch 最大长度即可。很明显 NaViT 方案在一个 Batch 里可以放更多视频帧,而这能极大增加模型的训练效率。

而且,如果模型能支持的最大分辨率越高,Padding 方法每张图片 Padding 浪费的比例就越高,采用 NaVIT 也就越合算。我们知道,Sora 最大可以支持 2048*2048 的图片,在这种情况下,基本不可能采用 Padding 方法,貌似也只能用 NaVIT 了,起码我目前还没有看到更好的方案。

Sora关键技术逆向工程图解 | 万字长文_数据_60

在将 Patch 拉成线性结构后,会丢失 Patch 对应的位置信息,所以为了能够支持可变分辨率视频,对于每个 Patch,需要特殊设计的位置表征。

很明显使用 Patch 的绝对位置(就是按照 Patch 顺序编号)是不行的,只要我们使用三维空间里的相对坐标,并学习对应的 Position Embedding,就可以解决这个问题。上图展示了同一个视频的连续三帧,对于蓝色 Patch 来说,可以看出它对应的相对坐标位置为:X=2,Y=3 以及 Z=3(视频时间维度的第三帧)。

假设我们在模型训练过程中学习每个坐标位置对应的 embedding,然后把三者的 embedding 叠加,就形成了这个 Patch 对应的 Position Embedding,这里包含了这个 Patch 对应的三维相对坐标。对于每个 Patch 来说,除了 Patch 表达图片内容外,对应的,每个 Patch 再增加一个位置表征即可。

Sora关键技术逆向工程图解 | 万字长文_编码器_61

本部分最后,在 Spacetime Latent Patch 阶段,让我们归纳下 Sora 可能采取的技术方案:首先,很可能会对接 TECO 的 VAE 编码,使用 2∗2∗2 大小的 Patch 来合并每张图片的 Space Latent 以及 Time Latent,每张图片被压成一个 Spacetime Latent Patch 矩阵。然后使用 NaVIT 方法来支持可变分辨率视频,最主要的改动是需要根据空间维度的两个坐标和时间轴坐标,来学习每个 Patch 在空间位置中对应三维空间相对位置坐标的 Position Embedding。

Sora关键技术逆向工程图解 | 万字长文_数据_62

Transformer Diffusion Model:

从 Diffusion Model 原理到 Video DiTs 模型

Sora关键技术逆向工程图解 | 万字长文_数据_63

本部分我们会先介绍下 Diffusion Model 基本原理,然后逐步推导 Video DiTs 模型可能的内部结构。

Sora关键技术逆向工程图解 | 万字长文_生成模型_64

上图展示了 Diffusion Model 的基本原理,Diffusion Model 由正向加噪和反向去噪过程构成。假设我们有一个很大的图片库,可以从中随机选择一张 x0,正向过程分多次,每次加入不同程度的符合正态分布的噪音到原始图片里,直到清晰图完全转化为纯噪音图 ξ 为止。而反向去噪过程则从转化来的纯噪音图 ξ 开始,训练神经网络预测对应步骤加入的噪音是什么,然后从纯噪音图 ξ 里减掉预测的噪音,图像清晰程度就增加一些,依次反向逐步一点一点去除噪音,就能恢复出最初的 x0 图片内容。

Sora关键技术逆向工程图解 | 万字长文_数据_65

Diffusion Model 的前向过程是人为可控地对已知图片逐步加入不同程度噪音的过程,即噪音的逐步 “扩散” 过程。经数学推导,对于第 t 个 Time Step 的加噪音过程可以一步完成,不需要上述的逐渐扩散的过程,如上图所列出公式所示。

给图片加噪音的具体过程如下:首先,我们从图片库中随机选择一张清晰图 x0,再随机选择一个满足正态分布的完全噪音图 ε ;然后,随机选择一个 Time Step,并对它进行编码;接下来按照上述公式直接在原始图片 x0 基础上融合噪音 ε 来产生混合噪音图 xt,加入噪音程度系数  与 Time Step 有关,原则上,Time Step 越大,则  越小,原始图片信息融入得越少,噪音程度系数值  则越大,混合后的噪音图 xt 噪音程度越高,也就是说混入更高比例的噪音到原始清晰图 x0 中。这样就一步形成了某个 time step 下的噪音图。

Sora关键技术逆向工程图解 | 万字长文_生成模型_66

当人为加入可控噪音后,等于制作出了训练数据:<构造出的混合噪音图 xt,构造这张混合噪音图时对应的 Time Step,被加入的噪音图 ε>。用这个训练数据,我们可以来训练一个神经网络模型 f(θ),输入混合噪音图 xt 以及噪音图对应的 Time Step 信息,让f(θ) 根据这两个信息,反向预测到底加入了怎样的噪音 ε′,而前向过程被加入的噪音图 ε 就是标准答案。神经网络f(θ) 当前预测的噪音图 ε′ 和标准答案 ε 对比,两者的差异(ε−ε′) 形成损失(MSE Loss),把预测差异通过反向传播去调整神经网络的参数,使得神经网络能够预测得越来越准。这就是训练 Diffusion Model 的过程。当然,这里为了方便讲清楚,我做了一定程度的简化。

Sora关键技术逆向工程图解 | 万字长文_编码器_67

如果经过上述过程训练好 Diffusion Model 之后,在使用阶段,Diffusion Model 的反向过程如上图所示,分为两个阶段。第一个阶段,我们把需要进一步去除噪音的某个混合噪音图 xt,以及混合噪音图当前对应的去噪步数(Time Step)信息,输入训好的神经网络 f(θ),此时神经网络 f(θ) 会预测出一个噪音图 ε′。第二个阶段,拿到了神经网络预测的噪音图 ε′ 后,混合噪音图片 xt 减掉预测的噪音图 ε′,就完成了一步去噪音的过程,图像包含的噪音就减少一些,变得更清晰一些。去噪过程仍然需要一步一步逐渐完成,不能像加噪过程那样一步完成。

Sora关键技术逆向工程图解 | 万字长文_编码器_68

上面介绍的是无条件约束下的图像 Diffusion Model 运行过程,而像文生图模型比如 Stable Diffusion 这种模型,是在有文本 Prompt 约束下进行的,希望模型能生成符合文本描述的图像。如何将无条件的 Diffusion Model 改造成有条件约束的模型呢?

很简单,我们可以使用比如 CLIP 的文本编码器,把 Prompt 从文本空间映射到与图像对齐的参数空间内,然后以此作为 Diffusion Model 模型生成图片的指导条件。类似地,Diffusion Model 预测的噪音 ε′ 会和人为加入的噪音标准 ε 进行对比,以减小两者的差异作为学习目标,来更新 Diffusion Model 的参数,这样能让神经网络预测噪音越来越准,那么去噪效果也就会越来越好。

Sora关键技术逆向工程图解 | 万字长文_数据_69

上面是 Diffusion Model 的基本原理,接下来我们介绍如何推导出 Video DiTs 视频生成模型的结构。首先要明确的是,基于 Transformer 的 Diffusion Model 整个工作流程,就是上面介绍的加噪和去噪过程,无非预测噪音的神经网络结构,从传统做 Diffusion Model 常用的 U-Net 网络,换成了 Transformer 网络结构而已。

Sora关键技术逆向工程图解 | 万字长文_生成模型_70

大家都猜测 Sora 是基于 DiTs 模型(可参考:Scalable Diffusion Models with Transformers),原因在于 William Peebles 作为 Sora 项目的 Co-Lead,也是 DiTS 模型的一做,所以大家推测 Sora 的 Diffusion Model 是基于 DiTs 改的,这个猜测听着还是蛮合理的。

Sora关键技术逆向工程图解 | 万字长文_数据_71

DiTs 是基于 Transformer 的 Diffusion Model 图像生成模型,看着结构比较复杂,其实整体结构和上文介绍的标准的有条件 Transformer Diffusion Model 生成模型基本一致,上图在 DiTs 结构图的对应位置标注出了相应的组件名称,左右两图可以对照着看下。

Sora关键技术逆向工程图解 | 万字长文_数据_72

需要注意的是,DiTs 是生成图片的模型,直接拿来做视频模型肯定是不行的。我们至少需要在 DiTs 上做两项改造:首先,需要设计一定的模型结构,用来支持不同长宽比和分辨率的视频;第二,需要把图片生成模型改成视频生成模型。

Sora关键技术逆向工程图解 | 万字长文_数据_73

先来看下第一个改造,用来从 Transformer 模型结构层面支持不同长宽比和分辨率的视频。在 Spacetime Latent Patch 阶段我们谈到过,经过 NaVIT 改造,不同图片或视频帧的输入 Patch 是变长的,所以在 Transformer 阶段,我们需要引入 Attention Mask 机制,保证 Transformer 在做 Local Spatial Attention 的时候,属于某张图片的 Patch 只能相互之间看到自己这张图片内的其它 Patch,但不能看到其它图片的内容。

另外,因为这个引入的 Attention Mask 是针对输入 Patch 的,所以 Transformer 内的这个 Local Spatial Attention 模块一定在 Transformer 内部结构的最底层。

经过上述推导,我们可得出如上图所示的 Transformer 内部结构,它目前由两个子模块构成:最底层是 Local Spatial Attention 模块,主要计算图片或视频帧的空间信息,也就是对同一个视频帧内的各个 Patch 关系进行建模。在它之上,有一个标准的 MLP 模块,这个是 Transformer 模块做非线性映射所必需的。

现在的问题是:如果每个视频帧的 Patch 数是固定的,那么这个 Local Spatial Attention 模块就很容易设计,但是我们面对的是变长 Patch,具体采取什么技术手段才能实现针对变长 Patch 的 Local Spatial Attention 呢?

Sora关键技术逆向工程图解 | 万字长文_生成模型_74

这里给出一个可能的解决方法,主要思路来自于文献《Efficient Sequence Packing without Cross-contamination:Accelerating Large Language Models without Impacting Performance》。我们可采用 “0/1 Attention Mask 矩阵” 来达成目标,从上图可看出思路也很简洁:如果我们假设 Batch 内序列最大长度是 8,就可以设置一个 8∗8 的 0/1 Attention Mask,只有对角线正方形子 Block 位置全是 1,其它地方都设置成 0。左图中标为绿色的某帧三个 Patch,如果看矩阵前三行,易看出,针对其它帧的 Attention Mask 由于都是 0,所以加上 Mask 后就看不到其它图片,而对于它对应的 3∗3 都是 1 的 Attention Mask,又可以保证三个 Patch 相互都能看到。其它图片也是类似的道理。通过设置 Attention Mask,就可以很方便地支持 NaVIT 导致的每帧不同分辨率和长宽比的问题。

Sora关键技术逆向工程图解 | 万字长文_编码器_75

接下来进行第二项改造,从 DiTs 到 Video DiTs,也就是让 DiTs 能够支持视频生成。这步改进比较简单,因为大多数视频生成模型都有这个模块,就是在我们上一步改造的 Transformer 结构里,加入一个 Casual Time Attention 子模块。Causal Time Attention 模块的作用是在生成第 i 帧的时候,收集历史 Time 信息,也就是通过 Attention 让第 i 帧看到之前的比如 k 帧内容,这是用来维护生成视频的时间一致性的,做视频生成肯定需要它。至于它的位置,因为 Local Spatial Attention 必然在 Transformer 内部最下方,所以 Causal Time Attention 放在之前引入的两个子模块中间,这是个合理选择。

Sora关键技术逆向工程图解 | 万字长文_数据_76

Local Spatial Attention 和 Causal Time Attention 的具体含义,如果按照时间序列展开,则如上图所示,比较简单不解释了。

Sora关键技术逆向工程图解 | 万字长文_编码器_77

前面在讲 Diffusion Model 原理的时候提过,利用 Diffusion Model 来做文本生成视频,还需要两个条件变量:Prompt 文本信息,以及 Time Step 信息。如果把这两个条件引入,一种设计方案是把两个条件信息压缩后,并排放入每一帧的输入信息里;另外一种思路是可以在 Transformer 目前的 3 个子模块里再引入一个 Condition Attention Block,把输入条件接入这个模块,通过 Attention 模式工作。目前已有研究(可参考:《VDT:General-purpose Video Diffusion Transformers via Mask Modeling》)证明,尽管第一种把条件变量塞到输入部分的做法很简单,但是效果是很好的,训练起来模型收敛速度也较快。基于此,我这里就选择了这种简洁的方案,思路如上图所示。

Sora关键技术逆向工程图解 | 万字长文_数据_78

如果归纳下 Video DiTs 的整个逻辑,就如上图所示。把噪音 Patch 线性化后,并入 Prompt 和 Time Step 条件,一起作为 Transformer 的输入。Transformer 内部由三个子模块构成:Local Spatial Attention 模块负责收集视频帧空间信息;Causal Time Attention 模块负责收集历史时间信息;MLP 模块负责对时间和空间信息通过非线性进行融合。叠加比如 N 个这种 Transformer 模块,就可以预测当前 Time Step 加入的噪音,实现一步去噪音操作。对于 Diffusion Model 的逆向去噪过程,Time Step 可能需要如此反复迭代 20 到 50 次去噪过程,才能形成清晰的视频帧。这也是为何 Sora 比较慢的原因之一。

Sora关键技术逆向工程图解 | 万字长文_生成模型_79

Sora 的 Long Time Consistency 可能策略:

暴力美学还是 FDM?

Sora关键技术逆向工程图解 | 万字长文_数据_80

Sora关键技术逆向工程图解 | 万字长文_编码器_81

如何维护生成长视频的内容一致性也是一个研究方向,目前一种比较常见的策略是 “LLM+Diffusion Model” 集成策略,如上图所示的流程。其基本思想是:可以把长视频分成多个分镜场景,对于用户输入的 Prompt,可以用比如 GPT-4 这种 LLM 模型自动生成多场景各自的拓展 Prompt 描述,然后用视频生成模型生成对应的分场景视频,就是 “分场景拼接” 的模式。

但这里有个问题,比如主角可能在各个分场景都会出现,如果不做一些特殊的维护角色一致性处理的话,可能会出现主角形象老在不断变化的问题,也就是角色不一致的问题。上面这个工作 VideoDrafter(可参考:《VideoDrafter:Content-Consistent Multi-Scene Video Generation with LLM》)是这么处理的:它让 LLM 产生一个角色的形象描述文字,然后使用比如 Stable Diffusion 文生图模型,根据形象描述文字,生成全局固定的角色外观图片。在每个分场景内,都依托这个唯一的角色外观图片来生成视频,这样可以解决不同分场景的角色一致性问题。

Sora 会采取这种策略吗?我猜可能性不太大,对于很通用的 Prompt 描述,明确确定主角或特定角色其实是不太容易的,这种明确角色、产生全局固定形象的思路,感觉比较适合特定领域的视频生成。

Sora关键技术逆向工程图解 | 万字长文_生成模型_82

这里提一种粗暴野蛮但简单的可能做法,如上图所示。就是说,在生成第 i 帧视频的时候,把 Time Attention 拉长,让第 i 帧看到前面从第 1 帧到第(i−1)帧所有的历史内容,这类似 TECO 在做 VAE 时集成 Time 信息的做法。这种做法看到的历史比较长,所以可能在维护一致性方面有好处,但明显对算力要求很高。

Sora 有可能这么做吗?并不能排除这种可能性,证据来自于上图中 Sora 技术报告的截图,红圈标出的文字意思是 Sora 为了维持长时一致性,会一次看之前的很多帧。

Sora关键技术逆向工程图解 | 万字长文_生成模型_83

在 Transformer Diffusion Model 阶段维护 “长时一致性” 策略方面,感觉 FDM(Flexible Diffusion Modeling)方法是种简洁有效的思路。FDM(可参考:《Flexible Diffusion Modeling of Long Videos》)提出了两种 Time Attention 改进模型,在维护长时一致性方面效果不错。之前我们提到 TECO 的评测,右下角的评测图里,除了 TECO 那条蓝色线,紧接着的红色线就是 FDM 在 500 帧视频生成的效果。而且很明显,FDM 这种 Time Attention 和 TECO 这种 VAE 编码,两者都出于维护生成视频一致性的目的,而在模型中所处的位置不同,所以两者是有互补性的。

Sora关键技术逆向工程图解 | 万字长文_生成模型_84

下面介绍下 FDM 的两种 Time Attention 的思路,在介绍之前,先说明下基准方法,也就是 “自回归方法 “(Autoregressive)。如图所示,“自回归” 思路很直接,先依次生成若干比如 6 帧视频帧,然后一次生成后续 3 帧,在生成这 3 帧的时候,Time Attention 会看到之前的最近若干帧,比如 4 帧。也就是说,“自回归” 在生成后续视频帧的时候,会参考之前最近的若干帧。容易看出,这是一种 “短时” Attention,而非 “长时” Attention。

Sora关键技术逆向工程图解 | 万字长文_编码器_85

“Long Range” 是 FDM 提出的第一种 “长时一致性” 模型,思路如图所示。想法很直观:在生成第 i 帧视频的时候,不仅仅参考最近的几帧,也会在较远历史里固定住若干帧作为参考。可以看出,“Long Range” 既参考短时历史,也参考长时历史,不过长时历史位置是随机选的,也是固定的。

Sora关键技术逆向工程图解 | 万字长文_生成模型_86

“Hierarchy 方法” 是 FDM 提出的第二种长时 Attention 策略。它首先从较长历史里间隔采样,获得之前历史的大致轮廓,在全局历史视频帧引导下,先产生后面若干关键位置的视频帧,比如第一帧、最后一帧以及中间帧。这意思是根据全局的历史,来生成全局的未来。之后按顺序生成后续帧,在生成后续帧的时候,不仅参考最近的历史,同时也参考第一步生成的未来关键位置视频帧。所以这是一种先谋划全局,再斟酌现在的 “长远与近期相结合” 的层级化的 Time Attention。

我无法确定 Sora 是否会用类似 FDM 的思路,但是觉得这是维护长时一致性较为可取的一种方法。

Sora关键技术逆向工程图解 | 万字长文_数据_87

Sora 的训练过程与技巧:合成数据、两阶段训练及双向生成

Sora关键技术逆向工程图解 | 万字长文_编码器_88

Sora关键技术逆向工程图解 | 万字长文_编码器_89

需要再次强调下:所有文生视频模型,本质上都是有监督学习,是需要大量高质量标注好的 <文本,视频> 成对数据来训练的,它们不是类似 LLM 的那种自监督学习那样,无需标注数据。

尽管有些开源的带标注视频数据,但是无论数据量还是质量,想要作出类似 Sora 这么高质量的视频生成模型,基本上是没可能的。所以,如果想要复现 Sora,如何自动化地做出大量高质量标注视频数据可能才是最关键,也是最难的一步。(当然,我们可以借鉴 LLM 蒸馏 GPT4 的历史经验,估计这些 GPT-4V 视频标注蒸馏方案,很快就会出现)

我觉得,Sora 之所以效果这么好,在制作带标注视频合成数据方面的贡献很可能是最大的。Sora 采用了类似 DALLE 3 的方法来制作视频合成数据。上图左侧展示了 DALLE 3 制作 < 文本,图片 > 合成数据的流程。图片标注数据网上资源有很多,比如 5B 的 LAION 数据,但是标注质量有些问题,一方面是太粗略太短没有细节描述,一方面里面有些是错误的。

鉴于此,DALLE 3 通过人工标注(或者人加 GPT 相结合?)一些 < 详细文本描述,图片 > 数据,用这个数据来训练一个 Image-Caption Model(ICM),就是说 ICM 接受图片输入,学习根据图片内容,自动产生图片的详细描述。有了 ICM 模型,DALLE 3 用它生成的长文本描述,替换掉原先图文标注数据里的短文本描述,就制作出了大批量的高质量合成数据,这对 DALLE 3 质量提升帮助很大。

Sora 的视频合成数据制作过程应该是类似的(参考上图右侧)。通过人工标注(或人 + GPT)一批高质量的 < 视频,长文本描述 > 数据,可以训练一个 Video-Caption Model。VCM 模型训练好后,可以接受视频,输出详细的文本描述。之后,可以用 VCM 产生的视频长描述替换掉标注视频数据里的简短文本描述,就产生了高质量的视频合成数据。

其实思路可以再打开,既然我们有了 VCM,也可以给没有标注的视频自动打上长文本描述,没问题吧?这样的话,可以挑那些高质量视频,用 VCM 打上详细文本描述,这就制作出了大量的、非常高质量的视频标注数据。

另外,既然 Sora 是图片和视频联合训练,那么很显然,训练 DALLE 3 的那批图文合成数据,那肯定在训练 Sora 的时候也用了。

Sora 在训练的时候应该采取了两阶段训练过程,下面简述其做法。

Sora关键技术逆向工程图解 | 万字长文_数据_90

一般 VAE 是独立训练的,收集大量的图片或视频数据后,通过图片或视频重建的训练目标,可以得到对应的 “视觉编码器 - 解码器”。此部分训练是自监督学习,不需要标注数据。

Sora关键技术逆向工程图解 | 万字长文_数据_91

第二阶段是包括 Diffusion Model 在内整个模型的训练,这一阶段训练过程中,一般前一阶段训练好的 Encoder-Decoder 会冻结模型参数,不随着这步骤的训练数据发生变动,包括 Text Encoder 也是利用现成的比如 CLIP,也会类似地冻结住模型参数。所以这部分训练主要涉及 Spacetime Latent Patch 对应的 Position Embedding,以及预测噪音的基于 Transformer 的 Diffusion Model 的训练。

Sora关键技术逆向工程图解 | 万字长文_生成模型_92

另外,Sora 还支持多种方式的视频生成,比如输入一张静态图生成完整视频、生成无限循环视频、输入结尾几帧图片倒着生成完整视频、给定两段视频内容生成新内容将两者平滑地连接起来等。

Sora关键技术逆向工程图解 | 万字长文_生成模型_93

可以推断,在 Sora 的训练过程中,采用了在输入侧中间位置加入已知图片,然后同时按照时间维度的正向生成视频和反向生成视频的双向生成策略。一方面,引入这种双向生成策略,可以方便地支持上面讲的各种灵活的视频生成类型;另外一方面,其实如果采取从中间向时间维度两边拓展的生成模式,更有利于维护生成内容的连贯性和一致性。因为中间位置向两边拓展,只需要维护一半时间窗口的内容一致性即可,两边向中间内容靠拢,这看上去是双向生成策略带来的额外好处。

Sora关键技术逆向工程图解 | 万字长文_生成模型_94

比如,之前提到的输入一张图片生成完整视频,从视频内容可知,这个例子是把输入图片放在了输入噪音图片序列的最后一帧,然后按照时间顺序倒着生成的。再比如,生成无限循环视频,可以把某一帧视频图片,分别插入在中间位置和头尾位置,然后从中间位置分别向两边生成,这样就会产生一个看上去总在无限循环的视频内容。

Sora关键技术逆向工程图解 | 万字长文_编码器_95

可见,若能方便地在指定输入位置插入图片,即可方便地支持双向训练或灵活的视频生成方式。那么,如何达成这一点呢?可以采用掩码策略(思路可参考:《VDT:General-purpose Video Diffusion Transformers via Mask Modeling》),如上图所示。图右侧 M 是 0/1 掩码矩阵,对应矩阵取值要么都是 1 要么都是 0,而 C 是引入的掩码帧序列,可以把已知图片插入到指定位置,并把它对应的掩码矩阵设置为 1,其它掩码帧可以是随机噪音,对应掩码矩阵设置为 0。M 和 C 经过 Bit 级矩阵乘法,获得掩码运算结果,对应 0 掩码矩阵内容都被清零,而对应 1 的掩码矩阵的内容仍然保留,这样形成掩码帧。

相应地,对 Diffusion Model 的输入噪音序列 F 来说,设置一个反向掩码矩阵序列(1−M),其 0/1 矩阵取值和对应的掩码帧 0/1 矩阵 M 正好相反,同样地,(1−M) 和 F 进行掩码运算后,要插入图片位置的输入帧数据被清零,其它噪音帧内容保持不变。

接下来只要将噪音输入帧和对应的掩码帧进行矩阵加法运算,这样就把已指图片插入到 Diffusion Model 的指定位置了。

Sora关键技术逆向工程图解 | 万字长文_生成模型_96

Sora 能作为物理世界模拟器吗

Sora关键技术逆向工程图解 | 万字长文_数据_97

OpenAI 宣称 Sora 是物理世界模拟器,这个问题的答案非常主观,每个人都有不同的看法。我觉得以目前的技术条件来说,单靠 Sora 本身很难构造世界模拟器,更愿意把 OpenAI 这么讲看成是他们对 Sora 寄托的愿景,而非已经成立的事实。

Sora关键技术逆向工程图解 | 万字长文_生成模型_98