BPE是你的分词器之所以如此工作的原因。它解释了为什么常见词汇开销低(一个token)、稀有词汇开销高(多个token),以及为什么非英语文本成本更高(分配给非英语字符对的合并次数更少)。理解BPE有助于你预测token数量、优化提示词,并理解为什么不同的分词器对相同文本会产生不同的结果。
算法流程:(1) 从一个包含单个字节(256个条目)或字符的基础词汇表开始,(2) 扫描训练语料库并统计每对相邻token的频次,(3) 将最频繁的对合并为新token并添加到词汇表中,(4) 重复步骤2–3直到词汇表达到目标大小(通常为32K–128K)。合并顺序定义了优先级:"th"可能是第50次合并,而"ing"是第200次合并,这意味着"th"在此分词器中是更基础的单元。
SentencePiece(Google)是一种流行的BPE实现,它将输入视为原始字节而非预分词的单词。这意味着它可以处理任何语言而无需特定语言的预处理——无需中文的分词或土耳其语的形态分析。大多数现代LLM使用SentencePiece或类似的字节级BPE变体。另一种选择WordPiece(BERT使用)与之类似,但使用略有不同的合并标准。
BPE合并反映了训练语料库的统计特征。在英语代码上训练的分词器会为"function"、"return"和"const"获得高效合并,但会将印地语或阿拉伯语文本碎片化。这就是为什么多语言分词器需要平衡的训练语料库——合并表必须为每种语言的常见模式分配足够的合并次数。Llama 3的分词器明确地在更平衡的多语言数据上进行训练,与Llama 2相比,非英语token效率提高了2–3倍。