1. 项目概述从“猜词”到“理解”的认知跃迁“大模型是怎么猜出下一个词的”这个问题几乎是我接触每一个对AI感兴趣的朋友时他们都会抛出的第一个疑问。听起来很玄乎一个程序怎么能像人一样“猜”出接下来要说什么是背下了互联网上所有的句子吗还是有一个超级大的概率表其实这个“猜”的过程远比你想象的更精巧、更数学也更像一种“理解”而非“记忆”。它的核心引擎就是Transformer架构而理解这个引擎的关键钥匙就藏在“点积”这个看似简单的数学运算里。我自己在深入研究Transformer之前也一度被各种“注意力”、“多头”、“前馈网络”这些术语搞得晕头转向。直到有一天我把所有复杂的结构都先抛开回归到最本质的问题模型是如何处理一个句子并决定下一个词该是什么的答案的起点就是将文字转化为数字更具体地说是转化为高维空间中的向量。每一个词比如“苹果”不再是一个孤立的符号而是被表示成一个由几百甚至几千个数字组成的向量。这个向量就是这个词在这个模型所理解的“语义空间”里的坐标。而“点积”就是计算两个向量之间“相关性”或“相似度”的那把尺子。所以这篇文章的目的就是带你亲手用这把“尺子”一步步搭建起理解Transformer的阶梯。我们将彻底抛弃“黑箱”的恐惧从最基础的向量和点积出发经过自注意力机制的淬炼最终窥见大模型如何通过矩阵的并行计算完成从“看到”上文到“生成”下文的整个思维链条。无论你是刚入门的新手还是有一定基础想打通任督二脉的开发者我相信走完这一程你再看那些复杂的模型结构图眼里看到的将不再是令人畏惧的线条和方块而是一套清晰、优雅且强大的数学逻辑在流畅运转。2. 核心思路拆解为什么是点积和注意力在深入代码和公式之前我们必须先想明白为什么是点积Dot Product为什么注意力Attention机制能成为现代大模型的基石这背后是一系列精妙的设计取舍。2.1 从词袋到词向量语义的数字化生存最早的语言模型比如基于N-gram的方法本质上是“词袋”模型。它统计“苹果”后面出现“手机”的概率高还是出现“好吃”的概率高。这种方法完全忽略了词的顺序和语义。“苹果公司”和“吃了一个苹果”中的“苹果”对它来说是同一个东西。这显然不行。词向量Word Embedding的出现是第一次革命。它将每个词映射为一个稠密向量。关键突破在于语义相似的词其向量在空间中的位置也接近。例如“国王”的向量减去“男人”的向量再加上“女人”的向量结果会非常接近“女王”的向量。这种语义关系是通过在大规模文本上训练得到的。此时模型处理的不再是符号而是有几何意义的点。注意这里的“向量接近”通常用余弦相似度衡量而余弦相似度的计算核心就是点积两个向量的点积除以它们模长的乘积。所以点积从这一刻起就已经是衡量语义相似度的底层操作了。2.2. RNN/LSTM的困境与Transformer的破局在Transformer之前RNN循环神经网络及其变体LSTM是处理序列的主流。它们像一个人读书一样一个字一个字地读并有一个“记忆细胞”来保存上文的信息。但这里有两个致命伤并行化困难必须按顺序计算无法利用GPU强大的并行计算能力训练极慢。长期依赖遗忘尽管LSTM改善了梯度消失但当序列很长时比如几百上千个词开头的信息传到末尾已经非常微弱了。Transformer的答案简单粗暴为什么不一次性看完整个句子然后让句子里的每个词都去“注意”其他所有词呢这就是“自注意力”Self-Attention的核心思想。它摒弃了递归完全依赖矩阵乘法实现了完美的并行。而实现“注意”这个动作的数学工具就是点积。为什么点积适合做“注意力”的度量想象一下每个词的向量代表它在语义空间中的一个“观点”或“特征”。当处理句子“猫坐在垫子上”时模型需要知道“坐”这个动作和“猫”、“垫子”都相关。它如何计算“坐”和“猫”的相关性呢我们把“坐”的原始向量通过一个变换学到的权重矩阵生成一个“查询”向量Query Q代表“坐”想知道“谁在执行我”我们把“猫”的原始向量通过另一个变换生成一个“键”向量Key K代表“猫”的标签“我是动作的执行者”。计算Q坐和K猫的点积。如果点积值大说明“坐”的查询和“猫”的键匹配度高即“猫”很可能是“坐”的主语。同时我们还会把“猫”的向量通过第三个变换生成一个“值”向量Value V它包含了“猫”这个词的完整语义信息。最终“坐”这个词的新表示将是所有词包括它自己的V向量的加权和权重就是由Q和K的点积经过Softmax计算得到的注意力分数。这个过程的美妙之处在于模型不再需要像RNN那样艰难地传递记忆。任何一个词都可以通过一次矩阵运算直接“捕捉”到序列中任何远处与之相关的词的信息。而点积就是这个捕捉过程中计算相关性强度最核心、最自然的数学操作。它计算高效就是乘加运算几何意义明确反映向量方向和长度的综合关系并且可以通过梯度下降自动学习到最佳的Q、K、V变换矩阵。3. 核心细节解析点积注意力与缩放理解了用点积计算注意力的动机我们来看它的标准形式也是Transformer中最关键的公式之一缩放点积注意力Scaled Dot-Product Attention。3.1 注意力公式的逐层拆解公式如下Attention(Q, K, V) softmax(QK^T / sqrt(d_k)) V看起来很简单但每一步都暗藏玄机。我们假设输入一个包含n个词的句子每个词的向量维度是d_model例如512。生成Q K V矩阵这是第一步也是模型要学习的核心参数所在。对于整个句子的所有词向量组成的矩阵X形状为[n, d_model]我们分别乘以三个不同的权重矩阵W_Q,W_K,W_V形状都是[d_model, d_k]其中d_k是Q/K的维度通常等于d_model除以注意力头数。得到Q X * W_Q形状[n, d_k]K X * W_K形状[n, d_k]V X * W_V形状[n, d_v]通常d_v d_k这里W_Q,W_K,W_V就是模型在训练中要学习的参数。它们的作用是将原始的词向量投影到不同的“子空间”分别负责提问、应答和提供信息。计算QK^T这是点积登场的时刻。Q和K的转置相乘得到的是一个[n, n]的矩阵。这个矩阵的第i行第j列的值就是第i个词的查询向量Q_i与第j个词的键向量K_j的点积。它直观地表示了句子中每个词对每个词的“关注度”原始分数。缩放Scale除以 sqrt(d_k)这是Transformer论文中的一个关键技巧。当d_k向量的维度较大时点积的结果可能会变得非常大。这会导致Softmax函数的梯度变得极其小因为Softmax会将非常大的输入值推向0或1的极端也就是所谓的“梯度消失”使得模型难以学习。为什么是sqrt(d_k)假设Q和K中的每个元素都是均值为0、方差为1的独立随机变量那么Q_i和K_j的点积结果的均值是0方差就是d_k。除以sqrt(d_k)就是为了将方差重新缩放回1使得Softmax处的梯度处在一个更稳定的范围内。实操心得这个缩放因子看似简单但在实际训练中尤其是当你尝试修改d_k的维度时忽略它很可能导致模型无法收敛或训练不稳定。这是一个必须严格遵守的“数学纪律”。应用Softmax对缩放后的[n, n]矩阵的每一行应用Softmax函数。Softmax的作用是将每一行的所有值即一个词对所有词的关注分数转化为一个概率分布和为1。这样每个词分配到其他词上的“注意力权重”就清晰了且权重大的地方就是它应该重点关注的地方。乘以V矩阵将得到的[n, n]的注意力权重矩阵与[n, d_v]的V矩阵相乘。最终得到一个新的[n, d_v]矩阵。这个矩阵就是自注意力层的输出。它的每一行都是原始句子中所有词向量的加权和权重由注意力机制动态决定。例如输出中代表“坐”的那个向量现在包含了来自“猫”和“垫子”的强烈信息因此它比原始的“坐”向量蕴含了更丰富的上下文语义。3.2 多头注意力并行化的“多视角”理解单一的一套Q、K、V矩阵可以学习到一种固定的“注意力模式”。但一个词在不同语境下的关联可能是多方面的。比如“苹果”在“苹果手机”中关注的是“公司、科技”在“苹果好吃”中关注的是“水果、甜”。为了让模型同时关注来自不同“表示子空间”的信息Transformer引入了多头注意力Multi-Head Attention。它的思想很直接既然一套权重一个“头”学一种模式那我们并行地跑多套权重不就行了假设我们有h个头例如8个。我们不是用整个d_model维去生成Q、K、V而是将d_model维拆分成h份每一份的维度是d_k d_model / h。对每一个头i我们都有一组独立的权重矩阵W_Q_i,W_K_i,W_V_i它们将输入的X投影到更低维的子空间d_k维然后独立进行上述的缩放点积注意力计算。这样我们就得到了h个不同的[n, d_k]输出矩阵。最后将这h个输出在特征维度上拼接Concat起来得到一个[n, d_model]的矩阵再通过一个可学习的线性投影矩阵W_O进行融合得到最终的多头注意力输出。这个过程的意义在于不同的头可以学会关注不同的关系。有的头可能专门关注语法结构如主谓一致有的头可能关注指代关系如“它”指代谁有的头可能关注语义搭配。它们并行工作最后将成果汇总使得模型对上下文的理解更加立体和全面。注意事项多头注意力的计算开销看起来大了h倍但由于每个头的维度d_k减小为原来的1/h其矩阵乘法的总计算复杂度与单头全维度的注意力大致相当。这是一种利用并行计算提升模型容量而不过度增加计算负担的巧妙设计。4. 实操推演构建一个极简的“猜词”Transformer理论说了这么多我们动手推演一下一个只有一层、一个注意力头的超迷你Transformer是如何处理句子并预测下一个词的。我们使用极简的数值和维度以便看清每一步的数据流动。假设我们的词表只有4个词[我 爱 学习 AI]。词向量维度d_model4。我们输入一个序列“我 爱”目标是预测下一个词“学习”。4.1 步骤一词嵌入与位置编码首先我们有一个随机初始化的词嵌入矩阵Embedding形状为[4 4]词表大小4 维度4。假设我-[1 0 0 0]爱-[0 1 0 0]学习-[0 0 1 0]AI-[0 0 0 1]实际中是稠密的浮点数这里用one-hot便于理解输入序列“我 爱”对应的矩阵X_input [[1000] [0100]]形状[2 4]。由于自注意力机制本身没有顺序概念我们需要加入位置编码Positional Encoding来告诉模型词的位置信息。我们使用一个最简单的正弦/余弦编码的简化版假设位置0的编码是[0.1 0.1 0.1 0.1]位置1的编码是[0.2 0.2 0.2 0.2]。那么加上位置编码后的输入矩阵X为我位置0[10.1 00.1 00.1 00.1] [1.1 0.1 0.1 0.1]爱位置1[00.2 10.2 00.2 00.2] [0.2 1.2 0.2 0.2]所以X [[1.1 0.1 0.1 0.1] [0.2 1.2 0.2 0.2]]。4.2 步骤二自注意力计算假设我们的模型只有一个注意力头且d_k d_model 4。我们随机初始化三组权重矩阵W_QW_KW_V 为了简单假设它们都是4x4的单位矩阵实际是随机小数并参与训练。即W_Q W_K W_V I单位矩阵。那么Q X * I X [[1.1 0.1 0.1 0.1] [0.2 1.2 0.2 0.2]]K X * I X同上V X * I X同上1. 计算 QK^TQK^T [[1.1 0.1 0.1 0.1] * [[1.1 0.2] [0.2 1.2 0.2 0.2]] [0.1 1.2] [0.1 0.2] [0.1 0.2]] [[1.1*1.1 0.1*0.1 0.1*0.1 0.1*0.1 1.1*0.2 0.1*1.2 0.1*0.2 0.1*0.2] [0.2*1.1 1.2*0.1 0.2*0.1 0.2*0.1 0.2*0.2 1.2*1.2 0.2*0.2 0.2*0.2]] [[1.210.010.010.01 0.220.120.020.02] [0.220.120.020.02 0.041.440.040.04]] [[1.24 0.38] [0.38 1.56]]得到一个[2 2]的矩阵第i行第j列表示词i对词j的原始关注分数。2. 缩放d_k 4sqrt(d_k)2。缩放后矩阵为[[1.24/2 0.38/2] [0.38/2 1.56/2]] [[0.62 0.19] [0.19 0.78]]3. 应用Softmax按行第一行[0.62 0.19]exp(0.62)1.86 exp(0.19)1.21 和为3.07。权重为[1.86/3.07 1.21/3.07] ≈ [0.606 0.394]。第二行[0.19 0.78]exp(0.19)1.21 exp(0.78)2.18 和为3.39。权重为[1.21/3.39 2.18/3.39] ≈ [0.357 0.643]。 所以注意力权重矩阵A [[0.606 0.394] [0.357 0.643]]。解读对于第一个词“我”第0行它关注自己的权重是0.606关注“爱”的权重是0.394。对于“爱”第1行它关注“我”的权重是0.357关注自己的权重是0.643。这符合直觉一个词通常会比较关注自己同时也关注序列中的其他词。4. 计算输出 Z A * VZ [[0.606 0.394] * [[1.1 0.1 0.1 0.1] [0.357 0.643]] [0.2 1.2 0.2 0.2]] [[0.606*1.10.394*0.2 0.606*0.10.394*1.2 0.606*0.10.394*0.2 0.606*0.10.394*0.2] [0.357*1.10.643*0.2 0.357*0.10.643*1.2 0.357*0.10.643*0.2 0.357*0.10.643*0.2]] [[0.6660.079 0.0610.473 0.0610.079 0.0610.079] [0.3930.129 0.0360.772 0.0360.129 0.0360.129]] [[0.745 0.534 0.140 0.140] [0.522 0.808 0.165 0.165]]这就是自注意力层的输出。可以看到“我”的输出向量[0.745 0.534 0.140 0.140]融合了“我”和“爱”的信息因为权重是0.606和0.394。“爱”的输出向量同理。4.3 步骤三前馈网络与预测Transformer层中自注意力输出Z之后会经过一个前馈神经网络Feed-Forward Network FFN这是一个简单的两层全连接网络通常中间有一个ReLU激活函数。它的作用是对每个位置每个词的特征进行独立的、非线性的变换和增强。假设我们有一个极简的FFNFFN(x) max(0 x*W1 b1) * W2 b2。为了演示我们假设W1是4x8的矩阵W2是8x4的矩阵且它们都是某种随机值实际是学出来的。经过FFN后我们得到一个新的序列表示。最终我们需要预测下一个词。在训练时我们通常取最后一个位置的输出向量对应序列的末尾或者像GPT那样对每个位置都做预测。这里我们取最后一个位置“爱”的FFN输出向量假设经过计算后为[0.5 0.8 1.2 -0.1]。将这个向量乘以一个输出投影矩阵形状为[d_model 词表大小]即[4 4]得到一个长度为4的**逻辑值logits**向量每个值对应词表中的一个词我 爱 学习 AI的未归一化得分。最后对这个logits向量应用Softmax就得到了下一个词的概率分布。在训练时我们希望“学习”对应的概率最高。模型通过比较预测概率和真实标签“学习”计算损失如交叉熵损失然后通过反向传播和梯度下降去调整我们之前假设的所有参数词嵌入矩阵、W_Q/W_K/W_V、FFN的权重、输出投影矩阵等等。经过海量文本数据的反复训练这些参数会逐渐调整到最佳状态。最终当模型看到“我 爱”时它内部的自注意力机制会让“爱”这个词的表示充分吸收“我”的信息FFN和输出层最终会使得“学习”这个词对应的logits值最高从而成功“猜”出下一个词。5. 从单层到巨兽大模型的核心组件与训练我们上面拆解的是一个极度简化的单层、单头模型。真实的GPT、LLaMA等大模型是这个基础结构的巨大堆叠和精细化。5.1 Transformer的完整架构编码器与解码器原始的Transformer论文提出了编码器-解码器Encoder-Decoder架构主要用于机器翻译等序列到序列任务。编码器由N个如6层相同的层堆叠而成。每一层都包含一个多头自注意力子层和一个前馈神经网络子层每个子层周围都有残差连接Residual Connection和层归一化Layer Normalization。编码器的目标是理解输入序列为每个位置生成一个富含上下文信息的表示。解码器同样由N个相同的层堆叠。但每一层包含三个子层掩码多头自注意力层与编码器的自注意力类似但为了防止模型在训练时“偷看”未来的答案加入了注意力掩码Attention Mask确保每个位置只能关注它之前的位置包括自己。这是实现“从左到右”生成的关键。编码器-解码器注意力层这一层的Query来自解码器上一层的输出而Key和Value来自编码器的最终输出。这让解码器在生成每一个词时都能“注意”到完整的输入序列信息。前馈神经网络层。而我们今天主要讨论的GPT系列、LLaMA等自回归语言模型采用的是解码器-only架构。它们只使用了解码器的结构带掩码的自注意力和前馈网络去掉了编码器-解码器注意力层。因为它们的任务就是根据上文生成下文不需要一个独立的编码器来处理另一个序列。5.2 大模型训练的核心预测下一个词大模型的训练目标极其纯粹给定一个词序列的前面部分预测下一个词是什么。这个任务被称为自回归语言建模。具体来说准备海量文本数据如整个互联网的网页、书籍、代码等。将文本切分成固定长度的序列如2048个token。对于序列[x1 x2 ... x_n]输入模型的是[x1 x2 ... x_{n-1}]模型需要输出对[x2 x3 ... x_n]的预测。模型内部通过我们上面描述的多层Transformer解码器为每个位置i计算一个特征向量然后通过一个线性层映射到整个词表得到该位置下一个词的概率分布。计算预测分布与真实下一个词x_{i1}的交叉熵损失并对所有位置求平均。通过反向传播和优化器如AdamW更新模型中所有的参数词嵌入、注意力权重、FFN权重等。这个过程的神奇之处在于通过这个简单的“猜下一个词”的任务在万亿级别的token上训练后模型被迫去学习文本中蕴含的语法、语义、逻辑、事实乃至推理模式。为了更准确地“猜”它必须构建一个对世界知识的内部压缩表示。注意力机制尤其是自注意力就是它构建和理解这种上下文关联的核心工具。5.3 关键技巧层归一化、残差连接与学习率预热要让如此深几十甚至上百层的Transformer模型稳定训练离不开几个关键技巧残差连接Residual Connection每个子层自注意力、FFN的输出是LayerNorm(x Sublayer(x))。这允许梯度直接流过恒等映射极大地缓解了深度网络中的梯度消失问题使得训练上百层的网络成为可能。层归一化Layer Normalization对每个样本的所有特征维度进行归一化稳定每一层的输入分布加速训练收敛。通常放在残差相加之后。学习率预热Learning Rate Warmup在训练初期使用一个很小的学习率然后线性或余弦增加到预设值。这是因为模型参数初始随机一开始梯度可能很大且不稳定预热可以避免模型在初期“跑偏”。实操心得当你自己尝试复现或微调Transformer模型时这些技巧缺一不可。忽略层归一化或残差连接模型几乎无法训练。没有学习率预热损失曲线可能会剧烈震荡甚至发散。这些都是经过大量实验验证的“最佳实践”不要轻易改动其默认位置和顺序。6. 常见问题与深度思考在理解和应用Transformer时总会遇到一些令人困惑的问题。这里我结合自己的经验分享一些常见的疑问和排查思路。6.1 为什么点积注意力需要“缩放”这个问题前面提到过但值得再强调。核心原因是控制Softmax的输入范围。假设Q和K的每个分量是独立同分布均值为0方差为1。那么Q_i · K_j的方差就是d_k。当d_k很大如512、1024时点积结果的绝对值可能会非常大正或负。这会导致Softmax函数将几乎所有的概率质量都分配给最大值对应的位置其他位置的梯度变得极小。这被称为“极端Softmax”会严重阻碍模型学习到丰富的注意力模式。除以sqrt(d_k)就是将方差拉回1确保注意力权重分布更柔和梯度更健康。6.2 自注意力与CNN、RNN的对比特性CNN (卷积神经网络)RNN/LSTM (循环神经网络)Transformer (自注意力)感受野局部通过堆叠层数扩大理论上全局实际受梯度消失限制真正的全局一层即可看到所有位置并行性高卷积核在空间上独立低必须顺序计算极高矩阵乘法完美并行长程依赖弱需要很深网络中等LSTM有改善但仍有限强直接计算任意两位置关系计算复杂度O(n * k) k为卷积核大小O(n)O(n^2 * d) n为序列长度d为维度顺序信息隐含在空间位置中天然顺序处理需要额外位置编码注入Transformer的代价其自注意力计算复杂度与序列长度n的平方成正比。这就是为什么处理超长文本如一本书仍然是一个挑战也是各种“高效注意力”如滑动窗口注意力、线性注意力研究的方向。6.3 位置编码没有它Transformer就是个“词袋”自注意力机制是排列不变的Permutation Invariant。打乱输入词的顺序输出向量之间的相关性不会变只是顺序跟着打乱。这显然不符合语言特性。“猫追老鼠”和“老鼠追猫”意思完全不同。因此必须显式地告诉模型词的位置。绝对位置编码如原始论文的正弦余弦编码。它为每个位置计算一个固定的、独特的向量加到词嵌入上。优点是能外推到比训练更长的序列有一定限度。相对位置编码如旋转位置编码RoPE LLaMA等模型使用。它不直接加一个位置向量而是在计算Q和K的点积时根据它们的相对位置引入一个旋转矩阵。这种方法在长文本上的外推性通常更好也是当前主流大模型的选择。6.4 推理时如何“猜”下一个词贪心搜索与采样训练时模型并行地预测序列中每个位置的下一个词。但在推理生成时我们是一个词一个词地往外“蹦”的。这个过程叫自回归生成。给定初始输入如“我 爱”模型输出对下一个词的概率分布。如何从这个分布中选一个词最简单是贪心搜索Greedy Search永远选概率最高的那个词。但这样容易导致生成重复、枯燥的文本。更常用的方法是采样Sampling随机采样直接按概率随机选。可能产生不连贯的胡言乱语。核采样Top-p Sampling只从累积概率超过p如0.9的最小候选词集合中随机采样。在保证连贯性的同时增加多样性。温度采样Temperature Sampling在计算Softmax之前将logits除以一个温度参数T。T1为原始分布T1分布更平更随机T1分布更尖更确定接近贪心。选出一个词后将其拼接到输入序列末尾作为新的输入重复步骤1。直到生成结束标记或达到最大长度。生成策略的选择对于需要创造性、多样性的任务如写故事、聊天常用较高的温度如0.8-1.0和Top-p采样。对于需要准确、可靠答案的任务如问答、代码补全常用较低的温度如0.2-0.5或直接贪心搜索。6.5 大模型真的是在“理解”吗这是一个哲学问题但从工程角度看我们可以说大模型通过“猜下一个词”这个目标学习到了一种强大的条件概率建模能力。它构建的向量表示和注意力模式能够捕捉到人类语言中复杂的模式和关联。当它生成的文本符合语法、逻辑和事实时我们感觉它“理解”了。但它没有意识、没有意图它的“理解”是基于统计模式的内插和外推。它的强大之处在于这种基于统计的“模式匹配”能力在足够大的数据和模型规模下涌现出了令人惊叹的泛化、推理和创造能力。回过头看“猜”这个词用得既准确又不准确。准确在于它的核心数学操作就是计算概率。不准确在于这个“猜”的背后是千亿参数对世界知识的编码是万亿token训练出的复杂模式识别是注意力机制对上下文的动态建模。它不是在瞎猜而是在进行一场基于极高维度、极复杂模型的“最优概率推演”。而我们通过理解点积到Transformer的这条路径终于得以窥见这场宏大推演的底层引擎是如何精密运转的。