遇到了什么
语言模型接收的是整数 ID,而输入最初是人类可读的 Unicode 文本。在动手实现之前,我希望把两者之间的每一次转换都梳理清楚。
第一个风险是照着现有实现逐行复刻,却没有真正分清字符、字节、词表条目和 merge rank 分别由哪一层处理。
要解决的问题
为什么 GPT-2 从 UTF-8 字节和 byte-level BPE 出发,而不是直接把 Unicode 字符作为基础词表?encode 与 decode 必须保持哪些不变量?
目前的判断
从字节开始可以得到一个有限的基础符号集合,并覆盖任何合法的 UTF-8 输入,因此陌生字符不需要额外的未知字符回退机制。
BPE 再在字节之上学习可以反复复用的序列。这只是我现在的理解,要等它和 GPT-2 原始 encoder、往返测试的结果都对上,才算结论。
准备怎么验证
- 01
往返测试
使用 ASCII、中文、日文、emoji、空白符和混合文本检查 decode(encode(text)) === text。
- 02
参考实现
使用 GPT-2 原始词表与 merge 规则,对比 Token ID 和解码后的文本。
- 03
失败样例
记录非法字节、重复空白、组合字符和边界情况,不用兜底逻辑把问题隐藏起来。
目前的结论
目前还没有结论。等 Tokenizer 写完、上面的验证都跑过,我再来更新这里。