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训练流程

  1. 准备语料:将文本分割为字符序列,添加特殊符号(如 </w> 表示词尾)
  2. 统计频率:统计所有相邻字符对的频率
  3. 合并:选择频率最高的字符对,合并为新的token
  4. 重复:直到达到预设的词表大小或合并次数

BPE的优点

  • 有效处理未登录词(OOV):通过子词组合表示
  • 控制词表大小,平衡效果和效率
  • 训练简单高效

02WordPiece

WordPiece是Google提出的子词分词算法,被BERT、DistilBERT等模型采用。

WordPiece原理

WordPiece与BPE类似,但合并的选择标准不同。BPE基于字符对频率,而WordPiece基于语言模型似然。

选择标准

WordPiece选择合并后使语言模型困惑度提升最小的字符对:

Score = Frequency(x,y) / Frequency(x) × Frequency(y)

实质是选择使训练语料似然提升最大的合并

WordPiece vs BPE

特性BPEWordPiece
合并标准字符对频率语言模型似然
代表模型GPT、LLaMABERT
词表特点偏向高频词对偏向有语义意义的子词
计算复杂度较低较高(需计算语言模型)

03SentencePiece

SentencePiece是Google开发的一种无监督文本分词器,特别适合没有显式分词需求的语言(如中文、日文)。

SentencePiece特点

端到端训练

将文本视为原始字节序列,不需要预先进行分词或预处理。 空格也被视为普通字符处理。

支持多种算法

支持BPE、UniLM、Char等分词算法。 可以在同一框架下对比不同算法的效果。

动态词表

可以根据需要动态调整词表大小。 支持增量训练。

应用场景

SentencePiece适合的场景

  • 中文、日文等无显式分词边界的语言
  • 多语言模型:统一处理不同语言的文本
  • 代码模型:处理代码时保留特殊字符
  • 生产环境:需要快速推理的场景

代表模型

  • T5:使用SentencePiece BPE
  • ALBERT:使用SentencePiece
  • LLAMA系列:使用BPE
  • ChatGLM:使用SentencePiece
----