在上一节中,我们总结了Classifier Guidance Diffusion,其有两个弊端,一是需要额外训练一个分类头,引入了额外的训练开销。二是要噪声图像通常难以分类,分类头通常难以学习,影响生成图像的质量。
Classifier Free Guidance Diffusion解决了上述两个弊端,不需要引入额外的分类头即可控制图像的生成。
本节所有符号含义与前文一致,请读者阅读完前三篇博文后在查阅此文。
本文仅总结backbone为DDIM情况下的Classifier Free Guidance Diffusion
依据前文可知Classifier Guidance Diffusion的前向过程与反向过程与DDPM一致,且有
q ( x t ∣ x t − 1 , y ) = q ( x t ∣ x t − 1 ) q(x_t|x_{t-1},y)=q(x_t|x_{t-1}) q(xt∣xt−1,y)=q(xt∣xt−1)
则有 q ( x t ∣ x 0 , y ) = q ( x t ∣ x 0 ) = N ( x t ; α ˉ t x 0 , ( 1 − α ˉ t ) I ) q(x_t|x_{0},y)=q(x_t|x_0)=\mathcal N(x_t;\sqrt{\bar \alpha_t}x_0,(1-\bar\alpha_t)\mathcal I) q(xt∣x0,y)=q(xt∣x0)=N(xt;αˉtx0,(1−αˉt)I)
假设目前有一批基于条件 y y y的样本 x t x_t xt, ϵ ( x t , t , y ) \epsilon(x_t,t,y) ϵ(xt,t,y)服从标准正态分布,则样本 x t x_t xt将满足
x t = α ˉ t x 0 + 1 − α ˉ t ϵ ( x t , t , y ) (1.0) x_t=\sqrt{\bar \alpha_t}x_0+\sqrt{1-\bar\alpha_t}\epsilon(x_t,t,y)\tag{1.0} xt=αˉtx0+1−αˉtϵ(xt,t,y)(1.0)
依据Tweedie方法,我们有
α ˉ t x 0 = x t + ( 1 − α ˉ t ) ∇ x t log p ( x t ∣ y ) \begin{aligned} \sqrt{\bar \alpha_t}x_0=x_t+(1-\bar\alpha_t)\nabla_{x_t}\log p(x_t|y) \end{aligned} αˉtx0=xt+(1−αˉt)∇xtlogp(xt∣y)
进而有
x t = α ˉ t x 0 − ( 1 − α ˉ t ) ∇ x t log p ( x t ∣ y ) (1.1) x_t=\sqrt{\bar \alpha_t}x_0-(1-\bar\alpha_t)\nabla_{x_t}\log p(x_t|y)\tag{1.1} xt=αˉtx0−(1−αˉt)∇xtlogp(xt∣y)(1.1)
结合式1.0与1.1,则有
∇ x t log p ( x t ∣ y ) = − 1 1 − α ˉ t ϵ ( x t , t , y ) (1.2) \nabla_{x_t}\log p(x_t|y)=-\frac{1}{\sqrt{1-\bar\alpha_t}}\epsilon(x_t,t,y)\tag{1.2} ∇xtlogp(xt∣y)=−1−αˉt1ϵ(xt,t,y)(1.2)
依据贝叶斯公式,我们有
log p ( x t ∣ y ) = log p ( y ∣ x t ) + log p ( x t ) − log p ( y ) ∇ x t log p ( y ∣ x t ) = ∇ x t log p ( x t ∣ y ) − ∇ x t log p ( x t ) + ∇ x t log p ( y ) = ∇ x t log p ( x t ∣ y ) − ∇ x t log p ( x t ) = − 1 1 − α ˉ t ϵ ( x t , t , y ) + 1 1 − α ˉ t ϵ ( x t , t ) (1.3) \begin{aligned} \log p(x_t|y)&=\log p(y|x_t)+\log p(x_t)-\log p(y)\\ \nabla_{x_t}\log p(y|x_t)&=\nabla_{x_t}\log p(x_t|y)-\nabla_{x_t}\log p(x_t)+\nabla_{x_t}\log p(y)\\ &=\nabla_{x_t}\log p(x_t|y)-\nabla_{x_t}\log p(x_t)\\ &=-\frac{1}{\sqrt{1-\bar\alpha_t}}\epsilon(x_t,t,y)+\frac{1}{\sqrt{1-\bar\alpha_t}}\epsilon(x_t,t) \end{aligned}\tag{1.3} logp(xt∣y)∇xtlogp(y∣xt)=logp(y∣xt)+logp(xt)−logp(y)=∇xtlogp(xt∣y)−∇xtlogp(xt)+∇xtlogp(y)=∇xtlogp(xt∣y)−∇xtlogp(xt)=−1−αˉt1ϵ(xt,t,y)+1−αˉt1ϵ(xt,t)(1.3)
回顾一下backbone为DDIM的Classifier Guidance Diffusion的采样流程
将式1.3代入,且引入一个超参数 w w w,可得
ϵ ^ = ϵ θ ( x t ) − w 1 − α ˉ t ∇ x t log p ( y ∣ x t ) = ϵ θ ( x t ) − w ( ϵ θ ( x t , t ) − ϵ θ ( x t , t , y ) ) = ( 1 − w ) ϵ θ ( x t , t ) + w ϵ θ ( x t , t , y ) (1.4) \begin{aligned} \hat \epsilon &= \epsilon_\theta(x_t)-w\sqrt{1-\bar\alpha_t}\nabla_{x_t}\log p(y|x_t)\\ &=\epsilon_\theta(x_t)-w(\epsilon_\theta(x_t,t)-\epsilon_\theta(x_t,t,y))\\ &=(1-w)\epsilon_\theta(x_t,t)+w\epsilon_\theta(x_t,t,y) \end{aligned}\tag{1.4} ϵ^=ϵθ(xt)−w1−αˉt∇xtlogp(y∣xt)=ϵθ(xt)−w(ϵθ(xt,t)−ϵθ(xt,t,y))=(1−w)ϵθ(xt,t)+wϵθ(xt,t,y)(1.4)
注意到原论文的推导结果为(为了区分,超参数设为 w ^ \hat w w^)
ϵ ^ = ( 1 + w ^ ) ϵ θ ( x t , t , y ) − w ^ ϵ θ ( x t , t ) (1.5) \hat \epsilon = (1+\hat w)\epsilon_\theta(x_t,t,y)-\hat w\epsilon_\theta(x_t,t)\tag{1.5} ϵ^=(1+w^)ϵθ(xt,t,y)−w^ϵθ(xt,t)(1.5)
式1.5和1.4是一致的,均为 ϵ θ ( x t , t , y ) \epsilon_\theta(x_t,t,y) ϵθ(xt,t,y)与 ϵ θ ( x t , t ) \epsilon_\theta(x_t,t) ϵθ(xt,t)的加权和,且权重和为1。
依据式1.5,我们需要训练两个神经网络 ϵ θ ( x t , t , y ) \epsilon_\theta(x_t,t,y) ϵθ(xt,t,y)与 ϵ θ ( x t , t ) \epsilon_\theta(x_t,t) ϵθ(xt,t),前者为的输入包含加噪图片 x t x_t xt以及条件 y y y(图像or文字),后者的输入仅包含加噪图像 x t x_t xt。但其实两个神经网络可以共用一个backbone,在训练时,只需要用一定的概率将条件 y y y设置为空即可。
Classifier Free Guidance Diffusion的测试流程有两次推断
可以看到推断成本多了一倍。