跳到主要内容

LLM 到底是怎么工作的

从零开始理解现代 LLM 的工作方式:从 token 到 Transformer 模块,再到下一个 token 的生成循环。

  • LoopRouter
  • 20 分钟阅读
LLM 到底是怎么工作的

AI 摘要
现代 LLM 大多是基于 Transformer 的系统,它们通过一层层重复堆叠的模块来处理文本。模型看到的不是单词,而是 token。整个流程从分词开始:文本被转换成固定词表里的整数 ID;这些 ID 再映射成学习得到的 embedding,用数字向量承载语义。因为注意力机制本身不知道顺序,所以还需要位置编码补充 token 的先后关系。在每个 Transformer 层内部,自注意力会让 token 之间交换信息:模型为 token 生成 Query、Key、Value 向量,计算匹配分数,再用 softmax 权重混合 Value;在只能从左到右生成文本的模型里,因果掩码会阻止模型看到未来 token。多头注意力会并行运行多组注意力,让模型同时跟踪不同关系;分组查询注意力则降低内存成本。随后,前馈网络会独立处理每个 token,模型的大量语义和事实知识都存放在这些参数中。残差连接和归一化让很深的网络仍然可训练且稳定。最后,模型把最后一个 token 的隐藏状态转换成整个词表上的 logits,并在循环中一个 token 一个 token 地采样生成。文章还区分了共享的 Transformer 架构和训练得到的权重、后训练步骤,说明现代模型的差异主要来自训练、规模和配置,而不是完全不同的核心机械结构。

一句话结论:LLM 本质上是把 token 变成向量、注入位置信息,再靠注意力和前馈网络一层层加工,最后一个 token 一个 token 地循环采样生成文本——现代模型之间的差异主要在训练数据、规模和后训练,而不是这套核心机械结构本身。

这篇文章会带你走一遍 LLM 的工作方式。现代 LLM 大多是把 Transformer 模块一层层堆起来,所以只要理解 Transformer 这套机械结构,就已经走完了很大一段路。

我会介绍现代基于 Transformer 的 LLM 内部最核心的机制,但不会塞进一堆黏糊糊的数学。别误会,数学当然值得学,不过这篇可以先作为入门。

大多数现代 LLM 共享同一类 Transformer 骨架。它们之间的差异来自训练数据、规模和配置选择,以及叠加在基础模型之上的后训练。读完之后,你应该能看懂许多现代 LLM 论文或模型卡,知道每一节讲的是架构里的哪一块。

路线是这样的:

  1. Token:一串文本如何变成一串整数
  2. Embedding:这些整数如何获得意义
  3. 位置编码:模型如何知道 token 的顺序
  4. 注意力:token 如何互相共享信息
  5. 多头注意力:模型如何同时追踪多种关系
  6. 前馈网络:模型大量存储结构所在的地方
  7. 残差流和层归一化:是什么让很深的堆叠可训练
  8. 预测下一个 token:模型实际输出什么,生成循环如何工作
  9. 架构与训练权重:现代 LLM 里哪些东西大体共享,哪些东西不同

从分词到下一个 token 预测的 Transformer 流程

文中会穿插一些小解释,方便不同背景的人都能跟上。


分词

模型不会直接阅读文本。它读取的是整数 ID。把你的提示词转换成这串整数的步骤,叫做分词。

分词器会接收一个字符串,并输出一串整数;每个整数都指向固定词表中的一个条目。现代 LLM 的词表通常包含几万到几十万个条目。

小解释:token ID
token ID 是模型用来表示词表中某个条目的整数。模型处理的是这个数字,而不是人类看到的文字本身。

token 通常不是完整单词,而是子词片段。比如英文里的 “tokenization” 可能会被拆成 [“token”, “ization”],“running” 可能会被拆成 [“run”, “ning”]。原因是效率。完整单词词表太大,而且对新词泛化很差;字符级词表又太小,会迫使模型从零学会很多最基础的模式。子词分词位于两者中间。常见片段会成为单个 token,罕见词或新词则由更小的片段组合出来。

