Skip to content
RuaRuan
返回

大语言模型(LLM)的工作原理

这篇文章将带你一步步了解大语言模型(LLM)的工作原理。现代LLM大多由一个个Transformer模块层层堆叠而成,因此理解了Transformer的核心机制,你就已经掌握了大部分内容。

我会介绍现代基于Transformer的LLM内部的核心机制,尽量避开那些复杂的数学内容。别误会——数学你当然应该学,但本文可以作为入门导读。

大多数现代LLM都共享相同的Transformer家族骨架。它们的差异主要来自训练数据、规模与配置选择,以及在此基础上进行的后训练。读完之后,你应该能看懂许多现代LLM论文或模型卡,并且知道每个章节在讨论架构中的哪一块。

以下是我们的路线:

分词(Tokenization)

模型并不直接阅读文本,它们读取的是整数ID。将你的提示词转换为整数序列的这一步,就是分词。

这个转换步骤称为分词。分词器接收一个字符串,输出一个整数序列,其中每个整数都指向固定词汇表中的一个条目。现代LLM的词汇表通常包含数万到数十万个条目。

小注释:令牌ID(token ID)
令牌ID是模型用于表示词汇表中某一个条目的整数。模型处理的是这个数字,而不是写出来的单词本身。

令牌通常不是完整的单词,而是子词片段。例如,“tokenization”可能被拆分为 [tokenization];“running”可能被拆分为 [running]。这样做的原因是效率。完整单词的词汇表太大,而且无法泛化到新词;字符级别的词汇表又太小,迫使模型连最简单的模式都要从头学习。子词分词处于两者之间:最常见的片段成为单个令牌,而罕见或新出现的词则由更小的片段组合而成。

小注释:词汇表(vocabulary)
词汇表是分词器中固定的片段列表。每个片段都有一个ID,模型只能直接接收来自该列表的ID。

这种权衡会在人们意想不到的地方体现出来。经典例子:问LLM“strawberry”里有几个字母R。以前LLM经常会答错。这并非模型计数能力不行,而是因为模型并非直接在字母层面操作,它只处理令牌ID,而这些令牌拼在一起恰好形成一个人类会逐字母拆分的单词。

不同模型家族使用不同的分词器。GPT系列模型采用字节对编码(Byte Pair Encoding)的变体,而LLaMA风格的模型则常用SentencePiece。分词器的选择会影响计算量(令牌越少,计算越少),也会影响多语言覆盖等能力,但基本形态是一致的:输入文本,输出整数。

现在,提示词已经变成了整数序列,下一步就是赋予这些整数以语义含义。

嵌入(Embeddings)

像1024这样的令牌ID只是一个行索引,它本身没有任何含义。赋予它含义的,是一个巨大的表格,称为嵌入矩阵

每个模型都有这样一个矩阵。词汇表中的每个条目对应矩阵中的一行,每一行都是一个很长的数值向量。每行的长度就是模型的隐藏维度(hidden size)。在许多7B参数级别的模型中,这意味着每个令牌有4096个数值。更大的模型通常使用更宽的向量。

小注释:向量(vector)
向量就是一个数值列表。在Transformer中,每个令牌都会变成一个向量,这样模型就可以对它进行数学运算。

当分词器把整数交给模型时,模型会查找对应行,并使用该行向量来代替这个整数。这个向量就是该令牌的嵌入。它是模型对该令牌“含义”的表示,是在训练过程中学习得到的。

小注释:嵌入矩阵(embedding matrix)
嵌入矩阵是一张查找表。输入令牌ID,输出学习好的向量。

这些嵌入的一个有趣特性是:语义相似的令牌最终会得到相似的向量。“king”的向量在空间中接近“queen”的向量,“Paris”的向量接近“France”的向量。这些都不是人为编码的,而是在大量文本上训练后自然涌现出来的——模型学习到这些位置关系,是因为这样能让它更好地预测文本。

你甚至可以对嵌入做算术运算,有时还真的成立。著名的例子是:king − man + woman ≈ queen。嵌入空间的几何结构承载着真实的语义结构,尽管没有人告诉模型要这样构建。

值得明确的是:在这个阶段,每个令牌都已被替换为其嵌入向量,但嵌入本身并不包含该令牌在序列中位置的信息。“dog”这个向量,无论“dog”出现在提示词中的第一个词还是第五个词,都是一样的。这是个问题。

