GPT-2/GPT-4 的 Tokenization 方案,Regex 预处理与 tiktoken 库
在上一章,我们实现了基础的 BPE 算法。但 OpenAI 在 GPT-2 中并没有直接使用朴素的 BPE,而是做了一个重要的改进:Regex 预处理。
考虑这样一个场景:单词 “dog” 在文本中频繁出现,但总是伴随不同的标点符号:
dog.
dog!
dog?
dog,
朴素的 BPE 可能会将这些组合都合并成单独的 tokens:
token_123 = "dog."
token_124 = "dog!"
token_125 = "dog?"
token_126 = "dog,"
这导致了两个问题:
词汇表浪费:同一个单词的不同标点组合占用了多个 token 位置,浪费了有限的词汇表空间。
语义混淆:单词的语义和标点符号的语义被混在一起,模型需要学习它们之间的关系。
GPT-2 的做法是:在应用 BPE 之前,先用正则表达式将文本分割成块。
核心思想:
防止跨类别合并:不允许 BPE 跨越某些边界进行合并,比如:
GPT-2 使用的正则表达式(简化版):