小解释:词表
词表是分词器固定的一组片段列表。每个片段都有一个 ID,模型只能直接接收这个列表里的 ID。

这个取舍会出现在一些人们意想不到的地方。经典例子是:问 LLM “strawberry” 里面有几个 r。LLM 过去常常答错。这不一定是模型不会计数,而是因为模型并不是直接在字母上操作;它只看到 token ID,而这些 ID 刚好拼出了一个人类会按字母拆开的单词。

分词把文本转换成 token ID

不同模型家族使用不同的分词器。GPT 模型使用 Byte Pair Encoding 的变体。SentencePiece 在 LLaMA 风格的模型中很常见。选择分词器会影响计算量,因为 token 越少,工作越少;它也会影响多语言覆盖等问题。不过基本形状是一样的:文本进去,整数出来。

现在提示词已经变成一串整数,下一步是给这些整数赋予意义。


Embedding

1024 这样的 token ID 只是一个行号。它本身没有意义。真正让它有意义的是一张巨大的表,叫做 embedding 矩阵。

每个模型都有一张这样的表。它对词表里的每个条目都有一行,每一行都是一串很长的数字向量。每一行的长度就是模型的隐藏维度。在许多 7B 级别的模型中,这意味着每个 token 有 4,096 个数字。更大的模型通常会使用更宽的向量。

小解释:向量
向量是一串数字。在 Transformer 里,每个 token 都会变成一个向量,这样模型才能对它做数学运算。

当分词器把一个整数交给模型时,模型会在 embedding 矩阵中查找对应的那一行,并改用这一行向量。这个向量就是该 token 的 embedding。它是模型学到的、关于这个 token “意味着什么”的表示。

小解释:embedding 矩阵
embedding 矩阵是一张查找表。输入 token ID,输出学习得到的向量。

这些 embedding 有一个很有意思的性质:语义相近的 token 会拥有相近的向量。“king”的向量会接近“queen”,“Paris”的向量会接近“France”。这些都不是硬编码的。它们是在大量文本训练中浮现出来的,因为这样的空间位置能帮助模型更好地预测文本。

你甚至可以对 embedding 做算术,而且有时候会奏效。著名例子是 king - man + woman ≈ queen。embedding 空间的几何结构承载了真实的语义结构,即使没人明确告诉模型应该这样组织。

带有语义关系的 embedding 空间类比

需要说清楚的是:到这一步,每个 token 都已经被替换成了自己的 embedding,但单靠 embedding 还不能说明这个 token 在序列里的位置。无论 “dog” 出现在提示词的第一个位置还是第五个位置,它的向量都是同一个。这是个问题。

位置编码要填补的就是这个空缺。


位置编码

普通自注意力本身并没有内置的词序表示。如果没有某种位置信号,它就没有直接方法知道 “dog” 是出现在 “bites” 前面,还是出现在后面。

词序会改变含义。所以模型还需要另一块机制:它必须把每个 token 的位置注入到计算中。

小解释:位置编码
位置编码是模型获得顺序信息的方式。它告诉模型每个 token 位于序列中的哪个位置。

最初的 Transformer 论文(Vaswani 等,2017)给每个位置分配了一组数字模式,并在任何其他处理之前,把这组模式直接加到每个 token 的 embedding 上。位置 1 有一种模式,位置 5 有另一种模式,位置 100 又有另一种模式。这些模式来自不同频率的正弦和余弦波。于是,位置 1 的 “dog” embedding 就会不同于位置 5 的 “dog”,只是因为加进去的位置模式不同。

这种方法能工作。选择正弦位置编码的部分原因,是它能外推到训练时没有见过的更长序列。不过随着模型规模变大,加性位置方案也暴露出两个重要问题。

第一,embedding 必须在同一组数字里同时承载意义和位置。能塞进去的信息总是有限的。

第二,学习得到的绝对位置 embedding 泛化并不干净。如果模型训练时只看过最长 2,048 个 token 的提示词,那它在训练中从没见过位置 5,000,而这个位置的 embedding 也就不是用同样方式学出来的。

