文生图模型是如何把文本注入扩散过程的?
简化版
文生图模型先把提示词编码成一串上下文化向量,再通过交叉注意力、联合注意力或特征调制等机制注入去噪网络。经典 Latent Diffusion 的 Cross-Attention 让图像特征提供 Query、文本特征提供 Key/Value,使不同空间特征能读取不同 Token;它提供软条件影响,但不保证词与区域精确一一对应。时间步或噪声强度也必须作为独立条件注入。
详细版
从文本到图像的完整链路
- 文本编码:提示词 → tokenizer → 文本编码器(CLIP/T5)→ 一串 token 嵌入
c(如 77×768)。 - 条件注入去噪:U-Net 在每一步预测噪声时,把
c通过交叉注意力融合进图像特征:ε_θ(x_t, t, c)。 - 引导强度:配合 Classifier-Free Guidance,用 guidance scale 控制对文本的服从度。
交叉注意力怎么工作
在 U-Net 的注意力层里:
Q = W_Q · (图像潜特征) # 来自当前被去噪的图像
K = W_K · c, V = W_V · c # 来自文本嵌入
Attention = softmax(Q·Kᵀ/√d) · V
- Query 来自图像:每个空间位置发出「我该参考文本的哪部分」的查询。
- Key/Value 来自文本:提供「文本里有哪些语义、对应什么内容」。
- 结果是每个位置按与各文本 token 的相关度,加权吸收文本信息。
为什么是交叉注意力而不是简单拼接
- 交叉注意力是空间自适应的:不同图像位置可以对文本 Token 分配不同权重,例如车附近的特征可能更多读取
red/car。 - 简单注入一个池化文本向量不会显式保留逐 Token 的读取接口;不过 Cross-Attention 权重也不是可靠分割图,不能据此保证关系绑定。
文本编码器的选择
- SD1.x:CLIP ViT-L/14 text encoder。
- SDXL:CLIP ViT-L + OpenCLIP ViT-bigG 双编码器。
- Imagen / SD3:引入 T5 等大语言模型编码器,长文本与复杂语义理解更强。
完整版教学
一、条件生成的一般框架
无条件扩散学的是 p(x),随机生成;文生图要学的是 p(x|c)——给定文本 c 时图像的分布。技术上只需把去噪网络从 ε_θ(x_t, t) 扩展成 ε_θ(x_t, t, c),让它「看着条件去噪」。
问题就归结为:c 这个条件,用什么方式喂进网络最有效? 常见有三种注入方式,文生图主要用第三种:
- 相加/拼接(用于标量或全局条件):把条件编码成向量,加到特征或时间嵌入上。适合类别标签、时间步这类全局、无空间结构的条件。
- 自适应归一化(AdaLN/FiLM):用条件生成缩放和偏移参数去调制特征。适合全局风格类条件,DiT 用得多。
- 交叉注意力(用于序列条件):适合文本这种变长、有语义结构的条件,能做空间自适应对齐。文生图的主力。
二、为什么文本必须用交叉注意力
文本有两个特点决定了它适合交叉注意力:
- 变长且序列化:一句提示词有若干 token,长度不固定。交叉注意力天然处理变长序列。
- 需要空间相关的条件读取:图像不同区域可能响应不同词。交叉注意力让每个空间 Token 分别对文本加权,但一个空间 Token 往往对应潜空间区域而非单个像素。
举例:“a cat wearing a red hat”。理想情况下,猫头附近的 Query 会更多读取 red/hat,身体区域更多读取 cat;训练只通过图文目标间接促成这种模式,并没有显式分割监督。因此注意力可能扩散、属性可能错绑,这套机制增强了组合条件能力,却不等于模型已经精确理解空间关系。
易错点:Cross-Attention 图可用于可视化或 Prompt-to-Prompt 一类编辑控制,但“注意力较高”不等于该词对像素具有严格因果归属,编辑影响也可能越过目标区域。
三、时间步条件:另一路不可忽视的注入
除了文本,时间步或噪声强度也是必须注入的条件:同一个带噪输入在不同 SNR 下对应的最优预测函数不同。常见 U-Net 用下面的方式编码,但并非只允许“相加”这一条路线:
- 把 t 或 log-SNR 用正弦/Fourier 特征或可学习嵌入变成向量;
- 过一个小 MLP 得到时间嵌入
t_emb; - 在 U-Net 的多个残差块里把
t_emb加到特征,或生成 scale/shift 调制参数。
面试常把「文本条件」和「时间条件」一起问,记住:文本走交叉注意力(空间自适应),时间走嵌入相加/调制(全局)。
四、CLIP 文本编码器的作用与局限
早期 Stable Diffusion 使用 CLIP 文本塔的隐藏状态,借助图文对比预训练获得视觉相关的语义表示。去噪网络仍需在扩散训练中学习如何读取这些状态,不能理解成直接把 CLIP 最终投影向量当作像素说明书。
- SD 1.x 所用 CLIP 文本塔上下文窗口较短,对长文本、计数与复杂关系的表示有限;去噪架构、训练 Caption 和数据对齐质量也共同决定这些失败。
- 更强或更多文本编码器能改善部分语义覆盖,但不会单独保证计数与空间关系正确,还需要训练数据和生成骨干配合。
五、把整条链路串起来(文生图一次前向)
- “a red car on green grass” → tokenize → CLIP → 文本嵌入
c; - 当前潜图
z_t进 U-Net; - U-Net 每个残差块注入时间嵌入
t_emb;每个注意力块用交叉注意力融合c; - U-Net 输出噪声预测
ε_θ(z_t, t, c); - 配合 CFG:再算一次无条件
ε_θ(z_t, t, ∅),外推放大; - 采样器据此得到
z_{t-1},循环若干步 →z₀→ VAE 解码 → 图像。
六、跟踪一个文本 token 如何影响图像
设文本编码器输出 77 个 token、每个 768 维,U-Net 某层有 1024 个空间位置。Cross-Attention 让 1024 个图像 query 对 77 个文本 key 打分,形成 1024×77 的相关度矩阵;“red”相关 token 可在对应空间位置获得更高权重,从而改变该位置的去噪方向。
Q: image features [1024, d]
K,V: text features [77, d]
attention map: [1024, 77]
output: text-conditioned image features [1024, d]
| 失败类型 | 示例 | 应测能力 |
|---|---|---|
| 属性错绑 | 红球变成红盒 | 属性绑定 |
| 数量错误 | 三只生成两只 | 计数 |
| 关系错误 | 猫没有在桌下 | 空间关系 |
文本编码器的上下文长度会截断过长提示,词序、权重语法和 tokenizer 也会改变条件表示。评测不能只看 CLIP 相似度,还应检查属性绑定、数量、空间关系和同 seed 下的可控变化,否则模型可能只抓住关键词却组合错误。
七、常见误区与追问
- 误区:文本只在开头喂一次。 经典条件扩散通常在每个去噪时间步的指定条件层读取文本;并非网络的每一层都一定含 Cross-Attention。
- 误区:Cross-Attention 图就是词的精确分割图。 权重是内部软路由证据,会跨层、跨头变化,不能直接解释成因果像素归属。
- 追问:Q/K/V 分别来自哪? Q 来自图像特征,K、V 来自文本嵌入。这是交叉注意力和自注意力的关键区别(自注意力 QKV 全来自图像自身)。
- 追问:SD 为什么常数不清物体个数、搞错空间关系? 文本表示、训练 Caption、图文对齐粒度和去噪网络的组合建模都会影响;更强文本编码器只能缓解其中一部分。
- 追问:负面提示词怎么注入? 走 CFG 的无条件分支位置,把
∅换成负面提示嵌入,让生成远离它。
八、加强记忆
记住两条条件通道:文本是序列条件,经典 LDM 由图像 Query 通过 Cross-Attention 读取文本 Key/Value;时间或噪声强度是全局条件,常经 Fourier/正弦嵌入和 MLP 注入残差块。Cross-Attention 提供空间相关的软读取,不是词—像素硬绑定;CFG 放大条件差分,也不补足关系推理。计数或方位失败要同时检查文本编码器、Caption/数据对齐和去噪骨干,而不能只归因于 CLIP。