简介:扩散模型是一类通过“逐步加噪与学习去噪”实现数据生成的深度生成模型。本文拆解前向扩散与反向去噪的数学原理,剖析噪声调度、时间步嵌入、分数预测、条件引导、潜空间加速与采样器等关键机制,说明训练稳定、多样性与可控性背后的技术逻辑,并梳理工程落地要点与常见误区。
扩散模型(Diffusion模型,亦译扩散模型)是一类以“去噪”为核心的深度生成模型。它的基本假设是:任何复杂的数据分布,都可以看作对纯随机噪声逐步施加大量微小扰动后的结果。反过来,只要学会“把噪声一步步擦掉”,就能从随机噪声中“生长”出符合数据分布的新样本。
围绕这一思想,本文重点回答四个问题:
在适用范围上,扩散模型最初在图像生成领域取得突破,目前已被推广到视频、3D内容、音频、文本、分子结构等领域。图像修复、超分辨率、图像编辑等任务,也大多是在同一原理上做条件化改造。因此,理解其底层机制具有通用价值。
生成建模的目标是:给定一批训练样本,学习一个能逼近真实数据分布的模型,并从中采样出新样本。主流路线包括生成对抗网络、变分自编码器、自回归模型和基于可逆变换的流模型,各自都有局限:
扩散模型换了一个思路:不再让网络“一次性学会从噪声到数据”的复杂映射,而是把它拆成许多规模相近的子任务。每个子任务只需判断“当前样本中含有多少噪声、噪声长什么样”。子任务局部、简单、目标明确,可以用回归损失端到端训练,因此训练更稳定,也更容易随数据量和模型规模扩展。
从更深层的数学视角看,扩散模型学习的是数据分布的对数密度梯度,即“分数”(score),再用类似朗之万动力学的迭代过程把样本推向高密度区域。基于分数的生成建模与去噪扩散建模正是在这一点上殊途同归:预测噪声,本质上就是在估计分数。
一个完整的扩散生成系统,可以按通用分层视角拆解如下:
| 层级 | 主要模块 | 职责 |
|---|---|---|
| 数据与编码层 | 数据预处理、质量过滤、感知编码器/解码器 | 统一数据格式,把高维数据映射为更适合扩散的表示 |
| 扩散主干层 | U形编码-解码网络、残差块、自注意力/交叉注意力、时间步嵌入模块 | 核心去噪网络,预测当前样本中的噪声 |
| 调度与采样层 | 噪声调度器、采样器、随机数发生器 | 控制加噪强度与反向迭代方式 |
| 条件注入层 | 文本编码器、标签嵌入、结构条件分支 | 把外部控制信号送入主干网络 |
| 训练与优化层 | 损失函数、优化器、分布式训练策略 | 参数更新与模型收敛控制 |
| 工程服务层 | 接入与鉴权、任务调度、模型服务、监控告警 | 把模型能力封装为可稳定调用的服务 |
各模块的职责与协作方式如下:
(一)训练流程:学会“认噪声”
(二)生成流程:从噪声中“长出”样本
从状态变化看,样本在反向过程中的“信噪比”单调上升:早期决定大尺度布局,中期形成物体轮廓,后期补充纹理细节。这也是“扩散过程先定结构、后补细节”这一经验现象的根源。
(一)前向加噪:一条可控的马尔可夫链
前向过程被定义为一条马尔可夫链:
q(xt | x{t-1}) = N( xt ; √(1−β_t)·x{t-1}, β_t·I )
其含义是:每一步先对样本做轻微缩放,再加入强度为β_t的高斯噪声。调度序列{β_t}控制加噪速度,常用两种设计:
前向过程的关键性质是“一步可采样”。利用重参数化,并把各步的缩放与噪声系数累乘,可得闭式解:
令 α_t = 1−β_t,ᾱ_t = α_1·α_2·…·α_t,则
q(x_t | x_0) = N( x_t ; √(ᾱ_t)·x_0, (1−ᾱ_t)·I ),即 x_t = √(ᾱ_t)·x_0 + √(1−ᾱ_t)·ε,其中 ε ~ N(0, I)
这个公式的意义在于:
(二)反向去噪:为什么可以用神经网络预测
理论上,反向过程应满足贝叶斯公式 q(x{t-1} | x_t) = q(x_t | x{t-1})·q(x{t-1}) / q(x_t)。但其中的 q(x{t-1}) 与 q(x_t) 正是未知的、难以直接计算的数据分布,所以反向过程必须“学”出来。
在线性高斯假设下,可以证明:若已知原始样本x_0,则反向条件分布仍是高斯分布。于是网络只需预测均值与方差,即可近似整条反向链。进一步地,用“先估计x_0、再计算均值”的思路,可以把均值重写为:
μθ(x_t, t) = (1/√α_t) · ( x_t − β_t / √(1−ᾱ_t) · εθ(x_t, t) )
可以看到:网络的实际工作就是“从带噪样本中辨认出混进去的噪声”。若把方差固定为常数(如与β_t成比例),训练目标经过简化与重加权后,就得到业界广泛使用的基础损失:
L = E{x_0, t, ε} [ ‖ ε − εθ( √(ᾱ_t)·x_0 + √(1−ᾱ_t)·ε, t ) ‖² ]
这个损失有三个特点:
(三)分数视角:预测噪声等于估计分布梯度
带噪样本的对数密度对自身的梯度,就是该时刻的“分数”。对闭式解两边取对数并求导,可得:
∇{x_t} log q(x_t) ≈ − εθ(x_t, t) / √(1−ᾱ_t)
也就是说,分数与噪声预测只差一个由调度决定的比例系数。这解释了为什么两类看似不同的建模方式在数学上殊途同归:
理解这一点有两个实践价值:
(四)时间步条件:让一个网络应对所有噪声水平
不同时间步的噪声强度相差极大:早期样本几乎是干净的,末期样本几乎与纯噪声无异。如果要求同一网络输出相同语义的预测,就必然产生冲突。
解决办法是把时间步编码为向量(常用不同频率的正弦函数,再经多层映射得到时间嵌入),并注入到主干网络的各个层级。这样网络实际学习的是一族“按噪声水平切换”的去噪函数,参数共享,行为分化。
(五)条件控制:从“随机生成”到“按需生成”
无条件的扩散模型只能生成“像训练数据”的样本,无法指定内容。条件化通过两种方式实现:
值得注意的是,为提高训练效率,条件编码通常在训练前预先算好并缓存,推理阶段通常不重新编码。
更关键的是无分类器引导:训练时以一定概率(例如约10%)把条件置空,使同一个网络同时具备“有条件预测”和“无条件预测”能力。推理时按如下方式组合:
ε̂ = εθ(x_t, t, ∅) + w · [ εθ(xt, t, c) − εθ(x_t, t, ∅) ]
其原理是:把无条件预测作为基准,把“条件带来的差异”放大w倍。直观地说,每去噪一步都更坚决地朝“符合条件”的方向前进。
局部控制也是同样的思路:给主干网络增加一条控制分支,把边缘图、深度图、姿态骨架或人工绘制的草图编码后逐层注入,引导生成结果的空间结构。图像修复则只需在每一步把“已知区域”按掩码写回当前样本,让模型只负责补全未知部分。
(六)潜空间扩散:效率提升从何而来
直接在像素空间做扩散,计算量随分辨率增长很快。卷积运算的开销大致与“像素数×通道数”成正比;注意力模块的计算量与空间位置数的平方成正比,增长更快。
以分辨率512×512、通道数为3的图像为例:直接扩散时,每一步都要处理约78.6万个元素。若先做8倍下采样,并映射到4通道潜表示,元素数只有64×64×4 = 1.6万余个,约为原来的1/48。整条去噪链都要重复这一步计算,节省的开销相当可观。
需要注意的是,感知编码器/解码器会引入一定重建损失。小文字、锐利边缘、规则纹理等高频细节,可能在编码环节就被削弱。因此,潜空间扩散在效率上的收益,有一部分来自“牺牲了部分高频保真度”。
(七)采样加速:从上千步到几十步
反向过程是串行的:第t步的结果必须算完,才能进入第t−1步。这使它成为推理延迟的主要来源。业界常见的加速手段可归为四类:
(八)可复现性:随机性从哪里来
扩散生成包含两类随机性:
因此实践中普遍引入随机种子:固定种子、模型版本、调度与采样器配置后,结果可以近似复现。但在不同实现、不同硬件、不同数值精度下,结果可能有细微差异。
(一)噪声调度的数值直觉
以下以T=1000、线性调度为例,列出代表性时刻的近似值(仅作直觉示意):
| 时间步t | 累计保留系数ᾱ_t | 信号系数√(ᾱ_t) | 噪声系数√(1−ᾱ_t) | 状态 |
|---|---|---|---|---|
| 1 | ≈1.000 | ≈1.000 | ≈0.007 | 几乎无噪声,预测目标接近0 |
| 500 | ≈0.05 | ≈0.23 | ≈0.97 | 结构可辨,细节被严重破坏 |
| 800 | ≈0.0035 | ≈0.06 | ≈0.998 | 只剩粗略明暗与轮廓 |
| 1000 | ≈0.00004 | ≈0.007 | ≈1.000 | 已接近纯噪声 |
从表中可以看出:信号系数单调下降,噪声系数单调上升;到末期,原始信息几乎被淹没,但仍有极微弱的信号残存。网络正是在这条轨迹上,学习“在不同噪声水平下该往哪个方向去噪”。
(二)训练与采样伪代码
# ---------- 训练(单步) ----------输入: 原始样本 x0(或潜表示), 条件 c, 网络 net, 调度表 ᾱ, 空条件概率 p_drop1. t ~ Uniform{1, ..., T} # 随机采样时间步2. ε ~ N(0, I) # 采样真实噪声3. x_t = sqrt(ᾱ[t]) * x0 + sqrt(1 - ᾱ[t]) * ε # 一步得到带噪样本4. c_eff = ∅ (以概率 p_drop) 否则 c # 条件随机置空,支持无分类器引导5. ε_pred = net(x_t, t, c_eff) # 预测噪声6. loss = mean((ε_pred - ε)^2) # 回归损失7. 反向传播并更新参数# ---------- 采样(祖先采样 + 无分类器引导) ----------输入: 网络 net, 条件 c, 引导系数 w, 随机种子, 采样步数1. x ~ N(0, I) # 起点:纯高斯噪声2. for t = T, T-1, ..., 1:3. ε_uncond = net(x, t, ∅) # 无条件预测4. ε_cond = net(x, t, c) # 有条件预测5. ε_hat = ε_uncond + w * (ε_cond - ε_uncond) # 引导6. x0_hat = (x - sqrt(1 - ᾱ[t]) * ε_hat) / sqrt(ᾱ[t]) # 估计干净样本7. μ = (1 / sqrt(α[t])) * (x - (β[t] / sqrt(1 - ᾱ[t])) * ε_hat)8. 若 t > 1: x = μ + σ[t] * z,其中 z ~ N(0, I) # 注入随机性9. 否则: x = μ10. 输出: 解码(x) # 潜空间扩散时经解码器还原
(三)采样路径的直觉
可以把去噪过程理解为“沿分数方向下山”:
这也解释了为什么调整引导系数、改变随机种子,最容易改变“生成什么”;而调整步数,更多影响“细节是否完整”。
优势及其原理来源
| 优势 | 原理来源 |
|---|---|
| 训练稳定 | 固定前向过程 + 噪声回归目标,不涉及生成器与判别器的动态博弈 |
| 样本多样、模式覆盖较好 | 从随机噪声出发,反向过程保留随机性,不易只收敛到少数模式 |
| 可控性强 | 时间步与条件的双通道注入,配合无分类器引导 |
| 中间结果可解释 | 每个时刻样本都是“带噪数据”,信噪比与信号成分可读 |
| 衍生能力强 | 反向过程是通用迭代框架,替换条件或加约束,即可得到修复、超分、编辑等任务 |
局限与边界条件
(一)分层服务架构
(二)性能机制
(三)稳定性机制
(四)安全与合规机制
这些通用能力可以部署在公有云或企业自有环境中。例如,百度智能云提供的容器平台、对象存储、消息队列、监控告警等通用产品能力,可以作为承载此类推理服务的工程选项。
扩散模型的本质,是把“生成复杂数据”这一难题,拆分为“在每一个噪声水平下预测噪声”的一系列简单回归子任务:
对开发者而言,掌握这些机制的意义在于:调参不再靠试错,而是知道每个参数在改变哪一段过程;做性能优化时,能准确判断瓶颈在编码、主干计算还是串行采样;设计系统时,也能围绕串行推理、结果不确定、显存占用大等固有特征,做出合理的架构选择。