1. 基本概念
| 概念 | 说明 |
|---|---|
| Token | 分词器定义的输入输出单位,可为词、子词、字符或字节片段 |
| 词典(Vocabulary) | 模型支持的所有 Token 的集合 |
不同模型词典不同(ChatGPT 和 DeepSeek 的词典不同)。
2. 用现成的词典
找一本《汉语大辞典》或《四六级单词表》,加一些符号即可。
分词原则:最大匹配优先——尽量用词典里最长的词。
"自然语言处理"
有整词 → 一个 Token
没有 → 拆成"自然语言"+"处理"
优点:简单、可控。
缺点:覆盖率有限,新词、专有名词、拼写错误、口语无法处理。
现代 NLP 模型通常不完全依赖人工词典。
3. 特殊 Token
这些 Token 不是人类语言,是为训练设计的:
| Token | 全称 | 作用 |
|---|---|---|
<UNK> | Unknown | 代表词典外的未知 Token |
<BOS> | Begin Of Sequence | 序列开头 |
<EOS> | End Of Sequence | 序列结束(模型输出它就停止生成) |
<SEP> | Separation | 区分两个输入序列 |
模型可自定义特殊 Token,如带思考的大模型用 <think>...</think> 标记思考内容。
4. 词典大小的设计
| 词典大小 | 问题 |
|---|---|
| 较小 | 可能把同一文本切成更多 token,影响序列长度与效率;字节级 BPE 不必因此产生大量 UNK |
| 太大(大模型十几万) | 参数多、计算和存储开销大 |
权衡:太小→能力差;太大→效率低。
5. 字节对编码(BPE)
5.1 动机:词根思想
英文单词几十万个,全部加入词典太多。人类靠词根推断:
认识 high → 推断 higher、highest
认识 low → 推断 lower、lowest
如果模型也学词根 low, high, er, est,词典就小很多。BPE 按相邻符号的统计频率合并,可能得到类似词根的子串,但不执行语言学词根分析,也不保证合并结果都有独立语义。
5.2 BPE 算法步骤
输入:语料 + 目标词典大小(例:15)
初始化:
- 每个单词后加
</w>(词结束标记) - 按字母切分,字母和
</w>都进词典
迭代合并(直到词典达到目标大小):
- 统计所有相邻 token 对的出现次数
- 合并出现最多的那一对,生成新 token
- 记录合并规则
5.3 例子(词典大小 = 15)
| 步骤 | 合并 | 出现次数 |
|---|---|---|
| 1 | i + g → ig | 9 次 |
| 2 | e + r → er | 最多 |
| 3 | er + </w> → er</w> | — |
| 4 | hi + g → hig | — |
| 5 | hig + h → high | — |
5 次合并后词典达到 15 个 token,停止。
5.4 用 BPE 分词
拿到词典 + 合并规则后,分词过程:
1. 先把单词按字符拆分
2. 应用合并规则逐层合并
3. 返回 token 在词典中的序号
例:输入 "higher lower"
→ 分词结果 [14, 12, 8, 9, 7, 12]
6. 总结
Token:NLP 处理的最小单元
词典:模型支持的所有 Token
词典来源:
人工词典(简单但覆盖有限)
→ BPE 自动构建(主流)
特殊 Token:
UNK(未知)、BOS(开头)、EOS(结束)、SEP(分隔)
BPE 算法:
词根思想 → 高频相邻字符逐步合并 → 生成词典 + 合并规则
好处:词典可控、覆盖新词、泛化好
分词时:字符拆分 → 应用合并规则 → 返回序号