跳到正文
PRETRAINING FOUNDATION · TOKENIZER

Tokenizer 不是切词小工具,而是模型的输入坐标系

文字进入 Transformer 之前,必须先按一份冻结契约变成整数 ID。Tokenizer 训练决定规范化、边界、piece、ID 与特殊协议;它与 Embedding / LM Head 按行绑定,替换时必须连模型权重和回归测试一起迁移。

01 · 先把对象分清

Tokenizer 训练的不是语言模型,而是一份文本—ID 合同

这篇讨论最常见的固定词表子词 Tokenizer:它不会更新 Attention、MLP 或事实知识,而是从代表性语料中选出有限的 piece,并冻结从文本到整数 ID 的完整规则。字符级、纯字节级或动态分词模型是其他设计路线,不能把这里的结论全部照搬。

NORMALIZER

先定义 N(x)

Unicode、大小写、空白和控制字符怎样改写,会改变后续所有频次。若 N(x) 会丢信息,解码最多回到 N(x),不一定回到原始 x。

SEGMENTATION

Piece 与路径规则

词表只是一部分:BPE 还需要 merge rank,Unigram 还需要 piece 概率与解码策略;预切分、字节兜底和 Decoder 也属于合同。

ID + PROTOCOL

ID 与模型协议

每个 piece 对应稳定行号;BOS、EOS、PAD、角色或工具 Token 是否存在、ID 是多少,都由具体模型与模板约定,并非通用必选项。

白话记忆

它不是只有一本“字典”,而是文字清洗规则 + 切分算法 + 编号表 + 特殊协议。语言模型只按编号查权重;任何一层偷偷变化,都可能让同一句话变成另一串坐标。

02 · 完整训练与编码流

构建阶段学习规则;训练、评测和推理读取同一冻结产物

代表性语料先经过未来一致的规范化与边界处理,再由 BPE 或 Unigram 学习 piece,加入项目需要的特殊 Token 并分配 ID。上线通常关闭采样、执行确定性编码;若训练时启用 Unigram 子词采样或 BPE-Dropout,那是显式的数据增强模式,不是“同一输入永远同一切分”的通则。

Tokenizer 构建与编码双层流程:代表性语料经过规范化、边界处理、BPE 或 Unigram 学习、分配特殊 ID 并冻结产物;新文本复用同一产物得到规范化文本、pieces 与 IDs,再经过可选后处理送入模型 Embedding。
同一份冻结合同连接词表构建和每次编码。对不含额外特殊 Token、编码未产生 <unk> 且使用匹配 Decoder 的内容序列,解码最多保证回到规范化后的 N(x);生产确定性还要求固定实现版本并关闭随机切分。 查看原图 ↗

语料要“像未来会遇到的文字”

只拿英文新闻训练词表,再去编码中文代码问答,往往会产生更碎的序列。词表语料不必等于全部预训练语料,但语言、代码、数学、格式和领域占比应具有代表性。

先定规范化,再做频次统计

若统计后才改变全角半角、组合字符或空白规则,原来的 pair / piece 频率已经对应另一份语料。NFKC 折叠的是兼容等价字符,不是任意“长得像”的字符;Unicode 还明确警告,它可能抹去对语义重要的区别。

预切分不是所有 BPE 的共同前提

Sennrich 式 BPE 从带词尾边界的字符序列学习;GPT / tiktoken 一类实现可先用正则分段,再在 UTF-8 字节上合并;SentencePiece 则可直接处理原始 Unicode 句子并显式编码空白。算法名相同,不代表输入字母表和边界规则相同。

冻结的是可执行 bundle

通用系统至少要保存 normalizer、pre-tokenizer、模型参数、piece→ID、added / special tokens、post-processor 或 Chat Template、Decoder、运行库版本、checksum 与黄金样本。Checksum 只能证明拿到同一产物,不能证明它与权重语义兼容。

SentencePiece 文件边界

