
【Diffusion】为什么用Classifier-free-guidance
参考原文
https://www.zhangzhenhu.com/aigc/Guidance.html
https://sander.ai/2022/05/26/guidance.html
https://sander.ai/2023/08/28/geometry.html
https://forums.fast.ai/t/why-do-we-need-the-unconditioned-embedding/101134?replies_to_post_number=3
Guidance: a cheat code for diffusion models
"Classifier-free guidance"显著改善了"conditional diffusion models"生成的图像(几乎没有额外成本)。它实施简单且极其有效。它也是OpenAI的DALL·E 2和Google的Imagen的关键组成部分,为它们的惊人图像生成结果提供动力。在这篇博文中,我将分享我的观点,并尝试解释它的工作原理。
引言
无论是 DDPM 还是 DDIM,这些扩散模型在生成图片时,都是输入一个随机高斯噪声数据,然后逐步的产出一张有意的真实图片。这个过程中每一步都是一个随机过程,所以每次执行产出的图片都不一样,生成的图像多样性非常好。
但这也是一个缺点:生成的图像不可控,无法控制这个生成过程并令其生成我们想要的图像内容。
鉴于此,很多研究中在如何控制图像生成过程方面提出了很多有效的方案。直觉的讲,我们可以在扩散过程中引入额外的信息来指导或者说控制整个扩散模型,假设这个额外的信息为 y,它可以是一段文本、一张图片或者图像的类别标签。引入 y 之后的模型就变成了一个以 y 为条件的条件概率分布。
公式1.1
p(x1:T∣y,x0)p(x_{1:T} | y,x_0) p(x1:T∣y,x0)
自然而然地,接下来就需要探讨,引入 y 之后对前向扩散过程和逆向采用过程分别有什么影响,需要做出什么调整。
首先看下对前向扩散过程的影响,先说结论:引入 y 之后,对前向扩散过程没有任何影响。其实,从直觉上讲,前向扩散过程是对原始图片加噪声,直至变成纯噪声,这个过程显然与 y 没有任何关系。但做研究要严谨,还是需要给出数学证明的。证明过程在论文 Prafulla Dhariwal and Alex Nichol. Diffusion models beat gans on image synthesis. 2021. 中已经给出,这里直接搬过来。
证明:引入条件y对加噪过程无影响
知识补充
条件概率和边际概率都是概率论中的重要概念,它们用于描述随机变量之间的关系和概率分布。
- 条件概率:
条件概率是指在给定某一事件或条件发生的情况下,另一事件发生的概率。条件概率通常表示为P(A|B),其中A和B是两个事件,P(A|B)表示在事件B发生的条件下,事件A发生的概率。条件概率可以用以下公式表示: P(A∣B)=P(A∩B)P(B)P(A|B) = \frac{P(A \cap B)}{P(B)} P(A∣B)=P(B)P(A∩B) 这表示事件A在事件B发生的条件下的概率是事件A和事件B同时发生的概率除以事件B发生的概率。 - 边际概率:
边际概率是指在多个随机变量的联合概率分布中,将其中一个或多个变量边际化(即去掉或不考虑)后得到的概率分布。通常,我们将边际概率表示为P(X)或P(Y),其中X和Y是随机变量。边际概率描述了单个随机变量的概率分布,而不考虑其他随机变量的影响。 例如,如果有两个随机变量X和Y的联合概率分布P(X, Y),边际概率P(X)表示只考虑X变量的概率分布,而不考虑Y变量的影响。边际概率可以通过对联合概率分布进行边际化得到,如下所示: P(X)=∑yP(X,Y=y)P(X) = \sum_{y} P(X, Y=y) P(X)=y∑P(X,Y=y) 这表示P(X)是通过对Y的所有可能取值求和得到的,下面的推导中常用对y积分的操作
总结一下,条件概率描述了在给定条件下的事件发生概率,而边际概率描述了单个随机变量的概率分布,不考虑其他变量的影响。这些概念在统计学和概率论中用于建模和分析各种复杂问题。
概率的联合分布的标准分解方式是基于条件概率和边际概率的乘法规则。
根据这个规则,任何联合概率分布可以分解为条件概率和边际概率的乘积。具体来说,如果我们有多个随机变量X1,X2,…,Xn的联合概率分布P(X1, X2, …, Xn),则可以按照以下方式进行分解:
P(X1,X2,...,Xn)=P(X1)∗P(X2∣X1)∗P(X3∣X1,X2)∗...∗P(Xn∣X1,X2,...,Xn−1)P(X1, X2, ..., Xn) = P(X1) * P(X2|X1) * P(X3|X1, X2) * ... * P(Xn|X1, X2, ..., Xn-1) P(X1,X2,...,Xn)=P(X1)∗P(X2∣X1)∗P(X3∣X1,X2)∗...∗P(Xn∣X1,X2,...,Xn−1)
这个分解方式称为贝叶斯链式规则或联合分布的链式规则。它表示了多个随机变量之间的联合概率可以通过依次考虑每个变量的条件概率和边际概率来表示。
定义
首先定义带有小帽子 q^\hat{q}q^ 的符号表示引入yyy之后的条件扩散模型中的概率分布,不带小帽子的符号 qqq 表示原始(无条件)扩散模型的概率分布。
在这里你可以先把 yyy 理解成原始图像 x0x_0x0 的类别标签(label),yyy它是已知的,即训练输入是(x0,y)(x_0,y)(x0,y) 这样的数据对,类似于图像分类任务的训练样本。
推导
先考虑,单一时刻ttt的变化,扩散模型本身是一个马尔科夫链,其定义中已经明确了:任意时刻的xtx_txt至于它上一个时刻xt−1x_{t-1}xt−1的状态有关。
因此任意单一时刻的前向扩散条件概率(加噪声)过程一定是与 yyy无关的,即下面的式子是一定成立的。
公式1.2
q^(xt∣xt−1,y):=q(xt∣xt−1)\hat{q} (x_{t}|x_{t-1}, y) := q(x_{t}|x_{t-1}) q^(xt∣xt−1,y):=q(xt∣xt−1)
- 符号 “:=” 表示定义或赋值
基于这个事实,可以推导出另一个等式,即
公式1.3
q^(xt∣xt−1)=∫yq^(xt,y∣xt−1)dy=∫yq^(xt∣y,xt−1)q^(y∣xt−1)dy=∫yq(xt∣xt−1)q^(y∣xt−1)dy=q(xt∣xt−1)∫yq^(y∣xt−1)dy⏟<!−−swig0−−>=q(xt∣xt−1)=q^(xt∣xt−1,y)\hat{q}(x_{t}|x_{t-1}) \\= \int_{y} \hat{q}(x_{t},y|x_{t-1}) d y \\ = \int_{y} \hat{q}(x_{t}|y,x_{t-1}) \hat{q}(y|x_{t-1}) d y \\ = \int_{y} q(x_{t}|x_{t-1}) \hat{q}(y|x_{t-1}) d y \\ = q(x_{t}|x_{t-1}) \underbrace{ \int_{y} \hat{q}(y|x_{t-1}) d y}_ \\ = q(x_{t}|x_{t-1}) \\ = \hat{q} (x_{t}|x_{t-1},y) q^(xt∣xt−1)=∫yq^(xt,y∣xt−1)dy=∫yq^(xt∣y,xt−1)q^(y∣xt−1)dy=∫yq(xt∣xt−1)q^(y∣xt−1)dy=q(xt∣xt−1)<∫yq^(y∣xt−1)dy!−−swig0−−>=q(xt∣xt−1)=q^(xt∣xt−1,y)
公式解读
- 第一步使用边际化:在给定xt−1x_{t-1}xt−1的情况下,为了计算xtx_{t}xt的条件概率。可以使用边际化原理,即将联合概率q^(xt,y∣xt−1)\hat{q}(x_{t},y|x_{t-1})q^(xt,y∣xt−1)对变量yyy进行积分,以消除yyy的影响。当我们对q^(xt,y∣xt−1)\hat{q}(x_{t},y|x_{t-1})q^(xt,y∣xt−1)关于yyy进行积分时,我们将yyy视为一个随机变量,它在积分中被边际化掉。这实际上是一种求条件概率的方法,即:在考虑xt−1x_{t-1}xt−1的情况下,关于xtx_{t}xt的条件概率,而不考虑yyy的具体取值。
- 第二步分解联合概率:将联合概率q^(xt,y∣xt−1)\hat{q}(x_{t},y|x_{t-1})q^(xt,y∣xt−1)分解成两个条件概率的乘积:q^(xt∣y,xt−1)\hat{q}(x_{t}|y,x_{t-1})q^(xt∣y,xt−1)和q^(y∣xt−1)\hat{q}(y|x_{t-1})q^(y∣xt−1)。这是概率的联合分布的标准分解方式。
- 第三步积分操作:继续使用边际化的原理,对变量yyy进行积分,将q^(xt∣y,xt−1)\hat{q}(x_{t}|y,x_{t-1})q^(xt∣y,xt−1)和q^(y∣xt−1)\hat{q}(y|x_{t-1})q^(y∣xt−1)关于yyy进行边际化。这一步的目的是将联合概率q^(xt,y∣xt−1)\hat{q}(x_{t},y|x_{t-1})q^(xt,y∣xt−1)转化为条件概率q^(xt∣xt−1)\hat{q}(x_{t}|x_{t-1})q^(xt∣xt−1)。
公式目的
这个推导的结果表明,在给定条件xt−1x_{t-1}xt−1的情况下,
在有条件扩散模型中xtx_{t}xt的条件概率分布q^(xt∣xt−1)\hat{q}(x_{t}|x_{t-1})q^(xt∣xt−1)
与无条件扩散模型中xtx_{t}xt的条件概率分布q(xt∣xt−1)q(x_{t}|x_{t-1})q(xt∣xt−1)是相等的。
与考虑条件yyy的情况下的联合概率q^(xt,y∣xt−1)\hat{q}(x_{t}, y|x_{t-1})q^(xt,y∣xt−1)是相等的
这意味着在训练数据中已经考虑了类别标签yyy(即已知输入为(x0,y)(x_0, y)(x0,y)的情况下),条件扩散模型中的条件概率与无条件模型中的条件概率是相同的。
基于相同的逻辑,可以推导出条件扩散模型中的前向扩散过程的联合概率 q^(x1:T∣x0)\hat{q}(x_{1:T}|x_0)q^(x1:T∣x0)和无条件(原始)扩散模型的前向扩散过程联合概率 q(x1:T∣x0)q(x_{1:T} |x_{0})q(x1:T∣x0) 是等价的。推导过程如下:
公式1.4
q^(x1:T∣x0)=∫yq^(x1:T,y∣x0)dy=∫yq^(y∣x0)q^(x1:T∣x0,y)dy=∫yq^(y∣x0)∏t=1Tq^(xt∣xt−1,y)dy=∫yq^(y∣x0)∏t=1Tq^(xt∣xt−1)dy=∏t=1Tq^(xt∣xt−1)∫yq^(y∣x0)dy⏟<!−−swig1−−>=∏t=1Tq^(xt∣xt−1)=q(x1:T∣x0)\hat{q}(x_{1:T} |x_{0}) \\= \int_y \hat{q} (x_{1:T},y|x_0)dy \\= \int_y \hat{q}(y|x_0) \hat{q} (x_{1:T}|x_0,y)dy \\= \int_y \hat{q}(y|x_0) \prod_{t=1}^T \hat{q} (x_t|x_{t-1},y)dy \\= \int_y \hat{q}(y|x_0) \prod_{t=1}^T \hat{q} (x_t|x_{t-1})dy \\= \prod_{t=1}^T \hat{q} (x_t|x_{t-1}) \underbrace{\int_y \hat{q}(y|x_0) dy}_ \\= \prod_{t=1}^T \hat{q} (x_t|x_{t-1}) \\= q(x_{1:T} |x_{0}) q^(x1:T∣x0)=∫yq^(x1:T,y∣x0)dy=∫yq^(y∣x0)q^(x1:T∣x0,y)dy=∫yq^(y∣x0)t=1∏Tq^(xt∣xt−1,y)dy=∫yq^(y∣x0)t=1∏Tq^(xt∣xt−1)dy=t=1∏Tq^(xt∣xt−1)<∫yq^(y∣x0)dy!−−swig1−−>=t=1∏Tq^(xt∣xt−1)=q(x1:T∣x0)
公式解读
- 起始点:我们从有条件扩散模型中的前向扩散过程的联合概率q^(x1:T∣x0)\hat{q}(x_{1:T}|x_0)q^(x1:T∣x0)开始。
- 使用边际化:接下来,我们使用边际化的原理,将联合概率q^(x1:T∣x0)\hat{q}(x_{1:T}|x_0)q^(x1:T∣x0)表示为一个积分,考虑了条件yyy: q^(x1:T∣x0)=∫yq^(x1:T,y∣x0)dy\hat{q}(x_{1:T}|x_0) = \int_y \hat{q}(x_{1:T}, y|x_0)dy q^(x1:T∣x0)=∫yq^(x1:T,y∣x0)dy 这个步骤是将联合概率的表达方式扩展为包含条件yyy的联合概率分布。
- 分解联合概率:接下来,我们分解了联合概率q^(x1:T,y∣x0)\hat{q}(x_{1:T},y|x_0)q^(x1:T,y∣x0)为两个条件概率的乘积,即q^(y∣x0)\hat{q}(y|x_0)q^(y∣x0)和q^(x1:T∣x0,y)\hat{q}(x_{1:T}|x_0,y)q^(x1:T∣x0,y)。这一步将考虑条件yyy的情况下的联合概率分解为条件概率和边际概率的乘积。
- 多个时刻的乘积:继续推导,我们考虑了多个时刻的情况,将联合概率q^(x1:T∣x0,y)\hat{q}(x_{1:T}|x_0,y)q^(x1:T∣x0,y)分解为各个时刻的条件概率的乘积,即∏t=1Tq^(xt∣xt−1,y)\prod_{t=1}^T \hat{q}(x_t|x_{t-1},y)∏t=1Tq^(xt∣xt−1,y)。这一步考虑了在给定条件yyy的情况下,每个时刻的条件概率。
- 去掉条件yyy:继续使用边际化原理,对变量yyy进行积分,将q^(y∣x0)\hat{q}(y|x_0)q^(y∣x0)和∏t=1Tq^(xt∣xt−1,y)\prod_{t=1}^T \hat{q}(x_t|x_{t-1},y)∏t=1Tq^(xt∣xt−1,y)关于yyy边际化: \int_y \hat{q}(y|x_0) \cdot \prod_{t=1}^T \hat{q}(x_t|x_{t-1},y) dy$$ 得到$$\prod_{t=1}^T \hat{q} (x_t|x_{t-1}) \cdot {\int_y \hat{q}(y|x_0) dy} 这一步是为了将联合概率中的yyy去掉,得到条件概率的乘积。
到这里,证明了加不加条件 yyy 对前向扩散过程没有任何影响,即:条件扩散模型的前向过程与非条件扩散模型的前向过程完全一样。
接下来就该讨论条件 yyy 对逆向采样过程的影响,显然我们的目的就是要令 yyy 对采样过程产生影响。
无条件扩散模型的逆向过程联合概率为
公式1.5
p(x0:T)=p(xT)∏t=1Tpθ(xt−1∣xt)p(x_{0:T} ) = p(x_{T} ) \prod_{t=1}^T p_{\theta}(x_{t−1}|x_{t}) p(x0:T)=p(xT)t=1∏Tpθ(xt−1∣xt)
添加额外信息 yyy 之后,条件扩散模型的逆向过程联合概率为
公式1.6
p(x0:T∣y)=p(xT)∏t=1Tpθ(xt−1∣xt,y) p(x_{0:T} |y) = p(x_{T} ) \prod_{t=1}^T p_{\theta}(x_{t−1}|x_{t},y) p(x0:T∣y)=p(xT)t=1∏Tpθ(xt−1∣xt,y)
上一章讲过,扩散模型有三种解释,即参数化模型有三种预测方案,分别是
- 直接预测原始的 x0x_0x0, x^θ(xt,t)≈x0\hat{x}_{\theta}(x_t,t) \approx x_0x^θ(xt,t)≈x0
- 预测噪声数据, ϵ^θ(xt,t)≈ϵ0\hat{\epsilon}_{\theta}(x_t,t) \approx \epsilon_0ϵ^θ(xt,t)≈ϵ0
- 预测得分(梯度),s^θ(xt,t)≈∇xtlogp(xt)\hat{s}_{\theta}(x_t,t) \approx \nabla_{x_t} \log p(x_t)s^θ(xt,t)≈∇xtlogp(xt)
最直觉(简单)的添加条件的方式,就是和添加 ttt 一样,直接把条件 yyy 作为模型的输入,添加到模型中即可,上面三种方式分别改成:
- 直接预测原始的 x0x_0x0, x^θ(xt,t,y)≈x0\hat{x}_{\theta}(x_t,t,y) \approx x_0x^θ(xt,t,y)≈x0
- 预测噪声数据 ,ϵ^θ(xt,t,y)≈ϵ0\hat{\epsilon}_{\theta}(x_t,t,y) \approx \epsilon_0ϵ^θ(xt,t,y)≈ϵ0
- 预测得分(梯度), s^θ(xt,t,y)≈∇xtlogp(xt∣y)\hat{s}_{\theta}(x_t,t,y) \approx \nabla_{x_t} \log p(x_t|y)s^θ(xt,t,y)≈∇xtlogp(xt∣y)
首先这么做是可以的,但效果可能并不好,以这种方式训练的条件扩散模型可能会学会忽略或淡化任何给定的条件信息 Calvin Luo. Understanding diffusion models: a unified perspective. 2022. arXiv:2208.11970。接下来看一下不同的 guidance 方案具体是如何做的。
Diffusion guidance
它们对高维数据分布p(x)进行建模。与尝试直接逼近p(x)(这是基于似然的模型所做的)不同,它们试图预测所谓的得分函数,∇xlogp(x)∇_x log p(x)∇xlogp(x)
要从Diffusion Model中取样,首先将"input images"初始化为随机噪声,然后通过朝着"得分函数(score function)"的方向(对数似然增加最快的方向)进行迭代去噪,同时加入一些额外的随机噪声以避免陷入分布的模态中。这被称为随机梯度 Langevin 动力学(SGLD)
在Conditional Diffusion Models中,我们有一个额外的输入y(例如, a class label 或 a text sequence),我们试图建模条件分布p(x∣y)p(x|y)p(x∣y)。实际上,这意味着要学会预测 条件得分函数∇xlogp(x∣y)∇_xlog p(x|y)∇xlogp(x∣y)。
得分函数的一个巧妙之处在于它对于分布的归一化是不变的:如果我们只知道分布p(x)与一个常数因子的关系,即p(x)=p^(x)Zp(x)=\hat p(x)Zp(x)=p^(x)Z,并且我们只知道p^(x)\hat p(x)p^(x),那么我们仍然可以计算得分函数:
∇xlogp^(x)=∇xlog(p(x)⋅Z)=∇x(logp(x)+logZ)=∇xlogp(x)∇_xlog \hat p(x) = ∇_xlog (p(x)⋅Z) = ∇_x(log p(x) + log Z) \\= ∇_xlog p(x) ∇xlogp^(x)=∇xlog(p(x)⋅Z)=∇x(logp(x)+logZ)=∇xlogp(x)
在这里,我们利用了梯度算子的线性性质,以及规范化常数Z=∫p^(x)dxZ=∫\hat p(x)dxZ=∫p^(x)dx不依赖于x(因此其对x的导数为零)的事实。
非规范化概率分布经常出现,因此这是一个有用的特性。对于条件模型,它使我们能够应用贝叶斯定理将得分函数分解为无条件分量和混入条件信息的分量:
p(x∣y)=p(y∣x)⋅p(x)p(y)⟹logp(x∣y)=logp(y∣x)+logp(x)−logp(y)⟹∇xlogp(x∣y)=∇xlogp(y∣x)+∇xlogp(x)p(x|y) = p(y|x)⋅p(x)p(y) \\⟹ log p(x|y) = log p(y|x) + log p(x) - log p(y) \\⟹ ∇_xlog p(x|y) = ∇_xlog p(y|x) + ∇_xlog p(x) p(x∣y)=p(y∣x)⋅p(x)p(y)⟹logp(x∣y)=logp(y∣x)+logp(x)−logp(y)⟹∇xlogp(x∣y)=∇xlogp(y∣x)+∇xlogp(x)
在这里,我们使用了∇xlogp(y)=0∇_xlog p(y) = 0∇xlogp(y)=0。换句话说,我们可以将条件得分函数简单地视为无条件得分函数和一个条件项的总和。(请注意,条件项∇xlogp(y∣x)∇_xlog p(y|x)∇xlogp(y∣x)本身不是得分函数,因为梯度是对x而不是y的。)
在整篇博文中,我大多数时候都忽略了扩散模型估计的分布的时间依赖性。这使我不必在每个步骤上添加额外的条件变量和下标。在实践中,扩散模型执行迭代去噪,因此通常在每个步骤上都受到输入噪声水平的条件限制。
Classifier guidance
引言
要将一个无条件扩散模型转变为有条件模型,我们只需要一个分类器!
OpenAI 的团队在 2021 年发表一篇论文 A. Diffusion models beat gans on image synthesis,在这篇论文中,提出一种利用图片类别标签指导图像生成的方案,称为 classifier guidance,通过这种改进使扩散模型生成图像的质量大幅提升,并在 IS 和 FID 评分上超过了 GAN 模型,所以你看论文的名字,简单直接。
论文的源码在: https://github.com/openai/guided-diffusion 。
实际上这篇论文做了很多改进,比如对UNET也做了改进。但这里我们只关注 guidance 部分。原论文的推导过程比较繁杂,这里我们采用另一篇文章Calvin Luo. Understanding diffusion models: a unified perspective. 2022的推导方案,直接从 score function 的角度去理解。
推导
如上文所述,扩散模型的降噪过程的预测(噪声)模型可以从三个角度去理解,其中一种角度是参数化神经网络模型预测的是 xtx_txt 的对数梯度,也叫得分(score),公式表示为
公式1.7
s^θ(xt,t)≈∇xtlogp(xt)\hat{s}_{\theta}(x_t,t) \approx \nabla_{x_t} \log p(x_t) s^θ(xt,t)≈∇xtlogp(xt)
引入条件信息 yyy 之后,相当于原来的 ∇xtlogp(xt)\nabla_{x_t} \log p(x_t)∇xtlogp(xt) 变成了 ∇xtlogp(xt∣y)\nabla_{x_t} \log p(x_t|y)∇xtlogp(xt∣y),所以只要推导出 ∇xtlogp(xt∣y)\nabla_{x_t} \log p(x_t|y)∇xtlogp(xt∣y) 是什么即可,推导过程如下:
公式1.8
\nabla_{x_t} \log p(x_t|y) \\= \nabla_{x_t} \log \left( \frac{p(x_t)p(y|x_t)}{p(y)} \right) \\= \nabla_{x_t} \log p(x_t) + \nabla_{x_t} \log p(y|x_t) - \underbrace{\nabla_{x_t} \log p(y)}_
- 文章作者:
- Lthero博客
- 版权声明:
- 本博客所有文章除特别声明外,均采用CC BY-NC-SA 4.0许可协议。转载请注明来自 Lthero博客!





