在写本文之前,我反复看了网上很多阐述DDPM的文章,实话说,一开始看到那种一上来就一堆公式的,起初基本看不下去,虽然后来 慢慢的都看得下去了,但如果对于一个初次接触DDPM的初学者来说,一上来就一堆公式确实容易把人绕晕,但如果没有公式,则又没法透彻理解背后的算法步骤
两相权衡,本文将侧重算法每一步的剖析,而公式更多为解释算法原理而服务,说白了,侧重原理 其次公式,毕竟原理透彻了,公式也就自然而然的能写出来了
言归正传,咱们先来了解下扩散模型的极简发展史
1、极简发展史:从扩散模型、DDPM、improved DDPM到DALL·E/DALL·E2
1.1 从扩散模型概念的提出到DDPM
2015年「扩散模型」概念的提出
2015年,斯坦福大学的一博士后Sohl-Dickstein通过此篇论文《Deep Unsupervised Learning using Nonequilibrium Thermodynamics》提出扩散模型的概念
简单来讲,扩散模型的灵感来自非平衡热力学,通过定义了一个扩散步骤的马尔可夫链,以缓慢地将「符合高斯分布的随机噪声」添加到数据中,然后反转扩散过程以从噪声中构建所需的数据样本
2019年 估计数据分布梯度的生成模型
随后,2019年,斯坦福一在读博士宋飏和导师通过此文《Generative Modeling by Estimating Gradients of the Data Distribution》提出了一种新方法来构建生成模型:即不需要估计数据的概率分布(高维曲面),相反,它估计的是分布的梯度(可以看成是高维曲面的斜率)
2020年 Denoising Diffusion Probabilistic Models(DDPM)
再之后,2020年6月,UC Berkeley的Jonathan Ho等人意识到宋飏的工作可以改进 Sohl-Dickstein 的扩散模型,很快,便通过论文《Denoising Diffusion Probabilistic Models》正式提出对于普通扩散模型的改进版:DDPM(全称即论文名称:Denoising Diffusion Probabilistic Models)
DDPM主要有两个贡献
-
一方面,从预测转换图像改进为预测噪声(强调这点的文章太少了,可它是DDPM的关键,更是DDPM的本质) 作者认为,每次直接从预测,这种图像到图像的转化不太好优化,所以直接去预测从到这一步所添加的噪声,这样就简化了问题:毕竟噪声一旦被预测出来,减去噪声即得 这种操作就有点类似ResNet的残差结构。每次新增一些层,模型不是直接从 去预测(这样比较困难),而是让新增的层去预测()。这样新增层不用全部重新学习,而是学习原来已经学习到的 和真实值 之间的残差就行(residual) DDPM采用了一个U-Net 结构的Autoencoder来对 时刻的高斯噪声进行预测,训练目标即希望预测的噪声和真实的噪声一致,所以目标函数为和的 Loss: 这里的标签是正向扩散过程中,我们每一步添加的,所以是已知的 这里的就对应了U-Net 模型结构 至于 就是U-Net 的输入之外的另一个输入time embedding「类似transformer里的正弦位置编码,主要用于告诉 U-Net模型,现在到了反向过程的第几步,相当于引导U-Net生成」 通过这个简单的损失函数,模型就可以训练起来了
-
另一方面,DDPM只预测正态分布的均值虽然正态分布由均值和方差决定,但作者在这里发现,其实模型不需要学方差,只需要学习均值就行。逆向过程中高斯分布的方差项直接使用一个常数,模型的效果就已经很好。所以就再一次降低了模型的优化难度
DDPM也有些类似VAE,也可以将其当做一个encoder-decoder的结构,但是有几点区别:
-
扩散过程是编码器一步步的走到,而且是一个固定的过程;而VAE的编码器是可以学习的;
-
DDPM的每一步输出输出都是同样维度大小的,但对一般的自编码器(AE/VAE等),往往中间的bottleneck特征会比输入小很多
-
扩散模型有步数step的概念(time step、time embedding),模型要经过很多步才能生成图片,且在所有step中,U-Net都是共享参数的
1.2 improved DDPM、Diffusion Model Beat GANs到DALL·E/DALL·E2
2020年底 improved DDPM
DDPM使得扩散模型可以在真实数据集上work得很好之后,一下子吸引了很多人的兴趣。因为DDPM在数学上简洁美观,无论正向还是逆向,都是高斯分布,可以做很多推理证明,而且还有很多不错的性质,2020年底左右,OpenAI推出了 improved DDPM
improved DDPM相比DDPM做了几点改动:
-
DDPM的逆向过程中,高斯分布的方差项直接使用一个常数而不用学习 improved DDPM作者就觉得如果对方差也进行学习的话,效果应该会更好,改了之后果然取样和生成效果都好了很多
-
DDPM添加噪声时采用的线性的variance schedule改为余弦schedule,效果更好(类似学习率从线性改为余弦)
-
简单尝试了scale大模型之后,生成效果更好
2021年 Diffusion Model Beat GANs:使用classifier guidance的方法,引导模型进行采样和生成
上面第三点对OpenAI来说,无疑是个好消息。所以improved DDPM的二作和三作马上着手研究,发布了《Diffusion Models Beat GANs on Image Synthesis》这篇论文,比之前的improved DDPM又做了一些改进: