Diffusion 到 Flow Matching ( 从 DDPM 到 Stable Diffusion ) 丝滑入门

第 1 部分:扩散模型 (Diffusion Models)

1.1 核心概念:模拟"破坏-修复"

扩散模型 (Diffusion Model) 是一类深度生成模型,其灵感来源于物理学中的扩散过程(比如墨水滴入水中)。

它的核心思想是模拟两个相反的过程:

  • ① 正向扩散 (Forward Process - 破坏):

    • 这是一个固定的、无可学习参数的过程。
    • 它从一张干净的原始数据(如图像 x0x_0x0)出发,在 TTT 个时间步中,逐步、迭代地向图像中添加高斯噪声。
    • 直到第 TTT 步,图像 xTx_TxT 变得几乎等同于纯粹的随机噪声。
  • ② 反向扩散 (Reverse Process - 修复):

    • 这是模型真正学习的部分。
    • 模型(通常是一个 U-Net)的任务是逆转上述过程:从纯噪声 xTx_TxT 开始,一步步地、迭代地去除噪声。
    • 经过 TTT 步去噪后,模型应该能"修复"或"雕刻"出一张清晰的、符合原始数据分布的图像 x0x_0x0。

1.2 学习机制:一种特殊的"监督学习"

Diffusion 和 Flow Matching 本质上都是一种特殊的监督学习

它们与传统监督学习(如分类)不同,它们监督的不是最终的"类别标签",而是**"转换过程"本身**。它们是"以数据分布为目标的、高维的、基于回归的监督学习"。

  • 监督目标 (GT) 是什么?

    • 在训练时,我们拿一张干净图片 x0x_0x0,随机选择一个时间步 ttt,并加入一个已知的、随机生成的精确噪声 ϵ\epsilonϵ 得到带噪图 xtx_txt。
    • 这个已知的噪声 ϵ\epsilonϵ 就是我们要监督的"地面真相"(Ground Truth, GT)
  • 监督形式 (损失函数):

    • 模型 ϵθ(xt,t)\epsilon_\theta(x_t, t)ϵθ(xt,t) 的任务就是输入带噪图 xtx_txt 和时间 ttt,然后预测出这个 ϵ\epsilonϵ。
    • 损失函数就是均方误差 (MSE)
      L∝∣∣ϵ−ϵθ(xt,t)∣∣2L \propto ||\epsilon - \epsilon_\theta(x_t, t)||^2L∝∣∣ϵ−ϵθ(xt,t)∣∣2
    • 这本质上就是一个回归任务 :模型被训练去回归(预测)那个我们事先知道的、用来"破坏"数据的噪声 ϵ\epsilonϵ。
  • 对比 Flow Matching:

    • Flow Matching 也是同样的逻辑,但它监督的是**"瞬时速度"**。
    • GT 是理论上从噪声导向数据的精确速度向量 v(xt,t)v(x_t, t)v(xt,t)。
    • 损失函数是 L∝∣∣v−vθ(xt,t)∣∣2L \propto ||v - v_\theta(x_t, t)||^2L∝∣∣v−vθ(xt,t)∣∣2。

1.3 记忆载体:U-Net 的权重

模型的"记忆",即它对数据分布(如猫的形状、纹理、结构)的所有知识,绝大部分都集中在 U-Net 的权重中

这个 U-Net 的结构非常特别,完美地执行了"噪声预测"这个回归任务:

  • 输入: 带噪图像 xtx_txt (如 64x64x3) + 时间嵌入 ttt。
  • 1. 编码器 (Encoder / 下采样):
    • U-Net 的前半部分通过卷积和池化,将高维(大尺寸、少通道)的图像压缩成低维(小尺寸、多通道)的特征图。
    • 例如,从 64x64x3 逐步压缩到 8x8x512。
    • 这一步是为了提取图像的抽象语义特征
  • 2. 解码器 (Decoder / 上采样):
    • U-Net 的后半部分通过反卷积或上采样,将低维特征图逐步还原回高维图像。
    • 例如,从 8x8x512 逐步还原到 64x64x3。
    • 这一步是为了恢复图像的细节
  • 3. 跨层连接 (Skip Connections):
    • 这是 U-Net 的精髓。它将编码器中(浅层、高分辨率)的特征图"跳过"并直接添加到解码器对应的层上。
    • 这确保了模型在还原图像时,不会丢失精细的细节和纹理。
  • 输出: 预测的噪声 ϵθ\epsilon_\thetaϵθ (尺寸与输入 xtx_txt 完全相同,如 64x64x3)。

1.4 关键机制:时间步 (类 RNN 循环)

