Byte Pair Encoding 原理
BPE
是一种简单的数据压缩算法,它在1994年发表的文章“A New Algorithm for Data Compression”中被首次提出,是一种用于自然语言处理的子词切分算法。它的目标是找到一种最优的字符组合方式,使得整个数据集中不同单词的字符组合尽可能的少。这种算法最初被设计用于字节级的数据压缩,后来被应用于NLP。其核心思想是:
BPE每一步都将最常见的一对相邻数据单位替换为该数据中没有出现过的一个新单位,反复迭代直到满足停止条件。
举个例子:
假设我们有需要编码(压缩)的数据aaabdaaabac
。相邻字节对(相邻数据单位在BPE
中看作相邻字节对)aa
最常出现,因此我们将用一个新字节Z
替换它。我们现在有了ZabdZabac
,其中Z = aa
。下一个常见的字节对是ab
,让我们用Y
替换它。我们现在有ZYdZYac
,其中Z = aa
,Y = ab
。剩下的唯一字节对是ac
,它只有一个,所以我们不对它进行编码。我们可以递归地使用字节对编码将ZY
编码为X
。我们的数据现在已转换为XdXac
,其中X = ZY
,Y = ab
,Z = aa
。它不能被进一步压缩,因为没有出现多次的字节对。那如何把压缩的编码复原呢?反向执行以上过程就行了。
NLP实例
NLP中使用了上述算法的一个变体。首先来明确一下基础概念:token
可以理解为一个符号,就代表一个语言单位(就像单词,字符等);tokenize
的意思是把一个句子或长语料分成token
。
基础概念:
token
可以理解为一个符号,就代表一个语言单位(就像单词,字符等);tokenize
的意思是把一个句子或长语料分成token
。
BPE
确保最常见的词在token
列表中表示为单个token
,而罕见的词被分解为两个或多个subword tokens
,因此BPE
也是典型的基于subword
的tokenization
算法。
假设我们有一个语料库,其中包含单词(pre-tokenization
之后)—— old
, older
, highest
和 lowest
,我们计算这些词在语料库中的出现频率。假设这些词出现的频率如下:
{
“old”: 7, “older”: 3, “finest”: 9, “lowest”: 4}
让我们在每个单词的末尾添加一个特殊的结束标记</w>
。
{
“old</w>”: 7, “older</w>”: 3, “finest</w>”: 9, “lowest</w>”: 4}