SD3 发布的时候,有一个细节社区讨论了很久:它没有叫 SDXL 2,而是直接跳到了第三代。我当时第一反应是“架构肯定有大改”,但真正让我愣住的,是 Stability AI 把整个扩散模型的骨干网络——那个用了好几年的 U-Net——给扔了,换成了 Transformer。同期,Black Forest Labs(其实就是 SD 团队出走的那批人)发布了 Flux,同样基于 Transformer 架构,而且出道即巅峰,直接拿下了开源文生图模型的 SOTA。这两个模型背后是同一套技术思路:DiT 架构 + 流匹配。这篇文章我想把这两个东西的原理、它们怎么组合在一起、以及到底改变了什么,用我自己的理解讲清楚。

扩散模型到底在“扩散”什么?
要理解为什么换架构,得先知道扩散模型到底在干什么。简单说,扩散模型分两步:前向加噪和反向去噪。训练时,你拿一张干净图片,按照固定的规则一步步往上加高斯噪声,直到变成一张纯噪声图。然后你让模型学习从噪声图一步步还原回原图。这个学习目标是:给定加噪到第 t 步的图片,模型要预测出这一步加进的那个噪声(或者直接预测原始图片,但主流是预测噪声)。这就是 DDPM 的核心思路。
这个过程如果用数学语言描述,就是随机微分方程(SDE),但形象一点说,就像你用墨水在清水里慢慢扩散,然后训练一个模型让它学会把墨水从水里一步步“收回来”。最早 Stable Diffusion 用的就是这个框架,骨干网络是 U-Net。U-Net 是一个经典的编码器-解码器卷积结构,带跳跃连接,很适合处理这种图像到图像的像素级预测任务。但 U-Net 有一个天生的局限:它靠卷积的局部感受野来理解图像,虽然叠加了很多层,要理解长距离的全局关系还是费劲。而且 U-Net 的结构是固定的,你想把模型做大,就得把卷积层数、通道数往上堆,计算量涨得飞快。
为什么非要换掉 U-Net?
这个问题我最早也困惑过:U-Net 用得挺好的,SDXL 效果已经很惊艳了,为什么非要换?后来看了 DiT 的论文 Scalable Diffusion Models with Transformers,才想通关键点:扩散模型本质上是一个序列建模问题,不是在处理图像像素,而是在处理“带噪图像”这个序列。而 Transformer 天生就是为序列建模设计的。你可以把一张带噪图像切成一个个 patch,就像 ViT(Vision Transformer)那样,每个 patch 变成一个 token,然后让 Transformer 去理解这些 token 之间的关系。这样一来,模型不再需要卷积来捕获全局依赖,自注意力机制直接让每个 patch 和所有其他 patch 交互,长距离理解能力瞬间拉满。而且 Transformer 的扩展性极好,直接堆层数就能让模型更聪明,不用像 U-Net 那样纠结于通道数和下采样倍率的平衡。
还有一个很实际的原因:多模态信息的注入。文生图需要把文本描述“注入”到图像生成过程中,U-Net 的做法是用交叉注意力层把文本嵌入作为条件,但 Transformer 的架构天然就支持多模态 token 的混合输入。你可以把文本 token 和图像 patch token 放在同一个序列里,让自注意力同时处理它们,这就为 SD3 的 MMDiT(Multi-Modal Diffusion Transformer)架构铺平了路。
DiT 架构:把扩散模型当成 Transformer 来训
DiT 的核心理念一句话就能概括:把 ViT 的架构搬过来,再把扩散过程的条件(时间步、文本)作为附加信息注入进去。具体做法是:输入图像先 patchify 成 token,和 ViT 一样;然后加上位置编码,送入一连串 Transformer 块。每个 Transformer 块里除了标准的自注意力和前馈网络,还多了一个条件注入模块——把时间步 t 和文本条件 c 通过一个 MLP 变换成 scale 和 shift 参数,对中间层的特征进行自适应层归一化(adaLN)。这样,网络就可以根据当前加噪的程度和你要的文字描述,动态调整自己的行为。
这个设计比 U-Net 优雅得多。U-Net 的交叉注意力层分散在编码器和解码器的不同层级,需要仔细设计注入位置;而 DiT 每层都能随时感知条件,而且条件信息是全局的,不会因为卷积的局部性而丢失细节。SD3 的 MMDiT 更进一步,直接把文本 token 和图像 token 拼接在一起,交替排列,让自注意力同时处理文本和图像,文本和图像之间的交互不再局限于交叉注意力,而是变成了一个统一的序列。这相当于让模型在写每一个像素时,都能“看到”整句文本的全部内容,而不是靠一个压缩后的文本嵌入向量。
流匹配:扔掉“预测噪声”这个拐杖
如果你直接看论文,流匹配(Flow Matching)的数学推导能劝退一大半人。但它的思想其实极其直观。DDPM 的做法是让模型预测噪声,然后从噪声样本中减去它来还原图像。这个路子有个问题:噪声只是一个中间变量,你真正想让模型学的是从噪声到图像的“路径”,但 DDPM 把路径的每一步都限定在加了不同噪声的模糊图像上,这个路径是弯曲的,效率不高。
流匹配换个思路:我们不预测噪声了,直接让模型预测从噪声到图像的速度场(velocity field),也就是每一步应该朝哪个方向、迈多大的步子才能到达目标图像。这就像你从北京开车到上海,DDPM 是给你一张地图,告诉你每个路口向左还是向右(离散的步数),而流匹配是直接给你一个实时的 GPS 导航,告诉你此刻应该朝哪个方向开、时速多少。这个思想来源于 Rectified Flow 和 Flow Matching 两篇工作,核心是把生成模型和最优传输理论联系起来,让扩散路径变成一条直线。直线上从噪声到图像的映射是简单的线性插值,模型只需要学习在这个直线路径上如何“推着”样本往前走。
我最早以为流匹配只是换了个损失函数,后来发现它改变了整个训练范式。DDPM 的训练依赖于噪声水平 t,推断时需要小心翼翼的步数规划和噪声调度。而流匹配因为路径是直的,采样步数可以大幅减少,用很少的几步就能生成质量不错的图像。SD3 和 Flux 都用了流匹配,训练时直接就学一个直线的速度场,推理时用 ODE 求解器(比如 Euler 方法)沿着这个速度场走几步,就能从纯噪声走到清晰的图像。
SD3 和 Flux 具体是怎么落地的?
SD3 的技术报告 Scaling Rectified Flow Transformers for High-Resolution Image Synthesis 把 MMDiT 和 Rectified Flow 合在了一起。它用了多模态 Transformer,把 T5 编码的文本 token 和图像的 patch token 交错排列,送入相同的 Transformer 层,让模型自己学会对齐。同时,SD3 还引入了 “conditioning on the terminal” 的技巧,让模型在训练时也看到目标图像本身(通过一个条件编码器),这相当于是给了模型一个“参考答案”,帮助它更快收敛。
Flux 的思路和 SD3 很相似,但 Black Forest Labs 的团队在细节上做了进一步优化。他们用了 Guidance Distillation,把 classifier-free guidance 的高昂计算成本压缩到模型内部,推理时不需要再做两次前向传播。同时,Flux 在文本理解上更强,特别是在长文本、复杂构图和手部细节上,解决了 SD3 早期版本的一些瓶颈。因为 Flux 的团队本身就是 SD3 核心开发者(Robin Rombach 等人),你可以把 Flux 看成是 SD3 的“完全体”或“后续迭代”。
一个关键区别是:SD3 发布时开源了不同规模的模型,但商业授权限制引发了一些争议;Flux 则直接分了 pro、dev、schnell 三个版本,其中 dev 和 schnell 开源,pro 闭源,走的是分层开放的路线。
一张表说清 DiT 和 U-Net 的根本区别
| 对比维度 | U-Net 扩散模型 (SDXL) | DiT 扩散模型 (SD3/Flux) |
|---|---|---|
| 骨干网络 | 卷积 U-Net,编码器-解码器 | 纯 Transformer,无卷积 |
| 全局依赖 | 靠下采样和跳跃连接,有限 | 自注意力天然全局,每个 token 看全图 |
| 扩展性 | 需要精细调整卷积层数和通道数 | 直接堆层数,符合 scaling law |
| 条件注入 | 交叉注意力层,部分位置注入 | adaLN 每层条件调制,或直接拼接多模态 token |
| 损失函数 | 预测噪声,L2 损失 | 预测速度场(流),流匹配损失 |
| 采样效率 | 需较多步数(20-50 步) | 直线路径,少量步数(4-10 步)即可 |
学完之后我最大的感触
以前我总觉得扩散模型和自回归模型(比如 GPT)是两条路,一个搞图像,一个搞文本。但 DiT 和流匹配让我意识到,扩散模型也在向 Transformer 收敛。这背后的趋势是:Transformer 作为一种通用的序列建模器,正在吞噬所有模态。图像、视频、音频、蛋白质结构,都可以 token 化之后扔进 Transformer,扩散模型或流匹配作为生成框架,提供了一种训练这些 Transformer 的方法。SD3 和 Flux 就是把这种趋势在文生图上做到了极致。
但我也很清楚,这种架构不是没有边界。流匹配虽然采样快,但训练时仍然需要模拟噪声到图像的完整路径,对数据质量和多样性的要求极高。在手部、文字这种需要细粒度结构一致性的生成上,即使是 Flux pro 也偶尔翻车。而且 Transformer 的平方复杂度在超高分辨率下还是会成为瓶颈,未来可能需要稀疏注意力或分块蒸馏来进一步突破。
常见误解 FAQ
“DiT 不就是把 U-Net 换成 ViT 吗?”
不完全是。DiT 的核心不只是换骨架,而是用 Transformer 的自注意力替代了卷积的局部性,同时通过条件注入机制(adaLN 或多模态 token 拼接)重新设计了扩散模型与条件信息的交互方式。它改变的是模型理解“图像-文本-时间步”这三者关系的方式。
“流匹配就是 DDIM 的另一种写法?”
不是。DDIM 是在 DDPM 框架下通过非马尔可夫推理加速采样,但它仍然是在弯曲的噪声路径上走路。流匹配直接改变了训练目标,让路径变成直线,从原理上优化了采样效率。可以理解为:DDIM 是优化了“怎么走弯路可以更快”,流匹配是“直接把路修直了”。
“用了流匹配,模型就不需要 classifier-free guidance 了?”
仍然需要。CFG 是让模型在“有条件”和“无条件”之间外推,提升文本遵循度。流匹配只是在训练时简化了路径,但 CFG 还是需要在推理时做两次前向或通过蒸馏优化。Flux 的 Guidance Distillation 就是解决这个子问题。
“SD3 和 Flux 是一样的东西?”
核心架构理念相同,但实现细节不同。SD3 论文更侧重 Rectified Flow 和 MMDiT 的理论验证,Flux 则更聚焦工程优化和产品化,尤其在文本理解、手部生成和 CFG 蒸馏上做了针对性改进。可以理解为同一团队在不同阶段的成果。
原创文章,作者:guanweilu,如若转载,请注明出处:https://guanweilu.cn/article/170.html