自然语言处理中常见的字节编码对(Byte-Pair Encoding,BPE)简介
字节对编码(Byte Pair Encoder,BPE),又叫digram coding,是一种在自然语言处理领域经常使用的数据压缩算法。在GPT系列模型中都有用到。主要是将数据中最常连续出现的字节(bytes)替换成数据中没有出现的字节的方法。该算法首先由Philip Gage在1994年提出。在这篇博客中我们将简单介绍一下这个方法。
基于子词的标记化
标记化(tokenizer)是将自然语言转变成标记的过程,它将文本转换为模型可以处理的数据。模型只能处理数字,因此标记化(Tokenizer)需要将我们的文本输入转换为数字数据。
自然语言处理的基本对象是单词,这其中包括三类,一种是word(单词),一种是subword(子词),还有一种是character(字符)。第一种就是我们英语处理中常见的单词,用空格分开的。但是算法的处理要灵活的多,因为单词是由单个字母组成的,单个字母也叫character。除此之外,为了追求处理速度与语义的均衡,NLP领域还会处理一种叫Subword(子词)的对象。这是一种介于word和character之间的处理粒度。
基于子词的标记化(tokenizer)是介于词和基于字符的标记化之间的一种解决方案。
基于单词的处理面临的问题包括:非常大的词汇量,大量的OOO标记,以及非常相似的词的不同含义。而基于字符的标记化的问题是非常长的序列和意义不大的单个标记。
基于子词的标记化算法并不把常用的词分成更小的子词。相反,它将罕见的词分割成更小的有意义的子词。例如,”boy “不被分割,但 “boys “被分割成 “boy “和 “s”。这有助于模型了解到 “boys “这个词是用 “boy “这个词形成的,其含义略有不同,但都是同一个词根。
字节编码对(Byte Pair Encoder,BPE)就是一种子词处理的方法。其它一些流行的子词标记化算法包括WordPiece、Unigram和SentencePiece。而BPE用于GPT-2、RoBERTa、XLM、FlauBERT等语言模型中。这些模型中有几个使用空间标记化作为预标记化方法,而有几个使用Moses, spaCY, ftfy提供的更高级的预标记化方法。
字节编码对(Byte Pair Encoder,BPE)简介
主要是将数据中最常连续出现的字节(bytes)替换成数据中没有出现的字节的方法。思想很简单,但是很好用。
维基百科中有个简单的例子,假设我们有如下的数据:
aaabdaabac
可以看到,上述数据中字节对“aa”出现得最频繁。那么,我们可以使用数据中没有出现过一个字节,例如“Z”来替代,结果如下:
ZabdZabac
可以看到这里的Z=aa
,接下来,ab依然是最长出现的连续字节对,那么再用一个新的字节“Y”代替得到如下结果:
ZYdZYac
显然,“ZY”又是一个最频繁出现的连续字节对,那么继续用心的字节“X”代替,得到:
XdXac
其中:
X=ZY
Y=ab
Z=aa
到这里,已经无法继续压缩了。如果要还原数据,只需要把上述过程反过来即可。
总结
为了以最有效的方式表示语料库,BPE在每次迭代时都会通过查看其频率来检查每一个潜在的合并选项。因此,是的,它遵循一种贪婪的方法来优化可能的最佳解决方案。
总之,BPE是最广泛使用的子词标记化算法之一,尽管它是贪婪的,但它具有良好的性能。
参考内容:
https://towardsdatascience.com/byte-pair-encoding-subword-based-tokenization-algorithm-77828a70bee0
https://en.wikipedia.org/wiki/Byte_pair_encoding
欢迎大家关注DataLearner官方微信,接受最新的AI技术推送
