🔤 分词技术大揭秘:BPE、WordPiece、SentencePiece 到底有啥区别?

发布于:2025年10月10日
关键词:分词、Tokenization、BPE、WordPiece、SentencePiece、Unigram、LLM、大模型


你有没有想过:
当你说“我喜欢AI”时,大模型看到的真的是这三个字吗?

其实不是。

在进入模型之前,每一个文本都会被“切开”成更小的单位——这个过程就叫分词(Tokenization)

就像人吃东西要先切块,AI 也要把文字“切碎”才能“消化”。

但问题来了:

  • 英文怎么切?“unhappiness” 是切为 un + happy + ness 还是 u + n + h + a + p + ...
  • 中文怎么切?“我喜欢AI” 是 我/喜欢/AI 还是 我/喜/欢/A/I
  • 为什么 GPT 用 BPE,BERT 用 WordPiece,而 LLaMA 用 SentencePiece?

今天我们就来揭开这些分词技术的神秘面纱,用厨房切菜的比喻 + 真实例子 + 对比表格,带你一口气搞懂:

✅ BPE
✅ WordPiece
✅ SentencePiece(含 Unigram)
它们的原理、区别与谁在用


一、先理解:分词到底是什么?

🧠 分词的核心任务

把一段文本(如 "I love AI")转换成数字序列,因为模型只能处理数字。

过程如下:

原始文本:  "I love AI"
     ↓ 分词(Tokenization)
Token序列: ["I", "lo", "ve", "AI"]
     ↓ 编码(Numerical Encoding)
ID序列:    [15, 234, 67, 892]
     ↓ 输入模型
模型开始“阅读”

🎯 分词的目标

目标 说明
覆盖所有词 不能有“未知词(UNK)”
控制词表大小 太大会浪费内存,太小会切得太碎
保留语义 尽量让“有意义的单元”作为一个 token
高效编码 减少 token 数量,提升训练速度

二、角色登场:三大主流分词技术

我们用一个厨房切菜大赛来类比:

  • BPE:主厨,擅长“从长词往短切”
  • WordPiece:BPE 的“谷歌定制版”
  • SentencePiece:全能选手,支持多种算法(含 Unigram)

三、选手1:BPE(Byte Pair Encoding)—— “合并小碎片”的主厨

🔧 原理:从细到粗,不断“合并高频组合”

BPE 的思路很反直觉:
不是切词,而是“合并”

🔄 训练流程(以英文为例):
  1. 初始状态:每个字符是一个 token
    h, a, p, p, y, l, o, v, e, u, n, h, a, p, p, i, n, e, s, s

  2. 统计相邻 pair 频率
    h+a=2, p+p=2, p+i=1, i+n=2, n+e=2, e+s=1, s+s=1

  3. 合并最高频 pair:比如 p+ppp
    现在 pp 是一个新 token

  4. 重复以上步骤,直到词表达到目标大小(如 30,000)

🌰 例子:最终结果
  • happy → hap + py
  • unhappiness → un + happi + ness
  • loves → love + s

优点

  • 减少稀有词切分
  • 控制词表大小
  • 适合英文

缺点

  • 对中文支持差(中文本就是单字)
  • 合并过程依赖训练数据

🏆 谁在用:GPT-2、GPT-3、ChatGPT


四、选手2:WordPiece —— BPE 的“谷歌优化版”

🔧 原理:同样是合并,但标准不同!

WordPiece 是 BPE 的“亲兄弟”,用在 BERT 中,但有一个关键区别:

BPE:合并频率最高的 pair
WordPiece:合并能让语言模型概率最大的 pair

🌰 举个例子:

假设我们要决定是否合并 h+appi 还是 appi+ness

  • BPE 看谁出现次数多
  • WordPiece 看谁合并后,整个句子的预测概率更高

这就让 WordPiece 更“懂语言”,能生成更合理的子词。

🌰 实际效果:
  • playing → play + ##ing## 表示这是后缀)
  • transformers → transform + ##ers

优点

  • 生成的 subword 更符合语言规律
  • 在 BERT 任务中表现更好

缺点

  • 训练更复杂
  • 同样不适合中文原生分词

🏆 谁在用:BERT、RoBERTa、ERNIE(百度)


五、选手3:SentencePiece —— “全能型选手”

🔧 原理:不依赖空格,直接从原始文本学习