而**位置编码(positional encoding)**填补的正是这个空白。

位置编码(Positional encoding)

普通的自注意力机制本身并不具备表示词序的内置能力。如果没有某种位置信号,模型就无法直接知道“dog”是在“bites”之前还是之后。

词序会改变含义,因此模型需要额外的信息——它需要一种方法,将每个令牌的位置信息注入到数学计算中。

小注释:位置编码
位置编码是模型获取顺序信息的方式,它告诉模型每个令牌在序列中的位置。

原始Transformer论文(Vaswani等,2017年)采用的做法是:为每个位置赋予一组独特的数字模式,并在任何其他处理之前,直接将该模式加到每个令牌的嵌入上。位置1有一种模式,位置5有不同的模式,位置100又有另一种模式。这些模式来自不同频率的正弦和余弦波。这样一来,位置1上的“dog”的嵌入就与位置5上的“dog”的嵌入不同,仅仅因为所加的位置模式不同。

这种方法可行,正弦编码之所以被选用,部分原因在于它们能够外推到训练时所见序列长度之外的情况。但是,加性位置方案仍然存在两个问题,随着模型规模扩大,这些问题变得愈发重要。

第一,嵌入向量不得不在同一组数字中同时承载含义和位置信息,能容纳的信息量是有限的。

第二,尤其是学习得到的绝对位置嵌入,泛化能力不佳。如果你在最长2048个令牌的提示词上训练模型,那么训练期间模型从未见过位置5000,该位置的嵌入也就无法以相同方式被学习到。

现代模型大多采用一种不同的方案,称为旋转位置嵌入(Rotary Position Embeddings,简称RoPE),由Su等人在2021年提出,目前已被LLaMA、Mistral、Gemma、Qwen以及大多数其他开源权重模型家族所采用。其核心思想是:RoPE并不将位置信息加到每个令牌的向量上,而是根据令牌的位置,以相应的角度旋转查询(Query)向量和键(Key)向量。位置1的令牌旋转一个小角度,位置100的令牌旋转一个更大的角度。当随后在注意力机制中比较两个令牌时,真正起作用的正是它们Query和Key旋转角度的差值,这个差值编码了它们之间的距离。

小注释:RoPE
RoPE代表旋转位置嵌入(Rotary Position Embeddings)。它不添加位置向量,而是旋转查询(Query)和键(Key)向量,使得相对距离在注意力计算中得以体现。

实际优势是实实在在的。RoPE自然地编码了相对位置(这更接近注意力机制真正想要的东西),它对更长上下文的泛化能力更强,而且不增加模型的新参数。

即使有了好的位置编码,现代LLM仍然存在一个有据可查的“中间迷失”(lost in the middle)问题(Liu等,2023年)。模型在长提示词的开头和结尾处使用信息的可靠性,远高于埋藏在中间部分的信息。这就是为什么像“把重要上下文放在开头”或“在结尾重复关键信息”这样的提示工程技巧确实有用——模型并不是平等地使用你提示词中的每个部分。

在令牌的含义和位置都编码完成之后,下一个问题是:令牌之间究竟如何交换信息?

注意力(Attention)

正是这个机制赋予了该架构“Transformer”这个名字——注意力。

在每个Transformer层内部,注意力只做一件事:它让每个令牌去查看它被允许看到的其他令牌,并判断哪些令牌对预测下一个词更重要。

它通过让每个令牌同时扮演三个角色来实现这一点。每个令牌都会被转换为三个新的向量,分别称为查询(Query)键(Key)值(Value),即Q、K、V。

小注释:Q、K、V
Query表示“我在寻找什么”,Key表示“我匹配什么”,而Value是当匹配强烈时被传递出去的信息。

同一个令牌同时扮演这三个角色。Q、K、V的转换是通过学习得到的矩阵完成的,因此模型在训练过程中会自行学会每个令牌应该寻找什么,以及应该提供什么。

匹配通过相似度分数来完成。每个令牌的Query会与它被允许看到的每个令牌的Key进行比较,使用的是缩放点积(scaled dot product)。直观上,这衡量了两个向量在多大程度上指向同一方向。缩放操作是为了在softmax之前保持数值稳定。

