分词
分词将文本变成语言模型输入的整数 ID。本课在浏览器运行真实 GPT-2(r50k)字节级 BPE:先预切分,再从字节出发,按已学合并优先级组合,最后查询词表 ID。
子词像积木,词表不必收录每个完整词,只要基础字节齐全,就能将新词、拼写错误和 emoji 拆成已有片段。能编码不代表模型理解内容,片段过多也有上下文成本。
预切分与按 rank 合并
先用正则把文本分成近似单词、数字串、标点串等 piece。GPT-2 的常见前导空格会与后词同片段,所以 the 与 the 不同;显示用 Ġ 标出该空格。具体空白序列由正则处理,不能把所有空白一概当作跟随词的一个字符。
合并不跨 piece 边界。在每个 piece 中先把每个 UTF-8 字节视作符号,再查约 50,000 条合并规则。rank 越小优先级越高,这由已有表决定,不由当前词频决定。
本课每个动画步骤选当前最低 rank 的相邻对,合并一次,再搜索。无可用规则时停止,将剩余片段映射到 ID。选择是按 rank 贪心,不是从左向右。有效学习表里,新符号参与的后续规则依赖此前符号,rank 不会倒退;并列重复规则仍需确定的位置约定。不同实现可一次处理同一对的多个非重叠出现,最终以实际分词库结果核对。
逐步演示
默认 tokenization 是一个 piece,十二个 ASCII 字节就是十二个字母:
t o k e n i z a t i o n
按优先级合并的十步如下:
(o, n) → on
(a, t) → at
(e, n) → en
(i, on) → ion
(at, ion) → ation
(o, k) → ok
(i, z) → iz
(iz, ation) → ization
(ok, en) → oken
(t, oken) → token
这些步骤交错构造后缀和词干:ation 已成形,token 还未完成。最终 [token, ization] 之间没有可用合并,所以停止。十二字母的一词变为 两个 token。
GPT-2 的 50,257 项词表给出 token → 30001、ization → 1634,模型输入为 [30001,1634],随后由 ID 查学得嵌入,不是让网络直接对文本字形计算。ization 可以在其他词中复用,具体是否出现仍取决于上下文和规则。
画布窄格是单字节,合并后变宽,左侧日志记录合并和全局 rank。格宽只帮助读片段,不表示词向量长度或语义重要性。
为什么使用子词
固定纯词级词表若无回退,会遇到未知词;纯字符表示通常序列更长,而且字符集也需明确。子词在常见组合与基础单元之间折中。字节级 BPE 有全部 256 字节基础,可覆盖有效 UTF-8 文本;特殊 token 和输入校验仍有接口规则。
例如新造词 fizzlepuff 可分为 f + izzle + puff,🦄 从 UTF-8 的多个字节形成片段,不需要未知词占位。每个最终 token 不一定单独对应完整 Unicode 字符,解码整串才能恢复文字。其他模型可能采用别的分词家族,不是所有现代模型都用这一种 BPE。
常见英语词可能一个 token,罕词、拼错词、带重音字母或 emoji 可能多个;不能把字符数直接当 token 数。上下文窗口和许多 API 用 token 计量,但具体用量和计费还应按实际模型规则计算。本课只演示 GPT-2,不提供其他模型的价格或 token 保证。
这是应用规则;BPE 训练展示从语料建立规则。词表大小包括基础字节与特殊符号,不等于全都是合并规则。
边界情况
- 新词与 emoji:可回退到已知字节片段,能表示不等于短,也不等于理解。
- 空格:
the与the不同;fix the AI的 piece 边界保留fix、Ġthe、ĠAI的区分,不跨界合并。 - 大小写:
Hello与hello的字节不同,没有统一转小写。 - rank 优先:即使候选在词中间,最低 rank 也先执行。
- 单字节:已是基础 token,无须合并。
常见错误
- 以为一词一 token。默认例已经是一词两项,长短也不能单独决定数量。
- 从最左匹配开始合并,而不查全局可用 rank,会得到不符合本分词器的结果。
- 混淆可读片段与 ID。
token是文字展示,30001是此词表索引,再用于嵌入查询。 - 期待 ID 通用。另一个分词器的 30001 可指别的内容,没有统一词表。
- 忽略空白与大小写。它们改变字节序列,也可能改变 token 数和模型输入。
模型范围
使用真实 GPT-2 r50k、50,257 项词表,合并与 ID 对照实际库。其他模型的词表、特殊 token、预切分和算法可能不同,需要按具体分词器检查。本课的字节起步、优先级合并、映射整数,不能自动替代任意模型的 token 计算。