跳到主要内容

扩散模型

扩散模型是一类生成模型,它通过迭代地向数据添加和移除噪声来学习数据分布。它们因其在图像和音频合成等领域生成高质量样本的能力而备受关注。

概述

  • 生成建模:扩散模型旨在通过学习逆转预定义的噪声过程来建模底层数据分布 p(x)p (\mathbf{x})
  • 加噪过程:一个正向过程,其中噪声逐渐添加到数据中,导致一个可处理的分布。
  • 去噪过程:一个逆向过程,其中模型学习逐步去除噪声以恢复原始数据。

正向扩散过程

正向过程在 TT 个时间步长内向数据添加高斯噪声。

  • 马尔可夫链:每个加噪样本仅依赖于前一个时间步。
  • 高斯转换 q(xtxt1)=N(xt;1βtxt1,βtI)q(\mathbf{x}_t \mid \mathbf{x}_{t-1}) = \mathcal{N}(\mathbf{x}_t; \sqrt{1 - \beta_t} \, \mathbf{x}_{t-1}, \beta_t \mathbf{I})
  • 方差βt\beta_t 是控制噪声调度的小正数常数。

逆向扩散过程

模型学习逆向转换以对数据进行去噪。

  • 学习近似 pθ(xt1xt)=N(xt1;μθ(xt,t),σt2I)p_\theta(\mathbf{x}_{t-1} \mid \mathbf{x}_t) = \mathcal{N}(\mathbf{x}_{t-1}; \boldsymbol{\mu}_\theta(\mathbf{x}_t, t), \sigma_t^2 \mathbf{I})
  • 均值预测:模型预测均值 μθ\boldsymbol{\mu}_\theta 以逆转扩散。

训练目标

目标是最小化负对数似然的变分下界。

  • 简化损失函数 L=Et,x0,ϵ[ϵϵθ(xt,t)2]L = \mathbb{E}_{t, \mathbf{x}_0, \boldsymbol{\epsilon}} \left[ \left\| \boldsymbol{\epsilon} - \boldsymbol{\epsilon}_\theta(\mathbf{x}_t, t) \right\|^2 \right]
  • 噪声预测:模型 ϵθ\boldsymbol{\epsilon}_\theta 预测每个时间步添加的噪声。

去噪扩散概率模型 (DDPM)

DDPMs 是扩散模型的一种特定实现,专注于概率公式。

  • 正向过程:根据预定义的调度添加噪声。
  • 逆向过程:使用神经网络(通常是 U-Net)学习去噪。
  • 采样:从纯噪声 xT\mathbf{x}_T 开始,迭代去噪以获得 x0\mathbf{x}_0

采样过程

要生成新数据:

  1. 初始化:从噪声样本 xTN(0,I)\mathbf{x}_T \sim \mathcal{N}(0, \mathbf{I}) 开始。
  2. 迭代去噪:对于 t=Tt = T11
    • 使用学习到的逆向过程预测 xt1\mathbf{x}_{t-1}
  3. 输出:最终样本 x0\mathbf{x}_0 是生成的数据。

应用

图像生成

  • 高保真图像:能够生成具有精细细节的图像。
  • 无条件和有条件生成:可以从头开始生成图像或基于输入数据生成图像。

文本到图像合成

  • 引导扩散:结合文本嵌入来引导图像生成。
  • 语义一致性:生成与文本描述高度一致的图像。

音频生成

  • 语音合成:生成逼真的语音模式。
  • 音乐生成:创作新颖的音乐作品。

代码示例

在 PyTorch 中实现一个基本的扩散模型步骤:

import torch
import torch.nn as nn

# 定义噪声调度
beta_t = torch.linspace(1e-4, 0.02, T)

# 正向扩散(添加噪声)
def q_sample(x_0, t, noise):
sqrt_alpha_cumprod = torch.sqrt(torch.cumprod(1 - beta_t, dim=0))
return sqrt_alpha_cumprod[t] * x_0 + torch.sqrt(1 - sqrt_alpha_cumprod[t]**2) * noise

# 模型(简化版)
class DiffusionModel(nn.Module):
def __init__(self):
super(DiffusionModel, self).__init__()
# 定义网络层
self.net = nn.Sequential(
nn.Linear(input_dim, hidden_dim),
nn.ReLU(),
nn.Linear(hidden_dim, input_dim),
)

def forward(self, x_t, t):
return self.net(x_t)

# 训练循环片段
model = DiffusionModel()
optimizer = torch.optim.Adam(model.parameters(), lr=1e-4)

for epoch in range(num_epochs):
for x_0 in data_loader:
t = torch.randint(0, T, (batch_size,))
noise = torch.randn_like(x_0)
x_t = q_sample(x_0, t, noise)
noise_pred = model(x_t, t)
loss = nn.MSELoss()(noise_pred, noise)
optimizer.zero_grad()
loss.backward()
optimizer.step()

主要收获

  • 扩散模型通过学习逆转噪声过程,为生成建模提供了一个强大的框架。
  • 灵活性:它们可以应用于各种数据类型,包括图像、音频等。
  • 最先进的结果:在生成任务中取得有竞争力的性能,与 GAN 和 VAE 相比。