- 分数匹配 (Score Matching):高斯加噪下的高维引力场构建
- 流匹配 (Flow Matching):追求两点之间直线最短的速度场理论
1. DDPM (Denoising Diffusion Probabilistic Models) —— 概率流的单线传话
🧱 核心底层逻辑:马尔可夫链的微扰
DDPM 的本质是:利用一连串极小的条件高斯分布,去逼近一个复杂的、无法直接求解的图像生成分布。它包含一个将图片变模糊的“前向过程”和一个将噪声变清晰的“反向过程”。
📥 详细的前向过程(Forward Process)
前向过程不含任何需要训练的参数。我们人为设定一个噪声调度表(Noise Schedule):β1,β2,…,βT�1,�2,…,��(通常 T=1000�=1000,βt�� 从 0.00010.0001 线性或余弦递增到 0.020.02)。
定义 αt=1−βt��=1−��。
1. 单步迭代加噪
给定清晰图片 x0�0,每一步在前一步的基础上加上一点高斯噪声:
q(xt|xt−1)=N(xt;√1−βtxt−1,βtI)⟹xt=√αtxt−1+√1−αtϵt−1�(��|��−1)=�(��;1−����−1,���)⟹��=����−1+1−����−1
其中 ϵt−1∼N(0,I)��−1∼�(0,�)。
2. 重大数学技巧:“一步到位”推导
为了在训练时不需要从 11 循环迭代到 t�,我们利用高斯分布的独立可加性进行展开:
xt=√αtxt−1+√1−αtϵt−1��=����−1+1−����−1
把 xt−1=√αt−1xt−2+√1−αt−1ϵt−2 代入进去:把 ��−1=��−1��−2+1−��−1��−2 代入进去:
xt=√αtαt−1xt−2+√αt(1−αt−1)ϵt−2+√1−αtϵt−1��=����−1��−2+��(1−��−1)��−2+1−����−1
因为两个独立高斯分布相加:N(0,σ21I)+N(0,σ22I)=N(0,(σ21+σ22)I)�(0,�12�)+�(0,�22�)=�(0,(�12+�22)�),后面两项可以融合成一个新的高斯分布。
最终推导出了著名的重参数化一键加噪公式:
xt=√¯αtx0+√1−¯αtϵ��=�¯��0+1−�¯��
- 其中 ¯αt=∏ti=1αi�¯�=∏�=1���(所有 α� 的累乘)。ϵ∼N(0,I)�∼�(0,�) 是一整个总的高斯噪声。
- 数据维度 (Shape):x0,ϵ,xt�0,�,�� 都是
[Batch, C, H, W]。
📉 神经网络结构与 Loss 终极推导
1. U-Net 内部细节
- 输入:脏图 xt��
[B, C, H, W]和当前的时间步 t�(标量)。 - 时间嵌入 (Time Embedding):时间步 t� 会通过 Transformer 同款的正弦/余弦位置编码(Sinusoidal Position Embedding)变成一个一维向量,然后再通过两层多层感知机(MLP)映射到固定的维度(如 512 维)。
- 特征注入:在 U-Net 的每一个 Downsample/Upsample 的 Residual Block 中,这个时间向量会通过 Linear 层变换成 Scale 和 Shift 参数,通过类 AdaIN(自适应层归一化)的方式强行注入到图像特征中,指导网络:“现在是第几步去噪”。
2. Loss 函数的数学精简
DDPM 的原始数学目标是最大化变分下界(VLB)。经过复杂的 KL 散度推导后,科学家发现它在数学上等价于:让网络去预测前向公式里那个真正的随机噪声 ϵ�。
Lsimple(θ)=Et,x0,ϵ[12∥ϵ−ϵθ(xt,t)∥2]�������(�)=��,�0,�[12‖�−��(��,�)‖2]
- 代码视角的 Loss:
Loss = MSE_Loss(true_noise, network(x_t, t))。简练、优雅、稳定。
📤 DDPM 完整的采样生成算法(Inference)
推理是从纯噪声 xT∼N(0,I)��∼�(0,�) 倒数到 x0�0。因为去噪方差被设为了固定常数 σ2t=βt��2=��(或 ~βt�~�),网络需要计算均值并扣除噪声。
1. 核心数学回退公式
均值部分 μθ(xt,t)=1√αt(xt−βt√1−¯αtϵθ(xt,t))均值部分 ��(��,�)=1��(��−��1−�¯���(��,�))
xt−1=μθ(xt,t)+σtz��−1=��(��,�)+���
- 核心去噪项:从现在的脏图 xt�� 中减去放大了一定比例的垃圾噪声 ϵθ��,把图里的噪声硬生生扣掉。
- 缩放恢复项:除以 √αt��,把前向压缩的像素数值整体等比例放大恢复。
- 灵魂抖动项:σtz���(z∼N(0,I)�∼�(0,�)),每一步算完均值后重新洒上一撮微小的随机噪声,增加生成的多样性(当 t=1�=1 时 z=0�=0)。
2. 采样伪代码流程
# DDPM 推理算法流程 |
x = sample_standard_noise([Batch, C, H, W]) # 步骤 0:纯噪声出生 |
for t in range(1000, 0, -1): # 从 1000 倒数到 1 |
# 1. 网络看一眼当前的图,猜出里面藏了多少噪声 |
predicted_noise = network(x, t) |
# 2. 如果 t > 1,采样一个全新的随机高斯噪声作为“灵魂抖动”;t = 1 时 z = 0 |
z = sample_standard_noise([Batch, C, H, W]) if t > 1 else 0 |
# 3. DDPM 核心单步回退计算 |
alpha = 1 - beta[t] |
alpha_bar = alpha_bar_schedule[t] |
# 计算均值部分 (对应去噪与缩放) |
noise_scale = beta[t] / sqrt(1 - alpha_bar) |
x_mean = (1 / sqrt(alpha)) * (x - noise_scale * predicted_noise) |
# 最终更新:均值 + 随机方差抖动 |
x = x_mean + sqrt(beta[t]) * z |
2. DDIM (Denoising Diffusion Implicit Models) —— 确定性的非马尔可夫跳跃
🧱 核心底层革命:打破“必须看前一步”的魔咒
DDPM 慢在反向分布 p(xt−1|xt)�(��−1|��) 必须小步挪动。DDIM 的作者做了一个非常天才的数学证明:
前向加噪的一键到位概率 q(xt|x0)�(��|�0) 保持不变(这意味着 DDPM 训练出来的 U-Net 可以完全不改,直接拿来用)。但是,我们可以把反向条件概率修改为同时依赖 xt�� 和最初的原图 x0�0:q(xt−1|xt,x0)�(��−1|��,�0)。
因为引进了 x0�0,去噪轨迹变成了一条隐式的确定性通道,不再局限于马尔可夫链的单线传话。
📥 核心操作细节:隔空反推与重新勾兑
我们在任意指定的第 t� 步采样时,手里只有当前图 xt�� 和网络预测的噪声 ϵθ(xt,t)��(��,�)。
1. 第一步:隔空反推“临时原图” ^x0�^0
既然 xt=√¯αtx0+√1−¯αtϵ��=�¯��0+1−�¯��,我们把公式移项,用 AI 预测的噪声直接反推出原图的估计值:
^x0=xt−√1−¯αtϵθ(xt,t)√¯αt�^0=��−1−�¯���(��,�)�¯�
2. 第二步:重新勾兑出第 t−1�−1 步(或任意想跳到的前一步 tnext�����)
现在我们手里有 ^x0�^0(纯原图成分)和 ϵθ(xt,t)��(��,�)(指向噪声成分的方向)。DDIM 重新写出了通往任意前一步的配方公式:
xt−1=√¯αt−1^x0+√1−¯αt−1−σ2tϵθ(xt,t)+σtϵrand��−1=�¯�−1�^0+1−�¯�−1−��2��(��,�)+�������
- σt�� 是关键阀门。当 σt=√1−¯αt−11−¯αt√1−¯αt¯αt−1��=1−�¯�−11−�¯�1−�¯��¯�−1 时,此公式完全等价于 DDPM。
- 当σt=0��=0时(DDIM 核心模式),后面的随机抖动 ϵrand����� 直接清零!用当前预测的噪声方向直接顶替(鸠占鹊巢)了下一步的噪声方向,仅仅通过公式系数来调整噪声的分量权重。
📤 DDIM 的跳步采样算法(Sub-sampling)
因为公式支持跨步,我们不需要走完 1000 步。我们可以自己定义一个子序列,比如[1000, 950, 900, ..., 50],总共只走 20 步。
以下是 σt=0��=0(完全确定性流)下的 DDIM 采样伪代码:
# DDIM 极速确定性采样算法 |
x = sample_standard_noise([Batch, C, H, W]) # 步骤 0:由初始随机种子固定的一堆沙子 |
# 自定义跳步序列,例如从 1000 开始,每步跨 50 直至 0 |
time_steps = [1000, 950, 900, 850, ..., 50, 0] |
for i in range(len(time_steps) - 1): |
t = time_steps[i] |
t_next = time_steps[i+1] # 想要一步跨到的下一个稍微清爽一点的台阶 |
alpha_bar_t = alpha_bar_schedule[t] |
alpha_bar_next = alpha_bar_schedule[t_next] |
# 1. 喂给 DDPM 训练好的网络,拿到当前步的预测噪声 |
pred_noise = network(x, t) |
# 2. 核心数学解构:隔空脑补原图 x0_hat |
x0_hat = (x - sqrt(1 - alpha_bar_t) * pred_noise) / sqrt(alpha_bar_t) |
# 3. 核心数学重构:利用 t_next 的配方比例,强行重新勾兑出下一幅图 |
# 此时预测噪声直接“鸠占鹊巢”,充当了 t_next 步的噪声分量 |
pred_dir_x = sqrt(1 - alpha_bar_next) * pred_noise |
x = sqrt(alpha_bar_next) * x0_hat + pred_dir_x # 零随机性,轨迹完全固定 |
💾 扩散两大大门派全细节对比备忘
| 维度 | DDPM (概率单线流) | DDIM (隐式确定流) |
|---|---|---|
| 训练过程 | 正常加噪训练(一键加噪法) | 完全不需要训练!直接抢 DDPM 的模型来跑 |
| 反向轨迹依赖 | 马尔可夫链(xt−1��−1 必须死绑在 xt�� 上) | 非马尔可夫链(通过估算 ^x0�^0 强行打通时空跨度) |
| 采样步数 | 固定 1000 步左右,无法跳跃 | 自定义子序列(20~50 步即可极速成画) |
| 随机项系数 σt�� | 固定常数(每一步回退都故意加上高斯抖动) | 设为 0(彻底抹除随机性,变为确定性 ODE 轨迹) |
| 输入相同噪声的结果 | 每次生成的图片由于一路上都在随机抖动,完全不同 | 生成的图片百分之百唯一确定,路径被死死锁死 |
3. 分数匹配 (Score Matching) —— 引力场与能量模型的救赎
🧱 核心痛点与数学破局
早期的生成模型喜欢研究“概率密度函数” p(x)�(�)。但要让一个函数在数学上合法,它的总概率积分必须等于 1。这就强制在分母上加一个归一化常数(配分函数) Zθ��:
pθ(x)=~pθ(x)Zθ其中Zθ=∫~pθ(x)dx��(�)=�~�(�)��其中��=∫�~�(�)��
在高维图片空间里,这个积分根本算不出来。
分数匹配的降维打击:科学家对概率函数取对数,再对图片 x� 求导。这个导数 ∇xlogp(x)∇�log�(�) 被定义为“分数(Score)”。
∇xlogpθ(x)=∇xlog~pθ(x)−∇xlogZθ∇�log��(�)=∇�log�~�(�)−∇�log��
因为 Zθ�� 里面不含 x�,求导后直接变成 0 消失了!从此摆脱了分母的诅咒。
📥 详细的前向与训练细节(Denoising Score Matching)
由于真实图片分布 pdata(x)�����(�) 是离散的样本点,无法直接求导。我们使用去噪分数匹配(DSM),人为制造连续分布。
1. 前向过程(数据搞破坏)
给定一张清晰的[C, H, W]图片 x0�0,我们从噪声池中随机选一个标准差 σ�。然后采样一个标准高斯噪声 ϵ∼N(0,I)�∼�(0,�)。
将它们混合得到脏图 ~x�~:
~x=x0+σϵ�~=�0+��
此时,条件概率分布p(~x|x0)�(�~|�0) 是一个以 x0�0 为均值、σ2�2 为方差的完美高斯分布:
p(~x|x0)=1(√2πσ)dexp(−∥~x−x0∥22σ2)�(�~|�0)=1(2��)�exp(−‖�~−�0‖22�2)
2. 上帝视角标准答案的推导
我们对这个已知的高斯分布求条件分数(对 ~x�~ 求导):
∇~xlogp(~x|x0)=∇~x(−∥~x−x0∥22σ2)=−~x−x0σ2∇�~log�(�~|�0)=∇�~(−‖�~−�0‖22�2)=−�~−�0�2
因为 ~x−x0=σϵ�~−�0=��,所以代入得到:
∇~xlogp(~x|x0)=−σϵσ2=−ϵσ∇�~log�(�~|�0)=−���2=−��
这就是上帝视角的标准答案!它在空间上的维度是[C, H, W],本质就是加进去的噪声取反,再除以标准差。
3. 神经网络结构与 Loss 计算
- 网络输入:脏图 ~x�~
[Batch, C, H, W]和当前的噪声标量 σ�。 - 网络结构:通常是一个带有时间/噪声嵌入(Noise Embedding)的 U-Net。σ� 会通过正弦位置编码(Sinusoidal Embedding)转成向量,像魔术棒一样注入到 U-Net 的每一个残差块中,用来提醒网络:“你现在面对的是哪个级别的迷雾”。
- 损失函数(包含所有系数的真实公式):
LDSM(θ)=Ex0,ϵ,σ[12λ(σ)∥∥sθ(~x,σ)+ϵσ∥∥2]����(�)=��0,�,�[12�(�)‖��(�~,�)+��‖2]
(通常设置权重平衡系数 λ(σ)=σ2�(�)=�2,Loss 公式可以进一步简化为:12∥σsθ(~x,σ)+ϵ∥212‖���(�~,�)+�‖2,这就和 DDPM 的预测噪声形式在数学上完全等价了!)
📤 详细的推理/生成细节(Langevin Dynamics)
训练完成后,神经网络 sθ(x,σ)��(�,�) 变成了一个全能指南针。我们从纯高斯噪声 xT∼N(0,I)��∼�(0,�) 开始,使用退火朗之万动力学(Annealed Langevin Dynamics)倒数生成。
假设我们从噪声最大级别 σ1�1 逐步降低到最小级别 σL��,在每个噪声级别下迭代 M� 步:
# 伪代码级详细算法流 |
x = sample_pure_noise([C, H, W]) # 步骤 0:随机出生 |
for sigma in [sigma_1, sigma_2, ..., sigma_L]: # 从大噪到小噪 |
step_size = epsilon_step * (sigma / sigma_L)**2 # 根据当前噪声动态调整步长 |
for m in range(M): # 在当前迷雾级别下修正 M 步 |
# 1. 网络观测,输出引力场(Shape: [C, H, W]) |
score = network(x, sigma) |
# 2. 采样一撮全新的微弱高斯噪声,用于注入灵魂(Shape: [C, H, W]) |
z = sample_standard_noise([C, H, W]) |
# 3. 朗之万核心更新公式 |
# 确定性降噪项:顺着引力走;随机探索项:揉入微小随机沙子防止死板 |
x = x + 0.5 * step_size * score + sqrt(step_size) * z |
当两层循环结束,图片小球就顺着平滑的概率山坡,稳稳地停在了真实图片的聚集地 x0�0。
4. 流匹配 (Flow Matching) —— 速度场的终极艺术
🧱 核心痛点与数学破局
扩散模型和分数匹配都在和“高斯分布”死磕,导致粒子在空间中移动的轨迹是一条极其弯曲的几何曲线。
流匹配的降维打击:抛弃复杂的概率图层演变,直接回归经典的连续介质力学(Continuity Equation)。我们直接定义一个时间 t∈[0,1]�∈[0,1],定义一个生成速度场(Vector Field)vθ(x,t)��(�,�)。AI 的目标不是预测噪声,也不是预测斜坡,而是精准预测像素点在时间 t� 时的移动速度向量。
📥 详细的前向与训练细节(Conditional Flow Matching)
1. 前向过程(最优传输直线插值)
流匹配最强悍的形态是最优传输流匹配(OT-Flow Matching)。
给定真实图片 x0�0[C, H, W]和纯高斯噪声 x1�1[C, H, W]。注意,这里的流向是从 x0�0(0时刻)直线传送到 x1�1(1时刻)。
我们定义任意中间时间 t� 的直路线为:
xt=(1−t)x0+tx1��=(1−�)�0+��1
这在数学上对应了一个精确的条件概率路径:
pt(x|x0)=N(x;(1−t)x0,t2I)��(�|�0)=�(�;(1−�)�0,�2�)
2. 上帝视角真实速度的推导
根据常微分方程(ODE)的定义,速度是位移对时间的导数。我们直接对上面的直线公式关于 t� 求导:
ut(x|x0,x1)=dxtdt=ddt[(1−t)x0+tx1]=x1−x0��(�|�0,�1)=�����=���[(1−�)�0+��1]=�1−�0
看清楚这个惊天细节了吗?!真实的条件速度 ut��是一个常数,与时间 t� 毫无关系!它就是一个死死指向终点的横截面直线向量[C, H, W]。
3. 神经网络结构与 Loss 计算
- 网络输入:混合糊图 xt��
[Batch, C, H, W]和时间标量 t∈[0,1]�∈[0,1]。 - 网络结构:现代流匹配通常采用Diffusion Transformer (DiT)架构(如 SD3 和 Flux)。它把图片切成 Patch 变成 Token,把时间 t� 做 Embedding 后作为 Modulation 信号去控制 Transformer Block 里的 LayerNorm 层,非常适合学习直线的长距离依赖。
- 损失函数(Flow Matching 真实核心公式):
LCFM(θ)=Et∼U(0,1),x0,x1[12∥∥vθ(xt,t)−(x1−x0)∥2]����(�)=��∼�(0,1),�0,�1[12‖��(��,�)−(�1−�0)‖2]
(大白话:AI 看着 t� 时刻的混淆图 xt��,拼命去猜测那个由上帝手工拔河拉出来的直线速度 x1−x0�1−�0。)
📤 详细的推理/生成细节(ODE Vector Field Sampling)
生成阶段,时间反向流动,我们从 t=1�=1(纯噪声 x1�1)出发,一滴随机沙子都不加,使用纯确定性的常微分方程求解器(ODE Solver)直接向 t=0�=0 踩油门。
由于轨迹被大幅度拉直,我们可以使用最直观的欧拉法(Euler Method),只需要极少的步数(例如 N=10�=10 步):