现代模型大多使用另一种方案,叫 Rotary Position Embeddings,也就是 RoPE。它由 Su 等人在 2021 年提出,如今用于 LLaMA、Mistral、Gemma、Qwen 以及多数开源权重模型家族。直觉是:不要把位置信息加到每个 token 的向量上,而是按照 token 的位置旋转 Query 和 Key 向量。位置 1 的 token 转一个小角度,位置 100 的 token 转一个更大的角度。之后两个 token 在注意力中被比较时,真正起作用的是它们 Query 和 Key 旋转之间的差值,这个差值编码了它们相隔多远。

小解释:RoPE
RoPE 是 Rotary Position Embeddings 的缩写。它不是添加一个位置向量,而是旋转 Query 和 Key 向量,让相对距离在注意力计算中显现出来。

旋转位置编码按位置旋转向量

实际优势很明显。RoPE 天然编码相对位置,而这更接近注意力真正需要的东西;它对更长上下文的泛化更好;而且不会给模型增加新的参数。

即便有了不错的位置编码,现代 LLM 仍然存在有文献记录的 “lost in the middle” 问题(Liu 等,2023)。它们使用长提示开头和结尾信息的可靠性,高于使用埋在中间的信息。这也是为什么“把重要上下文放在前面”或者“在末尾重复关键信息”这类提示工程建议确实有用。模型并不是同等程度地使用你提示词里的每一部分。

现在,token 的意义和位置都已经编码好了。下一个问题是:token 之间到底如何交换信息?


注意力

这就是让这个架构得名的机制:注意力。

在每个 Transformer 层内部,注意力只做一件事:让每个 token 查看它被允许看到的其他 token,并决定哪些 token 对接下来要做的事情更重要。

它通过让每个 token 同时扮演三种角色来做到这一点。每个 token 都会被转换成三个新向量,分别叫 Query、Key 和 Value,也就是 Q、K、V。

小解释:Q、K、V
Query 表示“我在寻找什么”,Key 表示“我能和什么匹配”,Value 则是在匹配强时被复制过去的信息。

  • Query 会问:“我想从其他 token 那里找什么?”
  • Key 会说:“对于正在看我的 token,我提供这样的匹配特征。”
  • Value 会携带:“当匹配发生时,真正传过去的是这些信息。”

同一个 token 会同时扮演这三种角色。Q、K、V 的转换都是学习得到的矩阵,所以模型会在训练中自己学会每个 token 应该寻找什么、提供什么。

匹配通过相似度分数发生。每个 token 的 Query 会和它被允许看到的每个 token 的 Key 比较,使用的是缩放点积。直觉上,这衡量的是两个向量有多对齐。缩放步骤可以在进入 softmax 前让数值保持稳定。

小解释:点积
点积是一种给两个向量对齐程度打分的简单方法。越对齐,匹配越强。

匹配分数随后会通过 softmax 转换成权重。softmax 会把任意一组数字变成类似概率的分布,并且总和为 1。匹配分数高的 token 会获得更高权重,然后这些权重会用来对 Value 向量做加权平均。

小解释:softmax
softmax 会把原始分数转换成总和为 1 的权重。大分数得到大权重,小分数得到小权重。

举个例子。考虑句子 “The cat that I saw yesterday was sleeping.” 当模型处理 “was” 时,它需要弄清楚是谁在睡觉。“was” 的 Query 向量会和它能看到的 token 的 Key 向量比较。它和 “cat” 的点积很高,因为模型已经学会了:像 “was” 这样的动词需要一个主语,而像 “cat” 这样的主语会产生能很好对齐的 Key 向量。它和 “yesterday” 的点积就低。softmax 会把这些分数变成权重,“cat” 得到高权重,“yesterday” 得到低权重。模型随后会对对应的 Value 向量求加权和,所以 “cat” 的 Value 会主导结果。“was” 的新表示现在主要受到 “cat” 的 Value 影响。这就是前面相隔好几个位置的 token 如何成为参照对象。

GPT 风格语言模型还有一个特定约束:它们从左到右生成文本。位置 5 的 token 只能注意位置 1 到 5,不能注意位置 6、7、8,因为那些 token 还没有生成出来。这叫做因果掩码。实现方式很简单:未来 token 的匹配分数会被设得极低,以至于 softmax 后权重几乎为零。

