Transformer注意力机制详解:从词向量到QKV完整拆解

在大语言模型席卷各行各业的今天,几乎所有主流模型——从GPT到Claude,再到各类开源模型——都建立在Transformer架构之上。Transformer架构由Google团队在2017年的论文《Attention Is All You Need》中首次提出,最初用于机器翻译任务。在此之前,自然语言处理主要依赖循环神经网络(RNN)和长短期记忆网络(LSTM),它们按顺序逐词处理文本,训练速度慢且难以捕捉长距离依赖关系。Transformer彻底抛弃了循环结构,完全依靠注意力机制实现并行计算,不仅大幅提升了训练效率,还能有效建模句子中任意两个位置之间的关系,无论它们相距多远。
而Transformer的灵魂,正是注意力机制(Attention Mechanism)。这个概念听起来抽象,但其背后的思路却相当直观。本文将从词向量的起点出发,一步步拆解注意力机制的工作原理,帮助你真正理解模型是如何"读懂"一句话的。
词嵌入:为什么词要用向量表示
计算机不理解文字,只理解数字。因此,处理语言的第一步,是把每个词转换成一组数字,也就是"词嵌入"(Word Embedding)。
词嵌入技术经历了从稀疏到稠密的重要演进。早期的One-Hot编码将每个词表示为一个极高维的稀疏向量(维度等于词表大小,通常数万维),词与词之间没有任何相似性信息。2013年,Mikolov等人提出Word2Vec,通过浅层神经网络将词压缩到几百维的稠密向量空间,首次实现了语义关系的向量化表达,催生了经典的"King - Man + Woman ≈ Queen"类比关系。随后GloVe、FastText等方法进一步完善了静态词嵌入技术。
为什么要用一组数字而不是单个数字?原因很简单:一个数字无法描述含义的丰富性。就像描述一只狗,你不会只说"身高多少厘米",而会综合考虑体重、品种、毛色等多个特征。同样,一个词也需要用多个维度来刻画其语义特征。
我们可以想象这样一组特征表示:
| 特征 | 狗 |
|---|---|
| 动物性 | 0.98 |
| 生命体 | 0.99 |
| 交通工具性 | 0.01 |
| 体型 | 0.45 |
| 家养性 | 0.95 |
最初,模型给每个词随机分配一组数字,例如 Dog = [0.17, 0.91, 0.32],这些数字此刻毫无意义。

