@shubh6200: 周末花了些时间阅读这篇文章,老实说真希望它早几年就存在。我们看的每个AI教程都…
摘要
一条推文推荐了一篇arXiv论文,该论文为应用数学家讲解了Transformer的数学基础,涵盖分词、嵌入、多头注意力和KV缓存。
查看缓存全文
缓存时间: 2026/08/03 11:40
周末抽时间读完了这篇,说实话真希望它早几年出现。
每一个AI教程都在说:“直接import torch,别管原理,这就是魔法!”这篇论文则说:“这是Transformer实际在做的事的精确定性代数。”
如果你已经受够了那些含糊其辞的技术博客,只想看注意力机制、分词(tokenization)和KV缓存背后的真实数学,终于有人写出了一份正经的指南。
它基本上剥掉了所有软件工程的外壳,把LLM变成了纯粹的数学。你终于可以不再把这些模型当成黑盒,而是真正理解驱动它们运转的数学原理。
如果你想了解引擎盖下到底发生了什么,这绝对是必读:
https://arxiv.org/pdf/2604.00965
理解Transformer与注意力机制:写给应用数学家的入门介绍
来源:https://arxiv.org/html/2604.00965 Michel Fabrice Serret
摘要
本文档简要介绍了现代基于Transformer架构的语言模型中所使用的注意力机制。我们首先说明文本如何被编码为向量,以及注意力机制如何处理这些向量以编码语义信息。然后我们描述多头注意力,考察Transformer架构是如何构建的,并审视其一些变体。最后,我们简要介绍现代降低注意力计算和内存成本的方法,即KV缓存、分组查询注意力和潜在注意力。本材料面向应用数学界,是作为IPAM研究合作研讨会“随机数值线性代数”(RNLA)项目“Transformer模型中的随机化”的入门报告而撰写。
1 引言
图1:最多两个字符的字符级分词示例。
现代基于注意力机制的自然语言处理(NLP)方法不是以字符序列的形式处理文本信息,而是以向量序列的形式。为了创建这些序列,文本被划分为连续的子串,称为token,图1中给出一个示例。模型所使用的完整token集合称为词表,其选择十分重要。事实上,它需要能够编码文本中包含的足够语义信息,以便在给定模型的情况下完成该模型所设计的自然语言处理任务。例如,预测文本中下一个token的任务可能需要比将完整句子分类为两类更精细的分词。然而,词表也应尽可能小,以免稀释句子中包含的信息,并避免不必要地增加内存和计算成本。分词过程因语言而异,且通常基于语言本身的结构。理想情况下,它应编码具有内在意义的最小字符串集合,即语言学中所定义的所有语素集合。其次,一旦文本被分解为token序列,就需要进行向量化过程。在下面的讨论中,不失一般性,可以将token视为单词。
现在,给定一个有序集合T=(T_i)_{1≤i≤N_T},其中N_T是可能的不同token数量,我们称之为词表,我们可以通过索引将文本表示为T中元素的序列。与文本关联的这种索引序列称为分词。
给定词表后,嵌入步骤允许通过一个训练好的线性映射将其表示为较低维空间中的向量。这也被称为向量化,因为每个token由此被表示为一个向量。通常,此嵌入以矩阵E∈R^{N_T×d}的形式给出,使得对于给定的嵌入维度d∈N^*,词表中第i个token T_i的d维向量化由E的第i行向量E_i给出,如图2所示。这些嵌入矩阵可以是预训练的,也可以通过特殊方法获得并根据语言模型的用例进行微调,或者,在大多数现代大语言模型(LLM)中,嵌入矩阵可以作为模型权重从头开始训练。为了对涉及矩阵的规模有一个概念,Llama 3 70b的词汇量约为128k,嵌入维度为8192,而Gemma 3 27b的词汇量约为262k,嵌入维度为5376。注意,这些是相对较小的开源模型。
图2:短语“the lazy dog”的基于词的tokenizer的句子嵌入示例。
此外,位置嵌入或特征嵌入(例如token所属句子的嵌入)可以应用于token嵌入向量序列,以丰富其中包含的语义信息。在某些模型中,例如DeBERTa [He+21]或DeepSeek V2 [Dee+24],位置编码和token嵌入被分开处理,或通过拼接,或通过设计实现。
2 注意力机制
图3:针对图2中分词示例得到的嵌入的注意力层示例。注意,在此示例中,为简单起见,我们将核设为线性,即对任意x∈R,取f_κ(x)=x。
注意力机制是Transformer架构 [Vas+17] 的构建模块,它通过一种类似数据库的结构来编码token之间的语义信息 [Zha+24]。事实上,数据库可以看作一组(key, value)元组(k,v),当我们向数据库提交查询q时,数据库返回与键等于查询(q=k)的元组关联的值v。类似地,令X∈R^{N_KV×d_in}为N_KV个维度为d_in的嵌入token的集合,例如图2中得到的那些。如图3所示,给定与其中一个token关联的输入向量x∈X,输出被表示为数据库中与每个token x′∈X关联的“值”嵌入的线性组合,其权重由将x的查询嵌入q与x′的“键”嵌入k′相关联的相似性度量决定。正如我们将在下一节看到的,在现代语言模型中,注意力机制被用作模块(文献中称为层),并与其他类型的层顺序交织以构建语言模型。现在让我们更形式化地描述单个“注意力层”的基本机制。
2.1 一般注意力机制
考虑给定的矩阵X^Q∈R^{N_Q×d_in^Q},包含N_Q∈N^*个输入查询向量,以及矩阵X^K∈R^{N_KV×d_in^K}和X^V∈R^{N_KV×d_in^V},分别包含N_KV∈N^*个输入键和值向量,其中d_in^Q, d_in^K, d_in^V∈N^*是各自的向量维度。在下文中,为简单起见,由于查询、键和值输入在大多数情况下来自相同的嵌入,我们取d_in^Q=d_in^K=d_in^V=d_in。
示例:在与ChatGPT的对话中,N_Q个查询向量(由Q的行给出)对应模型被问到的最后一个问题中的N_Q个token,而N_KV个键向量(编码在K的行中)和值向量(编码在V的行中)对应整个对话的每个token。虽然在一般情况下,同一token的键和值向量可能来自不同的嵌入源,但在聊天上下文中,它们将对应相同的输入向量,即相关token的嵌入X,如图2所示。
此外,注意在一般情况下,键和值输入通常是共享的,因为它们通常对应于同一“对象”的两个嵌入,而查询键可以对应另一个对象。正如我们将在原始Transformer解码器的交叉注意力模块中看到的,键和值向量对应于一种语言中句子的token,而查询向量对应于该句子在另一种语言中的翻译的预测token。对于GPT模型(如ChatGPT),注意力机制的输入均来自同一来源。查询向量与键/值向量之间的唯一区别在于,当向模型提出新问题时,如果讨论中的键/值向量已被存储,则只需计算问题中的新查询向量;这称为流式注意力 [Han+25]。
注意力机制的第一步是通过对查询、键和值输入向量应用线性变换来构造嵌入。我们将相关的模型权重记为W^Q∈R^{d_in^Q×d_QK},W^K∈R^{d_in^K×d_QK},W^V∈R^{d_in^V×d_out},其中d_QK和d_V分别是查询和键嵌入的共享维度以及值嵌入维度。虽然在理论上这些维度可以不同,但在实践中它们通常彼此相等。我们分别将查询、键和值矩阵记为
Q=X^Q W^Q∈R^{N_Q×d_QK}, K=X^K W^K∈R^{N_KV×d_QK}, V=X^V W^V∈R^{N_KV×d_V}.
相似性度量通常以核κ:R^{d_QK}×R^{d_QK}→R的形式给出,它允许为N_Q个查询和N_KV个键/值索引的每个元组(i,j)∈⟦1,N_Q⟧×⟦1,N_KV⟧得到注意力分数,
A=(κ(Q[i,:],K[j,:]))_{1≤i≤N_Q, 1≤j≤N_KV}∈R^{N_Q×N_KV},
其中我们用B[i,:]表示矩阵B的第i行向量。注意,核通常形如
κ(v,w)=f_κ(⟨v,w⟩),
对于给定的函数f_κ:R→R,我们在整篇文档中使用此记号以简化某些公式。此外,f_κ对矩阵M的逐元素应用记为f_κ(M)。由于我们希望模拟给定查询下键/值输入集合上的概率分布,因此需要归一化步骤;归一化系数通过Z∈R^{N_Q×N_Q}的逆获得,其中Z的对角线元素是A的每一行之和,即
Z[i,i]=∑_{1≤j≤N_KV} κ(Q[i,:],K[j,:]), ∀i∈{1,…,N_Q}.
归一化后的注意力分数,即Z^{-1}A,在文献中称为注意力权重。注意力机制的最终输出为
Y=Z^{-1}A V∈R^{N_Q×d_out}.
注意,注意力机制的输出维度由值维度给出,即d_out=d_V。
最常用的核是原始Transformer [Vas+17]中使用的缩放指数核,对任意v,w∈R^{d_QK},定义为κ(v,w)=exp(⟨v,w⟩/√(d_QK))。它源于如下事实:如果v和w的项来自均值为零、方差为1的独立同分布分布,则⟨v,w⟩的方差为d_QK。因此,分母对缩放内积以使其方差为1。给定矩阵Q和K,注意力分数可以计算为
A=exp( QK^T / √(d_QK) ),
其中指数是逐元素应用的。此上下文中的注意力权重等于对查询-键内积应用softmax函数σ:R^N→R^N,softmax函数定义为
σ:x∈R^N ↦ 1/(∑_{ℓ=1}^N e^{x_ℓ}) (e^{x_1} … e^{x_N})^T,
因此,对任意i∈{1,…,N_Q},
(Z^{-1}A)[i,:] = σ( Q[i,:]K^T / √(d_QK) ).
2.2 多头注意力
为了允许注意力机制关注更多类型的语义信息,可以对相同的输入向量使用多个并行的注意力头。最简单的方法是将多个单独注意力头堆叠,并约束它们必须具有相同的输出维度d_head,即对任意h∈⟦1,N_heads⟧,W_h^V∈R^{d_in^V×d_head}。令N_heads∈N^*为注意力头的数量,对任意h∈⟦1,N_heads⟧,我们用W_h^Q、W_h^K和W_h^V表示与第h个头关联的查询、键和值嵌入矩阵。对每个头h∈⟦1,N_heads⟧,注意力分数可以计算为
A_h=(κ(Q_h[i,:],K_h[j,:]))_{1≤i≤N_Q, 1≤j≤N_KV} = f_κ(Q_h K_h^T),
其中Q_h=X^Q W_h^Q∈R^{N_Q×d_QK},K_h=X^K W_h^K∈R^{N_KV×d_QK},且κ逐元素应用。我们注意到,一般情况下,对于每个头h,d_QK=d_head。类似地,我们设
V_h=X^V W_h^V, Z_h=diag( ∑{1≤j≤N_KV} κ(Q_h[i,:],K_h[j,:]) ){1≤i≤N_Q}.
(Note: the source cuts off here. We’ll continue if there is more, but the provided text ends at “V_h=X^V W_h^V,\quad Z_h=\operatorname{diag}\left(\sum\limits_{1\leq j\leq N_{KV}}\kappa\left({Q_{h”. Since the content is cut off, we should end the translation at that point. But the instruction says “Translate the given markdown article content” and the content ends there. So we’ll output the translation up to that point, with the trailing content as is? Actually the given markdown content ends mid-sentence. We should translate what is there and perhaps indicate truncation? No, just translate the existing text. The last line is incomplete. We’ll translate it as “V_h=X^V W_h^V, Z_h=diag(∑{1≤j≤N_KV} κ(Q_h[i,:],K_h[j,:]) ){1≤i≤N_Q}.” That seems fine.
We’ll output the full translation with the blog post and the article up to that point. Since the article is truncated, we’ll end with that.周末抽时间读完了这篇,说实话真希望它早几年出现。
每一个AI教程都在说:“直接import torch,别管原理,这就是魔法!”这篇论文则说:“这是Transformer实际在做的事的精确定性代数。”
如果你已经受够了那些含糊其辞的技术博客,只想看注意力机制、分词(tokenization)和KV缓存背后的真实数学,终于有人写出了一份正经的指南。
它基本上剥掉了所有软件工程的外壳,把LLM变成了纯粹的数学。你终于可以不再把这些模型当成黑盒,而是真正理解驱动它们运转的数学原理。
如果你想了解引擎盖下到底发生了什么,这绝对是必读:
https://arxiv.org/pdf/2604.00965
理解Transformer与注意力机制:写给应用数学家的入门介绍
来源:https://arxiv.org/html/2604.00965 Michel Fabrice Serret
摘要
本文档简要介绍了现代基于Transformer架构的语言模型中所使用的注意力机制。我们首先说明文本如何被编码为向量,以及注意力机制如何处理这些向量以编码语义信息。然后我们描述多头注意力,考察Transformer架构是如何构建的,并审视其一些变体。最后,我们简要介绍现代降低注意力计算和内存成本的方法,即KV缓存、分组查询注意力和潜在注意力。本材料面向应用数学界,是作为IPAM研究合作研讨会“随机数值线性代数”(RNLA)项目“Transformer模型中的随机化”的入门报告而撰写。
1 引言
图1:最多两个字符的字符级分词示例。
现代基于注意力机制的自然语言处理(NLP)方法不是以字符序列的形式处理文本信息,而是以向量序列的形式。为了创建这些序列,文本被划分为连续的子串,称为token,图1中给出一个示例。模型所使用的完整token集合称为词表,其选择十分重要。事实上,它需要能够编码文本中包含的足够语义信息,以便在给定模型的情况下完成该模型所设计的自然语言处理任务。例如,预测文本中下一个token的任务可能需要比将完整句子分类为两类更精细的分词。然而,词表也应尽可能小,以免稀释句子中包含的信息,并避免不必要地增加内存和计算成本。分词过程因语言而异,且通常基于语言本身的结构。理想情况下,它应编码具有内在意义的最小字符串集合,即语言学中所定义的所有语素集合。其次,一旦文本被分解为token序列,就需要进行向量化过程。在下面的讨论中,不失一般性,可以将token视为单词。
现在,给定一个有序集合T=(T_i)_{1≤i≤N_T},其中N_T是可能的不同token数量,我们称之为词表,我们可以通过索引将文本表示为T中元素的序列。与文本关联的这种索引序列称为分词。
给定词表后,嵌入步骤允许通过一个训练好的线性映射将其表示为较低维空间中的向量。这也被称为向量化,因为每个token由此被表示为一个向量。通常,此嵌入以矩阵E∈R^{N_T×d}的形式给出,使得对于给定的嵌入维度d∈N^*,词表中第i个token T_i的d维向量化由E的第i行向量E_i给出,如图2所示。这些嵌入矩阵可以是预训练的,也可以通过特殊方法获得并根据语言模型的用例进行微调,或者,在大多数现代大语言模型(LLM)中,嵌入矩阵可以作为模型权重从头开始训练。为了对涉及矩阵的规模有一个概念,Llama 3 70b的词汇量约为128k,嵌入维度为8192,而Gemma 3 27b的词汇量约为262k,嵌入维度为5376。注意,这些是相对较小的开源模型。
图2:短语“the lazy dog”的基于词的tokenizer的句子嵌入示例。
此外,位置嵌入或特征嵌入(例如token所属句子的嵌入)可以应用于token嵌入向量序列,以丰富其中包含的语义信息。在某些模型中,例如DeBERTa [He+21]或DeepSeek V2 [Dee+24],位置编码和token嵌入被分开处理,或通过拼接,或通过设计实现。
2 注意力机制
图3:针对图2中分词示例得到的嵌入的注意力层示例。注意,在此示例中,为简单起见,我们将核设为线性,即对任意x∈R,取f_κ(x)=x。
注意力机制是Transformer架构 [Vas+17] 的构建模块,它通过一种类似数据库的结构来编码token之间的语义信息 [Zha+24]。事实上,数据库可以看作一组(key, value)元组(k,v),当我们向数据库提交查询q时,数据库返回与键等于查询(q=k)的元组关联的值v。类似地,令X∈R^{N_KV×d_in}为N_KV个维度为d_in的嵌入token的集合,例如图2中得到的那些。如图3所示,给定与其中一个token关联的输入向量x∈X,输出被表示为数据库中与每个token x′∈X关联的“值”嵌入的线性组合,其权重由将x的查询嵌入q与x′的“键”嵌入k′相关联的相似性度量决定。正如我们将在下一节看到的,在现代语言模型中,注意力机制被用作模块(文献中称为层),并与其他类型的层顺序交织以构建语言模型。现在让我们更形式化地描述单个“注意力层”的基本机制。
2.1 一般注意力机制
考虑给定的矩阵X^Q∈R^{N_Q×d_in^Q},包含N_Q∈N^*个输入查询向量,以及矩阵X^K∈R^{N_KV×d_in^K}和X^V∈R^{N_KV×d_in^V},分别包含N_KV∈N^*个输入键和值向量,其中d_in^Q, d_in^K, d_in^V∈N^*是各自的向量维度。在下文中,为简单起见,由于查询、键和值输入在大多数情况下来自相同的嵌入,我们取d_in^Q=d_in^K=d_in^V=d_in。
示例:在与ChatGPT的对话中,N_Q个查询向量(由Q的行给出)对应模型被问到的最后一个问题中的N_Q个token,而N_KV个键向量(编码在K的行中)和值向量(编码在V的行中)对应整个对话的每个token。虽然在一般情况下,同一token的键和值向量可能来自不同的嵌入源,但在聊天上下文中,它们将对应相同的输入向量,即相关token的嵌入X,如图2所示。
此外,注意在一般情况下,键和值输入通常是共享的,因为它们通常对应于同一“对象”的两个嵌入,而查询键可以对应另一个对象。正如我们将在原始Transformer解码器的交叉注意力模块中看到的,键和值向量对应于一种语言中句子的token,而查询向量对应于该句子在另一种语言中的翻译的预测token。对于GPT模型(如ChatGPT),注意力机制的输入均来自同一来源。查询向量与键/值向量之间的唯一区别在于,当向模型提出新问题时,如果讨论中的键/值向量已被存储,则只需计算问题中的新查询向量;这称为流式注意力 [Han+25]。
注意力机制的第一步是通过对查询、键和值输入向量应用线性变换来构造嵌入。我们将相关的模型权重记为W^Q∈R^{d_in^Q×d_QK},W^K∈R^{d_in^K×d_QK},W^V∈R^{d_in^V×d_out},其中d_QK和d_V分别是查询和键嵌入的共享维度以及值嵌入维度。虽然在理论上这些维度可以不同,但在实践中它们通常彼此相等。我们分别将查询、键和值矩阵记为
Q=X^Q W^Q∈R^{N_Q×d_QK}, K=X^K W^K∈R^{N_KV×d_QK}, V=X^V W^V∈R^{N_KV×d_V}.
相似性度量通常以核κ:R^{d_QK}×R^{d_QK}→R的形式给出,它允许为N_Q个查询和N_KV个键/值索引的每个元组(i,j)∈⟦1,N_Q⟧×⟦1,N_KV⟧得到注意力分数,
A=(κ(Q[i,:],K[j,:]))_{1≤i≤N_Q, 1≤j≤N_KV}∈R^{N_Q×N_KV},
其中我们用B[i,:]表示矩阵B的第i行向量。注意,核通常形如
κ(v,w)=f_κ(⟨v,w⟩),
对于给定的函数f_κ:R→R,我们在整篇文档中使用此记号以简化某些公式。此外,f_κ对矩阵M的逐元素应用记为f_κ(M)。由于我们希望模拟给定查询下键/值输入集合上的概率分布,因此需要归一化步骤;归一化系数通过Z∈R^{N_Q×N_Q}的逆获得,其中Z的对角线元素是A的每一行之和,即
Z[i,i]=∑_{1≤j≤N_KV} κ(Q[i,:],K[j,:]), ∀i∈{1,…,N_Q}.
归一化后的注意力分数,即Z^{-1}A,在文献中称为注意力权重。注意力机制的最终输出为
Y=Z^{-1}A V∈R^{N_Q×d_out}.
注意,注意力机制的输出维度由值维度给出,即d_out=d_V。
最常用的核是原始Transformer [Vas+17]中使用的缩放指数核,对任意v,w∈R^{d_QK},定义为κ(v,w)=exp(⟨v,w⟩/√(d_QK))。它源于如下事实:如果v和w的项来自均值为零、方差为1的独立同分布分布,则⟨v,w⟩的方差为d_QK。因此,分母对缩放内积以使其方差为1。给定矩阵Q和K,注意力分数可以计算为
A=exp( QK^T / √(d_QK) ),
其中指数是逐元素应用的。此上下文中的注意力权重等于对查询-键内积应用softmax函数σ:R^N→R^N,softmax函数定义为
σ:x∈R^N ↦ 1/(∑_{ℓ=1}^N e^{x_ℓ}) (e^{x_1} … e^{x_N})^T,
因此,对任意i∈{1,…,N_Q},
(Z^{-1}A)[i,:] = σ( Q[i,:]K^T / √(d_QK) ).
2.2 多头注意力
为了允许注意力机制关注更多类型的语义信息,可以对相同的输入向量使用多个并行的注意力头。最简单的方法是将多个单独注意力头堆叠,并约束它们必须具有相同的输出维度d_head,即对任意h∈⟦1,N_heads⟧,W_h^V∈R^{d_in^V×d_head}。令N_heads∈N^*为注意力头的数量,对任意h∈⟦1,N_heads⟧,我们用W_h^Q、W_h^K和W_h^V表示与第h个头关联的查询、键和值嵌入矩阵。对每个头h∈⟦1,N_heads⟧,注意力分数可以计算为
A_h=(κ(Q_h[i,:],K_h[j,:]))_{1≤i≤N_Q, 1≤j≤N_KV} = f_κ(Q_h K_h^T),
其中Q_h=X^Q W_h^Q∈R^{N_Q×d_QK},K_h=X^K W_h^K∈R^{N_KV×d_QK},且κ逐元素应用。我们注意到,一般情况下,对于每个头h,d_QK=d_head。类似地,我们设
V_h=X^V W_h^V, Z_h=diag( ∑{1≤j≤N_KV} κ(Q_h[i,:],K_h[j,:]) ){1≤i≤N_Q}.
相似文章
@currying: 非常棒的13页讲解!
一条推文重点介绍了《理解Transformer与注意力机制》,这是一篇13页的论文,从应用数学的角度解释了Transformer架构和注意力机制。
@antoniolupetti: 《理解Transformer与注意力机制》是一篇非常有趣的论文,它从应用数学的角度介绍了Transformer架构…
一条推文重点介绍了一篇由Michel Fabrice Serret撰写的arXiv论文,该论文从应用数学的角度介绍了Transformer和注意力机制,涵盖了向量化、多头注意力以及降低注意力成本的方法,如KV缓存和Latent Attention。
@juleslogs: 想理解现代AI?从这里开始:1. Transformers → Illustrated Transformer 2. LLMs → Build a Large Language Mo…
一条推文,整理了理解现代AI的基础资源,涵盖从Transformer到物理AI的主题,包括关键论文和模型。
@antoniolupetti:丹尼尔·朱拉夫斯基和詹姆斯·H·马丁所著的《Transformers》是我读过的最清晰、数学基础最扎实的介绍之一……
一条推文重点介绍了朱拉夫斯基和马丁教科书中的Transformer架构章节,赞扬其对自注意力、多头注意力及相关机制清晰且数学基础扎实的解释。
@TheTuringPost: 一个理解或复习Transformer架构的绝佳资源。它解释了Transformer如何逐个token处理文本…
推荐一个解释Transformer架构的教育资源,涵盖token嵌入、自注意力、残差连接,以及与GPT和BERT的联系。