Tokenization
Tokenization(分词)是将原始文本转换为模型可处理的数字序列的过程,是NLP流水线中的第一步也是最关键的一步。
共 3 篇文章·阅读时间:约35分钟
01BPE算法
BPE(Byte Pair Encoding)是一种基于频率的子词分词算法,广泛应用于GPT、Llama等模型。
BPE原理
BPE最初是一种数据压缩算法,后来被引入NLP用于分词。其核心思想是将最频繁出现的字符对合并为新的token。
BPE示例
初始词表:所有字符
训练语料:"low lowest newer newer newer"
合并过程:
- 统计字符对频率,e+t最频繁 → 合并为et
- 继续合并,最终得到 subword 词表
BPE训练流程
- 准备语料:将文本分割为字符序列,添加特殊符号(如 </w> 表示词尾)
- 统计频率:统计所有相邻字符对的频率
- 合并:选择频率最高的字符对,合并为新的token
- 重复:直到达到预设的词表大小或合并次数
BPE的优点
- 有效处理未登录词(OOV):通过子词组合表示
- 控制词表大小,平衡效果和效率
- 训练简单高效
02WordPiece
WordPiece是Google提出的子词分词算法,被BERT、DistilBERT等模型采用。
WordPiece原理
WordPiece与BPE类似,但合并的选择标准不同。BPE基于字符对频率,而WordPiece基于语言模型似然。
选择标准
WordPiece选择合并后使语言模型困惑度提升最小的字符对:
Score = Frequency(x,y) / Frequency(x) × Frequency(y)
实质是选择使训练语料似然提升最大的合并
WordPiece vs BPE
| 特性 | BPE | WordPiece |
|---|---|---|
| 合并标准 | 字符对频率 | 语言模型似然 |
| 代表模型 | GPT、LLaMA | BERT |
| 词表特点 | 偏向高频词对 | 偏向有语义意义的子词 |
| 计算复杂度 | 较低 | 较高(需计算语言模型) |
03SentencePiece
SentencePiece是Google开发的一种无监督文本分词器,特别适合没有显式分词需求的语言(如中文、日文)。
SentencePiece特点
端到端训练
将文本视为原始字节序列,不需要预先进行分词或预处理。 空格也被视为普通字符处理。
支持多种算法
支持BPE、UniLM、Char等分词算法。 可以在同一框架下对比不同算法的效果。
动态词表
可以根据需要动态调整词表大小。 支持增量训练。
应用场景
SentencePiece适合的场景
- 中文、日文等无显式分词边界的语言
- 多语言模型:统一处理不同语言的文本
- 代码模型:处理代码时保留特殊字符
- 生产环境:需要快速推理的场景
代表模型
- T5:使用SentencePiece BPE
- ALBERT:使用SentencePiece
- LLAMA系列:使用BPE
- ChatGLM:使用SentencePiece
上一篇
← 注意力机制