Byte-Pair Encoding(BPE,字节对编码)是一种分词(tokenization)方法,最初用于数据压缩,后来被广泛应用到自然语言处理(NLP)中,尤其是在大语言模型的分词器里。它的核心思想是通过统计字符或子词的出现频率,逐步合并最常见的一对(pair),生成一个更紧凑且灵活的词表。简单来说,BPE 从字符开始,慢慢“拼凑”出常见的词或词片段,既能处理已知词,又能适应新词。
BPE 的过程可以分成两个阶段:训练词表和分词应用。
假设语料库是:“low lower lowest”:
_ 表示):l o w _ l o w e r _ l o w e s tl o(3 次),o w(3 次),w _(2 次),e r(1 次)...l o → lo:lo w _ lo w e r _ lo w e s tlo w(3 次),w _(2 次),e r(1 次)...lo w → low:low _ low e r _ low e s t最终词表可能是:[l, o, w, e, r, s, t, _, lo, low, er, est]。
训练好词表后,BPE 用这个词表把新文本切成 token:
low → 成功,得 low。er,匹配 er → 成功。[low, er]中文没有天然的空格,所以 BPE 通常直接从单个汉字开始合并。假设语料库有“今天的天气很好”和“昨天的天气不好”:
今 天 的 天 气 很 好 和 昨 天 的 天 气 不 好天 的(2 次),天 气(2 次),的 天(2 次)...天 气 → 天气:今 天 的 天气 很 好 和 昨 天 的 天气 不 好的 天气 → 的天气(假设频率够高)。最终词表可能是:[今, 天, 的, 气, 很, 好, 昨, 不, 天气, 的天气]。
[今天, 的天气, 很, 好](假设“今天”和“的天气”在词表里)。[人工, 智, 脑],不至于完全无法处理。[play, ing](如果词表有这两个)。[人工, 智能] 或 [人, 工, 智, 能](取决于词表)。[天, 气]。“今天的天气很好。”:
[今天, 的, 天气, 很, 好](5 个 token)。[今, 天, 的, 天, 气, 很, 好](7 个 token)。BPE 是一种“自下而上”的分词方法,从字符开始,通过统计合并生成子词,逐步构建词表。它在大模型中很流行,因为它既能压缩词表,又能灵活处理各种语言和未知词。就像搭积木,从小块拼出大块,最终让模型理解“今天的天气很好”这样的句子。