BPE、WordPiece 与 Unigram:三种主流子词分词算法对比

BPE、WordPiece 与 Unigram:三种主流子词分词算法对比

在构建现代自然语言处理模型时,Tokenizer 是连接文本与模型之间的桥梁。而在 tokenizer 的设计中,BPE(Byte Pair Encoding)、WordPiece 和 Unigram 三种子词(subword)分词算法是最常见的实现方式。本文将系统地介绍这三种方法的原理、特点以及适用场景,帮助读者更好地理解它们在大模型训练中的地位。

一、为什么需要子词(Subword)分词?

自然语言中的词汇是开放的,新词层出不穷。如果使用"词级分词",会导致词表非常庞大,且容易出现 OOV(词表外)问题。而"字符级分词"虽然不需要大词表,但会导致序列过长,模型难以捕捉有用语义。

子词分词正好居中:通过将文本拆成较短、可组合的单元(如词根、词缀、常见组合),既减少了 OOV,又能有效压缩 token 数量,是目前大语言模型的主流选择。


二、BPE(Byte Pair Encoding)

原理:

BPE 是一种基于频率的贪心合并算法。

  1. 初始词表为所有字符。
  2. 每轮找出最常见的相邻 token 对(如 "天"+"气"),合并成一个新 token。
  3. 重复,直到词表达到预定大小(如 32,000)。

特点:

  • 拆词方式唯一,贪心合并。
  • 训练快、实现简单。
  • 对高频组合词(如 "人工智能")压缩效果好。

应用:

GPT 系列、RoBERTa、Qwen 等模型。

示例(简化版):

语料:"天 气 真 好 天 气 真 好"

  1. 初始:['天', '气', '真', '好']
  2. 最频繁对:('天', '气') → 合并为 '天气'
  3. 继续合并:('真', '好') → 合并为 '真好'
    → 最终结果:['天气', '真好', '天气', '真好']

三、WordPiece

原理:

WordPiece 类似 BPE,但合并策略不是基于频率,而是基于语言模型的似然提升。

  1. 每轮尝试一个合并操作。
  2. 选择让训练语料 log-likelihood 增加最多的组合。
  3. 重复,直到词表达到目标大小。

特点:

  • 合并更"语言感知",但训练慢。
  • 使用特殊符号表示子词拼接(如 "##ing")。
  • 更适合英文场景。

应用:

BERT、DistilBERT 等模型。

示例(英文):

单词:"unhappiness"

拆分结果可能为:['un', '##happi', '##ness']

→ 带 ## 表示这是一个接续子词。


四、Unigram Language Model

原理:

Unigram 并不使用合并策略,而是假设一个大词表,保留其中概率最高的子词组合。

  1. 构造所有可能的子词候选。
  2. 初始化每个子词的概率。
  3. 用 EM 算法训练子词概率。
  4. 剪枝掉低概率子词,保留词表。

特点:

  • 多种分词路径可选,灵活性高。
  • 拆分不唯一,有更强的鲁棒性。
  • 特别适合多语言和小语种。

应用:

T5、mT5、ByT5、UL2 等模型。

示例:

语料:"今天真高兴"

候选分词路径可能有:

  • ['今天', '真', '高兴']
  • ['今', '天', '真', '高', '兴']
    Unigram 会保留概率最高的组合路径。

五、对比总结

特性 BPE WordPiece Unigram
合并策略 字符频率 语言模型提升 概率剪枝
拆分唯一性 ✅ 是 ✅ 是 ❌ 否
多语言支持 中等 较弱 ✅ 强
实现复杂度 简单 中等 较复杂
常见应用模型 GPT/Qwen BERT T5/mT5/UL2

六、结语

BPE、WordPiece 和 Unigram 是构建高效、泛化性强的 tokenizer 的三种主流方法。它们在子词构建逻辑、鲁棒性、语言兼容性方面各有优势。在实际使用中,我们应结合模型类型、语种覆盖、资源限制等因素综合选择最合适的算法策略。

相关推荐
zdy12635746881 小时前
python37天打卡
人工智能·深度学习·算法
泽02023 小时前
C++之string的模拟实现
开发语言·数据结构·c++·算法
我不是小upper4 小时前
详细到用手撕transformer下半部分
算法·机器学习·transformer
coding者在努力4 小时前
高级数据结构与算法期末考试速成记录
数据结构·算法·动态规划·分治·速成·期末考试
new出对象4 小时前
C++ 中的函数包装:std::bind()、std::function<>、函数指针与 Lambda
开发语言·c++·算法
理论最高的吻5 小时前
面试题 08.08. 有重复字符串的排列组合【 力扣(LeetCode) 】
c++·算法·leetcode·深度优先·回溯法
SWHL7 小时前
RapidOCR集成PP-OCRv5_rec_mobile模型记录
算法
进击的小白菜8 小时前
LeetCode 75. 颜色分类 - 双指针法高效解决(Java实现)
java·算法·leetcode
远瞻。8 小时前
【论文精读】2024 ECCV--MGLD-VSR现实世界视频超分辨率(RealWorld VSR)
人工智能·算法·stable diffusion·音视频·超分辨率重建
JK0x078 小时前
代码随想录算法训练营 Day60 图论Ⅹ Bellmen_ford 系列算法
android·算法·图论