06 Tokenizer 详解:BPE、WordPiece、SentencePiece 有什么区别?
在前面几章中我们已经介绍了 Transformer、Self-Attention 和 GPT 为什么使用 Decoder-only 架构。到这里一个非常基础但容易被忽略的问题出现了文本到底是如何进入大语言模型的我们平时看到的是一句自然语言大语言模型正在改变人工智能的发展方式。但是模型不能直接处理中文、英文或代码字符串。对模型来说输入必须先被转换成数字 ID再经过 embedding 层变成向量最后才能进入 Transformer。这个过程就是Tokenization负责执行这个过程的工具就是Tokenizer。简单来说原始文本 ↓ Tokenizer ↓ token 序列 ↓ token ID 序列 ↓ Embedding ↓ Transformer所以Tokenizer 是大语言模型的第一道入口。它决定了文本如何被切分也直接影响模型的词表大小、序列长度、训练效率、多语言能力、代码能力和长上下文成本。本文重点讲三个常见概念BPE WordPiece SentencePiece它们都是大语言模型和预训练语言模型中非常重要的分词方法。一、为什么大语言模型需要 Tokenizer语言模型的训练目标通常是预测下一个 token。例如 GPT 类模型要学习给定前面的 token预测下一个 token假设一句话是我喜欢机器学习如果按字切分可以得到我 / 喜 / 欢 / 机 / 器 / 学 / 习如果按词切分可以得到我 / 喜欢 / 机器学习如果按子词切分可能得到我 / 喜欢 / 机器 / 学习这些切分方式都会影响模型看到的输入序列。Tokenizer 的核心作用有三个。第一把文本切成适合模型处理的基本单位。第二把每个 token 映射成一个整数 ID。第三控制词表规模和序列长度之间的平衡。例如文本大语言模型 token大 / 语言 / 模型 token ID[1024, 2356, 987]模型真正看到的不是“语言”这个汉字字符串而是它对应的 ID。之后 embedding 层会把这个 ID 映射成向量。所以在大语言模型中Tokenizer 决定文本如何被模型“看见”。二、为什么不能简单按词或按字切分最直观的分词方式有两种按词切分和按字符切分。但这两种方式都有明显问题。1. 按词切分的问题如果按词切分英文句子I like machine learning.可以切成I / like / machine / learning看起来很自然。但是按词切分会遇到词表爆炸问题。因为自然语言中的词非常多尤其是英文中存在大量词形变化learn learns learned learning learner如果每个词都放进词表词表会非常大。更麻烦的是模型很容易遇到训练集中没见过的新词。例如DeepSeek-V3 Qwen2.5-VL ChatGPT-like bioinformatics如果词表中没有这些词就会出现 OOV也就是 out-of-vocabulary 问题。2. 按字符切分的问题另一种极端方式是按字符切分。例如learning切成l / e / a / r / n / i / n / g这样几乎不会有 OOV因为任何词都可以由字符组成。但是问题是序列会变得很长。例如internationalization如果按词看是 1 个 token如果按字符切分就会变成很多 token。序列越长Transformer 的计算成本越高。标准 Self-Attention 的复杂度大致是O(n²)其中 n 是 token 数量。所以按字符切分虽然避免了 OOV但会显著增加序列长度和计算成本。3. 子词切分是折中方案因此现代大语言模型通常采用子词切分也就是 subword tokenization。它介于“词”和“字符”之间。常见词可以作为完整 tokenlearning罕见词可以拆成多个子词bio / informatics或者un / believable子词切分的核心思想是常见片段尽量合并罕见词可以拆开表示。这样既避免了词表过大又减少了字符级切分导致的序列过长问题。三、BPE从字符开始不断合并高频片段BPE全称是Byte Pair Encoding。它最初是一种数据压缩思想后来被引入到神经机器翻译中用来解决罕见词和开放词表问题。BPE 的核心思想很简单从最小单位开始反复合并出现频率最高的相邻片段直到达到设定的词表大小。为了理解 BPE我们看一个简化例子。假设语料中有几个词low lower lowest一开始可以拆成字符l o w l o w e r l o w e s t统计相邻字符对的频率发现l o o w经常一起出现。于是 BPE 可能先把l o → lo再把lo w → low这样“low” 就变成了一个子词 token。继续合并后可能得到low er est于是lower → low / er lowest → low / est这样模型既能保留常见词根又能处理不同词形变化。BPE 的训练过程可以概括为1. 把文本拆成初始符号通常是字符或字节 2. 统计所有相邻符号对的出现频率 3. 合并频率最高的符号对 4. 更新语料表示 5. 重复合并直到达到目标词表大小BPE 的优点是简单直观 容易实现 能有效缓解 OOV 适合开放词表建模它的局限是主要基于频率合并不一定符合语言学意义 对空格、标点、多语言文本的处理需要额外设计 不同训练语料会得到不同词表在大语言模型中BPE 及其变体非常常见。GPT 系列中就广泛使用了 BPE 或 byte-level BPE 思路。四、WordPieceBERT 常用的子词切分方法WordPiece 和 BPE 很像也是一种子词分词方法。BERT 使用的就是 WordPiece 词表。WordPiece 的基本目标也是把词拆成更小的子词单元。例如unbelievable可能被切成un / ##believable或者un / ##believ / ##able这里的##表示这个子词不是一个新词的开头而是接在前一个子词后面。例如playing → play / ##ing其中play是词的开头而##ing表示它是后缀片段。WordPiece 在推理时通常采用 longest-match-first也就是最长匹配优先策略。例如模型要切分unaffable它会从词表中寻找最长的可匹配子词。如果整个词不在词表中就尝试匹配较长前缀再继续处理剩余部分。可以简单理解为从左到右 每一步尽量匹配词表中最长的子词 匹配不到就继续拆得更细WordPiece 的特点是适合 BERT 这类预训练语言模型 使用 ## 标记词内子词 推理时常用最长匹配 能够处理未登录词它和 BPE 的区别可以粗略理解为BPE 更强调频繁相邻片段的逐步合并 WordPiece 更强调基于词表的子词匹配与概率建模思想不过从使用者角度看二者都属于 subword tokenization都在解决“词表大小”和“未登录词”之间的平衡问题。五、SentencePiece不是一种单独算法而是一套更通用的分词框架SentencePiece 很容易被误解。很多人会把它和 BPE、WordPiece 并列认为它们是三种同级别算法。但更准确地说SentencePiece 是一个语言无关的 tokenizer 工具框架它可以实现 BPE也可以实现 Unigram Language Model。它最大的特点是可以直接从原始文本训练 tokenizer 不要求文本预先按空格切词 适合中文、日文等没有天然空格分隔的语言传统英文分词方法往往默认文本中有空格。例如I love machine learning.空格天然分隔单词。但是中文没有这种空格我喜欢机器学习如果 tokenizer 强依赖空格处理中文、日文等语言时就会比较麻烦。SentencePiece 的做法是把文本当作普通字符序列处理并把空格也视为一种普通符号。它常用特殊符号▁来表示空格。例如英文句子I love NLP可能被表示为▁I / ▁love / ▁NLP这里的▁表示词前空格。这样做的好处是分词和反分词更统一 不依赖外部预分词器 对多语言更友好 可以直接从 raw text 训练SentencePiece 支持两种常见模型BPE Unigram Language Model其中 Unigram 方法不是从小片段不断合并而是先准备一个较大的候选子词集合然后通过概率模型逐步筛选出更优词表。所以SentencePiece 更像是一个统一工具你可以用 SentencePiece 训练 BPE tokenizer 也可以用 SentencePiece 训练 Unigram tokenizer很多大模型和多语言模型都会使用 SentencePiece 或其变体因为它对多语言和无空格语言更加友好。六、BPE、WordPiece、SentencePiece 对比现在我们把三者放在一起比较。方法常见代表核心思想主要特点BPEGPT 系列、很多生成模型从小单位开始不断合并高频相邻片段简单、高效、适合开放词表WordPieceBERT基于子词词表进行最长匹配常用##表示词内片段SentencePieceT5、LLaMA 等模型常见从原始文本直接训练 tokenizer可实现 BPE 或 Unigram语言无关适合多语言和无空格语言可以这样理解BPE 更像是一种子词合并算法 WordPiece 更像是 BERT 系列常用的子词词表方法 SentencePiece 更像是一套 tokenizer 工具框架三者都不是简单的“按词分词”而是通过子词单位在词表规模和表达能力之间做平衡。如果用一句话总结BPE 关注高频片段合并WordPiece 关注词表内最长子词匹配SentencePiece 关注从原始文本端到端训练语言无关 tokenizer。七、Tokenizer 对大语言模型有什么影响Tokenizer 看起来只是预处理工具但它对模型影响很大。1. 影响序列长度同一句话不同 tokenizer 切出来的 token 数量可能不同。例如DeepSeek-V3 is powerful.一个 tokenizer 可能切成DeepSeek / - / V / 3 / is / powerful另一个 tokenizer 可能切成Deep / Seek / - / V / 3 / is / power / fultoken 数量越多模型处理成本越高。对于 Transformer 来说token 数量还会影响注意力计算成本。2. 影响多语言能力如果词表主要由英文语料训练得到那么中文、日文、阿拉伯文等语言可能会被切得很碎。例如中文人工智能如果 tokenizer 不适合中文可能会切成非常细的单位导致同样一句中文占用更多 token。这会影响模型的训练效率和推理成本。3. 影响代码能力代码中有大量特殊符号def get_user_info(user_id): return user_dict[user_id]如果 tokenizer 不能很好处理下划线、缩进、括号、运算符、变量名代码会被切得很碎。因此代码大模型通常需要特别关注 tokenizer 对代码语料的适配能力。4. 影响长上下文成本大模型的上下文长度通常按 token 计算而不是按字符或汉字计算。例如模型支持128K tokens这不等于支持 128K 个汉字或 128K 个英文单词。如果 tokenizer 对某种语言切得很碎那么同样长度的文本会占用更多 token从而更快达到上下文上限。5. 影响未知词和新词处理大语言模型会不断遇到新词例如新模型名称 论文缩写 变量名 网络热词 专有名词好的 tokenizer 应该能把这些词拆成合理片段而不是全部变成未知符号。现代子词 tokenizer 的一个重要优势就是减少[UNK]的出现。八、本文小结本文介绍了大语言模型中的 Tokenizer并重点比较了 BPE、WordPiece 和 SentencePiece。Tokenizer 的作用是把原始文本转换成 token ID 序列完整流程是文本 ↓ Tokenizer ↓ token ↓ token ID ↓ Embedding ↓ Transformer按词切分会导致词表过大和未登录词问题按字符切分又会导致序列过长。因此现代大语言模型通常采用子词切分。BPE 的核心思想是从字符或字节开始不断合并高频相邻片段。WordPiece 是 BERT 常用的子词方法推理时通常采用最长匹配优先并使用##表示词内子词。SentencePiece 更像是一套语言无关的 tokenizer 框架它可以直接从原始文本训练 tokenizer并支持 BPE 和 Unigram 等方法因此更适合多语言场景。三者的关系可以简单概括为BPE一种高频合并式子词算法 WordPieceBERT 系列常用的子词词表方法 SentencePiece语言无关的 tokenizer 工具框架Tokenizer 虽然不是 Transformer 的主体结构但它直接影响模型的输入形式、序列长度、多语言能力、代码能力和推理成本。如果说 Transformer 决定了模型如何处理 token那么 Tokenizer 决定了什么样的文本会被切成什么样的 token。