零、写在前面
从2022年开始玩Stable Diffusion,到后来将自己的研究生的课题确定为扩散模型,最后也依靠着扩散模型在秋招找到了一份算法岗,扩散模型成为了我研究生生涯最主要的工作。
很早之前就想写博客来记录自己对于扩散模型的理解,但一直忙于学业、实习和秋招,没有时间,而到了现在又觉得自己的博客去详细推论一篇一篇论文或算法,又难免前人的文章重复,且质量远不如他们,所以不如写一篇文章来记录自己的学习过程,当成对各种优质学习资料的索引和个人的理解。
这篇博文可以看成是一个扩散模型的学习路线,也可以看做是各类扩散模型中文学习资料的索引,亦或者我自己的一个阶段性总结,如果能对想入门扩散模型的人有帮助,就是我最大的荣幸。
当然,扩散模型的工作何其之多,这篇博文所提到的工作也不过是沧海一粟,仅供入门参考。
一、扩散理论
缘起DDPM
无论如何,扩散模型还是要从DDPM《Denoising Diffusion Probabilistic Models》开始,虽然扩散模型的理论早在DDPM之前就已经被提出,但DDPM依然可以被视为如今扩散模型的开山鼻祖。
这里我所推荐的学习入门方法是这样的:
-
先完整看一遍DDPM的原论文,理解他的基本思路,此时可以不去推导复杂的公式,将论文中所有不理解的地方都先标出来。
-
接下来,去看一些优质的博客,这里我推荐的是苏剑林苏神的扩散模型系列前三篇:
- 《生成扩散模型漫谈(一):DDPM = 拆楼 + 建楼》
- 《生成扩散模型漫谈(二):DDPM = 自回归式VAE》
- 《生成扩散模型漫谈(三):DDPM = 贝叶斯 + 去噪》在这第三篇中可以跟着博客一起去推导公式,当然要注意博客和论文所使用的符号的区别。
-
然后,可以依靠视频巩固一下基础,这里我推荐的是Nki_Li的视频《一个视频看懂扩散模型DDPM原理推导》,里面有详细的推导过程,可以跟随一步一步进行,另外还有《从零开始了解 Diffusion Model合集》系列,也值得推荐,但对于DDPM而言,已经大大超过了。
到这里,相信大家对于DDPM已经有了充足的了解,当然随着学界的发展,扩散模型理论本身也得到了充足的发展。
以下是我个人在学习过程中曾一度困扰我的难题。
- 扩散模型所预测的噪声 ϵ \epsilon ϵ究竟是什么?在推理阶段他被用于从 x t x_{t} xt到 x t − 1 x_{t-1} xt−1的去噪采样,可又不是 x t − 1 x_{t-1} xt−1到 x t x_{t} xt的过程所添加的噪声。
- 扩散模型中神经网络UNet或者DiT究竟起到了什么作用,神经网络在扩散模型理论中是必要的吗?
- DDPM的训练和推理过程是如何进行的?为什么训练和推理并非直观理解上的一一对应?
- DDPM所使用的noise scheduler是如何设定的,如何简化了推导?扩散模型的重采样是如何进行的?
上述问题本质上都有相近之处,就个人理解而言,DDPM所做核心无非是以下的贝叶斯公式:
p
(
x
t
−
1
∣
x
t
)
=
p
(
x
t
∣
x
t
−
1
)
p
(
x
t
−
1
)
p
(
x
t
)
p(x_{t-1}|x_{t}) = \frac{p(x_{t}|x_{t-1})p(x_{t-1})}{p(x_{t})}
p(xt−1∣xt)=p(xt)p(xt∣xt−1)p(xt−1)
由于我们无法求得边缘概率
p
(
x
t
)
p(x_{t})
p(xt)和
p
(
x
t
−
1
)
p(x_{t-1})
p(xt−1),所以必须引入新的条件
x
0
x_{0}
x0,来将上述贝叶斯公式转化成可求解的状态,而神经网络DiT或者UNet所做的本质就是求取这个新引入的条件
x
0
x_{0}
x0。
p
(
x
t
−
1
∣
x
t
,
x
0
)
=
p
(
x
t
∣
x
t
−
1
,
x
0
)
p
(
x
t
−
1
∣
x
0
)
p
(
x
t
∣
x
0
)
=
p
(
x
t
∣
x
t
−
1
)
p
(
x
t
−
1
∣
x
0
)
p
(
x
t
∣
x
0
)
∝
N
(
x
t
−
1
;
α
t
(
1
−
α
ˉ
t
−
1
)
x
t
+
α
ˉ
t
−
1
(
1
−
α
t
)
x
0
1
−
α
ˉ
t
,
(
1
−
α
t
)
(
1
−
α
ˉ
t
−
1
)
1
−
α
ˉ
t
I
)
\begin{align*} p(x_{t-1}|x_{t},x_{0}) &= \frac{p(x_{t}|x_{t-1},x_{0})p(x_{t-1}|x_{0})}{p(x_{t}|x_{0})} \\ &= \frac{p(x_{t}|x_{t-1})p(x_{t-1}|x_{0})}{p(x_{t}|x_{0})} \\ &∝ N(x_{t-1};\frac{\sqrt{\alpha_t (1 - \bar{\alpha}_{t-1})} \mathbf{x}_t + \sqrt{\bar{\alpha}_{t-1} (1 - \alpha_t)} \mathbf{x}_0}{1 - \bar{\alpha}_t},\frac{(1 - \alpha_t)(1 - \bar{\alpha}_{t-1})}{1 - \bar{\alpha}_t} I) \end{align*}
p(xt−1∣xt,x0)=p(xt∣x0)p(xt∣xt−1,x0)p(xt−1∣x0)=p(xt∣x0)p(xt∣xt−1)p(xt−1∣x0)∝N(xt−1;1−αˉtαt(1−αˉt−1)xt+αˉt−1(1−αt)x0,1−αˉt(1−αt)(1−αˉt−1)I)
从公式上就一目了然了,我们生成图片时(推理阶段),所需要获得
x
t
−
1
x_{t-1}
xt−1的条件分布是一个正态分布,那么只需要求得均值和方差,而方差是固定,均值中也只有
x
0
x_{0}
x0是未知的,这也就是神经网络的求取目标,而求取
x
0
x_{0}
x0在noise scheduler固定的情况下完全等价于求取
ϵ
\epsilon
ϵ,这就是问题1和2的答案。
那么问题3,训练和推理直观上的不一一对应就可以理解了,因为神经网络并不直接负责去噪和生成图像,他只负责预测 x 0 x_{0} x0或者与之等价的 ϵ \epsilon ϵ、 v v v,具体的去噪过程是依赖于上述的贝叶斯公式进行采样的,在训练阶段也是同理。
对于问题4,noise scheduler就是用来控制训练和推理过程中噪声的衰减和增加,通过控制 β \beta β和 α \alpha α,通过巧妙的设定,消去了大量的同类项,从而简化了采样公式。而重采样本身是指将采样这一不可导的过程转为了等价可导的公式, x t = α ˉ t x 0 + 1 − α ˉ t ϵ x_{t} = \sqrt{\bar{\alpha}_t} x_0 + \sqrt{1 - \bar{\alpha}_t} \epsilon xt=αˉtx0+1−αˉtϵ
再见,马尔科夫!高视角DDIM
理论上DDIM:《Denoising Diffusion Implicit Models》应该被被归在下面的采样加速这一部分,但DDIM的高妙洞见还是让我把它放在了扩散理论这一节。
DDIM的学习路线和DDPM基本一致。
- 先读DDIM原论文
- 苏剑林苏神扩散系列的第四篇博客《生成扩散模型漫谈(四):DDIM = 高观点DDPM》
- b站视频
DDIM采样方法可以直接用于DDPM的模型,说明DDIM实质上是一种改进的DDPM,其实质就是去除了本不必要的前置条件马尔科夫过程,即在DDPM中我们所使用马尔科夫条件本质上并不是DDPM的必要条件。
引用苏神的精妙解释,DDPM的核心推导逻辑如下:
p
(
x
t
∣
x
t
−
1
)
→
推导
p
(
x
t
∣
x
0
)
→
推导
p
(
x
t
−
1
∣
x
t
,
x
0
)
→
近似
p
(
x
t
−
1
∣
x
t
)
p(\boldsymbol{x}_t \mid \boldsymbol{x}_{t-1}) \xrightarrow{\text{推导}} p(\boldsymbol{x}_t \mid \boldsymbol{x}_0) \xrightarrow{\text{推导}} p(\boldsymbol{x}_{t-1} \mid \boldsymbol{x}_t, \boldsymbol{x}_0) \xrightarrow{\text{近似}} p(\boldsymbol{x}_{t-1} \mid \boldsymbol{x}_t)
p(xt∣xt−1)推导p(xt∣x0)推导p(xt−1∣xt,x0)近似p(xt−1∣xt)
然而实际上:
- 训练采用了一步到位的加噪方案 p ( x t ∣ x 0 ) p(\boldsymbol{x}_t \mid \boldsymbol{x}_0) p(xt∣x0)
- 推理则只依赖于 p ( x t − 1 ∣ x t ) p(\boldsymbol{x}_{t-1} \mid \boldsymbol{x}_t) p(xt−1∣xt)
可见,无论训练还是推理,$p(\boldsymbol{x}t \mid \boldsymbol{x}{t-1}) $都并非是一个不可或缺的条件,那么DDIM就直接将这么一个条件删除,不再依赖于贝叶斯公式,而是采取待定系数法来求解推理采样过程,从而简化了推导逻辑。
DDIM像是在说,你DDPM的灵感来源于马尔科夫过程不假——即
p
(
x
t
∣
x
t
−
1
)
→
推导
p
(
x
t
∣
x
0
)
p(\boldsymbol{x}_t \mid \boldsymbol{x}_{t-1}) \xrightarrow{\text{推导}} p(\boldsymbol{x}_t \mid \boldsymbol{x}_0)
p(xt∣xt−1)推导p(xt∣x0),但如果我直接不讲道理(或者灵感更强)地将我的
p
(
x
t
∣
x
0
)
p(\boldsymbol{x}_t \mid \boldsymbol{x}_0)
p(xt∣x0)设定的和你精妙推理的结果一样,似乎也完全符合条件,那么我自然可以兴高采烈直接复用你的训练结果,毕竟训练只与
p
(
x
t
∣
x
0
)
p(\boldsymbol{x}_t \mid \boldsymbol{x}_0)
p(xt∣x0)有关嘛!
至于推理采样,没有了
p
(
x
t
∣
x
t
−
1
)
p(\boldsymbol{x}_t \mid \boldsymbol{x}_{t-1})
p(xt∣xt−1),那我们干脆连贝叶斯公式也一起抛弃,采用待定系数法吧,这样我的解空间必然更大,然后:
p
σ
(
x
t
−
1
∣
x
t
,
x
0
)
=
N
(
x
t
−
1
;
α
ˉ
t
−
1
x
0
+
1
−
α
ˉ
t
−
1
−
σ
t
2
x
t
−
α
ˉ
t
x
0
1
−
α
ˉ
t
,
σ
t
2
I
)
p_\sigma(\mathbf{x}_{t-1} \mid \mathbf{x}_t, \mathbf{x}_0) = \mathcal{N}\left( \mathbf{x}_{t-1}; \sqrt{\bar{\alpha}_{t-1}} \mathbf{x}_0 + \sqrt{1 - \bar{\alpha}_{t-1} - \sigma_t^2} \frac{\mathbf{x}_t - \sqrt{\bar{\alpha}_t} \mathbf{x}_0}{\sqrt{1 - \bar{\alpha}_t}}, \sigma_t^2 \mathbf{I} \right)
pσ(xt−1∣xt,x0)=N(xt−1;αˉt−1x0+1−αˉt−1−σt21−αˉtxt−αˉtx0,σt2I)
此外,第二个精妙的洞见在于:
- DDPM的训练结果实质上包含了它的任意子序列参数的训练结果——这就预示着,我们通过精妙地修改子序列的长度可以快进我们的采样过程。
此时,我们将 σ t \sigma_t σt设定为0,那么我们将得到了一个确定性采样过程,并且可以采用Euler等ODE求解,从而加速采样过程。
Level up!更高视角SDE、Score Matching、ODE
这里不必多说,必然是来自宋飏博士的精彩论文《Score-Based Generative Modeling through Stochastic Differential Equations》,将扩散模型与SDE相结合起来,并在理论上和NCSN进行了统一,强烈推荐仔细阅读!
这里反而不推荐先去看论文,而是先看一些博客,再去精读论文。
- 推荐博客:
- 视频方面则推荐:
对于这一部分,若要详细介绍,就偏离了这篇博客的初心,仅记录以下一点:
∇
x
t
log
p
(
x
t
)
=
s
θ
(
x
t
,
t
)
=
−
1
1
−
α
ˉ
t
ε
θ
(
x
t
,
t
)
\nabla_{x_t} \log p(x_t) = s_\theta(x_t, t) = -\frac{1}{\sqrt{1 - \bar{\alpha}_t}} \varepsilon_\theta(x_t, t)
∇xtlogp(xt)=sθ(xt,t)=−1−αˉt1εθ(xt,t)
即score的方向为噪声的反方向,因此Score Matching Based的score预测模型和DDPM的噪声预测模型是等价的,可以互用!
走直线!Rectified Flow和FlowMatching
如今,“走直线”已经成为了主流扩散理论,其核心就是来自于《Rectified Flow: A Marginal Preserving Approach to Optimal Transport》和《Flow Matching for Generative Modeling》这两篇论文。扩散理论从DDPM->EDM->RF/FM,终于不再需要复杂细致的noise scheduler参数设置和繁杂的推导。
- 推荐博客:
- 推荐视频:
RF和FM有趣的一点在于天然地满足了zero-snr,在视频生成领域,这一点十分重要,也因此无法再使用 ϵ \epsilon ϵ - p r e d i t i o n predition predition,而是采用 v v v - p r e d i t i o n predition predition。
二、模型结构
第二章究竟应该是采样加速,还是模型结构,一开始还是有所纠结的,但仔细想想还是选择了后者,一篇论文读下来,如果没法从论文图或者代码中得知输入、forward过程和输出,就意味着你还不理解这篇工作。
传统派LDM UNet: Stable Diffusion
直至目前,图像生成领域最具影响力的开源工作依然非Stable Diffusion莫属,其UNet也有诸多考究之处。
Stable Diffusion 1,Stable Diffusion 2,Stable Diffusion XL的结构基本大同小异。
- LDM所采用的AutoEncoderKL + GAN + Diffusion的LDM架构是目前最通用的模型。通过AE将图像压缩到latent space,之后利用Decoder进行恢复,损失函数用了【重构损失:MSE/MAE + LIPIS VGG特征】+【对抗损失 GAN判别器PatchGAN】 + 【正则损失,防止AE编码的latent空间过偏,可以使用KL reg或者使用VQVAE】,由于KL reg的权重过小,AutoEncoderKL完全不具备VAE所有的生成能力,更偏向于AE的编解码功能。
- 这里我推荐Stable Diffusion 原理介绍与源码分析(一),主要是关注其所绘制的详尽的模型结构图,可以帮助你快速了解UNet结构中各个模块与作用,当然在Transformer Block中还有一些细微的错误,少了一些残差连接。
- Stable Diffusion主要采用ResNet、SpatialTransformer、CrossTransformer三个模块。Timestep编码采用的是简单的sinusoidal编码,并且在ResNetBlock之中每个像素位置上进行Add,主要使用的文本编码器为CLIP、OpenCLIP系列或二者concat。
- v2和v1的区别主要在于文本编码器的选择,以及使用的预测目标从
ϵ
\epsilon
ϵ变为
v
−
p
r
e
d
i
c
t
i
o
n
v-prediction
v−prediction。XL则有比较大的结构改进,具体表现在:
- 减少了下采样特征层数,大幅增加了Transformer Block的个数
- 采用了新的condition,分别是size-和crop-,使用sinusoidal编码后,和time Embedding结合进入ResNet之中
- 更大的Text Model,结合了CLIP 768dim和OpenCLIP ViT BigG 1280 dim, concat之后作为crossAttention输入
- Refiner,针对细节的Diffusion,针对base的前200步进行细化
- VAE使用了更大BatchSize和EMA优化
以下是个人的理解:
LDM中AutoEncoderKL部分的个人理解已经写在了1之中,实际这个去观察VAE所压缩的latent,就可以发现其就是原始图像的降采样特征,绝非传统VAE所希望达到的目标,LDM和Stable Diffusion系列的论文也更多使用AutoEncoder而非VAE去称呼这个模块。
UNet中CrossAttention实现了文本和图像的信息交互,但和后续的MMDiT相比,这个特征的融合其实还是相对粗糙的,因为CrossAttention的结果实际上完全来自于Text端,是Text Value Feature在图像维度上的重排列,图像Feature和文本Feature真正的融合实际上是依靠于残差连接Add。
维新派MMDiT:Stable Diffusion 3 / Flux
理论上我应该介绍一下DiT,但考虑到现在DiT论文本身没有涉及我最关注的文本图像交互部分,以及如今DiT的主流SD3和Flux都很大程度上使用的是MMDiT(Flux还有SingleStreamDiT),因此选择直接介绍MMDiT。
MMDiT是论文Stable Diffusion 3:《Scaling Rectified Flow Transformers for High-Resolution Image Synthesis》所提出的结构,具体如图1所示。
可以看到MMDiT有着非常细致的结构设计:
- 文本特征的提取更加细致。粗粒度文本采用两个CLIP的Pool特征,这部分特征与TimeStep结合,使用AdaLN进行调制;细粒度文本则来自于3个Text Encoder的拼接,两个CLIP在channel维度拼接后再使用ZeroPad,再与T5的特征在token维度拼接。
- 图像端在Patching后,注入位置编码,并使用MMDiT Block进行细粒度文本特征的融合。
- 双塔结构MMDiT的融合如下:细粒度文本特征和图像特征在token维度进行拼接,之后使用Self Attention进行交互,之后token拆解,分流并进行【粗粒度文本和Timestep调制】和【残差连接】,其中还使用了QK-RMS-Norm等模块稳定训练。
- Flux在SD3的基础上更进一步,在若干的MMDiT后,使用SingleStreamDiT Block,将文本和图像特征在token维度上concat,不再分流,其中Self Attetion和FFN采取了并行而非串行,最后则是从token维度中取出图像部分用于unpatch和decode。
接下来我来说一下个人认为的DiT相比于UNet的优点:
- MMDiT对于文本和图像特征的提取以及融合更加细致和充分,从我对于LDM UNet的评价中就能看出区别。
- DiT结构由于位置编码的灵活性,更有利于进行多分辨率训练,充分利用不同分辨率的图像数据。
- 这一点是我的看法,而不是实践经验。DiT的结构设计高度一致且模块化,且没有skip connection,这不仅使训练更加稳定,且并行度更高,且训练速度更快,更容易Scale。
三、加速采样
多走一步,再比较 Consistency Model / LCM
一致性模型提供了一种高效蒸馏模型的方法,在扩散模型的基础上额外添加了一个约束——通过一致性函数,可以将扩散轨迹上的任一点映射到起点。
论文:
- 《Consistency Models》
- 《Latent Consistency Models: Synthesizing High-Resolution Images with Few-Step Inference》
推荐博客:《Consistency is All You Need?》
有趣的是,现在直接预测CFG后的结果也十分常见,大家对于CFG的双倍推理消耗还是很不满。
半白箱采样 DPM Solver / DPM Solver++
DPM Solver利用了ODE的半线性性质,采用了常数变易法+分部积分(什么高数),将线性和非线性部分分离,从而保证了线性部分的精确计算,从Euler和RK-4的纯黑盒变为了半白盒。
DPM Solver++将对预测
ϵ
\epsilon
ϵ的采样形式改为了对
x
x
x的预测形式,之后照样使用常数变易法和分部积分法,因为是对
x
x
x的预测,所以可以照常使用CFG。
论文:
- 《DPM-Solver: A Fast ODE Solver for Diffusion Probabilistic Model Sampling in Around 10 Steps》
- 《DPM-Solver++: Fast Solver for Guided Sampling of Diffusion Probabilistic Models》
推荐博客:《80岁的公园大爷问我 DPMsolver 是什么然后我给他写了这个他说哦我看懂了》
蒸馏,加速 SDXL Turbo
一篇扩散模型蒸馏加速的论文,有趣的点在于提出了pixel维度的特征的优势。
采用了ADD策略,即【蒸馏损失(pixel层面)】+【对抗损失】来蒸馏Student Model,达到1-4步文生图。
论文:《Adversarial Diffusion Distillation》
四、控制生成
最佳论文+最强应用 ControlNet / T2I Adapter
伟大,无需多言的ControlNet。丰富的条件注入和强大的控制能力,造就了一大批勃勃生机的下游应用,最佳论文,实至名归。
论文:
- ControlNet:《Adding Conditional Control to Text-to-Image Diffusion Models》
- T2I-Adapter:《T2I-Adapter: Learning Adapters to Dig out More Controllable Ability for Text-to-Image Diffusion Models》
ControlNet的要点:
- DownBlocks和MidBlock的复制参数,保证了ControlNet强大的特征提取能力以及与Diffusion相对应的特征范围对齐,鲁棒性
- ZeroConv保证了训练的稳定性,防止了一开始的剧烈扰动
- ControlNet所传递的控制信号分为downcontrols和midcontrol,前者直接加在了skip-connect之上,后者加在了midblock的输出之上
- ConrtolNet所使用的ZeroConv会导致突然收敛的现象,具体在ControlNeXt:《ControlNeXt: Powerful and Efficient Control for Image and Video Generation》有讨论
与T2I-Adapter以及SparseCtrl等其他方法的比较:
- ControlNet所使用的ConditionEncoder更大,更强,复制于DiffusionUNet
- ControlNet的控制信号在轻量化卷积下采样后,需要和noised latent相加,这一点有好有坏。好处在于他充分强化了控制信号和noised latent直接的结合,随着每一轮的迭代,控制信号都会根据已有的noise latent进行调整自己的控制信号强度;坏处有两点,一来无法像T2I-Adapter或其他论文一样,事先对condition control进行cache,必须在推理时反复进行,二来在强化了控制信号的同时会降低图片的生成质量,因为直接的相加一定程度上破坏了原有的特征分布
解耦交叉注意力 IP-Adapter
巧妙地修改交叉注意力,注入了全新的控制条件。
论文:《IP-Adapter: Text Compatible Image Prompt Adapter for Text-to-Image Diffusion Models》
新的控制图像条件利用Image Encoder进行特征提取,之后对CrossAttention进行注入,具体方法为直接并行相加,Q一致,KV翻倍,初始化copy原来的 W k W_{k} Wk, W v W_{v} Wv。
InstantID很大程度就是ControlNet + IP-Adapter在人脸上的应用,当然使用了更加垂类的Image Encoder而非粗粒度的CLIP。
五、信噪比
极致对比度 Noise Signal Bias / Offset Noise
很长一段时间,大家发现Stable Diffusion无法生成大面积黑色或白色背景的图片,无法有较高的对比度。
这源于Stable Diffusion v1所使用的noise scheduler实际上在终端保留了大量的图像信号,造成训练和推理的不一致性,即训练时模型可以通过简单的pooling技巧还原低频信号,而推理必须从纯粹的高斯噪声开始。
对于这个现象进行分析的论文有:
而在实践中,单纯为了生成高对比图像的能力,一般使用的是Offset Noise技巧(例如在SDXL中就有所使用,一般强度为0.1)
相关博客:
Offset Noise的思想很简单,在训练的时候随机添加一个随机偏移量噪声,这个偏移量在这个位置上都一致(即对应[b,c,h,w]的latent,这个偏移量噪声为[b,c,1,1]),然后让这个模型预测这个总噪声。
而推理时则照常,人为制造了训练和推理的不一致性,但是却弥合了低高频信息不同破坏程度的问题。
自适应步骤调节 min-snr weight loss
DDPM将损失函数前不同TimeStep的权重省略了,但基于信噪比SNR,依然有人认为需要对不同的阶段进行合理的调整。
推荐论文:
这篇论文有趣的指出了一点:Diffusion Model在不同TimeStep之间的训练实际上存在一个动态博弈的过程,对于某一个阶段效果的提升很可能会导致其他阶段的效果的下降,SDXL的Refiner模型一定程度也是这种思想的应用。
他提出根据信噪比进行权衡,并推导了 ϵ − p r e d i c t i o n \epsilon-prediction ϵ−prediction和 v − p r e d i c t i o n v-prediction v−prediction时各自所使用的比例权重。
终端无信号 ZeroSNR
从Offset Noise中我们发现了,DDPM、EDM、Stable Diffusion等论文在终端信噪比的各自不同,造成了不同程度的信号泄露,从而引发了训练和推理的不一致。
这个现象在视频生成也许相较于图像更加明显,帧间的重复低频信号会使模型训练过程中利用简单的帧间平均来恢复画面,早期大量的视频生成论文均提到了这一点技巧。
在RF、FM成为主流之前,大家所采用的方案一般来自于字节跳动的终端无信号ZeroSNR。
论文:《Common Diffusion Noise Schedules and Sample Steps are Flawed》
其调整手段相当简单粗暴,直接将 T T T时刻的 α T ˉ \bar{\alpha_{T}} αTˉ设置为0,而之前的 α t ˉ \bar{\alpha_t} αtˉ的变化量则按照0-T进行线性插值。
ZeroSNR方法必须使用 v − p r e d i t i o n v-predition v−predition,如果依然使用 ϵ − p r e d i c t i o n \epsilon-prediction ϵ−prediction,会造成以下问题:
- 如果推理从T时刻开始,采样器会面临除以0的错误。
- 在训练阶段, t → T t\rightarrow T t→T时,使用 ϵ − p r e d i c t i o n \epsilon-prediction ϵ−prediction,网络只需要用一个恒等变化即可,这无论对于有残差的DiT还是有skip-connection的UNet而言都十分容易。
- 事实上, ϵ − p r e d i c t i o n \epsilon-prediction ϵ−prediction的loss随着t的增大而快速下降;而 v − p r e d i c t i o n v-prediction v−prediction则呈现两端高,中间低的特点。
当然在如今RF/FM主导的年代,已经天然满足了ZeroSNR。
六、训练和推理技巧
加强引导,大步前进 Classifier Guidance / Classifier Free Guidance(CFG)
CG和CFG中,CG的理论推导很有意思,但如今更多使用的是CFG。
论文:
- Classifier Guidance: 《Diffusion Models Beat GANs on Image Synthesis》
- Classifier Free Guidance: 《Classifier-Free Diffusion Guidance》
博客推荐:
视频推荐:
- 《一个视频看懂什么是classifier guidance/classifier-free guidance》
- 《【AI知识分享】十分钟速通扩散模型中Classifier guidance与Classifier-free guidance的原理和公式推导》
Classifier Guidance的核心公式如下:
p
(
x
t
−
1
∣
x
t
,
y
)
=
p
(
x
t
−
1
∣
x
t
)
p
(
y
∣
x
t
−
1
)
p
(
y
∣
x
t
)
=
p
(
x
t
−
1
∣
x
t
)
e
log
p
(
y
∣
x
t
−
1
)
−
log
p
(
y
∣
x
t
)
p(\mathbf{x}_{t-1} \mid \mathbf{x}_t, \mathbf{y}) = \frac{p(\mathbf{x}_{t-1} \mid \mathbf{x}_t) p(\mathbf{y} \mid \mathbf{x}_{t-1})}{p(\mathbf{y} \mid \mathbf{x}_t)} = p(\mathbf{x}_{t-1} \mid \mathbf{x}_t) e^{\log p(\mathbf{y} \mid \mathbf{x}_{t-1}) - \log p(\mathbf{y} \mid \mathbf{x}_t)}
p(xt−1∣xt,y)=p(y∣xt)p(xt−1∣xt)p(y∣xt−1)=p(xt−1∣xt)elogp(y∣xt−1)−logp(y∣xt)
log
p
(
y
∣
x
t
−
1
)
−
log
p
(
y
∣
x
t
)
≈
(
x
t
−
1
−
x
t
)
⋅
∇
x
t
log
p
(
y
∣
x
t
)
\log p(\mathbf{y} \mid \mathbf{x}_{t-1}) - \log p(\mathbf{y} \mid \mathbf{x}_t) \approx (\mathbf{x}_{t-1} - \mathbf{x}_t) \cdot \nabla_{\mathbf{x}_t} \log p(\mathbf{y} \mid \mathbf{x}_t)
logp(y∣xt−1)−logp(y∣xt)≈(xt−1−xt)⋅∇xtlogp(y∣xt)
p
(
x
t
−
1
∣
x
t
,
y
)
∝
e
−
∥
x
t
−
1
−
μ
(
x
t
)
−
σ
t
2
⋅
∇
x
t
log
p
(
y
∣
x
t
)
∣
∣
2
2
σ
t
2
p(\mathbf{x}_{t-1} \mid \mathbf{x}_t, \mathbf{y}) \propto e^{-\frac{\|\mathbf{x}_{t-1} - \mu(\mathbf{x}_t)\ - \sigma_t^2 \cdot \nabla_{\mathbf{x}_t} \log p(\mathbf{y} \mid \mathbf{x}_t)||^2}{2\sigma_t^2}}
p(xt−1∣xt,y)∝e−2σt2∥xt−1−μ(xt) −σt2⋅∇xtlogp(y∣xt)∣∣2
而
p
(
y
∣
x
t
)
p(y|x_t)
p(y∣xt)这是一个标准的分类器,CG就是利用一个在噪声样本上训练的分类器,利用自己所需要的标签来传到梯度,具体到实践上则是将noise image送入分类其中,对自己希望生成的标签gt进行交叉熵损失梯度回传,之后利用这个回传的梯度修改采样的方程。
具体如何修改则有两种方法,包括DDPM和DDIM,其中DDIM则利用了ScoreMatching的思想。
Classifier Free Guidance的核心公式如下:
ϵ
~
θ
(
z
λ
,
c
)
=
(
1
+
w
)
ϵ
θ
(
z
λ
,
c
)
−
w
ϵ
θ
(
z
λ
,
∅
)
\tilde{\epsilon}_\theta(\mathbf{z}_\lambda, \mathbf{c}) = (1 + w) \epsilon_\theta(\mathbf{z}_\lambda, \mathbf{c}) - w \epsilon_\theta(\mathbf{z}_\lambda,\varnothing)
ϵ~θ(zλ,c)=(1+w)ϵθ(zλ,c)−wϵθ(zλ,∅)
具体而言,在训练时,按照一定比例(一般10%)讲所需要的条件置为空(一般就是文本标注用空字符串代替),进行训练,而在推理时则同时推理【给定提示词】和【空字符串】,并且每次真正用于采样的噪声为二者的线性组合,放大从空集到条件的方向。
在平时推理中,还可以将空集置为negative prompt,从而达到更精确的采样效果。
详尽描述,混合训练 ReCaption / Dense Prompt
数据是深度学习核心中的核心,在图像生成中,DALLE3展示了ReCaption Dense Prompt搭配混合训练所展示的威力。
论文:
核心思想与主要做法:
- 利用多模态模型、LLM来提高对于图像文本标注的质量,包括准确性、详细性。
- 后续工作中也有利用不同大小、不同类别的模型进行Caption,提高多样性和精确性。
- 按照一定比例混合训练,short prompt/dense prompt。
数据清洗,数据飞轮 HunYuan
更详细开源的数据处理工作,以及对应的数据飞轮,可以参考HunYuanDiT,支持中英双语。
论文:
主要内容:
- 文本编码器:双语CLIP + 多语言T5,支持256 token描述。
- DiT + RoPE位置编码 + QK Norm + 跳跃连接 + v − p r e d i c t i o n v-prediction v−prediction
- 极度细致的数据清洗,包括清晰度、美学分、水印检测、不雅+暴力+性过滤、图像分类、caption。其中图像的主体和风格最重要。
- 数据分层:青铜数据用于CLIP,白银数据用于Diffusion,最高品质黄金数据用于精细化微调。分层原理根据文本内容丰富度、元素数量、语义难度(例如谚语、成语)。
- Caption分阶段。首先利用多个多模态模型进行Caption,并与人类标注组成数据集;在这个数据集上训练一个MLLM模型(类似LLAVA 1.6),用于图像标注;生成新的字幕后,再让人类进行新的一轮标注。
- 蒸馏加速。采用了Progressive Distillation;并锐评了【GAN蒸馏崩溃,也许是类似SDXL Turbo】+【LCM降低质量,提高步数不能提高质量】+【Adapter方法失效】
- 详尽的评估流程。另外发现多文本编码器在token上concat,比在channel上concat好。
七、视频生成
视频生成是过去2024年最火热的生成式主题之一。2月Sora惊艳,到后续Kling、MovieGen、Veo等模型赶超。视频生成高速地发展,其核心在于数据的收集和处理,尤其是视频数据的处理pipeline,相较于图像而言更是重中之重。
论文与技术报告:
- Sora:《Video generation models as world simulators》,这篇技术报告的内容太少了,除了DiT几乎就没啥值得说道的,ClosedAI。
- 《Movie Gen: A Cast of Media Foundation Models》
- 《HunyuanVideo: A Systematic Framework For Large Video Generative Models》
视频:
- 《Openai Sora 上【论文精读·55】》,数据处理部分的精华
一般而言,视频数据的处理和训练的要点如下:
- 视频分割(PySceneDetect、TransNet v2等),以及聚合ImageBind
- 简单指标:视频分辨率、长宽比
- VQA:黑屏检测、黑边检测、清晰度检测、文本检测(PPT、论文,OCR检测)
- 动态检测(光流或者其他指标):静态视频、切场景视频、特效视频、抖动视频
- 去重、美学分:例如抽首中尾帧进行美学评估,对比度,照明,主题强调,空间布局
- 视频特征检测以及视频分类:主体、运动类型、相机运镜、氛围,这部分可以一直细致下去,类似于视频网站的分区,以及各种视频平台内部对于视频的多维度特征抽取。
- Caption:Video Model Caption、抽帧Image Caption、LLM整合,short caption / dense caption
- 多阶段训练:一般是低分辨率到高分辨率,低动态到高动态,低质量到高质量
- 联合训练:图像视频联合训练,图像采用大量的高质量图像
八、结语
至此,我以对自己扩散模型的学习做了一个阶段性的小总结,用诗意的话说就是这几年来在噪声与去噪的博弈中,悄然摸到了生成世界的门环。
大年初二,新春的寒气里,AI领域正翻涌着新的浪潮。DeepSeek团队接连发布的V3和R1模型,振奋了国内的研究者,也让我决心把新年的主攻目标转向LLM,用代码诠释自然语言。
突然想起了今年B站V家《天星问》副歌中的一句歌词:“乘舟而惑者,大海漫无疆。”真是意外地贴切我个人研究生学习的体验。但无论如何,正如那句老话“悲观者总是正确,乐观者正在前行。”怨天尤人终究只会消磨自己,砥砺前行才能有所收获属于自己的北极星。
最后让DeepSeek即兴写一首诗吧:
星海无涯楫自征,银汉垂光万象生。
潮头莫问舟何往,直向天心北极星。
祝大家蛇年万事顺心,收获满满!