赞
踩
BPE是一种数据压缩算法的简单形式,数据中最常见的连续字节对被替换成该数据中不存在的字节。BPE的主要目标就是使用最少的token数目来表示一个corpus
在 A New Algorithm for Data Compression中首次提出
样例:
aaabdaaabac
需要 encoded(compressed)aa
是最长出现的,因为我们用 Z
来代替,Z=aa
ZabdZabac
ab
,我们用 Y=ab
来代替ZYdZYac
ZY
, 我们用 X=ZY
来进行代替XdXac
,这不能够再被压缩了,因为没有字节对出现多于一次我们按照逆向的方式进行解压
BPE保证最常见的词在词典中以 single token 进行表示,罕见的词被拆分成 subword tokens,这与subword-based tokenization是相同的
假定我们有个 corpus 包含下面这些词(基于空格做了pre-tokenization之后的):
{“old”: 7, “older”: 3, “finest”: 9, “lowest”: 4}
我们为每个词的后面加上 token </w>
{“old”: 7, “older”: 3, “finest”: 9, “lowest”: 4}
</w>
为词加上边界,算法才知道词是在哪里结束的下一步,我们将每个词拆分成字符,并计算他们的出现次数,初始结果如下:
BPE算法就是要找出出现最频繁的对,然后合并它们,依次循环,直到达到了循环限制或者token限制。
这里我们将字符看作是字节
Iterations:
Iteration 1:我们从第二频繁的字母 e
开始(因为第一个是 </w>
),与 e
共同出现最多的是 s
(9 + 4 = 13次),因此我们合并成 es
并添加到词汇表中,同时更新单独的 e
和 s
的出现次数
Iteration 2:现在,最常出现的是 es
和 t
,一共出现了 13 次。因此我们合并成 est
,添加到词汇表中,并更新 es
和 t
的出现次数
**Iteration 3:**现在,最常出现的是 est
和 </w>
,一共出现了 13 次。因此我们合并成 est</w>
</w>
是很重要的。这帮助算法理解 highest
和 estimate
的区别,他们两个的 est
一个出现在开头,一个出现在结尾,合并上 </w>
,这两种 est
才会做不同的处理**Iteration 4:**现在,出现次数最多的是 o
和 l
,一共出现 10 次,我们合并成 ol
**Iteration 5:**现在,出现次数最多的是 ol
和 d
,一共出现 10 次,我们合并成 old
从上表中,我们可以看到 f,i,n
的出现次数都是 9,但是这三个字母都只在一个单词中出现了,所以我们不再进行合并,我们停止 Iteration
在实际中,词汇表中的 token 随着 iteration 会先增加再减少,停止 Iteration 的准则可以是 tokens 的个数或者 Iteration 的次数
对 decode 来说,简单将所有 token 何在一起就好了
encoded sequence:[“the”, “high”, “est”, “range”, “in”, “Seattle”]
decoded:[“the”, “highest”, “range”, “in”, “Seattle”]
</w>
对于 encode 新的数据,也很简单,但是计算量比较大
通常情况下,词汇表很大,但是也有一些没见过的词。实践中,我们将 pre-tokenize 后的词存在字典中。我们应用上述编码方法对 unknown words进行tokenization,并将新单词的tokenization添加到我们的字典中以供将来使用
参考:Byte-Pair Encoding: Subword-based tokenization | Towards Data Science
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。