自然语言处理

字节对编码(byte-pair encoding)

/ BITE-pair en-KOH-ding /

字节对编码,简称 BPE,是一种把词拆成可复用片段的巧办法,它落在两个糟糕极端之间。把每个完整的词都当作一个词元,词表会膨胀,遇到任何没见过的词还是会卡住。把每个单独的字母都当作词元,序列又会长得离谱。BPE 找到了一条中间路:常见的词保持完整,生僻的词则拆成熟悉的片段——于是「tokenization」可能变成「token」+「ization」,都是模型早已照面多次的片段。

它的构建过程妙在简单。先把文本看作一个个单独的字符。然后反复地找出最频繁的相邻字符对,把它合并成一个新单元,一遍又一遍,做固定的轮数。像「th」这样常见的字母对会很早合并;频繁出现的整词最终会浮现;生僻词则停留为零星几个子词块。在训练文本上学到的这些合并规则,随后会施用于任何新文本——这意味着 BPE 永远不会遇到一个真正未知的词,因为最坏情况下它总能退回到单个字符。

这很要紧,因为 BPE(以及 WordPiece 等近亲)几乎是每一个现代大语言模型底层的分词器。它掌控着词表大小,能从容处理新词和拼错的词,还能跨越多种语言。有一个值得知道的诚实小瑕疵:这些切分由原始频率驱动,而非由意义驱动,所以 BPE 有时会在无视真实词法的地方把词切开——好用、稳健,但在语言学上并不齐整。

生造词「unhappiness」很可能从没被整体见过,但 BPE 把它拆成已知的片段:「un」+「happi」+「ness」。模型认得每一块,于是这个新词便不再是个彻底的谜。

生僻词或新词都退回到熟悉的子词片段——于是没有什么是彻底未知的。

BPE 的合并由原始频率驱动,而非由意义驱动,所以它的切分不总能对上真实的词根和前缀。它最大的优点是稳健:它总能退回到字符,因此永远不会撞上一个真正未知的词。

又称
BPEsubword tokenization字节对编码子词切分subword encoding