扩散模型的条件引导生成
Preface
我们在之前的文章中关注的都是无条件生成,生成结果不受我们控制,特别是以 DDPM 为代表的采样过程本身就带有随机性的模型,即使用同样的初始变量也会得到完全不同的结果。但是,有条件的生成(受控生成)却又非常重要:以类别标签为条件可以让我们控制生成的类别;图像恢复、图像填充、图像编辑等任务可以视为以已知图像为条件的生成任务;另外,以文本为条件来跨模态地指导图像生成更是给予了我们无限的发挥创造力的空间。本文就梳理一下为扩散模型加入条件的一些方法。
Class Embeddings
最简单的加入类别条件的方法就是给模型输入 class embeddings. 在论文[1]中,作者将 class embeddings 连同 time embeddings 一起给到了 AdaGN 层:
Classifier Guidance
顾名思义,classifier guidance 引入额外的分类器
Conditional Reverse Noising Process
对于带条件的扩散模型,其逆向过程可以写作:
其中 是与 无关的常数项。这个式子看着简单,但其实并不是那么显然,证明过程见本节末尾。上式右边包含两项,其中
与无条件的逆向过程相同: 而 一项可以在 处进行一阶泰勒展开: 其中 . 于是, 即: 这意味着有条件的逆向过程与无条件的唯一差别在于:前者的均值在后者的基础上偏移了一个 . 直观上,由于偏移的方向沿着分类器提供的梯度 ,而这个梯度恰恰反映了应该如何移动才能让指定类别概率最大,所以偏移后的分布更能体现给定的类别条件,这就是分类器的引导作用。算法总结如下(其中 gradient scale 在后文解释):注意!根据我们的推导,我们应该在
处取梯度,但是算法截图和官方代码却是在 处求的梯度。为验证这确实是一个 bug,我 google 了许久,最后看到有个老哥提了相关的 issue,并得到了原作者的肯定答复:Yes, this is indeed a slight bug, which we noticed shortly after releasing our work. However, we did try ablating using the correct formula, and found that it didn't noticeably change results.
另外,这老哥还发了一个 YouTube video 讲这篇论文,挺不错的,推荐观看。
Conditional Sampling for DDIM
上述推导并不适用于 DDIM 的确定性采样过程(
),因此我们需要另一种推导方式。我们知道扩散模型的本质是在拟合 score function. 在无条件的扩散模型中,score function 为
;那么若以类别标签 为条件,则 score function 为: 可以看见,有条件的 score function,等于无条件的 score function 加上分类器关于输入的梯度。由于我们知道扩散模型的采样其实就是沿着 score function 的方向走,所以 unconditional score 一项是在增大 ,即让样本越来越真实;classifier guidance 一项是在增大 ,即让样本更能匹配上输入的条件 ,从而实现条件生成。由于 DDPM / DDIM 中的噪声
和 score function 有如下联系(详见 Score-Based Generative Models 一文): 所以我们只需要定义一个新的噪声: 那么把原本的所有 换做 就可以实现条件生成了。
两种推导的区别和联系
不知道是否有人有和我一样的疑问,为什么作者要做两种推导,或者说,为什么不在第一种情形中也用第二种推导的结论?
如果我们把第二种推导也应用在 DDPM 里,由于原本的无条件 DDPM 的逆向过程是:
对比 Algorithm 1,可见主要区别是均值的偏移量从
在实验中,作者发现直接按上述结论做条件生成的效果并不理想,如下左图所示:
于是作者给分类器梯度项添加了一个权重系数
需要说明的是,classifier guidance 与输入 class embeddings 并不矛盾,二者共同作用能达到更好的效果。后者是加入条件的最基本做法,而无论模型是否带有条件,都可以用分类器做引导。也就是说,条件(condition)和引导(guidance)是两种不同但相辅相成的方法。
最后,虽然我们是视
附录:关于 式的推导(原论文 Appendix H)
对标无条件马尔可夫链,我们用
Classifier-Free Guidance
Classifier guidance 虽然成功地为扩散模型提供了引导,并引入了 diversity-fidelity tradeoff,但是其劣势也很明显:我们必须额外训练一个分类器,而且该分类器需要对所有 noise scale 都有分类能力,所以还不能直接加载常见的预训练模型。因此,classifier-free guidance[3] 应运而生。
首先,我们重新排列
注:上述权重记号与原论文有所不同,原论文写作:
在实现上,我们用
由于 classifier-free guidance 的效果非常优秀且训练方便,后续许多著名的模型,包括 GLIDE、DALL-E 2 (unCLIP)、Imagen 等都应用了 classifier-free guidance. 而至于这些让扩散模型火出圈的应用,我们留到以后的文章吧。
Summary
在本文中,我们说明了为模型加入条件其实包括两方面:
- Condition:我们可以直接把条件输入给模型,使之从 unconditional model 变成 conditional model;针对条件的不同形式,把条件融入模型架构的方式也不同,比如用 AdaGN 来融合 class embedding;
- Guidance:我们可以用显式或隐式的分类器为生成过程加入条件引导,即 classifier guidance 或 classifier-free guidance.
需要注意的是,condition 和 guidance 是两种不同的技术,我们可以只用 conditional model 而没有 guidance,也可以对 unconditional model 做显式的 guidance,它们都能达到条件生成的目的。当然,二者同时使用往往能取得更好的效果。
在之后的文章中,我们将聚焦基于扩散模型的应用。这些应用几乎都离不开条件生成,譬如,超分、去模糊、填充等图像恢复任务可以视为以退化图像为条件的生成任务,图像编辑、图像翻译等任务可以视为以源图像/参考图像为条件的生成任务,根据文本描述生成或编辑图像显然是以文本为条件的生成任务……那么,针对这些任务,许多工作就是在如何加入 condition 和如何施加 guidance 两方面下功夫。
References
- Dhariwal, Prafulla, and Alexander Nichol. Diffusion models beat gans on image synthesis. Advances in Neural Information Processing Systems 34 (2021): 8780-8794. ↩︎
- Song, Yang, Jascha Sohl-Dickstein, Diederik P. Kingma, Abhishek Kumar, Stefano Ermon, and Ben Poole. Score-Based Generative Modeling through Stochastic Differential Equations. In International Conference on Learning Representations. 2020. ↩︎
- Ho, Jonathan, and Tim Salimans. Classifier-Free Diffusion Guidance. In NeurIPS 2021 Workshop on Deep Generative Models and Downstream Applications. 2021. ↩︎
- Luo, Calvin. Understanding diffusion models: A unified perspective. arXiv preprint arXiv:2208.11970 (2022). ↩︎
- 扩散模型与受控图像生成-脉络梳理 - 中森的文章 - 知乎 https://zhuanlan.zhihu.com/p/585938939 ↩︎
- Sander Dieleman. Guidance: a cheat code for diffusion models. https://benanne.github.io/2022/05/26/guidance.html ↩︎