GPT-2/GPT-4 的 Tokenization 方案,Regex 预处理与 tiktoken 库

GPT-2 的 Tokenization 方案

在上一章,我们实现了基础的 BPE 算法。但 OpenAI 在 GPT-2 中并没有直接使用朴素的 BPE,而是做了一个重要的改进:Regex 预处理

朴素 BPE 的问题

考虑这样一个场景:单词 “dog” 在文本中频繁出现,但总是伴随不同的标点符号:

dog.
dog!
dog?
dog,

朴素的 BPE 可能会将这些组合都合并成单独的 tokens:

token_123 = "dog."
token_124 = "dog!"
token_125 = "dog?"
token_126 = "dog,"

这导致了两个问题:

词汇表浪费:同一个单词的不同标点组合占用了多个 token 位置,浪费了有限的词汇表空间。

语义混淆:单词的语义和标点符号的语义被混在一起,模型需要学习它们之间的关系。

Regex 预处理的解决方案

GPT-2 的做法是:在应用 BPE 之前,先用正则表达式将文本分割成块

核心思想:

防止跨类别合并:不允许 BPE 跨越某些边界进行合并,比如:

GPT-2 使用的正则表达式(简化版):