自注意力机制 (Self-Attention)
自注意力机制(Self-Attention)是现代自然语言处理(NLP)特别是 Transformer 模型(如 BERT、GPT)的基石。
为了讲清楚,我们先从宏观的注意力机制(Attention Mechanism)入手,再深入到自注意力机制(Self-Attention),最后对比它们的区别。
一、 什么是注意力机制(Attention Mechanism)?
在深度学习中,注意力机制的灵感来源于人类的视觉注意力。当你看到一张照片时,你不会盯着整张图看,而是会聚焦在某个特定的核心区域(比如图中的一只狗),而忽略背景。
在 NLP 的早期(Seq2Seq 模型时代),处理翻译任务时,模型需要把输入的一长串句子压缩成一个固定长度的向量。这就像让你背诵一篇课文,然后只用一个脑细胞记住所有内容,这会导致长句子的信息丢失。
注意力机制的引入解决了这个问题:
它允许解码器(Decoder)在生成每一个输出词时,都回头看一遍输入序列(Encoder),并且有侧重地关注输入序列中与当前生成词最相关的部分。
注意力机制底层原理
为了通过数学描述这个过程,Google 提出了三个核心概念:Query(查询)、Key(键)、Value(值)。
比喻:图书馆查书
- Query (Q):你手中的书单(你想找什么)。
- Key (K):图书馆书架上每本书的标签(书的分类号)。
- Value (V):书里的具体内容。
- 过程:你拿着书单(Q)去和标签(K)比对,计算相似度(Attention Score)。如果相似度高,你就把那本书的内容(V)取出来读。
二、 详解自注意力机制(Self-Attention)
自注意力机制是注意力机制的一种特殊变体。
1. 核心定义
普通的注意力机制通常发生在两个不同的序列之间(比如“中文句子”对“英文句子”)。
而自注意力机制,顾名思义,是自己关注自己。它计算的是序列中每个词与其他所有词之间的关联程度。
2. 为什么要“自关注”?
看这个句子:
“The animal didn’t cross the street because it was too tired.”
作为人类,我们知道 “it” 指的是 “animal”。但是对于计算机,“it” 离 “street” 很近,离 “animal” 较远,很容易搞混。
自注意力机制的作用就是: 当模型处理 “it” 这个词时,通过计算,发现它与 “animal” 的关联度极高,从而将 “animal” 的语义信息融入到 “it” 的向量表示中。
3. 计算步骤(数学原理)
假设我们输入一句话 X X X(由单词向量组成),计算过程分为 4 步:
第一步:生成 Q、K、V
对于输入序列中的每一个单词向量
x
x
x,我们通过三个可学习的权重矩阵
W
Q
,
W
K
,
W
V
W^Q, W^K, W^V
WQ,WK,WV,分别计算出三个向量:
- q q q (Query):查询向量
- k k k (Key):键向量
-
v
v
v (Value):值向量
注意:在自注意力中,Q、K、V 均源自同一个输入 X X X。
第二步:计算注意力分数 (Attention Score)
我们要计算单词 A 对单词 B 的关注度。使用 A 的
q
q
q 向量点积 B 的
k
k
k 向量。
Score
=
q
⋅
k
T
\text{Score} = q \cdot k^T
Score=q⋅kT
点积越大,代表两个词的相关性越强。
第三步:缩放与归一化 (Softmax)
为了防止梯度消失,通常会将分数除以
d
k
\sqrt{d_k}
dk(向量维度的平方根),然后通过 Softmax 函数,将分数转化为概率分布(总和为 1)。
α
=
Softmax
(
q
⋅
k
T
d
k
)
\alpha = \text{Softmax}\left(\frac{q \cdot k^T}{\sqrt{d_k}}\right)
α=Softmax(dkq⋅kT)
这步得到的就是权重。
第四步:加权求和
用计算出的权重
α
\alpha
α 乘以对应的
v
v
v (Value) 向量,然后把它们加起来。
Z
=
∑
(
α
⋅
v
)
Z = \sum (\alpha \cdot v)
Z=∑(α⋅v)
得到的
Z
Z
Z 就是该单词经过自注意力机制后,融合了上下文信息的新向量表示。
三、 自注意力机制 vs. 标准注意力机制
虽然公式看起来差不多,但它们的应用场景和数据来源有本质区别。我们可以从以下几个维度对比:
| 特性 | 标准注意力机制 (Standard / Cross-Attention) | 自注意力机制 (Self-Attention) |
|---|---|---|
| 数据来源 | 跨序列。通常涉及两个序列(Encoder 和 Decoder)。 | 单序列。只涉及一个序列(Encoder 内部或 Decoder 内部)。 |
| Q, K, V 的来源 | Q 来自目标序列 (Decoder 的上一个状态); K, V 来自源序列 (Encoder 的输出)。 | Q, K, V 全部来自同一个输入序列 (通过不同的线性变换)。 |
| 应用场景 | Seq2Seq 任务:机器翻译(对齐源语言和目标语言)、语音识别、图像描述生成。 | 特征提取与表示学习:Transformer 的 Encoder(理解语义)、BERT、GPT。 |
| 解决的问题 | 解决输入和输出之间的对齐问题(Alignment)。比如英文的倒装句如何对应中文。 | 解决序列内部的长距离依赖问题(Dependency),捕捉句子的语法和语义结构。 |
| 直观理解 | 解码器问编码器:“为了翻译这个词,我该看原句的哪里?” | 句子中的词互相对话:“为了理解我自己,我该参考句子里的谁?” |
四、 总结与举例
为了让你彻底明白,我们用一个翻译任务(中文翻译成英文)来做最后的类比:
-
自注意力机制 (Self-Attention) 的工作(在 Encoder 阶段):
- 模型在读中文句子“我 / 爱 / 吃 / 苹果”。
- 当读到“吃”的时候,自注意力机制会看一遍整句,“吃”会发现它和“苹果”关系最紧密(因为是宾语),和“我”也有关系(主语)。
- 于是,“吃”这个词的向量里,就融合了“苹果”和“我”的信息。
- 作用: 深刻理解中文句子的内部逻辑。
-
标准注意力机制 (Cross-Attention) 的工作(在 Decoder 阶段):
- 模型现在开始生成英文,假设已经生成了 “I love”。
- 现在要生成下一个词(“eat”)。
- Decoder(英文端)发出一个 Query:“我现在要翻译动词了,原句的动作是什么?”
- Encoder(中文端)提供 Keys 和 Values。
- 注意力机制计算发现,英文的当前状态与中文的“吃”对应关系最大。
- 作用: 把生成的英文和原始的中文对齐。
一句话总结:
- 注意力机制是不同序列间的桥梁(对齐信息)。
- 自注意力机制是序列内部的雷达(捕捉内部结构和上下文)。
无论是“自注意力”还是“标准(交叉)注意力”,它们的核心计算公式(也就是计算注意力分数的公式)是完全一样的。区别仅在于 Q、K、V 这三个矩阵是怎么变出来的。
以下是详细的公式列表和对比分析。
一、 核心计算公式(两者通用)
无论是哪种注意力机制,最经典的计算方式都是 Scaled Dot-Product Attention(缩放点积注意力)。
Attention ( Q , K , V ) = softmax ( Q K T d k ) V \text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V Attention(Q,K,V)=softmax(dkQKT)V
公式拆解:
- Q K T QK^T QKT:查询向量与键向量做点积。物理含义:计算相似度(匹配分数)。
- / d k / \sqrt{d_k} /dk:除以维度的平方根。物理含义:缩放,防止点积结果太大导致 Softmax 梯度消失。
- softmax ( … ) \text{softmax}(\dots) softmax(…):归一化。物理含义:将分数转化为概率分布(权重矩阵),总和为 1。
- … V \dots V …V:用计算出的权重对 V 加权求和。物理含义:取出我们需要的信息。
二、 关键区别:Q、K、V 的来源公式
这是两者分道扬镳的地方。
1. 自注意力机制 (Self-Attention)
场景:Transformer 的 Encoder 内部,或 Decoder 的自回归部分。
特点:输入序列自己关注自己。
假设输入序列的向量矩阵为
X
X
X(形状为 [序列长度, 向量维度]),那么:
Q = X W Q K = X W K V = X W V \begin{aligned} Q &= X W^Q \\ K &= X W^K \\ V &= X W^V \end{aligned} QKV=XWQ=XWK=XWV
- 解释:Q、K、V 全部源自同一个输入 X X X,只是经过了不同的线性变换(乘以了不同的权重矩阵 W Q , W K , W V W^Q, W^K, W^V WQ,WK,WV)。
- 含义:句子里的每个词(X)都在问自己(Q):我跟句子里的其他词(K)有什么关系?然后根据关系聚合信息(V)。
2. 标准/交叉注意力机制 (Cross-Attention)
场景:Seq2Seq 模型,或者 Transformer 中 Decoder 连接 Encoder 的那层。
特点:一个序列关注另一个序列(比如:翻译生成的词关注原句)。
假设解码器当前的输入(查询方)为 Y Y Y,而编码器的输出(被查询方)为 X X X,那么:
Q = Y W Q K = X W K V = X W V \begin{aligned} Q &= Y W^Q \\ K &= X W^K \\ V &= X W^V \end{aligned} QKV=YWQ=XWK=XWV
- 解释:
- Q Q Q 来自 Y Y Y(目标序列/Decoder)。
- K K K 和 V V V 来自 X X X(源序列/Encoder)。
- 含义:翻译时的当前词(Y)拿着查询请求(Q)去问原句子(X/Encoder)的键(K):我应该关注原句的哪部分?然后从原句的值(V)中提取信息。
三、 深度对比总结表
| 比较维度 | 自注意力机制 (Self-Attention) | 标准/交叉注意力机制 (Cross-Attention) |
|---|---|---|
| 核心公式 | softmax ( Q K T d k ) V \text{softmax}(\frac{QK^T}{\sqrt{d_k}})V softmax(dkQKT)V | softmax ( Q K T d k ) V \text{softmax}(\frac{QK^T}{\sqrt{d_k}})V softmax(dkQKT)V |
| 数据源头 | 同源。Q, K, V 均来自同一个 X X X。 | 异源。Q 来自 Y Y Y,K, V 来自 X X X。 |
| Q 的公式 | Q = X W Q Q = X W^Q Q=XWQ | Q = Y W Q Q = Y W^Q Q=YWQ (来自解码器状态) |
| K 的公式 | K = X W K K = X W^K K=XWK | K = X W K K = X W^K K=XWK (来自编码器输出) |
| V 的公式 | V = X W V V = X W^V V=XWV | V = X W V V = X W^V V=XWV (来自编码器输出) |
| 序列长度 | Q, K, V 的序列长度通常相等(都是 L x L_x Lx)。 | Q 的长度是 L y L_y Ly (输出长度),K, V 的长度是 L x L_x Lx (输入长度)。 |
| 物理意义 | 特征提取与关联。理解句子内部结构,捕获长距离依赖。 | 对齐 (Alignment)。将输出序列的信息与输入序列的信息对齐。 |
| 典型位置 | Transformer 的 Encoder 模块;Decoder 的第一层。 | Transformer 的 Decoder 模块的第二层(中间层)。 |
四、 总结
如果把这个过程比作查字典:
-
自注意力 (Self-Attention):
你手上有一本字典(输入 X X X)。你想理解字典里第 10 页的某个字,于是你翻阅这同一本字典的第 20 页、第 50 页来寻找解释。- 公式: Q d i c t , K d i c t , V d i c t ← X d i c t Q_{dict}, K_{dict}, V_{dict} \leftarrow X_{dict} Qdict,Kdict,Vdict←Xdict
-
交叉注意力 (Cross-Attention):
你在写作文(输入 Y Y Y),手上拿着一张生词表(查询 Q Q Q)。你旁边放着一本字典(源输入 X X X)。你拿着生词表去查旁边的字典( K , V K, V K,V)。- 公式: Q e s s a y ← Y e s s a y Q_{essay} \leftarrow Y_{essay} Qessay←Yessay,而 K d i c t , V d i c t ← X d i c t K_{dict}, V_{dict} \leftarrow X_{dict} Kdict,Vdict←Xdict
Attention(Q, K, V)作用是什么呢
Attention ( Q , K , V ) \text{Attention}(Q, K, V) Attention(Q,K,V) 看作是一个函数,它本质上是一个新的向量(或者向量矩阵),通过它得到了一个新词,包含了上下文之间的关系和它本身的内容。
1. “这个值是一个向量”
Attention 的输出结果(通常记为
Z
Z
Z)确实是一个向量。
它的维度通常和输入向量保持一致(比如输入是 512 维,输出也是 512 维)。这个向量是计算机理解这个词的“最终形态”。
2. “包含了它本身的内容”
这个向量依然代表这个词自己。这是通过两个机制保证的:
- 自关注(Self-Focus): 在计算注意力分数时,一个词通常会给自己打很高的分(Query 和 Key 匹配度很高)。这意味着在加权求和时,它保留了很大一部分自己的 V V V(Value)。
- 残差连接(Residual Connection): (这是一个进阶补充) 在实际的 Transformer 结构中,Attention 层的输出通常会直接加上原始的输入向量( X + Attention ( X ) X + \text{Attention}(X) X+Attention(X))。这就像是给模型上了一道保险:无论怎么混合上下文,原始信息(它本身的内容)绝对不会丢。
3. “与上下文之间的关系”
这就是 Attention 的魔力。这个向量不再是静态的,它“吸收”了周围的信息。
- 加权融合: 如果“苹果”这个词旁边出现了“好吃”,Attention 机制会算出它们关系紧密,于是把“好吃”这个词向量的一部分特征(Value)加到了“苹果”的向量里。
- 动态变化:
- 在句子 “I ate an apple” 中,“apple”的向量里融入了 “ate”(吃)的信息 → \rightarrow → 代表食物。
- 在句子 “Apple released a new phone” 中,“Apple”的向量里融入了 “phone”(手机)的信息 → \rightarrow → 代表科技公司。
本质上自注意力主要是用来给词语打标签的吗?相当于在词嵌入后又做了一步吗,接下来就可以拿这个得到的新的词语计算或者预测下一个单词了?
1. “在词嵌入后又做了一步” —— ✅ 是的,但通常是“很多步”
你说的没错,流程确实是这样的:
- 输入(词嵌入 Embedding):
首先,计算机去查字典(Lookup Table),把“苹果”变成一个固定的向量(比如[0.1, 0.5, -0.3])。这时候,这个向量是死的,它包含了“苹果”的通用含义。 - 中间处理(自注意力机制 Self-Attention):
这就是你说的“做了一步”。但实际上,现在的 GPT-4 或 Llama 等模型,会把这个步骤重复堆叠几十层甚至上百层。- 第 1 层 Attention:可能只明白了“苹果”和“吃”有关。
- 第 10 层 Attention:明白了这个句子的语法结构。
- 第 96 层 Attention:深刻理解了这句话背后的逻辑推理、情感色彩和隐喻。
- 输出: 得到一个高度抽象、融合了所有上下文信息的“最终向量”。
2. “主要是用来给词语打标签的吗?” —— 🔄 不完全是“打标签”,更像是“变形”
“打标签”这个词听起来像是给它贴上“名词”、“动词”或者“褒义词”这种固定的分类标签。
更准确的说法是:“去歧义”和“丰富内涵”(Contextualization)。
- 词嵌入(Embedding) 就像是生肉。无论你打算做什么菜,生猪肉永远是生猪肉。
- 自注意力(Self-Attention) 就像是烹饪。
- 如果上下文是“回锅肉”,Attention 就会把它变成“熟的、辣的猪肉”。
- 如果上下文是“红烧肉”,Attention 就会把它变成“熟的、甜的猪肉”。
所以,它不是简单地贴标签,而是彻底改变了这个向量的数值,让它从一个“通用的词”变成了“在这个特定语境下独一无二的词”。
3. “接下来就可以拿这个计算或者预测下一个单词了” —— ✅ 完全正确!
这就是 GPT(Generative Pre-trained Transformer)类模型的终极目标。
当最后一个 Transformer 层跑完后,针对句子里的最后一个词,我们会得到一个最终的向量 H f i n a l H_{final} Hfinal。这个向量包含了前面所有内容的信息积累。
它是怎么预测下一个词的?
- 映射(Linear Layer):
把这个比如 4096 维的向量 H f i n a l H_{final} Hfinal,通过一个线性层(矩阵乘法),映射到一个超级长的向量上。这个长向量的长度等于词表的大小(比如 50,000 个词)。 - 打分(Logits):
这时候,这 50,000 个位置上的数值,代表了下一个词是词表中某一个词的“可能性分数”。 - 概率(Softmax):
用 Softmax 把分数变成概率。比如:- “好吃”的概率:80%
- “手机”的概率:1%
- “烂了”的概率:19%
- 抽样:
模型根据概率选择“好吃”,于是输出了下一个词。
总结上面的理解
上面的逻辑链条非常清晰,我把它串起来就是现代 LLM 的核心架构:
- 查字典(词嵌入)拿到原始素材。
- 疯狂开会讨论(多层自注意力机制):让词与词之间通过 Q、K、V 互相交流,更新自己的向量,把上下文融进去。
- 总结发言(预测层):拿到最后一个词融合后的向量,计算它后面最可能接哪个词。
这就是 ChatGPT 能够和你对话的底层逻辑!
更多推荐



所有评论(0)