Diffusion 扩散模型
- 对比 GAN 和 VAE
- 扩散原理
- 扩散过程:加噪声,均匀分布到整个空间
- 重参数:避免梯度消失、爆炸
- 复原过程:去噪声,恢复原始图像
- 损失函数:交叉熵损失,变分推断
- 训练流程
对比 GAN 和 VAE
原先,图像生成领域最常见生成模型有 GAN 和 VAE。
后来,Diffusion 扩散模型也是生成模型,且在图像生成上,优于 GAN 和 VAE。
VAE 的一个主要缺点是生成的样本常常会模糊、失真,这是因为它在生成样本时可能存在一些不完美的地方。
GAN 因为需要同时训练生成器和判别器,并且很难找到一个平衡点。生成器有时候会通过一些“捷径”欺骗判别器,导致生成的效果不佳。此外,GAN生成的样本多样性有限,只适用于特定的判别器。
作者提出了一种改进的方法,即扩散模型(Diffusion Model)。
扩散模型在生成样本时采用了一种不同的方式,它通过在生成过程中逐渐扩散噪声来生成样本。
这种方法使得生成的样本更加清晰、真实,并且能够保持更好的多样性。
扩散模型的训练过程也更加稳定,不需要像GAN那样同时训练生成器和判别器。
相反,扩散模型只需要在生成过程中进行逐步的扩散操作,使生成的样本逐渐接近真实分布。
这种训练方式可以避免生成器通过“捷径”欺骗判别器的问题,提高了生成效果。
通过逐步扩散噪声的方式生成样本,提高了生成样本的质量和多样性,并且具有更稳定的训练过程。
扩散原理
扩散模型的目的是什么?
- 学习从纯噪声生成图片的方法。
扩散模型是怎么做的?
- 训练一个 U-Net,接受一系列加了噪声的图片,学习预测所加的噪声。
- 分为两个部分:前向过程(扩散过程)和反向过程(复原过程)。
前向过程在干啥?
- 对于训练集中的每张图片,扩散模型可以生成一系列噪声程度不同的加噪图片。
- 在训练时,这些不同程度的噪声图片以及生成它们所用的噪声被视为实际的训练样本,用于优化扩散模型的参数。
- 前向过程如下图,墨水滴入一杯水中,最终会 均匀的分布 至整个水杯里,将噪声均匀分布到整个空间,变成纯噪声。
- 如果有 2 个物质混合在一起,分别是高密度的和低密度的,那么高密度的物质就会扩散到低密度,比如喷了香水,随着时间的扩散,最后香水就会充斥着整个房间,最后趋向于平衡。
反向过程在干啥?
- 当扩散模型训练好之后,我们可以使用该模型来进行采样和生成图片。
- 通过输入一段随机噪声,扩散模型可以生成对应的图像,这些生成的图像可以具有高质量和逼真度。
扩散模型的创新点是什么?
- 先假设扩散、复原过程都符合高斯分布,沿着时间轴,均值和方差的迭代公式。
- 之所以假设成高斯分布是正确的,因为ta可以作为一种近似描述扩散过程的分布,并且符合中心极限定理和大数定律的性质。
- 之所以假设成高斯分布而不是其他分布,是因为ta是简单的分布,运算量小,使得扩散速度运算速度快。
扩散过程:加噪声,均匀分布到整个空间
前向过程:实现均匀的分布,直到稳定状态
假设真实图像 的分布是 。
前向传播过程,是把真实图像的分布,经过
扩散过程公式:
- :每一步向图片添加噪声的过程,现在 与过去有关(上一个状态 ),和过去的过去无关。每一个噪声都是在前一时刻增加噪声而来的。
- :控制每个时间步的状态转移的速度,是一个递减的序列,随着时间的推移,扩散过程的速度逐渐减慢。通过调整的值,我们可以控制生成样本的清晰度和细节。
重参数:避免梯度消失、爆炸
上述公式是一步步迭代过来的,求 需要用 到 ,链条太长了。
这很容易导致梯度爆炸、消失。
而且有一个致命的缺陷,就是生成模型很慢。
因为每一次恢复都只能一步一步的向前恢复,而不像GAN,GAN只要训练好了这个模型,只要给他一个噪声,他就能恢复出图像,做一次的模型 forward 就够了。
可引入重参数化技巧解决这俩个问题。
重参数化:把随机变量变成,确定性的函数和独立性噪声项的和。
将 的分布转化为 和 的分布,变成线性组合:。
- μ 是一个确定性的项,是高斯分布的均值
- ε 是一个独立且随机的噪声项
这样一来,我们可以通过估计 μ 和 ε 的分布参数来间接地推断出
令 ,:
- …
因为每一步添加的噪声都独立,且服从正态分布,可得出:
- 扩散公式:
复原过程:去噪声,恢复原始图像
复原过程:
复原公式:
已知 推导 的过程中,需要得到在 时刻的噪声 ,但这些目前都不知道。
如果给定了某个训练集输入 ,多了一个限定条件后,该分布是可以用贝叶斯公式计算的。
而训练的时候已知真实图像 ,可先求一个后验扩散条件概率,把反向过程全部变回前向过程:
损失函数:交叉熵损失,变分推断
只要定义好损失函数,就能学习这些均值、方差的参数了。
因为 是一个常数,和输入没有关系,训练去噪网络只需要拟合 个均值
训练神经网络只差最后的问题了:该怎么设置训练的损失函数?
加噪声和去噪声操作都是正态分布,网络的训练目标应该是让每对正态分布更加接近。
那怎么用损失函数描述两个分布尽可能接近呢?
最直观的想法,肯定是让两个正态分布的均值尽可能接近,方差尽可能接近。
因为方差是常量,只用让均值尽可能接近就可以了。
损失函数:
- 是原图分布,
- 是复原的原图分布,
原图分布
- 首先找出对数的上界:
最小化上界,就可以等价替换
使用贝叶斯公式,展开 KL 散度:
使用 log 运算,把乘法变成加法,把除法变成减法:
因为与 q(预测分布) 无关,所以 不受 影响,可以移项到括号外,和括号外的
对不等式左右,求
假设条件概率分布 可以分解为 。
将原始表达式展开:
根据条件独立性假设,可以将每个条件概率
将这个表达式重新组织,将内层的期望写在外层的期望中,得到:
对 进行重命名,我们得到了最终的形式 。
完整变形过程:
展开 :
第二行:利用马尔科夫性质,展开第一行,变成连乘的形式 。
第三行:利用 log 运算,把连乘变成求和 。
第四行:把
第五行:用条件概率的链式法则引入
第六行:log 展开
第七行:反向 log 展开,把求和移动 log 内变成乘积,约掉分子分母简化
第八行:整理
第九行:得到 3 个 KL 散度:、、
:
- 的 是前向传播,从 到 ,没有可学习的参数,可直接推导
- 的
- 因此,
:俩个高斯分布的 KL 散度
:相当于 中
第一行:多元高斯分布的 KL 散度形式
第二行:
- 中间项:把复原过程中的
- 最右项:把扩散过程中的
第三行:
- 学习噪声、噪声
第四行:
- 合并同类项,变成线性组合
第五、六行:
- 发现第四行前面的权重项影响不大,直接求后面的 线性组合 形式即可
- 线性组合:
训练流程
ewricas:
补充:
- 回到 第1步 继续迭代,直到 第3步 的损失函数收敛
每一轮的迭代,通过向后扩散噪声序列,将俩个时刻噪声之间的差异,作为当前梯度,更新模型参数。