我要提问
ARTICLE DETAIL

资讯详情

前沿编程新知与开发实战干货的深度解读。

大语言模型原理:从下一个词预测到Transformer结构

大语言模型原理:从下一个词预测到Transformer结构 1. 先说结论大语言模型其实是个超级接龙游戏如果你只用一句话向别人解释大语言模型LLM是什么我会说它是一个不断预测下一个词的系统。这句话听起来简单到有点侮辱智商但请允许我把它说完——所有你看到的惊艳能力写诗、编程、解数学题、模拟对话全部建立在这个看似朴素的机制之上。我在刚接触LLM的时候也犯过同样的错误总以为模型内部有一套复杂的推理引擎或者某种理解机制在驱动。但当你把GPT系列、开源社区的各类模型拆开看绕来绕去都会回到同一个地方——next token prediction下一个词元预测。Transformer结构再精巧最终目标也只是为了让这个预测变得更准。这个认知转变非常重要。因为一旦你接受LLM接龙这个设定很多困惑都会迎刃而解为什么模型会生成编造的答案因为它只是在接龙而不是在查询数据库。为什么同样的模型在不同温度下表现差异巨大因为接龙时选择的随机性不同。为什么上下文窗口有长度限制因为模型在接龙时能参考的前文长度是固定的。这篇文章我就以这个核心认知为主线把next token prediction和transformer结构彻底讲透。没有数学公式堆砌没有故作高深我会用尽量直白的话配合我在实际使用和微调模型过程中积累的经验把这两个概念讲明白。适合以下人群阅读刚开始接触LLM的开发者、想深入理解模型原理的学生、以及那些已经用了一段时间API但始终觉得隔了一层的从业者。2. next token prediction到底在预测什么2.1 从概率分布开始理解很多人第一次接触LLM时会被神经网络参数嵌入这些词吓住但next token prediction的核心其实是一个很朴素的统计问题给定一段前文下一个词是什么比如你输入今天天气模型内部会计算一个概率分布可能的结果是不错——概率0.3很好——概率0.25怎么样——概率0.2有点——概率0.15其他所有可能性——剩余概率模型最后输出的是这个概率分布而我们看到的文字是从这个分布中采样得到的结果。这里有一个很多人没意识到的重要事实大语言模型本质上不认识文字它只对词元token做运算。一个词元可能是完整单词、半个单词、甚至一个标点符号。模型的工作就是读入一串词元然后从词表中挑选下一个最合适的词元。我在训练一个小型模型做实验时观察过一个很有趣的现象当输入的上下文足够充分时概率分布会非常尖锐某个候选词的概率接近1模型表现得像是确信答案但上下文信息不足时概率分布会变得平坦模型开始犹豫这时候就会输出一些含糊的、来回绕的内容。这个观察对调试prompt很有帮助——当你觉得模型答非所问时很多时候不是你问错了而是上下文里提供的信息不足导致概率分布太平坦。2.2 为什么预测下一个词能带来智能这是最容易被质疑的一点一个只会接龙的系统凭什么能写代码、做推理我自己在深入理解这个机制后得出的答案是智能不是设计出来的而是被强制出来的。想象一下如果你被要求预测一本推理小说的下一个词你需要什么能力首先你得理解前面所有的情节铺垫你得知道每个角色之间的关系你得掌握作者的行文风格甚至要推测故事发展的内在逻辑。当一个系统被训练去预测海量文本中的下一个词时它被迫学会了这些过程中的所有隐含知识——语法规则、事实常识、逻辑链条、写作风格、世界模型。这就是为什么模型参数中实际存储的不是词频表而是一个高度压缩的世界模型。OpenAI的研究者在一次展示中演示过如果让模型预测这个房间里有一把椅子椅子的颜色是___模型能答对因为它从大量训练文本中学会了椅子和颜色之间的关联虽然它从未亲眼见过椅子。我经常用一个类比来说明这一点next token prediction就像让一个孩子在大量阅读后复述下一句话。孩子刚开始只会模仿但读得足够多之后他开始理解句子的结构、语义的连贯性、甚至故事中的因果关系。这个被迫理解的过程恰好就是LLM产生智能的路径。2.3 采样、温度与创造力的真相理解了概率分布之后你就会明白为什么同一个模型可以被调成严谨模式或创意模式——关键在于采样策略。在推理时模型计算完概率分布后不会直接把概率最高的词元输出那样会得到非常死板、重复的文本而是根据概率分布进行采样。这时候有一个关键参数叫温度temperature温度趋近于0采样基本等同于选择最高概率的词元输出变得保守、确定温度较高如1.0采样更随机低概率词元也有机会被选中输出变得多样、有跳跃性这个参数直接影响所谓的创造力但其实它只改变了采样的随机程度并没有改变模型内部的任何知识。我在实际项目中的经验是写代码任务最好把温度调低0.1-0.3因为代码需要精确性写营销文案或头脑风暴时把温度调高0.7-1.0让输出更丰富。但要注意温度过高会导致模型胡言乱语本质上是因为它开始选择那些概率很低的词元偏离了合理的语言模式。理解了这一点你就不再会觉得温度是个玄学参数它完全可以用概率采样的逻辑来解释。3. Transformer结构让接龙能力飞升的关键3.1 为什么循环神经网络不够用了在transformer出现之前处理序列数据也就是文本的主流方案是循环神经网络RNN。RNN的思路是一个一个地读词每读一个新词就更新一个隐藏状态这个状态试图携带前面所有信息的压缩摘要。但RNN有个致命问题它必须串行处理序列无法并行计算训练速度极慢。更麻烦的是随着时间的推移早期信息会在状态传递中逐渐丢失导致模型忘记很久以前的内容。这就好比让你复述一篇长文读到最后时已经想不起来第一段讲了什么。Transformer结构的革命性在于它抛弃了按顺序读的思路改为同时看整个序列。它不是按时间顺序逐个处理词元而是把整句话的所有词元一次性输入到一个并行计算的架构中让每个词元都能直接和所有其他词元交互。这个设计的选择直接解决了两个问题并行训练效率大幅提升序列中远距离的信息依赖也不再受距离限制。3.2 自注意力机制让每个词看所有词Transformer的核心组件叫自注意力Self-Attention它的作用可以这样理解当模型处理某个词时它会计算这个词和句子中其他所有词之间的关联权重然后根据这些权重来聚合其他词的信息。举一个具体的例子。处理小明把苹果放在桌上因为他觉得___这句话时模型要预测觉得之后的内容需要知道他指代的是谁。自注意力机制会计算他和小明之间的高关联权重于是小明的信息被共享给他同时苹果桌上这些词也会贡献空间信息。通过这种方式模型在预测下一个词时实际上是在利用整个句子的全部信息而不是像RNN那样只能依赖一个逐渐衰减的压缩状态。我做的第一个自注意力可视化实验给我留下的印象非常深把attention权重画出来之后你会发现模型在处理动词时总是倾向于关注它的主语和宾语处理代词时总是倾向于关注它指代的名词。这本应该是语言学家的研究对象却在训练过程中被神经网络自己发现了这不是巧合而是预测下一个词这个任务的必然要求。3.3 QKV机制自注意力的实际计算逻辑自注意力的实现细节中最常被提到的就是**查询Query、键Key、值Value**这三个概念——它们通常被简称为Q、K、V。可以用图书馆借书来理解这套机制Query代表我要找什么Key代表每本书的主题标签Value代表书的内容当模型处理一个词元时它会先生成这个词元对应的Query向量然后用这个Query去和序列中所有其他词元的Key做匹配计算——这个匹配分数决定了哪些信息值得关注。匹配之后模型根据分数对Value向量做加权求和得到当前词元的增强表示。在这个机制中匹配分数通常通过点积相似度计算再除以向量维度的平方根做缩放。为什么要缩放因为当向量维度较大时点积结果会变得非常大导致softmax后的注意力权重过于尖锐不利于训练稳定性。这个细节我在面试候选人和带新人时经常考——能主动说出这个缩放原因的说明对机制的理解比较扎实。3.4 多头注意力不同视角的并行关注实际工程中的transformer不会只用一组QKV而是会使用多头注意力。直观地说一个头可能专门关注语法依赖关系另一个头可能关注语义相似性还有一个头可能关注位置相邻关系。比如在上面那个小明放苹果的例子中一个注意力头可能专注于代词与名词的指代关系另一个头可能专注于动词与宾语之间的语义配合。模型通过多个注意力头并行捕获不同维度的关系然后把各头的结果拼接起来形成一个综合的、信息更丰富的表示。多头这个设计被证明极其有效但它的必要性并不是先验可知的——是一个在实践中被反复验证的经验性选择。我在尝试缩减某些维度来压缩模型时发现减少头数会导致生成文本的连贯性明显下降即使参数量变化不大。这说明多头注意力的价值不在于参数量而在于它天然地提供了分而治之的并行建模能力。3.5 位置编码让模型知道先来后到自注意力机制有个特点它对序列中词元的顺序不敏感。如果把小明打碎了花瓶变成花瓶打碎了小明自注意力计算出的词元间关联权重完全一样——因为它们之间的两两关系没有变。但语义显然变了。为了给模型注入顺序信息transformer引入了位置编码。原始论文使用正弦和余弦函数的编码方式不同的频率对应不同的位置通过三角函数的叠加唯一标识每个位置。这个选择有一个不错的数学性质任意两个位置的编码可以通过线性变换相关联位置间的相对关系也能被模型捕获。现代大模型通常改用可学习的绝对位置编码或旋转位置编码RoPE工程效果更好。特别是RoPE它把位置信息直接编码进Query和Key的旋转角度中让注意力分数自然地衰减远端位置的关联这大大提升了模型处理长文本时的稳定性和外推能力。你可能会疑惑既然自注意力本来就能跨越任意距离关联信息为什么还要额外分段地编码位置我只能说语言本身是强顺序的——我打你和你打我的区别只能靠顺序表达。Transformer既然把顺序信息的选择权交给了注意力机制就必须为注意力提供位置线索否则模型就只能假设所有词元完全无序了。3.6 残差连接、归一化与前馈网络多头注意力输出的结果并不是直接送到下一层而是经过一套固定的加固流程残差连接把输入加到输出上即output layer_input attention_output。这样做的目的是给梯度提供高速公路让深度模型几十层甚至上百层在训练时不容易梯度消失。层归一化对每一层的数据分布做标准化保证激活值的尺度稳定让训练更平滑。前馈网络对每个词元的表示做一次非线性变换相当于对注意力整合后的信息进行深度加工。这三者的组合看似繁琐缺一不可。我在调优一个小模型时曾经试过去掉残差连接结果模型在训练初期就出现了严重的损失震荡根本训不动。这些结构不是理论推导出来的最优解而是在无数实验中被留下、被验证的工程基石——每个组件的设计都有它应对的实际问题。3.7 从编码器-解码器到仅解码器一个值得注意的演进是原始transformer是编码器-解码器结构编码器负责读入源文本解码器负责生成目标文本。这个结构非常适合机器翻译这类转写任务。但现代的大语言模型几乎都采用了仅解码器结构。为什么因为next token prediction任务本身只需要一个不断输出下一个词元的模块——你对模型输入一段文本它自己就是编码器它输出的每个Token同时又在解码。这种简化带来了训练目标和模型架构的高度统一一切只服务于预测下一个词这一个任务。实际效果也证明了这个简洁设计的有效性。我在对比某些仅解码器和编码器-解码器模型在同一任务上的表现时发现虽然编码器-解码器在翻译任务上有天然优势但在开放域生成、对话、代码理解等任务上仅解码器模型的表现更为灵活。因为它的建模目标更纯粹不需要考虑源文本和目标文本的区分任何输入都可以被看成前文预测输出就是后文。从工程角度看仅解码器结构也让部署和推理变得更简单一个统一的生成循环适用于所有任务类型。这也是为什么几乎所有主流开源模型无论出自哪个团队都不约而同地选择了这条路线。4. 训练与推理同一个机制下的两条岔路4.1 训练阶段一次性预测所有位置训练时的next token prediction和推理时有一个关键区别需要特别注意训练阶段是并行预测的推理阶段是逐个生成的。假设训练样本是今天天气很好模型在训练时会在内部看到完整句子包括未来的词然后让每个位置的输出都去预测它的下一个词——位置1预测位置2位置2预测位置3以此类推。这就是Teacher Forcing策略训练时永远用真实的前文来预测后文而不是用模型自己生成的词。之所以要这样做是因为并行可以大幅提升训练效率同时给模型提供了大量训练信号——一句话一次性产生多个预测任务学习效率自然更高。但要注意的是训练时的这种全知视角和推理时只能看到自己已完成的部分存在一种分布差异业界叫exposure bias这也是实际LLM生成质量与训练目标之间存在微妙差距的原因之一。4.2 推理阶段自回归生成一次一个词推理时模型进入自回归生成模式先输入起始文本得到一个预测结果和概率分布采样出下一个词元把它拼接到输入末尾再作为新的输入进行一次前向计算得到再下一个词元如此循环。这个过程看起来很美但有一个工程上的大问题每次生成新词都要对全部前文重新计算一遍关注浪费严重。这也是为什么现代推理框架普遍采用KV Cache——把已经计算过的历史词元的Key和Value向量缓存起来生成新词时只需计算新词元的注意力而不是重新计算整体。这个优化是推理速度提升的关键因素在实践中能让生成速度快几倍到十几倍。我在调试一个本地部署模型的推理性能时KV Cache的开与关对比下来体验差异是决定性的。不夸张地说没有KV Cache的transformer在长对话场景中基本不适合实际部署。4.3 上下文窗口与长时记忆的边界最后一个绕不开的主题是上下文窗口。它定义了模型在进行next token prediction时最多能看到多长的前文。超过这个窗口的内容模型是看不见的。这个限制本质上是自注意力计算的复杂度决定的每个词元需要对前面所有词元计算注意力序列长度翻倍计算量大约是平方倍增长。即便有KV Cache优化存储算力消耗依然会随上下文长度快速上升。更微妙的是能看见不等于会注意——即使上下文窗口内有足够信息模型可能也不会有效地参考所有内容。很多文本摘要失败或信息遗漏的案例根源不在模型忘记而在注意力权重分配的不均匀。我在做长文档问答时发现一个很实用的经验关键信息如果要被模型准确发现最好不要埋在长篇大论的中间位置放在开头或结尾两端的被利用程度会显著更高。5. 关于LLM的几句掏心窝子的话如果你看到这里应该已经对next token prediction和transformer结构有了较为完整的认知。最后我想根据自己的实际体会再分享几个明白了原理之后工作方式会截然不同的顿悟时刻。第一别再给LLM灌输你要理解用户意图这类废话。从原理上说你的指令本身就是模型需要预测的前文的一部分。与其说你要扮演一个资深律师不如直接给出律师会看到的具体案件材料和问题——模型能从中提取的信息量远远大于一个浮夸的角色设定。这是我在大量prompt调试后体会最深的一点不要告诉模型你是谁让它直接从内容中判断该怎么做。第二复读机现象不是Bug是概率分布的必然行为。模型在长文本生成中重复某个片段通常是因为它陷入了概率的局部高值区域——重复循环词元的联合概率反而比跳出去更高。应对方法是调整采样参数如repetition penalty或者主动在prompt中引导模型走向新的方向。第三试图让一个LLM100%准确是违反它底层机制的。因为它的目标是预测最合理的下一个词而不是查询事实。真实工程中需要把知识记忆和推理生成分开需要事实准确性的部分交给检索系统提供上下文需要开放生成的部分才交给LLM发挥。这是我维护生产级应用时最核心的原则。如果你是从零开始接触这个领域我建议你自己动手部署一个几亿参数的小模型玩一玩——不是为了追求效果而是为了亲手感受接龙这个机制在不同参数配置下的行为差异。理论说得再多都不如亲手看到一次概率分布变成文字的过程来得深刻。这东西的门槛比你想的低但认知转变带来的收益比你想的高得多。
返回列表