Token 是什么?分词算法有什么区别?
Token 是什么?BPE、WordPiece 和 SentencePiece 有什么区别?
理解大模型,先从 Token 说起
我们之前聊完了 Decoder-only Transformer 架构,明白了 GPT 为什么选择这条技术路线。但还有一个关键问题没解决:模型是怎么"读"你输入的文字的?
你敲下一句"帮我写一首诗",模型看到的是什么?
答案藏在 Token 这个概念里。它是理解大模型的第一道门槛。

Token:大模型的乐高积木
人类读书,眼睛扫过去就能认出每个字。但大模型不是人,它的"眼睛"只能看到数字。
所以第一步,就是把文字转成数字。
具体怎么转?答案是分词——把一句话切成一个个小小的片段,每个片段叫一个 Token。
Token 可能是:
- 一个完整的词,比如 "机器"
- 一个词的一部分,比如 "机" 和 "器"
- 一个单独的字符,比如 "机"
- 甚至是标点符号
关键点来了:模型不认识字,只认识数字 ID。 每个 Token 都会对应一个整数,就像给每个积木块编上号。
词汇表就是这张对应表。模型训练前先确定好词汇表大小,通常是几万到几十万不等。词汇表越大,能表达的意思越丰富,但占用的内存也越多。
这个过程很像玩乐高。零散的积木颗粒本身没什么意义,但按照特定方式组合起来,就能拼出汽车、城堡、飞机。Token 就是大模型的"积木颗粒"。

分词的三种粒度:切蛋糕的学问
同一个句子,切法不同,结果完全不同。
第一种:词级切分(Word)
按空格和标点来切。英文天然适合这种方式,因为英文单词之间有空格。
"Machine learning is amazing" 切成:Machine learning is amazing
但中文没有空格,这种方式直接失效。
第二种:子词切分(Subword)
在词的内部继续切。英语的 "unbelievable" 可以切成 "un" + "believe" + "able"。
这样既保留了有意义的词根词缀,又不会把每个字母都当成单独的 Token。
第三种:字符级切分(Char)
直接切成最小单元。英文切成每个字母,中文切成每个汉字。
这种方法最简单,但序列会变得很长,而且单个字符往往没什么语义。
打个比方。切蛋糕:词级是按人数切,子词是按每个人能吃多少切,字符是切成最小碎屑。
显然,子词切分是性价比最高的选择——不太粗也不太细。

BPE:贪心合并的经典算法
子词切分的思路确定了,那具体怎么切?
BPE(Byte Pair Encoding)是最经典的算法,GPT 系列用的就是它。
核心思想很简单:
- 从单个字符开始
- 数一数哪些相邻的字符对出现最频繁
- 把最频繁的那对合并成一个新单元
- 重复以上步骤,直到词汇表达到目标大小
举个例子。假设有这样的文本:aaabd
字符频率:a=4, b=1, d=1
相邻对频率:aa=3(出现3次),ab=1,bd=1
最频繁的是 "aa",合并成新单元 X。文本变成:Xabd
继续统计,"Xb" 出现1次,"ab" 出现1次...
BPE 就像玩拼图游戏。刚开始都是散片,然后每次找出最常一起出现的两块粘在一起。慢慢地,散片就变成了有意义的组合。
为什么 GPT 用 BPE?
因为它实现简单、训练高效。只需要统计词频,迭代合并就行。
缺点呢?
贪心策略不一定全局最优。算法只管局部最优(最高频的相邻对),可能忽略了大局。

WordPiece:基于概率的切分
BERT 选了另一条路——WordPiece。
BPE 是从下往上合并,WordPiece 是从上往下拆分。
具体做法:
- 先准备好一个大词汇表
- 给句子分词时,尝试把每个词继续拆分
- 拆分依据:看拆分后的语言模型概率是否更高
什么语言模型概率?简单理解就是,这个切法放在句子中通顺不通顺。
"uncomfortable" 要不要拆?
方案A:uncomfortable(一个Token)
方案B:un + comfort + able
如果 B 的概率更高,就选 B。
WordPiece 的特点是优先保留有语义的词素。 前缀 "un-"、后缀 "-able" 都是英语里常见的词素,有明确的语法意义。WordPiece 更倾向于保留它们。
这就像拆快递。先看看能不能整体搬走,如果搬不动,再拆成零件。尽量保持每个零件还有独立功能。
所以 WordPiece 更适合形态丰富的语言——词缀多、词根变化多的语言,比如德语、土耳其语。

SentencePiece:空格无关的通用方案
BPE 和 WordPiece 都假设输入有空格分隔。英文可以,但中文、日文怎么办?
SentencePiece 解决了这个问题。它不依赖空格,直接在原始文本上训练。
SentencePiece 用的是 Unigram 语言模型:
- 从一个巨大的词汇表开始
- 不断删除"贡献小"的 Token
- 删除标准:看删除后整体损失增加了多少
损失最小?意味着这个 Token 对语言建模的贡献越大。
SentencePiece 处理中英文的区别:
英文:"I love natural language processing"
SentencePiece 切:I lovable natural language processing
中文:"我喜欢机器学习"
SentencePiece 切:▁我▁喜欢▁机器▁学习(▁是空格标记)
中文没有空格,但 SentencePiece 能自动学习到哪里该断开。这种"无监督"的特性让它成了多语言模型的标配。
T5、XLNet 等模型用的就是 SentencePiece。

三种算法怎么选?
没有最好的算法,只有最适合场景的算法。
BPE:数据量大、以英文为主。GPT 系列、GPT-2 都在用。简单高效。
WordPiece:形态丰富的语言。BERT 系列。注重语义完整性。
SentencePiece:多语言、词边界不清晰。T5、mBERT。用得最广。
就像木工用锯、裁缝用剪刀。工具选对了,事半功倍。
| 算法 | 代表模型 | 算法基础 | 适用场景 |
|---|---|---|---|
| BPE | GPT-2 | 频率统计 | 英文为主 |
| WordPiece | BERT | 语言模型概率 | 形态丰富语言 |
| SentencePiece | T5, mBERT | Unigram模型 | 多语言通用 |

理解到这里,你已经掌握了 Tokenization 的核心知识。
但 Token 被转换成数字 ID 之后,接下来发生了什么?为什么模型能理解这些数字的含义?
这就要说到 Embedding 了——把 Token 的 ID 变成向量,让模型真正"读懂"每个词。
Token Embedding 和 Position Embedding 分别是什么?
当你和 ChatGPT 对话时,它怎么知道"喜欢"和"讨厌"意思相反?"猫"和"狗"都是动物?
这些问题的答案,就藏在 Embedding 里。
