从分数函数到扩散模型:生成式AI的核心原理与工程实践
2026/9/13 10:54:51 网站建设 项目流程

1. 项目概述:从噪声到图像的两种哲学

最近几年,生成式AI的火爆程度有目共睹,从DALL·E 2到Stable Diffusion,这些模型生成的高质量、高创意图像不断刷新我们的认知。在这些明星模型背后,有两类核心的生成范式扮演着关键角色:基于分数的生成模型和扩散模型。很多刚入门的朋友可能会被这两个名词搞晕,觉得它们似乎是两种不同的东西,但又经常被放在一起讨论,甚至在一些文章里被混用。

我自己在研究和工程实践中也花了不少时间去梳理这两者的脉络。简单来说,你可以把它们理解为实现同一个宏伟目标——从一片混沌的噪声中,一步步构建出结构清晰的图像——的两种不同“哲学”和“数学语言”。它们紧密相连,甚至可以说,现代主流的扩散模型,其理论基石之一就是基于分数的生成模型。今天,我就结合自己的理解,来系统性地总结一下这两者的区别、联系以及它们是如何一步步走到一起,并最终引爆AIGC革命的。无论你是研究者希望深入理论,还是工程师想弄明白Stable Diffusion到底在干什么,这篇文章都会给你一个清晰的框架。

2. 核心理念拆解:两种视角下的生成之旅

要理解它们的区别与联系,我们得先回到生成模型的根本任务上:学习一个复杂的数据分布(比如所有猫图片的分布),然后从中采样出新样本。基于分数的模型和扩散模型,为这个任务提供了两种优雅的解决方案。

2.1 基于分数的模型:学习“梯度场”

基于分数的模型,其核心思想非常直观。想象一下,我们有一片高低起伏的山地,数据样本(比如真实的猫图片)就像散落在这片山地上的一个个小村庄,它们位于山谷(概率密度高)的区域。而山地之外广袤的平原,则对应着概率密度极低的区域。

那么,“分数”在这里指的是什么?它就是概率密度函数对数梯度的简称,即score function:∇ₓ log p(x)。这个梯度指向哪里呢?它就指向概率密度增长最快的方向。在我们山地的比喻里,score function 就像在每个点测量出的“最陡的上坡方向”。如果你站在一个随机点(一张噪声图),这个梯度会告诉你,朝着哪个方向走,你能最快地“上山”,接近真实数据分布所在的“山谷”。

基于分数的生成模型的目标,就是训练一个神经网络(称为分数网络)来估计这个真实的 score function,即 sθ(x) ≈ ∇ₓ log p(x)。一旦我们有了这个“指南针”,生成过程就变成了一个“登山”的逆过程——朗之万动力学采样。我们从随机噪声(平原上的随机点)开始,反复执行以下步骤:1)用分数网络查询当前位置的“上坡方向”;2)朝着这个方向走一小步(这会使样本更接近数据);3)再加上一点随机噪声(避免陷入局部最优)。如此迭代数百甚至数千步,最终就能“漫步”到一个数据分布的高概率区域,即生成一张逼真的图片。

注意:这里的“分数”是数学上的梯度,与考试分数无关。它的物理意义是数据空间中的“力场”或“方向场”,引导噪声向数据演化。

2.2 扩散模型:学习“去噪过程”

扩散模型则采用了另一种视角,它更像是一个物理过程的模拟:扩散。这个过程分为前向和反向两部分。

前向过程是一个固定的、逐步加噪的过程。我们有一张清晰的原始图片 x₀,在前向过程的每一步,我们都给它添加一点点高斯噪声。经过足够多的步骤 T 后,原始图片就彻底变成了一张纯高斯噪声 x_T ~ N(0, I)。这个过程是确定的,不需要学习。

反向过程才是模型需要学习的核心。它的目标是逆转前向过程:给定第 t 步的带噪图片 x_t,去预测第 t-1 步的、噪声更少的图片 x_{t-1}。这本质上是在学习一个条件分布 p(x_{t-1} | x_t)。最初的DDPM模型是直接让神经网络预测这个去噪后的图像,或者预测所添加的噪声。

那么,扩散模型是如何生成新图像的呢?很简单:我们从一张纯高斯噪声 x_T 开始,然后调用我们学好的反向过程模型,一步步地预测并减去噪声,经过 T 步之后,就得到了一张全新的、清晰的图像 x₀。

2.3 两种哲学的联系桥梁

看到这里,你可能会觉得这是两种完全不同的方法。但神奇的是,它们在数学上是相通的。这个桥梁就是Tweedie’s formula和分数匹配理论。

在扩散模型的前向加噪过程中,在已知原始数据 x₀ 的情况下,第 t 步的加噪数据 x_t 的分布是已知的高斯分布。Tweedie’s formula 告诉我们,这个高斯分布的后验均值,与它的分数函数(对数概率密度的梯度)有直接关系。具体来说,最优的去噪方向,恰恰就依赖于这个分数函数。

