如果你用过Stable Diffusion或者Midjourney,可能会好奇一个事情:输入一句“一只戴墨镜的橘猫坐在沙滩上”,模型为什么真的能画出橘猫、墨镜和沙滩,而且位置关系大致正确?这背后的功臣之一就是注意力机制,尤其是其中的Cross-Attention。可以说,没有Cross-Attention,文生图模型就变成了“盲画”,只能随机生成一些好看但和提示词毫无关系的图像。本文就从基础概念讲起,一步步拆解Attention与Cross-Attention在AI图像生成中扮演的角色。

注意力机制到底是什么:从人眼看图说起
人在看一张图片的时候,视线并不是均匀扫过每个像素的。当你观察一群人中谁在笑时,你的注意力会自动聚焦到几个脸部的区域,其他背景信息被弱化处理。注意力机制就是借鉴了这种思想:让模型在处理某个位置的信息时,能够动态地决定“应该重点参考哪些其他位置的信息”。
用稍微技术一点的语言来说,注意力机制计算的是一组相关性权重。假设图像被切成了很多个小块,当模型处理其中一块时,它会拿这一块的信息去和其他所有块做匹配,匹配程度高的块会获得更大的权重,最终这一块的输出就是所有块的加权求和。这样,远处的语义相关信息也能直接参与计算,解决了卷积网络感受野受限的问题。
具体实现上,注意力机制依赖三个核心概念:Query(查询)、Key(键)和Value(值)。可以打个比方:你去图书馆找书,你脑子里的需求就是Query,每本书书脊上的标签就是Key,书的内容就是Value。你拿Query去和每个Key比对,越匹配的书你就越仔细阅读,最后你获得的“知识”就是所有书内容的加权混合。计算公式可以写成:
import torch
import torch.nn.functional as F
def attention(query, key, value):
# query: (seq_q, d), key: (seq_k, d), value: (seq_k, d)
d_k = query.size(-1)
# 计算Query和Key的相似度分数
scores = torch.matmul(query, key.transpose(-2, -1)) / (d_k ** 0.5)
# softmax归一化得到权重
weights = F.softmax(scores, dim=-1)
# 加权求和Value
output = torch.matmul(weights, value)
return output, weights这段代码就是注意力机制的最简版本。除以根号d_k是为了防止数值过大导致softmax梯度消失,这个细节在实际工程中非常重要。weights矩阵就是常说的注意力图,它可以可视化出来,直观展示模型在“关注”哪里。
Self-Attention与Cross-Attention的区别:图像内部的对话与跨模态的翻译
注意力机制根据Q、K、V的来源不同,可以分为Self-Attention(自注意力)和Cross-Attention(交叉注意力)。这两者在扩散模型中分工明确,理解它们的区别是搞懂图像生成流程的关键。
Self-Attention的Query、Key、Value全部来自同一个序列。在图像生成场景中,就是把图像自身的各个像素块互相做注意力计算。它的作用是协调图像内部的一致性:比如猫的耳朵应该和猫的脸部风格统一,左边袖子的褶皱应该和右边袖子的光影逻辑一致。Self-Attention不接触文本信息,它只负责让画面“内部和谐”。
Cross-Attention则不同:它的Query来自一种模态,而Key和Value来自另一种模态。在文生图模型中,Query来自图像特征,Key和Value来自文本编码器输出的文本特征。这个过程相当于模型拿着图像的每个位置去“询问”文本:我这块区域应该画什么?文本的每个token作为Key给出匹配分数,然后对应的信息被注入到图像特征里。正是这个机制,让“沙滩”这个词直接影响画面下方区域的生成,让“夕阳”影响整体色调。
两者的对比可以用一张表来看清楚:
| 对比维度 | Self-Attention | Cross-Attention |
|---|---|---|
| Q的来源 | 图像特征 | 图像特征 |
| K、V的来源 | 图像特征 | 文本特征 |
| 核心作用 | 维持图像内部结构一致 | 注入文本语义条件 |
| 注意力图含义 | 像素块之间的关系强度 | 图像区域与文本token的关联 |
Cross-Attention在扩散模型中的工作位置与流程
以Stable Diffusion为例,整个生成流程是在潜空间中进行的去噪迭代:模型从一团纯噪声开始,经过几十步逐步“雕刻”出图像。UNet是去噪的主力网络,它的每一层都穿插着Self-Attention和Cross-Attention模块。文本提示词先经过CLIP的文本编码器变成一组token特征向量,这些向量会被送进UNet的每一个Cross-Attention层。
在去噪的每一步,UNet的残差块先处理图像特征,随后Self-Attention在图像内部做信息交换,接着Cross-Attention把文本语义融入进来。这个过程会重复几十上百次,文本条件就这样一点一滴地渗透到图像的每一个细节中。这也解释了一个现象:为什么越靠后的去噪步骤,修改提示词的效果越弱?因为画面的整体布局在早期步骤就通过Cross-Attention确定下来了,后期步骤更多是在细化纹理。
一个非常有意思的实验是注意力图可视化。研究者发现,当提示词包含多个名词时,Cross-Attention的权重图会显示出每个名词对应的清晰空间区域。比如提示词里有一个“cat”token,那么在生成早期步骤的注意力图中,可以观察到一块高响应区域恰好对应最终猫出现的位置。基于这一发现,社区产生了许多玩法,比如通过操纵注意力图来控制物体出现的位置,或者放大某个token的权重来增强对应元素的存在感。著名的注意力控制技巧,其核心思路就是在推理过程中干预Cross-Attention的输出,把某个token的注意力引导到指定区域。
实践视角:Cross-Attention带来的能力与局限
理解了原理,再回头看实际使用中的现象就通透了。为什么提示词过长时后半段容易被忽略?因为Cross-Attention的容量有限,token之间的注意力权重存在竞争,当一个句子塞进太多概念时,权重会被摊薄,模型自然顾此失彼。这也是为什么有经验的使用者会把重要关键词放在前面,或者用括号语法增加权重。
Cross-Attention同样是ControlNet、IP-Adapter等扩展技术的基石。IP-Adapter的思路是把参考图像编码成特征后,通过一个并行的Cross-Attention分支注入UNet,从而实现图像风格或者角色的迁移,而不需要重新训练整个模型。这种“即插即用”的设计之所以可行,正是因为Cross-Attention天生就是一个灵活的信息注入接口:只要能把外部信息编码成Key和Value,就能影响图像生成。
当然,注意力机制也有代价。注意力计算的复杂度与序列长度的平方成正比,图像分辨率提升时计算量急剧增长,这也是Stable Diffusion选择在低维潜空间中做注意力的原因之一。此外,Cross-Attention对文本编码器的质量高度依赖,同一个模型搭配不同的文本编码器,对语义的理解能力会有明显差异。社区后续引入更强的文本编码器来改善生成效果,本质上就是在优化Cross-Attention的输入质量。
总的来说,注意力机制是现代AI图像生成的骨架:Self-Attention保证画面内部的协调统一,Cross-Attention负责把人类语言翻译成视觉元素。抓住这两个模块的分工,再去学习扩散模型的各种衍生技术,就会顺畅很多。
注意力机制Cross-AttentionAI图像生成修改时间:2026-09-11 14:28:56