news 2026/8/13 4:44:32

深入解析Transformer架构:从Token化到自注意力机制与LLM生成原理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
深入解析Transformer架构:从Token化到自注意力机制与LLM生成原理

1. 从“猜词游戏”到“概率大师”:理解LLM预测的本质

聊起大语言模型(LLM),大家最直观的感受可能就是它能“接话”,能“续写”。你输入“今天天气不错”,它可能回你“适合出去走走”。这背后最核心、最神奇的魔法,就是预测下一个Token。但千万别把它想成是简单的“查字典”或者“随机选词”,这背后是一套极其复杂、精密的概率计算工程。你可以把它想象成一个玩“超级版填词游戏”的顶级高手,它看到的不是孤立的词,而是整个句子的结构、语境、风格,甚至是你潜在的意图,然后从数万甚至数十万的词汇库里,精准地挑出那个“最合适”的词。

这个过程,就是我们常说的“Next Token Prediction”。这里的“Token”是基本单位,在中文里可能是一个字、一个词或一个标点;在英文里可能是一个单词、一个子词(如“unfortunately”可能被拆成“un”、“fortunate”、“ly”)。模型每生成一个Token,都是一次基于前面所有已生成内容的全新推理。而驱动这一切的引擎,就是Transformer架构。今天,我们就抛开那些高深莫测的数学公式,用“庖丁解牛”的方式,一步步拆解Transformer是如何完成这个看似不可能的任务的。你会发现,从你输入第一个字开始,到模型吐出第一个回答,中间经历了怎样一场信息的风暴与重塑。

2. 旅程的起点:文本如何变成模型能懂的“密码”

在模型开始“思考”之前,它必须先“读懂”我们输入的文字。但模型本质上是数学函数,它只认识数字。所以,第一步就是翻译,把人类语言翻译成机器语言。这个过程分为两个关键步骤:Token化和嵌入(Embedding)。

2.1 Token化:把句子切成有意义的“积木块”

Token化器(Tokenizer)就像一把智能剪刀。它的任务是把一段连续的文本,按照预定的规则,切割成一个个独立的Token。这里面的学问可不小。

  • 子词切分(Subword Tokenization):这是现代LLM的主流方案,比如BPE(Byte-Pair Encoding)算法。它的核心思想是平衡词汇表大小与表示效率。高频词(如“the”,“中国”)保留为完整Token,低频词或长词则被拆分成更常见的子词。例如,“unfortunately”可能被切成[“un”, “fortunate”, “ly”]。这样做的好处是:
    • 解决未登录词(OOV)问题:即使遇到一个从未在训练集中出现过的生僻词,模型也能通过其子词组合来理解和生成它。
    • 压缩词汇表:不需要为每一个可能的单词都预留一个位置,大大减少了模型参数和计算量。
  • 编码与解码:Token化器内部维护着一张从Token到唯一ID(Token ID)的映射表。切分完成后,句子就变成了一串数字ID,例如“我爱机器学习”可能变成[101, 234, 567, 890]。这个过程叫编码(Encode)。反之,模型输出一串ID后,也需要通过这张表转换回人类可读的文本,这叫解码(Decode)。

注意:不同的模型使用不同的Token化方案和词汇表。这也是为什么同一个词在不同模型中的Token ID可能不同,甚至同一个模型的不同版本也可能有差异。在微调或部署时,Token化器必须与模型严格匹配,否则会产生乱码。

2.2 词嵌入:为每个Token赋予“灵魂”向量

拿到Token ID后,模型并没有直接使用这些干巴巴的数字。它通过一个叫做“嵌入层”(Embedding Layer)的查找表,为每个Token ID分配一个高维向量(通常是512、768、1024甚至更高维度)。这个向量就是该Token的“嵌入”。

你可以把这个高维向量想象成这个Token在一个多维语义空间中的“坐标”。在这个空间里:

  • 语义相近的词,坐标也接近。比如“猫”和“狗”的向量距离,会比“猫”和“汽车”的近。
  • 词性、语法功能等信息也被编码其中。动词、名词可能会分布在不同的子空间区域。

这个嵌入层是可学习的参数。在模型训练过程中,通过海量文本的学习,模型会自动调整这个查找表,让语义和语法关系相似的词拥有相似的向量表示。这就是模型“理解”词义的开始。

但仅仅有词义还不够。在“我昨天去了公园”和“我明天将去公园”中,“我”这个词虽然相同,但所处的时间语境完全不同。为了区分这一点,Transformer引入了位置编码

2.3 位置编码:为序列注入“顺序感”