小注释:点积(dot product)
点积是一种简单衡量两个向量对齐程度的方法。对齐程度越高,匹配越强。

匹配分数随后通过softmax转换为权重。softmax接受任意一组数值,并将它们转换为类似概率的分布,使它们加起来等于1。匹配分数越高的令牌获得越高的权重,然后这些权重被用来对值(Value)向量进行加权平均。

小注释:softmax
softmax将原始分数转换为加和为1的权重。分数大的得到大权重,分数小的得到小权重。

举个例子。考虑句子“The cat that I saw yesterday was sleeping.”(我昨天看到的那只猫正在睡觉)。当模型处理“was”时,它需要弄清楚是什么在睡觉。“was”的Query向量会与它被允许看到的令牌的Key向量进行比较。与“cat”的点积很高,因为模型已经学到,像“was”这样的动词需要主语,而像“cat”这样的主语产生的Key向量与之非常对齐。与“yesterday”的点积则很低。softmax将这些分数转化为权重,“cat”获得高权重,“yesterday”获得低权重。然后模型对相应的Value向量进行加权求和,因此“cat”的Value在结果中占主导地位。于是“was”的新表示很大程度上由“cat”的Value塑造。这就是一个位于前面若干位置的令牌如何成为指代对象的过程。

对于GPT风格的语言模型,还有一个特定的限制:它们是从左到右生成文本的。位置5的令牌只能关注位置1到5,不能关注位置6、7、8,因为这些位置尚未生成。这被称为因果掩码(causal masking)。其实现很简单:未来令牌的匹配分数被设得非常低,以至于经过softmax后它们的权重实际上为零。

小注释:因果掩码
因果掩码用于隐藏未来令牌,防止仅解码器语言模型在预测下一个令牌时提前看到后面的内容。

在可解释性研究中,最有趣的发现之一是关于一类特殊的注意力头,称为归纳头(induction heads),由Anthropic于2022年发现。这些头学会了识别提示词中形如“A B … A”的模式,并预测B会接着出现。当模型第二次看到“A”时,归纳头会回溯到“A”之前出现的位置,查看后面跟着什么,然后将其复制过来。它们是**上下文学习(in-context learning)**背后最清晰的已知机制之一——即LLM从你的提示词中捕捉模式并继续延续下去的能力。

小注释:归纳头(induction head)
归纳头是一种注意力头,它能注意到提示词中重复出现的模式,并帮助延续这些模式。

注意力有一个很大的代价。在完整注意力中,每个令牌都要与它被允许看到的所有令牌进行比较,因此提示词长度翻倍,计算量大约会变为原来的四倍。这就是为什么长提示词运行成本高昂,也是为什么近期大量研究都在致力于让注意力变得更高效(如FlashAttention、稀疏注意力、线性注意力等)。

但单个注意力头只给模型提供了对这些关系的一种学习到的视角。

多头注意力(Multi-head attention)

单次注意力传递只给模型一种方式,来决定哪些令牌对哪些其他令牌重要。这还不够。语言中同时存在着许多种关系:主谓一致、代词与其指代的名词、句子之间的远距离指代、词序和局部短语。

多头注意力通过并行运行多次注意力来解决这个问题,每次并行传递都在自己较小的空间中进行。每次并行传递称为一个头(head)

小注释:注意力头(attention head)
一个注意力头就是一次独立的注意力传递,带有自己学习到的投影矩阵。

这里有一个常常被讲错的地方,包括在许多教程中也是如此:每个头并不是拿原始令牌向量的一个固定切片。每个头都有自己的学习到的投影矩阵,将完整的令牌向量映射到它自己较小的Q、K、V向量上。因此,如果一个模型每个令牌有4096个数值,且有32个头,那么每个头通常工作在128维空间中,但这128个数值是完整4096维的学习投影,而不是固定的切片。它们是同一令牌的不同“视图”,而不是不同块。

每个头独立运行自己的注意力传递。然后所有头的输出被拼接(concatenate)在一起,并通过一个最终的线性层,将它们混合回一个完整尺寸的向量。这个最终的混合也是模型学习得到的。