这意味着什么?意味着扩散模型反向过程里要预测的“去噪方向”或“噪声”,本质上等价于预测带噪数据分布在某一步的分数函数。也就是说,扩散模型可以被视为在多个噪声尺度(不同的 t)上,训练了一系列分数估计器。

因此,一个更统一的观点是:基于分数的模型提供了扩散模型的理论解释和一般化框架。DDPM这类扩散模型,可以看作是基于分数的生成模型在“前向过程为固定线性高斯扩散”这一特定设定下的一个特例和一种非常成功的参数化实现方式。而基于分数的模型框架更通用,它不限定前向加噪的方式(可以是任何噪声扰动),其核心目标始终是学习数据分布的分数函数。

3. 技术演进与关键突破详解

理解了基本理念,我们来看看它们是如何在实践中发展并融合的。这个历程中有几个里程碑式的关键突破。

3.1 分数匹配的挑战与解决方案

早期直接估计分数函数 ∇ₓ log p(x) 非常困难,因为我们需要先知道真实的数据分布 p(x),而这正是我们不知道的。分数匹配是一种无需知道 p(x) 就能估计其分数函数的方法,但它通常需要对整个数据集进行计算,计算成本高昂,且在高维数据上不稳定。

2019年,宋飏博士等人的工作《Generative Modeling by Estimating Gradients of the Data Distribution》带来了根本性突破。他们提出了噪声条件分数网络退火朗之万动力学采样

  1. 噪声条件分数网络:他们意识到,直接估计干净数据的分数函数很难,因为数据可能集中在低维流形上,分数函数在这些区域之外是未定义的。解决方案是用多个不同尺度的高斯噪声去扰动原始数据。这样,扰动后的数据分布会“铺满”整个空间,使得分数函数处处有定义。他们训练一个单一的、条件化的神经网络 sθ(x, σ),其中 σ 是噪声尺度,来同时估计所有噪声尺度下的分数函数。
  2. 退火朗之万动力学采样:在采样时,他们采用从大到小一系列递减的噪声尺度 {σ₁ > σ₂ > … > σₙ}。首先在大噪声尺度 σ₁ 下开始朗之万采样,此时数据分布平滑,容易探索模式;然后逐渐切换到更小的噪声尺度,逐步精细化样本。这个过程就像先用粗笔勾勒轮廓,再用细笔刻画细节,极大地提高了生成样本的质量和多样性。

这项工作奠定了现代基于分数的生成模型的基础,也清晰地展示了其强大的生成能力。

3.2 DDPM:扩散模型的具体化与工程化

几乎在同一时期,2020年的《Denoising Diffusion Probabilistic Models》提出了DDPM。它将扩散过程具体化为一个固定的、线性的噪声调度方案,并做出了一个关键的参数化选择:让神经网络 εθ 直接预测添加到图像中的噪声

这个选择非常巧妙,它使得训练目标简化为一个简单的均方误差损失:L = E[||ε - εθ(√ᾱ_t x₀ + √(1-ᾱ_t) ε, t)||²]。其中 ε 是真实噪声,εθ 是网络预测的噪声。这个损失函数稳定、易于优化。

更重要的是,DDPM揭示了其与分数函数的关联:预测的噪声 εθ 与分数函数成正比,即 εθ(x_t, t) ∝ -∇_{x_t} log p(x_t)。因此,DDPM可以看作是一个在离散时间步、特定噪声调度下训练的分数匹配模型。DDPM以其相对简单的实现和出色的效果,迅速成为扩散模型的主流范式。

3.3 连接与统一:SDE视角

2021年,《Score-Based Generative Modeling through Stochastic Differential Equations》这项工作完成了最后的理论统一。它将之前的离散时间步的噪声扰动过程,推广到连续的随机微分方程框架。

  • 前向SDE:将加噪过程描述为一个连续时间的随机过程。当时间从0到T,数据逐渐演变为纯噪声。
  • 反向SDE:存在一个对应的反向SDE,描述从噪声生成数据的过程。而这个反向SDE的漂移项,核心正是数据分布的分数函数∇ₓ log p(x)。

这个框架极其优美和强大:

  1. 统一视角:它表明,无论是之前的退火朗之万动力学还是DDPM,都可以被视为这个连续SDE框架在不同离散化方案下的特例。
  2. 灵活性:它允许设计不同的前向SDE(如方差爆炸型、方差保持型),从而得到不同的生成模型。
  3. 确定性采样:通过推导,可以从反向SDE得到一个对应的概率流常微分方程。沿ODE采样是确定性的,这意味着对于同一个初始噪声,会生成完全相同的图像,这有利于编辑、插值等任务。