训练会生成 .model.vocab,但默认运行时加载的是自包含的 .model:其中已有规范化规则、词表映射和切分模型;.vocab 是便于查看的 piece / score 导出,不是默认编码必需依赖(显式 vocabulary restriction 是额外模式)。其他框架可能把这些组件放在一个 JSON 或多个文件中,不能反推为同一种封装。

03 · 三个常被混用的名词

BPE 反复合并,Unigram 反复剪枝;SentencePiece 是实现层

两种算法都在“基本符号序列太长”和“整词词表太稀疏”之间找折中,但优化对象不同。SentencePiece 不是第三种合并算法:它提供原始句子输入、规范化、空白表示、ID 与解码,并可把 model_type 设成 Unigram 或 BPE(实现还支持 char / word 模式)。

BPE、Unigram 与 SentencePiece 分层对比:BPE 从字符或字节等基本符号开始,按频率学习有顺序的合并;Unigram 从较大候选集开始,用 EM 估计概率并逐轮剪枝;SentencePiece 封装原始 Unicode、规范化、空白符号、BPE 或 Unigram 以及自包含 model。
BPE / Unigram 决定候选 piece 与切分路径;SentencePiece 决定这些算法怎样进入一条可执行工程管线。图中把训练规则与编码规则分开,避免把 BPE 写成笼统的“最长匹配”。 查看原图 ↗
手算 · 三条短句跑两轮 BPE

语料是「低碳模型」×2 和「低碳数据」×1

初始:低|碳|模|型;低|碳|模|型;低|碳|数|据。相邻对“低+碳”出现 3 次,是最高频,因此第一轮加入 piece「低碳」。

第一轮后:低碳|模|型;低碳|模|型;低碳|数|据。此时“低碳+模”和“模+型”都出现 2 次;遇到并列时,真实实现必须有稳定的 tie-break 规则。假设第二轮选择“模+型”,便得到「模型」。

结果:「低碳模型」可切成 低碳|模型,而低频的「数据」仍可能拆成 数|据。真实 BPE 模型还会保存 merge rank;编码时按这份排名反复应用当前可合并对,不等同于从左到右挑“字面上最长的词”。这也不是中文词典判断,而是特定语料、边界和并列规则下的统计结果。

Unigram 直觉

它先准备一个偏大的候选集,假设一条切分路径的概率由各 piece 概率相乘;训练通过 Expectation-Maximization(EM,期望最大化)估计参数,再按删除损失剪掉一部分候选并重复。常规编码取最高概率路径;训练时则可从多条候选路径采样,这正是 Subword Regularization(子词正则化)。

04 · 词表大小不是越大越好

词表 V 与序列 T 在交换成本,最优点取决于整台模型

增大 V 往往能缩短部分文本的 T,但会扩大输入 Embedding 和输出投影 / Softmax;减小 V 则可能增加 Attention、KV Cache 与上下文占用。2024 年一项 33M–3B 参数、最高 500B 字符的研究也发现算力最优词表会随预算变化,因此“32K 永远够用”或“越大越好”都不是通则。

SMALL V → LARGE T

序列侧更贵

同一文本占更多位置;稠密 Attention 的配对项随 T² 增长,KV Cache 与多数逐 Token 层近似随 T 增长,数字、代码和低资源语言可能尤其碎。

LARGE V

词表侧更贵

输入表与输出投影增加;输出投影乘加量约为 T×d×V,Logits 元素数为 T×V。许多低频行还可能训练不足,是否权重绑定也会改变参数账。

MEASURE JOINTLY

端到端联合验收

同时比较各语言 / 领域的 Token 长度分布、回退与 <unk>、模型损失和任务质量、显存、吞吐与延迟,不能用单一压缩率代替。

手算一 · 加 32,000 个 Token 会增加多少权重?

隐藏维度 d=4,096,权重用 BF16 保存

