从向量点积到Transformer:揭秘大语言模型如何生成下一个词 📅 2026/8/13 4:33:16 1. 项目概述从“猜词”到“理解”的跨越每次看到大模型流畅地生成文本、回答问题甚至写出代码很多人心里都会冒出一个问号它到底是怎么做到的它真的是在“思考”后“写”出下一个词还是仅仅在玩一个高级的“完形填空”或“猜词游戏”这个“猜”字用得既形象又微妙。说它形象是因为模型在生成每一个词时确实是在一个庞大的可能性空间里进行概率选择说它微妙是因为这个“猜”的背后是一套极其复杂且精密的数学与工程体系其核心引擎就是Transformer架构及其注意力机制。今天我们就从一个最基础的数学运算——向量点积出发一步步拆解这个“猜”的过程看看大模型是如何从海量数据中学习到语言的规律并最终实现令人惊叹的文本生成能力的。无论你是刚入门的新手还是有一定基础想深入理解原理的开发者这篇文章都将带你绕过晦涩的公式用直观的类比和实操中的思考把Transformer的“黑箱”变成“白箱”。2. 核心基石点积、相似度与注意力雏形要理解Transformer必须先理解它的灵魂——注意力机制。而注意力机制的数学心脏就是向量点积。很多人一看到矩阵乘法、点积就头疼其实我们可以把它想象成一次“相亲匹配会”。2.1 向量点积一次“相亲匹配会”假设我们有两个向量A [1, 2, 3] 和 B [4, 5, 6]。它们的点积计算方式是14 25 3*6 4 10 18 32。这个数字32代表了什么你可以把向量A想象成一个人的“择偶条件清单”1分代表“爱好读书”2分代表“喜欢运动”3分代表“擅长烹饪”分数高低代表在意程度。向量B则是另一个人的“自我评价清单”4分表示“非常爱读书”5分表示“比较喜欢运动”6分表示“厨艺精通”。点积的计算过程就是把每一项条件与评价相乘后相加。这意味着如果双方在对方看重的项目上都有很高的得分那么最终的点积分数就会很高。32分就是一个相当高的“匹配度”分数。它表明这两个向量的“方向”比较一致或者说它们在所描述的特征空间里“看对眼”了。注意这里有一个关键点点积值的大小不仅受向量各维度数值大小影响也受向量维度数量影响。在实际的神经网络中我们通常会除以一个缩放因子通常是向量维度的平方根来稳定梯度这就是缩放点积注意力Scaled Dot-Product Attention中“缩放”的由来。这个我们后面会详细说。在NLP中一个词通常会被表示成一个高维向量比如512维或768维这就是词向量。词向量不是随机的它通过训练使得语义相近的词如“国王”和“君主”在向量空间中的位置也很接近它们的点积相似度就会很高。2.2 从点积到注意力为每个词分配“关注力”理解了点积作为相似度度量我们就可以构建最基础的注意力概念了。假设我们有一句话“猫坐在垫子上”。模型在处理“垫子”这个词时它需要理解“谁”坐在垫子上。一个朴素的想法是让“垫子”这个词向量去和句子中其他所有词向量“猫”、“坐在”、“上”都做一次点积运算。计算过程可能如下数值为示意“垫子”与“猫”的点积0.9“垫子”与“坐在”的点积0.7“垫子”与“上”的点积0.2“垫子”与“垫子”本身的点积1.0通常自己与自己的相似度最高接下来我们会通过一个Softmax函数将这些原始分数又称注意力分数转化为概率分布。Softmax的作用是让大的分数更大小的分数更小并且所有分数之和为1。经过Softmax后我们可能得到“猫”0.38“坐在”0.32“上”0.12“垫子”0.18这个概率分布就是“垫子”这个词对句子中其他词的注意力权重。它告诉我们当模型在理解“垫子”时它应该分配38%的“注意力”给“猫”32%给“坐在”…… 最终模型会用这些权重去加权求和其他词的词向量得到一个代表“结合了上下文信息的‘垫子’”的新向量。这个新向量才是模型真正用于后续计算的表示。实操心得很多初学者会困惑为什么不用更复杂的相似度计算方式点积的优势在于计算效率极高可以完美地利用现代GPU的并行矩阵运算能力。一次矩阵乘法就能完成所有词对之间的相似度计算这是Transformer能够处理超长序列、实现并行训练的关键。3. Transformer架构全景拆解有了注意力机制这个核心武器我们就可以搭建Transformer这座大厦了。原始的Transformer模型出自2017年《Attention Is All You Need》论文是一个编码器-解码器架构但在像GPT这样只用于生成文本的大模型中主要使用的是解码器部分。我们以生成式模型为重点来拆解。3.1 输入处理词如何变成数字模型看到的不是文字而是数字。首先一个文本序列比如“人工智能是”会经过以下步骤分词使用像BPEByte Pair Encoding这样的算法将文本拆分成子词单元例如[人工, 智能, 是]。这能很好地平衡词典大小和处理未知词的能力。词嵌入每个子词Token都有一个唯一的ID。通过一个可学习的嵌入矩阵将每个ID映射成一个高维向量如768维。至此文本变成了一个向量序列。位置编码注意力机制本身没有顺序概念“猫抓老鼠”和“老鼠抓猫”计算出的注意力权重可能是一样的。这显然不行。因此我们需要给每个词向量的位置信息编码然后加到词向量上。Transformer使用了一组固定的正弦和余弦函数来生成位置编码它能自然地让模型学到相对位置关系。注意在有些模型如GPT中位置编码是可学习的参数而不是用公式计算的。两种方式各有优劣固定式编码外推性处理比训练时更长的序列可能更好可学习式编码在训练长度内更灵活。3.2 核心引擎多头自注意力机制这是Transformer最精华的部分。前面我们讲的是单头注意力而实际使用的是多头注意力。为什么需要“多头”一个类比是当你读一段复杂的法律条文时你可能需要同时关注“主体是谁”、“时间条件”、“例外条款”等多个方面。单头注意力就像只有一个人在做全面的理解而多头注意力相当于组建了一个专家小组每个“头”专注于从不同角度不同表示子空间去分析句子关系最后把各位专家的意见综合起来。具体计算过程简化版对于输入序列的每个词向量我们通过三组不同的权重矩阵W_Q, W_K, W_V线性变换生成三组向量查询向量、键向量和值向量。这就是“Query, Key, Value”的由来。Query可以理解为“我”当前要处理的词想知道什么。Key可以理解为句子中其他词包括自己的“身份标签”。Value是这些词真正的“信息内容”。计算注意力分数用当前词的Query去和序列中所有词的Key做点积得到一组原始分数。然后进行缩放除以Key向量维度的平方根并应用Softmax得到注意力权重。加权求和用上一步得到的注意力权重对所有的Value向量进行加权求和得到当前词的输出向量。这个过程对序列中的每一个词并行执行一次。对于多头注意力我们有h组例如12组不同的W_Q, W_K, W_V矩阵从而得到h组不同的输出向量。最后把这h个输出向量拼接起来再通过一个线性变换层融合成最终的输出。一个关键技巧因果掩码。在GPT这样的纯解码器模型中生成下一个词时它只能“看到”已经生成的词而不能“偷看”未来的词。这是通过在计算注意力分数时加上一个“掩码”实现的。具体来说在Softmax之前将未来位置的注意力分数设置为一个极大的负数如 -1e9这样经过Softmax后未来位置的权重就几乎为0。3.3 前馈网络与残差连接注意力层的输出会送入一个前馈神经网络。这个FFN通常是一个两层的全连接网络中间有一个ReLU激活函数。它的作用是对每个位置的向量进行独立的、复杂的非线性变换增强模型的表达能力。注意这个FFN对序列中每个位置的处理是完全相同的类似于一个“逐点”处理器。在整个Transformer块中有两个至关重要的设计保证了训练的稳定性和深度残差连接将子层如注意力层或FFN层的输入直接加到它的输出上。即输出 子层(输入) 输入。这有效地缓解了深度网络中的梯度消失问题让模型可以堆叠得很深。层归一化在残差连接之后进行层归一化。它作用于同一个序列样本的所有特征维度上将数据调整到均值为0、方差为1的分布加速模型收敛。一个标准的Transformer解码器块如GPT中的一层的顺序通常是层归一化1 - 多头自注意力带因果掩码- 残差连接 - 层归一化2 - 前馈网络 - 残差连接。4. “猜”出下一个词的完整流程现在我们把所有部件组装起来看看大模型是如何从输入“人工智能是”一步步“猜”出下一个词“什么”的。4.1 单步生成从概率分布到采样假设我们已经有了一个训练好的GPT模型。我们输入“人工智能是”。前向传播模型将这三个词处理成一个高维向量序列经过数十层Transformer块的层层计算最终得到序列中最后一个位置对应“是”字的输出向量。这个向量蕴含了基于前面所有上下文的信息。投影到词表将这个输出向量通过一个线性层通常叫LM Head语言模型头投影到整个词表的大小可能是几万甚至几十万维。这个操作相当于为词表中的每一个词计算一个“得分”。生成概率分布对这个得分向量应用Softmax函数将其转化为一个概率分布。这个分布就是模型“猜”出的下一个词的概率。例如“什么”概率 0.25“未来”概率 0.15“一门”概率 0.10“技术”概率 0.08……其他几万个词分享剩下的概率采样如何根据这个概率选择一个词这里有几种策略贪婪搜索直接选择概率最高的词即“什么”。这种方式简单高效但容易导致生成结果重复、单调。随机采样完全按照概率分布随机选取。这会导致结果不稳定可能生成不通顺的内容。核采样只从概率最高的前k个候选词中随机采样。在质量和多样性之间取得较好平衡。Top-p采样从累积概率超过p的最小候选词集合中随机采样。这比固定k更动态是目前的主流方法。假设我们通过Top-p采样选中了“什么”。那么这个“什么”就被追加到输入序列末尾变成“人工智能是什么”。然后整个过程重复用这个新的、更长的序列去预测再下一个词。4.2 自回归生成循环往复的预测上述过程就是自回归生成。模型像一个“循环函数”每次调用都吃进当前已生成的全部序列吐出下一个词的概率分布采样后将其追加回去再作为下一次的输入。如此循环直到生成一个特殊的结束符或者达到预设的最大生成长度。实操心得在部署和推理时为了提升效率会使用KV缓存技术。因为对于已经生成过的序列它们的Key和Value向量在计算后续词的注意力时是不会改变的。所以可以在第一次计算后把它们缓存起来下次生成新词时只需要计算新词的Query与缓存中所有Key的点积以及用新权重加权缓存中的Value避免了大量重复计算。这是大模型推理加速的一个关键优化点。5. 模型是如何学会“猜”的训练过程揭秘模型之所以能“猜”得准全靠海量数据和精心设计的训练过程。大语言模型的核心训练任务是下一个词预测也叫语言模型建模。5.1 训练数据与目标训练数据是来自互联网、书籍等渠道的纯文本。例如从一本书中截取一段“今天天气很好我们一起去公园散步。” 训练时我们会把这段话输入模型但训练目标是让模型预测被遮挡的词。一种常见的方式是因果语言模型输入是“今天天气很好我们一起去公园”模型的目标是预测下一个词“散步”。损失函数计算模型预测的概率分布与真实词“散步”的one-hot编码之间的交叉熵损失。模型通过反向传播和梯度下降不断调整其内部的所有参数包括词嵌入矩阵、注意力权重、FFN权重等以最小化这个损失。本质上模型是在学习文本数据中极其复杂的联合概率分布P(下一个词 | 之前的所有词)。它通过数十亿甚至数万亿次的“试错”最终将语言的语法规则、事实知识、逻辑关联、行文风格等模式压缩存储在那几百上千亿的参数中。5.2 超越简单统计涌现的能力你可能会问这听起来不就是个高级的n-gram统计模型吗区别在于规模和架构。Transformer的深度和注意力机制的全局交互能力使得它能够捕捉极其长程和复杂的依赖关系。更重要的是当模型的参数量和数据量超过某个临界点后会出现涌现能力——一些在小型模型上看不到的能力如复杂的推理、指令遵循、代码生成等会突然出现。这解释了为什么千亿参数的大模型能完成看似需要“理解”的任务而不仅仅是词语搭配。6. 常见问题与实战避坑指南理解了原理在实操中依然会遇到各种问题。这里分享一些常见的困惑和避坑点。6.1 注意力权重真的可解释吗我们常说某个词“关注”了另一个词通过可视化注意力权重图可以看到连线。但这需要谨慎解读。高权重不一定代表“语义关联”它可能只是模型为了完成当前任务如下一个词预测而建立的一种计算捷径。多头注意力中不同头的模式也差异巨大有的关注局部语法有的关注全局主题。将其完全等同于人类的“注意力”是一种拟人化的简化。6.2 为什么我的模型生成的内容总是重复这是自回归生成的常见病称为“退化”问题。原因和解决方案采样策略不当使用贪婪搜索或核采样的k值太小。解决方案尝试提高核采样的温度参数或使用Top-p采样并适当增加p值如0.9以上。重复惩罚在生成时对已经出现过的词进行概率惩罚。这是大多数推理库如Hugging Face的transformers提供的标准功能。训练数据偏差如果训练数据本身就有大量重复模式模型也会学到。需要在数据清洗阶段注意。6.3 位置编码外推性差怎么办训练时用512长度推理时想处理1024长度的文本模型效果可能骤降。这是因为正弦位置编码在训练长度外缺乏泛化能力。方案一使用可学习的位置编码并在更长序列上微调。方案二使用像ALiBi、RoPE等更先进的位置编码方案它们被设计成具有良好的长度外推性。例如ChatGLM就采用了RoPE编码。6.4 模型“胡说八道”产生幻觉这是大模型目前的核心缺陷之一。模型生成的内容是概率分布的采样它追求的是序列的“流畅性”和“统计合理性”而非“真实性”。缓解方法包括检索增强生成在生成答案前先从外部知识库检索相关事实文档让模型基于检索到的真实信息来生成。约束解码在生成过程中强制要求某些关键词或实体必须出现或者必须遵循某种格式如JSON。后处理与验证对关键事实性输出通过另一个模型或规则进行校验。6.5 微调大模型的关键点如果你想用自己的数据微调一个大模型例如用LoRA方法需要注意数据质量高于数据量几百条精心构造的高质量指令数据可能比几万条噪声数据效果更好。指令格式的一致性确保你的微调数据格式与模型预训练时见过的指令格式相似。小心灾难性遗忘使用参数高效微调方法如LoRA本身就是为了避免这个问题。但即使如此也要在保留一部分通用能力评估集上检查确保微调没有严重损害模型的原有能力。从向量点积这个简单的数学操作开始我们穿越了注意力机制、Transformer架构最终抵达了大模型生成下一个词的完整逻辑。这个过程没有魔法有的只是将简单的数学单元通过巧妙的架构和巨大的规模进行组合从而涌现出令人惊叹的能力。理解了这个流程你再看到大模型生成文本时眼前浮现的就不再是神秘的黑箱而是一幅清晰的数据流动与矩阵运算的图景。这不仅能帮助你更好地使用这些模型也能为有志于深入这个领域的开发者打下坚实的第一块基石。在实际操作中多动手跑通一个小型Transformer的代码比如从零实现一个迷你GPT会比读十篇理论文章理解得更透彻。遇到问题时回到最基础的点积和概率分布上去思考往往能豁然开朗。