Diffusion 扩散模型DDPM【俺的学习笔记】

整体概述

首先简单地概括一下扩散模型的思路。

正向过程

正向过程是一个逐步加噪声的过程,直到完全变成噪声。

逆向过程

逆向过程是利用模型预测噪声并逐步去噪的过程,直到噪声生成为图片。

逆向过程可以理解为上图反过来。

以上就是整体概述,下面看细节,设计许多数学推理。

浅显理解

对于训练模型来讲:正向过程看作生成gt的过程,逆向看作训练过程。最原始的扩散模型整个过程看作一种自监督的方法。

正向过程

其中:

  • x_t就代表了第t步的加噪版本的图像

  • x_{t-1}同理

  • \alpha_t是通过1-\beta计算出来的,也就是说它随时间步逐渐减小,所以时间步越靠后,包含原图信息越少(故扩散,类比溶质扩散)

  • z是一个噪声,服从正态分布N(0,1)

在前向传播的过程中,我们需要记录每一步的噪声,这样如果一步一步计算,再存储会耗时,全部存起来也耗显存。好处是,噪声z都是正态分布的,我们可以合并,由此我们可以得出x_0x_t的公式,推导如下:

tip:将上边公式中的x_{t-1}替换为第t-2步,指导第0步。

x_t = \sqrt {\alpha_t} x_{t-1} + \sqrt{1-\alpha_t}z_t \\ = \sqrt {\alpha_t} (\sqrt {\alpha_{t-1}} x_{t-2} + \sqrt{1-\alpha_{t-1}}z_{t-1}) + \sqrt{1-\alpha_t}z_t \\ = \sqrt {\alpha_t} \sqrt {\alpha_{t-1}} x_{t-2} + \sqrt {\alpha_t} \sqrt{1-\alpha_{t-1}}z_{t-1} +\sqrt{1-\alpha_t}z_t \\

【暂停】推导在这个位置我们暂停一下,上面的推到结果一共三项,第二项和第三项是两个相加的正态分布。

补充知识:正态分布+正态分布还是正态分布,计算其方差和均值就好了

如果两个相互独立的正态分布X~N(u1,m),Y~N(u2,n),那么Z=X±Y仍然服从正太分布,Z~N(u1±u2,m+n)。

那么了解这个,我们就可以把第二项和第三项的正态度分布写出来:

 第二项:N(0,\alpha_t (1-\alpha_{t-1}))
第三项:N(0,(1-\alpha_t)
那么这两项相加得到新的正态分布:N(0,\alpha_t (1-\alpha_{t-1}) + (1-\alpha_t)) = N(0,1-a_ta_{t-1})
于是:\sqrt {\alpha_t} \sqrt{1-\alpha_{t-1}}z_{t-1} +\sqrt{1-\alpha_t}z_t = \sqrt{1-a_ta_{t-1}}z
z 是正态分布 N(0,1)

【继续】继续推上面的式子,再进一步把x_{t-2}拆开,一直拆到x_0

= \sqrt {\alpha_t} \sqrt {\alpha_{t-1}} x_{t-2} + \sqrt {\alpha_t} \sqrt{1-\alpha_{t-1}}z_{t-1} +\sqrt{1-\alpha_t}z_t \\ =\sqrt {\alpha_t\alpha_{t-1}} x_{t-2} + \sqrt{1-a_ta_{t-1}}z\\ =\sqrt {\alpha_t\alpha_{t-1}}(\sqrt {\alpha_{t-2}} x_{t-3} + \sqrt{1-\alpha_{t-2}}z_{t-2}) + \sqrt{1-a_ta_{t-1}}z\\ =............\\ =\sqrt {\alpha_t\alpha_{t-1}\cdots\alpha_{0}}x_0 + \sqrt {1 - \alpha_t\alpha_{t-1}\cdots\alpha_{0}}z\\

=\sqrt {\hat{\alpha_t}}x_0 + \sqrt {1 - \hat{\alpha_t}}z\\

我们把\alpha_t\alpha_{t-1}\cdots\alpha_{0}记作\hat{\alpha_t}

于是我们得到了x_t到x_0的计算公式。

反向过程

反向过程故名思义,我们需要从x_t一步步推导到x_0,我们先构建x_{t-1}和x _{t}。

x_t = \sqrt {\alpha_t} x_{t-1} + \sqrt{1-\alpha_t}z_t\\

把上面公式反过来:

x_{t-1} = \frac{1}{\sqrt {\alpha_t}}x_t-\frac{\sqrt{1-\alpha_t}z_t}{\sqrt {\alpha_t}}\\ =\frac{1}{\sqrt {\alpha_t}}x_t-\frac{\beta_t}{\sqrt {\alpha_t(1-\alpha_t)}}z_t

我们可以依靠这个来将x_t反推x_{t-1},但是可以看到这里有个问题,其他的变量均为已知,唯一不知道的是z_t。

那么模型就来了,我们利用模型来拟合预测这个z_t。

最终使用的模型是Unet,因为噪声是正态分布的图片大小的噪声,所以可以使用unet。

loss函数使用一个mse损失,我们在训练的每一步都通过x_0直接计算x_t,这个过程我们可以直接保存z作为gtoundtruth,然后我们预测z_t,与z作损失。

Loss = ||z-z_t||^2

目的就是为了限制预测的噪声更接近前向过程中加的噪声。

最后,需要解释一下我们输入模型里面什么,将模型表示为m,事实上:

m(x_t,t) = z_t

t代表了当前是哪一个时间步。

在训练完以后,我们就可以通过一个随机的高斯分布,生成一个从未见过的图像了。

关于原文

原文使用概率论来解释推导过程,通过贝叶斯公式来推到逆向过程。

【未完待续】

代码解析

【未完待续】

猜你喜欢

转载自blog.csdn.net/qq_42533666/article/details/132258129
今日推荐