Transformer自注意力机制(Self-Attention)的工作原理
Transformer 的自注意力机制(Self-Attention)是现代自然语言处理(NLP)和大模型(如 GPT、BERT)的核心组件。它的主要作用是让模型在处理一个序列(比如一句话)时,能够关注序列中不同位置之间的关联,从而更好地理解上下文。
为了让你直观地理解,我们可以通过一个直观的例子、核心概念(Q、K、V)以及具体的计算步骤这三个层次来解析。
1. 直观理解:为什么要用自注意力?
想象一下这句话:
"The animal didn't cross the street because it was too tired."
(这就动物没有过马路,因为它太累了。)
当人类读到 "it"(它) 这个词时,我们很容易知道这里的 "it" 指的是 "animal"(动物) 而不是 "street"(马路)。
但在自注意力机制出现之前(例如早期的 RNN),机器很难处理这种长距离的指代关系。Self-Attention 的目的就是让机器在处理 "it" 这个词时,能够通过计算,发现 "animal" 对 "it" 的重要性最高,从而把这两个词关联起来。
2. 核心概念:Q、K、V 三剑客
Self-Attention 的核心在于将输入向量变成了三个不同的向量:Query(查询)、Key(键) 和 Value(值)。
这三个概念源自于信息检索(数据库查询)系统:
- Query ():你手里拿着的词(比如 "it"),它去询问其他词:“你们跟我有关系吗?”
- Key ():其他词手里的标签(比如 "animal" 的标签),用来和 Query 进行匹配。
- Value ():词原本包含的实际内容/信息。
比喻:
你去图书馆找书。
- Query 是你的搜索意图(比如“量子力学”)。
- Key 是书脊上的分类编号或书名(用来匹配你的意图)。
- Value 是书里的具体内容。
- 当 Query 和 Key 匹配度很高时,你就把那本书的 Value 取出来阅读。
3. 工作原理:六个步骤
假设我们现在的输入是一句话中的两个单词 和 。
第一步:准备输入
将单词转换为词向量(Embedding)。
第二步:生成 Q、K、V
对于每个单词向量 ,分别乘以三个可学习的权重矩阵 ,得到三个新向量:。
第三步:计算注意力分数(Dot Product)
我们要计算单词 1 对单词 2 的关注度。
拿单词 1 的查询向量 去点积(Dot Product)单词 2 的键向量 。
- 点积结果越大,表示两个词的相关性越高(越相似)。
第四步:缩放(Scaling)
将分数除以 ( 是 Key 向量的维度)。
- 原因:防止点积结果过大,导致后续的 Softmax 梯度极小(梯度消失),利于训练稳定。
第五步:归一化(Softmax)
将得分通过 Softmax 函数处理,变成概率分布(所有分数加起来等于 1)。
- 这得出的就是注意力权重(Attention Weights)。比如处理 "it" 时,"animal" 的权重可能是 0.8,"street" 是 0.1,其他是 0.1。
第六步:加权求和(Weighted Sum)
将计算出的权重乘以对应的 Value 向量 (),然后求和。
结果 就是单词 1 经过 Self-Attention 处理后的新表示。 这个新向量不仅仅包含单词 1 自己的含义,还融合了上下文中与它相关的其他单词的信息。
4. 数学公式汇总
如果用矩阵形式(一次性处理所有单词)表示,这就是那条著名的公式:
- :计算所有词两两之间的相似度分数。
- :缩放分数。
- Softmax:归一化为概率。
- :根据概率提取信息。
5. 进阶:多头注意力(Multi-Head Attention)
Transformer 不仅仅做一个 Self-Attention,而是做多组。
- 原理:使用多组不同的 矩阵。
- 目的:让模型从不同的“视角”去理解句子。
- Head 1 可能关注语法结构(主谓宾关系)。
- Head 2 可能关注指代关系(it -> animal)。
- Head 3 可能关注时态或语气。
最后将所有 Head 的结果拼接起来,通过一个线性层输出。
总结
Self-Attention 的本质是:
它允许序列中的每个元素都“看一眼”序列中的其他所有元素,计算彼此的相关性,并根据相关性的大小,聚合上下文信息来更新自己的表示。
它的优势:
- 并行计算:不像 RNN 需要按顺序一个词一个词读,Self-Attention 可以一次性计算所有词的关系,速度快。
- 长距离依赖:无论两个词在句子中距离多远,它们之间的计算距离都是 1(直接点积),解决了长文本记不住开头的问题。