BPE (字节对编码)
一种基于高频字节 (字符) 组合将文本拆分为子词单元的算法。被 GPT、BERT 等大语言模型的分词器广泛采用。
BPE (Byte Pair Encoding,字节对编码) 最初由菲利普·盖奇于 1994 年作为数据压缩算法提出。2016 年塞内里希等人将其应用于机器翻译的子词切分后,BPE 成为自然语言处理领域的标准分词方法。GPT 系列、BERT、LLaMA 等当前主流大语言模型几乎都采用了 BPE 或其衍生方法。
BPE 的训练算法直观易懂。首先将训练文本拆分为字符 (或字节) 级别,然后找出最频繁相邻的字符对,将其合并为一个新的 token。重复这一合并过程直到词表大小达到目标值。例如从"low""lower""lowest"中,"l"+"o"→"lo","lo"+"w"→"low",高频对被依次合并。
BPE 的优势在于解决了未登录词 (out-of-vocabulary) 问题。基于词的分词方式无法处理训练数据中未出现过的词,而 BPE 可以将任何词表示为子词的组合,因此不会产生未登录词。"unhappiness"可以被拆分为"un"+"happiness"或"un"+"happ"+"iness",每个子词都在词表中。
中文的 BPE 分词有其特殊之处。中文没有空格分隔词语,因此有两种方案:先用分词工具 (如 jieba) 进行词语切分再应用 BPE,或者直接从字符级别学习 BPE。GPT-4 的分词器 (cl100k_base) 采用后一种方案,一个汉字可能独立成为一个 token,连续的常用词也可能合并为一个 token。
token 数与字符数的关系因语言而异。英文平均 1 个 token ≈ 4 个字符,而中文约 1 个 token ≈ 1 至 2 个字符。也就是说,表达相同内容的文本,中文消耗的 token 数约为英文的 2 至 3 倍。GPT-4 的 128,000 token 限制,对应英文约 50 万字符,而中文约 15 至 20 万字符。
从字符计数的角度看,在 AI 时代需要同时关注"字符数"和"token 数"。设计 ChatGPT 的提示词时,token 数才是真正的约束。要用更少的 token 表达相同的意思,就需要避免冗余表达,写出信息密度高的文本。理解 BPE 的工作原理,有助于判断哪些表达方式的 token 效率更高。