Skip to content

DDPM

上文我们介绍了扩散模型的核心思想,而DDPM作为首个将扩散模型具体实现的模型,自2020年论文发表以来就受到广泛应用,本文将对DDPM的原理和实现做具体说明。

前向加噪

模型训练时需要输入给定原始图像加噪后的数据,设原数据为x0,第t步加噪后的数据为xt,最终加噪完成的数据xT应为纯噪声数据。

我们假设随机噪声符合正态分布,即εt=N(0,1),加噪过程可以描述为均值为1βtxt1,方差为βtI的正态分布,I 代表单位矩阵:

q(xt|xt1)=N(xt;1βtxt1,βtI)

由此可以得到加噪迭代公式:

xt=αtxt1+βtεt;αt=1βt

迭代后推导出的加噪公式,即第t步加噪后的数据可表示为:

xt=α¯tx0+1α¯tε,α¯t=Tαt

写成加噪分布的形式为:

q(xt|x0)=N(xt;α¯tx0,(1α¯t)I)

反向去噪

Diffusion Model并不是直接由xt预测xt1,而是预测加在xt上的“噪声”,通过去噪得到xt1,这样做是兼顾 “训练效率、模型稳定性、生成多样性” 的最优选择。

反向过程则是从纯噪声xT 到真实数据 x0,这里反向分布公式可由贝叶斯定理推出:

q(xt1|xt)=q(xt|xt1)q(xt1|x0)q(xt|x0)

该公式表示给定xt去求xt1,分子分母的三个分布在前向加噪中都已得到,分式的三个分布都是高斯分布,则q(xt1|xt)也必然是高斯分布。

  • 单步加噪分布,αt=1βtβt是单步噪声方差:

    q(xt|xt1)N(αtxt1,(1αt)I)
  • x0xt1的累计加噪分布,α¯t1=i=1t1αi

    q(xt1|x0)N(α¯t1x0,(1α¯t1)I)
  • x0xt的累计加噪分布,α¯t=i=1tαi

    q(xt|x0)N(α¯tx0,(1α¯t)I)

随后推导出已知第t步时第t-1步的数据分布q(xt1|xt)的均值和方差,用角标表示条件分布。 均值:

μt1|t=αt(1α¯t1)1α¯txt+α¯t1(1αt)1α¯tx0

方差:

σt1|t=1α¯t11α¯t(1αt)I

这里的均值使用了参数x0,但在预测中我们并不预先知道,不然就不用预测了,所以我们要用xt来预测x0,由前向扩散公式反解出x0,这里εt是第t步的真实噪声:

x0=1α¯t(xt1α¯tεt)

将其代入反向分布的均值μt1|t中,用预测噪声εθ近似真实噪声εt,得到反向去噪公式:

xt1=1αt(xtβt1α¯tεθ(xt,t))+σtz

这里σt=1α¯t11α¯t(1αt)是噪声强度系数,zN(0,1)是随机噪声。 因此,利用该公式,针对模型每轮预测的噪声εθ,都可以得到下一步的数据xt1

损失函数

模型训练流程

DDPM的单步训练示意图如下:

图中,我们先把预测网路部分抽形为一个黑盒模型,它接收时间步t和含噪数据xt,预测出加在数据中的噪声ε,再通过反向过程去除噪声得到下一步的数据xt1

预测网络

接下来我们讨论Diffusion Model预测噪声功能的核心部分,根据上述讨论,我们可以理解,扩散模型实际上还是一种神经网络,只不过该神经网络的输入数据经过处理,接收含噪数据和时间步,输出的预测数据也经过了处理得到去噪后数据,那么接下来我们深入研究核心模块——Unet网络。

对于它的具体框架我们在前文已做讨论,在此不做展开。

时间步嵌入

根据扩散模型的原理我们知道,在预测网络训练时需要输入当前的时间T,所谓时间步嵌入就是将标量T通过给定的数学公式转换为一个时间向量,再通过线性变换与图像数据输入融合。

时序向量生成

通常,我们会选择基于正弦和余弦函数的位置编码来做时间步嵌入,其具体公式如下:

PE(t,2i)=sin(t10000k)PE(t,2i+1)=cos(t10000k)k=2idmodel

公式PE(t,x)表示时间步 t 对应的嵌入向量的第x个元素,x的取值范围是[0,dmodel1]。对于向量的偶数位元素使用sin计算,奇数位使用cos计算。

示例

我们想计算一个十一维嵌入向量第t=4时刻第5个元素的值,因为5是奇数,所以使用cos公式计算,且i=(51)2=2,代入:

k=2×211=411PE(4,5)=cos(410000(4/11))0.99015

对于一个维度是11的嵌入向量,我们可以计算出t0t9每个时间步对应的向量:

t_0:[0,	1,	0,	1,	0,	1,	0,	1,	0,	1,	0]
t_1:[0.841470985,	0.540302306,	0.18628711,	0.98249535,	0.035104703,	0.99938364,	0.006579285,	0.999978356,	0.001232846,	0.99999924,	0.000231013]
t_2:[0.909297427,	-0.416146837,	0.366052439,	0.930594225,	0.070166132,	0.99753532,	0.013158285,	0.999913426,	0.002465691,	0.99999696,	0.000462026]
t_3:[0.141120008,	-0.989992497,	0.533002529,	0.846113647,	0.105141066,	0.994457317,	0.019736715,	0.999805212,	0.003698532,	0.99999316,	0.000693039]
t_4:[-0.756802495,	-0.653643621,	0.681292572,	0.732011223,	0.13998639,	0.990153428,	0.026314291,	0.999653719,	0.004931367,	0.999987841,	0.000924052]
t_5:[-0.958924275,	0.283662185,	0.80573104,	0.592281598,	0.17465915,	0.984628956,	0.032890728,	0.999458954,	0.006164195,	0.999981001,	0.001155065]
t_6:[-0.279415498,	0.960170287,	0.901961427,	0.431816609,	0.209116605,	0.977890713,	0.039465741,	0.999220924,	0.007397013,	0.999972642,	0.001386077]
t_7:[0.656986599,	0.753902254,	0.966614776,	0.256234022,	0.243316277,	0.969947003,	0.046039046,	0.998939641,	0.00862982,	0.999962762,	0.00161709]
t_8:[0.989358247,	-0.145500034,	0.997427618,	0.071680862,	0.277216008,	0.960807621,	0.052610358,	0.998615116,	0.009862614,	0.999951363,	0.001848103]
t_9:[0.412118485,	-0.911130262,	0.993321218,	-0.115381796,	0.310774009,	0.950483832,	0.059179393,	0.998247364,	0.011095393,	0.999938444,	0.002079115]

通过绘图查看0~50时间步下嵌入向量前7个元素的分布,观察ti两个变量对数值的影响。

向量嵌入

在得到ti时刻的n维嵌入向量后,往往需要将其与图像数据嵌入,在扩散模型中,主要通过特征融合的方式注入到 UNet 网络。