U-Net 像 RNN 是非常精辟的比喻。它在两个方面区别于传统的网络:

  • 1. 参数共享 (像 RNN):

    • 传统的编码器-解码器,每一层都是独立学习的。
    • 而 Diffusion Model 只使用一个 U-Net ,并在所有 TTT 个时间步中共享同一套参数
    • 在**推理(生成)**阶段,模型会从 t=Tt=Tt=T 到 t=0t=0t=0 循环调用这个固定的 U-Net。
  • 2. 时间嵌入 (Time Embedding):

    • 问题: 既然是同一套 U-Net 权重,它如何知道自己当前处于哪个时间步?(例如,t=999t=999t=999 时应大刀阔斧去噪,而 t=10t=10t=10 时应精细修饰)。
    • 答案: 我们把时间步 ttt 作为一个额外的输入
    • ttt 通常被编码为一个高维向量(使用正弦/余弦位置编码),这个"时间嵌入"被深度融入到 U-Net 的每一个残差块和注意力层中。
    • 作用: 告诉 U-Net "现在循环到哪一步了",使其能够根据当前进度动态调整关注点(例如,早期关注整体结构,晚期关注细节)。

重要贡献: 原始的扩散模型 [NIPS 2015] 表现不佳。而 DDPM [NeurIPS 2020] 作为"开山之作",其一大贡献就是系统性地阐述了这种"时间嵌入"对于共享参数的 U-Net 的重要性,并证明了只学习均值(预测噪声 ϵ\epsilonϵ)就足够了。

1.5 综合实例:"监督"一只猫的生成

目标: 训练 U-Net ϵθ\epsilon_\thetaϵθ 学会从噪声中还原出猫。

一次训练迭代 (Training Step):

  1. 准备数据: 从数据集中取一张清晰的猫图 x0x_0x0。
  2. 制造"监督数据对": 随机抽取几个时间步 ttt 和几个高斯噪声 ϵ\epsilonϵ。
    • 样本 A (t=999):
      • 输入: x0x_0x0 + 99.9% 的已知噪声 ϵA\epsilon_AϵA →\rightarrow→ 得到 x999x_{999}x999 (几乎纯噪声)。
      • GT 标签: ϵA\epsilon_AϵA。
    • 样本 B (t=500):
      • 输入: x0x_0x0 + 50% 的已知噪声 ϵB\epsilon_BϵB →\rightarrow→ 得到 x500x_{500}x500 (中度噪声)。
      • GT 标签: ϵB\epsilon_BϵB。
    • 样本 C (t=100):
      • 输入: x0x_0x0 + 10% 的已知噪声 ϵC\epsilon_CϵC →\rightarrow→ 得到 x100x_{100}x100 (轻微噪声)。
      • GT 标签: ϵC\epsilon_CϵC。
  3. 模型预测与监督 (计算损失):
    • 对于样本 A (t=999):
      • 模型计算:ϵpred_A=ϵθ(x999,t=999)\epsilon_{pred\A} = \epsilon\theta(x_{999}, t=999)ϵpred_A=ϵθ(x999,t=999)。
      • 计算损失:LA=∣∣ϵA−ϵpred_A∣∣2L_A = ||\epsilon_A - \epsilon_{pred\_A}||^2LA=∣∣ϵA−ϵpred_A∣∣2。
      • 模型学习: 从一团混沌中找到最微弱的"猫"的结构痕迹。这是创造力和多样性的来源,因为模型学会了应对任何随机噪声起点。
    • 对于样本 B (t=500):
      • 模型计算:ϵpred_B=ϵθ(x500,t=500)\epsilon_{pred\B} = \epsilon\theta(x_{500}, t=500)ϵpred_B=ϵθ(x500,t=500)。
      • 计算损失:LB=∣∣ϵB−ϵpred_B∣∣2L_B = ||\epsilon_B - \epsilon_{pred\_B}||^2LB=∣∣ϵB−ϵpred_B∣∣2。
      • 模型学习: 在大量噪声中识别出猫的宏观结构和轮廓
    • 对于样本 C (t=100):
      • 模型计算:ϵpred_C=ϵθ(x100,t=100)\epsilon_{pred\C} = \epsilon\theta(x_{100}, t=100)ϵpred_C=ϵθ(x100,t=100)。
      • 计算损失:LC=∣∣ϵC−ϵpred_C∣∣2L_C = ||\epsilon_C - \epsilon_{pred\_C}||^2LC=∣∣ϵC−ϵpred_C∣∣2。
      • 模型学习: 学习如何修复精细的细节,如胡须、毛发纹理。