有趣的地方在于:不同的头最终往往会部分地走向专业化。模型从未被显式告知每个头该做什么,这种专业化是在训练过程中自然涌现的。研究人员已经发现了追踪语法关系的头(将动词与其宾语关联、冠词与其名词关联)、识别代词指代哪个名词的头、追踪位置模式的头、归纳头,等等。单个Transformer层可能有32个头,而现代前沿模型有数十层,因此一个典型的LLM总共拥有数千个注意力头,每个头都贡献自己学习到的独特视角。

这里有一个实际成本问题,并推动了近期的架构变革。每个头都需要将所有已生成令牌的Key和Value向量保存在内存中,这样当生成新令牌时,模型就不必从头重新计算所有内容。这被称为KV缓存,它是LLM在长上下文长度下运行的主要内存成本。

小注释:KV缓存
KV缓存在生成过程中存储旧的Key和Value向量,避免模型每次新增令牌时都要重新计算整个提示词。

现代仅解码器LLM大多采用一种称为**分组查询注意力(Grouped-Query Attention,简称GQA)**的变体。它不再让每个头都拥有自己的Key和Value,而是让多组查询头共享相同的键值头。LLaMA-2 70B有64个查询头,但只有8个键/值头;Mistral 7B有32个查询头和8个键/值头。其结果是在几乎保持完整多头注意力准确率的同时,大幅降低了内存压力和推理成本。

小注释:GQA
分组查询注意力(GQA)允许多个查询头共享较少数量的键/值头,从而在保留多个查询视图的同时削减了KV缓存的内存占用。

前馈网络(Feed-forward network)

在注意力机制完成令牌之间的信息混合之后,每一层还有第二步——一个大家讨论得没那么多的部分,就是前馈网络。

如果说注意力是让令牌之间相互“对话”,那么前馈网络则是让每个令牌独立地进行更多的处理。它对每个令牌的向量单独运行,没有跨令牌的信息混合。

前馈网络按顺序做三件事:

  1. 扩展:将令牌的向量扩展到更大的尺寸(原始Transformer使用4倍扩展,而现代SwiGLU模型常使用不同的扩展倍数)。
  2. 应用非线性函数
  3. 压缩:将向量压缩回原来的尺寸。

前馈网络(Feed-forward network)

中间那个非线性步骤在做一件很具体的事,值得理解。非线性(non-linearity)是一个会“弯曲”其输入的函数。最简单的例子是ReLU:它对任何负数输出零,而对正数则原样输出。

小注释:非线性
非线性是一个函数,它能防止网络坍缩成一个大的线性变换。

没有它,FFN就只是两个线性层堆叠在一起,而纯粹的线性数学堆叠会坍缩——两个线性层在数学上等价于单个线性层,一百个线性层堆叠起来仍然等价于一个。非线性正是阻止这种坍缩的关键,也是FFN能做比单次矩阵乘法更丰富的事情的原因。

原始Transformer使用了ReLU。GPT和BERT转向了GELU。现代模型如LLaMA、Mistral和PaLM则使用SwiGLU。扩展-压缩的结构保持不变,迭代改进的是非线性函数本身。

在密集Transformer模型中,大部分参数都存在于FFN中,而不是注意力部分。大量权重都位于前馈层中。

而且这些参数并不是泛泛的。它们正是模型存储大量事实性和语义性结构的地方。研究人员发现,FFN内部的某些神经元与特定概念或事实有很强的关联。一个神经元可能对埃菲尔铁塔相关的文本强烈激活,另一个对编程语言,再一个对过去式动词。当模型“知道”巴黎是法国首都时,这个事实就通过特定层的FFN权重和激活来表示。

这种存储记忆的特性带来了一个有趣的后果。研究人员已经找到了在已训练模型中直接编辑某些事实而无需重新训练的方法。像ROME(秩一模型编辑)这样的方法,可以通过对特定FFN权重矩阵进行有针对性的低秩编辑,将“埃菲尔铁塔在巴黎”改为“埃菲尔铁塔在罗马”。之后模型生成的文本往往会与编辑后的关联保持一致。