小解释:因果掩码
因果掩码会隐藏未来 token。它阻止只解码的语言模型在预测下一个 token 时偷看未来。

展示因果掩码并高度关注 cat 的注意力热力图

可解释性研究中一个很有意思的发现,是一种专门化的注意力头,叫 induction head。Anthropic 在 2022 年发现了它们。这些头会学习识别提示词中 “A B … A” 这种模式,并预测 B 接下来会出现。当模型第二次看到 “A” 时,induction head 会回头找到之前出现 “A” 的地方,看看它后面接了什么,然后把它复制过来。它们是目前已知最清晰的上下文学习机制之一,也就是 LLM 从你的提示词里抓住模式并继续延展的能力。

小解释:induction head
induction head 是一种注意力头,它会注意提示词中的重复模式,并帮助模型继续这些模式。

注意力有一个很大的成本。在完整注意力里,每个 token 都要和它能看到的所有 token 比较,所以提示长度翻倍,工作量大致会变成四倍。这就是长提示运行昂贵的原因(也直接关系到 API 按 token 计费的方式),也是最近大量研究都在试图让注意力更高效的原因,比如 FlashAttention、稀疏注意力、线性注意力。

但一个注意力头只能给模型一种看待关系的学习视角。


多头注意力

一次注意力传递只会给模型一种判断 token 之间关系的方式。这还不够。语言中有许多关系同时发生:主谓一致、代词和它指代的名称、句子之间的长距离引用、词序和局部短语。

多头注意力通过并行运行多次注意力来解决这个问题,每次并行传递都在自己的较小空间里操作。每一次并行传递都叫一个头。

小解释:注意力头
注意力头是一组独立的注意力传递,拥有自己学习得到的投影。

这一点经常被讲错,很多教程也会误导人。每个头并不是拿到了原始 token 向量的某个物理切片。每个头都有自己学习得到的投影矩阵,把完整 token 向量映射成自己较小的 Q、K、V 向量。所以,如果一个模型每个 token 有 4,096 个数字、32 个头,那么每个头通常在 128 维空间里工作;但这 128 个数字是从完整 4,096 维向量学习投影出来的,不是固定切出来的一块。它们是同一个 token 的不同“视角”,不是不同碎片。

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

多头注意力组合多个专门化的注意力头

有趣的是,不同头往往会形成某种局部专门化。模型从来没有被明确告知每个头应该做什么;专门化是在训练中自然涌现的。研究人员发现过追踪语法的头,比如把动词连接到宾语、把冠词连接到名词;也发现过判断代词指代哪个名字的头、追踪位置模式的头、induction head 等等。单个 Transformer 层可能有 32 个头。现代前沿模型有几十层。所以典型 LLM 总共有成千上万个注意力头,每个头都加入自己的学习视角。

近年的一个架构变化来自很现实的成本压力。每个头都需要为已经生成的所有 token 保留自己的 Key 和 Value 向量,这样当新 token 生成时,模型不必从头重新计算全部内容。这叫 KV cache,它是长上下文运行 LLM 时主要的内存成本。

小解释:KV cache
KV cache 会在生成期间存储旧的 Key 和 Value 向量。它避免模型每添加一个 token 都重新计算整个前缀。

现代只解码 LLM 大多使用一种变体,叫 Grouped-Query Attention,也就是 GQA。它不再让每个头都有自己的 Key 和 Value,而是让多组 Query 头共享更少的 Key/Value 头。LLaMA-2 70B 有 64 个 Query 头,但只有 8 个 Key/Value 头。Mistral 7B 有 32 个 Query 头和 8 个 Key/Value 头。结果是准确率几乎接近完整多头注意力,但内存压力和推理成本低得多。

小解释:GQA
Grouped-Query Attention 让多个 Query 头共享更少的 Key/Value 头。这样既保留了很多 Query 视角,又降低了 KV cache 内存。


前馈网络

注意力完成 token 之间的信息混合后,每一层还有第二个步骤,只是大家没那么常谈它:前馈网络。