通过在所有 ttt 上最小化这个损失,U-Net 的权重(记忆)最终被迫学会了从 t=Tt=Tt=T (纯噪声) 到 t=0t=0t=0 (清晰图像) 的完整"修复"路径图。


第 2 部分:条件控制 (Conditional Diffusion)

在第一部分中,我们训练的 U-Net 是一个"盲盒"生成器。它从随机噪声出发,能生成一张高质量的猫图,但我们无法控制生成 什么样 的猫。

问题: 如果我想"干预"这个过程,让模型听我的话,比如生成"一只红色的猫"或"一只宇航员在骑马",该怎么做?

这就是条件控制 (Conditional Control) 要解决的问题,是连接 DDPM(纯生成)和 Stable Diffusion(可控生成)的核心桥梁,也是 Stable Diffusion 的核心原理。

2.1 核心思想:为 U-Net 引入"导航"

我们不能改变 U-Net 的核心任务(预测噪声 ϵθ\epsilon_\thetaϵθ),但我们可以在它工作时,给它提供"导航信息"

想象一下,U-Net 就像一个正在雕刻大理石的工匠(从噪声 xTx_TxT 雕刻到图像 x0x_0x0),而"文本提示 (Prompt)"就是我们递给工匠的图纸。

挑战: U-Net 只"认识"两样东西:

  1. 带噪声的图像 xtx_txt (它要处理的"大理石")
  2. 时间步 ttt (它要知道雕刻到哪一步了)

U-Net 根本不认识"文本"这种高级语义。

解决方案 (Stable Diffusion 采用):

  1. 找一个"翻译官",把人类的文本"翻译"成 U-Net 能理解的数学语言(向量)。
  2. 在 U-Net 内部开几个"小窗户",让"翻译"后的信息(图纸)能在关键时刻递给工匠。

这个"翻译官"就是文本编码器 (Text Encoder) ,而这个"小窗户"就是交叉注意力 (Cross-Attention) 机制。

2.2 具体例子:"一只戴帽子的宇航员猫"

我们来完整地走一遍,当 U-Net 收到这个提示 (Prompt) 时,内部发生了什么。

步骤 1:文本"翻译" (Text Encoder)

首先,我们不能把"宇航员猫"这几个字直接扔给 U-Net。

  1. 分词 (Tokenize): 文本被分解成一个个"词元"(Token)。
    "A", "cat", "astronaut", "wearing", "a", "hat"
  2. 编码 (Encode): 这些词元被送入一个专门的、预训练好的文本编码器(例如 CLIP Text Encoder)。
  3. 输出 (Embedding): 编码器输出一系列的上下文向量 (Context Vectors) ,CCC。
    • C1C_1C1 (代表 "A")
    • C2C_2C2 (代表 "cat")
    • C3C_3C3 (代表 "astronaut")
    • ...
    • 关键: 这一系列向量 CCC 蕴含了提示词的全部语义。这就是我们的"图纸"。

步骤 2:"干预" U-Net (Cross-Attention)

现在,U-Net 开始像往常一样工作(从 t=Tt=Tt=T 循环去噪)。

  1. 常规路径 (图像侧): 在某个时间步 ttt,带噪图像 xtx_txt 进入 U-Net 的编码器(下采样)。在 U-Net 的中间层,图像被压缩成了一堆图像特征(QQQ)

    • QQQ (Query / 查询): 可以理解为 U-Net 内部的"提问"。比如,图像特征 QiQ_iQi 在"提问":"我这块区域(比如图像左上角)应该生成什么东西?"
  2. 干预路径 (文本侧): 我们把上一步得到的上下文向量 CCC 作为"回答"的候选。

    • KKK (Key / 键): CCC 向量充当"键",代表每个词的"身份"。
    • VVV (Value / 值): CCC 向量也充当"值",代表每个词的"内容"。
  3. 交叉注意力 (Q, K, V 匹配):

    • U-Net 的图像特征 QiQ_iQi("我这块区域要画啥?")会和所有 文本词元 KKK(Kcat,Kastronaut,KhatK_{cat}, K_{astronaut}, K_{hat}Kcat,Kastronaut,Khat...)进行匹配度计算。
    • 假设: 如果 QiQ_iQi 这个区域在之前的去噪中已经隐约呈现出"猫头"的轮廓,那么它与 KhatK_{hat}Khat ("帽子") 的匹配度就会非常高。
    • 结果: 匹配度最高的 KhatK_{hat}Khat 对应的 VhatV_{hat}Vhat("帽子"的内容)就会被选中,并被注入 (Inject) 到 QiQ_iQi 中,成为新的图像特征。