一些现代前沿模型已经开始用**混合专家(Mixture of Experts,简称MoE)**取代密集FFN。每一层不再只有一个前馈网络,而是有多个并行的FFN(称为“专家”),外加一个极小的路由网络,用来为每个令牌选择使用哪些专家。Mixtral 8x7B每层有8个专家,但对任意给定令牌只激活其中2个。总参数量大幅增加,但每个令牌的计算量增长要慢得多,因为只有少数专家真正运行。这就是如何在扩大参数量而不让推理成本同比增加的方法。

小注释:MoE
混合专家(MoE)意味着模型有多个前馈网络,并将每个令牌仅路由到其中少数几个。

Mixtral 8x7B的总参数量为467亿,但每个令牌实际使用的参数量约为129亿。这已成为超大模型的常见选项,因为它让你可以持续增加参数量,而推理成本不会同比例增长。

残差流(Residual stream)与层归一化(Layer normalization)

残差流是让模型变成“加法式”而非“替换式”的关键。在注意力运行之后,或者前馈网络运行之后,其结果通常不会替换令牌的向量,而是会加到它上面——逐位置相加。新的向量等于旧向量加上该子模块的输出。

小注释:残差连接(residual connection)
残差连接将一个模块的输出加回到它开始时的输入向量上,为信息和梯度在网络中提供了一条捷径。

跨越三十层、五十层或一百层,每一层的贡献是累积叠加的,而不是简单地覆盖之前的向量。这个不断累加的和被称为残差流。它有一个奇特的特性:原始的输入嵌入仍然有一条直接相加的路径通往后层,沿途与每个子模块的贡献混合在一起。

残差连接并非Transformer的原创,它们来自ResNet(He等人,2015年),最初用于图像识别。 其动机是深度网络难以训练——当训练信号(梯度)反向传播经过许多层后,会变得过弱(有时又过强),导致模型无法真正从自己的错误中学习。添加一条捷径路径,让信号可以直接从输出流回输入,突然间你可以训练数百层的网络了。Transformer继承了同样的技巧。

在现代可解释性研究中,残差流已成为核心对象。每个组件——每个注意力头、每个前馈网络,甚至最后的解嵌入步骤——都从残差流中读取,并向其中写入。

第二部分,层归一化(layer normalization),存在的原因则更为实际。没有它,残差流将无法保持稳定。流经数十次加法的数值往往会爆炸式增大或坍缩至零。无论哪种情况,训练都会失败。层归一化在每个子模块之间将每个令牌的向量重新缩放到一个受控范围内。

小注释:层归一化
层归一化在模型训练期间对令牌向量进行重新缩放,使其数值保持在一个稳定的范围内。

2017年的原始Transformer在每个子模块之后应用归一化(后归一化,post-norm)。这对浅层模型有效,但随着深度增加,训练可靠性变差。现代Transformer(从GPT-2开始,以及LLaMA、Mistral)通常在每个子模块之前应用归一化(前归一化,pre-norm)。这正是让极深Transformer更易训练的改动之一。

函数本身也发生了变化。许多现代开源模型(LLaMA、Mistral、Gemma、Phi)使用了一种更简单的变体,称为RMSNorm。原始的层归一化同时做两件事:先将每个向量平移至均值为零,然后重新缩放数值的大小。RMSNorm去掉了平移步骤,只保留重新缩放。经验表明,重新缩放承载了大部分益处,同时计算成本更低。

小注释:RMSNorm
RMSNorm是一种更便宜的归一化方法,它直接重新缩放向量大小,而无需先减去均值。

以上就是这些不起眼的机制。没有残差连接,极深模型训练会变得异常困难;没有层归一化,累加和会爆炸或坍缩;而有了两者,你就能得到数百层深的模型。

下一个令牌预测(Next-token prediction)

在所有注意力层和前馈层处理完成后,模型为序列中的每个令牌都生成了一个向量。在生成过程中,为了预测下一个词,它只取最后一个令牌的最终向量

这个最终向量会被转换为对应每个可能的下一个令牌的数值。如果词汇表有10万个令牌,那就是10万个数值。这些数值称为logits(对数几率)。它们还不是概率,可以是任意大小,正数或负数均可。

小注释:logits
Logits是每个可能的下一个令牌的原始分数。它们只有在经过softmax之后才会变成概率。

softmax将这些logits转换为模型对可能的下一个令牌的概率分布。和之前相同的操作,只是出现在模型中不同的位置。