注意力关心的是 token 之间互相交流;前馈网络关心的是每个 token 自己做进一步处理。它独立运行在每个 token 的向量上,不做跨 token 混合。

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

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

前馈网络扩展、转换并压缩每个 token 向量

中间那个非线性步骤很值得理解。非线性是一个会弯曲输入的函数。最简单的 ReLU 会把任何负数输出为零,并让正数原样通过。

小解释:非线性
非线性会阻止网络退化成一个巨大的线性变换。

如果没有它,FFN 就只是两个线性层叠在一起,而纯线性数学的堆叠会坍缩。连续两个线性层在数学上等价于一个线性层,连续一百个线性层也仍然等价于一个。非线性正是阻止这种坍缩的东西,也是 FFN 能做得比单次矩阵乘法更丰富的原因。

原始 Transformer 使用 ReLU。GPT 和 BERT 转向 GELU。LLaMA、Mistral、PaLM 等现代模型使用 SwiGLU。扩展再压缩的结构保留下来了,不断迭代的是非线性本身。

在一个密集 Transformer 模型中,大多数参数位于 FFN,而不是注意力。很大一部分权重坐落在前馈层里。

这些参数也不是泛泛而谈的“通用参数”。它们是模型大量事实和语义结构存放的地方。研究人员发现,FFN 内部的一些神经元会和特定概念或事实强相关。某个神经元可能会在埃菲尔铁塔相关文本上强烈激活,另一个可能和编程语言相关,另一个可能和过去式动词相关。当模型“知道”巴黎是法国首都时,这个事实会分布表示在特定层的 FFN 权重和激活中。

这种存储记忆的性质带来了一个有趣后果。研究人员已经找到了无需重新训练就能直接编辑训练后模型中某些事实的方法。比如 ROME(Rank-One Model Editing)可以对某个 FFN 权重矩阵做有针对性的低秩编辑,把“埃菲尔铁塔在巴黎”改成“埃菲尔铁塔在罗马”。之后模型往往会生成和这个被编辑关联一致的文本。

一些现代前沿模型开始用一种叫 Mixture of Experts,也就是 MoE 的东西替换密集 FFN。它不是每层只有一个前馈网络,而是有许多并行的 FFN,也叫专家;再用一个很小的路由网络决定每个 token 由哪些专家处理。Mixtral 8x7B 每层有 8 个专家,但每个 token 只激活其中 2 个。总参数量大幅上升,但每个 token 的计算量增长慢得多,因为只有少数专家运行。这就是在不让推理成本按比例增长的情况下扩展参数量的方法。

小解释:MoE
Mixture of Experts 表示模型有多个前馈网络,并且每个 token 只会被路由到其中少数几个。

Mixtral 8x7B 总共有 467 亿参数,但每个 token 只使用约 129 亿参数。这已经成为超大模型的常见选项,因为它允许继续增加参数量,而不让推理成本同步线性增加。


残差流和层归一化

残差流让模型变成“累加式”的,而不是“替换式”的。注意力运行后,或者前馈网络运行后,结果通常不会替换掉 token 原来的向量,而是加到原向量上。逐位置相加。新向量等于旧向量加上子模块的输出。

小解释:残差连接
残差连接会把一个模块的输出加回它开始时的向量。它给信息和梯度提供了一条穿过网络的捷径。

跨过三十层、五十层、一百层后,每一层的贡献都会累积起来,而不是简单覆盖之前的向量。这个运行中的总和就叫残差流,而且它有个奇特性质:最初的输入 embedding 仍然有一条直接的加性路径通向后面的层,只是在路上和每个子模块的贡献混在一起。

残差流累积注意力和前馈网络输出

残差连接并不是为 Transformer 发明的。它来自 ResNet(He 等,2015),最初用于图像识别。动机是深层网络过去很难训练。训练信号在穿过很多层回传时会变得太弱,有时也会太强,模型无法真正从自己的错误中学习。加上一条捷径后,信号就能从输出直接流回输入。于是,人们突然可以训练拥有数百层的网络。Transformer 继承了同一招。