RNN、LSTM这类模型是逐个处理Token的,天然具有顺序感。但Transformer为了并行计算效率,是一次性看到所有Token的。它必须通过额外的手段来告诉模型:“哪个词在前,哪个词在后。”

位置编码(Positional Encoding)就是干这个的。它为序列中的每一个位置(第1个Token,第2个Token...)生成一个独特的、与Token内容无关的向量,然后把这个向量加到对应的词嵌入向量上。

  • 正弦余弦公式:原始Transformer论文使用了一组固定公式(正弦和余弦函数)来生成位置编码。其巧妙之处在于,对于任意偏移量k,位置pos+k的编码可以由位置pos的编码线性表示,这有助于模型学习到相对位置关系(例如“动词前面通常是名词”)。
  • 可学习的位置嵌入:在实践中,很多模型(如BERT、GPT)采用了一种更简单直接的方式:把位置也当作一个需要学习的参数。模型有一个“位置嵌入表”,为每个可能的位置(比如0到2047)学习一个向量,然后直接加到词嵌入上。这种方式更灵活,但需要足够的训练数据。

至此,输入文本已经完成了华丽的变身:从一串字符,变成了一组富含语义(词嵌入)和顺序(位置编码)信息的高维向量。这组向量,就是送入Transformer核心计算引擎的“原料”。

3. 核心引擎拆解:Self-Attention如何捕捉“远近亲疏”

拿到了每个Token的“综合向量表示”后,真正的重头戏开始了。Transformer的核心创新和威力之源,就在于自注意力机制。它的目标非常明确:让序列中的每一个Token,都能“注意到”序列中所有其他Token,并根据相关性动态地调整自己的表示。

3.1 注意力机制的三元组:Query, Key, Value

理解自注意力,最好从“信息检索”的角度类比。假设你(当前Token)是一个检索系统,你有一个问题(Query)。图书馆里有所有Token的信息,每本书有两个标签:书名(Key)和内容(Value)。你的任务是:

  1. 用你的Query去和所有书的Key计算匹配度(相似度)。
  2. 根据匹配度(注意力权重),对所有书的Value进行加权求和。
  3. 这个加权求和的结果,就是你要的答案,它融合了全局信息。

在公式中,这个过程被优雅地表述为:Attention(Q, K, V) = softmax(QK^T / √d_k) V

我们来拆解这个“注意力三部曲”:

  1. 生成Q, K, V:对于输入序列的每个Token向量,我们通过三个不同的可学习权重矩阵(W_Q, W_K, W_V)进行线性变换,分别得到它的Query向量、Key向量和Value向量。这意味着模型为每个Token学习了三种不同的“角色”:Q代表“我想问什么”,K代表“我有什么标签”,V代表“我的实际内容是什么”。
  2. 计算注意力分数(QK^T):将当前Token的Query向量与序列中所有Token(包括自己)的Key向量进行点积。点积值越高,代表两个向量的方向越一致,相关性越强。这就是在计算“匹配度”。
  3. 缩放与归一化(除以√d_k, softmax)
    • 缩放:点积结果可能会随着向量维度(d_k)的增大而变得非常大,导致softmax函数进入梯度极小的区域。除以√d_k是为了稳定梯度,让训练更平稳。
    • 归一化:使用softmax函数将上一步得到的所有分数(可能为正可能为负)转换为一个概率分布(所有值在0到1之间,且和为1)。这个分布就是“注意力权重”,它明确地告诉模型:“在生成当前Token的新表示时,你应该从其他每个Token那里‘借鉴’多少信息。”
  4. 加权求和(乘以V):将得到的注意力权重,与各个Token对应的Value向量相乘并求和。最终输出的,就是当前Token经过全局信息“洗礼”后的新向量表示。这个新向量,既包含了它自己的原始信息(因为也会计算与自己的注意力),也融入了与它高度相关的其他Token的信息。

3.2 多头注意力:多视角的“委员会决策”

只做一次上述的注意力计算,模型可能只关注到一种类型的关系(比如语法主谓关系)。为了让模型具备同时关注不同层面信息的能力,Transformer采用了多头注意力

你可以想象有8个(或更多)独立的“专家”。每个专家都有自己的Q、K、V权重矩阵。它们并行地对同一输入序列进行上述的注意力计算,但会关注不同的方面:

  • 专家A可能专注于捕捉语法结构。
  • 专家B可能专注于捕捉指代关系(如“它”指代什么)。
  • 专家C可能专注于捕捉情感一致性。
  • ...

每个“头”都会输出一个经过注意力加权后的序列向量。最后,我们将所有头的输出拼接起来,再通过一个线性变换(权重矩阵W_O)进行融合,得到最终的多头注意力输出。这就好比一个委员会综合了所有专家的意见后,做出了最终决策,使得模型的表示能力极大地增强了。