执行过程(类比):

  • t=990 (混沌期): U-Net 问:"这里一团糟,我该画啥?" →\rightarrow→ 文本 CCC 回答:"画个'宇航员'和'猫'的轮廓。"
  • t=500 (轮廓期): U-Net 问:"我画出了一个猫头,上面这块是啥?" →\rightarrow→ 交叉注意力机制发现 Q猫头上⋅KhatQ_{猫头上} \cdot K_{hat}Q猫头上⋅Khat 匹配度最高 →\rightarrow→ 注入 VhatV_{hat}Vhat 的信息 →\rightarrow→ U-Net 开始在猫头上画"帽子"。
  • t=10 (细节期): U-Net 问:"帽檐这里要什么纹理?" →\rightarrow→ 交叉注意力再次注入 VhatV_{hat}Vhat 的细节信息 →\rightarrow→ U-Net 精修帽檐。

总结:

交叉注意力,就是在 U-Net 内部(通常是其中间层和解码器层)加入的"导航站"。在去噪的每一步,U-Net 都会停下来,通过这个机制"看一眼"文本图纸,让图像特征和文本语义对齐,然后再继续下一步去噪。

2.3 关键技巧:Classifier-Free Guidance (CFG)

我们已经"干预"了 U-Net,但还有一个问题:U-Net 有多"听话"?

有时候,模型可能"偷懒",它更倾向于生成它最熟悉的(比如一张普通的猫),而不是你想要的(戴帽子的宇航员猫)。

CFG (无分类器指导) 是一个强大的技巧,用来控制模型对提示词的"遵从度"

原理: 在每一步 ttt,我们实际上让 U-Net 做了两次噪声预测:

  1. 预测 1 (有条件): ϵθ(xt,t,"宇航员猫")\epsilon_\theta(x_t, t, \text{"宇航员猫"})ϵθ(xt,t,"宇航员猫")
    • 即我们刚刚描述的、受交叉注意力"干预"的预测。
  2. 预测 2 (无条件): ϵθ(xt,t,"")\epsilon_\theta(x_t, t, \text{""})ϵθ(xt,t,"")
    • 我们用一个空的、无意义的提示词(或干脆去掉干预),让 U-Net "自由发挥",预测它最想画的东西(比如一张普通的猫)。

计算:

  • 我们得到了两个预测:ϵcond\epsilon_{cond}ϵcond (你想要的) 和 ϵuncond\epsilon_{uncond}ϵuncond (它想画的)。
  • 指导方向: (ϵcond−ϵuncond)(\epsilon_{cond} - \epsilon_{uncond})(ϵcond−ϵuncond) 这个向量,指向了从"普通猫"到"宇航员猫"的"进化方向"。

最终预测:
ϵfinal=ϵuncond+w×(ϵcond−ϵuncond)\epsilon_{final} = \epsilon_{uncond} + w \times (\epsilon_{cond} - \epsilon_{uncond})ϵfinal=ϵuncond+w×(ϵcond−ϵuncond)

  • www 就是指导系数 (Guidance Scale)
  • w=0w=0w=0: ϵfinal=ϵuncond\epsilon_{final} = \epsilon_{uncond}ϵfinal=ϵuncond (完全不听提示,自由发挥)。
  • w=1w=1w=1: ϵfinal=ϵcond\epsilon_{final} = \epsilon_{cond}ϵfinal=ϵcond (标准干预)。
  • w>1w > 1w>1 (如 7.5): 我们在"普通"的基础上,超量地、夸张地加上了"宇航员猫"的特征。这迫使 U-Net 必须严格遵从提示词,生成更贴合、更鲜明的结果。

小结:

U-Net 依然是那个基于回归的噪声预测器(第一部分的核心)。而条件控制(Stable Diffusion)的魔法在于:

  1. 使用 Text Encoder 将提示词"翻译"成 CCC 向量。
  2. 在 U-Net 内部加入 Cross-Attention 层,在每一步 ttt 都将图像 QQQ 和文本 K,VK, VK,V 对齐,实现"干预"。
  3. 使用 CFG 技巧,通过对比"有条件"和"无条件"的预测,放大提示词的影响力,让 U-Net 严格"听话"。

第 3 部分:新范式------作为"生成式监督"的 Diffusion

为什么 Diffusion 和 Flow Matching 这类技术正迅速成为 VLA(视觉-语言-动作)和模仿学习(Imitation Learning)领域"动作专家(Action Experts)"或"策略(Policy)"的首选监督框架?

