Attend-and-Excite
通过跨注意力劫持,让Stable Diffusion生成图像时不再遗漏提示词中的主体
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
通过跨注意力劫持,让Stable Diffusion生成图像时不再遗漏提示词中的主体
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
你是否曾用 AI 生成过一张「一只猫和一只狗在草地上玩耍」的图片,却发现草地中央只剩下孤零零的一只动物?或者描述了一朵红色的花配一片蓝天,AI 却固执地把花涂成了紫色?这种「语义丢失」现象,正是 Attend-and-Excite 想要解决的核心问题。
图1:核心效果对比
Stable Diffusion 基础模型(上行)有时会「遗忘」生成多个主体;Attend-and-Excite(下行)通过语义引导确保所有描述主体都正确呈现。蓝色高亮为被激活的 Token。
生成式 AI 在近年来突飞猛进,以 Stable Diffusion 为代表的文生图模型已经能够根据一句文字描述,创造出令人惊叹的视觉作品。然而,这些模型在处理多主体提示词时常常力不从心。以「A horse and a dog」为例,Stable Diffusion 经常只生成马或只生成狗,或者将狗画得像马一样四条腿站立——这并非模型「笨」,而是一种被称为**灾难性忽视(Catastrophic Neglect)**的结构性缺陷。
问题的根源在于扩散模型的跨注意力机制。当模型将文本 Token 转化为图像特征时,每个 Token 会在图像的多个区域「投入注意力」,但某些 Token(尤其是距离较远或语义权重较低的主体)的激活信号往往在去噪过程中逐渐衰减,最终导致该主体被彻底遗忘,或属性(颜色、形状等)被错误地绑定到其他主体上。
来自以色列特拉维夫大学的研究团队(Hila Chefer、Yuval Alaluf 等,SIGGRAPH 2023)提出了一种优雅的解决方案——生成语义护理(Generative Semantic Nursing, GSN),其核心思想是:在推理阶段实时「看护」模型的生成过程,通过干预跨注意力值来确保所有语义主体都能被正确生成。
第一步:Token 定位
用户输入提示词后,代码首先通过 tokenizer 将文本切分为 Token 序列,然后确定需要「加强」的 Token 索引。例如「a cat and a dog」,索引 [2, 5] 分别对应「cat」和「dog」。用户可以通过交互式界面选择要操作的 Token,也可以手动指定。
第二步:跨注意力注入
在每个去噪时间步,Attend-and-Excite 劫持 UNet 中的 Cross-Attention 计算过程。utils/ptp_utils.py 中定义的 AttendExciteCrossAttnProcessor 是这一机制的核心——它在前向传播时将当前时间步的注意力图记录到 AttentionStore 中,然后在反向干预时,对目标 Token 的注意力图应用高斯平滑(GaussianSmoothing),找到响应最强的空间位置,并将其激活值强化后回注到注意力流中。
关键参数:max_iter_to_alter(干预步数,默认25)、scale_factor(激活强化系数,默认20)、scale_range(系数衰减范围)、thresholds(逐阶段调整激活阈值)。
第三步:迭代精炼
Attend-and-Excite 采用迭代式阈值精炼策略——去噪早期允许较低的 Token 激活阈值,后期逐步提高阈值,初期快速形成粗略轮廓,后期精细调整语义保真度。
| 模块 | 功能 |
|---|---|
pipeline_attend_and_excite.py | 自定义 Pipeline,继承 StableDiffusionPipeline,重载 __call__ 实现干预逻辑 |
run.py | 入口脚本,处理命令行参数和交互式 Token 选择 |
config.py | 配置管理,使用 @dataclass 定义所有超参数 |
utils/ptp_utils.py | 核心:Cross-Attention 劫持、注意力聚合、Token 选择 |
utils/gaussian_smoothing.py | 高斯平滑卷积核 |
utils/vis_utils.py | 可视化:注意力热力图、相关性叠加图 |
metrics/ | 评估:CLIP 相似度、BLIP 图像描述匹配 |
底层基于 PyTorch + Diffusers(封装 SD v1.4/v2.1),通过 Transformers 调用 CLIP 文本编码器,评估模块引入 BLIP(Salesforce)进行语义质量评估。
图2:生成效果示例
Attend-and-Excite 在各类复杂提示词上的生成效果,展示了对多主体、属性绑定的语义保真度提升。
这是一款纯命令行研究工具,无 Web 界面。需通过 conda 环境文件创建专用虚拟环境。requirements.txt 固定了旧版依赖(torch==1.12.0、diffusers==0.12.1),在新环境中可能遇到 CUDA 兼容性挑战。
硬件门槛较高:无 NVIDIA GPU 基本无法运行(CPU 推理以小时计)。显存建议 8GB 以上——SD v1.4 模型权重约 4GB,加上中间激活值,8GB 是最低保障。
python run.py --prompt "a cat and a dog" --seeds [0] --token_indices [2,5]
python run.py --prompt "a cat and a dog" --sd_2_1 True --token_indices [2,5]
python run.py --prompt "a cat and a dog" --seeds [0] # 交互式选择
输出保存在 outputs/{prompt}/ 目录。
性能开销:Cross-Attention 劫持和迭代式阈值计算带来额外开销,同等分辨率生成时间增加约 30-50%。
Token 选择依赖经验:普通用户对 Tokenizer 切分逻辑不熟悉,容易选错索引导致效果适得其反。
复杂场景有限:超过 4-5 个主体或复杂空间关系时,单靠激活强化不足以完全解决语义丢失问题。
Attend-and-Excite 的出现折射出 AI 生成领域正在从「追求更高图像质量」转向「追求更精确语义控制」的趋势。用户真正关心的往往是「我写的每个词,AI 是否都忠实地画出来了」。
该项目在 GitHub 上获得 771 颗星,论文被 SIGGRAPH 2023 接收,相关技术已被多个开源项目和商业工具借鉴。
总结:Attend-and-Excite 是一款面向 AI 研究者和高级用户的文本-图像语义保真工具,通过干预扩散模型跨注意力机制有效解决了多主体生成中的语义丢失问题。缺乏容器化支持,部署门槛较高,但清晰的研究代码架构和可观的语义控制效果,使其成为理解扩散模型注意力机制和文本-图像对齐问题的优秀范本。