模型通常不会每次都只选概率最高的令牌。**解码设置(decoding settings)**控制着输出的确定性或多样性。温度(temperature)改变概率分布的锐利程度;top-ktop-p则将选择范围限制在最合理的几个下一个令牌中。这就是为什么同一个模型在一种设置下感觉精确,在另一种设置下又感觉更有创造性的原因。

小注释:温度(temperature)
温度在采样过程中控制随机性。低温使模型更保守,高温则使其更多样化。

一旦选中了一个令牌,它就会被添加到输入中。模型在更长的序列上运行下一步,通常会复用KV缓存,这样就不必从头重新计算整个前缀。新的令牌产生新的注意力计算,新的前馈,新的最终向量,新的预测。这个循环一直持续,直到模型输出序列结束令牌或达到长度限制。一整段文本就是这样一个令牌接一个令牌循环生成的。

这个单一目标——预测下一个令牌——是基础LLM的核心训练信号。基础模型并非直接针对事实准确性、对话能力、推理或编码进行训练,而是训练它在海量文本中预测下一个令牌。后续的**后训练(post-training)**则可以针对指令遵循、偏好、安全性和对话行为对模型进行微调。

还有一项值得了解的重大效率创新,叫做推测解码(speculative decoding)。一个小型快速模型先向前推测出几个令牌,大模型则并行验证它们。如果推测的令牌在大模型的概率下被接受,就采用;如果不接受,就回退到大模型。操作得当的话,输出分布与单独运行大模型完全相同,但生成循环可以快得多。

小注释:推测解码(speculative decoding)
推测解码使用一个小的草稿模型先行猜测,然后让较大的模型一次性验证多个猜测的令牌。

下一个令牌预测循环是架构中最简单的部分,但正是它让整个系统运转起来。

架构 vs. 训练权重(Architecture vs trained weights)

我们已经走过了核心机制:分词、嵌入、位置编码、注意力、多头注意力、前馈网络、残差流与归一化,以及输出端的下一个令牌循环。这就是基本架构的一次完整流程。

那么,GPT、Claude、Gemini和LLaMA之间到底有什么不同?公开的细节各不相同,专有模型不会公布每一项架构选择。但按照本文所覆盖的层面来看,它们大致都处于相同的Transformer家族设计空间内。

大多数现代基于Transformer的LLM都采用相同的大体结构:分词、嵌入、位置编码、堆叠的Transformer层(每层含多头注意力和前馈网络)、残差流、层归一化,以及下一个令牌预测。

模型之间的差异在于:

小注释:权重(weights)
权重是模型内部学习到的数值。训练会改变这些数值,直到模型能很好地预测文本。

2023–2025年的“现代Transformer”栈,在许多严肃的前沿模型和开源权重模型中趋同于一组共同的选择,尽管不同团队是独立得出这些结论的:前归一化(pre-norm)放置、RMSNorm、RoPE、SwiGLU、分组查询注意力(GQA),以及在部分最大模型中采用的混合专家(MoE)。这些并非一次性发明,而是在原始2017年设计基础上经过约五年的改进逐步积累而成。

未来走向

在机器学习历史上,围绕Transformer家族架构的趋同是不同寻常的。在该领域的大部分时间里,每个问题都有自己专门的网络:图像识别用一种,语言用另一种,音频又用第三种。视觉和语言团队几乎不共享方法。

而现在,Transformer风格的模型出现在语言、视觉、音频和多模态系统中。Transformer吸收了该领域的很大一部分。

这种情况未来可能会改变。Mamba和其他状态空间模型是可信的替代方案,尤其在处理极长序列时。混合架构也正在被探索。混合专家(MoE)已经在前沿领域改变了“架构”的含义——这种变化在五年前还会被视为异类。

但本文介绍的核心机制——分词、嵌入、位置编码、注意力、前馈网络、残差流与归一化,以及下一个令牌预测——是持久不变的部分。即使架构发生改变,这些也是任何序列模型都必须以某种形式解决的问题。

如果你已经读到这里,那么你就能阅读许多现代Transformer论文或模型卡,并知道每个章节在讨论哪个部分。这就是本文的目标。

https://www.0xkato.xyz/how-llms-actually-work/



上一篇
六步让 AI 看懂你的网站
下一篇
黑板架构(Blackboard Architecture)模式