引言
如果说神经网络是 AI 的"引擎",那 Transformer 就是让这台引擎真正"理解语言"的关键发明。2017 年,Google 的八位研究员在论文《Attention Is All You Need》中提出了 Transformer 架构——当时这篇论文的目标仅仅是改进机器翻译。但短短几年后,以 Transformer 为核心的 GPT 系列模型已经能写代码、做数学证明、进行多轮对话,甚至在某些认知测试中超越人类平均水平。
本文聚焦一个核心问题:大语言模型究竟是如何"理解"和"生成"语言的? 我们将从最基础的 Token 化开始,一路拆解到千亿参数级别的 GPT 是如何被训练出来的。
第一部分:语言建模的前世今生
1.1 大语言模型的核心任务——简单到不可思议
大语言模型(Large Language Model, LLM)的核心任务出奇地简单:给定前文,预测下一个词。
举个例子,当输入是"天安门广场上升",模型需要预测下一个可能是什么——"旗"、"起"、"起了一轮"……模型会对词汇表中的每个候选词打一个概率分数,选择(或采样)概率最高的那个。
P("旗" | "天安门广场上升") = 0.73
P("起" | "天安门广场上升") = 0.12
P("了" | "天安门广场上升") = 0.05
...
关键洞察:GPT 系列模型的训练不需要任何人工标注!互联网上任意一段文本都可以自动拆成"前文→下一个词"的训练样本:取前 N 个词作为输入,第 N+1 个词就是标准答案。这种"自监督学习"意味着训练数据几乎是取之不尽的——整个互联网的文本都是免费的标注数据。
1.2 从 n-gram 到 Transformer——语言模型的进化史
在 Transformer 出现之前,AI 处理文本经历了漫长的探索:
时代方法核心思路致命弱点1950s-1990sn-gram 模型统计"前 n-1 个词出现时,第 n 个词是什么"的概率无法捕捉长距离依赖;n 每增大 1,参数量指数爆炸2010-2015RNN / LSTM循环处理序列,每一步的"隐状态"携带历史信息串行计算慢;梯度消失导致实际只能记住几十步2014-2016Seq2Seq + Attention编码器压缩句子,解码器"关注"编码器的相关部分注意力只用于连接编码器和解码器,不是自注意力2017Transformer完全抛弃循环,用自注意力同时看到全文计算复杂度 O(n²),长文本成本高2018GPT-1 / BERTTransformer + 大规模预训练需要大量计算资源2020GPT-31750 亿参数,零样本/少样本学习推理成本高昂2022-2023ChatGPT / GPT-4RLHF 对齐 + 多模态训练成本达数亿美元
第二部分:Tokenizer——把语言变成模型能消化的数字
2.1 Token 是什么?
模型处理的不是"字"或"词",而是 Token——它是模型眼中的"最小语义单元"。
英文:
"Hello, world!"
→ ["Hello", ",", " world", "!"] // 4 个 token
中文:
"神经网络很强大"
→ ["神经", "网络", "很", "强大"] // 4 个 token(通常 1-2 个汉字一个 token)
代码:
"def hello():"
→ ["def", " hello", "():"] // 3 个 token
你可能会好奇:为什么中文 4 个字被分成了 4 个 token,而英文 13 个字符只用了 4 个 token?因为英文的常见单词(如"Hello")在词汇表中有自己的独立编码,中文的常见双字词(如"神经""网络")也有自己的编码。Token 化算法的目标就是让"常见内容用一个 token,生僻内容用多个 token"。
2.2 BPE(Byte Pair Encoding)——最主流的 Token 化算法
GPT 系列模型使用的 Token 化算法叫 BPE(Byte Pair Encoding),其核心思想是:从字符级别开始,反复合并出现频率最高的相邻字符/子词对。
具体步骤:
- 将所有训练文本拆分为单个字符(或字节)
- 统计所有相邻对的频率
- 合并频率最高的那一对(比如 "t" 和 "h" 合并成 "th")
- 将合并后的新单元加入词汇表
- 重复 2-4 步,直到词汇表达到预设大小(GPT-4 约 10 万个 token)
这种方法的巧妙之处在于:常见词(如"the""是")整个作为一个 token(高效),生僻词(如"gobbledygook")被拆成几个子词 token("gob""bled""y""gook"),不会出现"不认识"的尴尬。
2.3 Token 词汇表大小的影响
词汇表的大小是一个重要的设计选择,涉及多方面权衡:
词汇表大小优点缺点**小(32K)Embedding 矩阵小,训练和推理快每个词被拆成更多 token,同样语义需要更长序列大(100K+)同样的文本产生更少的 token,信息密度高Embedding 矩阵大,增加参数量和内存消耗多语言大(250K+)**覆盖更多语言,不需要额外适配罕见 token 的 Embedding 训练不充分
GPT-4 的词汇表大约 10 万个 token。以中文为例,每个 token 大约覆盖 1.5-2 个汉字——所以一篇 3000 字的文章大约对应 1500-2000 个 token。这也是为什么模型都有"上下文窗口"的概念:GPT-4 Turbo 的 128K 上下文窗口意味着可以一次性处理约 10 万汉字的文本。
第三部分:Embedding——从离散符号到连续语义空间
3.1 Embedding 的本质
Token 是离散的整数 ID(比如"猫"=1523,"狗"=8764),神经网络只能处理连续的实数向量。Embedding(词嵌入)就是这座桥梁——它实质上是一个巨大的查找表(Embedding Matrix),大小是 [词汇表大小 × 嵌入维度]。
例如,在 GPT-3 中,词汇表有 50257 个 token,嵌入维度是 12288。也就是说,每个 token 对应一个 12288 维的稠密向量,整个 Embedding 矩阵包含约 6.17 亿个参数。
通俗理解:Embedding 就像给每个词分配了一个精确的 GPS 坐标(只不过这个坐标有 12288 个维度而不是 3 个)。语义相近的词("猫"和"猫咪")在向量空间中距离很近;语义无关的词("猫"和"民主")距离很远。模型通过反向传播不断"移动"每个词的坐标,最终形成一套精密的"语言宇宙地图"。
3.2 位置编码——让 Transformer 知道"顺序"
Transformer 有一个特殊的性质:它同时处理所有位置的 token,不像 RNN 那样"先读第一个词,再读第二个词"。这是它高效的原因,但也带来了一个问题:如果没有特别的处理,模型根本不知道"我"在"你"前面还是后面。
这就是**位置编码(Positional Encoding)**的作用——给每个 token 的 Embedding 加上一个代表位置的"标签"。
位置编码的三代演进:
类型代表原理优缺点正弦位置编码原始 Transformer用不同频率的正弦/余弦函数为每个位置生成唯一的编码不需要学习,但外推到训练长度以外的位置效果差可学习位置编码BERT, GPT-2位置编码也是可训练的参数灵活但固定最大长度旋转位置编码(RoPE)LLaMA, GPT-NeoX, Qwen通过旋转矩阵将位置信息编码到注意力计算中,而非直接加到 Embedding 上相对位置天然编码、可外推到更长序列、现代 LLM 的标配
RoPE 的核心直觉:它不直接告诉模型"这是第 5 个 token",而是在计算注意力时注入了两个 token 之间的相对位置差。这样模型理解的是"这两个词相距 3 个位置"而不是"这两个词分别在位置 5 和位置 8"——前者更容易外推到比训练时更长的序列。
第四部分:自注意力——Transformer 的灵魂
4.1 为什么需要注意力?
考虑这个句子:"小明把苹果给了小红,因为她很饿。"
请问——谁饿了?是小明还是小红?人类能通过上下文推断出是小红饿了,这需要我们理解"因为"这个连接词和"给了"这个动作的语义关系。传统的 RNN 只能看到距离最近的前几个词,很难跨越"给了小红"这三个词去连接"她"和"小红"。
注意力机制要解决的问题就是:让每个词都能直接"看到"句子中的任何其他词,并根据语义自动决定该关注谁。
4.2 缩放点积注意力——一步一步拆解
自注意力的计算分为三个步骤:
步骤一:生成 Q、K、V 三组向量
对每个 token 的 Embedding 向量,用三个不同的权重矩阵(Wq, Wk, Wv)分别投影,得到三个独立的向量:
- Query(查询向量,Q):代表这个 token "在寻找什么"
- Key(键向量,K):代表这个 token "能提供什么信息"
- Value(值向量,V):代表这个 token "实际含有什么内容"
直觉类比:把 Transformer 想象成一个大型图书馆。你是读者,想找"关于神经网络的入门书籍"。你的需求就是 Query。每本书封面上印着标签(Key)描述自己能提供什么。管理员拿着你的 Query 去和每一本书的 Key 做匹配(计算相似度),然后根据匹配程度,从最相关的书中提取内容(Value)拼接成你的专属答案。整个过程——生成 Query、匹配 Key、聚合 Value——就是自注意力的全部。
步骤二:计算注意力分数

