从 Token 到蒸馏:一步步理解大模型如何工作

621 阅读8分钟

本文面向刚开始了解大模型的读者,以本机运行的 Qwen2.5 0.5B 为例,解释 Token、参数、Transformer、训练、蒸馏和量化之间的关系。

先用一句话概括大模型:

大模型使用训练得到的参数,根据已有 Token,反复预测下一个 Token。

1. 一个模型里有什么

模型不只是一个权重文件。完整运行通常需要三部分:

  • 结构配置:规定模型有多少层、每层多宽。
  • Tokenizer 和词表:负责文字与 Token ID 之间的转换。
  • 参数:训练得到的大量数字,包括权重矩阵、偏置和归一化参数。

image.png

本机 Ollama 中的 Qwen2.5 0.5B 显示:

项目数值
参数数量494,032,768
Transformer 层数24
每个 Token 的主向量宽度896
Attention 查询头数14
KV 头数2
FFN 中间宽度4,864
Token 词表大小151,936
最大上下文长度32,768 Token
Ollama 模型文件397 MB,Q4_K_M 量化

这些数字描述的是已经下载到本机的具体模型版本,不代表所有大模型都使用相同结构。

2. Token 是什么

模型不能直接处理文字。Tokenizer 会先把文字切成 Token,再将它们转换成整数 ID。

例如在这个 Qwen 的词表中:

我喜欢吃
   ↓
[109366, 99405]
   ↓
109366 = “我喜欢”
99405  = “吃”

因此,一个 Token 不一定对应一个汉字,也可能是:

  • 一个字;
  • 一个词;
  • 多个字;
  • 标点;
  • 英文片段;
  • 特殊控制标记。

词表只规定 Token ID ↔ 文字片段 的关系。它不是文章数据库,也没有保存所有可能的句子。

3. 一个新 Token 是怎么生成的

输入变成 Token ID 后,模型先查询 Embedding 权重,把每个 ID 转换成一个 896 维向量。向量经过 24 个 Transformer 层后,再由输出层为整个词表打分。

image.png

这里的“打分”不是再调用另一个模型,而是当前模型中的一次矩阵计算:

最终的896维向量
        ×
输出权重矩阵
        ↓
151936个原始分数,也叫Logits

每个 Token 得到一个分数。分数经过转换后成为概率,再根据生成参数选择一个 Token。

苹果:45%
辣:  35%
饭:  15%
其他: 5%

如果使用确定性选择,通常取分数最高的 Token;如果使用随机采样,也可能选择概率稍低的 Token。

模型先生成 Token ID,再把 Token 解码成文字显示给用户。新 Token 同时会追加到上下文,参与下一次预测。

4. 24 个 Transformer 层在做什么

模型的层数和宽度由工程师在训练前确定。这个 Qwen 有 24 个结构相同、参数不同的 Transformer 层:

Token向量
  ↓
第0层 → 第1层 → …… → 第23层
  ↓
LM Head

每一层主要包含两部分:

  • Attention:从上下文中的其他 Token 获取信息。
  • FFN:筛选、组合并加工当前 Token 的信息。

4.1 Attention:决定当前要参考谁

整个上下文都可以进入模型,但当前计算不会同等关注所有 Token。Attention 会为历史 Token 临时计算不同的权重。

例如,在处理“苹果”时,某个 Attention 头可能产生:

我:    5%
喜欢: 15%
吃:   30%
苹果: 50%

这些 Attention 权重只服务于当前输入、当前层和当前 Attention 头。它们不是训练后固定保存的模型参数。

因此需要区分:

  • 模型参数权重:训练得到,推理时通常保持固定。
  • Attention 权重:每次运行时根据上下文动态计算。

4.2 FFN:加工当前 Token

这个 Qwen 的 FFN 会把每个 Token 从 896 维临时扩展到 4,864 维,完成筛选和组合后再压回 896 维。

image.png

“FFN 宽度 4,864”并不是增加了 Token 数量,而是给每个 Token 提供更大的临时加工空间。

例如有 3 个 Token 时:

[3, 896]
   ↓ FFN扩展
[3, 4864]
   ↓ FFN压缩
[3, 896]

每经过一层,Token 数量通常不变,变化的是每个 Token 内部的向量。各层关注的模式可能不同,但模型文件不会标记“这一层负责语法”或“那一层负责推理”。这些分工是在训练中自然形成的,而且通常相互重叠。