3.3 残差连接与层归一化:训练稳定性的“护航舰”

Transformer块中,注意力层和前馈神经网络层都紧跟着两个关键操作:残差连接层归一化。它们是训练深度网络不可或缺的“稳定器”。

  • 残差连接:将某一层的输入,直接加到该层的输出上。即输出 = Layer(输入) + 输入。它的核心作用是缓解梯度消失问题。在深度网络中,梯度反向传播时可能会变得非常小,导致底层参数难以更新。残差连接提供了一条“高速公路”,让梯度可以直接回流,确保了深层网络的有效训练。
  • 层归一化:对单个样本的所有特征维度进行归一化,使其均值为0,方差为1。它被应用在残差连接之后。其作用是稳定每一层输入的分布,减少内部协变量偏移,加速模型收敛,并允许使用更大的学习率。

一个标准的Transformer块(Encoder层或Decoder层中的一层)的顺序通常是:自注意力 → 残差连接 & 层归一化 → 前馈网络 → 残差连接 & 层归一化

4. 从理解到生成:Decoder的掩码与交叉注意力

上面讲的自注意力机制,在Transformer的Encoder(编码器)和Decoder(解码器)中都有,但有一个关键区别:Decoder在训练时需要使用掩码自注意力

4.1 掩码自注意力:防止“偷看答案”

在训练阶段,我们给Decoder的输入是整个目标序列(比如要翻译的英文句子)。如果让Decoder在预测第t个Token时,能“看到”第t个之后的所有Token,那任务就太简单了——它直接“抄答案”就行了。这会导致模型无法学会真正的预测。

因此,Decoder的自注意力层必须进行掩码。具体做法是,在计算注意力权重(softmax之前)时,将当前Token之后所有位置的分数设置为一个极大的负数(如 -1e9)。这样,经过softmax后,这些位置的权重就几乎为0。这就保证了每个Token在生成时,只能“看到”它之前的Token,完美模拟了推理时逐个生成的情景。

4.2 交叉注意力:连接源与目标的“桥梁”

在Seq2Seq任务(如翻译)中,Decoder不仅需要关注已生成的目标端上下文,更需要关注整个源语言序列(由Encoder编码后的输出)。这个任务由交叉注意力层完成。

在Decoder的第二个注意力层中:

  • Query来自Decoder上一层的输出(即当前已生成的目标端信息)。
  • Key和Value都来自Encoder的最终输出(即完整的源语言信息表示)。

通过这个机制,Decoder在生成每一个目标Token时,都可以动态地去“查询”Encoder输出的源信息中哪些部分最相关,从而实现精准的翻译或摘要。在纯Decoder架构的LLM(如GPT系列)中,没有Encoder,因此也就没有交叉注意力层,它完全依靠掩码自注意力来生成文本。

5. 概率的临门一脚:从向量到下一个Token的抉择

经过多层Transformer块的复杂交互,序列中最后一个Token(在生成任务中,就是当前位置的Token)的输出向量,蕴含了模型基于全部上文所计算出的“上下文理解”。现在,我们需要将这个高维的“理解”转化为一个具体的、概率化的词汇选择。这一步由输出层完成。

5.1 线性变换与词汇表投影

Decoder最终输出的向量(假设维度是d_model,如1024),首先会通过一个线性层(一个可学习的权重矩阵)。这个线性层的作用是将向量从隐藏层维度(d_model)投影到词汇表维度(vocab_size)。词汇表大小就是Token化器里所有唯一Token的数量,通常是几万到几十万。

投影之后,我们得到了一个长度为vocab_size的逻辑值向量。这个向量里的每个数值,对应词汇表中每一个Token的“原始得分”。但这个得分还没有归一化,可能非常大也可能非常小,没有概率意义。

5.2 Softmax:将得分转化为概率分布

接下来,对这个逻辑值向量应用softmax函数。softmax是一个指数归一化函数,它确保:

  1. 所有输出值都在0到1之间。
  2. 所有输出值之和为1。

于是,这个长度为vocab_size的向量,就变成了一个概率分布。向量中第i个位置的值,就代表了模型预测“下一个Token是词汇表中第i个Token”的概率。例如,P(“是”) = 0.6,P(“为”) = 0.3,P(“很”) = 0.1,等等。

5.3 采样策略:如何根据概率选出最终Token?

