因为《数字媒体导论》课程要做文献汇报,同组同学选择了和扩散模型相关的论文,而我又没接触过扩散模型,正好学习并整理一下DDPM模型的推导过程。

1. DDPM

扩散模型(Diffusion Model)是一种基于概率生成模型的深度学习方法,核心通过前向扩散(逐步加噪)和反向扩散(逐步去噪)两个对称的马尔可夫链,实现从随机噪声到真实数据的生成。

DDPM是扩散模型中的代表性工作,来自2020年发表的《Denoising Diffusion Probabilistic Models》:

1.1 前向扩散

前向扩散的目的是从真实数据 x0x_0出发,按固定规则逐步添加高斯噪声,最终得到纯噪声 xtx_t(t为总步数)。前向扩散的核心是缓慢加噪,确保每一步噪声强度可控,且最终 xtx_t 近似标准高斯分布 N(0,I)\mathcal{N}(0, I),加噪过程如下:

q(xtxt1)N(1βtxt1,βtI)q(x_t | x_{t-1}) \sim \mathcal{N}(\sqrt{1-\beta_t}\cdot x_{t-1},\,\beta_t I)

即对于xt1x_{t-1}中的每个像素,以其像素值乘以1βt\sqrt{1-\beta_t}为均值,βt\beta_t为方差,按照正态分布来随机采样一个值作为下一步图像的像素值。其中II是单位矩阵;βt(0,1)\beta_t \in (0, 1)为预定义的噪声强度,通常设定为从 0.0001 到 0.02 的递增序列(前期加少量噪声,后期加大量噪声,避免数据过早失真),从x0x_0开始重复以上操作tt次则可以得到噪声图片。

但是这样的循环操作会非常耗时,为了简化计算,可以采用重参数化技巧来将tt次操作转变为一次操作,将(1)式利用标准正态分布来展开:

xt=1βtxt1+βtϵt1ϵN(0,1)x_t = \sqrt{1-\beta_t}\cdot x_{t-1} + \sqrt{\beta_t} \cdot \epsilon_{t-1} \quad\qquad \epsilon \sim \mathcal{N}(0, 1)

即当前图像等于上一步图像和一个高斯噪声项的加权和,定义α=1β\alpha = 1 - \beta,再将xt1x_{t-1}递推展开:

xt=αtxt1+1αtϵt1=αt(αt1xt2+1αt1ϵt2)+1αtϵt1=αtαt1xt2+αt(1αt1)ϵt2+1αtϵt1x_t = \sqrt{\alpha_t}\cdot x_{t-1} + \sqrt{1-\alpha_t}\cdot \epsilon_{t-1}\\ = \sqrt{\alpha_t}\cdot (\sqrt{\alpha_{t-1}}\cdot x_{t-2} + \sqrt{1-\alpha_{t-1}}\cdot \epsilon_{t-2}) + \sqrt{1-\alpha_t}\cdot \epsilon_{t-1}\\ =\sqrt{\alpha_t \alpha_{t-1}}\cdot x_{t-2} + \sqrt{\alpha_t(1-\alpha_{t-1})}\epsilon_{t-2} + \sqrt{1-\alpha_t}\epsilon_{t-1}

我们知道,将两个正态分布相加,最后仍然是正态分布,所得正态分布的方差为两者之和,那么对于上式最后的两个高斯噪声项,将它们相加可以用一个单个高斯噪声来代替:

αt(1αt1)ϵt2N(0,αtαtαt1)1αtϵt1N(0,1αt)αt(1αt1)ϵt2+1αtϵt1N(0,1αtαt1)xt=αtαt1xt2+1αtαt1ϵ\sqrt{\alpha_t(1-\alpha_{t-1})}\,\epsilon_{t-2} \sim \mathcal{N}(0, \,\alpha_t -\alpha_t\alpha_{t-1})\\ \sqrt{1-\alpha_t}\,\epsilon_{t-1} \sim \mathcal{N}(0, \,1-\alpha_t)\\ \sqrt{\alpha_t(1-\alpha_{t-1})}\epsilon_{t-2} + \sqrt{1-\alpha_t}\epsilon_{t-1} \sim \mathcal{N}(0, \,1-\alpha_t\alpha_{t-1}) \\ x_t = \sqrt{\alpha_t \alpha_{t-1}}\, x_{t-2} + \sqrt{1-\alpha_t\alpha_{t-1}}\,\epsilon

我们不断地进行递推展开至x0x_0,最后就可以得到如下式子:

xt=αtˉx0+1αtˉϵtx_t = \sqrt{\bar{\alpha_t}}\,x_0 + \sqrt{1 - \bar{\alpha_t}} \,\epsilon_t

其中αtˉ=Πi=1tαi\bar{\alpha_t}=\Pi_{i=1}^{t}\alpha_i,由此我们无需从 x0x_0 逐步计算到 xtx_t,可直接计算任意 t 步的加噪数据,为后续训练提供便捷。

1.2 反向扩散

反向扩散是扩散模型的核心学习部分,目标是从 xtx_t 出发,逐步推断 xt1,,x0x_{t-1}, \dots, x_0,即计算p(xt1xt)p(x_{t-1} \mid x_t),但是这个分布我们无法直接计算,因此DDPM利用马尔可夫链的性质来对其进行转化。马尔可夫链中,时间步t的随机变量仅依赖于前一个随机变量,而与更前面的随机变量无关,故有p(xt1xt)=p(xt1xt,x0)p(x_{t-1}|x_t)=p(x_{t-1}|x_t, x_0),后者意思是在xtx_tx0x_0同时发生的情况下xt1x_{t-1}发生的概率。