前面的 BPE 和 WordPiece 都依赖“空格”来切词,比如:

"I love AI" → ["I", "love", "AI"]

但中文没有空格!我喜欢AI 怎么办?

SentencePiece 说:

“我不需要空格,我直接从字符级别开始!”

它把整个句子当成一串字符,直接进行分词建模。

🔄 支持两种算法:
  1. BPE 模式:和传统 BPE 类似,但从字符开始
  2. Unigram 模式:反向思维——先假设有一个大词表,然后不断“删词”

🎯 Unigram 模式:最特别的分词思路

🔄 训练流程:
  1. 初始化一个大词表(比如 10万个候选词)
  2. 计算每个词出现的概率
  3. 尝试删除某些词,看是否会导致整体句子编码长度变长
  4. 如果删除后编码变长,说明这个词有用,保留
  5. 否则删除

最终留下一个最优子集词表

🌰 例子:

输入:我喜欢AI

可能的分词结果:

  •  喜欢 AI ✅(语义完整)
  •    A I ❌(太碎)

Unigram 会倾向于保留 喜欢 这样的常见组合。

优点

  • 完美支持中文、日文等无空格语言
  • 可以端到端训练,无需预分词
  • 支持 BPE 和 Unigram 两种模式

🏆 谁在用:LLaMA、LLaMA2、ChatGLM、T5、Alpaca


六、对比表格:一目了然

特性 BPE WordPiece SentencePiece
原理 合并高频 pair 合并提升概率的 pair 无空格分词,支持 BPE/Unigram
是否依赖空格 ✅ 是 ✅ 是 ❌ 否
中文支持 ❌ 差 ❌ 差 ✅ 强
典型模型 GPT 系列 BERT 系列 LLaMA、T5、GLM
子词标记 无特殊标记 ##ing 可能加前缀▁
训练目标 最小化合并次数 最大化语言概率 最小化编码长度(Unigram)

📌 补充:SentencePiece 输出常带 ,表示“空格后开始”,如:
▁I ▁love ▁AI▁我 ▁喜欢 ▁AI


七、真实场景对比:一句话怎么切?

我们以这句话为例:

“I love 人工智能”

分词器 分词结果
BPE ["I", "lo", "ve", " ", "人", "工", "智", "能"]
WordPiece ["I", "lo", "ve", " ", "人", "工", "智", "能"]
SentencePiece (Unigram) ["▁I", "▁love", "▁人工智能"] ✅ 更合理!

💡 可见,SentencePiece 在中英混合场景下优势明显


八、其他分词方式(简要了解)

方法 说明
空格分词 简单粗暴,按空格切,适合英文但不适合中文
Jieba(结巴) 中文专用,基于词典 + 统计,常用于传统 NLP
Char-level 按字符切,如 我/喜/欢,token 多,效率低
BBPE(Byte-level BPE) BPE 的升级版,按字节切,支持所有语言(如 GPT-2)

🌟 BBPE 特别说明
GPT-2 使用 Byte-level BPE,把每个字符转成 UTF-8 字节,再做 BPE。
这样即使遇到生僻字或 emoji,也能切开,真正实现“无词表限制”


九、如何选择?一句话总结

需求 推荐方案
纯英文任务 BPE 或 WordPiece
中文或中英混合 ✅ SentencePiece(Unigram)
兼容性要求高 SentencePiece(通用性强)
复现 BERT WordPiece
复现 GPT BPE 或 Byte-level BPE
大模型训练 ✅ SentencePiece 是主流选择

十、结语:分词虽小,影响巨大

分词是大模型的“第一道门”。
一个优秀的分词器,能让:

  • token 数量更少 → 训练更快
  • 语义单元更合理 → 模型理解更好
  • 支持多语言 → 应用更广

从 BPE 的“合并思维”,到 WordPiece 的“概率优化”,再到 SentencePiece 的“无空格革命”,
分词技术的演进,正是 NLP 从“规则”走向“数据驱动”的缩影。

下一次当你输入“你好AI”时,不妨想想:
你的文字,正被谁“切碎”送往模型的脑海?


📚 延伸阅读

  • Byte Pair Encoding (Sennrich et al., 2016)
  • WordPiece (Schuster & Nakajima, 2012)
  • SentencePiece (Kudo & Richardson, 2018)
  • Hugging Face Tokenizers 文档
  • LLaMA 分词器源码
Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