
Tokenizer
字符级 Tokenizer (Character-level)
这是最简单的思路:把每个字、每个字母、每个标点都当成一个 Token。
- 例子:
“我爱学习” -> ["我", "爱", "学", "习"]
- 例子:
“Apple” -> ["A", "p", "p", "l", "e"]
- ✅ 优点: 词表非常小(几十个字母或几千个汉字就能覆盖所有文本),永远不会出现“我不认识这个词”的情况。
❌ 缺点:
- 太碎了: 字母 a 本身没有意义,模型要读很多个 Token 才能拼出一个意思,计算压力大。
- 序列太长: 同样的一句话,字符级分词后的长度是词级的数倍。
词级 Tokenizer(Word-level)
像我们平时说话一样,按完整的词来切分。通常需要配合空格或分词工具(如 Jieba 分词)。
- 例子:
“我爱学习” -> ["我", "爱", "学习"]
- 例子:
“I love apple” -> ["I", "love", "apple"]
- ✅ 优点: 每个 Token 都有明确的语义,模型学起来最轻松。
❌ 缺点:
- 词表爆炸: 英语有几十万个单词,算上各种时态(walk, walking, walked),词表大到显存塞不下。
- OOV问题(Out of Vocabulary): 如果用户输入一个字典里没有的新词(比如新出的网络热词),模型会直接报错,标记为 [UNK](未知词)。
子词级 Tokenizer (Subword-level) - 现代大模型的选择
它的核心逻辑是:常用的词完整保留,不常用的词拆成有意义的碎片。
-
例子: “Annoyingly”(讨厌地)
- 这个词不常用,如果词级分词可能不认识。
- 子词级会把它拆成:
["Annoying", "##ly"]。
- 模型认识
Annoying(讨厌),也认识后缀 ly(副词化),合起来它就能猜出意思。
-
例子: “Today is sunday !”
- 如果是一个成熟的子词分词器(如 Llama3 或 GPT-4 的 Tokenizer),
Today 和 is 因为是高频词,通常会被作为完整词保留
sunday 在有些词表里是完整词,但在一些较小的词表里,可能为会被拆分为 sun + day -- 模型能意识到 sunday 和 sunny 都有 sun 这个根源
! 标点符号通常会被独立起来
✅ 优点:
- 平衡词表大小: 通常只需要 3万 到 10万 个 Token 就能覆盖无限的组合。
- 解决新词难题: 即使是新词,拆成碎片后,模型也能通过碎片“盲猜”大概意思。**