对于p(xt1xt,x0)p(x_{t-1}|x_t,x_0)可以利用贝叶斯公式进一步展开。根据贝叶斯公式P(AB,C)=P(BA,C)P(AC)P(BC)P(A|B,C) = \frac{P(B|A,C)P(A|C)}{P(B|C)},将p(xt1xt,x0)p(x_{t-1} \mid x_t, x_0) 代入这个公式则可以得到:

p(xt1xt,x0)=p(xtxt1,x0)p(xt1x0)p(xtx0)p(x_{t-1}|x_t,x_0) = \frac{p(x_t|x_{t-1},x_0)p(x_{t-1}|x_0)}{p(x_t|x_0)}

公式右边由三个概率分布组成,对于p(xtxt1,x0)p(x_t|x_{t-1},x_0),再次利用马尔可夫链的性质,将其转换为p(xtxt1)p(x_t|x_{t-1}),则有

p(xt1xt,x0)=p(xtxt1)p(xt1x0)p(xtx0)p(x_{t-1}|x_t,x_0) = \frac{p(x_t|x_{t-1})p(x_{t-1}|x_0)}{p(x_t|x_0)}

如此,右式的三个概率分布都是我们已知的正态分布,p(xtxt1)p(x_t|x_{t-1})是前向过程中的一步,而另外两项则可以用之前提到的重参数化的公式xt=αtˉx0+1αtˉϵtx_t = \sqrt{\bar{\alpha_t}}\,x_0 + \sqrt{1 - \bar{\alpha_t}} \,\epsilon_t 来给出它们的分布:

p(xtxt1)=N(αtxt1,βtI)p(xt1x0)=N(αˉt1x0,(1αˉt1)I)p(xtx0)=N(αtˉx0,(1αtˉ)I)p(x_t|x_{t-1}) = \mathcal{N}(\sqrt{\alpha_t}x_{t-1},\, \beta_tI)\\ p(x_{t-1}|x_0) = \mathcal{N}(\sqrt{\bar{\alpha}_{t-1}}x_0,\, (1-\bar{\alpha}_{t-1})I) \\ p(x_t|x_0) = \mathcal{N}(\sqrt{\bar{\alpha_t}}x_0,\, (1-\bar{\alpha_t})I)

接下来运用正态分布的乘法和除法公式即可给出p(xt1xt,x0)p(x_{t-1}|x_t,x_0)的分布,正态分布乘法和除法公式如下:

N(μa,σa2)N(μb,σb2)N(μc,σc2)1σc2=1σa2+1σb2μcσc2=μaσa2+μbσb2\mathcal{N}(\mu_a,\, \sigma_a^2)\cdot\mathcal{N}(\mu_b,\, \sigma_b^2)\propto\mathcal{N}(\mu_c,\,\sigma_c^2)\\ \frac{1}{\sigma_c^2}=\frac{1}{\sigma_a^2}+\frac{1}{\sigma_b^2} \qquad \frac{\mu_c}{\sigma_c^2}=\frac{\mu_a}{\sigma_a^2}+\frac{\mu_b}{\sigma_b^2}

N(μa,σa2)N(μb,σb2)N(μc,σc2)1σc2=1σa21σb2μcσc2=μaσa2μbσb2\frac{\mathcal{N}(\mu_a,\, \sigma_a^2)}{\mathcal{N}(\mu_b,\, \sigma_b^2)}\propto\mathcal{N}(\mu_c,\,\sigma_c^2)\\ \frac{1}{\sigma_c^2}=\frac{1}{\sigma_a^2}-\frac{1}{\sigma_b^2} \qquad \frac{\mu_c}{\sigma_c^2}=\frac{\mu_a}{\sigma_a^2}-\frac{\mu_b}{\sigma_b^2}

将三个正态分布代入以上公式,最后可以得到:

p(xt1xt,x0)=N(αˉt1βt1αˉtx0+αt(1αˉt1)1αˉtxt,(1αˉt1)βt1αˉt)p(x_{t-1}|x_t,x_0) = \mathcal{N}(\frac{\sqrt{\bar{\alpha}_{t-1}}\beta_t}{1-\bar{\alpha}_t}x_0+\frac{\sqrt{\alpha_t}(1-\bar{\alpha}_{t-1})}{1-\bar{\alpha}_t}x_t,\,\frac{(1-\bar{\alpha}_{t-1})\beta_t}{1-\bar{\alpha}_t})

σ2\sigma^2中的系数是由我们在前向过程中定义的,因此σ2\sigma^2可以直接计算,而在μ\mu中出现了项x0x_0,但是在反向过程中,x0x_0是不给出的,因此利用前面的重参数化公式xt=αtˉx0+1αtˉϵtx_t = \sqrt{\bar{\alpha_t}}\,x_0 + \sqrt{1 - \bar{\alpha_t}} \,\epsilon_t反解出x0x_0

x0=xt1αˉtϵtαˉtx_0 = \frac{x_t - \sqrt{1-\bar{\alpha}_t}\epsilon_t}{\sqrt{\bar{\alpha}_t}}

代入μ\mu中可得:

μ=1αt(xt1αt1αˉtϵt)\mu = \frac{1}{\sqrt{\alpha_t}}(x_t - \frac{1-\alpha_t}{\sqrt{1-\bar{\alpha}_t}}\epsilon_t)

如此,整个μ\mu中只剩下一个未知项ϵt\epsilon_t,因为这个噪声是在前向过程中生成的,反向过程中不能获取这个噪声的值,因此我们可以让模型来预测这个ϵt\epsilon_t的值,再根据公式来得到xt1x_{t-1}的分布,如此循环直到我们计算出x0x_0,其流程如下所示: