数学原理

整个diffusion model可以分为两部分,一个是前向扩散过程,另一个是逆扩散过程,通俗理解为:前向扩散过程不停的往图片上加服从高斯分布的噪声,加到使图片变得“面目全非”
在扩散过程中,每次往图片上加的噪声就是逆过程的标签

前向扩散过程 forward diffusion

大致的扩散模型如下
forward
扩散过程简单来说就是不停的往图片里加噪声,把图片加的面目全非。那怎么加,加多少呢?
假设原始数据为 x0x_0,噪声为 zz(在有些资料中写作 ϵt\epsilon_t) , 那么我们可以用下面的公式来表示扩散过程

xt=1βtxt1+βtztx_t = \sqrt{1-\beta_t}x_{t-1} + \beta_t z_t

其中 ztN(0,I)z_t \sim \mathcal N(0, I) 是一个纯01高斯分布的噪声
我们可以定义每一步的转移概率 q(xtxt1)q(x_t | x_{t-1}) 为从上一时刻的数据点 xt1x_{t-1} 生成当前时刻的数据点 xtx_t 的概率分布

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

其中,βt\beta_t 是第 tt 步的噪声参数。通过这样的过程,xtx_t 将逐渐接近标准正态分布 N(0,I)\mathcal{N}(0, I), II 是单位矩阵,表示噪声的协方差矩阵为 βtI\beta_t I

理解转移概率 q

这个定义意味着在每一步中,我们以一定的比例 1βt\sqrt{1 - \beta_t} 保留上一时刻的数据,同时添加服从 N(0,βtI)\mathcal{N}(0, \beta_t I) 的噪声。这种逐步添加噪声的方式使得数据点 xtx_ttt 增加时逐渐变得模糊,最终趋近于标准正态分布 N(0,I)\mathcal{N}(0, I)

噪声调度 β\beta

在扩散过程中,我们需要一个噪声调度 β\beta 来控制噪声的大小。在实际应用中,我们可以通过调整 β\beta 来控制模型的平滑程度。通常情况下,我们会在开始时使用较小的 β\beta 值,逐渐增大 β\beta 值,以逐渐增加噪声的强度。

常用参数选择

在实际应用中,选择合适的βmin\beta_{\text{min}}βmax\beta_{\text{max}}值是关键。通常,选择需要通过实验和调优来确定。例如,以下是一些常见的选择:
βmin\beta_{\text{min}}​:通常取一个非常小的值,如 10410^{-4}10510^{-5}
βmax\beta_{\text{max}}​:通常取一个较大的值,如 0.02 或 0.1。

其他常见参数 α\alpha

我们一般说 β\beta 是噪声强度的参数,那么 α=1β\alpha = 1- \beta 就表示 保留原始数据的比例,这时候我们讨论的是相邻的关系,但是很多时候我们需要使用初始值作为参数,我们就会用到 α=(1β)\overline \alpha = \prod (1-\beta) 这样获得的就是从初始值开始的累计衰减量
那么新公式就是:

xt=αtx0+1αtϵx_t = \sqrt{\overline \alpha_t}x_0 + \sqrt{1 - \overline \alpha_t}\epsilon

而对于递归的扩散算法写法,我们应该写作:

xt=αtxt1+1αtϵx_t = \sqrt{\alpha_{t}}x_{t-1} + \sqrt{1 -\alpha_{t}}\epsilon

其中 ϵ\epsilon 表示服从标准正态分布的噪声,这个公式说明,正向传播的每一次加噪就是当前层的图像和高斯噪声的线性组合

逆向扩散过程 Denoise

逆向扩散过程是前向扩散过程的逆过程,即从扩散后的数据点 xTx_T 逐渐恢复到原始数据点 x0x_0
由于正向的传播是随机过程,所以我们在做逆向传播的时候很难直接找到逆映射 q(xt1xt)q(x_{t-1} | x_t) 所以我们更优的做法是用神经网络的方法来进行拟合。
逆向扩散过程的目标是学习一个逆映射 fTf_T,将扩散后的数据点 xTx_T 映射回原始数据点 x0x_0

pθ(xt1xt)=N(xt1;μθ(xt,t),σθ(xt,t))p_\theta(x_{t−1}​∣x_t​)=\mathcal N(x_{t−1}​;\mu_\theta​(x_t​,t),\sigma_\theta​(x_t​,t))

reverse_difussion_process

初始噪声采样

xTN(0,I)x_T \sim \mathcal N(0,I)
表示一开始是纯噪声进行采样

逐步去噪

t=Tt=T开始,到 t=1t = 1 结束,逐步生成中间状态 xt1x_{t-1}:

xt1N(xt1;μθ(xt,t),σθ(xt,t))x_{t−1}​\sim \mathcal N(x_{t-1}; \mu_\theta (x_t,t), \sigma_\theta(x_t , t))

其中,μθ(xt,t)\mu_\theta(x_t, t)σθ(xt,t)\sigma_\theta(x_t, t) 分别是逆映射的均值和方差。这些参数是通过学习得到的,通常使用神经网络来拟合。

μθ(xt,t)=11βt(xtβt1βtϵθ(xt,t))\mu_\theta(x_t, t) = \frac{1}{\sqrt{1 - \beta_t}} (x_t - \frac{\beta_t}{\sqrt{1 - \overline \beta_t}} \epsilon_\theta(x_t,t))

σθ(xt,t)=βt\sigma_\theta(x_t, t) = \sqrt{\beta_t}

其中 βt=i=1t(1βi)\overline \beta_t = \prod_{i=1}^t (1 - \beta_i)ϵθ(xt,t)\epsilon_\theta(x_t, t) 是一个神经网络预测的噪声成分

最大似然估计 maixmum linklihood estimation

我们需要用神经网络来拟合我们需要的分布,而最大似然估计就是能通过样本结果估计模型参数的一种方法,我们的目标是最大化似然函数

argmaxθt=1Tpθ(xt1xt)\arg\max_\theta \prod_{t=1}^T p_\theta(x_{t-1}|x_t)

由于这个累乘的值非常难以计算,所以我们可以将累乘运算变成 log 的累加运算
于是我们有 minlogpθ(x0)\min -\log p_\theta(x_0)
这里我们会用到一点变分推理的变分下界公式 ELBO, 暂时不解释
但是在化简之后我们会得到一项

Eq(x1:Tx0)[DKL(q(xTx0)pθ(xT)]+t=2TDKL(q(xt1xt,x0)pθ(xt1xt))logpθ(x0x1)\mathbb E_{q(x_{1:T} | x_0)}[D_{KL}(q(x_T | x_0)||p_\theta(x_T)] + \sum_{t=2}^T D_{KL}(q(x_{t-1} | x_t,x_0)||p_\theta (x_{t-1} | x_t)) - \log p_\theta(x_0 | x_1)

在实际应用中我们会发现第二项是影响结果的重中之重,所以我们要仔细研究其变化率
这里的KL散度表示的是在概率分布空间中 qqpp 之间的距离,我们一个个来进行分析,首先就是 qq 函数, 即正向传播噪声概率计算公式的分布, 这里就要用到贝叶斯公式(注意这里的 pp 是估计的 distribution)

贝叶斯公式变换

在从噪声生成初始图像的过程中,由于直接生成不具有方向性,所以我们需要引入一下初始图象作为参考条件,这样模型生成就会更加方向性,那么我们的反向传播函数就变成了 q(xt1xt,x0)q(x_{t-1}|x_t, x_0), 这样之后,我们的目标应该是变成 q(xtxt1)q(x_{t}|x_{t-1}) 的形式,这就是正向传播的有方向性的生成,概率比较好算:

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

这样我们就有

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

  • q(xtxt1)q(x_t|x_{t-1}) 是前向传播的生成概率
  • q(xt1x0)q(x_{t-1}|x_0) 一步跳跃式加噪声,符合 N(xt;αt1x0,1αˉt1)\mathcal N(x_t;\sqrt{\overline \alpha_{t-1}}x_0,1-\bar\alpha_{t-1})
  • q(xtx0)q(x_t|x_0) 一步加噪符合 N(xt;αtx0,1αˉt)\mathcal N(x_t;\sqrt{\overline \alpha_{t}}x_0,1-\bar\alpha_{t})
    以上三者都是确定的高斯分布,所以我们可以直接计算

q(xt1xt,x0)=N(xt1;αt(1αˉt1)xt+αt1(1αt)x01αˉt,(1αt)(1αˉt1)1αˉt)Iq(x_{t-1}|x_t,x_0) = \mathcal N(x_{t-1};\frac{\sqrt{\alpha_t}(1-\bar\alpha_{t-1})x_t + \sqrt{\overline\alpha_{t-1}}(1-\alpha_t)x_0}{1-\bar\alpha_t},\frac{(1-\alpha_t)(1-\bar\alpha_{t-1})}{1-\bar\alpha_t})I

为了简介起见,我们定义:
均值: $$\mu_q(x_t,t) = \frac{\sqrt{\alpha_t}(1-\bar\alpha_{t-1})x_t + \sqrt{\overline\alpha_{t-1}}(1-\alpha_t)x_0}{1-\bar\alpha_t}$$
方差:

Σq(t)=(1αt)(1αˉt1)1αˉt\Sigma_q(t) = \frac{(1-\alpha_t)(1-\bar\alpha_{t-1})}{1-\bar\alpha_t}

之后我们会发现对于 Σq(t)\Sigma_q(t) 是一个固定的递推项计算结果,是一个常数,我们可以很容易求解
那么回到原来的 KL 散度,我们有公式

argminθDKL(q(xt1xt,x0)pθ(xt1xt))=argminθ12Σq2(t)μθμq22\arg\min_\theta D_{KL}(q(x_{t-1}|x_t,x_0)||p_\theta(x_{t-1}|x_t)) = \arg\min_\theta \frac{1}{2\Sigma_q^2(t)}||\mu_\theta - \mu_q||_2^2

那么我们就要计算其中 μθμq||\mu_\theta - \mu_q|| 的值 也就是均值差
回看 μ\mu 的表达式,有两个输入变量 xtx_tx0x_0, 但是我们并不是在每一层都能看到 x0x_0 的值,我们还是要使用公式进行替换

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

那么 x0=xt1αˉtϵtαˉtx_0 = \frac{x_t - \sqrt{1 - \bar\alpha_t}\epsilon_t}{\sqrt{\bar\alpha_t}} , μq=1αt(xt1αt1αˉtϵt)\mu_q = \frac{1}{\sqrt{\alpha_t}}(x_t - \frac{1 - \alpha_t}{\sqrt{1 - \bar\alpha_t}}\epsilon_t)
这里噪声 ϵt\epsilon_t 表示的是从 x0x_0xtx_t 的噪声预测,是通过神经网络学习的内容
我们训练的目标是最小化 的 θ\theta
由于两个分布的 均值是一样的,区别是在 ϵt\epsilon_t 上,所以说,我们通过带入 xtx_t 的展开获得了

argminθ12σq2(t)(1αt)2(1αt)αt[ϵtϵ^θ(xt,t)22]\arg\min_\theta \frac{1}{2\sigma_q^2(t)}\frac{(1-\alpha_t)^2}{(1-\overline \alpha_t)\alpha_t}[||\epsilon_t - \hat\epsilon_{\theta}(x_t,t)||_2^2]

采样过程 sampling

在每一步的运算过程中,我们需要对 xt1x_{t-1} 的输入进行采样

xt1=1αt(xt1αt1αtϵθ(xt,t))+σtzx_{t-1} = \frac{1}{\sqrt{\alpha_t}}(x_t - \frac{1 - \alpha_t}{\sqrt{1 - \overline \alpha_t}}\epsilon_\theta(x_t,t)) + \sigma_t z