生成式模型底层原理通关笔记

🚀 生成式模型底层原理通关笔记

目录

  1. DDPM:基于马尔可夫链的概率加降噪模型
  2. DDIM:打破马尔可夫链的确定性跳步采样模型
  3. 分数匹配 (Score Matching):高斯加噪下的高维引力场构建
  4. 流匹配 (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