date
Feb 23, 2026
slug
2026-02-23-how-to-understand-multi-head-attention-in-transformer
status
Published
tags
Transformer
summary
本文详细总结了Transformer架构中的自注意力及其多头自注意力机制背后的工作原理和计算流程,以助于更深入的理解完整的Transformer设计架构。
type
Post
category
AI
AI summary
自注意力机制简介
Transformer模型的自注意力机制,在Google AI研究员Vaswani 2017年的论文《Attention is All You Need》中首次被提出,该机制随之成为transformer模型的核心思想,而transformer模型又成为各种大语言模型LLM和机器视觉模型VLM的中心所在。自注意力机制的伟大之处在于,它赋予了模型全局视野:让图像中的每一个像素(或特征点)都能直接与其他所有像素发生联系(ViT),让序列化的自然语言段落中的每一个字词(Token)直接与整个段落中的所有其他字词产生联系(LLM)。
以下面这个例子来进行说明:

对于上面的这个简单的句子的理解来讲,要理解这个句子,当我们看到sat这个单词的时候,注意力会自动放在与之密切相关的cat和mat这两个单词,而其他单词对于sat的理解意义不大,基本可以忽略。因此,所谓的注意力就是:基于语义或语法关系,帮助模型决定整个文本中其他单词与其正在处理的单词之间的相关性和密切程度。当两个单词之间的关系越密切,其权重就越高,否则其权重就越低。
预处理
当然,在进行自注意力运算之前,首先要把序列化的文本数据进行预处理。对于文本数据而言,数据的预处理环节主要包含三个部分:
- 分词(Tokenization)。把整个段落和句子从语义上切分为一个个独立的单词(token)。
- 向量化(Embedding)。把以上切分出来的token向量化,大致的方法就是类似于查字典,基于token找到与其对应的固定长度的向量。
- 增加位置编码(Positional Embedding)。 此外还要给每个token的向量加上与其长度相同的位置编码,位置编码反映了这个token在整个段落和句子中的位置。

至此,整个段落的序列化文本就被转换为一个个独立的token,并且每个token都对应于一段固定长度(如512,768等)、增加了编码信息的向量。而这些向量就是下一步进行自注意力运算的输入数据。
Q,K,V矩阵
自注意力机制最核心的设计在于将输入向量变换为三种不同的角色:Query(查询)、Key(键)和Value(值)。
我们可以使用搜索引擎来对这三种不同的角色进行类比:
- Query ($Q$): 你在搜索框输入的“关键词”(我想找什么?)。
- Key ($K$): 数据库里视频的“标题/标签”(我有什么特征可以被匹配?)。
- Value ($V$): 搜索结果对应的“视频内容”(如果匹配上了,我能提供什么信息?)。
从数学运算流程的角度去看,自注意力运算的第一步,就是把前述的序列化数据所转换的向量作为输入,分别乘以三个权重矩阵 ,得到 Q, K, V 向量。

假设输入的段落文本被切分为64个token,每个token的向量长度为512,那么输入数据的维度就是(64,512),三个权重矩阵 $W^Q, W^K, W^V$ 的维度均为(512,512),因此最终得到的 Q, K, V 这三个向量的维度与输入数据的维度相同,仍然是(64,512)。

对每个Token的输入向量,分别执行以上的QSK公式的计算,得到三个与之对应的Q、S、K向量。然后在对每个token进行处理的时候,可以通过自己的 Q 向量和其他token的 K 向量之间的点积来计算其相似度,以此来衡量两个元素之间的相关性,即 。
例如,针对上面的句子,使用“sat”的查询向量 Q 与语句中其他的每个单词(包括其sat本身)的键向量 K 进行以上计算,其结果是一组相似性分数(这些是标量),这些分数告诉我们每个单词与“sat”之间的相关程度,而这些分数就是所谓的注意力分数。
为了防止以上计算出来的注意力分数梯度消失或爆炸,还要除以一个缩放因子 (其中 是特征维度,如512),然后再通过 Softmax 转化为概率分布(权重之和为 1),最终用这些权重去乘以 V,就得到最终的输出。
以上复杂的计算过程,最终得到了一个在当前的上下文中表示“sat”这个单词的新的向量表达形式,这个新的向量信息中综合考虑了整个句子中所有单词的语义,但主要来自于 cat、mat 等与sat相关的token。
这个计算过程对于句子中的每个token都会进行计算。每个token的语义提取都会同时关注其他所有的token,甚至关注其自身,这就是为什么我们称之为自注意力机制。