单个新增矩阵增加 32,000×4,096 = 131,072,000 个参数,权重本身约 250 MiB。若输入 Embedding 与输出权重绑定,通常是一份;若不绑定,则约两份、即 500 MiB,输出 bias 若存在还要另算。训练时的梯度与优化器状态也不能混进这笔“纯权重”账。

手算二 · 同样文本从 3,000 变成 4,200 Token

长度是 1.4×,单层稠密 Attention 配对数是 1.96×

4,200 / 3,000 = 1.4;若其余 shape 不变,T² 配对项比例为 1.4² = 1.96,KV Cache 位置数则约为 1.4×。这只是局部数量级:端到端时间还受 MLP、输出投影、padding、kernel、批处理和硬件影响,不能直接宣称整体推理慢 1.96×。

05 · 中文、多语言、数字与代码

“所有文本都能编码”与“所有语言都编码得公平”是两件事

英文空格提供了明显边界,中文和日文没有同样信号;数字、路径、缩进和 Unicode 标识符又有自己的规律。Petrov 等人在一组 FLORES-200 翻译对与多种 Tokenizer 上报告过最高 15× 的长度差,连字符级 / 字节级模型在部分语言对上也超过 4×;这是该研究设置下的结果,不是每个模型的固定倍数,却足以说明全站平均值会掩盖差异。

中文不必先依赖人工分词

SentencePiece 可以把原始句子视为 Unicode 字符序列学习子词,绕开对特定中文分词器的强绑定。它学到的「人工智能」是否整体出现,由训练分布和词表预算决定,不等同于语言学上的词。

规范化先决定什么信息还存在

NFC 会保留兼容字符;NFKC 会把兼容等价形式合并,例如罗马数字「Ⅳ」可归一为字母「IV」、连字「ffi」可归一为「ffi」。这有助于合并统计,却不保证适合代码、数学或需要保留原貌的文本;必须先定义可接受的 N(x)。

Byte-level 与 byte fallback 不是同一机制

tiktoken 一类 byte-level BPE 以 256 个字节为基础字母表,因此覆盖任意 UTF-8 文本;byte fallback 则只在普通 piece 无法覆盖时退回字节。若两者都没有,未登录字符仍可能变成 <unk>。三种设计的长度与可读性不同。

特殊 Token 是协议,不是普通字符串

角色边界、工具调用和图像占位符必须被原子识别,并与 Chat Template、训练 Loss Mask 和服务端解析一致;BOS、EOS、PAD 也可以由配置禁用或改 ID。若用户文本能意外注入这些边界,问题已经从切词升级为协议安全。

多语言验收表

不要只报一个 tokens / character 平均数。至少按语言、脚本和领域分别给出 Token 数 / 字符数、Token 数 / UTF-8 字节数、p50 / p95 长度、byte fallback 或 <unk> 比例、数字与代码回归集,以及同义翻译对的长度比;采样权重与去重规则也要随版本留档。

06 · 为什么已有模型不能随便换词表

Token ID 是模型矩阵的行号,词表与权重必须联合迁移

假设旧词表中 ID 418 代表「低碳」,输入表第 418 行已经学成相关表示;生成式模型的输出投影也学会何时给第 418 维高分。新词表若让 418 代表「数据库」,shape 甚至可能完全不报错,语义却已经错位。

INPUT

Embedding 错位

相同文本产生新 ID,或相同 ID 指向新 piece,都会让模型查到错误向量;扩容时输入矩阵必须增加对应行。

OUTPUT

LM Head 错位

Decoder LM 的输出维度通常也对应词表;若权重未绑定,输出矩阵要单独扩展。Encoder-only 分类模型则未必有同构 LM Head。

PROTOCOL

模板与边界错位

BOS / EOS、角色和工具 ID 改变,会破坏训练时形成的消息边界、Loss Mask、停止条件与服务端解析。

可以扩词,但不能只改 JSON

