先给结论:文生图 = 文本条件 + 噪声起点 + 迭代去噪 + 解码成图。
模型不是在「画」一张图,而是在一遍遍地判断:当前这团噪声里,哪些部分像猫、哪些部分像背景、下一步该去掉多少噪声。
这篇不训练模型,只讲清原理。看完你应该能回答:为什么从噪声开始、CLIP 在干什么、Latent Diffusion 省了什么、CFG 为什么会让图更「听话」、以及为什么手和文字总是翻车。
一、整条链路长什么样
flowchart LR
P[Prompt] --> T[Text Encoder<br/>CLIP / T5]
N[Random Noise<br/>或 latent 噪声] --> D[Denoiser<br/>U-Net / DiT]
T -->|cross-attention| D
D -->|重复 N 步去噪| D
D --> V[VAE Decoder]
V --> I[Image]
这条链路里有三个关键角色:
| 角色 | 作用 | 常见实现 |
|---|---|---|
| 文本编码器 | 把提示词变成一串向量 | CLIP、T5、VLM |
| 去噪器 | 每一步预测「噪声长什么样」,把它减掉 | U-Net、DiT、MMDiT |
| 解码器 | 把最终 latent 还原成像素图 | VAE decoder |
模型不是一次生成整张图,而是从纯噪声开始,迭代几十步,每一步只去掉一点点噪声。最后剩下的,就是一张图。
二、扩散:从噪声里「雕刻」出图像
2.1 前向过程:把图一点点变成噪声
训练时,先拿一张真实图片 x0,按时间步 t 逐步加高斯噪声:
x_t = sqrt(alpha_bar_t) * x0 + sqrt(1 - alpha_bar_t) * epsilon
t越大,图越糊、越接近纯噪声;epsilon是随机噪声;- 到
t = T时,人眼已经看不出原图。
这就像把一张照片反复复印、加噪,直到变成一团雪花。
2.2 训练:让模型学会「预测噪声」
取一张图、随机选一个 t、加噪得到 x_t,然后让模型回答:
这团
x_t里,哪些部分是刚刚加进去的噪声?
模型输出一个和 x_t 同形状的噪声预测,和真实噪声算 MSE。训练目标就是:
让「预测噪声」尽量接近「真实噪声」
模型不需要记住每张图,它学的是不同噪声水平下,图像应该长什么样的统计规律。
2.3 反向过程:从纯噪声开始去噪
生成时:
- 从标准高斯噪声
x_T开始; - 模型预测当前噪声;
- 按采样器规则减掉一部分噪声,得到
x_{T-1}; - 重复几十步,直到
x_0; - 解码成图片。
flowchart LR
X0[清晰图 x0] -->|逐步加噪| XT[近似纯噪声 xT]
XT -->|模型逐步去噪| X0b[生成图 x0']
类比:雕刻。石头里本来没有雕像,但雕塑家知道每一刀该去掉什么。扩散模型也是「去掉不属于这张图的部分」。
2.4 采样器与步数
常见的 DDPM、DDIM、Euler、DPM-Solver 等,本质都是「怎么从预测的噪声走到下一步」的不同规则。
- 步数少:快,但细节/稳定性可能差;
- 步数多:慢,但通常更稳;
- 蒸馏模型(Turbo、Lightning 等)可以把步数压到几步甚至一步。
所以「20 步和 50 步差别大不大」没有统一答案,取决于模型、采样器和任务。
三、Latent Diffusion:不在像素上做扩散
直接在 512×512×3 的像素上做几十步去噪,计算量很大。Latent Diffusion 的做法是:
- 用 VAE encoder 把图片压到一个小得多的 latent;
- 在 latent 上做扩散;
- 最后用 VAE decoder 还原成像素图。
以 SD 1.5 为例,512×512×3 的图片可以压到 64×64×4 的 latent,空间尺寸缩小 8 倍,计算量大幅下降。
flowchart LR
I[512×512 图片] --> E[VAE Encoder]
E --> L[64×64 latent]
L --> D[扩散去噪]
D --> V[VAE Decoder]
V --> O[512×512 图片]
这带来两个结论:
- 扩散模型主要在「压缩后的语义空间」里工作,不是在像素上逐点画;
- VAE 的质量很关键:它决定了最终能还原多少细节,也决定了文字、边缘、纹理的上限。
现代模型会换更好的 VAE、更高分辨率的 latent,但「压缩 → 去噪 → 解码」这个结构没有变。
四、文字是怎么「控制」图像的
4.1 CLIP:让文字和图片落在同一个语义空间
CLIP 用海量「图片 + 配文」做对比学习:让匹配的图文向量靠近,不匹配的远离。
它本身不生成图,但它提供了一个关键能力:
文本和图像可以被映射到同一个语义空间里比较。
文生图模型把 CLIP/T5 的文本向量作为条件,注入到去噪器里。
4.2 Cross-Attention:每一步都「看一眼提示词」
在去噪器内部,图像 latent 被切成很多 token(或 patch),文本也是一串 token。
Cross-attention 让图像 token 去「查询」文本 token:
- 当前这一步,图像哪些区域应该关注「猫」;
- 哪些区域应该关注「窗台」;
- 哪些区域应该关注「暖色调」。
所以提示词不是只在第一步生效,而是在每一步去噪中反复参与。
4.3 CFG:让模型更「听话」
Classifier-Free Guidance(CFG)同时算两次预测:
- 有条件:看提示词;
- 无条件:不看提示词;
- 然后外推:
最终预测 = 无条件预测 + scale × (有条件预测 - 无条件预测)
scale小:更自由、更有创意,但可能不听话;scale大:更贴提示词,但容易过饱和、僵硬、细节崩。
负向提示词(negative prompt)本质上也是在利用「无条件/反向」这一侧:告诉模型哪些方向不要走。
提示词不是命令,而是条件。模型会尽量满足,但它理解的是统计相关性,不是符号逻辑。
五、去噪器的进化:U-Net → DiT / MMDiT
5.1 U-Net 时代
Stable Diffusion 1.5 / SDXL 使用 U-Net:
- 卷积 + 下采样/上采样;
- 跳跃连接保留细节;
- 在中间层插入 cross-attention,接收文本条件。
它很适合图像,但参数量、长程依赖和扩展性有上限。
5.2 DiT / MMDiT 时代
Diffusion Transformer(DiT)把 latent 切成 patch,当成 token 序列,用 Transformer 去噪:
- 更容易扩展参数和数据;
- 长程依赖建模更强;
- 成为 SD3、FLUX、Qwen-Image 等模型的基础。
MMDiT(Multimodal Diffusion Transformer)进一步把图像 token 和文本 token 分成两路,再用联合 attention 交互,避免两种模态互相干扰。
5.3 Flow Matching / Rectified Flow
DDPM 的加噪/去噪路径是弯曲的,需要较多步数。Flow Matching / Rectified Flow 直接学习一个「从噪声流向数据」的速度场,让路径更直:
- 训练目标更直接;
- 采样步数可以更少;
- SD3、FLUX 系列都采用了这类方法。
| 代际 | 去噪器 | 条件注入 | 代表 |
|---|---|---|---|
| 早期 Latent Diffusion | U-Net | cross-attention | SD 1.5 / SDXL |
| DiT 时代 | Transformer | cross-attention / 联合 attention | SD3、FLUX、Qwen-Image |
| 2025–2026 | DiT / MMDiT + Flow Matching | 文本编码器 + VLM | FLUX.2、Qwen-Image 2.x |
2026 年的开源文生图,主流已经不是「U-Net + DDPM」了;但底层仍然是「从噪声里迭代去噪」,只是去噪器和路径变了。
六、ControlNet、LoRA、IP-Adapter 在做什么
这些名字经常和文生图一起出现,但它们不是新的生成原理,而是在基础模型上加控制。
| 技术 | 作用 | 一句话 |
|---|---|---|
| ControlNet | 用边缘、深度、姿态、分割图控制构图 | 给去噪器加一个「空间条件」分支 |
| LoRA | 小参数量微调风格/角色/画风 | 不改变大模型,只挂一个低秩适配器 |
| IP-Adapter | 用一张参考图当「图像提示词」 | 把图像特征注入 cross-attention |
| Inpainting | 只重绘 mask 区域 | 在 latent 上遮住一部分,重新去噪 |
它们都建立在一个前提上:基础模型已经学会了「图像长什么样」,这些技术只是告诉它「这次按什么条件长」。
七、为什么模型还是数不清手指、写不好字
7.1 手
- 手在训练数据里姿态多、遮挡多、像素少;
- 模型优化的是「看起来像手」,不是「解剖学正确」;
- 手指数量、关节方向属于精细结构,容易在去噪过程中被「平均」掉。
7.2 文字
- 文字需要精确的字形和排版,而 VAE 压缩 + 扩散去噪会损失高频细节;
- 文本编码器对长字符串、罕见字的表征有限;
- 早期模型的训练数据里,带文字的图片比例也不高。
新一代模型通过更好的文本编码器、更高分辨率、专门的数据和渲染后处理,已经把文字能力拉高了很多,但长文本、复杂排版仍然不稳定。
7.3 数量、空间关系、逻辑
「三只猫,左边两只,右边一只」这类要求,涉及:
- 计数;
- 空间关系;
- 属性绑定(哪只猫是什么颜色)。
扩散模型学的是图像分布,不是符号推理。CLIP 文本向量对数字和关系的表达也偏弱,所以这类 prompt 经常「大概对,但细节不对」。
7.4 一致性
每次生成都是从新的随机噪声开始,所以同一角色在不同图里可能长得不一样。参考图、角色 LoRA、编辑模型,都是为了解决「一致性」。
八、另一条路线:自回归 / 统一多模态
扩散不是唯一答案。另一条路线是:
- 用 VQ-VAE / tokenizer 把图片变成离散 token;
- 用 Transformer 像生成文本一样,逐个预测图像 token;
- 再解码成图片。
Parti 等工作走过这条路:把图像离散成 token,再像语言模型一样生成。Muse 也用离散图像 token,只是生成方式不同(掩码生成),但同属「先 token 化、再生成」这一大类。
| 路线 | 优点 | 难点 |
|---|---|---|
| 扩散 / Flow | 细节丰富、训练稳定、生态成熟 | 步数多、推理成本高 |
| 自回归 | 和语言模型统一、便于多模态交错 | 图像 token 序列长、细节/速度难平衡 |
很多商业产品并不公开自己的完整架构,可能混合了多种模型、重写、重排、超分和安全过滤。不要看到「某个产品很强」就反推它一定用了某一种论文结构。
九、看懂一个文生图产品,应该看什么
| 维度 | 问题 |
|---|---|
| 基础模型 | 是 SD 系、FLUX 系、Qwen 系,还是闭源模型? |
| 文本编码器 | CLIP?T5?VLM?长 prompt 能力如何? |
| 分辨率 / VAE | 原生多少?是否靠超分补细节? |
| 控制能力 | 支持 ControlNet、参考图、局部重绘吗? |
| 一致性 | 角色/风格能否跨图保持? |
| 文字渲染 | 中文/英文/长文本是否稳定? |
| 成本与延迟 | 步数、模型大小、是否蒸馏? |
| 许可 | 权重/商用/训练数据限制是什么? |
「参数大」不等于「好用」;数据、文本编码器、训练目标、后处理,任何一个环节都会影响最终体验。
十、最后,用一句话记住
文本是条件,噪声是起点,去噪是过程,解码是出口。
- 扩散模型学的是「不同噪声水平下,图像应该长什么样」;
- Latent Diffusion 把这件事搬到压缩后的 latent 里做,省算力;
- CLIP/T5 把提示词变成条件,cross-attention 在每一步注入;
- CFG 让模型更贴提示词,但太大会僵硬;
- DiT/MMDiT + Flow Matching 是 2025–2026 的主流骨架;
- 手、文字、计数、空间关系仍然难,因为模型学的是分布,不是符号推理。
理解了这条链路,再去看 prompt、步数、CFG、ControlNet、LoRA,就不会把它们当成「玄学开关」了。
参考
- DDPM: Denoising Diffusion Probabilistic Models
- Latent Diffusion Models
- CLIP: Learning Transferable Visual Models From Natural Language Supervision
- Scaling Rectified Flow Transformers for High-Resolution Image Synthesis(SD3)
- Flow Matching for Generative Modeling
- FLUX.2: Frontier Visual Intelligence
- Qwen-Image