在第 1 部分和第 2 部分,我们明确了 U-Net 是如何通过"回归噪声"来学习整个数据分布的。现在,我们拔高一个层次,探讨一个核心观点:

Diffusion 不是一个传统的"监督头",它是一种"生成学习框架"。

3.1 传统监督头 vs. 生成式监督框架

我们先来做一个对比,以 模仿学习(Imitation Learning) 中的"动作预测"为例。

上图中的行为克隆(BC)就是一种监督学习/模仿学习;LSTM 是一种可适配 L2 自回归的模型;

模仿学习的目标: 学习一个策略,根据当前的"观察"(Observation,如图像、语言指令),预测出机器人下一步应该执行的"动作"(Action,如关节角度、末端轨迹)。

传统监督头 (如 L2 回归):

  • 做法: 假设我们有 1000 个人类演示(GT 轨迹)。在某个相同状态 SSS 下,人类 A 走了轨迹 AAA,人类 B 走了轨迹 BBB。
  • 模型: 一个简单的回归头(如 MLP)被训练来最小化预测动作 apreda_{pred}apred 和真实动作 aGTa_{GT}aGT 之间的 L2 损失(均方误差)。
  • 问题 (模式平均 Mode Averaging):
    • 为了最小化在 AAA 和 BBB 上的平均损失,这个"笨拙"的回归头最终会学会预测一个介于 AAA 和 BBB 之间的、物理上不存在的"折衷"动作 CCC。
    • 这个动作 CCC 既不是 AAA 也不是 BBB,它可能是一个无效、抖动或不自然的动作。
  • 结论: 传统回归头无法处理"多样性"。它假设在同一输入下只有一个正确答案,当存在多个正确答案时,它会崩溃并输出所有答案的平庸平均值。

生成式监督框架 (Diffusion / Flow Matching):

  • 做法: 我们同样用这 1000 个演示 A,B,...A, B, ...A,B,... 来训练。
  • 模型: 我们训练一个 Diffusion Policy (或 Flow Policy)。这个模型学习的不是"预测一个动作",而是学习 P(Action∣Observation)P(Action | Observation)P(Action∣Observation) 这个"概率分布"本身
  • 监督信号: 正如第 1 部分所述,它的损失函数是"回归噪声"或"回归速度"。
  • 优势 (解决多样性):
    • Diffusion 框架被迫 学习整个分布。它在训练中看到过轨迹 AAA(通过去噪 ϵA\epsilon_AϵA),也看到过轨迹 BBB(通过去噪 ϵB\epsilon_BϵB)。
    • 它不会去"平均" AAA 和 BBB。相反,它在自己的权重(U-Net)中记住了:从 SSS 出发,有两条"合法"的去噪路径,一条通往 AAA,一条通往 BBB。
  • 结论: Diffusion 完美地解决了"创造性 (Creativity)" 和 "多样性 (Diversity)" 的监督问题。它承认在同一情境下,存在多种同样"正确"的解决方案。

3.2 具体例子:VLA 中的"动作专家" (Diffusion Policy)

让我们看看这在 VLA 模仿学习中是如何具体应用的。

场景: 一个机器人手臂需要根据指令"请把那个红苹果递给我"来规划未来 2 秒的动作轨迹(Action Horizon)。

  • Observation (输入): 摄像头图像 + 文本指令 "..."。
  • Action (GT 标签): 人类专家演示的 2 秒钟(例如 100 帧)的关节角度序列 AGTA_{GT}AGT。这是一个高维向量(例如 100 帧 x 7 关节)。

传统回归头 (失败):

如果用 L2 损失,模型会试图预测一个"平均"的轨迹。如果专家演示时,一半是从左边抓,一半是从右边抓,模型会预测一个从中间穿过去的、撞到桌子的轨迹。这导致了创造力的缺失

Diffusion Policy (成功):

  1. 训练 (监督过程):

    • 我们拿到 GT 轨迹 AGTA_{GT}AGT。
    • 像第 1 部分一样,我们加入随机噪声 ϵ\epsilonϵ,得到带噪轨迹 AtA_tAt。
    • U-Net 的任务: 输入 (Observation, AtA_tAt, ttt),预测 ϵ\epsilonϵ。
    • 损失函数: L=∣∣ϵ−ϵθ(Observation,At,t)∣∣2L = ||\epsilon - \epsilon_\theta(\text{Observation}, A_t, t)||^2L=∣∣ϵ−ϵθ(Observation,At,t)∣∣2。
    • 关键: 这里的 Observation(图像+文本)扮演了第 2 部分中"条件控制"的角色。它通过交叉注意力机制被注入 U-Net,指导 U-Net 的去噪方向。
  2. 推理 (生成动作):

    • 我们从一个完全随机的噪声轨迹 ATA_TAT(未来 2 秒的随机抖动)开始。
    • 我们输入当前的 (Observation)。
    • 模型(U-Net)从 t=Tt=Tt=T 循环到 t=0t=0t=0,在 Observation 的强力引导 下,一步步地将这个"随机抖动" ATA_TAT "雕刻"成一条清晰、平滑、且多样化 的动作轨迹 A0A_0A0。
    • 多样性的体现: 每次我们从不同 的随机噪声 ATA_TAT 开始,模型就会生成一条不同 的、但同样合理的轨迹(比如,这次从左边抓,下次从右边抓)。

