两种子词分词算法BPE (Byte-Pair Encoding) 和Unigram 区别
BPE (Byte-Pair Encoding, 字节对编码)和Unigram Language Model是目前大语言模型(LLM)中最主流的两种子词分词算法。它们的核心目标都是将文本拆分成有意义的“子词”,以减少词表大小并处理未登录词(OOV),但它们的底层逻辑、训练方式和分词机制有显著区别。
以下是详细的对比:
1. 核心逻辑区别
| 特性 | BPE (如 Qwen, Llama, GPT-4) | Unigram (如 SentencePiece, T5, Gemma) |
|---|---|---|
| 算法类型 | 确定性 (Deterministic) | 概率性 (Probabilistic) |
| 训练方式 | 自底向上:从单个字符开始,迭代合并出现频率最高的相邻符号对,直到达到预定词表大小。 | 自顶向下:先建立一个非常大的候选词表,然后通过迭代删除概率最低的词,直到达到预定词表大小。 |
| 分词过程 | 贪心匹配:在推理时,按照固定规则(优先匹配最长子词)进行分割,结果是唯一确定的。 | 采样/搜索:在推理时,存在多种可能的分词方案。Unigram 模型会根据概率分布,选择总概率最高的那一种。 |
| 唯一性 | 对于同一段文本,BPE 永远给出相同的结果。 | 对于同一段文本,Unigram 理论上可以有多种分词方式(虽然实践中通常取最优或采样),这引入了随机性。 |
2. 具体工作流程详解
BPE 的工作原理 (Qwen, Llama 使用)
- 初始化:词表中包含所有单个字符。
- 统计:统计语料中所有相邻字符对的出现频率。
- 合并:找出频率最高的一对字符(例如 “he” 和 “l” 在 “hello” 中频繁一起出现),将它们合并成一个新 token “hell” 加入词表。
- 重复:重复步骤2-3,直到词表大小达到预设值(例如 32k tokens)。
- 分词:新文本到来时,先拆成字符,然后应用之前学到的合并规则。规则是固定的(例如总是优先合并 “th”)。
优点:逻辑简单,推理速度快(确定性算法)。
缺点:对于低频出现的子词组合,可能不是最优分割(因为它只看频率,不看语言模型概率)。
Unigram 的工作原理 (T5, Gemma 使用)
- 初始化:建立一个巨大的候选词表(包含所有出现的子串,比如 256k tokens)。
- 评估使用 Unigram 语言模型评估每个 token 的概率P ( t ) P(t)P(t)。
- 删除:移除概率最低的 10%-20% 的 token,保留高频且有意义的词。
- 重复:重复删除过程,直到词表大小达标。
- 分词:
- 给定一段文本 “hello”,可能存在多种分法:
["h", "e", "l", "l", "o"]或["he", "l", "lo"]或["hel", "lo"]等。 - Unigram 模型会计算每种分法下所有 token 概率的乘积P ( s e g m e n t ) = ∏ P ( t o k e n ) P(segment) = \prod P(token)P(segment)=∏P(token)。
- 选择概率乘积最大的那种分法作为最终结果。
- 给定一段文本 “hello”,可能存在多种分法:
优点:从语言模型概率角度出发,理论上能更好地捕捉语言结构,处理边界情况更灵活。
缺点:推理过程涉及搜索或采样,计算复杂度略高(尽管现代实现已优化得很快)。
3. 对生成任务的影响(关键差异)
在训练阶段,Unigram 通常被认为比 BPE 更优,因为它的概率模型更一致。但在**推理(生成)**阶段,两者差异如下:
BPE:
- 分词是确定性的。无论你怎么生成,“hello” 永远被分成
["he", "llo"](假设这是学到的规则)。 - 这意味着生成的文本 Token 序列是可预测的。
- 分词是确定性的。无论你怎么生成,“hello” 永远被分成
Unigram:
- 分词是基于概率的。在生成过程中,模型可能会“看到”不同的 token 序列。
- 重要影响:在 Unigram 模型中,生成的长度(Token 数量)会随模型设置变化。如果你增加
max_new_tokens,模型可能会生成更少的实际 Token(因为一个长 token 比多个短 token 概率高),或者反之。这导致 Unigram 模型的“输出长度”不如 BPE 稳定。 - 注:许多基于 Unigram 的模型(如 T5)在训练时会调整损失函数来缓解这个问题。
4. 谁在用?
BPE 阵营:
- Qwen(Qwen2.5, Qwen-VL)
- Llama(Meta)
- GPT(OpenAI)
- Mistral
- 理由:实现简单,兼容性好,推理速度极快,且在实际大模型训练中表现足够好。
Unigram 阵营:
- T5(Google)
- Gemma(Google)
- PaLM(早期版本)
- SentencePiece工具包(许多模型用它预处理)
- 理由:Google 早期研究认为 Unigram 在翻译和跨语言任务上更鲁棒,能更好地处理词汇化边界。
5. 总结
| 维度 | BPE | Unigram |
|---|---|---|
| 简单程度 | ⭐⭐⭐ (简单直观) | ⭐⭐ (复杂,需概率计算) |
| 推理速度 | 快 (确定性匹配) | 稍慢 (需搜索最优分割) |
| 词表效率 | 好 | 通常更好 (概率驱动) |
| 生成稳定性 | 高 (Token 序列确定) | 较低 (Token 数量可能波动) |
| 主要使用者 | Qwen, Llama, GPT, Mistral | T5, Gemma, PaLM |
结论:
如果使用的是Qwen2.5,你使用的是BPE。这意味着你的分词规则是固定的,模型将文本切分为子词的方式是确定性的。如果你切换到使用 Unigram 的模型(如 Gemma),你可能会发现同样的输入产生了不同长度的 Token 输出,这是正常现象,由算法本身的概率性质决定。