拿到概率分布后,如何决定最终输出哪个Token?这里有几个核心策略,直接影响到生成文本的质量和多样性:

  1. 贪婪搜索:直接选择概率最高的那个Token。这是最简单最快的方法,但缺点也很明显:容易导致生成重复、枯燥的文本,因为每次都是选最优,可能陷入局部循环。
  2. 束搜索:保留概率最高的k个候选序列(k称为束宽),在每一步都扩展这k个序列,最后从完整的k个序列中选出总体概率最高的。这种方法比贪婪搜索更好,能一定程度避免错误累积,但计算量更大,且依然可能生成缺乏创意的文本。
  3. 随机采样:根据概率分布随机抽取一个Token。概率高的被抽中的机会大,但概率低的也有机会。这能极大增加多样性,但可能导致输出不连贯甚至胡言乱语。
  4. 核采样:这是目前大模型生成中最常用、效果最好的策略之一。它首先将概率分布按值从大到小排序,然后只保留累积概率达到某个阈值(如0.9)的最小集合(称为“核”),最后在这个核内重新归一化概率并进行随机采样。这样做既避免了选择那些概率极低的“长尾”Token(它们通常不合适),又保留了选择次优Token的可能性,在创造性和连贯性之间取得了很好的平衡。
  5. 温度调节:在softmax之前,将逻辑值向量除以一个温度参数T。
    • T = 1:保持原分布。
    • T → 0:分布趋向于one-hot(接近贪婪搜索)。
    • T > 1:分布变得更平缓(随机性增强)。 通过调节温度,可以灵活控制生成的“保守”与“冒险”程度。

在实际应用中,通常结合使用核采样温度调节,并辅以重复惩罚等技巧,来获得既通顺又有趣的文本。

6. 实战中的“暗礁”:训练与推理的效率博弈

理解了核心流程,我们还需要看看在实际工程中,为了把这个流程跑起来并跑得快,需要应对哪些挑战。

6.1 训练阶段:并行化的天堂

训练时,由于我们有完整的输入序列和完整的目标序列(对于自回归模型,目标序列就是输入序列的右移一位),Transformer可以充分发挥其并行计算的优势。

  • 注意力计算:序列中所有Token之间的注意力可以同时计算,矩阵运算非常适合在GPU上并行加速。
  • 损失计算:我们可以一次性计算整个序列所有位置预测下一个Token的损失(通常是交叉熵损失),然后求和或平均得到总损失进行反向传播。 这种并行性使得Transformer训练效率远高于RNN,这也是它能处理海量数据的关键。

6.2 推理阶段:序列生成的“串行诅咒”

推理(生成)时,情况就完全不同了。模型必须自回归地一个Token一个Token地生成。

  1. 给定输入提示,模型计算并输出第一个Token的概率分布,采样得到Token_1。
  2. 将Token_1拼接到输入后,重新计算整个序列,得到Token_2的概率分布,采样得到Token_2。
  3. 重复此过程,直到生成结束符或达到长度限制。

问题来了:每次生成一个新Token,都需要用当前的整个序列(越来越长)重新计算一次前向传播。而注意力机制的计算复杂度与序列长度的平方成正比(O(n²))。这意味着生成长文本时,推理速度会急剧下降,且需要巨大的内存来存储中间状态(Key和Value),这就是著名的KV缓存问题。

6.3 KV缓存:推理加速的关键技巧

为了解决这个问题,工程师们引入了KV缓存。其原理基于一个观察:在生成第t个Token时,对于序列中前t-1个Token,它们的Key和Value向量在之前的计算中已经生成过了,并且在计算当前Token的注意力时,这些向量并不会改变。

因此,我们可以:

  • 在第一次前向传播后,将整个输入序列所有层的Key和Value向量缓存起来。
  • 在生成新Token时,只需要计算当前新Token的Query、Key、Value向量。
  • 然后将这个新Token的Key和Value追加到缓存中,并用当前新Token的Query去和缓存中所有历史Token的Key计算注意力。

这样,每次生成步骤的计算量,就从与序列长度平方相关,降低为主要与序列长度线性相关(主要是新Token与所有历史Key的点积操作)。KV缓存是当前所有LLM推理引擎(如vLLM, TensorRT-LLM)的核心优化之一,它能将推理速度提升数倍甚至数十倍。

实操心得:在部署自己的LLM应用时,务必关注推理框架对KV缓存的支持和优化。缓存的大小决定了能处理的上下文长度上限。当对话或文本非常长时,还需要考虑“滚动缓存”等策略,丢弃最早的缓存以节省内存,但这可能会影响模型对遥远上下文的记忆能力。

7. 超越基础:现代LLM架构的演进与优化