小结:

Diffusion 和 Flow Matching 不是简单的"监督头",它们是高维概率分布的建模框架

它们通过其独特的"回归噪声/速度"损失函数,迫使模型学习数据分布中的所有模式(Modes),而不是像 L2 损失那样崩溃为平庸的平均值。

这使得它们成为监督 VLA 动作专家这类具有"创造性"和"多样性"(即多模态,Multi-Modal)输出的完美工具。


第 4 部分:演变------从 Diffusion 的"随机阶梯"到 Flow Matching 的"直线高速"

在第 3 部分,我们确定了 Diffusion 是一种强大的"生成式监督"框架。但它有一个(曾经)臭名昭著的缺点:

  • Diffusion (DDPM) :需要 TTT 步(比如 1000 步)才能从纯噪声 xTx_TxT"雕刻"回 x0x_0x0。这意味着一次推理(生成)需要调用 1000 次 U-Net。
  • Flow Matching:它的出现,很大程度上是为了解决这个问题。它旨在学习一个更"高效"的路径。

4.1 核心区别:随机 SDE vs. 确定性 ODE

上图来源/进阶推荐:https://zhuanlan.zhihu.com/p/4116861550

  • Diffusion (DDPM/SDE): 它的反向过程(修复)是随机的 (Stochastic) 。每一步 ttt 不仅要预测 ϵ\epsilonϵ,还要在结果上再加一点点"随机噪声"。

    • 比喻:一个喝醉的工匠在走楼梯。
    • 他知道总目标是"下楼"(去噪)。
    • 但他每走一步(t→t−1t \rightarrow t-1t→t−1),都会左摇右晃(加入随机性)
    • 他最终还是能下楼(生成图像),但这个路径是摇摇晃晃的、低效的。
  • Flow Matching (ODE): 它学习的是一个确定的 (Deterministic) 路径。

    • 比喻:一部在轨道上运行的电梯(或一条直线高速)
    • 它学习的是一个"速度场 (Vector Field)" vvv。
    • 在任何时间 ttt、任何位置 xtx_txt,这个 vvv 都会给出一个唯一的、确定的"下一步该走的方向"。
    • 从 t=1t=1t=1 (噪声) 到 t=0t=0t=0 (数据) 的路径是平滑且笔直的。

4.2 终极具体实例:从 (0, 0) 移动到 (8, 8)

想象一下,我们的整个"数据分布" x0x_0x0 只有一个点:坐标 (8, 8)。

我们的"噪声分布" x1x_1x1 只有一个点:坐标 (0, 0)。

我们的任务是训练一个模型,学会如何从 (0, 0) 生成 (8, 8)。


A. Diffusion 的训练与推理(随机阶梯)

训练:

  1. 取数据 x0x_0x0: (8, 8)。
  2. 正向"破坏": 我们把 (8, 8) →\rightarrow→ (0, 0) 的过程分成 10 步。我们模拟一个摇摇晃晃走向 (0, 0) 的过程。
  3. 准备监督对:
    • 在 t=5t=5t=5 (中途),数据点 x5x_5x5 可能在 (4.1, 3.8)。
    • 我们加入的"真实噪声" ϵA\epsilon_AϵA 是 (0.2, -0.3)。
    • 监督对 1: 输入 x5=(4.1,3.8)x_5=(4.1, 3.8)x5=(4.1,3.8) 和 t=5t=5t=5,GT 标签是 ϵA=(0.2,−0.3)\epsilon_A=(0.2, -0.3)ϵA=(0.2,−0.3)。
    • 在 t=3t=3t=3,数据点 x3x_3x3 可能在 (6.0, 5.8)。
    • 我们加入的"真实噪声" ϵB\epsilon_BϵB 是 (-0.1, 0.1)。
    • 监督对 2: 输入 x3=(6.0,5.8)x_3=(6.0, 5.8)x3=(6.0,5.8) 和 t=3t=3t=3,GT 标签是 ϵB=(−0.1,0.1)\epsilon_B=(-0.1, 0.1)ϵB=(−0.1,0.1)。
  4. 损失: L=∣∣ϵ−ϵθ(xt,t)∣∣2L = ||\epsilon - \epsilon_\theta(x_t, t)||^2L=∣∣ϵ−ϵθ(xt,t)∣∣2。