嵌入空间:词义是如何通过训练习得的
那么,这些随机数字是如何逐渐承载起真实语义的?答案是通过大规模训练。
我们让模型执行一个简单任务,比如"预测缺失的词":
- The cat drank ___.(正确答案:milk)
- Dogs like to ___.(正确答案:run)
起初模型的预测几乎全错。但通过在海量语料上反复训练——进行数百万甚至数十亿次的参数修正——每个词的嵌入向量会被不断更新。最终,这些数字开始编码出真正的含义。
训练之后,我们可能会看到:
- Dog = [0.91, 0.83, 0.22]
- Cat = [0.88, 0.80, 0.24]
- Car = [0.10, 0.07, 0.95]
可以明显看出,"狗"和"猫"的向量非常接近,而"车"则相距甚远。这正是嵌入空间(Embedding Space)的核心思想:行为相似的词,在向量空间中会聚集到一起。
嵌入空间本质上是一个高维几何空间,现代大语言模型通常使用768维、1024维甚至更高维度的嵌入。在这个空间中,语义相似的词聚集成簇,而语义关系则表现为向量方向。例如,所有动物相关的词会形成一个区域,所有交通工具相关的词形成另一个区域。更有趣的是,语义关系可以用向量运算表达:从"巴黎"到"法国"的向量方向,与从"东京"到"日本"的方向几乎一致,说明模型学到了"首都-国家"这一抽象关系。
一词多义难题:静态嵌入的局限性
然而,仅靠固定嵌入会遇到一个致命问题——一词多义。
请看这两句话:
- I ate an apple after lunch.(这里 apple 指水果)
- Apple released a new iPhone.(这里 Apple 指科技公司)
如果每次出现的"Apple"都使用完全相同的嵌入,模型就会陷入混乱。人类是如何区分的?我们会看上下文:读到"ate""lunch"就知道是水果,读到"iPhone""MacBook"就知道是公司。
静态嵌入(如Word2Vec、GloVe)为每个词分配一个固定向量,无论它出现在什么语境中。2018年,ELMo模型首次引入上下文相关的词表示,使用双向LSTM根据上下文动态生成词向量。同年,BERT通过Transformer的双向注意力机制将这一思路推向极致。在BERT中,同一个词在不同句子中的表示可能完全不同——这正是注意力机制赋予的能力。这一范式转变被认为是NLP领域的分水岭,几乎所有下游任务的性能都因此获得巨大提升。
这正是注意力机制要解决的核心问题——让每个词能够根据上下文动态调整自己的含义。
自注意力机制的本质:每个词都在"提问"
注意力机制的直觉可以这样理解:句子中的每个词都在问自己一个问题——"为了被正确理解,我应该关注哪些其他词?"
以"Apple released a new iPhone"为例,"Apple"这个词环顾四周:
- released → 听起来像公司会做的事
- iPhone → 苹果公司的产品
- new → 描述这个产品
综合这些线索,模型判断出这里的 Apple 指科技公司。而在"I ate an apple after lunch"中,Apple 看到的是"ate""lunch",于是判断它指水果。
在处理过程中,每个词会给句子中其他所有词分配一个"重要性分数":
| 词 | 重要性 |
|---|---|
| released | 30% |
| iPhone | 55% |
| new | 10% |
| a | 1% |
这些重要性分数就是所谓的注意力权重(Attention Weights)。权重越高,该词对理解当前词的影响就越大。
多头注意力机制:从多个视角理解句子
单一的注意力视角往往不够。考虑这句话:"The doctor gave the patient medicine because he was sick."(医生因为病人生病而给他开药)
当模型遇到"he"时,需要判断:他指的是医生还是病人?为此,模型会从多个角度审视这句话:
- 动作视角:谁给了药?→ 医生给,病人收 → "医生给了病人某物"
- 语义视角:谁通常接受药物?→ 生病的人吃药,医生一般不给自己开药 → "他很可能是病人"
- 因果视角:为什么给药?→ 注意到"because" → "因为有人生病了"
这就是多头注意力(Multi-Head Attention):Transformer 不依赖单一的思考方式,而是同时从多个角度审视句子。每个注意力头捕捉不同的模式,最后将所有观察结果融合成一个完整的理解。
在实际实现中,多头注意力并不是简单地将注意力计算重复多次。模型会先将嵌入向量通过不同的线性变换投影到多个低维子空间中,每个子空间对应一个注意力头。例如,GPT-3使用12288维的嵌入和96个注意力头,每个头在128维的子空间中独立计算注意力。研究发现,不同的头确实学到了不同的语言模式:有的头专注于句法结构(如主谓关系),有的头捕捉指代关系,还有的头关注位置信息。最终,所有头的输出被拼接并通过一个线性层融合,恢复到原始嵌入维度。
缩放点积:如何度量词与词的相似度
讲完直觉,我们来看数学层面。回到"Apple released a new iPhone",模型会将 Apple 的嵌入与句中每个词的嵌入做比较。那么如何度量相似度?常见方法有点积、余弦相似度和缩放点积。
以点积为例,假设:
- Dog = [2, 3]
- Cat = [4, 6]
- Car = [3, -2]
那么:
- Dog 与 Cat 的点积 = 2×4 + 3×6 = 26
- Dog 与 Car 的点积 = 2×3 + 3×(-2) = 0
可见词越相似,点积越大;越无关,点积越小。
但点积有个问题:当嵌入维度变大时,数值会急剧膨胀。例如四维向量的点积可能达到 3547,这对后续的 softmax 概率转换极为不利。
在计算完缩放点积之后,注意力机制使用Softmax函数将原始分数转换为概率分布。Softmax的数学形式为 softmax(xᵢ) = exp(xᵢ) / Σexp(xⱼ),它确保所有注意力权重为正数且总和为1。这一步骤至关重要:如果缩放前的点积数值过大,Softmax会产生接近One-Hot的极端分布(几乎所有注意力集中在一个词上),导致梯度消失,训练难以进行。
解决方案是缩放点积(Scaled Dot Product):将点积除以 √d(d 为嵌入维度)。若维度为 64,则除以 √64 = 8,3547 就变成约 443——仍然较大,但已在可控范围内。这种缩放使得点积的方差保持在合理范围内,让Softmax输出更平滑的概率分布,从而有效稳定训练过程。
Query、Key、Value机制:注意力的核心运作方式
注意力机制中最核心的三个矩阵是 Query(查询)、Key(键)和 Value(值)。我们用一个比喻来理解它们。
还是那句话:"The doctor gave the patient medicine because he was sick." 想象 doctor、patient、medicine、he 四个词排成一队,轮到"he"来搞清楚自己指代谁。
he 发问:"我在说谁?" —— 这个问题就是 Query。它的潜台词是:"我很困惑,谁能帮我?"
其他词举手自我介绍:
- Doctor:"你好,我是医生"
- Patient:"你好,我是病人"
- Medicine:"你好,我是药"
这些简短的自我介绍就是 Key。注意,它们并没有讲述完整的故事,只是给出足够的信息让 he 判断"我该不该听你的"。
于是 he 环顾四周思考:Doctor……也许;Patient……也许;Medicine……不是。它忽略了 medicine,转向 patient 说:"好,多告诉我一些。"
Patient 回答:"医生给我开了药""人们通常因为生病才吃药" —— 这些真正的信息内容就是 Value。
总结起来,三者的角色一目了然:
- Query 问:"我该听谁的?"
- Key 答:"这是我的身份。"
- Value 说:"现在告诉你我知道的一切。"
从线性代数角度看,Query、Key、Value分别由三个可学习的权重矩阵Wq、Wk、Wv对原始嵌入进行线性变换得到。这意味着同一个词的嵌入会被投影到三个不同的语义空间中:作为Query时强调"我需要什么信息",作为Key时强调"我能提供什么线索",作为Value时强调"我的完整信息内容"。这种设计的精妙之处在于解耦——匹配过程(Query与Key)和信息传递过程(Value)使用不同的表示,使模型具有更强的表达能力。
每个词都同时扮演这三种角色,通过 Query 与所有 Key 的匹配计算出注意力权重,再据此加权聚合所有 Value,最终得到一个融合了上下文信息的新表示。完整的注意力计算公式为:Attention(Q,K,V) = softmax(QK^T/√d)V。这个简洁的公式包含了从相似度计算、缩放、概率归一化到信息聚合的全部过程。
总结:注意力机制为何如此重要
注意力机制之所以强大,在于它让模型摆脱了静态词义的束缚,能够根据上下文动态理解每个词的含义。从随机初始化的嵌入,到通过训练习得语义;从单一视角的注意力,到多头并行的多角度审视;再到 Query-Key-Value 的精巧设计——这一系列机制共同构成了现代大语言模型理解语言的基石。
理解了注意力机制,你就掌握了打开 Transformer 乃至整个大模型时代的钥匙。
相关推荐

EmbeddedSass for .NET:告别Node.js依赖的Sass编译方案
EmbeddedSass for .NET基于官方Embedded Sass协议,让.NET开发者无需Node.js即可原生编译Sass/SCSS。本文解析其技术原理、应用场景及与ASP.NET生态的集成方式。

旧金山到新加坡时差:硅谷科技人的跨太平洋日常
旧金山与新加坡之间存在15-16小时时差,频繁往返两地已成为科技从业者的常态。本文解析SF到SG时差挑战、两大科技中心的连接趋势,以及AI行业全球化布局背后的人才与资本流动。

Anthropic官方Claude Code插件目录发布:精选高质量扩展生态
Anthropic发布官方Claude Code插件目录claude-plugins-official,提供经过审核的高质量插件精选集。了解官方目录的定位、核心价值及对AI编程工具生态的深远影响。