文章作者:张俊林 新浪微博 新技术研发负责人
内容来源:知乎@张俊林
导读:Sora生成的视频效果好吗?确实好。Sora算得上AGI发展历程上的里程碑吗?我个人觉得算。我们知道它效果好就行了,有必要知道Sora到底是怎么做的吗?我觉得最好是每个人能有知情的选择权,任何想知道的人都能够知道,这种状态比较好。那我们知道Sora到底是怎么做出来的吗?不知道。
Transformer Diffusion Model:从Diffusion Model原理到Video DiTs模型
本部分我们会先介绍下Diffusion Model基本原理,然后逐步推导Video DiTs模型可能的内部结构。上图展示了 Diffusion Model 的基本原理,Diffusion Model 由正向加噪和反向去噪过程构成。假设我们有一个很大的图片库,可以从中随机选择一张x0 ,正向过程分多次,每次加入不同程度的符合正态分布的噪音到原始图片里,直到清晰图完全转化为纯噪音图 ξ 为止。而反向去噪过程则从转化来的纯噪音图 ξ 开始,训练神经网络预测对应步骤加入的噪音是什么,然后从纯噪音图 ξ 里减掉预测的噪音,图像清晰程度就增加一些,依次反向逐步一点一点去除噪音,就能恢复出最初的 x0 图片内容。Diffusion Model 的前向过程是人为可控地对已知图片逐步加入不同程度噪音的过程,即噪音的逐步“扩散”过程。经数学推导,对于第 t 个 Time Step 的加噪音过程可以一步完成,不需要上述的逐渐扩散的过程,如上图所列出公式所示。给图片加噪音的具体过程如下:首先,我们从图片库中随机选择一张清晰图x0 ,再随机选择一个满足正态分布的完全噪音图 ε ;然后,随机选择一个 Time Step,并对它进行编码;接下来按照上述公式直接在原始图片 x0 基础上融合噪音 ε 来产生混合噪音图 xt ,加入噪音程度系数 与 Time Step 有关,原则上,Time Step 越大,则 越小,原始图片信息融入得越少,噪音程度系数值 则越大,混合后的噪音图 xt 噪音程度越高,也就是说混入更高比例的噪音到原始清晰图 x0 中。这样就一步形成了某个 time step 下的噪音图。当人为加入可控噪音后,等于制作出了训练数据:<构造出的混合噪音图xt ,构造这张混合噪音图时对应的 Time Step,被加入的噪音图 ε >。用这个训练数据,我们可以来训练一个神经网络模型 f(θ) ,输入混合噪音图 xt 以及噪音图对应的 Time Step 信息,让 f(θ) 根据这两个信息,反向预测到底加入了怎样的噪音 ε′ ,而前向过程被加入的噪音图 ε 就是标准答案。神经网络 f(θ) 当前预测的噪音图 ε′ 和标准答案 ε 对比,两者的差异 (ε−ε′) 形成损失(MSE Loss),把预测差异通过反向传播去调整神经网络的参数,使得神经网络能够预测得越来越准。这就是训练Diffusion Model 的过程。当然,这里为了方便讲清楚,我做了一定程度的简化。如果经过上述过程训练好 Diffusion Model 之后,在使用阶段,Diffusion Model 的反向过程如上图所示,分为两个阶段。第一个阶段,我们把需要进一步去除噪音的某个混合噪音图xt ,以及混合噪音图当前对应的去噪步数(Time Step)信息,输入训好的神经网络 f(θ) ,此时神经网络 f(θ) 会预测出一个噪音图 ε′ 。第二个阶段,拿到了神经网络预测的噪音图 ε′ 后,混合噪音图片 xt 减掉预测的噪音图 ε′ ,就完成了一步去噪音的过程,图像包含的噪音就减少一些,变得更清晰一些。去噪过程仍然需要一步一步逐渐完成,不能像加噪过程那样一步完成。上面介绍的是无条件约束下的图像 Diffusion Model 运行过程,而像文生图模型比如Stable Diffusion 这种模型,是在有文本 Prompt 约束下进行的,希望模型能生成符合文本描述的图像。如何将无条件的 Diffusion Model 改造成有条件约束的模型呢?很简单,我们可以使用比如 CLIP 的文本编码器,把 Prompt 从文本空间映射到与图像对齐的参数空间内,然后以此作为 Diffusion Model 模型生成图片的指导条件。类似地,Diffusion Model 预测的噪音ε′ 会和人为加入的噪音标准 ε 进行对比,以减小两者的差异作为学习目标,来更新 Diffusion Model 的参数,这样能让神经网络预测噪音越来越准,那么去噪效果也就会越来越好。上面是 Diffusion Model 的基本原理,接下来我们介绍如何推导出Video DiTs 视频生成模型的结构。首先要明确的是,基于 Transformer的 Diffusion Model 整个工作流程,就是上面介绍的加噪和去噪过程,无非预测噪音的神经网络结构,从传统做Diffusion Model 常用的 U-Net 网络,换成了Transformer 网络结构而已。大家都猜测 Sora 是基于 DiTs 模型(可参考:Scalable Diffusion Models with Transformers),原因在于 William Peebles作为 Sora 项目的 Co-Lead,也是 DiTS 模型的一做,所以大家推测 Sora 的 Diffusion Model 是基于 DiTs 改的,这个猜测听着还是蛮合理的。DiTs 是基于 Transformer的Diffusion Model 图像生成模型,看着结构比较复杂,其实整体结构和上文介绍的标准的有条件Transformer Diffusion Model 生成模型基本一致,上图在 DiTs 结构图的对应位置标注出了相应的组件名称,左右两图可以对照着看下。需要注意的是,DiTs 是生成图片的模型,直接拿来做视频模型肯定是不行的。我们至少需要在DiTs 上做两项改造:首先,需要设计一定的模型结构,用来支持不同长宽比和分辨率的视频;第二,需要把图片生成模型改成视频生成模型。先来看下第一个改造,用来从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 呢?这里给出一个可能的解决方法,主要思路来自于文献“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 导致的每帧不同分辨率和长宽比的问题。接下来进行第二项改造,从 DiTs 到 Video DiTs,也就是让 DiTs 能够支持视频生成。这步改进比较简单,因为大多数视频生成模型都有这个模块,就是在我们上一步改造的Transformer 结构里,加入一个 Casual Time Attention 子模块。Causal Time Attention 模块的作用是在生成第 i 帧的时候,收集历史 Time 信息,也就是通过 Attention 让第 i 帧看到之前的比如 k 帧内容,这是用来维护生成视频的时间一致性的,做视频生成肯定需要它。至于它的位置,因为 Local Spatial Attention 必然在 Transformer 内部最下方,所以Causal Time Attention 放在之前引入的两个子模块中间,这是个合理选择。Local Spatial Attention 和Causal Time Attention 的具体含义,如果按照时间序列展开,则如上图所示,比较简单不解释了。前面在讲Diffusion Model 原理的时候提过,利用 Diffusion Model 来做文本生成视频,还需要两个条件变量:Prompt 文本信息,以及 Time Step 信息。如果把这两个条件引入,一种设计方案是把两个条件信息压缩后,并排放入每一帧的输入信息里;另外一种思路是可以在Transformer 目前的 3 个子模块里再引入一个 Condition Attention Block,把输入条件接入这个模块,通过 Attention模式工作。目前已有研究(可参考:VDT: General-purpose Video Diffusion Transformers via Mask Modeling)证明,尽管第一种把条件变量塞到输入部分的做法很简单,但是效果是很好的,训练起来模型收敛速度也较快。基于此,我这里就选择了这种简洁的方案,思路如上图所示。如果归纳下 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 比较慢的原因之一。07
Sora的Long Time Consistency可能策略:暴力美学还是FDM?如何维护生成长视频的内容一致性也是一个研究方向,目前一种比较常见的策略是“LLM+Diffusion Model”集成策略,如上图所示的流程。其基本思想是:可以把长视频分成多个分镜场景,对于用户输入的Prompt,可以用比如 GPT-4 这种 LLM 模型自动生成多场景各自的拓展 Prompt 描述,然后用视频生成模型生成对应的分场景视频,就是“分场景拼接”的模式。但这里有个问题,比如主角可能在各个分场景都会出现,如果不做一些特殊的维护角色一致性处理的话,可能会出现主角形象老在不断变化的问题,也就是角色不一致的问题。上面这个工作VideoDrafter(可参考:VideoDrafter: Content-Consistent Multi-Scene Video Generation with LLM)是这么处理的:它让 LLM 产生一个角色的形象描述文字,然后使用比如 Stable Diffusion 文生图模型,根据形象描述文字,生成全局固定的角色外观图片。在每个分场景内,都依托这个唯一的角色外观图片来生成视频,这样可以解决不同分场景的角色一致性问题。Sora会采取这种策略吗?我猜可能性不太大,对于很通用的Prompt 描述,明确确定主角或特定角色其实是不太容易的,这种明确角色、产生全局固定形象的思路,感觉比较适合特定领域的视频生成。这里提一种粗暴野蛮但简单的可能做法,如上图所示。就是说,在生成第i 帧视频的时候,把 Time Attention 拉长,让第i 帧看到前面从第 1 帧到第(i−1) 帧所有的历史内容,这类似 TECO 在做 VAE 时集成 Time信息的做法。这种做法看到的历史比较长,所以可能在维护一致性方面有好处,但明显对算力要求很高。Sora有可能这么做吗?并不能排除这种可能性,证据来自于上图中Sora 技术报告的截图,红圈标出的文字意思是 Sora 为了维持长时一致性,会一次看之前的很多帧。在 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 编码,两者都出于维护生成视频一致性的目的,而在模型中所处的位置不同,所以两者是有互补性的。下面介绍下 FDM 的两种 Time Attention 的思路,在介绍之前,先说明下基准方法,也就是“自回归方法“(Autoregressive)。如图所示,“自回归”思路很直接,先依次生成若干比如 6 帧视频帧,然后一次生成后续3 帧,在生成这 3 帧的时候,Time Attention 会看到之前的最近若干帧,比如 4 帧。也就是说,“自回归”在生成后续视频帧的时候,会参考之前最近的若干帧。容易看出,这是一种“短时”Attention,而非“长时” Attention。“Long Range”是 FDM 提出的第一种“长时一致性”模型,思路如图所示。想法很直观:在生成第i帧视频的时候,不仅仅参考最近的几帧,也会在较远历史里固定住若干帧作为参考。可以看出,“Long Range”既参考短时历史,也参考长时历史,不过长时历史位置是随机选的,也是固定的。“Hierarchy 方法”是 FDM 提出的第二种长时 Attention 策略。它首先从较长历史里间隔采样,获得之前历史的大致轮廓,在全局历史视频帧引导下,先产生后面若干关键位置的视频帧,比如第一帧、最后一帧以及中间帧。这意思是根据全局的历史,来生成全局的未来。之后按顺序生成后续帧,在生成后续帧的时候,不仅参考最近的历史,同时也参考第一步生成的未来关键位置视频帧。所以这是一种先谋划全局,再斟酌现在的“长远与近期相结合”的层级化的Time Attention。我无法确定Sora 是否会用类似 FDM 的思路,但是觉得这是维护长时一致性较为可取的一种方法。08
Sora的训练过程与技巧:合成数据、两阶段训练及双向生成需要再次强调下:所有文生视频模型,本质上都是有监督学习,是需要大量高质量标注好的<文本,视频>成对数据来训练的,它们不是类似 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在训练的时候应该采取了两阶段训练过程,下面简述其做法。一般 VAE 是独立训练的,收集大量的图片或视频数据后,通过图片或视频重建的训练目标,可以得到对应的“视觉编码器-解码器”。此部分训练是自监督学习,不需要标注数据。第二阶段是包括 Diffusion Model 在内整个模型的训练,这一阶段训练过程中,一般前一阶段训练好的Encoder-Decoder 会冻结模型参数,不随着这步骤的训练数据发生变动,包括 Text Encoder 也是利用现成的比如 CLIP,也会类似地冻结住模型参数。所以这部分训练主要涉及Spacetime Latent Patch 对应的 Position Embedding,以及预测噪音的基于 Transformer 的 Diffusion Model 的训练。另外,Sora 还支持多种方式的视频生成,比如输入一张静态图生成完整视频、生成无限循环视频、输入结尾几帧图片倒着生成完整视频、给定两段视频内容生成新内容将两者平滑地连接起来等可以推断,在 Sora 的训练过程中,采用了在输入侧中间位置加入已知图片,然后同时按照时间维度的正向生成视频和反向生成视频的双向生成策略。一方面,引入这种双向生成策略,可以方便地支持上面讲的各种灵活的视频生成类型;另外一方面,其实如果采取从中间向时间维度两边拓展的生成模式,更有利于维护生成内容的连贯性和一致性。因为中间位置向两边拓展,只需要维护一半时间窗口的内容一致性即可,两边向中间内容靠拢,这看上去是双向生成策略带来的额外好处。比如,之前提到的输入一张图片生成完整视频,从视频内容可知,这个例子是把输入图片放在了输入噪音图片序列的最后一帧,然后按照时间顺序倒着生成的。再比如,生成无限循环视频,可以把某一帧视频图片,分别插入在中间位置和头尾位置,然后从中间位置分别向两边生成,这样就会产生一个看上去总在无限循环的视频内容。可见,若能方便地在指定输入位置插入图片,即可方便地支持双向训练或灵活的视频生成方式。那么,如何达成这一点呢?可以采用掩码策略(思路可参考: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的指定位置了。09Sora能作为物理世界模拟器吗
OpenAI宣称Sora是物理世界模拟器,这个问题的答案非常主观,每个人都有不同的看法。我觉得以目前的技术条件来说,单靠Sora本身很难构造世界模拟器,更愿意把OpenAI这么讲看成是他们对Sora寄托的愿景,而非已经成立的事实。对此更详尽的个人思考可见:https://zhuanlan.zhihu.com/p/684089478以上就是本次分享的内容,谢谢大家分享嘉宾
INTRODUCTION
张俊林
新浪微博
新技术研发负责人
往期推荐
【文末赠书】大语言模型训练优化秘籍
十分钟验证一个高性能车联网数据平台解决方案
当AIGC的风吹到了电商领域
OLTP&OLAP超融合,揭秘新一代云原生数据库的设计之道
快手BI大数据分析场景性能优化实践
NVIDIA大语言模型落地的全流程解析
流图计算在蚂蚁数仓加速场景的应用
AI风暴来袭:2024年数据平台的演进、挑战与机遇
货拉拉利用时空熵平衡提升营销效率的实践
蚂蚁金服异常检测和归因诊断分析实践
点个在看你最好看