原始的Transformer是一个强大的基础框架,但直接用它来构建千亿参数的大模型,会在训练稳定性、效率和长上下文处理上遇到挑战。近年来,一系列改进架构被提出。

7.1 注意力机制的优化:从O(n²)到线性

原始自注意力的平方复杂度是处理长文本的噩梦。许多研究致力于优化它:

  • 稀疏注意力:不让每个Token关注所有其他Token,而是只关注一个局部窗口、随机子集或根据某种规则(如 stride, dilated)选出的子集。如Longformer、BigBird。
  • 线性注意力:通过核函数近似等方法,将注意力计算重写为线性形式。如Linformer、Performer。
  • 状态空间模型:另辟蹊径,使用如Mamba等SSM模型替代注意力,理论上具有线性复杂度,并在长序列上显示出优势。

7.2 归一化与初始化:训练深度模型的基石

随着模型变深变宽,训练变得异常困难。除了层归一化,其他技术也至关重要:

  • RMSNorm:去掉了层归一化中的均值中心化,只做缩放,被证明在大型模型中更稳定高效,被LLaMA、GPT-NeoX等模型采用。
  • SwiGLU / GEGLU激活函数:在前馈网络中,使用这些门控激活函数替代传统的ReLU,能显著提升模型性能。
  • 旋转位置编码:RoPE是一种相对位置编码,通过绝对位置实现相对位置的感知,在长文本外推性上表现更好,被广泛应用于LLaMA、GPT等系列模型。

7.3 大模型的基础设施:混合专家与量化

为了突破参数规模的极限,新的训练和推理范式被创造出来:

  • 混合专家:MoE模型(如Mixtral, DeepSeek-MoE)将网络中的前馈层替换为由多个“专家”子网络组成的结构。每个Token根据路由网络的计算结果,只激活少数几个专家(如2个)。这样,模型的总参数量可以极大增加(如万亿级别),但每次激活的计算量(FLOPs)却保持不变,实现了“参数规模”和“计算效率”的分离。
  • 量化与低精度推理:将训练好的高精度模型(如FP16/BF16)的权重和激活值,转换为低精度格式(如INT8, INT4,甚至FP8)。这能大幅减少模型的内存占用和推理延迟,是让大模型在消费级硬件上运行的关键技术。但量化会带来精度损失,需要精细的校准和后训练量化技术来弥补。

从你输入一个提示词,到LLM流畅地给出回答,这背后是一场从离散符号到连续空间,从局部感知到全局关联,从确定输入到概率采样的复杂旅程。Transformer架构及其核心的自注意力机制,通过巧妙的数学设计,让机器学会了在语言的海洋中捕捉最细微的涟漪与最宏大的洋流。理解这个过程,不仅是理解当今AI如何工作的钥匙,也能让我们在应用、调优甚至创造新模型时,拥有更坚实的立足点和更清晰的思路。下一次当你与ChatGPT对话时,或许可以想象一下,在那一两秒的等待中,数万亿次的计算正在为下一个最合适的词而奔忙。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/13 4:42:40

AI赋能古籍数字化:大模型与知识图谱的融合实践

1. 项目背景与核心价值当古老文明遇上前沿科技,会碰撞出怎样的火花?这个项目试图用AI技术重新诠释华夏文明中的经典智慧,让《论语》《道德经》等典籍以全新的数字生命形式与当代人对话。这不是简单的文本数字化,而是通过大语言模型…

作者头像 李华
网站建设 2026/8/13 4:38:00

C语言中迭代与递归的核心区别与应用场景

1. 迭代与递归的本质区别第一次接触C语言的开发者常常会对迭代(iteration)和递归(recursion)这两个基础概念产生混淆。作为程序设计中两种最基本的控制结构,它们都能实现重复操作,但底层机制却截然不同。迭代是通过循环结构(如for、while&…

作者头像 李华
网站建设 2026/8/13 4:37:57

电子技术作业进阶指南:从基础电路到完整作品的全流程实践

1. 项目概述:从“作业”到“作品”的蜕变之路“电子技术的作业”,这个标题听起来平平无奇,甚至带着点学生时代被任务支配的“恐惧感”。但作为一名在电子行业摸爬滚打十多年的老工程师,我想告诉你,这恰恰是无数精彩项目…

作者头像 李华
网站建设 2026/8/13 4:33:13

从向量点积到Transformer:揭秘大语言模型如何生成下一个词

1. 项目概述:从“猜词”到“理解”的跨越每次看到大模型流畅地生成文本、回答问题,甚至写出代码,很多人心里都会冒出一个问号:它到底是怎么做到的?它真的是在“思考”后“写”出下一个词,还是仅仅在玩一个高…

作者头像 李华