自注意力机制(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=qkT
点积越大,代表两个词的相关性越强。

第三步:缩放与归一化 (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(dk qkT)
这步得到的就是权重

第四步:加权求和
用计算出的权重 α \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),捕捉句子的语法和语义结构。
直观理解解码器问编码器:“为了翻译这个词,我该看原句的哪里?”句子中的词互相对话:“为了理解我自己,我该参考句子里的谁?”

四、 总结与举例

为了让你彻底明白,我们用一个翻译任务(中文翻译成英文)来做最后的类比:

  1. 自注意力机制 (Self-Attention) 的工作(在 Encoder 阶段):

    • 模型在读中文句子“我 / 爱 / 吃 / 苹果”。
    • 当读到“”的时候,自注意力机制会看一遍整句,“吃”会发现它和“苹果”关系最紧密(因为是宾语),和“我”也有关系(主语)。
    • 于是,“吃”这个词的向量里,就融合了“苹果”和“我”的信息。
    • 作用: 深刻理解中文句子的内部逻辑。
  2. 标准注意力机制 (Cross-Attention) 的工作(在 Decoder 阶段):

    • 模型现在开始生成英文,假设已经生成了 “I love”。
    • 现在要生成下一个词(“eat”)。
    • Decoder(英文端)发出一个 Query:“我现在要翻译动词了,原句的动作是什么?”
    • Encoder(中文端)提供 KeysValues
    • 注意力机制计算发现,英文的当前状态与中文的“”对应关系最大。
    • 作用: 把生成的英文和原始的中文对齐。

一句话总结:

  • 注意力机制是不同序列间的桥梁(对齐信息)。
  • 自注意力机制是序列内部的雷达(捕捉内部结构和上下文)。

无论是“自注意力”还是“标准(交叉)注意力”,它们的核心计算公式(也就是计算注意力分数的公式)是完全一样的。区别仅在于 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(dk QKT)V

公式拆解:

  1. Q K T QK^T QKT:查询向量与键向量做点积。物理含义:计算相似度(匹配分数)。
  2. / d k / \sqrt{d_k} /dk :除以维度的平方根。物理含义:缩放,防止点积结果太大导致 Softmax 梯度消失。
  3. softmax ( …   ) \text{softmax}(\dots) softmax():归一化。物理含义:将分数转化为概率分布(权重矩阵),总和为 1。
  4. … 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(dk QKT)V softmax ( Q K T d k ) V \text{softmax}(\frac{QK^T}{\sqrt{d_k}})V softmax(dk QKT)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,VdictXdict
  • 交叉注意力 (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} QessayYessay,而 K d i c t , V d i c t ← X d i c t K_{dict}, V_{dict} \leftarrow X_{dict} Kdict,VdictXdict

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. “在词嵌入后又做了一步” —— ✅ 是的,但通常是“很多步”

你说的没错,流程确实是这样的:

  1. 输入(词嵌入 Embedding):
    首先,计算机去查字典(Lookup Table),把“苹果”变成一个固定的向量(比如 [0.1, 0.5, -0.3])。这时候,这个向量是的,它包含了“苹果”的通用含义。
  2. 中间处理(自注意力机制 Self-Attention):
    这就是你说的“做了一步”。但实际上,现在的 GPT-4 或 Llama 等模型,会把这个步骤重复堆叠几十层甚至上百层
    • 第 1 层 Attention:可能只明白了“苹果”和“吃”有关。
    • 第 10 层 Attention:明白了这个句子的语法结构。
    • 第 96 层 Attention:深刻理解了这句话背后的逻辑推理、情感色彩和隐喻。
  3. 输出: 得到一个高度抽象、融合了所有上下文信息的“最终向量”。

2. “主要是用来给词语打标签的吗?” —— 🔄 不完全是“打标签”,更像是“变形”

“打标签”这个词听起来像是给它贴上“名词”、“动词”或者“褒义词”这种固定的分类标签。

更准确的说法是:“去歧义”和“丰富内涵”(Contextualization)。

  • 词嵌入(Embedding) 就像是生肉。无论你打算做什么菜,生猪肉永远是生猪肉。
  • 自注意力(Self-Attention) 就像是烹饪
    • 如果上下文是“回锅肉”,Attention 就会把它变成“熟的、辣的猪肉”。
    • 如果上下文是“红烧肉”,Attention 就会把它变成“熟的、甜的猪肉”。

所以,它不是简单地贴标签,而是彻底改变了这个向量的数值,让它从一个“通用的词”变成了“在这个特定语境下独一无二的词”。

3. “接下来就可以拿这个计算或者预测下一个单词了” —— ✅ 完全正确!

这就是 GPT(Generative Pre-trained Transformer)类模型的终极目标

当最后一个 Transformer 层跑完后,针对句子里的最后一个词,我们会得到一个最终的向量 H f i n a l H_{final} Hfinal。这个向量包含了前面所有内容的信息积累。

它是怎么预测下一个词的?

  1. 映射(Linear Layer):
    把这个比如 4096 维的向量 H f i n a l H_{final} Hfinal,通过一个线性层(矩阵乘法),映射到一个超级长的向量上。这个长向量的长度等于词表的大小(比如 50,000 个词)。
  2. 打分(Logits):
    这时候,这 50,000 个位置上的数值,代表了下一个词是词表中某一个词的“可能性分数”。
  3. 概率(Softmax):
    用 Softmax 把分数变成概率。比如:
    • “好吃”的概率:80%
    • “手机”的概率:1%
    • “烂了”的概率:19%
  4. 抽样:
    模型根据概率选择“好吃”,于是输出了下一个词。

总结上面的理解

上面的逻辑链条非常清晰,我把它串起来就是现代 LLM 的核心架构:

  1. 查字典(词嵌入)拿到原始素材。
  2. 疯狂开会讨论(多层自注意力机制):让词与词之间通过 Q、K、V 互相交流,更新自己的向量,把上下文融进去。
  3. 总结发言(预测层):拿到最后一个词融合后的向量,计算它后面最可能接哪个词。

这就是 ChatGPT 能够和你对话的底层逻辑!

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