整体概述
首先简单地概括一下扩散模型的思路。
正向过程
正向过程是一个逐步加噪声的过程,直到完全变成噪声。
逆向过程
逆向过程是利用模型预测噪声并逐步去噪的过程,直到噪声生成为图片。
逆向过程可以理解为上图反过来。
以上就是整体概述,下面看细节,设计许多数学推理。
浅显理解
对于训练模型来讲:正向过程看作生成gt的过程,逆向看作训练过程。最原始的扩散模型整个过程看作一种自监督的方法。
正向过程
其中:
-
就代表了第t步的加噪版本的图像
-
同理
-
是通过计算出来的,也就是说它随时间步逐渐减小,所以时间步越靠后,包含原图信息越少(故扩散,类比溶质扩散)
-
z是一个噪声,服从正态分布N(0,1)
在前向传播的过程中,我们需要记录每一步的噪声,这样如果一步一步计算,再存储会耗时,全部存起来也耗显存。好处是,噪声z都是正态分布的,我们可以合并,由此我们可以得出到的公式,推导如下:
tip:将上边公式中的x_{t-1}替换为第t-2步,指导第0步。
【暂停】推导在这个位置我们暂停一下,上面的推到结果一共三项,第二项和第三项是两个相加的正态分布。
补充知识:正态分布+正态分布还是正态分布,计算其方差和均值就好了
如果两个相互独立的正态分布X~N(u1,m),Y~N(u2,n),那么Z=X±Y仍然服从正太分布,Z~N(u1±u2,m+n)。
那么了解这个,我们就可以把第二项和第三项的正态度分布写出来:
第二项:
第三项:
那么这两项相加得到新的正态分布:
于是:
z 是正态分布
【继续】继续推上面的式子,再进一步把x_{t-2}拆开,一直拆到x_0
我们把记作
于是我们得到了x_t到x_0的计算公式。
反向过程
反向过程故名思义,我们需要从x_t一步步推导到x_0,我们先构建x_{t-1}和x _{t}。
把上面公式反过来:
我们可以依靠这个来将x_t反推x_{t-1},但是可以看到这里有个问题,其他的变量均为已知,唯一不知道的是z_t。
那么模型就来了,我们利用模型来拟合预测这个z_t。
最终使用的模型是Unet,因为噪声是正态分布的图片大小的噪声,所以可以使用unet。
loss函数使用一个mse损失,我们在训练的每一步都通过x_0直接计算x_t,这个过程我们可以直接保存z作为gtoundtruth,然后我们预测z_t,与z作损失。
目的就是为了限制预测的噪声更接近前向过程中加的噪声。
最后,需要解释一下我们输入模型里面什么,将模型表示为m,事实上:
t代表了当前是哪一个时间步。
在训练完以后,我们就可以通过一个随机的高斯分布,生成一个从未见过的图像了。
关于原文
原文使用概率论来解释推导过程,通过贝叶斯公式来推到逆向过程。
【未完待续】
代码解析
【未完待续】