DDPM
上文我们介绍了扩散模型的核心思想,而DDPM作为首个将扩散模型具体实现的模型,自2020年论文发表以来就受到广泛应用,本文将对DDPM的原理和实现做具体说明。
公式介绍
首先我们对扩散模型加噪和去噪的噪声计算公式介绍,以便后续工作的展开。需要注意的是,本节内容更注重与模型的实现和架构逻辑,更详细的公式推导可参考本站后续附加文章。
前向加噪
模型训练时需要输入给定原始图像加噪后的数据,设原数据为
我们假设随机噪声符合正态分布,即
由此可以得到加噪迭代公式:
迭代后推导出的加噪公式,即第t步加噪后的数据可表示为:
写成加噪分布的形式为:
反向去噪
Diffusion Model并不是直接由
反向过程则是从纯噪声
该公式表示给定
- 单步加噪分布,
, 是单步噪声方差:
- 从
到 的累计加噪分布, :
- 从
到 的累计加噪分布, :
将三式代入公式
均值:
方差:
这里的均值使用了参数
将其代入反向分布的均值
这里
因此,利用该公式
损失函数
DDPM 的损失函数是在所有时间步上对预测噪声与真实噪声的均方误差进行加权求和,公式如下:
该公式是由变分推断一步步化简得到,具体的公式推导在此不做展开,同样可参考本站后续文章。
模型运行流程
训练
DDPM的单步训练示意图如下:
在每轮训练时,它随机选取时间步
推理
扩散模型的推理过程则是从正态分布中随机采样得到纯噪声
噪声预测网络
接下来我们讨论Diffusion Model预测噪声功能的核心部分,根据上述讨论,我们可以理解,扩散模型实际上还是一种神经网络,只不过该神经网络的输入数据经过处理,接收含噪数据和时间步,输出的预测数据也经过了处理得到去噪后数据,最常用的噪声预测网络是——Unet网络。
对于它的具体框架我们在前文已做讨论,在此不做展开,只对其如何预测噪声进行说明,整个预测网络的计算流程如下示意图:
时间步嵌入
根据扩散模型的原理我们知道,在预测网络训练时需要输入当前的时间
时序向量生成
我们首先定义一个计算公式将标量
公式
示例
我们想计算一个十一维嵌入向量第
对于一个维度是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 网络。
实例归一化
对于输入的特征图 x ,假设其形状为
其中
生成缩放和偏移因子
将时间步嵌入向量输入到一个多层感知机(MLP)中,经过变换输出与特征图通道数
自适应调整
使用生成的缩放因子
上述利用自适应归一化方法进行时间步嵌入的示意图如下:
本示例中时间向量维度为Unet的下一节点。
其他嵌入方法
除了常用的自适应归一化方法外,以下方法也可进行时间步嵌入:
简单相加
将嵌入向量通过线性层投影到与特征图相同的通道维度后,直接与特征图进行逐元素相加,将嵌入向量携带的信息叠加到网络特征上。
对时间步嵌入向量进行线性变换,使其维度与待融合的特征图通道数相同。例如,若特征图通道数为
优势:实现简单,计算量相对较小,能快速将嵌入向量的信息融入到网络特征中,在一些简单场景或对计算资源要求较高的情况下较为适用。
拼接
在通道维度上直接将嵌入向量与特征图拼接在一起,然后通过后续的卷积层等操作,让模型学习到嵌入向量和网络特征的联合表示。
同样先将嵌入向量通过线性层投影到合适的通道数,使其与特征图在通道维度上可以进行拼接操作。沿通道维度将投影后的嵌入向量与特征图拼接起来,得到新的特征表示
优势:保留了嵌入向量和网络特征的原始信息,为模型提供了更丰富的输入,有助于模型学习到两者之间更复杂的关系,在一些对特征信息完整性要求较高的任务中表现较好 ,但会增加特征图的通道数,从而增加后续卷积层的计算量。
超参数
根据上文推导我们总结出两个重要公式,他们是整个模型的核心,同时还要定义网络结构、训练轮次、时间步长等超参数,以下做详细说明:
噪声调度参数
前向加噪,直接计算第
反向去噪,根据模型预测的噪声得到下一时间步的数据:
噪声强度:
随机噪声:
在两个公式中涉及的系数
具体的超参数
线性调度
利用公式:
余弦调度
这种序列在加噪初期
网络结构
| 超参数 | 说明 |
|---|---|
| 模型类型 | 常用Unet网络来预测。 |
| 特征通道数 | 控制网络容量,通道数越多,模型表达能力越强,但计算和内存消耗也越大。 |
| 注意力机制 | 在分辨率较低的层加入注意力机制,能有效捕捉长距离依赖。 |
| 时间步嵌入方法 | 常用正弦/余弦嵌入。 |
训练参数
| 超参数 | 可选 | 说明 |
|---|---|---|
| 批量大小 | 16, 32, 64 | 影响训练速度和模型收敛。受限于 GPU 内存,通常越大越好,但需在内存允许范围内。 |
| 学习率 | 2e-4 | 控制参数更新的步长。DDPM 对学习率较为敏感,2e-4 是一个经过验证的良好起点。 |
| 优化器 | Adam/ AdamW | AdamW是 Adam 的改进版,加入了权重衰减,能有效防止过拟合。 |
| 权重衰减 | 1e-4 | 正则化项,防止权重过大,提升模型泛化能力。 |
| 训练轮数 | 50-200 | 训练的总迭代次数。需要根据数据集大小和模型收敛情况来决定。 |