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. 采样过程
生成新图像时,我们:
- 从标准正态分布采样 $x_T$
- 使用训练好的网络预测噪声
- 根据预测的噪声计算 $x_{t-1}$
- 重复直到得到 $x_0$
训练过程:如何训练扩散模型?
李宏毅老师的课程详细讲解了扩散模型的训练流程,我总结如下:
训练步骤
- 准备训练数据:收集大量清晰图像作为 $x_0$
- 随机采样时间步 $t$:均匀采样 $t \in [1, T]$
- 添加噪声得到 $x_t$:使用前向公式直接计算
- 网络预测噪声:输入 $x_t$ 和 $t$,网络输出预测的 $\epsilon_\theta$
- 计算损失:比较预测噪声和真实噪声的差距
- 反向传播:更新网络参数
网络架构
扩散模型通常使用 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步。
总结与心得
通过学习李宏毅老师的课程,我对扩散模型有了深入的理解。几点学习心得:
-
从简单到深刻:扩散模型的思想看似简单(加噪声再去噪声),但数学原理很深刻,需要理解变分推断、马尔可夫链等概念。
-
理论与实践结合:理解数学公式很重要,但更重要的是理解它在实际训练中如何实现。比如简化损失函数的设计就非常巧妙。
-
关注最新进展:扩散模型领域发展很快,新的改进(如Latent Diffusion、Consistency Models)不断涌现,需要持续学习。
-
动手实践:理论学习后,实际动手训练一个简单的扩散模型非常有帮助。可以从MNIST数据集开始尝试。
扩散模型代表了生成模型的一个重要发展方向。理解它的原理,对于学习更高级的模型(如Stable Diffusion、DALL-E 3)很有帮助。希望这篇笔记能帮助更多人入门这个有趣的领域!
参考资源:
- 李宏毅机器学习课程:Diffusion Model 讲解
- Ho et al. (2020): “Denoising Diffusion Probabilistic Models”
- Nichol & Dhariwal (2021): “Improved Denoising Diffusion Probabilistic Models”