有人能帮助解释bpe模型背后的基本概念吗?除了本论文,目前还没有这么多的解释。
到目前为止,我所知道的是,它通过将稀有和未知的单词编码为子词单元序列来实现开放词汇表上的NMT模型翻译。
但我想了解一下它是如何工作的,而不用看这篇论文。
发布于 2020-12-17 00:03:20
NLP中的字节对编码是一种中间解决方案,与基于单词的标记相比,它减少了词汇表的大小,并在不使用基于长字符的标记的情况下覆盖单个令牌中尽可能多的频繁出现的字符序列。
最初,每个字符都由一个令牌引用,合并操作的数量是构建BPE词汇表的一个超参数。
让我们考虑一下这句话:
“他养了只猫”和“猫坐在垫子上”
我们可以建立如下字符的词汇表:
“a”、“c”、“d”、“e”、“g”、“h”、“i”、“m”、“n”、“o”、“s”、“t”
现在,我们可以列出这些对及其出现的情况:
he: 3 (he, the*2)
ha: 1 (had)
ad: 1 (had)
ca: 2 (cat*2)
at: 3 (cat*2, mat)
th: 2
is: 1
si: 1
it: 1
ti: 1
in: 1
ng: 1
on: 1
ma: 1现在,由于“he”和“at”在词汇表中出现的频率最高,所以可以将其组合(合并操作)并添加到词汇表中。
更新词汇:“a”、“c”、“d”、“e”、“g”、“h”、“i”、“m”、“n”、“o”、“s”、“t”、“he”、“at”
现在,如果词汇表中较长的部分可以使用单个标记来引用,即“he”或“at”是使用单个标记而不是两个字符标记来表示的。
例如:句子:
可以按以下方式标记:
'he','h','a','d','a','c','at''he',c,'at','i','s','s','i','t','t','i','n','g','o','n','t','he','m','at'此外,可以通过识别最频繁出现的对来重复这一过程:
ha: 1 (had)
ad: 1 (had)
c'at': 2 (cat*2)
th: 2
is: 1
si: 1
it: 1
ti: 1
in: 1
ng: 1
on: 1
m'at': 1由于c'at'这个词的出现频率最高,所以它可以组合成一个新词汇,如下所示:
‘、'c’、'd‘、'e’、'g‘、'h’、'i‘、'm’、'n‘、'o’、's‘、't’、'he‘、'at’、'cat‘
因此,新的令牌化:
'he','h','a','d','a','cat''he','cat','i','s','s','i','t','t','i','n','g','o','n','t','he','m','at'因此,随着合并操作的增加,词汇表大小增加,但用于表示给定文本的标记数量减少。
发布于 2021-08-02 15:18:45
BPE是一种自动处理未知词问题(或具有丰富形态学的语言,需要处理单词级别以下的结构)的三种算法之一:字节对编码、统一语言建模、WordPiece,以及BPE标记化模式有两个部分:一个令牌学习者和一个令牌分段器。
令牌学习者接受一个原始的训练语料库(有时会被大致地预先分隔成单词,例如空格),并归纳出一组标记。令牌分段器接受一个原始测试语句,并将其分割为词汇表中的标记。
该算法在最后的词汇表中有一个参数k,表示k合并或k个新符号。
让我们使用这一行来训练BPE:Pen Penapple Apple Pen是从PPAP改编而来的,并展示如何将测试数据中的未知/罕见的“单词”penapplepen和applepen自动简化为已知的子词单元。
学习

首先,经过一些预处理(case映射、基于正则表达式的预标记化和添加字尾符号_)之后,我们得到以下字符串C(作为我们的语料库)及其频率(频率: string):
2: p e n _
1: p e n a p p l e _
1: a p p l e _ 词汇V是_,p,e,n,a,l
现在,让我们在上面的伪代码中运行for-循环的第一轮:
p, e <- most frequent pair in {(p, e): 3, (e, n): 3, (n, _): 2, (a, p): 2, (p, p): 2, (p, l): 2, (l, e): 2, (e, _): 2, (n, a): 1}
pe <- p + e
[_, p, e, n, a, l, pe] <- [_, p, e, n, a, l] + pe
C becomes this:
2: pe n _
1: pe n a p p l e _
1: a p p l e _ 让我们按照以下方式运行第二个合并:
p, e <- most frequent pair in {(pe, n): 3, (n, _): 2, (a, p): 2, (p, p): 2, (p, l): 2, (l, e): 2, (e, _): 2, (n, a): 1}
pen <- pe + n
[_, p, e, n, a, l, pe, pen] <- [_, p, e, n, a, l, pe] + pen
C becomes this:
2: pen _
1: pen a p p l e _
1: a p p l e _ 如果我们取k作为N >= 9,下面是下一个合并:
Merge Current V
(pen, _) [_, p, e, n, a, l, pe, pen, pen_]
(a, p) [_, p, e, n, a, l, pe, pen, pen_, ap]
(ap, p) [_, p, e, n, a, l, pe, pen, pen_, ap, app]
(app, l) [_, p, e, n, a, l, pe, pen, pen_, ap, app, appl]
(appl, e) [_, p, e, n, a, l, pe, pen, pen_, ap, app, appl, apple]
(apple, _) [_, p, e, n, a, l, pe, pen, pen_, ap, app, appl, apple, apple_]
(pen, apple_) [_, p, e, n, a, l, pe, pen, pen_, ap, app, appl, apple, apple_, penapple_]我们发现,经过9次迭代合并后,C中没有相邻对。
解析
令牌解析器只是在测试数据上运行--我们从培训数据中学到的合并--按照我们学习的顺序贪婪地运行。(因此,测试数据中的频率不起作用,只是训练数据中的频率)。
在这个步骤中,我们使用以下句子测试解析器:Applepen PenapplePen。与往常一样,我们进行训练步骤中的预处理,并获得:
a p p l e p e n _
p e n a p p l e p e n _ 并遵循合并顺序:
(p, e), (pe, n), (pen, _), (a, p), (ap, p), (app, l), (appl, e), (apple, _), (pen, apple_)首先,(p,e)。我们将p和e合并到测试数据中,得到:
a p p l e pe n _
pe n a p p l e pe n _ 第二,(pe,n)和get:
a p p l e pen _
pen a p p l e pen _ .
在进行了9轮合并之后(如果k <= 9,我们只是在这一步中应用了第一个k合并;如果k是2,请参考这个答案):
apple pen_
pen apple pen_最后标记的测试语句是苹果、pen_、pen、apple、pen_,以及未知(在训练数据中未见)单词penapplepen也可以分离。
参考资料:
https://stackoverflow.com/questions/50583254
复制相似问题