您现在的位置是:首页 >其他 >扩散模型之DDPM网站首页其他

扩散模型之DDPM

宝剑磨,梅花寒 2024-08-17 00:01:02
简介扩散模型之DDPM

文章前置

最原文链接(英文):What are Diffusion Models?
原文链接:Diffusion扩散模型大白话讲解,看完还不懂?不可能
原文链接:DDPM解读(一)| 数学基础,扩散与逆扩散过程和训练推理方法
hugging face diffusers(扩散模型包):huggingface diffusers code
本文并非全部是个人理解,是觉得其他作者的博客和文章通过不同的角度将DDPM讲的更加通俗易懂,希望自己能通过写一些东西加深理解,并且能够将其他人的优质内容进行分享。

生成模型

生成模型的主流网络结构应该可以分成三类,GAN、VAE 和基于流的模型。他们在生成高质量样本方面取得了巨大成功,但每个都有自己的局限性。

  1. GAN:由生成器和判别器构成。先训练判别器,使其能够区分图片的真伪(二分类),再继续训练生成器生成图像,在通过判别器判别图像的真伪,使生成图像的分布逐渐逼近于真实分布。由于 GAN 模型具有对抗性训练的性质,因此以潜在的不稳定训练和较少的生成多样性而闻名。
  2. VAE:与GAN通过判别器判断生成图像的真假不同,VAE直接通过分布的变换来生成图像。将真实样本通过编码器网络变换成一个理想的数据分布,然后这个数据分布再传递给一个解码器网络,得到一堆生成样本,生成样本与真实样本足够接近的话,就训练出了一个自编码器模型。但VAE的方法输出模糊,常会失真。
  3. 基于流模型的方法,是建立训练数据和生成数据之间的概率关系,然后用可逆的神经网络来训练,这种关系是一一对应的。代价就是模型设计比较麻烦,因为要保证可逆而且逆函数可以算,还要有足够的灵活度。流模型必须使用专门的体系结构来构建可逆变换。
  4. 扩散模型的灵感来自非平衡热力学。他们定义了一个扩散步骤的马尔可夫链,以缓慢地将随机噪声添加到数据中,然后学习反转扩散过程以从噪声中构建所需的数据样本。与 VAE 或流模型不同,扩散模型是通过固定过程学习的,并且潜在变量具有高维性(与原始数据相同)。
    在这里插入图片描述

总结

从图中我们可以看到,GAN、VAE和基于流的模型的共同点在于期望“一步跨十个台阶”,直接实现图像的生成,而扩散模型期望“一步跨一个台阶”,这可能是扩散模型生成的图像质量比较高的原因。

Design of DDPM

如下图所示。DDPM模型主要分为两个过程:forward加噪过程(从右往左)和reverse去噪过程(从左往右)。加噪过程意思是指向数据集的真实图片中逐步加入高斯噪声,而去噪过程是指对加了噪声的图片逐步去噪,从而还原出真实图片。加噪过程满足一定的数学规律,而去噪过程则采用神经网络来学习。这么一来,神经网络就可以从一堆杂乱无章的噪声图片中生成真实图片了。
在这里插入图片描述

正向加噪过程

给定一个从真实数据分布中采样的数据点 x 0 ∼ q ( x ) m{x_0} sim q( m{x}) x0q(x),定义一个 T T T step 的正向的加噪过程,逐步向样本中添加少量高斯噪声,以产生一连串的噪声样本 x 1 , . . . , x T m{x_1},..., m{x_T} x1,...,xT。步长的大小是由 β t eta_t βt控制 β t ∈ ( 0 , 1 ) t = 1 T {eta_t in(0,1)}^T_{t=1} βt(0,1)t=1T
在这里插入图片描述
这种公式看起来比较难理解比较抽象,其实就是
x t = 1 − β t x t − 1 + β t ϵ t − 1 m{x_t}=sqrt{1-eta_t} m{x}_{t-1}+sqrt{eta_t}epsilon_{t-1} xt=1βt xt1+βt ϵt1
其中 ϵ t ∼ N ( 0 , I ) epsilon_t sim N(0,I) ϵtN(0,I),这样就非常容易理解了,正向的加噪过程是通过公式推导的,不涉及网络参数的学习。随着 t t t不断增大,采样数据 x 0 m{x_0} x0逐渐失去可辨别的特征,当 T T T比较大时, x T m{x_T} xT就等同于一个高斯分布了。我们可以看到, x T m{x_T} xT只由 β T eta_T βT x T − 1 m{x_{T-1}} xT1来确定,是一个不通过学习就可以直接得到的过程。因此,只要我们有了 x 0 m{x_0} x0,并且提前确定每一步的固定值 β 1 eta_1 β1,…, β T eta_T βT,我们就可以推出任意一步的加噪数据 x 1 m{x_1} x1,…, x T m{x_T} xT。这里的前向加噪过程被称为是一个马尔科夫链过程。

反向去噪过程

反向的过程是复杂的,需要逐步反向计算,即计算 q ( x t − 1 ∣ x t , x 0 ) q( m{x_{t-1}}| m{x_t}, m{x_0}) q(xt1xt,x0)。这里为什么不是直接计算 q ( x t − 1 ∣ x t ) q( m{x_{t-1}}| m{x_t}) q(xt1xt),这是因为在正向加噪的过程中,我们已知的只有各种条件概率 q ( x t ∣ x t − 1 ) q( m{x_{t}}| m{x_{t-1}}) q(xtxt1),而像 q ( x t ) q( m{x_t}) q(xt)这样的先验概率不能得到,所以需要计算 q ( x t − 1 ∣ x t , x 0 ) q( m{x_{t-1}}| m{x_t}, m{x_0}) q(xt1xt,x0)。这里我们可以由贝叶斯公式得出(公式真的不想手打了,直接复制粘贴):
在这里插入图片描述
根据正向的加噪过程,我们很容易计算贝叶斯公式中的各个成分
在这里插入图片描述
在这里 α t = 1 − β t alpha_t = 1-eta_t αt=1βt α t ‾ = α t α t − 1 . . . α 1 overline{alpha_t} = alpha_t alpha_{t-1}...alpha_1 αt=αtαt1...α1。标准正态分布可以表示为:
在这里插入图片描述
所以贝叶斯公式的表示可以转化为:
在这里插入图片描述
将平方展开并合并同类项我们可以得到:
在这里插入图片描述
因为KaTeX parse error: Undefined control sequence: x at position 1: ̲x̲_t x 0 x_0 x0都是已知的,所以最后一项可以作为一个常数项。对比标准的正态分布展开项为:
在这里插入图片描述
对比两个指数形式的分布,我们就可以分别计算 σ sigma σ μ mu μ,而且可以发现这里的 σ sigma σ是一个固定值,而 μ mu μ可以得到:
在这里插入图片描述
通过正向加噪的过程可以有 x t x_t xt计算 x 0 x_0 x0,所以可以得到:
在这里插入图片描述
而在反向去噪的过程中, ϵ t epsilon_t ϵt并不知道是什么样的,所以就可以通过神经网络来拟合了,并且可以通过与正向加噪的过程中使用的噪声计算mse损失来训练这个网络。这就是一个标准的扩散模型DDPM的过程。

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。