这是整个自注意力机制中最关键的计算。让我们一步步理解:
Q × Kᵀ:一个矩阵乘法,计算"每个 token 的 Query 与所有 token 的 Key 之间的点积(相似度)"。结果是一个 N×N 的方阵,第 i 行第 j 列表示"第 i 个 token 应该关注第 j 个 token 多少"√dₖ:缩放因子。dₖ 是 Key 的维度(通常是 64 或 128)。为什么要除以它?因为当维度很大时,点积的方差会很大,导致 Softmax 的输入中少数值极大、大部分值极小——梯度几乎为零。除以 √dₖ 让 Softmax 的输入保持在合理范围内
步骤三:Softmax + 加权求和
注意力输出 = Softmax(注意力分数) × V
Softmax 将每行的相似度分数变成和为 1 的概率分布(权重),然后这些权重与每个 token 的 Value 向量相乘并求和——本质上是"根据相关性程度,聚合所有 token 的信息"。
通俗类比:你在一个嘈杂的聚会上跟人聊天。你的耳朵(Query)在寻找与你相关的声音(Key),你自动忽略了背景噪音和远处的对话,专注于某个特定的人的语音(Value)。这就是"鸡尾酒会效应"——自注意力让模型在海量 token 中自动找到最重要的那几个,而忽略不相关的噪声。
4.3 多头注意力——多角度同步理解
一组 Q/K/V 只能捕捉到一种"关注模式"。**多头注意力(Multi-Head Attention)**并行运行多组独立的注意力机制(比如 GPT-3 有 96 个注意力头),每组关注语言的不同方面:
- 语法头:关注"动词-宾语"、"形容词-名词"等句法依赖关系
- 指代头:追踪代词("他"、"她"、"它")指向的实体
- 语义头:关注同义关系和上下位关系
- 位置头:关注相邻或近距的 token 之间的局部模式
- 情感/语气头:关注表达情感和态度的词
将所有头的输出拼接起来,再用一个矩阵做一次线性投影,就得到了多头注意力的最终输出。
4.4 注意力的计算复杂度——O(n²)的瓶颈
自注意力让每个 token 和所有其他 token 两两交互,复杂度是 O(n²)——序列长度翻倍,计算量翻四倍。对于 GPT-4 的 128K 上下文窗口,这意味着每个注意力层的计算中有一个 128000×128000 的矩阵!这显然需要优化。
目前最主流的解决方案是 Flash Attention:它不改变数学结果,而是巧妙地利用 GPU 的内存层次结构。GPU 有大容量的高带宽内存(HBM,如 80GB)和速度快得多但容量小的 SRAM(约 20MB)。传统实现中,完整的 N×N 注意力矩阵必须存在 HBM 中。Flash Attention 将计算切分成小块,让每个小块在 SRAM 中完成计算后再写回 HBM——结果完全相同,但避免了巨大的中间矩阵在 HBM 和 SRAM 之间来回搬运。这带来了 2-4 倍的加速和 10-20 倍的显存节省,已成为所有 LLM 推理引擎的标配。
第五部分:Transformer 完整架构
5.1 一个 Transformer 层的结构
一个完整的 Transformer 层由两个子层构成,每个子层后紧跟残差连接和层归一化:
输入 → [多头自注意力] → [残差连接 + LayerNorm] → [前馈网络(FFN)] → [残差连接 + LayerNorm] → 输出