推理(生成):

  1. 启动: 从 x10=(0,0)x_{10} = (0, 0)x10=(0,0) 开始。
  2. 第 1 步 (t=10):
    • 模型预测 ϵθ(x10,10)\epsilon_\theta(x_{10}, 10)ϵθ(x10,10) →\rightarrow→ 比如 (0.7, 0.9)。
    • 我们计算 x9x_9x9 = (0, 0) + (0.7, 0.9) + 一点随机噪声 →\rightarrow→ 得到 x9=(0.8,0.85)x_9 = (0.8, 0.85)x9=(0.8,0.85)。
  3. 第 2 步 (t=9):
    • 模型预测 ϵθ(x9,9)\epsilon_\theta(x_9, 9)ϵθ(x9,9) →\rightarrow→ 比如 (0.8, 0.7)。
    • 我们计算 x8x_8x8 = (0.8, 0.85) + (0.8, 0.7) + 一点随机噪声 →\rightarrow→ 得到 x8=(1.5,1.6)x_8 = (1.5, 1.6)x8=(1.5,1.6)。
  4. ...
  5. 第 10 步 (t=1):
    • 模型预测 ϵθ(x1,1)\epsilon_\theta(x_1, 1)ϵθ(x1,1) →\rightarrow→ ...
    • 最终得到 x0≈(8.1,7.9)x_0 \approx (8.1, 7.9)x0≈(8.1,7.9)。

结论: 我们到达了 (8, 8),但走了 10 步,而且因为每一步的随机性,路径是弯曲的。


B. Flow Matching 的训练与推理(直线高速)

训练:

  1. 取数据 x0x_0x0: (8, 8)。取噪声 x1x_1x1: (0, 0)。
  2. 定义"高速公路": 从 x1x_1x1 到 x0x_0x0 的直线路径
  3. 定义"速度 GT": 在这条直线上,从起点 (0, 0) 指向终点 (8, 8) 的速度向量 (Velocity Vector) 是什么?
    • 答案是恒定的 :vGT=x0−x1=(8,8)−(0,0)=(8,8)v_{GT} = x_0 - x_1 = (8, 8) - (0, 0) = (8, 8)vGT=x0−x1=(8,8)−(0,0)=(8,8)。
    • 这个 vGTv_{GT}vGT 就是我们要监督的唯一目标
  4. 准备监督对:
    • 随机取一个时间 t=0.3t=0.3t=0.3: * 在直线路上的 xtx_txt 是:xt=(1−t)x1+t⋅x0=0.7⋅(0,0)+0.3⋅(8,8)=(2.4,2.4)x_t = (1-t)x_1 + t \cdot x_0 = 0.7 \cdot (0,0) + 0.3 \cdot (8,8) = (2.4, 2.4)xt=(1−t)x1+t⋅x0=0.7⋅(0,0)+0.3⋅(8,8)=(2.4,2.4)。
    • 监督对 1: 输入 xt=(2.4,2.4)x_t=(2.4, 2.4)xt=(2.4,2.4) 和 t=0.3t=0.3t=0.3,GT 标签是 vGT=(8,8)v_{GT}=(8, 8)vGT=(8,8)。
    • 随机取一个时间 t=0.8t=0.8t=0.8:
      • 在直线路上的 xtx_txt 是:xt=0.2⋅(0,0)+0.8⋅(8,8)=(6.4,6.4)x_t = 0.2 \cdot (0,0) + 0.8 \cdot (8,8) = (6.4, 6.4)xt=0.2⋅(0,0)+0.8⋅(8,8)=(6.4,6.4)。
    • 监督对 2: 输入 xt=(6.4,6.4)x_t=(6.4, 6.4)xt=(6.4,6.4) 和 t=0.8t=0.8t=0.8,GT 标签是 vGT=(8,8)v_{GT}=(8, 8)vGT=(8,8)。
  5. 损失: L=∣∣vGT−vθ(xt,t)∣∣2=∣∣(8,8)−vθ(xt,t)∣∣2L = ||v_{GT} - v_\theta(x_t, t)||^2 = ||(8, 8) - v_\theta(x_t, t)||^2L=∣∣vGT−vθ(xt,t)∣∣2=∣∣(8,8)−vθ(xt,t)∣∣2。模型 vθv_\thetavθ 被迫在高速公路上的任何一点 ,都要能预测出那个恒定的、指向终点的速度 (8, 8)

