文本 Tokenizer 与 Byte-level BPE
文本 tokenizer 把字符串变成模型词表中的 token ID;Byte-level BPE 先以 UTF-8 byte 为完整基础字母表,再学习高频 byte 序列的 merge,从而兼顾无未知字符与常见片段压缩。
Tokenizer 管线
Section titled “Tokenizer 管线”课程第 9 讲把 Hugging Face Tokenizers 拆成四层:
- Normalization:Unicode、大小写或空白规范化;
- Pre-tokenization:按空格、标点或 byte-level 规则划分候选片段;
- Model:BPE、WordPiece、Unigram 等算法把片段映射到词表;
- Post-processing:加入 BOS/EOS、segment 等特殊 token,并生成最终 ID。
不同模型可以共享算法名称,却因 normalization、pre-tokenizer、special tokens 与 merge rules 不同而完全不兼容。
Byte-level BPE
Section titled “Byte-level BPE”UTF-8 把任意文本编码为 byte 序列。GPT-2 风格 Byte-level BPE 先把 256 个 byte 映射到可显示 Unicode 符号,再学习 merge:
原始 UTF-8 bytes → byte-to-unicode 映射 → 预分词 → BPE merges → token IDs因此基础层可覆盖任意输入,不需要传统 <unk> 承担所有未知字符。词表中的 Ġ 常代表前导空格,Ċ 常代表换行;它们是 byte 映射后的可视化符号,不是自然语言字符本身。
训练领域词表
Section titled “训练领域词表”训练 tokenizer 时需要明确:
- 训练语料是否覆盖目标语言和领域;
vocab_size与min_frequency;- special token 集合与 ID;
- normalization/pre-tokenization 规则;
- 保存并发布完整 tokenizer 配置,而不只是
vocab.json。
领域词如果频繁出现,可能被合并成更少 token;但词表越大,embedding 与 LM head 参数通常越多。
多语言压缩率与模型参数
Section titled “多语言压缩率与模型参数”第 26、29 讲比较 cl100k_base、o200k_base 以及 Llama 2/3 词表。更大的、多语言覆盖更好的词表可以减少某些中文文本的 token 数,但代价包括:
其中 是词表大小, 是隐藏维。如果输出 head 不共享权重,还会再增加约 参数。压缩率、模型大小、训练语料和推理速度之间需要整体权衡。
- 小段中文示例的 token 数不能代表完整 benchmark。
- “出现一个完整中文词 token”不证明模型理解该词,只说明词表包含该字节序列。
- 文本 tokenizer 与音频 codec/tokenizer 共享术语,但输入空间和训练目标不同,不应合并定义。
- tokenizer 必须与模型权重匹配;随意换词表会使 embedding ID 语义失配。