04 Self-Attention 详解:Q、K、V 到底在做什么?
在上一篇文章中,我们精读了 Transformer 原论文 Attention Is All You Need。Transformer 的核心思想是:不再使用 RNN 或 CNN,而是完全基于 Attention 机制构建序列建模结构。原论文提出的 Transformer 由 Encoder 和 Decoder 组成,其中最关键的模块就是 Scaled Dot-Product Attention 和 Multi-Head Attention。论文摘要中也明确指出,Transformer 是一种完全基于 attention mechanism 的网络结构,去掉了 recurrence 和 convolution,并且更容易并行训练。
一、Self-Attention 要解决什么问题?
在自然语言中,一个词的含义往往不能只看它自己,而要看上下文。
例如下面这句话:苹果发布了新的芯片,性能提升非常明显。这里的“苹果”不是水果,而是公司。
再看另一个句子:我买了一个苹果,吃起来很甜。这里的“苹果”才是水果。
同一个词,在不同上下文中含义不同。
所以语言模型必须解决一个问题:当前 token 应该根据上下文中的哪些 token 来更新自己的表示?Self-Attention 的作用就是让每个 token 都可以主动去“查看”序列中的其他 token,并根据相关程度聚合信息。
简单来说:Self-Attention = 让序列内部的 token 彼此交流信息
假设有一句话:小明 因为 考试 没考好 所以 他 很难过
模型在处理“他”这个 token 时,需要知道“他”指的是“小明”。如果是 RNN,这个信息需要从“小明”一步一步传递到“他”。而 Self-Attention 可以让“他”直接关注“小明”。
这就是 Self-Attention 的直观意义:不再依赖顺序递推,而是让任意 token 之间直接建立联系。
二、从一个句子开始理解 Self-Attention
假设输入句子是:我 喜欢 机器 学习,分词后有 4 个 token:
x1 = 我
x2 = 喜欢
x3 = 机器
x4 = 学习
经过 embedding 层后,每个 token 会变成一个向量:
这些向量可以组成一个矩阵:
假设每个 token 的 embedding 维度是,序列长度是 n,那么:
其中:
- n是 token 数量;
是每个 token 向量的维度。
Self-Attention 要做的事情是:根据所有 token 之间的关系,为每个 token 生成一个新的上下文表示。也就是说,原来的 token 表示只包含自身信息,而经过 Self-Attention 后,每个 token 的表示都会融合其他 token 的信息。
三、为什么需要 Q、K、V?
Self-Attention 中最核心的三个概念是:
Q:Query
K:Key
V:Value
中文通常翻译为:
Query:查询
Key:键
Value:值
这三个词看起来有点抽象,可以先用一个生活化例子理解。假设你去图书馆找书。
你的需求是:我想找一本关于深度学习的书。这个需求就像 Query。图书馆中每本书都有一些标签,例如:
机器学习
深度学习
计算机视觉
自然语言处理
数学基础
这些标签就像 Key。每本书的实际内容就是 Value。你找书的过程可以理解为:
用 Query 去匹配每本书的 Key
找到最相关的书
读取这些书的 Value
对应到 Self-Attention 中:
Query:当前 token 想找什么信息
Key:每个 token 能提供什么匹配信号
Value:每个 token 真正携带的内容信息
所以 Q、K、V 的直观含义是:
| 符号 | 含义 | 直观理解 |
|---|---|---|
| Q | Query | 我想找什么 |
| K | Key | 我有什么特征可供匹配 |
| V | Value | 我真正要提供什么信息 |
注意,这只是帮助理解的比喻。在模型中,Q、K、V 并不是人工定义的,而是通过训练自动学出来的向量表示。
四、Q、K、V 是怎么生成的?
输入矩阵为:
Self-Attention 会通过三个不同的线性变换,把 XXX 映射成 Q、K、V:
