2.1 查询-键-值:一种信息检索的直觉
Transformer 中的注意力机制基于三个核心概念:查询(Query)、键(Key)和值(Value),通常简写为 Q、K、V。这套术语来自信息检索领域,理解这个类比是掌握注意力机制的第一步。
2.1.1 搜索引擎的类比
想象在搜索引擎中查找信息的过程:
输入一个搜索词(Query)——这是想要查找的内容
搜索引擎将搜索词与数据库中每个网页的关键词(Key)进行匹配
找到最匹配的结果后,返回对应网页的内容(Value)
注意力机制的工作方式与此惊人地相似:
当前位置的表示被投影为一个查询向量(Query)——“我需要什么信息?”
序列中每个位置的表示被投影为键向量(Key)——“我有什么信息?”
查询与所有键进行匹配,计算相关性分数
根据相关性分数,对每个位置的值向量(Value)进行加权求和——“提取相关信息”
但与搜索引擎不同的是,注意力机制做的是软匹配:它不是只返回最匹配的一个结果,而是根据匹配程度对所有结果进行加权混合。这种“软检索”使得梯度可以流过整个过程,从而允许端到端训练。
2.1.2 为什么需要三个独立的投影
一个自然的问题是:为什么需要把输入分别投影为 Q、K、V 三个不同的向量?直接用输入本身做比较不行吗?
答案涉及表示灵活性与角色分离的考量。
如果直接用输入向量 $x_i$ 和 $x_j$ 计算注意力,那么一个位置在“被查找”时和“提供信息”时使用的是完全相同的表示。但在语言中,一个词在不同语境下的“需求”(它需要关注什么)和“供给”(它能提供什么信息)往往是不同的。
以动词“跑”为例:作为查询时,它可能在寻找自己的主语和宾语;作为键时,它可能在向修饰词表明自己是一个动作。这两种角色需要不同的向量表示。
Q、K、V 的三重投影正是为每个位置创建了三种独立的表示,让模型能够灵活地区分“寻找什么”、“提供什么标识”和“提供什么内容”这三种不同的语义角色。数学上:
Q=XWQ,K=XWK,V=XWV
其中 $X \in \mathbb{R}^{n \times d_{\text{model}}}$ 是输入矩阵($n$ 个位置,每个位置 $d_{\text{model}}$ 维),$W^Q, W^K \in \mathbb{R}^{d_{\text{model}} \times d_k}$ 和 $W^V \in \mathbb{R}^{d_{\text{model}} \times d_v}$ 是可学习的投影矩阵。
2.1.3 值为什么和键分开
还有一个更微妙的问题:键和值为什么要分开?能不能用同一个向量既做匹配又做信息提供?
分离键和值的设计,源于对“索引”和“内容”的区分。在数据库中,索引(键)和存储的数据(值)是不同的东西——用 ISBN 号(键)查找一本书,返回的是书的内容(值),而不是 ISBN 号本身。
类似地,在注意力机制中,键决定了“哪些位置应该被关注”,而值决定了“被关注后提供什么信息”。分离这两者让模型有更大的灵活性:匹配标准和实际提供的信息可以存在于不同的表示空间中。
这种设计在交叉注意力中尤为重要:解码器的查询来自目标序列,而键和值来自源序列。此时,键帮助解码器定位源序列中的相关位置,值则提供这些位置的实际内容。
实验也支持了这种分离的有效性——当 K 和 V 使用相同的投影矩阵时,模型性能会有可测量的下降。
2.1.4 向量的维度设定
在理解了 Q、K、V 的作用和独立性之后,一个非常实际的问题是:这些向量具体应该被设置为多大?在 Transformer 和大语言模型中,Q、K、V 向量的维度设定主要有以下几个层面的考量:
1. 理论上的限制
查询(Query)和键(Key)的维度必须完全相同,通常记为 $d_k$,因为它们需要进行点积操作来计算注意力分数。而值(Value)向量的维度(通常记为 $d_v$)理论上可以与 $d_k$ 不同。在前文的公式中,表现为 $W^Q$ 和 $W^K$ 的列数为 $d_k$,而 $W^V$ 的列数为 $d_v$。
2.实际模型中的大小(多头机制)
在实际的主流大语言模型中,由于普遍采用了多头注意力(Multi-Head Attention)机制,为了保持计算的高效性和一致性,不仅设定 $d_k = d_v$,而且它们通常是由模型的总隐藏层维度($d_{\text{model}}$)平均分配给各个注意力头($h$ 个)。
在原始的 Transformer 论文《Attention Is All You Need》中,作者设定 $d_{\text{model}} = 512$,$h = 8$,并且建议 $d_k = d_v = d_{\text{model}} / h = 64$。这确保了在计算多头注意力时,总的计算成本与使用全维度的单头注意力相似。 这意味着,每个注意力头中单组 Q、K、V 向量的维度一般都是:
dk=dv=hdmodel
3. 业界的典型实践
在当今的业界实践中,各大模型通常将单头的维度大小固定在 64 或 128:
128 维(当代大模型的主流):
GPT-3 (175B):模型维度 $d_{\text{model}} = 12288$,头数 $h = 96$。每个 Q、K、V 向量维度为 $12288 \div 96 = 128$。
LLaMA (7B):模型维度 $d_{\text{model}} = 4096$,头数 $h = 32$。每个 Q、K、V 向量维度为 $4096 \div 32 = 128$。
64 维(早期或较小模型):
BERT-Base:模型维度 $d_{\text{model}} = 768$,头数 $h = 12$。每个 Q、K、V 向量维度为 $768 \div 12 = 64$。
GPT-2 (Small):模型维度 $d_{\text{model}} = 768$,头数 $h = 12$。每个 Q、K、V 向量维度同样为 64。
简而言之,如果是单个词在特定注意力头中的 Q、K、V 向量,它们在主流大模型中的大小通常是 128 维(较小模型多为 64 维)。这是一个由模型整体维度除以注意力头数所得到的经典工程经验值。
最后更新于
