一文讲透 LLM 真实运行内核,这篇长文值得逐字细读!
原文How LLMs Actually Work作者 0xkatoTL;DR这篇文章把基于Transformer架构的大语言模型完整拆解成九大运行环节从输入内容到输出结果讲解得一清二楚分别是分词、嵌入、位置编码、注意力机制、多头注意力、前馈网络、残差流与归一化、下一词预测循环。文末还深入探讨了一个核心问题模型架构和权重到底有什么区别。作者全程没有堆砌复杂的数学公式同时又没有为了方便新手理解刻意简化关键原理内容准确度拉满。文章还纠正了业内各类教程里流传已久的错误知识点比如很多人对多头注意力“切片模式”的错误解读。除此之外还顺势融入induction heads、ROME、speculative decoding这类当下热门的前沿研究内容零基础读者也能循序渐进看懂。整篇文章的核心观点可以简单概括市面上所有主流大语言模型底层骨架都源自Transformer。不同模型之所以存在性能、能力上的差距本质区别只在于训练数据、模型配置规模以及后期调优方式。只要吃透这套底层骨架绝大多数大模型相关论文、官方模型卡片你都能轻松读懂。一、文章核心内容及阅读价值网上讲解Transformer的资料数不胜数但大多都存在明显短板。一部分纯粹照搬原始论文通篇都是难懂的公式没有专业背景的人根本看不下去还有一部分讲解过于浅显只用简单比喻概括原理读者看完只能懂个大概依旧不清楚模型内部真实的运行逻辑。而这篇文章刚好找到了最适合学习者的平衡点全程零公式讲解针对每一个底层组件都会讲清楚它的存在意义、能解决哪些实际问题以及现如今主流模型对该组件做了哪些优化升级。作者开篇就点明了撰写目标读完这篇内容大家再去翻看任意一篇现代大模型论文、官方model card就能精准对应到文中讲到的各类架构组件不会再一头雾水。另外文章还有一个很贴心的设计里面穿插了大量微型解释板块Tiny explainer遇到token ID、向量、softmax这类专业术语都会即时给出通俗解释。哪怕你完全没有机器学习相关基础也能稳稳跟上整体节奏。本篇解读报告将严格按照原文九大环节的顺序给大家逐层拆解讲解。二、分词Tokenization模型看不懂文字只认整数首先要纠正一个普遍误区大语言模型没办法直接读取人类的文字内容它能识别的只有一串串整数ID。我们输入的提示词prompt从文字转换成整数序列的这个过程就叫做分词。分词工具tokenizer接收字符串之后会输出对应的整数序列每一个整数都对应专属词表里的一个固定条目。目前主流大模型的词表条目数量基本维持在几万到几十万这个区间。需要注意的是token并不等同于完整单词绝大多数情况下它只是单词的拆分片段。举个简单的例子英文单词“tokenization”会被拆成 [“token”, “ization”]“running”则会拆分为 [“run”, “ning”]。这种拆分方式是开发者权衡利弊后得出的最优解。如果直接以完整单词为单位制作词表词表体量会大到无法管控而且遇到从未见过的新词模型就无法处理如果直接拆分为单个字符词表体量虽然变小了但模型需要耗费大量资源从零学习基础的拼写规则。子词分词刚好中和两种模式的优缺点出现频率高的固定片段直接单独设为一个token罕见词汇、新生词汇就拆解成多个小片段拼接而成。不过这种权衡模式偶尔也会出现一些匪夷所思的bug。最经典的案例早期很多大模型都没办法准确回答出单词“strawberry”里有几个字母R。这并不是模型不会数数核心原因就是模型本身根本不在字母层面处理内容它只能识别对应的token ID而这个单词的拆分形式刚好导致模型无法逐字母拆解统计。不同系列的模型搭配的分词工具也不一样。GPT全系模型使用的是改版后的BPE字节对编码LLaMA系列则普遍采用SentencePiece。分词工具会直接影响模型计算量拆分出的token数量越少计算成本越低同时也会影响模型的多语言适配能力。但所有分词工具的底层逻辑都是一致的输入文字输出整数。三、嵌入Embeddings给冰冷的整数赋予实际含义单独的token ID比如数字1024本质只是词表里的一行编号本身没有任何语义。想要让这个整数拥有实际意义就要依靠嵌入矩阵你可以把它理解成一张超级庞大的查询表。词表里的每一个条目都在嵌入矩阵里对应专属的一行数据每一行都是一长串数字组成的向量。这个向量的长度就是业内常说的模型隐藏层维度hidden size。市面上7B参数级别的主流模型隐藏层维度大多为4096参数规模更大的模型对应的向量维度也会更高。分词工具把转换好的整数传给模型后模型会在嵌入矩阵里匹配对应的向量后续所有运算都会用这个向量替代原本的整数ID。这个向量就是token的嵌入表示也是模型通过海量数据训练后学习到的、该词条对应的语义信息。嵌入向量有一个很有意思的特性语义相近的词条对应的向量在空间中的位置也会挨在一起。简单来说“king”的向量和“queen”距离很近“Paris”的向量则和“France”高度贴近。这种空间位置关系并不是开发者手动设置的而是模型在海量文本数据训练过程中自主形成的规律。归根结底这种向量排布方式能帮助模型更精准地完成文本预测任务。甚至我们还能对嵌入向量做简单的四则运算而且大部分时候结果都符合逻辑最经典的公式就是king − man woman ≈ queen。但原文也点明了这个机制的致命短板嵌入向量只能记录词条本身的语义完全无法识别这个词条在整段语句中的位置。举个例子同一个单词“dog”无论出现在prompt的第一位还是第五位它的嵌入向量完全一模一样。而语序直接决定语句含义这就需要下一个组件——位置编码来补齐这个缺陷。四、位置编码从基础正弦编码到主流RoPE原始的自注意力机制本身不具备识别语序的能力。如果没有额外的位置信号加持模型根本分不清“dog bites man”和“man bites dog”的区别可这两句话的含义天差地别。2017年发布的原始Transformer论文里研究团队给出了最初的解决方案给每一个位置分配独一无二的数字组合直接叠加到对应位置词条的嵌入向量上。第一套位置对应一组数据第五套位置对应另一组数据这些数据都是由不同频率的正弦、余弦函数生成的。这样一来处于不同位置的同一个词条最终的向量数据就会产生区别。当初选择正弦函数做位置编码主要是因为它能够适配模型训练阶段从未见过的超长文本序列可随着模型参数规模越来越大这种叠加式的绝对位置编码逐渐暴露出两大弊端。第一嵌入向量的容量是固定的既要存储词条语义信息又要容纳位置信息资源分配十分紧张第二这种可学习的绝对位置编码泛化能力很差。如果模型训练时最长只处理2048个token那它根本没办法妥善处理第5000位这类从未接触过的位置。也正因如此现在绝大多数主流模型都换成了旋转位置编码RoPE2021年由Su等人提出LLaMA、Mistral、Gemma、Qwen这些开源热门模型全部统一采用这套编码方案。RoPE的设计思路很好理解不再额外往词条向量里叠加位置数据而是根据词条所在位置对Query、Key向量做角度旋转处理。位置越靠前旋转角度越小位置越靠后旋转角度越大。后续做注意力匹配计算时两个词条向量的旋转角度差值就代表了它们之间的距离间接完成位置编码。对比传统正弦编码RoPE的优势非常明显天生就能识别词条之间的相对位置刚好契合注意力机制的运行需求对超长上下文的适配能力更强最关键的是全程不需要新增任何额外参数性价比极高。即便有RoPE加持当下所有大模型依旧存在一个普遍问题也就是2023年Liu等人提出的“lost in the middle”现象。简单来说模型处理长提示词时对开头和结尾内容的利用率很高但极易忽略文本中间部分的信息。这也是为什么提示词工程里一直建议大家把核心信息放在文本开头或者在文末重复一遍关键内容这个小技巧并不是玄学本质就是适配模型的信息读取特性。五、注意力机制Q、K、V与因果掩码注意力机制算是Transformer架构的核心支柱整套架构的命名也来源于此。在每一层Transformer网络中注意力机制的工作内容只有一件让每一个词元筛选出自己有权查看的其他词条并判断哪些信息对后续文本预测最为关键。想要实现这个功能每个词条都会经过变换生成三个独立向量分别是Query、Key、Value你可以直白理解为Query负责提出问题代表“我需要什么样的信息”Key负责回应问题代表“我能提供哪些信息”Value则存储核心数据一旦匹配成功就把自身信息传递给对应的词条。同一个词条会同时生成Q、K、V三类向量而且三类向量对应的变换矩阵都是模型在训练过程中自主学习优化的无需人工干预。简单讲模型会自己摸索每个词条该检索什么信息、该对外提供什么信息。词条之间的信息匹配依靠相似度打分实现。某个词条的Query会和它可见范围内所有词条的Key做缩放点积运算分数高低直接代表两个向量的契合程度。额外做缩放处理只是为了稳定数值范围避免后续softmax计算出现异常。打分完成后通过softmax函数把所有分数转化为总和为1的权重最后用这些权重对对应的Value向量做加权平均最终得到该词条融合外部信息后的全新向量。原文举了一个通俗易懂的例子句子“The cat that I saw yesterday was sleeping”。当模型处理到单词“was”时需要明确到底是什么事物在睡觉。“was”的Query会逐一匹配前文所有词条的Key最终和“cat”的匹配分数最高。这是因为模型通过海量数据训练学到系动词需要匹配对应的主语而“cat”生成的Key刚好能完美契合这个需求反观“yesterday”这类时间词汇匹配分数就会很低。经过softmax换算后“cat”会占据最高权重加权求和阶段“cat”对应的Value向量就会主导最终结果。至此模型就能识别出发出睡觉这个动作的主体是猫咪。哪怕主语和系动词相隔多个词条注意力机制也能精准完成指代匹配。我们常用的GPT类自回归大模型有一个专属约束文本从左至右逐一生成。排在第5位的词条只能读取1-5位的内容绝对无法看到6位及之后还未生成的词条这个规则就是因果掩码causal masking。实现方式特别简单直接把未来词条的匹配分数压到极低经过softmax换算后对应权重直接归零。这一章节还提到了可解释性领域一个极具价值的发现——induction heads由Anthropic团队2022年发布。这类特殊的注意力头能够精准识别语句里“A B … A”的固定模式并且自动预判下一个出现的词条为B。直白来说当模型第二次读取到A词条时该注意力头会回溯前文找到上一个A对应的后续词条直接复刻续写。现阶段来看induction heads是模型实现上下文学习in-context learning最清晰、最核心的底层机制也就是大家常说的模型能直接根据当前prompt的规律实时学习并续写内容。但注意力机制也有无法规避的短板完整版注意力模式下每一个词条都要和所有可见词条做匹配计算。提示词长度翻倍整体计算量大概会翻四倍。这也是超长prompt推理成本居高不下的核心原因同时也是FlashAttention、稀疏注意力、线性注意力这类优化方案诞生的初衷。六、多头注意力多视角解析语义以及GQA优化方案单一的注意力计算只能让模型从一个维度判断词条间的关联关系根本不足以解析复杂的人类语言。毕竟一句话里会同时包含多种语义关系主谓搭配、代词指代、跨长句引用、语序结构、短语组合等等。为了解决这个问题多头注意力机制应运而生。简单来讲就是并行运行多组独立的注意力计算每一组并行通道就叫做一个注意力头各组分别从不同视角解析同一段文本。这里重点纠正一个很多教程都会搞错的知识点每个注意力头获取的向量并不是原始词条向量的字面切块。以4096维向量、32个注意力头的模型为例每个注意力头都会配备专属的投影矩阵先把完整的4096维词条向量映射成专属的128维Q、K、V向量之后再开展注意力计算。直白区分多头注意力是给同一个词条拍摄多张不同角度的照片而非把一张照片切成多个碎块。所有注意力头完成计算后系统会拼接所有头的输出结果再通过一层可学习的线性层重新整合为完整维度的向量。还有一个很有趣的现象训练过程中各个注意力头会自主形成专属分工无需人工设定。研究人员实测发现有的注意力头专门负责解析语法匹配动词与宾语、冠词与名词有的专门识别代词指代对象还有的负责梳理语序模式、复刻固定句式也就是前面提到的induction heads。单层Transformer网络一般配备32个注意力头前沿模型通常包含几十层网络叠加下来一个完整大模型会拥有数千个分工明确的注意力头各司其职完成语义解析。不过多头注意力也带来了新的成本问题同时推动了近几年架构层面的重要更新。模型生成新词条时为了避免重复计算会保存所有已生成词条的Q、K、V向量也就是业内常说的KV缓存这也是长上下文推理过程中内存占用过高的主要原因。而且每一个注意力头都需要独立存储一套KV数据头的数量越多内存压力越大。为平衡性能与成本当下绝大多数仅解码器架构的大模型都采用分组查询注意力GQA。核心优化逻辑不再让每一个查询头都配备独立的KV头而是多个查询头共享同一套KV头。举两个直观案例LLaMA-2 70B模型配备64个查询头但仅设置8组KV头Mistral 7B则是32个查询头搭配8组KV头。这套优化方案几乎不会损伤模型输出精度还能大幅降低内存占用与推理成本性价比极高。七、前馈网络参数占比最高模型的“知识库”在单层Transformer网络中词条通过注意力机制完成互相之间的信息交互后还会进入第二个核心组件前馈网络FFN。相比于热度极高的注意力机制FFN的讨论度并不算高但它的重要性丝毫不逊色。如果把注意力机制比作词条之间的互相沟通交流那前馈网络就是每个词条的独立深度学习环节。FFN只会单独处理单个词条的向量数据全程不会涉及任何跨词条的信息融合。前馈网络的运行流程固定分为三步第一步放大词条向量的维度原始Transformer统一放大4倍现代采用SwiGLU的模型放大比例各有不同第二步对放大后的向量做非线性激活处理第三步压缩向量维度还原至初始大小。整个流程里非线性激活是最关键的一步。简单解释非线性函数能够打乱、重塑输入的数据特征最基础的ReLU函数规则就是负数直接归零、正数直接保留。如果去掉非线性激活前后两层线性层叠加在数学层面等价于单层线性层哪怕叠加一百层也毫无意义。直白来说非线性激活是FFN能够实现复杂运算的根本前提。从2017年原始Transformer问世至今FFN放大压缩的整体结构从未改动行业迭代优化的重点一直是中间的非线性激活函数初代Transformer用ReLUGPT、BERT系列升级为GELU目前主流的LLaMA、Mistral、PaLM模型则全部采用SwiGLU。除此之外稠密型Transformer模型的绝大部分参数都集中在FFN层而非注意力层。更关键的是模型学到的各类客观事实、语义知识大多都存储在FFN的权重参数当中。研究人员通过实验证实FFN内部部分神经元和特定知识强绑定有的神经元只会在读取埃菲尔铁塔相关内容时激活有的专门响应编程类文本还有的负责识别动词过去式。模型之所以知道“巴黎是法国首都”本质就是对应的FFN权重存储了这条知识。基于这个特性业内诞生了模型编辑相关技术无需重新训练完整模型直接修改FFN局部权重就能改写模型记忆的知识。典型代表ROME通过对指定FFN权重矩阵做低秩修改就能把“埃菲尔铁塔位于巴黎”改成“埃菲尔铁塔位于罗马”修改完成后模型所有相关回答都会遵循更新后的知识。文章最后还介绍了当下前沿模型的升级方向混合专家模型MoE。不少顶级模型已经开始用多组并行的FFN也就是专家替代原本单一的稠密FFN。模型内部会增设一个小型路由网络由它判断单个词条需要交给哪几个专属专家处理。以Mixtral 8x7B为例每层网络配备8个专家每个词条只会激活其中2个。这款模型总参数高达46.7B但处理单个词条时实际调用参数仅为12.9B。这套模式能在大幅提升模型总参数的同时控制单条文本的推理计算成本也是现阶段突破模型性能上限的主流方案。八、残差流与层归一化深层网络能够训练的底层保障残差流的核心逻辑很简单做加法而非直接替换。注意力机制或者FFN处理完词条向量后不会直接覆盖原本的向量数据而是将计算结果和原始向量相加公式可以简单概括为新向量 旧向量 子模块输出值。哪怕模型堆叠几十上百层网络每一层的优化贡献都会以累加的形式融入向量而非直接覆盖之前的信息。这个全程累加形成的数据流就是残差流。它有一个很特殊的属性模型最原始的输入嵌入向量能通过捷径直达深层网络和每一层子模块的输出数据相互融合。残差连接最早并不是为Transformer设计的2015年诞生之初是用于图像识别的ResNet网络。当时研发团队遇到的难题十分直白层数过深的神经网络根本无法完成训练。反向传播的误差信号经过多层网络传递后数值会变得过大或过小模型没办法根据误差优化自身参数。而残差连接给信号开辟了一条直通捷径让误差能直接从输出层传递到输入层。也正是这项技术让几百层的超深度神经网络得以正常训练后续Transformer架构直接沿用了这套成熟方案。时至今日残差流已经成为大模型可解释性研究的核心对象。模型内部所有组件无论是单个注意力头、FFN层还是最后的解嵌入环节都是从残差流中读取数据优化完成后再写回残差流。如果说残差连接是深层网络的核心骨架那层归一化就是维持骨架稳定的调节器。单纯依靠残差连接不断累加向量数据流里的数值极易出现两极分化要么无限膨胀要么直接归零两种情况都会直接导致训练失败。层归一化的作用就是在各个子模块之间把词条向量的数值稳定在可控区间。在行业发展过程中归一化机制主要有两处优化升级。第一是位置调整2017年原始Transformer采用后置归一化post-norm在子模块计算完成后再做归一化浅层网络适配性尚可但无法适配超深网络从GPT-2开始LLaMA、Mistral等现代模型全部改用前置归一化pre-norm也是现阶段超深Transformer能够轻松训练的关键。第二是函数简化目前绝大多数开源模型LLaMA、Mistral、Gemma、Phi都采用RMSNorm替代原始层归一化。原始归一化需要完成平移、缩放两步操作研发团队通过大量实验验证绝大多数优化收益都来自缩放步骤平移作用微乎其微。RMSNorm直接舍弃平移步骤只保留缩放功能既简化了计算流程又降低了资源消耗。原文对这两个组件的评价十分中肯它们是整套架构里最不起眼、最偏向机械化的基础部件但缺一不可。没有残差连接超深层模型根本无法完成训练没有层归一化残差数据流会彻底失控。二者相辅相成才支撑起了如今动辄几十上百层的大语言模型。九、下一词预测循环生成的完整逻辑当词条向量完成所有Transformer层的注意力计算、FFN深加工、残差累加与归一化处理后会生成最终状态向量。模型进行文本生成时只会提取整条序列最后一个词条的最终向量开展下一步预测。模型会将这个最终向量转化为对应词表里所有词条的评分倘若词表包含10万个词条就会生成10万个独立分数这类无范围限制、可正可负的原始分数就叫做logits。后续依旧依靠softmax函数把杂乱的logits分数转换成总和为1的概率分布直白来说就是算出每一个候选词条成为下一个输出内容的概率。日常使用过程中模型几乎不会直接选择概率最高的词条。大家在后台看到的温度系数temperature、top-k、top-p这类解码参数本质都是用来筛选、调整候选词条temperature负责调节概率分布的集中程度top-k和top-p负责缩小候选词条范围。这也是同一个模型调低温度偏向精准严谨、调高温度偏向创意发散的根本原因。选定待生成词条后系统会把它追加到原始prompt末尾复用已有的KV缓存无需重新计算全部前置内容大幅节省推理时间。之后模型基于更新后的完整序列重复上述所有流程生成下一个词条。这个循环会一直持续直到模型输出终止符或是达到预设的文本长度上限。我们看到的完整段落、文章都是模型这样逐词迭代生成的。原文着重强调了一个容易被大家忽略的核心点基础大模型base LLM全程只围绕“预测下一个词条”这单一目标完成训练。训练阶段不会直接优化事实准确率、对话能力、逻辑推理、代码编写等能力仅仅是在海量无标注文本里学习文本续写规律。我们日常用到的对话、问答、指令跟随等功能都是在base模型基础上通过指令微调、人类反馈对齐等后训练手段二次优化得到的。这一章节还介绍了一项高效的推理优化技术speculative decoding投机解码。运行逻辑通俗易懂先用体量更小、推理速度更快的草稿模型提前预判并生成一串候选词条再由大模型并行校验所有预判内容。符合大模型概率标准的词条直接采用预判错误的位置直接回退由大模型重新生成。在预判准确率较高的情况下整体生成速度能实现翻倍且最终输出效果和原版大模型完全一致。十、架构 vs 训练权重主流大模型的真正差异拆解完九大核心环节后我们就能直白解答开篇的问题GPT、Claude、Gemini、LLaMA这些市面上主流的大模型本质区别到底在哪里闭源商用模型不会公开完整的架构细节但从本文覆盖的底层原理层面来看所有主流模型都隶属于Transformer家族底层运行框架完全一致统一采用分词处理、嵌入编码、位置编码搭配多层Transformer网络每层由多头注意力FFN组成依托残差流与归一化稳定训练最终通过下一词预测完成文本生成。真正拉开模型性能差距的只有三个维度第一训练权重也就是模型通过不同数据集、不同训练规模学到的专属参数第二模型配置包括网络层数、词表大小、注意力头配比、总参数量、采用稠密FFN还是MoE混合专家架构第三后训练优化涵盖指令微调、人类反馈强化学习、安全策略对齐等后期调优操作。原文还给出了一个极具参考价值的行业观察2023–2025年推出的现代Transformer模型已经形成高度统一的技术栈。pre-norm、RMSNorm、RoPE、SwiGLU、GQA成为行业标配超大参数规模的顶级模型会额外叠加MoE架构。这套成熟的技术栈并不是某一家团队一次性研发成型的而是2017年原始Transformer问世后全球各大研发团队历时五年反复试错、迭代打磨最终沉淀下来的最优解。十一、行业未来走向与内容整体评价作者在文章末尾提到Transformer架构在序列模型领域的垄断局面在机器学习发展史上是十分反常的现象。在过去很长一段时间里机器学习行业的常态是分领域定制专属网络图像识别一套架构、语音音频一套架构、自然语言处理另一套架构不同领域的技术体系几乎互不互通。但现如今Transformer架构一统语言、图像、音频、多模态所有赛道成为行业通用底层框架。不过这种垄断局面未必会一直持续。以Mamba为代表的状态空间模型在超长序列处理场景下已经展现出超越Transformer的潜力各类混合架构也处于快速研发、测试阶段而MoE架构的普及也重新定义了前沿模型的架构设计逻辑放在五年前这类碎片化的参数分配模式完全不会被行业认可。但作者依旧认为本文讲解的几大基础核心机制具备长期价值不会随着架构迭代被淘汰。无论未来主流架构如何更新词条处理、嵌入编码、位置信息、信息交互、特征深加工、深层网络稳定、序列预测都是所有序列生成模型必须解决的基础问题。最后从调研视角给大家客观评价一下这篇原文本部分为报告补充内容不属于原文这篇文章最大的亮点就是采用“底层机制技术演进”双线并行的讲解模式。介绍每一个架构组件时都会同步对比原始Transformer的初代方案、现代主流模型的优化方案并且讲清楚每次迭代优化的底层原因。正弦位置编码迭代为RoPE、ReLU迭代为GELU再到SwiGLU、post-norm迭代为pre-norm、LayerNorm迭代为RMSNorm、MHA迭代为GQA、稠密FFN迭代为MoE这六条清晰的迭代路线完整还原了2017-2022五年间Transformer技术栈逐步统一的全过程。同时文中引用的所有数据、研究成果都真实可查Mixtral 8x7B总参数与单词条激活参数、LLaMA-2 70B的注意力头配比、induction heads、lost in the middle对应的发布团队与年份全部和公开资料一致。不管是零基础入门学习者还是想要深耕大模型底层原理的从业者这篇内容都是准确度极高、适配性极强的优质学习资料。