A Survey on Generative Diffusion Models(生成扩散模型综述)

论文名称:A Survey on Generative Diffusion Models(2023)
论文地址:https://ieeexplore.ieee.org/abstract/document/10419041
代码地址:https://github.com/chq1155/A-Survey-on-Generative-Diffusion-Model

1. 介绍

作者在本文中总结了扩散模型中基本算法的数学表达和推导过程,并对改进的扩散算法进行了全面的分类。同时,作者提供了扩散模型在计算机视觉、自然语言处理、生物信息学、语音处理中应用的广泛陈述,提出目前模型的局限性和扩散模型可能的进一步证明方向。

作者把现今扩散模型的改进分成四个主要类别:
1)抽样加速
2) 扩散过程设计 / 结构多样化
3)似然优化
4)降低维度

论文作者在github上整理了生成扩散模型领域近年各大改进方法,以及在计算机视觉、序列建模、音频、科学领域应用的相关论文和代码。

2. 概念介绍

在这里插入图片描述
上图表示几种常见生成模型,即生成对抗模型GAN、能量模型EBM、变分自编码器VAE、归一化流、扩散概率模型DPM,几者在结构上的差异。而下图为扩散概率模型的流程示意图,及先从一个图片不断加噪至白噪音,再通过不断减噪,最终生成一个新的图片。

在这里插入图片描述

2.1. 时间 & 状态

整个过程在连续或离散的时间轴内进行,其中时间分别表示为 t ∈ [0,1] 或 toT。噪声被递增地引入到初始分布中,及从数据分布po中采样得到的起始状态xo。通过一系列噪声注入,该分布逐渐收敛到已知的噪声分布 pT(p1) (通常是高斯分布),称为先验状态 xT(x1) 。位于起始状态和先验状态之间的状态被称为中间状态xt,每个中间状态都与边际分布相关。通过这种方法,扩散模型能够探索数据分布从起始状态到先验状态的进展通过一系列中间状态发生,其中每个状态对应于扩散过程中的特定时间点。

2.2. 正向/反向过程 & 过渡核

在扩散模型中,起始状态到可管理噪声的转换是通过正向过程F进行的。相反地,去噪过程在相反方向上操作,逐渐将先前状态去噪回到起始状态。这两个过程都涉及使用转换核来促进任何两个状态之间的转换。

正向过程:
在这里插入图片描述
反向过程:
在这里插入图片描述

2.3. 由离散到连续

取足够小的扰动核,这对离散过程将推广到连续过程。由于离散的马尔可夫链的扩散模型可以集成到连续的随机微分方程(Stochastic Differential Equation,简称SDD)框架中,其中生成过程相当于反转固定的正向扩散过程。储备常微分方程边际等效于反向微分方程。

3. 背景

去噪扩散概率模型(2020)
DDPM = Denoising Diffusion Probailistic Model
基于分数的生成模型(2020)
SGM = Score-based Generative Model

3.1. DDPM

3.1.1. 前向过程

基于上述框架,DDPM选择噪声系数序列 𝛽1, 𝛽2, …, 𝛽𝑇 作为马尔可夫转移核。常见模式选择包括常数时间表、线性时间表和余弦时间表。

【常数时间表】
系数始终保持固定值,简化了训练,但可能导致样本的多样性或精细度降低。

【线性时间表】
系数随时间线性变化,逐渐从高噪声水平过渡到低噪声水平以优化样本。

【余弦时间表】
系数随时间呈余弦形式周期性变化,从而实现对不同阶段的噪声水平的细微控制,提高了样本质量。

DDPM前向步骤定义为
在这里插入图片描述
βt 是预定义的噪声比例参数,ϵ 是从标准正态分布中抽取的噪声。

选择前向核的想法最初源于非平衡热力学中的扩散过程,通过从xo到xT的前向转移核的部分,我们有以下前向扩散过程,该过程通过马尔可夫核逐渐将高斯噪声添加到数据中。
在这里插入图片描述

3.1.2. 反向过程

反向过程经过一个从xT到xo的反向序列
在这里插入图片描述
在这里插入图片描述

DDPM的目标是通过反向过程中的一系列去噪操作获得的模型分布近似数据分布
在这里插入图片描述

3.1.3. 扩散训练目标

为了通过模型分布近似数据分布,扩散模型被训练为最小化负对数似然(NLL)的变分界限,类似于VAE。

在这里插入图片描述

由贝叶斯公式可得
在这里插入图片描述
作以下定义
在这里插入图片描述
保持上述参数化并且将xt重新参数化为xt(xo, 𝜎),Lt-1可以被视为两个平均系数之间l2损失的期望。
在这里插入图片描述
在这里插入图片描述

到目前为止,大多数扩散模型都使用DDPM的训练策略。但也有一些例外,改进后的DDPM提出将Lsimple与其他辅助目标相结合。然而,在这一共同目标中,Lsimple仍然发挥着主要作用。在训练之后,神经预测器用于祖先采样的反向过程。

3.2. SGM