在现代可解释性研究中,残差流已经成了中心对象。每个组件、每个注意力头、每个前馈网络,甚至最后的 unembedding 步骤,都会从残差流读取,并写回残差流。

第二块机制,层归一化,存在的原因更实际:没有它,残差流无法保持稳定。数字经过几十次相加后,往往会爆炸式变大,或者塌缩到接近零。无论哪种情况,训练都会失败。层归一化会在子模块之间把每个 token 的向量重新缩放到受控范围。

小解释:层归一化
层归一化会重新缩放 token 向量,让其中的数字在训练过程中保持稳定范围。

2017 年原始 Transformer 在每个子模块之后应用归一化,也就是 post-norm。这对浅层模型有效,但随着深度增加,训练稳定性会变差。现代 Transformer(GPT-2 之后、LLaMA、Mistral)通常在每个子模块之前应用归一化,也就是 pre-norm。这是让很深的 Transformer 更容易训练的重要变化之一。

归一化函数本身也变了。许多现代开放模型(LLaMA、Mistral、Gemma、Phi)使用一种更简单的变体,叫 RMSNorm。原始层归一化一次做两件事:先把每个向量平移到接近零,再重新缩放数字大小。RMSNorm 去掉平移步骤,只保留重新缩放。经验上,重新缩放承载了大部分收益,而且计算更便宜。

小解释:RMSNorm
RMSNorm 是一种更便宜的归一化方法,它重新缩放向量大小,但不先减去均值。

这就是那套不那么光鲜、但极其关键的机械结构。没有残差连接,很深的模型会难得多。没有层归一化,运行中的总和会爆炸或塌缩。有了两者,你才能得到几百层深的模型。


下一个 token 预测

当所有注意力和前馈处理层都跑完后,模型会为序列中的每个 token 得到一个向量。在生成期间,为了预测下一个词,它只取最后一个 token 的最终向量。

这个最后的向量会被转换成每个可能下一个 token 的一个数字。如果词表有 100,000 个 token,那就是 100,000 个数字。这些数字叫 logits。它们还不是概率,可以是任意大小,可以为正也可以为负。

小解释:logits
logits 是每个可能下一个 token 的原始分数。只有经过 softmax 后,它们才会变成概率。

softmax 会把这些 logits 转换成模型对所有可能下一个 token 的概率分布。操作和前面一样,只是发生在模型的另一个位置。

模型通常不会每次都直接选择概率最高的 token。解码设置会控制输出有多确定或多变化。Temperature 会改变分布的尖锐程度。Top-k 和 top-p 会把选择限制在最可能的一批下一个 token 中。这就是为什么同一个模型在一种设置下显得精确,在另一种设置下显得更有创造性。

小解释:temperature
temperature 控制采样时的随机性。低 temperature 让模型更保守,高 temperature 让模型更多变。

一旦选出一个 token,它就会被添加到输入里。模型会在更长的序列上运行下一步,通常会复用 KV cache,所以不必从头重新计算整个前缀。新 token 的新注意力。新的前馈处理。新的最终向量。新的预测。循环会一直继续,直到模型输出结束序列 token,或者达到长度限制。一整段文字就是这个循环,一个 token 接一个 token。

预测下一个 token 这个单一目标,是基础 LLM 的核心训练信号。基础模型并不是直接为了事实准确性、对话能力、推理或编码而训练的。它是在海量文本上训练预测下一个 token。后续的后训练才会进一步把模型调成更会遵循指令、更符合偏好、更安全、更像对话助手的形式。

还有一个重要的效率创新值得知道,叫 speculative decoding,也就是推测解码。一个小而快的模型先往前提出多个 token。大模型再并行验证它们。如果这些候选 token 在大模型的概率下被接受,就直接接受;如果不被接受,就回退给大模型。做对的话,输出分布和只运行大模型一致,但生成循环可以快很多。

小解释:推测解码
推测解码用一个小的草稿模型提前猜测,然后让更大的模型一次验证多个猜测 token。

下一个 token 预测循环是整个架构里最简单的部分,但它正是让整件事运转起来的东西。


架构与训练权重

