WordPiece分词如何帮助NLP有效处理罕见单词问题?

57

我看到像BERT这样的NLP模型使用WordPiece进行标记化。在WordPiece中,我们将标记(例如playing)拆分为play##ing。它被提到可以覆盖更广泛的未登录词汇(OOV words)。请问有人能帮我解释一下WordPiece标记化实际上是如何完成的,以及它如何有效地处理罕见/未登录词汇?

2个回答

76
WordPiece和BPE是NLP任务中将单词分割为子单词级别的两种类似且常用的技术。在两种情况下,词汇表都使用语言中的所有单个字符进行初始化,然后迭代地将词汇表中最常见/可能的符号组合添加到词汇表中。
考虑原始论文中的WordPiece算法(由我稍作修改):
1. 使用文本中的所有字符初始化单词单位库存。 2. 使用来自1的库存在训练数据上构建语言模型。 3. 通过将当前单词库存中的两个单元组合起来生成一个新的单词单位,以使单词单位库存增加一个。从所有可能的单词单位中选择新的单词单位,该单词单位添加到模型时对训练数据的可能性增加最多。 4. 转到2,直到达到预定义的单词单位限制或可能性增加低于某个阈值为止。 BPE算法仅在步骤3中有所不同,其中它只是选择将下一个最频繁出现的对组合成为新的单词单位,这些对是当前子单词单位集中的下一个最频繁出现的对。
例子:
输入文本:she walked . he is a dog walker . i walk
前3个BPE合并:
  1. w a = wa
  2. l k = lk
  3. wa lk = walk

因此,在这个阶段,您的词汇表包括所有初始字符,以及 walkwalk。通常情况下,您会为一定数量的合并操作执行此操作。

它如何处理罕见/未登录词?

非常简单,如果使用这种分割方法,则无法生成未登录词。任何在词汇表中不存在的单词都将被分解为子单元。同样地,对于罕见单词,鉴于我们使用的子单词合并数量有限,该单词将不会出现在词汇表中,因此它将被分成更常见的子单词。

这有什么帮助?

想象一下,模型看到了单词 walking。除非这个单词在训练语料库中至少出现几次,否则模型就不能很好地学习如何处理这个单词。然而,它可能有单词 walkedwalkerwalks,每个单词只出现了几次。如果没有子单词分割,模型将把所有这些单词视为完全不同的单词。

然而,如果这些被分割为walk@@ ingwalk@@ ed等,注意到它们现在都有walk@@的共同点,在训练时会更频繁地出现,模型可能能够更多地学习相关内容。

5
OOV词汇并非完全不可能存在。假设你构建了一个只使用ASCII字符的模型进行训练,在解码时,你输入一个从未出现过的中文字符,那么它就会成为OOV词汇。虽然OOV词汇很少见,但并非不可能存在。 - J Quinn
好的,感谢澄清。我的假设是分词是在要分词的相同文本上学习的,但这当然并不总是正确的。 - Proyag
11
请问您能否详细说明“在所有可能的单词单元中选择一个,当将其添加到模型中时,它可以最大程度地增加训练数据的可能性”是什么意思?我在很多地方看到这句话的引用,但没有人详细解释它的确切含义。 - Devstr
训练数据上的可能性是基于频率的,这意味着您可以通过计算训练集中所有组合出现的次数来决定新单词单位。最常见的组合被添加,然后重复该过程。 @Devstr - JohnDoe
2
@JohnDoe 我认为这只适用于BPE算法,而不适用于WordPiece。我认为作者指的是语言模型的可能性。 - Bullfraud

8

WordPiece非常类似于BPE。

作为例子,假设在预分词之后,已确定以下单词及其频率的集合:

("hug", 10), ("pug", 5), ("pun", 12), ("bun", 4), ("hugs", 5)

因此,基本词汇表是["b", "g", "h", "n", "p", "s", "u"]。将所有单词分解为基本词汇符号,我们可以得到:
("h" "u" "g", 10), ("p" "u" "g", 5), ("p" "u" "n", 12), ("b" "u" "n", 4), ("h" "u" "g" "s", 5)

BPE算法会计算每种可能的符号对出现的频率,并选择出现最频繁的符号对。在上述示例中,"h"后跟"u"出现了10+5=15次(在10个"hug"和5个"hugs"中各出现10次和5次)。然而,最常见的符号对是"u"后跟"g",总共出现了10+5+5=20次。因此,分词器学到的第一条合并规则是将所有的"u"符号后面跟着一个"g"符号的组合在一起。接下来,"ug"被添加到词汇表中。单词集合就变成了:
("h" "ug", 10), ("p" "ug", 5), ("p" "u" "n", 12), ("b" "u" "n", 4), ("h" "ug" "s", 5)

BPE首先识别出下一个最常见的符号对。它是"u"后面跟着"n",出现了16次。将"u""n"合并成"un"并添加到词汇表中。接下来最频繁的符号对是"h"后面跟着"ug",出现了15次。再次合并这个符号对,就可以将"hug"添加到词汇表中。
此时,词汇表为["b", "g", "h", "n", "p", "s", "u", "ug", "un", "hug"],我们的唯一单词集表示为:
("hug", 10), ("p" "ug", 5), ("p" "un", 12), ("b" "un", 4), ("hug" "s", 5)

假设字节对编码训练在此时停止,那么学习到的合并规则将应用于新单词(只要这些新单词不包括未在基础词汇表中的符号)。例如,单词“bug”将被分词为["b", "ug"],但“mug”将被分词为["", "ug"],因为符号“m”不在基础词汇表中。一般来说,像“m”这样的单个字母不会被替换为“<unk>”符号,因为训练数据通常包括每个字母至少出现一次,但对于非常特殊的字符(如表情符号)可能会发生这种情况。
基础词汇表大小加上合并数量是要选择的超参数。例如,GPT的词汇表大小为40,478,因为它们有478个基本字符,并选择在40,000次合并后停止训练。
WordPiece首先将词汇表初始化为包括训练数据中出现的每个字符,并逐渐学习一定数量的合并规则。与BPE不同,WordPiece不选择最频繁的符号对,而是选择一旦添加到词汇表中就最大化训练数据的概率的符号对。参考前面的例子,最大化训练数据的概率相当于找到符号对,其概率除以其第一个符号后跟其第二个符号的概率在所有符号对中最大。例如“u”后面跟“g”只有在"ug"除以"u""g"的概率比其他任何符号对都大时才被合并。直观地说,WordPiece与BPE略有不同,它评估合并两个符号所失去的内容以确保值得这样做。
此外,BPE将@@放在标记末尾,而WordPiece将##放在开头。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接