本文旨在用最简短的篇幅,描述DDPM的核心思想与设计动机,仅作为日后回顾DDPM的一个记忆锚点,具体公式和代码请参考其它资料。本文尽可能省略一切数学推导,跳略的推导会标注出来。

参考:https://zhuanlan.zhihu.com/p/650394311

生成模型的目标,就是从一张随机图像(如纯噪声)开始,生成一张“真实”的图像,这里的“真实”是指生成的图像符合实际图像的概率分布(例如,一个人拥有黄色或白色皮肤的概率是比较大的,但是拥有蓝色皮肤却是几乎不可能的)。尽管现在大多数生成模型都支持根据输入的文字生成对应内容的图片,但那也只是通过在模型的每个模块加上文字的特征表示而训练得到的,对模型的整体结构影响不大,因此本文主要介绍DDPM从噪声生图的核心思想。

DDPM(以及所有生成式模型)的优化目标是让模型产生的图片分布和真实图片分布尽量相似,那么就有了以下推导过程:

  1. 为了使模型产生的图片分布和真实图片分布尽可能相似,我们要求 ${argmin}_\theta KL(P_{data}||P_{\theta})$
  2. 通过计算拆解,优化目标等价于 $argmax_{\theta}\prod_{i=1}^{m} P_{\theta}(x_i)$ ,同时也等价于让连乘项中的每一项 $logP_{\theta}(x_i)$ 最大。这实际上就是最大似然估计(MLE),最大化真实图片在模型分布下的概率。(有的文章会把1和2反过来,从MLE推出KL散度的最小化,但都是等价的,只需要明白这是两种理解的角度)
  3. 继续拆解 $logP_{\theta}(x_i)$,将优化目标转向最大化下界(ELBO) $E_{q_{\phi}(x_{1}:x_{T}|x_{0})}log\frac{P_{\theta}(x_{0}:x_{T})}{q_{\phi}(x_{1}:x_{T}|x_{0})}$
  4. 继续拆解,优化目标变为最大化 $\sum_{t=2}^{T} E_{q(x_{t}|x_{0})}[D_{KL}(q(x_{t-1}|x_{t},x_{0}) || p_{\theta}(x_{t-1}|x_{t}))]$ ,这一步很关键,因为它从模型最终输出图片与实际图片分布的KL散度转换为了模型每一步输出的图片与实际图片分布的KL散度,这就使得模型的训练目标变得可行了(因为直接优化最终输出图片与实际图片分布的KL散度是不可行的,我们无法直接计算这个散度),而且这个优化目标也非常合理,因为如果模型每一步输出的图片分布都和实际图片分布尽可能接近,那么最终输出的图片分布自然也会和实际图片分布尽可能接近。
  5. 继续推导得出 $q(x_{t-1}|x_{t}, x_{0})\sim N(\frac{\sqrt{\bar\alpha_{t-1}}\beta_{t}x_{0} + \sqrt{\alpha_{t}}(1-\bar\alpha_{t-1})x_{t}}{1 - \bar\alpha_{t}}, \frac{(1-\alpha_{t})(1-\bar\alpha_{t-1})}{1-\bar\alpha_{t}})$ ,其中该分布的方差是只和我们设置的超参数相关的常量,期望是与初始输入 $x_{0}$ 和当前输入 $x_{t}$ 相关的函数。
  6. 现在我们得到了第4步中KL散度的 $q(x_{t-1}|x_{t}, x_{0})$ 项,再来看 $p_{\theta}(x_{t-1}|x_{t})$ 项,为了让p和q的分布接近,我们需要让p去学习q的均值和方差。由于方差是一个常量,在DDPM中,假设它是固定的,不再单独去学习它(后续的扩散模型,例如GLIDE则同时对方差也做了预测),因此现在只需要学习q的均值,即 $\min | \tilde{\mu}(x_t, x_0) - \mu_\theta(x_t) |^2$ 。经过计算,可以把q的均值表示成 $\frac{1}{\sqrt{\alpha_{t}}}(x_{t} - \frac{1-\alpha_{t}}{\sqrt{1-\bar\alpha_{t}}}\epsilon)$ , $xt$ 是已知的,因此这里只要让模型去预测噪声即可。化简得到最终的优化目标为 $\min | \epsilon - \epsilon\\theta(x_t, t) |^2$ 。而 $x_t$ 又可以通过重参数化技巧表示成 $x_t = \sqrt{\bar\alpha_{t}}x_0 + \sqrt{1-\bar\alpha_{t}}\epsilon$ ,这样我们就得到了论文中的训练算法。

DDPM希望生成一张符合实际分布的图像,然而一开始的图像是纯噪声,直接从它得到最终图像不现实。因此DDPM采用了这样的思想:既然可以给一张清晰的图像逐步添加噪声,使得它越来越“模糊”,最终变成纯噪声,那么我是不是也可以反过来,从纯噪声开始,一点一点猜出上一步的略微清晰的图像是什么样子,最终得到完全清晰的目标图像。假如现在我有了一个训练好的DDPM模型,想通过预测 $p(x_{t-1}|x_t)$ 来得到上一步的图像,然而 $p(x_{t-1}|x_t)$ 是无法计算的,因为它依赖于未知的整个数据集的分布,而 $p(x_{t-1}|x_t, x_0)$ 是可以计算的,因此我们采用迂回的策略:先通过 $x_t$ 得到噪声 $\epsilon$ 的预测值 ,再通过 $x_t$ 和 $\epsilon$ 的预测值来计算出 $x_0$ 的预测值(注意,这里的 $x_0$ 是指当前时间步t模型通过噪声想象出的初始图像,而不是通过马尔科夫过程预测出的最终图像,因此这里的 $x_0$ 与实际结果有较大差距,不能直接作为输出),最后通过 $x_t$ 和 $x_0$ 的预测值来计算出 $x_{t-1}$ 的预测分布 $p(x_{t-1}|x_t, x_0)$ ,再从这个分布中采样(即论文Sampling算法的第4行)得到 $x_{t-1}$ 的预测值。通过不断迭代这个过程,最终就可以从纯噪声生成出一张清晰的图像了。(当然,这里不用真的计算出预测的 $x_0$,因为它只是一个中间变量,我们只需要通过 $x_t$ 和 $\epsilon$ 的预测值来计算出 $x_{t-1}$ 的预测分布的期望就可以了,这里这么说只是为了方便理解)。

值得说明的是,DDPM在时间步t并不是预测从t-1到t添加的噪声,而是从初始状态 $x_0$ 到当前状态 $x_t$ 的“累积等效噪声”,是多个正态分布叠加产生的一个等效的正态分布。