至此,基于分数的模型和扩散模型在理论上被完全统一到一个框架下。我们现在常说的“扩散模型”,通常指的就是这个以分数函数为核心、通过SDE/ODE描述的统一生成模型家族。

4. 实操要点与模型解析

理论之后,我们来看看在实际构建和使用这些模型时,需要关注哪些核心要点。这里我以Stable Diffusion这类潜在扩散模型为例,因为它结合了多个关键思想。

4.1 核心组件与训练目标

一个现代扩散模型通常包含以下几个核心部分:

  1. 噪声调度器:定义前向过程中,噪声如何随时间步 t 从0到T增加。常见的调度器有线性、余弦、Sigmoid等。调度器的选择直接影响训练稳定性和采样质量。例如,余弦调度在开始和结束时变化平缓,中间变化较快,通常能获得更好的效果。

    实操心得:不要盲目使用论文中的默认调度器。对于你的特定数据集(如人脸、风景、动漫),可能需要进行简单的调度器实验。通常可以从余弦调度开始,它比较鲁棒。

  2. U-Net 噪声预测器:这是模型的主体。它是一个U型结构的卷积神经网络,负责在给定带噪潜在特征z_t和时间步嵌入t的条件下,预测添加到其中的噪声ε。U-Net中的跳跃连接对于保留图像细节至关重要。此外,注意力机制的引入(尤其是交叉注意力)是实现文生图等条件生成的关键。

  3. 条件编码器:对于文生图模型,需要一个文本编码器(如CLIP的文本编码器或T5)将文本提示词y编码成嵌入向量。这个条件向量会通过交叉注意力机制注入到U-Net中,指导生成过程。

  4. 训练损失:核心损失是噪声预测的均方误差,即L = E[||ε - εθ(z_t, t, c(y))||²],其中c(y)是条件嵌入。训练时,我们会随机采样时间步t、随机采样真实数据z₀(或x₀)、随机添加噪声得到z_t,然后让网络预测噪声。

4.2 采样算法详解

训练好模型后,采样(推理)是从噪声生成图像的过程。有多种采样算法,它们在速度和质量之间进行权衡。

采样器类型原理简介优点缺点典型代表
原始DDPM采样严格按照训练时的反向扩散过程,逐步去噪,步数多(如1000步)。生成质量高,理论保障强。速度极慢,计算成本高。DDPM Sampler
DDIM采样将扩散过程视为非马尔科夫的,允许在子序列时间步上进行确定性采样。大幅加速(20-50步可达不错效果),确定性采样便于插值。极低步数下质量可能下降。DDIM Sampler
PLMS/Heun属于高阶ODE求解器,利用多个历史点的信息估计下一步。在相同步数下,通常比DDIM质量更高。计算稍复杂,内存占用略高。PNDM, DPM-Solver
LCM/LoRA通过蒸馏技术或特定微调,让模型学会在极少数步数(4-8步)内生成。极致速度,适合实时应用。需要额外的训练过程,可能损失部分多样性或细节。LCM-LoRA

选择建议:对于追求最高质量的静态图像生成,可以使用DDIM或PLMS,步数设置在20-50。对于需要实时反馈的应用(如交互式绘图),则应考虑LCM等快速采样器。新手可以从DDIM,20-30步开始,这是一个很好的平衡点。

4.3 潜在扩散与计算优化

直接在像素空间(如256x256x3)进行扩散计算量巨大。Stable Diffusion的核心创新之一是引入了潜在扩散模型

  1. 编码器-解码器:首先,用一个预训练好的自编码器(如VAE)。编码器E将高分辨率图像x压缩到一个更低维的潜在空间z = E(x)。解码器D负责将潜在表示z重建回图像x ≈ D(z)
  2. 在潜在空间扩散:扩散过程(加噪/去噪)不再在像素空间进行,而是在这个低维的潜在空间z中进行。由于潜在空间维度小得多(例如,64x64x4),训练和推理的计算效率得到数十倍的提升
  3. 最终解码:采样完成后,得到去噪的潜在表示z₀,再用解码器D将其转换回高像素图像。

这种方法在几乎不损失视觉质量的前提下,极大地降低了资源门槛,是扩散模型能够普及的关键。

5. 常见问题与实战排坑指南

在实际研究和项目开发中,会遇到各种各样的问题。这里我总结了一些典型问题和解决方案。

5.1 训练过程中的不稳定与失败

