尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

大语言模型如何预测下一个词:从Token化到Transformer的完整拆解

大语言模型如何预测下一个词:从Token化到Transformer的完整拆解 1. 项目概述从“猜词游戏”到“语言建模”聊起大语言模型LLM大家最直观的感受可能就是它能像人一样聊天、写文章、写代码。但你是否好奇过当你输入“今天天气真”之后模型是怎么“猜”出下一个词是“好”而不是“坏”或者“不错”的呢这背后可不是简单的概率统计而是一套从文本处理到复杂数学计算的完整技术链条。今天我们就来彻底拆解一下这个“猜词”的过程从最基础的文本切分Tokenization开始一路深入到Transformer架构的核心看看一个词是如何被预测出来的。这个过程专业上称为“自回归生成”。你可以把它想象成一个极其复杂的“完形填空”游戏但模型每次只填一个空并且填完的空会成为下一个空的上下文。理解这个过程不仅是理解LLM工作原理的钥匙也能让你在调参、提示工程甚至模型选型时心里更有底。无论你是刚入门的新手还是想深化理解的开发者这篇文章都会带你走一遍这个从Token到Transformer的完整旅程。2. 起点文本的数字化与Token化在模型“思考”之前它必须先“看见”。但模型看不懂人类的文字它只认识数字。因此我们的第一步是把人类可读的文本转换成模型可处理的数字序列。这个过程的核心就是Tokenization分词/标记化。2.1 什么是Token为什么需要它Token可以理解为模型词汇表中的一个基本单位。它不一定等于一个英文单词或一个汉字。对于英文“cat”可能是一个token“ization”如 in token-ization也可能是另一个token。对于中文常见的分词方式是以字为token如“天”、“气”或者以词为token如“天气”、“真”这取决于训练时采用的Tokenizer分词器。为什么需要Tokenization而不是直接处理字符效率与语义字符如26个英文字母数量太少无法有效表达语义而将所有可能的单词都作为独立单元如数十万个英文单词词汇表会过于庞大且无法处理未登录词如“ChatGPTing”。Tokenization在两者之间取得了平衡通过子词Subword算法既能用较少的token覆盖海量词汇又能有效处理新词。计算友好模型内部的嵌入层Embedding Layer需要一个固定大小的查找表将每个token映射为一个高维向量。一个大小适中的词汇表如3万到10万比百万级的单词表或几百个的字符表在存储和计算上更高效。目前主流的Tokenizer如OpenAI的tiktoken用于GPT系列或Google的SentencePiece用于T5、Gemini等大多基于BPEByte Pair Encoding或其变种。BPE的核心思想是迭代地合并文本中最常连续出现的字节对从而形成词汇表。注意选择不同的Tokenizer对模型性能有直接影响。例如以字为token的中文模型可能对成语、专有名词的理解不如以词为token的模型细腻。在评估或使用一个LLM时了解其背后的Tokenizer类型是一个好习惯。2.2 Token化的实操过程与内部表示假设我们输入句子“今天天气真”。使用一个假设的中文BPE分词器可能得到以下token序列[“今” “天” “天气” “真”]。假设这些token在模型的词汇表中的ID分别是[101, 102, 201, 105]。此时模型接收到的就是一个数字序列[101, 102, 201, 105]。但这还没完为了能让模型理解位置信息我们还需要加上位置编码Positional Encoding。因为Transformer架构本身不具备感知单词顺序的能力“今天天气真”和“真天气今天”对它来说初始输入是一样的。位置编码就是给每个位置第1个token第2个token...赋予一个独特的向量与token本身的向量相加从而让模型知道“今”在第一位“真”在第四位。至此我们的输入句子被转化为了一个包含语义通过Token ID查表得到的嵌入向量和位置位置编码向量信息的矩阵准备送入模型的核心——Transformer块进行处理。3. 核心引擎Transformer架构如何运作拿到了带有位置信息的token向量序列接下来就是重头戏Transformer如何基于已有的上下文计算出下一个token的概率分布。Transformer的解码器对于GPT这类纯自回归模型我们主要关注其解码器部分由多层相同的块堆叠而成每一层都包含两个核心子层掩码自注意力机制Masked Self-Attention和前馈神经网络Feed-Forward Network, FFN。预测下一个词的过程本质上是信息在这些层中流动、汇聚和提炼的过程。3.1 掩码自注意力聚焦相关的上下文这是Transformer理解上下文关系的核心。所谓“自注意力”就是让序列中的每个token去“注意”序列中的所有其他token从而根据上下文来更新自己的表示。但请注意“掩码Masked”这个词。在训练和生成时为了符合自回归只能看到过去和现在不能看到未来的特性我们必须确保在预测第i个token时模型只能“看到”第1到第i-1个token。这是通过一个注意力掩码矩阵实现的。在这个矩阵中未来位置j i的注意力权重被设置为一个极大的负数如-1e9这样在经过Softmax归一化后这些位置的权重就几乎为0。具体计算过程简化版对于输入向量序列通过线性变换生成三组向量查询Query, Q、键Key, K、值Value, V。计算注意力分数对于目标位置比如要预测的那个位置用它的Q去点乘序列中所有允许“看到”的位置即它之前的位置的K。这个分数代表了其他token对当前token的重要性。应用掩码将未来位置的分数设为负无穷。对分数进行Softmax归一化得到注意力权重和为1。将权重与对应的V向量加权求和得到当前token更新后的表示。这个新向量融合了它从相关上下文中提取到的信息。通过多层这样的注意力机制模型能够捕捉到不同距离、不同层次的依赖关系比如“真”这个词可能会更强烈地关注到它前面的“天气”从而学习到“天气真...”后面接“好”或“不错”的搭配。3.2 前馈神经网络与残差连接进行深度特征变换经过注意力机制聚合了上下文信息后得到的向量会被送入一个前馈神经网络。FFN通常是一个简单的两层全连接网络中间有一个非线性激活函数如ReLU或GELU。它的作用是对每个位置的特征进行独立的、非线性的变换和增强可以理解为在聚合信息的基础上进行更复杂的特征提取。这里有一个至关重要的设计残差连接Residual Connection和层归一化Layer Normalization。每个子层注意力层、FFN层的输出并不是直接传递给下一层而是先与输入相加残差连接再进行层归一化。即输出 LayerNorm(子层(输入) 输入)为什么这么做残差连接缓解了深度网络中的梯度消失问题使得模型可以堆叠得很深数十甚至上百层而依然有效训练。它确保信息可以从底层直接流通到高层。层归一化稳定了每一层输入的分布加速训练收敛让模型对参数初始化和学习率不那么敏感。经过N个这样的Transformer块N就是模型的“层数”或“深度”如GPT-3有96层的层层处理初始的token向量已经被转化为了富含复杂语义和上下文信息的深层表示。4. 终点从向量到概率再到下一个词当序列的最后一个token对应我们输入句子的末尾的向量经过所有Transformer层后它便承载了关于整个上文“今天天气真”的全部浓缩信息。这个向量就是模型用来预测下一个词的“思维结晶”。4.1 线性层与Softmax生成词汇表概率分布这个最终的隐藏向量假设维度是d_model例如4096会被送入一个线性层也称为输出投影层或语言模型头。这个线性层是一个简单的矩阵其大小是d_model × vocab_size词汇表大小。计算过程将最后一个token的隐藏向量1 × d_model与这个线性矩阵d_model × vocab_size相乘得到一个1 × vocab_size的向量。这个向量中的每个分数logit对应词汇表中一个token的“未归一化得分”。将这个logits向量输入Softmax函数。Softmax会将所有分数转化为概率其公式为P(token_i) exp(logit_i) / sum(exp(logit_j) for j in vocab)。最终我们得到一个概率分布其中每个概率值代表对应token成为下一个词的可能性。对于我们的例子模型可能会输出一个概率分布其中“好”的概率最高比如0.6“不错”的概率次之0.3“坏”的概率很低0.05其他词的概率更小。4.2 采样策略如何从概率中选择下一个词拿到概率分布后模型并不是永远只选择概率最高的那个词贪婪搜索。如果总是选最高概率的词生成的文本往往会变得重复、枯燥、缺乏创造性。因此在实际应用中我们会采用一些采样策略贪婪搜索Greedy Search直接选择概率最高的token。简单高效但容易陷入重复循环。束搜索Beam Search保留概率最高的k个候选序列k称为束宽在每一步都基于这k个序列继续扩展最终选择整体概率最高的序列。比贪婪搜索效果更好常用于机器翻译等任务但在开放生成长文本时也可能导致文本过于保守。随机采样Sampling根据概率分布随机选取下一个token。这能带来最大的多样性但可能产生不连贯的胡言乱语。核采样Top-p Sampling / Nucleus Sampling这是目前最流行的策略。它设定一个概率阈值p如0.9然后从高到低累加token的概率直到总和超过p最后只从这部分“核”集合中重新归一化概率并采样。这既能避免选择极低概率的奇怪token又能保持一定的随机性。温度调节Temperature Scaling在Softmax之前将logits除以一个温度参数T。T1时不变T1会平滑概率分布增加随机性T1会锐化概率分布让高概率更高低概率更低输出更确定。通常Top-p采样和温度调节会结合使用以达到创造性、连贯性和可控性的平衡。假设我们使用Top-p采样p0.9模型从{“好” “不错”}中采样最终选中了“好”。于是模型输出token “好”并将其ID追加到输入序列的末尾。现在输入序列变成了“今天天气真好”模型将以此为基础开始预测再下一个词如此循环往复直至生成完整的回复或达到长度限制。5. 关键环节深度解析注意力机制与位置编码为了更透彻地理解预测过程我们需要深入两个最关键的组件注意力机制的具体计算和位置编码的现代演进。5.1 注意力机制的矩阵运算与多头设计前面我们简述了注意力。在实际实现中为了并行计算所有位置的注意力我们使用矩阵运算。假设输入序列有seq_len个token每个token的向量维度是d_model。线性投影将输入矩阵X(seq_len × d_model) 分别乘以三个权重矩阵W_Q,W_K,W_V得到Q,K,V矩阵。缩放点积注意力计算Attention(Q, K, V) softmax( (Q * K^T) / sqrt(d_k) M ) * V。Q * K^T得到一个 (seq_len × seq_len) 的注意力分数矩阵。sqrt(d_k)是缩放因子d_k是K的向量维度防止点积结果过大导致Softmax梯度消失。M是掩码矩阵下三角为0上三角为负无穷。Softmax按行归一化。最后与V矩阵相乘得到加权后的输出。为什么需要“多头”注意力单一组的Q、K、V只能学习到一种模式的依赖关系。多头注意力Multi-Head Attention将d_model维度的Q、K、V分割成h个头例如d_model768, h12则每个头维度为64。每个头独立进行上述注意力计算可以并行地关注来自不同表示子空间的信息——有的头可能关注语法结构有的头可能关注指代关系有的头可能关注情感倾向。最后将所有头的输出拼接起来再经过一个线性投影变回d_model维度。这种设计极大地增强了模型的表征能力。5.2 位置编码的演进从绝对到相对再到RoPE最初的Transformer使用正弦余弦函数的固定位置编码。但这存在一些问题它外推到比训练更长的序列时效果可能变差并且其绝对位置的设计在“句子A在句子B之前”和“句子B在句子A之前”这种需要理解相对位置的任务上不够灵活。现代LLM特别是像LLaMA、GPT-NeoX等模型广泛采用了旋转位置编码RoPE, Rotary Position Embedding。RoPE的巧妙之处在于它不直接将位置信息加在token向量上而是通过旋转矩阵来修改Q和K向量在计算注意力分数时的内积方式。RoPE的核心思想对于位置为m的token其查询向量q_m和键向量k_n位置为n在进行点乘前分别用一个依赖于位置m和n的旋转矩阵进行变换。这样点乘q_m · k_n的结果会自然地包含两者相对位置(m-n)的信息。这种方法具有很好的外推性并且能显式地建模相对位置关系在实践中被证明非常有效。理解RoPE有助于明白为什么现在的模型能更好地处理长文本和复杂的上下文依赖这是它能够准确预测下一个词的重要基础之一。6. 训练与推理的差异模型如何学会“预测”我们上面描述的是模型的“推理”过程即如何使用训练好的模型进行预测。那么模型是如何被训练成拥有这种预测能力的呢6.1 训练目标下一个词预测语言建模LLM的训练本质上是无监督或自监督的语言建模。训练数据是海量的纯文本如网页、书籍、代码。训练任务非常简单给定一个文本序列的前N个token让模型预测第N1个token。具体步骤从语料库中采样一个文本片段例如“今天天气真好我们一起去公园吧。”将其Token化得到token序列。输入模型时我们将整个序列输入但计算损失时我们对每个位置i都使用模型基于前i-1个token产生的隐藏状态去预测第i个token。将模型的预测概率分布与真实的one-hot标签第i个token进行交叉熵损失计算。通过反向传播和优化器如AdamW更新模型的所有参数最小化这个损失。通过在海量数据上重复这个过程模型逐渐学会了语言的统计规律、语法规则、事实知识乃至一定的逻辑推理能力。它学到的本质上是一个极其复杂的条件概率分布P(下一个token | 所有之前的tokens)。6.2 推理优化KV缓存加速自回归生成在推理时如果每次预测下一个词都从头计算整个序列的注意力效率会极低。因为对于已经生成的token其Key和Value向量在预测后续token时是固定不变的。KV缓存Key-Value Cache就是为了解决这个问题。其原理是在生成第一个token时计算并保存序列中所有token的K和V向量。在生成第二个及以后的token时只需要计算新token的Q向量然后将其与缓存中所有历史token的K、V向量进行计算得到注意力输出。新token自身的K、V向量也会被计算并加入缓存供后续步骤使用。这样除了第一步后续每一步的注意力计算复杂度都从与序列长度的平方相关降低为与序列长度线性相关从而实现了生成速度的极大提升。这是LLM能够实现流畅交互的关键技术保障。7. 常见问题与实战排查技巧在实际使用和开发中围绕“预测下一个词”会遇到各种问题。这里分享一些典型的排查思路和经验。7.1 生成结果不佳如何诊断和调整当你觉得模型生成的内容不符合预期时可以按以下步骤排查问题现象可能原因排查与调整方向输出重复、循环采样温度过低或贪婪/束搜索的惩罚不足。提高温度参数如从0.7调到0.9或启用/加强重复惩罚如repetition_penalty。输出随机、不连贯采样温度过高或Top-p值设置过小。降低温度参数如调到0.3或增大Top-p值如从0.8调到0.95。忽略部分指令或上下文注意力机制未能有效捕捉长程依赖提示词设计不佳。检查模型上下文长度是否足够优化提示词将关键指令放在靠前或靠后的位置因某些模型对首尾位置更敏感尝试在指令前后添加特殊分隔符。事实性错误胡编乱造模型本身的知识局限或幻觉倾向。这是LLM的固有问题。对于关键事实应通过检索增强生成RAG从外部知识库获取信息在提示中要求模型标注不确定信息。生成速度慢序列过长KV缓存占用内存大模型过大硬件限制。考虑使用量化模型如GPTQ、AWQ减少显存占用和加速使用更高效的注意力实现如FlashAttention设置合理的max_new_tokens限制生成长度。实操心得调整生成参数温度、Top-p就像在“可控性”和“创造性”之间找平衡点。对于需要严谨答案的任务代码生成、摘要使用较低温度0.1-0.3和贪婪/束搜索。对于创意写作、头脑风暴使用较高温度0.8-1.0和Top-p采样。没有一成不变的最优值需要针对具体任务进行微调。7.2 Tokenization相关的“坑”Tokenization是很多诡异问题的根源。长度计算错误不要用len(string)来计算文本的token长度必须使用模型对应的Tokenizer。英文中一个单词可能被分成多个token如“tokenization” -[“token”, “ization”]。中文中不同分词器的结果差异巨大。始终使用tokenizer.encode(text)来获取准确的token IDs和长度。特殊token处理Tokenizer会添加一些特殊token如bos开始、eos结束、pad填充。在构造输入和解析输出时需要清楚模型期望的格式。例如有些模型在生成时会自动添加eos有些则需要你手动处理。跨语言问题对于多语言模型同一个词在不同语言中可能对应不同的token和嵌入向量。混合语言输入有时会导致意想不到的生成效果。重要提示当遇到模型对某些短语或指令反应异常时一个非常有效的调试方法是将文本输入和输出用tokenizer.decode(tokenizer.encode(text))来回转换一下。你可能会发现你以为的输入和模型“看到”的输入因为分词方式不同根本不是一回事。这是排查提示工程问题的一大利器。理解LLM如何预测下一个词不仅仅是了解一个技术流程更是掌握与这些模型有效交互的基础。从精准计算上下文窗口到设计能被模型更好理解的提示词再到调试生成效果每一步都离不开对这套底层机制的认识。希望这次从Token到Transformer的完整拆解能让你在下次使用或思考LLM时多一份了然于胸的底气。
返回列表