从VAE到DDPM
VAE 回顾
在之前的文章中,我们详细地梳理了一遍 VAE,这里做一个简单回顾。
在 VAE 中,为了最大化对数似然:
双层 VAE
把 VAE 中的单个隐变量
虽然有两个隐变量,但如果把它们视为一个整体,那证据下界 ELBO 的推导过程与
我们依旧希望从 ELBO 中拆解出重构项和正则项。重构项比较简单,只需要把
DDPM
在双层 VAE 的基础上,我们能再多加几层吗?
如上图所示,为方便叙述,我们引入两个称呼:
- 称从
到 的马尔可夫链为前向过程 (forward process) 或扩散过程 (diffusion process); - 称从
到 的马尔可夫链为逆向过程 (reverse process) 或去噪过程 (denoising process).
用概率图模型的术语来说,前向过程对应 inference model,逆向过程对应 generative model. 另外,为书写上的方便,下文将
同双层 VAE 一样的道理,把
现在,我们只需要为
前向过程
首先我们关注前向过程,即从
基于
接下来推导
注意:
Tip:推导时不要每一项都打开老老实实地算,直接提取
看到这里,不知读者心中是否有疑惑——为什么人为设置后验分布(即前向过程)是合理的?VAE 中
逆向过程
现在我们来关注逆向过程,即从
对于
表达式 | ||
均值 | ||
方差 |
可以看到,
至于方差,DDPM 给出了两个选择
损失函数
至此,我们已经确定下
然后看重构项,代入表达式得:
进一步地,DDPM 对
可见 DDPM 虽然推导有些复杂,但最后得到的算法流程却异常简单,效果也很好,难怪迅速成为了研究的热点。
一些注解
直观上 DDPM 干的事情可以总结为——前向过程对输入图像一步步加噪,使之变成高斯噪声;逆向过程使用模型来预测原图(或预测添加的噪声),进而把带噪图像一步步转换回真实图像。这里容易产生一个误解:既然每一步
那么,纵观整个生成过程,我们可以把
代码实现
Github repo: https://github.com/xyfJASON/Diffusion-Models-Implementations
结果展示
更多内容请查看代码仓库。
关于 clipping
在官方代码[16]和若干其他实现中,我发现大家普遍喜欢使用 clipping,即对于逆向过程的每一步,在预测
色调偏移问题
早期的实现版本在 MNIST 上 work 得很好,但是在 CelebA-HQ 上训练时出现了色调偏移(color shifting)问题。具体而言,我发现各个 epoch 之间的图片色调会发生明显偏移,比如前一个 epoch 图片都偏红,后一个 epoch 图片都偏蓝,有时候甚至亮/暗得根本看不清人脸,如下图所示:
本以为是模型还没收敛,但是 300 多个 epochs 之后仍然是这样,这就不得不重视起来。一番排查后,发现是我偷懒没有实现 EMA 导致的,特别是原作者把 decay rate 设置为 0.9999,意味着参数更新其实是很慢的。EMA 的本质是对历史权重做了加权平均,可以看作若干历史模型的集成。从这个角度来说,那些色调发生不同偏移的模型互相“抵消”,从而缓解了色调偏移问题。(注意只是缓解,并没有消除!)
后来我读到其实宋飏在论文[3]里面就提到了这一现象,这也是他引入 EMA 的原因。说到底,色调偏移就是模型还没有收敛到真实分布的一个表现,只不过视觉上给人的冲击比较强烈罢了。
[update 2022.11.27] 虽然 EMA 的 decay rate 设置为 0.9999,但 tensorflow 的官方实现其实是这样的:
References
- Ho, Jonathan, Ajay Jain, and Pieter Abbeel. Denoising diffusion probabilistic models. Advances in Neural Information Processing Systems 33 (2020): 6840-6851. ↩︎
- Sohl-Dickstein, Jascha, Eric Weiss, Niru Maheswaranathan, and Surya Ganguli. Deep unsupervised learning using nonequilibrium thermodynamics. In International Conference on Machine Learning, pp. 2256-2265. PMLR, 2015. ↩︎
- Song, Yang, and Stefano Ermon. Improved techniques for training score-based generative models. Advances in neural information processing systems 33 (2020): 12438-12448. ↩︎
- Luo, Calvin. Understanding diffusion models: A unified perspective. arXiv preprint arXiv:2208.11970 (2022). ↩︎
- Lilian Weng. What are Diffusion Models?. https://lilianweng.github.io/posts/2021-07-11-diffusion-models ↩︎
- Angus Turner. Diffusion Models as a kind of VAE. https://angusturner.github.io/generative_models/2021/06/29/diffusion-probabilistic-models-I.html ↩︎
- Denoising Diffusion-based Generative Modeling: Foundations and Applications. https://cvpr2022-tutorial-diffusion-models.github.io ↩︎
- 苏剑林. (Jul. 06, 2022). 《生成扩散模型漫谈(二):DDPM = 自回归式VAE 》[Blog post]. Retrieved from https://kexue.fm/archives/9152 ↩︎
- 苏剑林. (Jul. 19, 2022). 《生成扩散模型漫谈(三):DDPM = 贝叶斯 + 去噪 》[Blog post]. Retrieved from https://kexue.fm/archives/9164 ↩︎
- 由浅入深了解Diffusion Model - ewrfcas的文章 - 知乎 https://zhuanlan.zhihu.com/p/525106459 ↩︎
- 扩散模型之DDPM - 小小将的文章 - 知乎 https://zhuanlan.zhihu.com/p/563661713 ↩︎
- Probabilistic Diffusion Model概率扩散模型理论与完整PyTorch代码详细解读. https://www.bilibili.com/video/BV1b541197HX ↩︎
- Diffusion Model:比“GAN”还要牛逼的图像生成模型!https://www.bilibili.com/video/BV1pD4y1179T ↩︎
- 【炼丹技巧】指数移动平均(EMA)的原理及PyTorch实现 - Nicolas的文章 - 知乎 https://zhuanlan.zhihu.com/p/68748778 ↩︎
- https://huggingface.co/blog/annotated-diffusion ↩︎
- https://github.com/lucidrains/denoising-diffusion-pytorch ↩︎
- https://github.com/hojonathanho/diffusion ↩︎
- https://github.com/openai/improved-diffusion ↩︎
- https://github.com/lucidrains/imagen-pytorch ↩︎
- https://github.com/tqch/ddpm-torch ↩︎
- https://github.com/abarankab/DDPM ↩︎
- https://github.com/w86763777/pytorch-ddpm ↩︎