8. 模型如何读写数据(Tokenizer 与 Token)
大模型并不能直接理解:
- 中文
- 英文
- 图片
- 字符串
模型真正处理的是:
数字(IDs)
因此:
所有文本都必须先转换成 Token(分词)。
1. 什么是 Token(分词)
模型处理文本的方法通常叫:
Tokenization(分词)
Tokenizer(分词器)会把文本切分成:
- 单词
- 子词
- 字符
- 符号
然后再映射成:
Token ID(数字编号)
2. 为什么 Tokenizer 很重要
对于 LLM 来说:
Tokenizer 决定了模型如何理解世界。
模型看到的不是:
hello world
而是:
[15496, 995]
这些数字。
3. 词表(Vocabulary)
所有 Token 的集合叫:
Vocabulary(词表)
例如:
- GPT-3 大约有 5 万多个 Token
- Llama、Qwen、DeepSeek 都有自己的词表
每个 Token 都对应一个唯一 ID。
例如:
| Token | ID |
|---|---|
| hello | 15496 |
| world | 995 |
4. 模型如何处理文本(完整流程)
整个流程如下:
graph LR A[Text 文本] --> B[Tokenizer 分词器] B --> C[Tokens Token IDs] C --> D[LLM 模型] D --> E[预测下一个 Token] E --> F[Detokenizer 解码] F --> G[生成文本]
5. 本质:文字 → 数字 → 概率 → 文字
模型本质上一直在做:
文本
→ Token ID
→ 概率计算
→ 下一个 Token ID
→ 文本
6. 一个完整例子
例如输入:
I love AI
第一步:Tokenizer 分词
可能变成:
["I", " love", " AI"]
第二步:映射成 Token ID
[40, 1842, 9552]
第三步:输入模型
模型开始预测:
下一个 token 是什么?
例如预测:
"!" 的概率最高
第四步:输出 Token
[0]
第五步:解码成文本
最终输出:
I love AI!
7. Tokenization 的问题
Tokenizer 并不总是“符合人类直觉”。
8. Strawberry 为什么数不清 r
经典问题:
strawberry 中有几个 r?
人类很容易知道:
3 个 r
但很多语言模型会答错。
9. 原因:Tokenizer 切分方式
因为模型可能把:
strawberry
切分成:
["straw", "berry"]
模型处理的是:
- token
- 而不是字符
因此它并不真正“看到”:
r r r
10. 不同 Tokenizer 的差异
不同模型使用不同分词器。
例如:
- BERT
- T5
- GPT
- DeepSeek
- Qwen
它们:
- 分词规则不同
- 空格处理不同
- 中文切分不同
示例:空格处理
GPT 系列常见:
" hello"
和:
"hello"
是不同 Token。
因为:
空格本身也是信息。
11. Tokenizer 的核心本质
Tokenizer 本质上是在做:
文本 → 数字映射
即:
word → token id
例如:
| 单词 | Token ID |
|---|---|
| cat | 1024 |
| dog | 5321 |
12. Embedding(嵌入层)
Token ID 还不能直接输入模型。
因为模型只能处理:
向量(Vector)
因此需要:
Embedding Layer(嵌入层)
13. Embedding 的作用
Embedding 会把:
Token ID
转换成:
高维向量
例如:
1024 → [0.12, -0.98, ...]
14. 完整输入流程
graph LR A[文本 Text] --> B[Tokenizer] B --> C[Token IDs] C --> D[Embedding Layer] D --> E[向量 Vectors] E --> F[Transformer LLM] F --> G[下一个 Token 概率]
15. 模型输出是什么
模型输出的并不是单词。
而是:
整个词表上的概率分布。
例如:
| Token | 概率 |
|---|---|
| vanilla | 0.7 |
| chocolate | 0.2 |
| strawberry | 0.1 |
16. Temperature(温度)
Temperature 用于控制:
输出的随机性。
17. 温度低:更确定
例如:
temperature = 0
模型会选择:
概率最高的 Token。
示例
问题:
冰淇淋有什么口味?
模型可能总是回答:
香草味
因为它概率最高。
18. 温度高:更随机
例如:
temperature = 2
模型采样更平均。
可能输出:
- 香草
- 草莓
- 巧克力
- 抹茶
- 芒果
并且结果更多样化。
19. Token Sampling(采样)
模型预测完概率后,
需要一种方法:
从概率分布中选出下一个 Token。
20. Beam Search(束搜索)
Beam Search 是一种经典解码算法。
它会:
同时保留多个高概率候选路径。
而不是只选一个。
简化理解
不是:
只走一条路
而是:
同时探索多条可能路径
最后选择整体概率最高的句子。
21. Batch 与 Padding
训练时通常不是一次只输入一句话。
而是:
Batch(批量训练)
例如:
句子1:I love AI
句子2:Hello
22. 问题:长度不同
模型要求:
同一个 Batch 长度一致。
因此需要:
Padding(填充)
23. Padding 示例
例如:
句子1:
[I, love, AI]
句子2:
[Hello]
Padding 后:
[I, love, AI]
[Hello, PAD, PAD]
这样长度统一:
长度 = 3
24. Padding Token 的作用
PAD Token 本身:
- 不代表真实内容
- 只是占位符
训练时通常会:
Mask 掉 PAD 的损失计算。
25. 如何加载 Tokenizer
通常使用:
HuggingFace Transformers
示例代码
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained(model_name)
26. 不同模型 Tokenizer 不兼容
例如:
- BERT Tokenizer
- T5 Tokenizer
- DeepSeek Tokenizer
它们:
- Token ID 不同
- 词表不同
- 空格规则不同
因此:
Tokenizer 和模型必须配套使用。
27. Tokenizer 是否需要重新训练
通常情况下:
后训练不会修改 Tokenizer。
因为:
- Embedding 已经训练好了
- 修改词表代价很大
因此:
大多数 SFT / RL 都直接复用原词表。
28. 什么情况下需要修改词表
如果进入专业领域:
例如:
- 法律
- 医学
- 生物学
可能存在大量:
- 专业术语
- 长字符串
- 特殊符号
这时可能需要:
扩展 Vocabulary(词表)。
29. 修改词表的影响
词表变化后:
Embedding Layer 也必须同步扩展。
因为:
Embedding 大小
=
Vocabulary Size
例如:
50,000 tokens
→ embedding matrix:
[50000 × hidden_size]
如果新增 Token:
50,100 tokens
Embedding 层也必须变成:
[50100 × hidden_size]
30. 一句话总结
Tokenizer:
决定模型如何理解文本。
Embedding:
把 Token 转换成向量。
LLM:
在 Token 概率空间中预测下一个 Token。
最终:
大模型本质上只是一个“预测下一个 Token 的概率机器”。