跳到主要内容

字符级、词级、子词级分词

要解决的问题

神经网络需要将文本映射为离散 ID 序列。粒度太粗(词级)会导致超大词表、大量 UNK;太细(字符级)则序列过长、建模效率低。子词(Subword)在词表大小、序列长度、跨语言泛化之间取得平衡,成为 LLM 预训练的事实标准。

核心概念

粒度词表规模序列长度OOV典型场景
字符很小(~100)很长早期 RNN、拼写纠错
很大(10⁵+)严重MT 传统系统
子词32k~256k中等罕见词可分解GPT、LLaMA、Qwen

设文本 xx 经编码器 EE 得 token 序列 (t1,,tT)(t_1,\ldots,t_T),解码 DD 满足 D(E(x))xD(E(x)) \approx x(可能丢失空格细节,取决于实现)。

压缩率:平均每 token 字符数(bytes-per-token)影响训练 FLOPs 与推理成本;英文 GPT-4 类约 4 字符/token,中文常更低,见 3.2.6 多语言

方法/算法

选型决策树:

  1. 语种:多语优先 SentencePiece / BPE;中文避免纯空格分词。
  2. 词表大小 VV:增大 VV 降低序列长度但增大 embedding 与 softmax 开销;V32k128kV \approx 32\text{k}\sim 128\text{k} 常见。
  3. 字节级:从 UTF-8 字节出发可覆盖任意 Unicode,见 3.2.5
  4. 与目标函数一致:因果 LM 在 token 边界预测下一 token;分词错误会改变监督信号。

工程实践

  • 训练分词器:在 10GB~100GB 代表语料上学习 merges,与预训练数据分布尽量一致。
  • 特殊 token<|endoftext|><|im_start|> 等需预留 ID,后训练模板依赖固定编号。
  • 工具tokenizers(Rust)、SentencePiece、tiktoken
  • 指标:编码速度、词表覆盖率、下游 PPL;变更词表等于新模型,不可与旧 checkpoint 混用。

代表工作

局限与注意点

  • 分词泄露:评测时同一字符串不同切分可能改变难度(算术、拼写任务)。
  • 空格与标点:BPE 是否保留前导空格影响代码、Python 缩进。
  • 词表≠语义:子词边界无语言学保证,「词」可能被拆碎。

延伸说明

embedding 参数量 V×dmodel\approx V \times d_{model},增大 VV 需同步评估 softmax 开销。

实践检查清单

  • BPT
  • UNK
  • 子词

小结

本节核心:BPT 与全链路 UNK 协同;上线前用检查清单做回归。

词表规模与算力(估算)

设 hidden dd,序列长 TT,词表 VV

组件参数量级
EmbeddingVdV \cdot d
LM head(tie 可省)VdV \cdot d
Transformer 层12Ld2\approx 12 L d^2

增大 VV 降低 TT 但总参数可能上升;需在目标 GPU 上做 tokens/s 实测。

相关章节