Cross Attention:Transformer 如何融合双侧信息
Cross Attention 是 Transformer 编码器-解码器架构中的桥梁,它让解码器在生成每个词时能够"看到"编码器的全部输出信息。
Self Attention vs Cross Attention
先明确两者的区别:
| 类型 | Q 来源 | K、V 来源 | 用途 |
|---|---|---|---|
| Self Attention | 自身序列 | 自身序列 | 理解输入内部关系 |
| Cross Attention | 解码器 | 编码器 | 融合源端和目标端信息 |
Self Attention:
Q = 目标序列自己的表示
K, V = 目标序列自己的表示
"我" → 关注 "我" "喜欢" "吃" "苹果"(都在目标端)
Cross Attention:
Q = 解码器的当前状态
K, V = 编码器的输出
生成 "eat" 时 → 关注 "我" "喜欢" "吃" "苹果"(来自源端)
在翻译任务中的工作流程
以英译中 "I like eating apples" → "我喜欢吃苹果" 为例:
编码器(Encoder):
输入: [I, like, eating, apples]
经过 Self Attention × N 层
输出: [enc_I, enc_like, enc_eating, enc_apples]
解码器(Decoder)生成过程:
步骤 1: 生成 "我"
Self Attention: "我" 看到自己
Cross Attention: Q="我", K/V=[enc_I, enc_like, enc_eating, enc_apples]
注意力: "我" 最关注 "I"(权重 0.72)
步骤 2: 生成 "喜欢"
Self Attention: "喜欢" 看到 "我"
Cross Attention: Q="喜欢", K/V=编码器输出
注意力: "喜欢" 最关注 "like"(权重 0.68)
步骤 3: 生成 "吃"
Cross Attention: "吃" 最关注 "eating"(权重 0.71)
步骤 4: 生成 "苹果"
Cross Attention: "苹果" 最关注 "apples"(权重 0.85)
Cross Attention 的三种典型应用
1. 机器翻译
源语言 → 编码器 → Cross Attention → 解码器 → 目标语言
2. 图像描述(Image Captioning)
图像特征(ViT/CNN) → 编码器 → Cross Attention → 解码器 → 文字描述
3. 文生图(Stable Diffusion)
文本嵌入 → Cross Attention → UNet 的每个层 → 引导图像生成
Stable Diffusion 中的 Cross Attention:
Q = 图像特征(UNet 中间层)
K, V = 文本 CLIP 嵌入
效果:文本中的 "红色" 会影响图像对应区域生成红色
交叉注意力的 Mask 机制
在解码器中,Cross Attention 不需要 Mask(因为编码器的全部输出都是可见的)。但解码器的 Self Attention 需要 Mask,确保生成位置 i 时只能看到位置 1 到 i-1 的内容。
# 解码器中的注意力 Mask
Self Attention Mask(下三角矩阵):
[[1, 0, 0, 0],
[1, 1, 0, 0],
[1, 1, 1, 0],
[1, 1, 1, 1]]
Cross Attention: 无 Mask,全部可见
总结
Cross Attention 是 Transformer 中连接编码器和解码器的桥梁。它的核心作用是让解码器在每一步生成时,都能动态地关注源端最相关的信息。这种灵活的信息融合机制,使 Transformer 在翻译、图像生成、多模态理解等任务中都取得了突破性进展。