[翻译+笔记] 用于视频生成的Diffusion Model
这次翻译+笔记的博客是https://lilianweng.github.io/posts/2021-07-11-diffusion-models/
在阅读这篇博客前, 推荐先对Diffusion Model进行了解. 可以看我的笔记: https://blog.csdn.net/wjpwjpwjp0831/article/details/141524088
视频相关的任务向来是比图像更有挑战性, 这是因为视频除了空间域之外, 还有时间域, 并且还要保证时空连续性, 来达到合理的结果. 此外, 对于视频任务来说, 数据也是比较难获取的. 这篇博客从两大类介绍了用于视频生成的Diffusion Model, 一类是从头学习的Generation, 一类是在已经训练好的图像生成的Diffusion Model上进行微调, 或干脆是training-free的.
1. 从头对视频生成进行建模
1.1 参数化&采样
设 x ∼ q r e a l \mathbf{x} \sim q_{real} x∼qreal表示从真实的数据分布中采样的样本. 对于加噪过程, 我们每一步都加入高斯噪声, 得到了一系列的中间量: { z t ∣ t − 1 , . . . , T } \{\mathbf{z}_t | t-1, ..., T\} {zt∣t−1,...,T}. 最终我们采样到的噪声应该是接近标准正态分布, 即 q ( z T ) ∼ N ( 0 , I ) q(\mathbf{z}_{T}) \sim \mathcal{N}(0, I) q(zT)∼N(0,I).
在Diffusion的加噪结论中, 我们可以直接从原始样本 x 0 \mathbf{x}_0 x0得到第 t t t步的加噪样本. 这个分布可以表示为:
q ( z t ∣ x ) = N ( z t ; α t x , σ t 2 I ) q\left(\mathbf{z}_t \mid \mathbf{x}\right)=\mathcal{N}\left(\mathbf{z}_t ; \alpha_t \mathbf{x}, \sigma_t^2 \mathbf{I}\right) q(zt∣x)=N(zt;αtx,σt2I)
我们考察加噪过程中的任一两个时间步的关系, 对于 0 ≤ s < t ≤ T 0\le s < t \le T 0≤s<t≤T, 有:
我们定义对数信噪比(log SNR)为
λ
t
=
log
[
α
t
2
/
σ
t
2
]
\lambda_t = \log [\alpha_t^2 / \sigma_t^2]
λt=log[αt2/σt2]. 这样定义是合理的, 因为对高斯分布来说, 均值表示信息, 而方差就表示不确定度(噪音). 我们重新整理
q
(
z
t
∣
z
s
)
q(\mathbf{z}_t | \mathbf{z}_s)
q(zt∣zs)的方差项:
α t 2 σ s 2 α s 2 σ t 2 = exp log [ α t 2 / σ t 2 α s 2 / σ s 2 ] = exp ( λ t − λ s ) \frac{\alpha_t^2 \sigma_s^2}{\alpha_s^2 \sigma_t^2 } = \exp \log [ \frac{\alpha_t^2 / \sigma_t^2}{\alpha_s^2 / \sigma_s^2}] = \exp ( \lambda_t - \lambda_s ) αs2σt2αt2σs2=explog[αs2/σs2αt2/σt2]=exp(λt−λs)
所以:
所以视频生成的整体范式和图像生成差不多, 只是数据的维度有所区别, 例如, 预测噪声的网络需要从2D UNet变成3D UNet, 详细见后文.
此外, 作者还介绍了一种简化的DDIM的更新方式, 也就是通过角度进行参数化, 这个方式是在论文PROGRESSIVE DISTILLATION FOR FAST SAMPLING OF DIFFUSION MODELS
提出的. 这种方式叫做v-prediction, 其中v的意思是速度, 也即latent变量
z
t
\mathbf{z}_t
zt的梯度方向. 通过角度参数化的方式, 实验表明在视频生成中可以减少颜色的偏移(我猜是因为通过同一个角度变量
ϕ
\phi
ϕ对样本变量
x
\mathbf{x}
x和噪声变量
ϵ
\epsilon
ϵ进行了约束, 增加了约束的条件). 下面进行详细的推导.
我们现在不通过log SNR来更新了, 转而考虑定义一个角度量 ϕ t = arctan ( σ t / α t ) \phi_t = \arctan(\sigma_t / \alpha_t) ϕt=arctan(σt/αt). 因此, 有 α t = cos ϕ , σ t = sin ϕ \alpha_t = \cos \phi, \sigma_t = \sin \phi αt=cosϕ,σt=sinϕ. 根据前面的 z t = α t x + σ t ϵ t \mathbf{z}_t = \alpha_t \mathbf{x} + \sigma_t \epsilon_t zt=αtx+σtϵt, 有
z ϕ = cos ϕ x + sin ϕ ϵ \mathbf{z}_\phi = \cos \phi \mathbf{x} + \sin \phi \epsilon zϕ=cosϕx+sinϕϵ
由于现在右侧是通过 ϕ \phi ϕ进行参数化, 所以 z \mathbf{z} z的下标改为 ϕ \phi ϕ.
我们现在考虑 z \mathbf{z} z的速度, 即梯度方向:
v ϕ ≡ d z ϕ d ϕ = d cos ( ϕ ) d ϕ x + d sin ( ϕ ) d ϕ ϵ = cos ( ϕ ) ϵ − sin ( ϕ ) x \mathbf{v}_\phi \equiv \frac{d \mathbf{z}_\phi}{d \phi}=\frac{d \cos (\phi)}{d \phi} \mathbf{x}+\frac{d \sin (\phi)}{d \phi} \epsilon=\cos (\phi) \epsilon-\sin (\phi) \mathbf{x} vϕ≡dϕdzϕ=dϕdcos(ϕ)x+dϕdsin(ϕ)ϵ=cos(ϕ)ϵ−sin(ϕ)x
然后我们重新整理出 x , ϵ \mathbf{x}, \epsilon x,ϵ和 z \mathbf{z} z的关系, 以便带入到去噪的迭代式中:
类似的地, 可以整理出
ϵ = sin ( ϕ ) z ϕ + cos ( ϕ ) v ϕ \epsilon=\sin (\phi) \mathbf{z}_\phi+\cos (\phi) \mathbf{v}_\phi ϵ=sin(ϕ)zϕ+cos(ϕ)vϕ
我们将上述结果代入到 z ϕ = cos ϕ x + sin ϕ ϵ \mathbf{z}_\phi = \cos \phi \mathbf{x} + \sin \phi \epsilon zϕ=cosϕx+sinϕϵ:
然后用积化和差公式, 得到:
z ϕ s = cos ( ϕ s − ϕ t ) z ϕ t + sin ( ϕ s − ϕ t ) v ^ θ ( z ϕ t ) \mathbf{z}_{\phi_s}=\cos \left(\phi_s-\phi_t\right) \mathbf{z}_{\phi_t}+\sin \left(\phi_s-\phi_t\right) \hat{\mathbf{v}}_\theta\left(\mathbf{z}_{\phi_t}\right) zϕs=cos(ϕs−ϕt)zϕt+sin(ϕs−ϕt)v^θ(zϕt)
注意其中的 v ^ θ ( z ϕ t ) \hat{\mathbf{v}}_\theta\left(\mathbf{z}_{\phi_t}\right) v^θ(zϕt)是一个网络, 是用来根据 z ϕ t \mathbf{z}_{\phi_t} zϕt来预测输出, 当然是一个 R d → R d \mathbb{R}^d \to \mathbb{R}^d Rd→Rd的映射. 所以, 按照这种方式理解的话, 更新过程(去噪过程)就是将 z ϕ t \mathbf{z}_{\phi_t} zϕt按照 − v ^ θ ( z ϕ t ) -\hat{\mathbf{v}}_\theta\left(\mathbf{z}_{\phi_t}\right) −v^θ(zϕt)的方向, 进行 ϕ s − ϕ t \phi_s-\phi_t ϕs−ϕt角度的圆周运动, 如下图所示:
说回到视频生成. 在生成的过程中, 我们第一次可能生成的是帧数比较少的视频, 那么其实我们还需要对其进行空间和时间上采样来获得更精细的视频. 比方说, 我们第一次生成了16帧的视频:
x
a
∼
p
θ
(
x
)
\mathbf{x}_a \sim p_\theta(\mathbf{x})
xa∼pθ(x), 那么现在就需要根据它扩展到第二个样本
x
b
∼
p
θ
(
x
b
∣
x
a
)
\mathbf{x}_b \sim p_\theta(\mathbf{x}_b | \mathbf{x}_a)
xb∼pθ(xb∣xa). 这个
x
b
\mathbf{x}_b
xb既可以包含
x
a
\mathbf{x}_a
xa中的部分帧, 也可以是
x
a
\mathbf{x}_a
xa帧间的扩展. 因此, 我们在不训练新的模型(例如预测联合分布的模型)的情况下, 可以用
x
a
\mathbf{x}_a
xa的分布梯度来指导
x
b
\mathbf{x}_b
xb的生成, 如下式:
1.2 模型架构: 3D UNet和Diffusion Transformer
在**Video Diffusion Model (VDM)**中, 将2D UNet扩展成了3D UNet. 主要是做了以下的变化:
-
首先, 将每个2D卷积变成了只提取空间信息的3D卷积, 比如说, 将 3 × 3 3 \times 3 3×3的卷积核, 变成 1 × 3 × 3 1 \times 3 \times 3 1×3×3的卷积核. 1 1 1指的是时间维度, 因此这里只提取空间信息.
-
在每个空间注意力块后面, 插入一个时间注意力块, 在张量的第一个维度(时间维)执行注意力. 此外, 在每个时间注意力块中使用相对位置嵌入, 以便网络能够以不需要绝对视频时间概念的方式区分帧的顺序
-
对于条件输入, 例如文本特征 c \mathbf{c} c和log SNR λ t \lambda_t λt和输入latent z t \mathbf{z}_t zt一起输入 (一起的方式可能是concat, 待考证). 当然, 作者发现在输入这些condition之前, 先用一个MLP进行处理效果会更好(起到一个对齐作用, 并且增加合理的复杂度).
3D UNet的架构如下所示:
此外, 还有一个工作, Imagen Video通过若干Diffusion model (7个) 级联的方式来逐步增加分辨率和fps. 主要组成部分如下:
- 一个frozen的T5的text encoder. 用于将文本编码作为condition.
- 一个基础的video diffusion model, 用于生成最开始的视频. 该model直接在每一帧都执行spatial attention, 然后最后再混合执行temporal attention, 来更好地捕捉时间上的依赖性. 如下图所示:
- 一系列的用于时空超分的diffusion model, 包括3个空间超分(SSR)和3个时间超分(TSR). SSR和TSE的condition是加噪的latent z t \mathbf{z}_t zt, 以及原始样本 x 0 \mathbf{x}_0 x0. SSR是通过双线性resize进行上采样, TSR是通过重复帧或者填补空白帧来进行上采样.
整个流程如下:
Sora则是利用Diffusion Transformer, 将视频用encoder搞成时空的patch然后输入到DiT当中. DiT的核心设计理念为:
- 输入为噪声latent
- 将噪声latent打成patch, 例如噪声的size为 ( I , I , C ) (I, I, C) (I,I,C), 则输入的patch序列长度为 ( I / p ) 2 (I/p)^2 (I/p)2.
- 此外, 也需要将输入的condition, 例如timestep和class label(类别控制生成的条件下), 进行输入. DiT选用adaLN进行condition和latent的融合. adaLN需要两个参数, 分布是scale参数和shift参数, 表示为 γ , β \gamma, \beta γ,β. γ β \gamma \beta γβ则直接根据condition经过一个MLP得出.
- 输出为预测的噪声和方差.
整体结构图如下:
2. 将Image Diffusion稍加调整来生成视频
还有一种方式是对text to image的diffusion model插入一些temporal的层, 这样的话我们既能保证尽量少的knowledge丢失, 还能降低训练难度.
2.1 在Video Data上进行微调
Make-A-Video这篇工作, 是将一个预训练的图像diffusion model在时间维上进行扩展, 包括三个部分:
- 一个base model
- 时空卷积层和注意力层来扩展维度
- 用于生成高帧率的帧插值网络
整个过程如下式所示:
Tune-A-Video是一个视频编辑的工作. 它的输入是一个原始视频, 以及一段描述性的文字, 用于目标编辑, 更改背景和风格迁移等.
除了将2D卷积变为3D卷积外, Tune-A-Video 的 U-Net 架构还集成了 ST-Attention(时空注意力)块, 通过查询前几帧中的相关位置来捕获时间一致性.
Gen-1这篇工作也是面向视频编辑. 两点是它采用了比较新颖的先验信息, 即内容
c
\mathbf{c}
c和结构
s
\mathbf{s}
s. 内容表示一个视频的外观和语义, 例如可以用CLIP来encode一个frame得到语义. 结构表示一个视频的纹理或者一些动态的东西, 例如形状, 位置, 目标的变化等等, 例如深度, 或者human pose都可以作为结构信息.
在image diffusion的基础上, Gen-1就是通过增加1D卷积层来拓展时间维信息的. 在训练和推理阶段, 结构信息被concat到加噪完成的latent z t \mathbf{z}_t zt后面, 而语义信息是作为交叉注意力的一部分在去噪过程中融合信息.
**Stable Video Diffusion (SVD)**是通过在latent diffusion model中每一个空间卷积层的后面都添加时间卷积层来实现视频生成. SVD在数据清洗上做了比较多的工作, 包括借助外部的CoCa, LLM等等对质量不高的帧进行去除.
**space-time UNet (STUNet)**则是更加关注于高质量的时间连续性. 为此, 它希望一口气生成整个时长的视频, 而不是还要多次执行时间超分模块(TSR). 所以STUNet直接对时空都进行下采样, 这样昂贵的计算就可以发生在紧凑的时空latent space中.
STUNet 对预训练的T2I的UNet进行膨胀, 以便能够在时间和空间维度上对视频进行下采样和上采样. 卷积块由预先训练的文本到图像层组成, 然后是分开的时空卷积. 在down sample最大的 级别, 基于注意力的块包含预先训练的文本到图像, 然后是时间注意力. 训练时仅对新添加的层进行微调.
2.2 Training-free的方法
怎么能做到不再微调直接生成视频? 这就必须要考虑如何让帧间的信息互通了, 或者作为约束. 例如, Text2Video-Zero设计了两个关键的机制:
- 在采样的时候, 加入一些运动先验, 也即加入一个向量用以模拟相机的运动方向;
- 采用跨帧注意力机制, 计算每一帧相对第一帧的注意力, 来维持上下文, 外观和目标.
整个流程图如下:
此外, ControlVideo在ControlNet的基础上, 做了以下三点改进:
- 基于文本描述 和运动序列, 例如depth map的动态序列
- 跨帧注意力: 是所有帧之间都计算, 不是和第一帧计算
- 采用了交错帧平滑以减少闪烁效果的机制. 在每个时间步 t 处, 平滑器会对偶数帧或奇数帧进行插值, 以平滑其对应的三帧剪辑
- 利用分层采样器在内存限制下启用具有时间一致性的长视频. 长视频被拆分为多个短剪辑, 每个短剪辑都选中了一个关键帧. 该模型预先生成这些关键帧, 并采用完全的跨帧注意力以实现长期连贯性, 并且每个相应的短剪辑都是以关键帧为条件按顺序合成的