Classifier-free Guidance
现在我们来介绍引导扩散的另一个方法Classifier-free Guidance,该方法也广泛运用于后续的各种扩散模型。
论文:CLASSIFIER-FREE DIFFUSION GUIDANCE
https://arxiv.org/pdf/2207.12598.pdf
classifier guidance到classifier-free guidance之间扩散模型也有了更多的研究,描述的符号也发生了一些改变,采样时间也发生了变化。
文章使用了不同之前提到的文章的公式符号,并且将采样时间使用 λ = log α λ 2 / σ λ 2 \lambda=\log\alpha_{\lambda}^{2}/\sigma_{\lambda}^{2} λ=logαλ2/σλ2进行代替。主要贡献是将有条件的和无条件的扩散模型结合到一起,无需另外训练分类器。
公式推导过程
将Classifier Guidance论文所得到的公式
Classifier Guidance论文相关解析可以查看另一篇博文
【扩散模型】引导扩散方法ClassifierGuidance
ϵ ^ ( x t ) : = ϵ θ ( x t ) − 1 − α ˉ t ∇ x t log p ϕ ( y ∣ x t ) \hat{\epsilon}(x_t):=\epsilon_\theta(x_t)-\sqrt{1-\bar{\alpha}_t} \nabla_{x_t}\log p_\phi(y|x_t) ϵ^(xt):=ϵθ(xt)−1−αˉt∇xtlogpϕ(y∣xt)
写成新的形式
ϵ ~ θ ( z λ , c ) = ϵ θ ( z λ , c ) − w σ λ ∇ z λ log p θ ( c ∣ z λ ) \tilde{\epsilon}_\theta(\mathbf{z}_\lambda,\mathbf{c})=\epsilon_\theta(\mathbf{z}_\lambda,\mathbf{c})-w\sigma_\lambda\nabla_{\mathbf{z}_\lambda}\log p_\theta(\mathbf{c}|\mathbf{z}_\lambda) ϵ~θ(zλ,c)=ϵθ(zλ,c)−wσλ∇zλlogpθ(c∣zλ)
(也可以写成)
p ~ θ ( z λ ∣ c ) ∝ p θ ( z λ ∣ c ) p θ ( c ∣ z λ ) w \tilde{p}_\theta(\mathbf{z}_\lambda|\mathbf{c})\propto p_\theta(\mathbf{z}_\lambda|\mathbf{c})p_\theta(\mathbf{c}|\mathbf{z}_\lambda)^w p~θ(zλ∣c)∝pθ(zλ∣c)pθ(c∣zλ)w
若将权重w变为w+1,使用score方法进行求导并将 p ( z λ ∣ c ) p(\mathbf{z}_{\lambda}|\mathbf{c}) p(zλ∣c)使用贝叶斯公式转化得到:
ϵ θ ( z λ ) − ( w + 1 ) σ λ ∇ z λ log p θ ( c ∣ z λ ) ≈ − σ λ ∇ z λ [ log p ( z λ ) + ( w + 1 ) log p θ ( c ∣ z λ ) ] = − σ λ ∇ z λ [ log p ( z λ ∣ c ) + w log p θ ( c ∣ z λ ) ] , \begin{aligned} \boldsymbol{\epsilon}_{\theta}(\mathbf{z}_{\lambda})-(w+1)\sigma_{\lambda}\nabla_{\mathbf{z}_{\lambda}}\log p_{\theta}(\mathbf{c}|\mathbf{z}_{\lambda})& \approx-\sigma_{\lambda}\nabla_{\mathbf{z}_{\lambda}}[\log p(\mathbf{z}_{\lambda})+(w+1)\log p_{\theta}(\mathbf{c}|\mathbf{z}_{\lambda})] \\ &=-\sigma_{\lambda}\nabla_{\mathbf{z}_{\lambda}}[\log p(\mathbf{z}_{\lambda}|\mathbf{c})+w\log p_{\theta}(\mathbf{c}|\mathbf{z}_{\lambda})], \end{aligned} ϵθ(zλ)−(w+1)σλ∇zλlogpθ(c∣zλ)≈−σλ∇zλ[logp(zλ)+(w+1)logpθ(c∣zλ)]=−σλ∇zλ[logp(zλ∣c)+wlogpθ(c∣zλ)],
可以证明
p θ ( z λ ∣ c ) p θ ( c ∣ z λ ) w ∝ p θ ( z λ ) p θ ( c ∣ z λ ) w + 1 p_\theta(\mathbf{z}_\lambda|\mathbf{c})p_\theta(\mathbf{c}|\mathbf{z}_\lambda)^w\propto p_\theta(\mathbf{z}_\lambda)p_\theta(\mathbf{c}|\mathbf{z}_\lambda)^{w+1} pθ(zλ∣c)pθ(c∣zλ)w∝pθ(zλ)pθ(c∣zλ)w+1
因此,可以得到:
ϵ ~ θ ( z λ , c ) = ϵ θ ( z λ , c ) − w σ λ ∇ z λ log p θ ( c ∣ z λ ) ≈ − σ λ ∇ z λ [ log p ( z λ ∣ c ) + w log p θ ( c ∣ z λ ) ] \tilde{\boldsymbol{\epsilon}}_\theta(\mathbf{z}_\lambda,\mathbf{c})=\boldsymbol{\epsilon}_\theta(\mathbf{z}_\lambda,\mathbf{c})-w\sigma_\lambda\nabla_{\mathbf{z}_\lambda}\log p_\theta(\mathbf{c}|\mathbf{z}_\lambda)\approx-\sigma_\lambda\nabla_{\mathbf{z}_\lambda}[\log p(\mathbf{z}_\lambda|\mathbf{c})+w\log p_\theta(\mathbf{c}|\mathbf{z}_\lambda)] ϵ~θ(zλ,c)=ϵθ(zλ,c)−wσλ∇zλlogpθ(c∣zλ)≈−σλ∇zλ[logp(zλ∣c)+wlogpθ(c∣zλ)]
=====================================================
接下来要将无条件的采样和有条件的采样结合到同一个模型中,最终得到:
ϵ ~ θ ( z λ , c ) = ( 1 + w ) ϵ θ ( z λ , c ) − w ϵ θ ( z λ ) \tilde{\boldsymbol{\epsilon}}_\theta(\mathbf{z}_\lambda,\mathbf{c})=(1+w)\boldsymbol{\epsilon}_\theta(\mathbf{z}_\lambda,\mathbf{c})-w\boldsymbol{\epsilon}_\theta(\mathbf{z}_\lambda) ϵ~θ(zλ,c)=(1+w)ϵθ(zλ,c)−wϵθ(zλ)
推导过程:
由新的采样公式两边除以
p
θ
(
z
λ
)
p_\theta(\mathbf{z}_{\lambda})
pθ(zλ)得到【其中,
p
i
(
c
∣
z
λ
)
p^{i}(\mathbf{c}|\mathbf{z}_{\lambda})
pi(c∣zλ)代表
p
θ
(
c
∣
z
λ
)
w
+
1
p_{\theta}(\mathbf{c}|\mathbf{z}_{\lambda})^{w+1}
pθ(c∣zλ)w+1】
p
i
(
c
∣
z
λ
)
∝
p
(
z
λ
∣
c
)
/
p
(
z
λ
)
p^{i}(\mathbf{c}|\mathbf{z}_{\lambda})\propto p(\mathbf{z}_{\lambda}|\mathbf{c})/p(\mathbf{z}_{\lambda})
pi(c∣zλ)∝p(zλ∣c)/p(zλ)
对两边使用score方法求导,得到:
∇ z λ log p i ( c ∣ z λ ) = − 1 σ λ [ ϵ ∗ ( z λ , c ) − ϵ ∗ ( z λ ) ] \nabla_{\mathbf{z}_{\lambda}}\log p^{i}(\mathbf{c}|\mathbf{z}_{\lambda})=-\frac{1}{\sigma_{\lambda}}[\epsilon^{*}(\mathbf{z}_{\lambda},\mathbf{c})-\epsilon^{*}(\mathbf{z}_{\lambda})] ∇zλlogpi(c∣zλ)=−σλ1[ϵ∗(zλ,c)−ϵ∗(zλ)]
将 i = w + 1 i=w+1 i=w+1提下来,两边同乘 − σ λ -\sigma_{\lambda} −σλ并将 ϵ ∗ ( z λ ) \boldsymbol{\epsilon}^{*}(\mathbf{z}_{\lambda}) ϵ∗(zλ)移到左边,最后共同提出 w + 1 w+1 w+1,得到:
ϵ ~ θ ( z λ , c ) = ( 1 + w ) ϵ θ ( z λ , c ) − w ϵ θ ( z λ ) \tilde{\boldsymbol{\epsilon}}_\theta(\mathbf{z}_\lambda,\mathbf{c})=(1+w)\boldsymbol{\epsilon}_\theta(\mathbf{z}_\lambda,\mathbf{c})-w\boldsymbol{\epsilon}_\theta(\mathbf{z}_\lambda) ϵ~θ(zλ,c)=(1+w)ϵθ(zλ,c)−wϵθ(zλ)
所以有条件的模型可以估计 ϵ θ ( z λ , c ) \boldsymbol{\epsilon}_{\theta}(\mathbf{z}_{\lambda},\mathbf{c}) ϵθ(zλ,c),无条件的模型可以估计 ϵ θ ( z λ ) \boldsymbol{\epsilon}_\theta(\mathbf{z}_{\lambda}) ϵθ(zλ)
训练和采样时候对条件c进行选择,如果c为空则为无条件的模型。
伪代码
训练部分:
采样部分:
U-Net
看到这里可能有些小伙伴会很疑问“这个采样神经网络到底是什么?采用什么架构?”
其实只要能完成对噪声的预测的神经网络都是可行的,当然预测效果更好,架构更合理,对语义有更深的理解是最好的。
而扩散模型diffusion一般使用的神经网络是基于U-Net网络。
参考视频
UNet神经网络
U-Net主要用于医学图像的语义分割。现在更多使用padding操作保持大小。
Ho(DDPM)等人使用了一个具有单个头部的16 × 16分辨率的全局关注层,并在每个残差块中添加了嵌入的时间步的投影。
相关论文和代码下载
有时候论文网站arXiv.org打开比较慢,已经将相关论文和代码上传到网盘,需要的可以自取
链接: https://pan.baidu.com/s/1J1h8R4KyY7k6NgS2t7YOZg?pwd=3ss8
可以关注公众号:
搜索:福尔马林灌汤包