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}
在每个单词的末尾添加“”标记以标识单词边界能够让算法知道每个单词的结束位置(因为我们统计相邻字符对时不能把分别位于两个单词中的字符对算进去),这有助于算法查看每个字符并找到频率最高的字符配对。稍后我们将看到“”也能被算作字符对的一部分。
接下来,我们将每个单词拆分为字符并计算它们的出现次数。初始token将是所有字符和</w>标记的集合。
| Number | Token | Frequency |
|---|---|---|
| 1 |

最低0.47元/天 解锁文章
357

被折叠的 条评论
为什么被折叠?



