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 t
l o
(3 次),o w
(3 次),w _
(2 次),e r
(1 次)...l o
→ lo
:lo w _ lo w e r _ lo w e s t
lo 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 是一种“自下而上”的分词方法,从字符开始,通过统计合并生成子词,逐步构建词表。它在大模型中很流行,因为它既能压缩词表,又能灵活处理各种语言和未知词。就像搭积木,从小块拼出大块,最终让模型理解“今天的天气很好”这样的句子。