Score将DDPM中的离散时间方案扩展到基于随机微分方程的统一连续时间框架。给出了基于分数阶的DDPM的连续构造,并提出了一种密度估计的常微分方程框架–概率流常微分方程。该方法最初受维纳过程 / 布朗运动启发,即悬浮在液体或气体中的微粒做永不停息的无规则运动。

维纳过程 / 布朗运动
若一个随机过程 {X(t), t >=0} 满足以下条件,则称X(t)是布朗运动或维纳过程。

  1. X(t)是独立增量过程
  2. 任意s, t >= 0,X(t + s) -X(s) ~ N(0, c^2*t)
    (当c = 1时,属于标准布朗运动
  3. X(t)关于t是连续函数

随机微分方程
一类含有随机项(如维纳过程)的微分方程,用于描述系统状态随时间的演变,这种演变不仅受到确定性因素的影响,还受到随机性因素的作用
dXt = a(Xt, t)dt + b(Xt, t)dWt
Xt:随机过程,表示系统状态
a(Xt, t):漂移项,表示系统随时间确定性变化的部分
b(Xt, t):扩散项,表示系统变化中的随机性
Wt是维纳过程,表示随机扰动
dt和dWt分别代表时间和维纳过程的微小变化

3.2.1. 前向过程

通过随机微分方程,扩散过程可被看作一个连续的过程,且其的解等于Ito SDE的解。

在这里插入图片描述
其中f(., t) 是x(t)的漂移系数,g(t)表示简化版本的扩散系数(假设与x无关),wt是标准维纳过程。

将时刻t的边际分布记作Pt(x)。因此,Pt记作没有从Po信息的先验分布。当系数在段上连续,则前向SDE方程存在唯一解。基于这种SDE框架,存在两种前向过程,分别称为变异保持(VP)和变异爆炸(VP)
在这里插入图片描述
其中VP对应于DDPM框架中的连续扩展,其中𝛽(𝑡)为𝛽t连续时间变量。

3.2.2. 反向过程

扩散模型的采样通过正向过程的相应逆时采样完成。

在这里插入图片描述
在这里插入图片描述
其中xo是从po分布中的采样,𝜆(𝑡)是保持时间相关损失保持在相同幅度的正权重函数。最优情况下,去噪得分匹配目标的加权和(如下式所示)等于真正分数函数∇𝑥log𝑝P𝑡(𝑥)。同时,分数函数S也可看做是DDPM中神经预测𝝐的重参数化。当从近场移动到远场,扰动数据受到数据分布中更多模式的影响。

3.2.3. 概率流ODE

(ODE指常微分方程)
概率流常微分方程指支持确定性过程的连续时间常微分方程,用于描述概率密度随时间演化的偏微分方程,与随机过程具有相同的边际概率分布。被证明任何类型的扩散过程都可以导出为一种特殊形式的常微分方程,其相应表示如下

在这里插入图片描述
由于没有随机性,与随机微分方程相比,概率流常微分方程可用更大的步长求解。

4. 条件扩散模型

5. 算法改进

6. 应用

### 关于生成扩散模型的研究 #### 什么是生成扩散模型生成扩散模型是一种通过逐步添加噪声到数据中并学习逆过程来生成新样本的深度生成模型[^1]。这些模型的核心思想在于定义一个前向扩散过程,其中数据逐渐被高斯噪声破坏,随后训练一个神经网络以逆转这一过程,从而恢复原始数据。 #### Denoising Diffusion Probabilistic Model (DDPM) DDPM 是一种具体的生成扩散模型,其核心机制涉及两个主要阶段: - **前向过程**:在此过程中,输入数据会经历一系列加噪步骤,最终变为纯噪声。这个过程可以通过马尔可夫链的形式表示。 - **反向过程**:该部分的目标是从纯噪声中重建原始数据。这通常由一个参数化条件分布实现,具体来说是一个受训练的神经网络负责预测每一步的去噪操作[^2]。 #### 扩散模型的应用范围 扩散模型已经在多个领域展示了卓越的能力,尤其是在生成高质量复杂数据方面。它们的主要应用场景包括但不限于: - 图像合成:能够创建逼真的图像,适用于艺术创作等领域。 - 视频生成:支持动态场景的理解与生成。 - 分子设计:用于药物发现和其他化学工程任务。 此外,扩散模型还在超分辨率成像、图像修复和风格迁移等方面取得了显著成果[^3]。 #### 当前挑战与发展方向 尽管扩散模型已经取得了很多成就,但仍存在一些未解决的问题值得进一步探讨: - 如何更有效地减少采样步数而不影响质量? - 是否可能优化先验分布形式使模型更加灵活适应不同类型的输入源? - 探索不同的扰动核函数是否能带来新的特性或者优势? ```python import torch from torchvision import datasets, transforms from torch.utils.data import DataLoader def load_data(batch_size=64): transform = transforms.Compose([ transforms.ToTensor(), lambda x: (x - 0.5) * 2. ]) dataset = datasets.MNIST('./data', train=True, download=True, transform=transform) dataloader = DataLoader(dataset, batch_size=batch_size, shuffle=True) return dataloader ``` 上述代码片段展示了一个简单的MNIST数据加载器配置例子,可用于后续实验测试各种扩散模型架构的表现情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sarrey

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值