kerikoの行星观察笔记
返回文章列表
1815 字10 分钟

Diffusion Model 扩散模型学习笔记:从原理到应用

技术分享#AI / Diffusion Model / 生成模型 / 李宏毅 / 学习笔记

引言:什么是扩散模型?

在学习李宏毅老师的机器学习课程时,扩散模型(Diffusion Model)作为一个新兴的生成模型引起了我的浓厚兴趣。与传统的GAN(生成对抗网络)和VAE(变分自编码器)不同,扩散模型采用了一种独特的思路:通过模拟物理中的扩散过程来生成数据。

扩散模型的概念源于物理学中的热力学扩散过程。简单来说,它通过两个核心步骤工作:

  • 前向过程(Forward Process):逐步向数据添加噪声,将清晰的数据“破坏”成纯噪声
  • 反向过程(Reverse Process):学习如何从噪声中逐步“恢复”出原始数据

这种“破坏-重建”的思想看似简单,但背后蕴含着深刻的数学原理和巧妙的算法设计。

核心思想:前向扩散与反向去噪

前向扩散过程

前向扩散过程可以理解为一种“渐进式破坏”。假设我们有一张清晰的图像 $x_0$,我们会逐步向它添加高斯噪声:

$$x_t = \sqrt{1-\beta_t} \cdot x_{t-1} + \sqrt{\beta_t} \cdot \epsilon_t$$

其中:

  • $x_t$ 是第 $t$ 步的 noisy 数据
  • $\beta_t$ 是噪声调度参数(schedule),控制每步添加的噪声量
  • $\epsilon_t$ 是从标准正态分布采样的噪声

经过 $T$ 步(通常 $T=1000$)后,原始图像 $x_0$ 会变成几乎完全的随机噪声 $x_T$。这个过程的一个重要特点是:我们可以直接从 $x_0$ 跳到任意步 $t$ 的状态:

$$x_t = \sqrt{\bar{\alpha}_t} \cdot x_0 + \sqrt{1-\bar{\alpha}_t} \cdot \epsilon$$

其中 $\bar{\alpha}t = \prod{i=1}^{t}(1-\beta_i)$。这个性质在训练时非常关键。

反向去噪过程

反向过程是扩散模型的“精髓”所在。我们需要训练一个神经网络来预测每一步添加的噪声,从而能够逐步去除噪声:

$$p(x_{t-1}|x_t) = \mathcal{N}(x_{t-1}; \mu_\theta(x_t, t), \sigma_t^2)$$

核心思想是:如果我们能准确预测第 $t$ 步添加的噪声 $\epsilon_t$,就能从 $x_t$ 推算出 $x_{t-1}$。通过不断迭代这个过程,最终可以从纯噪声 $x_T$ 生成出清晰的图像 $x_0$。

数学原理:为什么扩散模型有效?

李宏毅老师在课程中强调,理解扩散模型的数学基础非常重要。这里总结几个关键点:

1. 变分推断视角

扩散模型可以看作一种特殊的变分自编码器(VAE)。前向过程对应编码器,将数据编码成噪声;反向过程对应解码器,从噪声解码回数据。训练目标是最大化数据的对数似然:

$$\log p(x) \geq \mathbb{E}q[\log p(x_T)] - \sum{t=2}^{T} D_{KL}(q(x_{t-1}|x_t) || p(x_{t-1}|x_t))$$

2. 简化的训练目标

在实际训练中,我们不需要计算复杂的KL散度。Ho et al. (2020) 提出了一个简化的损失函数:

$$L_{simple} = \mathbb{E}{t,x_0,\epsilon}[|\epsilon - \epsilon\theta(x_t, t)|^2]$$

这个损失函数非常直观:就是让网络预测的噪声尽可能接近真实添加的噪声。

3. 采样过程

生成新图像时,我们:

  1. 从标准正态分布采样 $x_T$
  2. 使用训练好的网络预测噪声
  3. 根据预测的噪声计算 $x_{t-1}$
  4. 重复直到得到 $x_0$

训练过程:如何训练扩散模型?

李宏毅老师的课程详细讲解了扩散模型的训练流程,我总结如下:

训练步骤

  1. 准备训练数据:收集大量清晰图像作为 $x_0$
  2. 随机采样时间步 $t$:均匀采样 $t \in [1, T]$
  3. 添加噪声得到 $x_t$:使用前向公式直接计算
  4. 网络预测噪声:输入 $x_t$ 和 $t$,网络输出预测的 $\epsilon_\theta$
  5. 计算损失:比较预测噪声和真实噪声的差距
  6. 反向传播:更新网络参数

网络架构

扩散模型通常使用 U-Net 作为骨干网络。U-Net的特点:

  • 编码器-解码器结构,适合图像到图像的任务
  • Skip connections保留细节信息
  • 可以融入时间步 $t$ 的信息(通过sinusoidal positional encoding)

李宏毅老师特别提到,U-Net并非唯一选择,但实践中效果很好。

噪声调度(Noise Schedule)

噪声调度参数 $\beta_t$ 的选择很关键:

  • 线性调度:$\beta_t$ 线性增长,简单但效果一般
  • cosine调度:更平滑的噪声添加,效果更好
  • 通常 $\beta_1 \approx 10^{-4}$,$\beta_T \approx 0.02$

应用场景:扩散模型的实际应用

扩散模型在多个领域取得了突破性进展:

1. 图像生成

DALL-E 2、Stable Diffusion、Imagen 等知名模型都基于扩散模型。它们能够:

  • 文本到图像生成:根据文字描述生成高质量图像
  • 图像编辑:局部修改图像内容
  • 超分辨率:提升图像清晰度

2. 音频生成

扩散模型在语音合成、音乐生成方面也有应用,如 DiffWave 用于语音合成。

3. 视频生成

视频扩散模型可以生成连贯的视频序列,如 Video Diffusion Models

4. 医学图像

在医学图像重建、去噪方面,扩散模型展现出强大的能力。

优势与挑战

学习过程中,我总结了扩散模型的主要优势:

优势:

  • 生成质量高,细节丰富
  • 训练稳定,不易出现mode collapse(相比GAN)
  • 数学理论清晰,可解释性强
  • 支持灵活的条件生成

挑战:

  • 采样速度慢:需要数百步迭代
  • 计算资源消耗大
  • 调参有一定技巧

近年来,很多研究致力于加速采样,如 DDIM 可以将采样步数从1000减少到50-100步。

总结与心得

通过学习李宏毅老师的课程,我对扩散模型有了深入的理解。几点学习心得:

  1. 从简单到深刻:扩散模型的思想看似简单(加噪声再去噪声),但数学原理很深刻,需要理解变分推断、马尔可夫链等概念。

  2. 理论与实践结合:理解数学公式很重要,但更重要的是理解它在实际训练中如何实现。比如简化损失函数的设计就非常巧妙。

  3. 关注最新进展:扩散模型领域发展很快,新的改进(如Latent Diffusion、Consistency Models)不断涌现,需要持续学习。

  4. 动手实践:理论学习后,实际动手训练一个简单的扩散模型非常有帮助。可以从MNIST数据集开始尝试。

扩散模型代表了生成模型的一个重要发展方向。理解它的原理,对于学习更高级的模型(如Stable Diffusion、DALL-E 3)很有帮助。希望这篇笔记能帮助更多人入门这个有趣的领域!


参考资源:

  • 李宏毅机器学习课程:Diffusion Model 讲解
  • Ho et al. (2020): “Denoising Diffusion Probabilistic Models”
  • Nichol & Dhariwal (2021): “Improved Denoising Diffusion Probabilistic Models”

评论