我们已经走过了核心机制:token、embedding、位置编码、注意力、多头注意力、前馈网络、残差流和归一化,以及输出侧的下一个 token 循环。这就是基本架构的一次完整走读。

那么,GPT、Claude、Gemini、LLaMA 到底有什么不同?公开细节各不相同,专有模型也不会公开每一个架构选择。但在这篇文章覆盖的层次上,它们大体都处在同一个 Transformer 家族设计空间里,这也是模型选型时更该关注训练数据、规模和后训练差异,而不是底层架构本身的原因。

大多数现代基于 Transformer 的 LLM 使用同样的宏观结构:分词、embedding、位置编码、堆叠的 Transformer 层(每层包含多头注意力和前馈网络)、残差流、层归一化,以及下一个 token 预测。

模型之间变化的是:

  1. 训练得到的权重本身,它们来自不同规模、不同数据的训练。
  2. 配置:层数、词表大小、头数、参数量、MoE 或密集结构。
  3. 后训练:指令微调、从人类反馈中学习,以及叠加在基础模型上的安全控制。

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

2023 到 2025 年的“现代 Transformer”技术栈,已经在许多严肃的前沿模型和开放权重模型之间收敛到一组常见选择,即使不同团队是独立走到这里的。Pre-norm 放置方式、RMSNorm、RoPE、SwiGLU、Grouped-Query Attention,以及一些最大模型中的 Mixture of Experts。这些不是一次性发明出来的,而是在原始 2017 年设计之上,经过大约五年逐步打磨积累起来的。


接下来会怎样

Transformer 家族架构的收敛,在机器学习历史上有点不同寻常。在这个领域过去的大部分时间里,每个问题都有自己的专门网络。图像识别用一种,语言用另一种,音频用第三种。视觉团队和语言团队共享的方法很少。

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

这种情况也可能改变。Mamba 和其他状态空间模型是可信的替代方案,尤其适合非常长的序列。混合架构也正在被探索。Mixture of Experts 已经改变了前沿模型里“架构”这个词的含义,而这在五年前还会显得相当奇特。

但这篇文章中的核心机制,也就是 token、embedding、位置编码、注意力、前馈网络、残差流和归一化,以及下一个 token 预测,都是更持久的问题。即使架构发生变化,任何序列模型也都必须以某种形式解决这些问题。

如果你读到了这里,那么你已经可以阅读许多现代 Transformer 论文或模型卡,并知道每一节讲的是哪一块。这就是目标。

非常欢迎反馈。如果其中任何内容让你感兴趣,请在 X 上联系原作者。他很喜欢结交新朋友。

常见问题

LLM 是怎么理解文本的?
文本先被分词成词表里的整数 ID,再映射成 embedding 向量来承载语义,并用位置编码补充 token 顺序,最后经过一层层 Transformer 模块处理。
Transformer 里的注意力机制在做什么?
自注意力为每个 token 生成 Query、Key、Value 向量,计算匹配分数后用 softmax 加权混合 Value,让 token 之间交换信息;在只能从左到右生成的模型里,因果掩码会阻止模型看到未来的 token。
不同 LLM 之间的主要差异来自哪里?
大多数现代 LLM 共享同一类 Transformer 骨架,差异主要来自训练数据、规模、配置选择和后训练,而不是完全不同的核心结构。
为什么大模型有时会数错单词里的字母,比如 strawberry 里有几个 r?
模型并不直接在字母上操作,而是先经过分词把文本转换成词表里的 token ID;像 strawberry 这样的单词可能被拆成几个子词片段,模型看到的是这些片段对应的整数,而不是逐个字母,所以在需要精确计数字母这类任务上容易出错。
为什么模型处理很长的上下文时可靠性会下降?
现代模型主要依靠 RoPE 之类的位置编码和 KV cache 来处理长序列,虽然比早期的绝对位置编码泛化更好,但研究发现的 lost in the middle 现象表明,模型使用提示词开头和结尾信息的可靠性,高于使用埋在中间的信息,所以把关键内容放在开头或结尾、或在结尾重复一遍,通常能提高长上下文任务的准确性。