保留旧 piece→ID 是底线;随后扩展输入表及未绑定的输出表,为新行初始化,用覆盖新 piece 的数据继续训练,并重做旧任务与协议回归。即使所有旧 ID 不变,新 piece 也会抢走原来由多个旧 piece 表示的文本,因此旧文本的切分仍可能改变

1 · 先锁旧合同

导出旧 piece→ID、特殊 ID、Normalizer / PreTokenizer / Decoder、Chat Template、runtime 版本、checksum 与黄金编码;明确哪些旧文本必须逐 ID 不变。

2 · 再做矩阵手术

只追加新 ID,不复用旧行;按模型是否 tied weights 扩展一份或两份矩阵,记录新行初始化方法,并同步 config 中的 vocab size 与特殊 ID。

3 · 继续训练与对照

让新行获得足够梯度,同时监控旧语言、旧任务和旧协议是否退化。只证明新词能编码,不等于模型理解或会稳定生成它。

4 · 版本化发布与回滚

模型 checkpoint、Tokenizer bundle、模板、服务端解析器和黄金集作为一个 release manifest 发布;灰度对比长度、质量、延迟与停止行为,保留整包回滚。

发布前最小测试集

用黄金样本锁住编码契约

保存中文、英文、emoji、组合字符、兼容字符、数字、小数、URL、代码缩进、超长串和特殊 Token;逐条断言规范化结果、pieces、IDs、是否加边界、decode 结果与产物 checksum。若系统暴露原始字节 API,再另测 malformed UTF-8 / 非法字节策略;只接收 Unicode 字符串的 API 不应凭空声称“支持非法字节”。

RESEARCH LEDGER

一手来源与证据边界

优先使用论文、官方文档、官方模型卡和代码仓库。页面中的数字只代表来源所述设置,不自动外推到其他模型与数据。

R01
Neural Machine Translation of Rare Words with Subword UnitsSennrich, Haddow & Birch · ACL 2016

把 BPE 引入神经机器翻译的经典工作;核对字符序列、词尾边界、频繁相邻对与固定合并操作。

R02
Subword Regularization: Improving Neural Network Translation Models with Multiple Subword CandidatesTaku Kudo · ACL 2018

Unigram 子词模型、候选切分与子词采样的原始论文。

R03
SentencePiece: A simple and language independent subword tokenizer and detokenizer for Neural Text ProcessingKudo & Richardson · EMNLP 2018

从原始句子训练、把空白显式化以及语言无关编码;可逆性须与规范化边界一起理解。

R04
google/sentencepieceProject repository · accessed 2026-07-15

核对 BPE / Unigram、子词采样、默认规范化,以及 .model 自包含、默认编码不依赖 .vocab。仓库明确声明并非 Google 官方产品。

R05
openai/tiktokenOpenAI repository · accessed 2026-07-15

核对 byte-level BPE、mergeable ranks、任意文本覆盖、可逆解码与特殊 Token 配置边界。

R06
Unicode Standard Annex #15: Unicode Normalization FormsUnicode 17.0.0 · Revision 57 · 2025-07-30

区分 NFC 与 NFKC,并核对兼容规范化会抹去部分格式乃至语义区别的官方警告。

R07
Language Model Tokenizers Introduce Unfairness Between LanguagesPetrov et al. · arXiv:2305.15425 · 2023

多语言 Tokenizer 长度差异的实证来源;用于说明平均压缩率会掩盖语言间成本差异。

R08
Scaling Laws with Vocabulary: Larger Models Deserve Larger VocabulariesTao et al. · arXiv:2407.13623 · 2024

核对词表大小需要与模型、数据和算力共同选择,而不是沿用固定经验值。

R09
Tokenizers: ComponentsHugging Face · official documentation · accessed 2026-07-15

核对通用 Tokenizer 流水线中的 Normalizer、PreTokenizer、Model、PostProcessor 与 Decoder 职责。