01 Tokenizer · 前期准备

开始写 Tokenizer 之前:文本究竟如何变成 Token?

这是一篇预览记录,先分清项目里第一组容易混在一起的概念:Unicode 文本、UTF-8 字节、BPE 合并规则和模型最终收到的 Token ID 之间是什么关系。

预备记录——尚未通过代码验证

遇到了什么

语言模型接收的是整数 ID,而输入最初是人类可读的 Unicode 文本。在动手实现之前,我希望把两者之间的每一次转换都梳理清楚。

第一个风险是照着现有实现逐行复刻,却没有真正分清字符、字节、词表条目和 merge rank 分别由哪一层处理。

要解决的问题

为什么 GPT-2 从 UTF-8 字节和 byte-level BPE 出发,而不是直接把 Unicode 字符作为基础词表?encode 与 decode 必须保持哪些不变量?

目前的判断

从字节开始可以得到一个有限的基础符号集合,并覆盖任何合法的 UTF-8 输入,因此陌生字符不需要额外的未知字符回退机制。

BPE 再在字节之上学习可以反复复用的序列。这只是我现在的理解,要等它和 GPT-2 原始 encoder、往返测试的结果都对上,才算结论。

准备怎么验证

  1. 01

    往返测试

    使用 ASCII、中文、日文、emoji、空白符和混合文本检查 decode(encode(text)) === text。

  2. 02

    参考实现

    使用 GPT-2 原始词表与 merge 规则,对比 Token ID 和解码后的文本。

  3. 03

    失败样例

    记录非法字节、重复空白、组合字符和边界情况,不用兜底逻辑把问题隐藏起来。

目前的结论

目前还没有结论。等 Tokenizer 写完、上面的验证都跑过,我再来更新这里。

下一步

阅读原始 encoder 实现,画出完整的 encode/decode 数据流,并在实现 BPE merge 之前先写出第一组会失败的往返测试。

返回项目