注意力计算公式如何体现 Q, K, V 矩阵的关系?
以上在解释 Q, K, V 向量时提到:
- Q 是Query,代表当前token要从整个段落包含的所有token中要查询的语义是什么。
- K 是Key,代表了整个段落中所有token所具有的特征列表。
- V 是Value,代表了 Q和K 匹配的情况下,其他token能够给当前token所提供的辅助语义是什么。
而QKV矩阵的计算公式则是:
那么以上的这两者之间究竟是如何建立关系呢?
在以上公式中,首先是计算 。对 Q 向量(我想找什么)与 K 向量(我有什么特征)做点积运算时,本质上是在计算:“当前的 Query 描述的需求,与这个 Key 提供的属性有多契合?” 从矩阵计算的角度上讲,$N$ 是整个文本段落中token的总数量, 是每个token的向量长度(如512,768等),那么整个段落所有token对应的 Q 是 的矩阵, 是 的矩阵,而所有token的 相乘后得到的 矩阵(这个结果实际上就是所有token之间的注意力分数矩阵),每一行就代表了某个 Token 对整个段落所有token在段落中精确语义解析的匹配分数表。
以上经过点积算出来的分数可能是任何实数,没法直接用来合并信息。此时 Softmax 登场了:Softmax 会放大分数高的,抑制分数低的,然后再归一化,把所有的分数转化成 0 到 1 之间的概率,且总和为 1。
最后一步就是把经过以上处理的注意力分数矩阵,与所有Token的 V 向量相乘。从数学计算的本质上,这是一个加权求和的过程。其输出是经过权重(权重就是注意力分数矩阵)过滤后的、包含了整个段落上下文信息的新特征向量。
总的来说,Q, K, V 向量及其注意力计算公式的本质,就是要对当前Token在该段落中所代表的精确语义来进行提取。具体的计算过程,则是首先计算当前token的 Q 向量与段落中所有Token(包括当前token)的 K 向量之间的匹配程度,其计算结果就是在解析当前token精确语义的过程中,段落中所有token的相对重要程度(即注意力分数),然后基于其重要程度提取出所有token的 V 向量,其加权和就是当前token在当前这个段落中的精确语义。
至此,自注意力机制的逻辑概念,以及完整的计算过程就解释完毕了。
多头Multi Head?
接下来思考一个问题:如果只用一组 Q, K, V(单头),当前 token 每次只能从一个维度去提取语义。 但在复杂的文本语义处理中,一个token元素可能在不同的维度上具有多种关系。
例子: “小明在图书馆借了一本厚厚的书。” 那么在提取“书”这个词的精确语义时就包含有多个不同的维度:
- 语法方面:关注到“借”,识别出“书”是动词的宾语。
- 属性方面:关注到“厚厚的”,提取出“书”的物理特征。
- 位置方面:关注到“图书馆”,提取出动作发生的场景。
因此,如果只有一个头,模型必须在同一组 Q, K, V 权重中同时编码语法、属性和位置场景信息。这会导致注意力被稀释,模型很难同时精准地捕捉这些不同维度的特征。而多头机制的提出,就允许模型在不同的子空间去独立学习这些不同维度的关系。
多头注意力在具体的操作和计算流程上其实是比较简单的,计算流程上与以上描述的单头注意力机制完全相同,只不过把输入的特征向量切分为多个相同长度的子向量而已:
- 拆分 (Split):将输入的高维特征向量(例如 512 维)切分成多个低维的子向量(比如 8 个头,这样的话每个头长度就是 64 维)。
- 并行计算 (Parallelism):以上切分出来的 8 个头独立、并行地进行前述的 Q, K, V 计算。
- 拼接 (Concat):把 8 个头各自的计算输出(每个都是 64 维)重新再拼成一个 512 维的长向量。
- 投影 (Linear):最后乘以一个权重矩阵 ,让这些来自不同维度的计算结果进行最终的融合处理。
