WordPiece 标记化如何帮助有效处理 NLP 中的稀有词问题?

How is WordPiece tokenization helpful to effectively deal with rare words problem in NLP?

我看到 BERT 等 NLP 模型利用 WordPiece 进行标记化。在 WordPiece 中,我们将 playing 拆分为 play##ing 。有人提到它涵盖了更广泛的词汇外 (OOV) 词。有人可以帮我解释一下 WordPiece 标记化实际上是如何完成的,它如何有效地处理有助于 rare/OOV 个单词?

WordPiece 和 BPE 是两种相似且常用的技术,用于在 NLP 任务中将单词分割成子词级别。 在这两种情况下,词汇表都使用语言中的所有单个字符进行初始化,然后将词汇表中符号的最多 frequent/likely 组合迭代添加到词汇表中。

考虑 original paper 中的 WordPiece 算法(我稍微修改了措辞):

  1. Initialize the word unit inventory with all the characters in the text.
  2. Build a language model on the training data using the inventory from 1.
  3. Generate a new word unit by combining two units out of the current word inventory to increment the word unit inventory by one. Choose the new word unit out of all the possible ones that increases the likelihood on the training data the most when added to the model.
  4. Goto 2 until a predefined limit of word units is reached or the likelihood increase falls below a certain threshold.

BPE算法仅在第 3 步不同,它简单地选择新词单元作为当前子词单元集中下一个最频繁出现的对的组合。

例子

输入文字:她走了。他是一个遛狗的人。我走路

前 3 个 BPE 合并

  1. w a = wa
  2. l k = lk
  3. wa lk = walk

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

它如何处理 rare/OOV 个单词?

很简单,用这样的分词方式,OOV词是不可能的。词汇表中没有出现的任何词都将被分解为子词单元。同样,对于稀有词,由于我们使用的子词合并数量有限,该词不会出现在词汇表中,所以它会被拆分成更频繁的子词。

这有什么帮助?

假设模型看到了 walking 这个词。除非这个词在训练语料库中至少出现过几次,否则模型无法很好地学习处理这个词。但是,它可能包含单词 walkedwalkerwalks,每个单词只出现几次。如果没有子词分割,所有这些词都会被模型视为完全不同的词。

但是,如果将它们分割为 walk@@ ingwalk@@ ed 等,请注意它们现在都有 walk@@ 的共同点,这在训练中会经常发生,模型或许能够了解更多。

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 次([=17= 的 10 次出现中有 10 次,"hugs" 的 5 次出现中有 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 首先初始化词汇表以包括训练数据中存在的每个字符,并逐步学习给定数量的合并规则。与 BPE 相比,WordPiece 不选择最频繁的符号对,而是选择最大化训练数据一旦添加到词汇表中的可能性的符号对。参考前面的示例,最大化训练数据的似然性相当于找到符号对,其概率除以其第一个符号后跟第二个符号的概率是所有符号对中最大的。例如。 "u",后跟 "g" 只有在 "ug" 除以 "u""g" 的概率大于任何其他符号对时才会合并.直观上,WordPiece 与 BPE 略有不同,它通过合并两个符号来评估它丢失的内容,以确保它是值得的。

此外,BPE 将 @@ 放在标记的末尾,而 wordpieces 将 ## 放在开头。