资讯动态

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

发布时间:2026/8/13 4:44:44 来源:尧图企业网站定制
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的主流方案比如BPEByte-Pair Encoding算法。它的核心思想是平衡词汇表大小与表示效率。高频词如“the”“中国”保留为完整Token低频词或长词则被拆分成更常见的子词。例如“unfortunately”可能被切成[“un”, “fortunate”, “ly”]。这样做的好处是解决未登录词OOV问题即使遇到一个从未在训练集中出现过的生僻词模型也能通过其子词组合来理解和生成它。压缩词汇表不需要为每一个可能的单词都预留一个位置大大减少了模型参数和计算量。编码与解码Token化器内部维护着一张从Token到唯一IDToken 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位置posk的编码可以由位置pos的编码线性表示这有助于模型学习到相对位置关系例如“动词前面通常是名词”。可学习的位置嵌入在实践中很多模型如BERT、GPT采用了一种更简单直接的方式把位置也当作一个需要学习的参数。模型有一个“位置嵌入表”为每个可能的位置比如0到2047学习一个向量然后直接加到词嵌入上。这种方式更灵活但需要足够的训练数据。至此输入文本已经完成了华丽的变身从一串字符变成了一组富含语义词嵌入和顺序位置编码信息的高维向量。这组向量就是送入Transformer核心计算引擎的“原料”。3. 核心引擎拆解Self-Attention如何捕捉“远近亲疏”拿到了每个Token的“综合向量表示”后真正的重头戏开始了。Transformer的核心创新和威力之源就在于自注意力机制。它的目标非常明确让序列中的每一个Token都能“注意到”序列中所有其他Token并根据相关性动态地调整自己的表示。3.1 注意力机制的三元组Query, Key, Value理解自注意力最好从“信息检索”的角度类比。假设你当前Token是一个检索系统你有一个问题Query。图书馆里有所有Token的信息每本书有两个标签书名Key和内容Value。你的任务是用你的Query去和所有书的Key计算匹配度相似度。根据匹配度注意力权重对所有书的Value进行加权求和。这个加权求和的结果就是你要的答案它融合了全局信息。在公式中这个过程被优雅地表述为Attention(Q, K, V) softmax(QK^T / √d_k) V我们来拆解这个“注意力三部曲”生成Q, K, V对于输入序列的每个Token向量我们通过三个不同的可学习权重矩阵W_Q, W_K, W_V进行线性变换分别得到它的Query向量、Key向量和Value向量。这意味着模型为每个Token学习了三种不同的“角色”Q代表“我想问什么”K代表“我有什么标签”V代表“我的实际内容是什么”。计算注意力分数QK^T将当前Token的Query向量与序列中所有Token包括自己的Key向量进行点积。点积值越高代表两个向量的方向越一致相关性越强。这就是在计算“匹配度”。缩放与归一化除以√d_k, softmax缩放点积结果可能会随着向量维度d_k的增大而变得非常大导致softmax函数进入梯度极小的区域。除以√d_k是为了稳定梯度让训练更平稳。归一化使用softmax函数将上一步得到的所有分数可能为正可能为负转换为一个概率分布所有值在0到1之间且和为1。这个分布就是“注意力权重”它明确地告诉模型“在生成当前Token的新表示时你应该从其他每个Token那里‘借鉴’多少信息。”加权求和乘以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是一个指数归一化函数它确保所有输出值都在0到1之间。所有输出值之和为1。于是这个长度为vocab_size的向量就变成了一个概率分布。向量中第i个位置的值就代表了模型预测“下一个Token是词汇表中第i个Token”的概率。例如P(“是”) 0.6,P(“为”) 0.3,P(“很”) 0.1等等。5.3 采样策略如何根据概率选出最终Token拿到概率分布后如何决定最终输出哪个Token这里有几个核心策略直接影响到生成文本的质量和多样性贪婪搜索直接选择概率最高的那个Token。这是最简单最快的方法但缺点也很明显容易导致生成重复、枯燥的文本因为每次都是选最优可能陷入局部循环。束搜索保留概率最高的k个候选序列k称为束宽在每一步都扩展这k个序列最后从完整的k个序列中选出总体概率最高的。这种方法比贪婪搜索更好能一定程度避免错误累积但计算量更大且依然可能生成缺乏创意的文本。随机采样根据概率分布随机抽取一个Token。概率高的被抽中的机会大但概率低的也有机会。这能极大增加多样性但可能导致输出不连贯甚至胡言乱语。核采样这是目前大模型生成中最常用、效果最好的策略之一。它首先将概率分布按值从大到小排序然后只保留累积概率达到某个阈值如0.9的最小集合称为“核”最后在这个核内重新归一化概率并进行随机采样。这样做既避免了选择那些概率极低的“长尾”Token它们通常不合适又保留了选择次优Token的可能性在创造性和连贯性之间取得了很好的平衡。温度调节在softmax之前将逻辑值向量除以一个温度参数T。T 1保持原分布。T → 0分布趋向于one-hot接近贪婪搜索。T 1分布变得更平缓随机性增强。 通过调节温度可以灵活控制生成的“保守”与“冒险”程度。在实际应用中通常结合使用核采样和温度调节并辅以重复惩罚等技巧来获得既通顺又有趣的文本。6. 实战中的“暗礁”训练与推理的效率博弈理解了核心流程我们还需要看看在实际工程中为了把这个流程跑起来并跑得快需要应对哪些挑战。6.1 训练阶段并行化的天堂训练时由于我们有完整的输入序列和完整的目标序列对于自回归模型目标序列就是输入序列的右移一位Transformer可以充分发挥其并行计算的优势。注意力计算序列中所有Token之间的注意力可以同时计算矩阵运算非常适合在GPU上并行加速。损失计算我们可以一次性计算整个序列所有位置预测下一个Token的损失通常是交叉熵损失然后求和或平均得到总损失进行反向传播。 这种并行性使得Transformer训练效率远高于RNN这也是它能处理海量数据的关键。6.2 推理阶段序列生成的“串行诅咒”推理生成时情况就完全不同了。模型必须自回归地一个Token一个Token地生成。给定输入提示模型计算并输出第一个Token的概率分布采样得到Token_1。将Token_1拼接到输入后重新计算整个序列得到Token_2的概率分布采样得到Token_2。重复此过程直到生成结束符或达到长度限制。问题来了每次生成一个新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对话时或许可以想象一下在那一两秒的等待中数万亿次的计算正在为下一个最合适的词而奔忙。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价