推理(生成):

  1. 启动: 从 x1=(0,0)x_1 = (0, 0)x1=(0,0) 开始。
  2. 询问模型: vθ(x1,1.0)v_\theta(x_1, 1.0)vθ(x1,1.0)?
  3. 模型回答: (理想情况下) v=(8,8)v = (8, 8)v=(8,8)。
  4. 求解 ODE:
    • 如果我们想一步到位 (Rectified Flow):
      • x0=x1+1.0×v=(0,0)+(8,8)=(8,8)x_0 = x_1 + 1.0 \times v = (0, 0) + (8, 8) = (8, 8)x0=x1+1.0×v=(0,0)+(8,8)=(8,8)。
      • 一步! 我们只调用了 1 次模型就完成了生成。
    • 如果我们想更精确(走 10 步):
      • x0.9=x1+0.1×v=(0,0)+0.1×(8,8)=(0.8,0.8)x_{0.9} = x_1 + 0.1 \times v = (0, 0) + 0.1 \times (8, 8) = (0.8, 0.8)x0.9=x1+0.1×v=(0,0)+0.1×(8,8)=(0.8,0.8)。
      • x0.8=x0.9+0.1×v=(0.8,0.8)+0.1×(8,8)=(1.6,1.6)x_{0.8} = x_{0.9} + 0.1 \times v = (0.8, 0.8) + 0.1 \times (8, 8) = (1.6, 1.6)x0.8=x0.9+0.1×v=(0.8,0.8)+0.1×(8,8)=(1.6,1.6)。
      • ...
      • 最终 x0=(8,8)x_0 = (8, 8)x0=(8,8)。

结论: 我们不仅能一步到达 (8, 8),而且即使分 10 步走,走的也是一条笔直的、确定的高速公路,没有任何随机性。

4.3 对 VLA 模仿学习的启示

  • Diffusion (第 3 部分): 它能学习多模态动作(多样性)。但它需要 100 步推理才能规划一个动作,这对于实时机器人来说太慢了。
  • Flow Matching (演变):
    • 它同样能学习多模态动作(如果 x0x_0x0 是一个分布)。
    • 但它学习的是一个"确定性"的路径,使其推理速度极快
    • 训练一个 Flow Matching 策略,模型 vθ(Observation,At,t)v_\theta(\text{Observation}, A_t, t)vθ(Observation,At,t) 学习预测从"随机动作" A1A_1A1 指向"专家动作" A0A_0A0 的速度 vGT=A0−A1v_{GT} = A_0 - A_1vGT=A0−A1。
    • 在推理时,机器人只需调用模型 1-4 次 ,就能从随机噪声 A1A_1A1 和速度 vvv 计算出 A0=A1+vA_0 = A_1 + vA0=A1+v,从而规划出未来 2 秒的完整动作。
    • 这就是实现实时、高水平模仿学习的关键。
相关推荐
_妲己20 小时前
stable diffusion的MLSD直线(AI室内设计)
人工智能·stable diffusion
斯文by累1 天前
Stable Diffusion 3.5 FP8:高效文生图技术革命
人工智能·stable diffusion
csdn_aspnet1 天前
Stable Diffusion 3.5 FP8 的应用场景探索
人工智能·stable diffusion·fp8·sd3.5
多仔ヾ2 天前
Stable Diffusion AIGC 视觉设计实战教程之 06-提示词应用技巧
stable diffusion·aigc
_妲己5 天前
SD的细分功能包括重绘,图像处理、放大等扩散模型应用
人工智能·python·深度学习·机器学习·stable diffusion·comfyui·ai工作流
二院大蛙7 天前
Stable Diffusion 3.5 FP8在农业无人机航拍模拟图中的地形还原精度
stable diffusion· fp8· 农业无人机
或困7 天前
Stable Diffusion 3.5 FP8镜像支持灰度检测与异常报警
stable diffusion·灰度发布·fp8量化
沉默的大羚羊7 天前
Stable Diffusion 3.5 FP8模型可用于旅游宣传海报制作
stable diffusion·文生图·fp8
BOBO爱吃菠萝7 天前
Stable Diffusion 3.5 FP8镜像自动化部署脚本发布
stable diffusion·量化·fp8
九章云极AladdinEdu7 天前
项目分享|SD-Trainer:Stable Diffusion 训练集成工具
stable diffusion·端到端学习·高斯泼溅·3d场景分割·物体级代码本·2d到3d提升