逐一解读:
- 多头自注意力:让当前层的每个 token 直接"看到"序列中的所有 token,基于语义相似度聚合上下文信息。这是语言理解的核心引擎
- 残差连接:将注意力层的输入直接加到输出上,为梯度保留一条"直达通道",让深层网络不会退化
- Layer Normalization(层归一化):对每个 token 的特征向量做归一化(均值为 0,方差为 1),然后做可学习的缩放和偏移。这让梯度流更稳定,训练更快
- 前馈网络(FFN / MLP):一个简单的两层全连接网络,中间维度通常是注意力维度的 4 倍。它对每个 token 独立做非线性变换——如果说注意力是"让 token 之间交流",那 FFN 就是"让每个 token 自己消化信息"。大量研究表明,FFN 层存储了模型的大部分"知识"和"事实"
一个小细节:Pre-Norm vs Post-Norm。原始 Transformer 将 LayerNorm 放在子层之后(Post-Norm),但后来的研究发现放在子层之前(Pre-Norm)训练更稳定、可以用更大的学习率。现代 LLM(GPT-3 及之后)几乎全部使用 Pre-Norm 布局。
5.2 模型规模与层级递进
GPT-3 堆叠了 96 个 Transformer 层,GPT-4 的层数虽未公开,但业界估计超过 120 层。每一层逐步提炼更高级的语言理解:
- 浅层(1-10 层):学习基础的语法结构和局部的词间关系
- 中层(11-50 层):捕捉更复杂的语义依赖、指代关系和基本的事实知识
- 深层(51-96+ 层):进行抽象的推理、多跳逻辑链、隐含意图的理解,以及对世界知识的综合运用
这也是为什么"越大的模型越聪明"——更多的层意味着模型有更多的"思考步骤"来完成从语法到逻辑的层层递进。
5.3 激活函数在 LLM 中的选择
不同位置使用不同的激活函数——这体现了工程上的精细考量:
位置常用激活原因注意力中的非线性Softmax将任意分数映射为概率分布FFN 中间层ReLU → GELU → SwiGLUSwiGLU 是 Google 2020 年提出的门控变体,PaLM 和 LLaMA 都采用了它最终输出层Softmax在所有 token 上归一化为概率分布
SwiGLU 简释:传统 FFN 是两层:FFN(x) = W₂ · activation(W₁ · x)。SwiGLU 引入了一个门控机制:SwiGLU(x) = (W₂ · (W₁x ⊙ Swish(Wgx))),其中 ⊙ 是按元素乘法。这个"门"让网络可以选择性地过滤信息,比简单的 ReLU 或 GELU 更加灵活。LLaMA 使用 SwiGLU 获得了显著的性能提升。
第六部分:训练大语言模型的完整管线
6.1 阶段一:预训练(Pre-training)——"读完整个互联网"
预训练是 LLM 生命周期中成本最高、耗时最长的阶段。GPT-3 的预训练使用了约 3000 亿个 token 的训练数据,在数千块 GPU 上训练了数月,耗资估计在 500-1200 万美元之间。
训练数据构成(以 LLaMA 2 为例):
数据来源占比说明网页文本(Common Crawl)67%互联网公开网页,经过严格的质量过滤书籍6%长篇叙事和结构化知识学术论文5%科学推理和专业知识代码(GitHub)5%对话和日常语言其他~4%多语言等8%逻辑推理和形式化语言能力维基百科等结构化知识5%事实性和世界知识Reddit 等社交媒体
数据质量的极端重要性:Chinchilla 论文(DeepMind, 2022)揭示了一个重要发现——在算力固定的前提下,在更高质量但数量较少的数据上训练,效果优于在更大但质量参差不齐的数据上训练。这直接催生了"数据工程"这个 AI 时代的新职业。
训练目标:预训练的目标函数是最简单的交叉熵损失——对每个位置的 token,最大化模型对该位置正确 token 的预测概率。整个互联网就是训练数据,每一句话都是自动标注的样本。
产出物:一个基座模型(Base Model)——它"知道"大量知识,能完美续写文本,但不太擅长对话。你问它一个问题,它可能给出更多问题,因为它的训练目标从来都是"续写",而非"回答问题"。
6.2 阶段二:监督微调(SFT)——"学会对话格式"
基座模型知道很多但不会按人类的期望来用。监督微调(Supervised Fine-Tuning, SFT) 教它"当人类发出一条指令时,应该给出有帮助的回答"。
- 训练数据:数万到数十万条人工编写的"指令-高质量回答"对,涵盖问答、摘要、翻译、代码、创意写作等
- 训练方式:和预训练完全一样——仍然是"预测下一个 token",只是数据和格式变了
- 关键格式:训练数据被格式化为对话模板,如
"<|user|>请解释量子计算<|assistant|>量子计算是……",模型学会了对话的角色交替结构 - 计算成本:相比预训练几乎可以忽略——SFT 通常只需要几个小时到一两天
产出物:指令模型(Instruction Model)——能进行正常对话的模型。但这个阶段的模型仍然有一些问题:有时会输出不安全的内容、拒绝回答不该拒绝的问题(或者反过来)、回答的风格可能不够自然。
6.3 阶段三:RLHF——"学会什么是对的"
RLHF(Reinforcement Learning from Human Feedback,基于人类反馈的强化学习) 是让 ChatGPT 真正"可用"的最后一步。它在 2017 年由 OpenAI 和 DeepMind 的团队首次提出,2022 年因 InstructGPT / ChatGPT 的成功而成为行业标杆。
RLHF 的完整流程:
- 收集人类偏好数据:让 SFT 模型对同一个 prompt 生成多个不同的回答(通常 4-9 个),人类标注员根据"有用性、安全性、准确性"等标准对这些回答进行排序
- 训练奖励模型(Reward Model):基于 SFT 模型训练一个专门的神经网络,输入是(prompt, 回答)对,输出一个标量"奖励分",代表这个回答有多好。训练目标是让奖励分与人类排序一致
- 用 PPO 算法微调:将语言模型视为强化学习中的"策略",让它生成回答,用奖励模型打分,然后用 PPO(Proximal Policy Optimization,一种稳定的策略梯度方法)更新模型参数,使模型倾向于生成高奖励的回答
- KL 散度约束:为了防止模型为了刷高奖励分而过度偏离原始能力(比如开始胡说八道或重复废话),PPO 目标中加入了一项 KL 惩罚,约束新模型不要离 SFT 模型太远
DPO(Direct Preference Optimization) 是 2023 年底出现的新方法,它完全不需要训练独立的奖励模型,而是直接从人类偏好数据中学习。数学上可以证明 DPO 等价于 RLHF,但工程上简单得多——直接监督学习即可。很多开源模型(如 Zephyr)就是用 DPO 训练的。
关键洞察:RLHF 不会让模型"变聪明"(知识在预训练阶段就已经定下了),它做的是"对齐(Alignment)"——让模型的输出更符合人类的期望和价值观。一个没有经过 RLHF 的 GPT-4 基座模型和 ChatGPT 知道的"事实"完全一样,但它会以人类不习惯的方式来呈现这些知识。
第七部分:推理与生成
7.1 自回归生成
训练好的模型生成文字的过程叫自回归生成(Autoregressive Generation):
- 输入 prompt: "请写一首关于春天的"
- 模型计算所有可能的下一个 token 的概率 → "诗"(概率 85%)
- 将"诗"追加到序列,重新输入: "请写一首关于春天的诗"
- 模型计算概率 → ","(标点)或 "\n"(换行)
- ...重复,逐 token 生成,直到输出结束符 [EOS] 或达到最大长度
每一步都依赖前一步的输出——这就是"自回归"的含义。这也就解释了为什么 LLM 不能"并行生成"一整段文字,只能逐个 token 地"续写"。
7.2 关键解码参数
参数作用典型设置Temperature(温度)将 logits 除以温度后再输入 Softmax。低温 → 输出更确定(适合翻译),高温 → 输出更有创意(适合写诗)0.1-0.3(严谨),0.7-1.0(创意)Top-p(核采样)只从累积概率达到 p 的最小 token 集合中采样,截断低概率的长尾0.9-0.95Top-k只从概率最高的 k 个 token 中采样40-50Repetition Penalty对已经在输出中出现过的 token 施加惩罚,防止无限重复1.0-1.2
为什么需要这些技巧? 如果每次都选概率最高的 token(贪心解码),模型生成的文字会非常无聊甚至开始重复——因为自然语言本就不是"确定性"的,同一个意思有无数种表达方式。适度的随机性让输出更像人写的。
7.3 KV Cache——推理加速的关键
在自回归生成中,每生成一个新的 token,整个序列的长度就增加 1。如果每次都重新计算所有 token 的 Key 和 Value,计算量会按 O(n²) 增长。
KV Cache 的核心思想很简单:已经生成的 token 的 Key 和 Value 向量不会发生变化(因为前面的 token 不变),所以可以把它们缓存起来。生成第 N+1 个 token 时,只需要计算这一个新的 token 的 Q、K、V,然后让它去"关注"缓存中的所有 K 和 V 即可。
这一优化让 LLM 推理从"每个新 token 都要 O(n²)"变成了"每个新 token 只需 O(n)",是实际部署中最关键的加速技术。
总结
我们从语言建模的基本任务出发,完整走通了 LLM 的技术栈:
- Token 化(BPE) 让文本变成模型可处理的整数序列
- Embedding + 位置编码 将离散符号映射为携带位置信息的稠密向量
- 自注意力机制 让每个 token 能全局交互,自动发现语义关联
- 多头注意力 从多个角度并行理解语言的不同侧面
- Transformer 层 = 自注意力 + FFN + 残差连接 + LayerNorm,层层提炼语言理解
- 预训练用海量文本训练基座模型(成本最高,知识来源)
- SFT + RLHF 让模型学会对话格式并符合人类偏好(对齐)
- KV Cache 和量化 让大模型真正"能用"、"好用"
下一篇我们将转向视觉领域——看看 CNN 如何从像素中提取特征,扩散模型如何"从噪声中画图",以及多模态模型如何打通文本与视觉的壁垒。
语言模型不是魔法,但它确实是一个概率模型被放大到极致后涌现出的近乎理解的行为——而这背后,不过是在数万亿 token 上一次又一次地做"下一个词是什么"的预测练习。 —— Iustitiae