5. 上下文为什么会越来越大

每生成一个 Token,它都会追加到上下文末尾:

[我喜欢] [吃]
       ↓ 生成
[我喜欢] [吃] [辣]
       ↓ 继续生成
[我喜欢] [吃] [辣] [的]

因此需要满足:

系统提示词 + 历史对话 + 当前输入 + 已生成内容
≤ 模型上下文上限

这个 Qwen 支持的最大上下文是 32,768 Token。达到上限后,应用需要截断旧内容、压缩历史、切分任务、换用更长上下文模型,或者停止生成。

推理时还会使用 KV Cache 保存历史 Token 在 Attention 中的部分计算结果。这样生成新 Token 时不必重新计算全部历史,但上下文越长,KV Cache 通常也越大。

6. 训练和调用模型有什么区别

模型结构由人设计,参数值由训练学习。

训练开始前,权重通常按照初始化规则填入随机数。模型预测下一个 Token 后,训练程序把预测与目标比较,再通过反向传播调整参数。

训练数据
  ↓
模型预测
  ↓
计算误差
  ↓
反向传播
  ↓
修改参数

调用模型,也就是推理时,过程不同:

输入Token
  ↓
使用固定参数计算
  ↓
生成新Token

推理时发生变化的是:

  • 当前上下文;
  • 每次计算出的 Attention 权重;
  • 中间向量;
  • KV Cache;
  • 输出 Token 分数。

模型的固定参数不会因为一次聊天自动改变。模型看起来“记住了刚才的要求”,通常只是因为相关内容仍在上下文里。

7. 基座模型和蒸馏模型

基座模型先通过大规模预训练获得语言和知识能力。蒸馏通常不会让小模型从随机参数开始,而是让一个已有的小型基座模型继续学习大模型的输出。

蒸馏也是训练,只是多了一个教师模型。

image.png

image.png

普通训练主要学习真实数据中的目标;蒸馏训练则让学生模仿教师的答案、概率分布或中间特征。

蒸馏过程中:

  • 教师模型负责提供参考,权重保持固定。
  • 学生模型负责学习,权重持续调整。
  • 学生的层数和宽度由工程师提前设计,不是自动从教师模型中缩小出来的。

蒸馏完成后只需运行学生模型,因此部署成本通常更低。但蒸馏过程仍需要运行教师并训练学生,并不是零成本。

8. 量化为什么能缩小模型

参数数量不等于文件大小。文件大小还取决于每个参数使用多少位保存。

模型文件大小
≈ 参数数量 × 每个参数的位数 ÷ 8
+ 量化信息、词表和配置

常见表示方式:

类型每个参数的典型位数特点
FP3232 位精度高,占用大
FP1616 位大约节省一半空间
BF1616 位大模型训练常用
Q8约 8 位推理占用更低
Q4约 4 位更适合个人电脑运行

量化会把高精度参数映射为较少的数值等级,并额外保存缩放信息。它不会改变层数和参数数量,但会降低参数的存储精度。

例如,同样是约 4.94 亿参数:

FP32:理论约1.98GB
FP16:理论约0.99GB
Q4: 理论主体约247MB

本机 Ollama 下载的 Q4_K_M 文件实际约 397 MB,因为它采用混合精度量化,还需要保存缩放信息、词表和模型元数据。

量化可能让接近的 Token 分数发生轻微变化:

量化前:苹果 8.001,香蕉 7.999
量化后:苹果 7.98, 香蕉 8.01

因此,量化通常能换来更低的内存占用和更方便的部署,但过度量化也可能损失回答质量。参数数量、训练数据和训练质量仍然是决定模型能力的主要因素。

9. 把整个过程串起来

训练阶段:
语料 → Token → 模型预测 → 计算误差 → 调整参数

推理阶段:
文字 → Token → 24层计算 → LM Head打分 → 新Token → 追加到上下文

蒸馏阶段:
大模型给出参考 → 小模型模仿 → 调整小模型参数

量化阶段:
参数数量不变 → 降低存储精度 → 模型文件变小

最后只需要记住四句话:

  1. 词表决定模型能够选择哪些 Token。
  2. 参数决定在当前上下文中应该选择哪个 Token。
  3. 训练修改参数,调用模型只使用参数。
  4. 蒸馏训练小模型,量化压缩参数的存储精度。