训练扩散模型是一个复杂的过程,新手常会遇到训练损失震荡、生成结果全灰或全噪声的情况。

  1. 损失NaN或爆炸

    • 检查梯度:最常见的原因是梯度爆炸。解决方案是使用梯度裁剪。在训练循环中,在loss.backward()之后,optimizer.step()之前,加入torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)
    • 检查输入数据:确保输入图像的像素值被正确归一化到[-1, 1][0, 1],与模型期望的保持一致。一个错误的归一化会打乱整个学习过程。
    • 降低学习率:尝试使用更小的学习率(例如从1e-4降到5e-5),并使用学习率warmup策略。
  2. 生成图像模糊或缺乏细节

    • U-Net容量不足:模型太小,无法捕捉数据集的复杂分布。尝试增加U-Net的通道基数(如从64增加到128)或深度。
    • 噪声调度器问题:末端噪声太小(β_T接近0),可能导致模型在最后几步学习困难。尝试使用余弦调度器,它通常能保留更多高频细节。
    • 训练不充分:扩散模型需要很长的训练时间。确保训练步数足够(通常数十万到百万步)。监控损失曲线,确保其已经充分下降并趋于平缓。
  3. 模式崩溃与多样性不足:生成的图像看起来都差不多。

    • 检查条件信息泄露:在无条件或类别条件生成中,确保训练时条件标签是随机丢弃的(Classifier-Free Guidance中的dropout)。对于文生图,检查文本编码是否过于强势,导致模型忽略潜在变量的随机性。
    • 调整CFG尺度:Classifier-Free Guidance尺度过高会以提高保真度为代价牺牲多样性。尝试降低guidance_scale(如从7.5降到5.0)。

5.2 采样生成时的典型问题

即使模型训练好了,采样阶段参数设置不当也会导致糟糕的结果。

  1. 图像出现重复的网格状伪影或纹理

    • VAE解码问题:这是Stable Diffusion等潜在扩散模型中最常见的问题之一。伪影通常来自VAE解码器。解决方案是使用--no-half-vae参数(在FP32精度下运行VAE解码),或者寻找/训练更好的VAE模型。
    • 采样步数太少:当使用DDIM等加速采样器且步数设置过低(如<10步)时,可能导致去噪不充分,产生结构性错误。适当增加采样步数。
  2. 生成内容与提示词不符

    • 提示词工程:扩散模型对提示词非常敏感。尝试使用更具体、更具描述性的词语,并使用加权语法(如(best quality:1.2), (masterpiece:1.1), a cute cat)。负面提示词同样重要,用于排除不想要的特征(如blurry, ugly, deformed)。
    • CFG尺度:CFG尺度是控制提示词跟随强度的关键参数。太低则跟随弱,太高则图像饱和、颜色怪异。通常范围在5.0-15.0之间,需要针对不同模型微调。
  3. 生成速度太慢

    • 启用xFormers:如果使用PyTorch,安装并启用xFormers库可以显著优化注意力计算,提升速度并降低显存。
    • 使用更快的采样器:如前所述,从DDPM切换到DDIM或DPM-Solver++,可以用1/10的步数达到类似效果。
    • 考虑模型蒸馏:如果需要极速推理,可以寻找或自己训练LCM(潜在一致性模型)版本的LoRA,实现4-8步生成。

5.3 高级概念与技巧辨析

  1. Classifier-Free Guidance vs. Classifier Guidance

    • Classifier Guidance:早期技术,需要额外训练一个分类器p(y|x_t),在采样时用分类器的梯度来调整生成方向以符合条件y。它效果强但需要训练两个模型,且容易导致样本质量下降。
    • Classifier-Free Guidance:当前主流。它在训练时随机丢弃条件(以一定概率将条件置空),从而让同一个模型同时学会有条件生成和无条件生成。在采样时,通过外插有条件输出和无条件输出的方向,来放大条件的影响。CFG更简单、更稳定,是文生图模型的核心技术。其公式为:ε_guided = ε_uncond + guidance_scale * (ε_cond - ε_uncond)
  2. LoRA与模型微调

    • 全参数微调:更新整个U-Net的所有参数,效果好,但成本高,易过拟合,产出模型体积大。
    • LoRA:一种参数高效微调技术。它不在原始权重W上直接更新,而是注入一个低秩分解的适配器ΔW = A * B。训练时只更新AB这两个小矩阵,原始权重冻结。优点:训练快(快66%以上),显存要求低,产出的模型文件极小(几MB到几百MB),易于分享和组合。缺点:控制能力可能略弱于全微调,但对于风格迁移、主体定制等任务已完全足够。对于个人开发者和研究者,LoRA是首选的微调方案

从基于分数的模型提供的深刻理论洞察,到扩散模型给出的高效工程实践,这条技术路径完美地诠释了理论与应用结合的力量。我个人最深的一个体会是,理解“分数函数”这个核心概念,是解开一切疑惑的钥匙。它不仅仅是数学上的梯度,更是数据空间的“创造之力”,引导着随机噪声一步步蜕变为有意义的作品。在实际操作中,不要被复杂的数学符号吓倒,多动手训练几个小模型,调整一下采样步数和CFG尺度,观察生成结果的变化,这种直观感受往往比读十篇论文更能帮助你理解其中的精妙。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询