DDPM
上文我们介绍了扩散模型的核心思想,而DDPM作为首个将扩散模型具体实现的模型,自2020年论文发表以来就受到广泛应用,本文将对DDPM的原理和实现做具体说明。
前向加噪
模型训练时需要输入给定原始图像加噪后的数据,设原数据为
我们假设随机噪声符合正态分布,即
由此可以得到加噪迭代公式:
迭代后推导出的加噪公式,即第t步加噪后的数据可表示为:
写成加噪分布的形式为:
反向去噪
Diffusion Model并不是直接由
反向过程则是从纯噪声
该公式表示给定
单步加噪分布,
, 是单步噪声方差: 从
到 的累计加噪分布, 从
到 的累计加噪分布,
随后推导出已知第t步时第t-1步的数据分布
方差:
这里的均值使用了参数
将其代入反向分布的均值
这里
损失函数
模型训练流程
DDPM的单步训练示意图如下:
图中,我们先把预测网路部分抽形为一个黑盒模型,它接收时间步
预测网络
接下来我们讨论Diffusion Model预测噪声功能的核心部分,根据上述讨论,我们可以理解,扩散模型实际上还是一种神经网络,只不过该神经网络的输入数据经过处理,接收含噪数据和时间步,输出的预测数据也经过了处理得到去噪后数据,那么接下来我们深入研究核心模块——Unet网络。
对于它的具体框架我们在前文已做讨论,在此不做展开。
时间步嵌入
根据扩散模型的原理我们知道,在预测网络训练时需要输入当前的时间T,所谓时间步嵌入就是将标量T通过给定的数学公式转换为一个时间向量,再通过线性变换与图像数据输入融合。
时序向量生成
通常,我们会选择基于正弦和余弦函数的位置编码来做时间步嵌入,其具体公式如下:
公式
示例
我们想计算一个十一维嵌入向量第
对于一个维度是11的嵌入向量,我们可以计算出
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个元素的分布,观察
向量嵌入
在得到UNet
网络。