🚀 生成式模型底层原理通关笔记
目录
- DDPM:基于马尔可夫链的概率加降噪模型
- DDIM:打破马尔可夫链的确定性跳步采样模型
- 分数匹配 (Score Matching):高斯加噪下的高维引力场构建
- 流匹配 (Flow Matching):追求两点之间直线最短的速度场理论
1. DDPM (Denoising Diffusion Probabilistic Models)
📌 通俗易懂的比喻:磨砂骨灰级玩家
- 加噪(前向):把一尊完美的"雕像"通过 1000 步均匀地磨成一堆"沙子"。
- 去噪(反向):训练 AI 学会每一页"倒带"的动作,把这堆"沙子"一步步重新捏回"雕像"。
🧱 核心原理与数学逻辑
- 前向马尔可夫链 :每一步加噪严格依赖前一步(\(x_t\) 依赖 \(x_{t-1}\))。但利用高斯分布的叠加性,推导出了"一步到位"公式:
\x_t = \\sqrt{\\bar{\\alpha}_t} x_0 + \\sqrt{1 - \\bar{\\alpha}_t} \\epsilon \\
使得训练时不需要循环,可以直接算出任意第 \(t\) 步的脏图。
- 反向近似高斯:当每一步加的噪声极小时,反向回退的概率分布也近似为高斯分布。
- 神经网络的任务 :去噪时方差固定,AI(U-Net)唯一要做的就是预测这一步被强行加进去的高斯噪声 \(\epsilon\) 是什么。
📉 详细知识点 & Loss 计算
- 数据维度 (Shape) :以图片为例,输入
[3, 64, 64],网络输出同样是[3, 64, 64]的噪声预测矩阵。 - 损失函数 (Loss):
\\\text{Loss} = \\frac{1}{2} \\\| \\epsilon - \\epsilon_\\theta(x_t, t) \\\|\^2 \\
(大白话:AI 猜的噪声和上帝真实加进去的噪声做像素级对比,越接近越好。)
- 致命缺点:由于绑死在马尔可夫链上,画图(推理)时必须严格走完 1000 步,速度极慢。
2. DDIM (Denoising Diffusion Implicit Models)
📌 通俗易懂的比喻:睁眼跳楼梯
- DDPM 是闭着眼摸索,一步不敢跳;DDIM 是每走一步都掏出望远镜脑补一下一楼大门(原图 \(x_0\))在哪,然后直接从 900 级台阶一步大跨到 500 级台阶。
🧱 核心原理与数学逻辑
- 解耦马尔可夫链 :DDIM 巧妙地重新推导了前向公式,证明了反向去噪不一定非要绑死在前一步。
- 隔空脑补原图 \(\hat{x}_0\) :在第 900 步时,利用当前图 \(x_{900}\) 和 AI 预测的噪声 \(\epsilon_\theta\),强行反推出最终原图的粗糙轮廓 \(\hat{x}_0\)。
- 鸠占鹊巢(噪声近似) :核心关键点!用第 900 步预测的噪声,直接去顶替(近似)第 500 步的噪声 。虽然方向直接借用,但 DDIM 会根据第 500 步的既定配方,调整这个噪声的分量(权重大小)。
📉 详细知识点 & 核心特性
- 无缝复用:DDIM 不需要重新训练模型!它的 Loss 和 DDPM 完全一样,只需要在推理阶段换一套采样公式。
- 跳步采样 (Sub-sampling):将采样步数从 1000 步暴降到 20~50 步,速度提升几十倍。
- 确定性生成 (Deterministic) :将公式中的随机噪声项系数设为 0。输入相同的初始噪声,输出百分之百一模一样的图像。为图像精准编辑(如只换衣服不换脸)奠定了基础。
没问题,那我们就把分数匹配(Score Matching) 和流匹配(Flow Matching) 这两个绝对的数学硬核门派彻底扒开,从网络怎么搭、前向怎么算、Loss 怎么推、推理怎么走四个最硬核的维度,把所有隐藏的细节和公式完全补齐。
这份"地狱级详细版"笔记,绝对能满足你一键复制和深入死磕的需求。
3. 分数匹配 (Score Matching) ------ 引力场与能量模型的救赎
🧱 核心痛点与数学破局
早期的生成模型喜欢研究"概率密度函数" \(p(x)\)。但要让一个函数在数学上合法,它的总概率积分必须等于 1。这就强制在分母上加一个归一化常数(配分函数) \(Z_\theta\):
\p_\\theta(x) = \\frac{\\tilde{p}_\\theta(x)}{Z_\\theta} \\quad \\text{其中} \\quad Z_\\theta = \\int \\tilde{p}_\\theta(x) dx \\
在高维图片空间里,这个积分根本算不出来。
分数匹配的降维打击 :科学家对概率函数取对数,再对图片 \(x\) 求导。这个导数 \(\nabla_x \log p(x)\) 被定义为"分数(Score)"。
\\\nabla_x \\log p_\\theta(x) = \\nabla_x \\log \\tilde{p}_\\theta(x) - \\nabla_x \\log Z_\\theta \\
因为 \(Z_\theta\) 里面不含 \(x\),求导后直接变成 0 消失了!从此摆脱了分母的诅咒。
📥 详细的前向与训练细节(Denoising Score Matching)
由于真实图片分布 \(p_{data}(x)\) 是离散的样本点,无法直接求导。我们使用去噪分数匹配(DSM),人为制造连续分布。
1. 前向过程(数据搞破坏)
给定一张清晰的 [C, H, W] 图片 \(x_0\),我们从噪声池中随机选一个标准差 \(\sigma\)。然后采样一个标准高斯噪声 \(\epsilon \sim \mathcal{N}(0, I)\)。
将它们混合得到脏图 \(\tilde{x}\):
\\\tilde{x} = x_0 + \\sigma \\epsilon \\
此时,条件概率分布 \(p(\tilde{x}|x_0)\) 是一个以 \(x_0\) 为均值、\(\sigma^2\) 为方差的完美高斯分布:
\p(\\tilde{x}\|x_0) = \\frac{1}{(\\sqrt{2\\pi}\\sigma)\^d} \\exp\\left( -\\frac{\\\|\\tilde{x} - x_0\\\|\^2}{2\\sigma\^2} \\right) \\
2. 上帝视角标准答案的推导
我们对这个已知的高斯分布求条件分数(对 \(\tilde{x}\) 求导):
\\\nabla_{\\tilde{x}} \\log p(\\tilde{x}\|x_0) = \\nabla_{\\tilde{x}} \\left( -\\frac{\\\|\\tilde{x} - x_0\\\|\^2}{2\\sigma\^2} \\right) = -\\frac{\\tilde{x} - x_0}{\\sigma\^2} \\
因为 \(\tilde{x} - x_0 = \sigma \epsilon\),所以代入得到:
\\\nabla_{\\tilde{x}} \\log p(\\tilde{x}\|x_0) = -\\frac{\\sigma \\epsilon}{\\sigma\^2} = -\\frac{\\epsilon}{\\sigma} \\
这就是上帝视角的标准答案!它在空间上的维度是 [C, H, W],本质就是加进去的噪声取反,再除以标准差。
3. 神经网络结构与 Loss 计算
- 网络输入 :脏图 \(\tilde{x}\)
[Batch, C, H, W]和当前的噪声标量 \(\sigma\)。 - 网络结构 :通常是一个带有时间/噪声嵌入(Noise Embedding)的 U-Net。\(\sigma\) 会通过正弦位置编码(Sinusoidal Embedding)转成向量,像魔术棒一样注入到 U-Net 的每一个残差块中,用来提醒网络:"你现在面对的是哪个级别的迷雾"。
- 损失函数(包含所有系数的真实公式):
\\\mathcal{L}_{DSM}(\\theta) = \\mathbb{E}_{x_0, \\epsilon, \\sigma} \\left\[ \\frac{1}{2} \\lambda(\\sigma) \\left\\\| \\mathbf{s}_\\theta(\\tilde{x}, \\sigma) + \\frac{\\epsilon}{\\sigma} \\right\\\|\^2 \\right \]
(通常设置权重平衡系数 \(\lambda(\sigma) = \sigma^2\),Loss 公式可以进一步简化为:\(\frac{1}{2} \|\sigma \mathbf{s}_\theta(\tilde{x}, \sigma) + \epsilon \|^2\),这就和 DDPM 的预测噪声形式在数学上完全等价了!)
📤 详细的推理/生成细节(Langevin Dynamics)
训练完成后,神经网络 \(\mathbf{s}_\theta(x, \sigma)\) 变成了一个全能指南针。我们从纯高斯噪声 \(x_T \sim \mathcal{N}(0, I)\) 开始,使用退火朗之万动力学(Annealed Langevin Dynamics)倒数生成。
假设我们从噪声最大级别 \(\sigma_1\) 逐步降低到最小级别 \(\sigma_L\),在每个噪声级别下迭代 \(M\) 步:
python
# 伪代码级详细算法流
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
当两层循环结束,图片小球就顺着平滑的概率山坡,稳稳地停在了真实图片的聚集地 \(x_0\)。
4. 流匹配 (Flow Matching) ------ 速度场的终极艺术
🧱 核心痛点与数学破局
扩散模型和分数匹配都在和"高斯分布"死磕,导致粒子在空间中移动的轨迹是一条极其弯曲的几何曲线。
流匹配的降维打击 :抛弃复杂的概率图层演变,直接回归经典的连续介质力学(Continuity Equation) 。我们直接定义一个时间 \(t \in 0, 1\),定义一个生成速度场(Vector Field) \(v_\theta(x, t)\)。AI 的目标不是预测噪声,也不是预测斜坡,而是精准预测像素点在时间 \(t\) 时的移动速度向量。
📥 详细的前向与训练细节(Conditional Flow Matching)
1. 前向过程(最优传输直线插值)
流匹配最强悍的形态是最优传输流匹配(OT-Flow Matching) 。
给定真实图片 \(x_0\) [C, H, W] 和纯高斯噪声 \(x_1\) [C, H, W]。注意,这里的流向是从 \(x_0\)(0时刻)直线传送到 \(x_1\)(1时刻)。
我们定义任意中间时间 \(t\) 的直路线为:
\x_t = (1 - t)x_0 + t x_1 \\
这在数学上对应了一个精确的条件概率路径:
\p_t(x\|x_0) = \\mathcal{N}(x; (1-t)x_0, t\^2 I) \\
2. 上帝视角真实速度的推导
根据常微分方程(ODE)的定义,速度是位移对时间的导数。我们直接对上面的直线公式关于 \(t\) 求导:
\u_t(x\|x_0, x_1) = \\frac{d x_t}{d t} = \\frac{d}{d t} \\left\[ (1 - t)x_0 + t x_1 \\right = x_1 - x_0 \]
看清楚这个惊天细节了吗?! 真实的条件速度 \(u_t\) 是一个常数,与时间 \(t\) 毫无关系! 它就是一个死死指向终点的横截面直线向量 [C, H, W]。
3. 神经网络结构与 Loss 计算
- 网络输入 :混合糊图 \(x_t\)
[Batch, C, H, W]和时间标量 \(t \in 0, 1\)。 - 网络结构 :现代流匹配通常采用 Diffusion Transformer (DiT) 架构(如 SD3 和 Flux)。它把图片切成 Patch 变成 Token,把时间 \(t\) 做 Embedding 后作为 Modulation 信号去控制 Transformer Block 里的 LayerNorm 层,非常适合学习直线的长距离依赖。
- 损失函数(Flow Matching 真实核心公式):
\\\mathcal{L}_{CFM}(\\theta) = \\mathbb{E}_{t \\sim U(0,1), x_0, x_1} \\left\[ \\frac{1}{2} \\left\\\| v_\\theta(x_t, t) - (x_1 - x_0) \\\|\^2 \\right. \\right \]
(大白话:AI 看着 \(t\) 时刻的混淆图 \(x_t\),拼命去猜测那个由上帝手工拔河拉出来的直线速度 \(x_1 - x_0\)。)
📤 详细的推理/生成细节(ODE Vector Field Sampling)
生成阶段,时间反向流动,我们从 \(t = 1\)(纯噪声 \(x_1\))出发,一滴随机沙子都不加,使用纯确定性的常微分方程求解器(ODE Solver)直接向 \(t = 0\) 踩油门。
由于轨迹被大幅度拉直,我们可以使用最直观的欧拉法(Euler Method) ,只需要极少的步数(例如 \(N=10\) 步):
python
# 欧拉法极速生成流算法
x = sample_pure_noise([C, H, W]) # 从 t = 1.0 的噪声海出生
N = 10 # 总步数
dt = 1.0 / N # 每一步的时间跨度
for step in range(N):
# 1. 计算当前所处的时间点(从 1.0 倒扣到 0.0)
t_current = 1.0 - step * dt
# 2. 喂给 DiT 速度网络,求得当前位置的宏观速度场(Shape: [C, H, W])
# 刚出发时,网络预测的是"所有猫的平均速度";随着走动,速度会坍缩聚焦向某一只具体的猫
pred_velocity = network(x, t_current)
# 3. 顺着速度方向笔直向前滑行(因为反向,所以是减法)
x = x - dt * pred_velocity
🔍 为什么它能做到 4~10 步成画的终极秘密?
你之前提到的直觉非常致命:"随着不断的走,速度方向越来越倾向到具体的某一个 \(x_0\) 上"。
在数学上,如果模型训练完后,我们使用 Rectified Flow(流直化) :
第一次生成的配对是 \(x_1 \\rightarrow x_0\)。我们用这组已经配对好、终点完全锁定的数据重新算 Loss 训练一次。
这时候,在 \(t=1.0\) 的荒漠起点上,速度向量场不再是模糊的"合力",而是从一开始就被彻底掰直、精准指向那只特定黑猫的完美直线 。既然路线变成了真正的几何直线,欧拉法开车的步长 dt 就可以设得极大(比如 0.25,走 4 步),小球也能瞬间精准漂移进 \(x_0\) 的终点站。
💾 三大门派硬核全量对比表
| 维度 | DDPM (概率门派) | Score Matching (分数门派) | Flow Matching (流匹配门派) |
|---|---|---|---|
| 网络核心输出 | 噪声矩阵 \(\epsilon_\theta(x_t, t)\) | 分数向量 \(\mathbf{s}_\theta(x_t, \sigma)\) | 速度向量 \(v_\theta(x_t, t)\) |
| 前向插值轨迹 | \(\sqrt{\bar{\alpha}_t} x_0 + \sqrt{1 - \bar{\alpha}_t} \epsilon\) | \(x_0 + \sigma \epsilon\) | \((1 - t)x_0 + t x_1\) (纯直线) |
| 标准答案 (Target) | 随机高斯噪声 \(\epsilon\) | 条件分数 \(-\frac{\epsilon}{\sigma}\) | 条件速度 \(x_1 - x_0\) (时空常数) |
| 推理数学本质 | 随机马尔可夫链采样 | 朗之万动力学随机随机微分 (SDE) | 确定性常微分方程流 (ODE) |
| 商业大模型代表 | Stable Diffusion 1.5 / 2.1 | 早期 SMLD / 理论奠基 | Stable Diffusion 3 / Flux / Sora |