Understanding Tokenization Methods
date
Apr 22, 2025
slug
tokenization-llm
status
Published
tags
NLP
summary
type
Post
TL;DR
分词可以有三个粒度级别:
- 字符级:没有OOV问题且词表小,但序列长且单字符难以承载复杂语义
- 词级:分词简单(英文可直接用空格),但存在OOV问题且相似词间缺乏参数共享
- 子词级:在两者间取得平衡,通过将词分成更小的子词解决OOV问题并实现参数共享
目前主要使用子词粒度的分词,常见的有两类方法:
- 从小词表开始逐渐添加新token:BPE、BBPE、WordPiece
- 从大词表开始逐渐删除token:ULM
Byte Pair Encoding / Byte-level Byte Pair Encoding
核心思想:从基础的小词表(ASCII字符集/256字节集)开始,不断合并共现频率最高的token对,形成新token,直到达到目标词表大小。
具体来说,每次合并token对
<a, b>
时,就是添加一条规则<a> <b> → <ab>
。推理时,对待编码文本先分成单个字符,再逐条应用合并规则。WordPiece
主要思想与BPE/BBPE相同,区别在于选择合并pair的标准。BPE/BBPE 基于频率选择,WordPiece 基于相邻 token 间的互信息选择,每次选择互信息最大的两个相邻 token 合并。token 的似然度可通过一元语言模型估计。
与BPE不同,WordPiece不存储合并规则,而是存储词表。推理时寻找词表中最长的匹配前缀子词(这也解释了为什么WordPiece在词内部使用前缀标记
##
),如果找不到则整个词被标记为<unknown>
。Unigram Language Model
核心思想:从大词表开始(通常用BPE初始化),每次选择删除后对似然度降低最小的token,直到达到目标词表大小。
通过EM算法迭代删除冗余子词并训练 unigram language model:
- E-step:根据当前ULM,用Viterbi算法计算最优分割下整个语料库的对数似然度
- M-step:对每个待删除的子词候选,计算删除后最优分割下的语料库对数似然度,选择减少最少的删除,并更新 ULM 概率估计
最终产出子词表及 ULM,推理时用Viterbi算法求解最优分割。
常用的 tokenizer 库
- huggingface tokenizers
- SentencePiece