【发布时间】:2019-08-18 08:07:27
【问题描述】:
我已经看到诸如BERT 之类的 NLP 模型使用 WordPiece 进行标记化。在 WordPiece 中,我们将 playing 等标记拆分为 play 和 ##ing。提到它涵盖了更广泛的词汇表外(OOV)单词。有人可以帮我解释一下 WordPiece 标记化是如何完成的,以及它如何有效地处理稀有/OOV 单词吗?
【问题讨论】:
标签: nlp word-embedding
我已经看到诸如BERT 之类的 NLP 模型使用 WordPiece 进行标记化。在 WordPiece 中,我们将 playing 等标记拆分为 play 和 ##ing。提到它涵盖了更广泛的词汇表外(OOV)单词。有人可以帮我解释一下 WordPiece 标记化是如何完成的,以及它如何有效地处理稀有/OOV 单词吗?
【问题讨论】:
标签: nlp word-embedding
WordPiece 和 BPE 是 NLP 任务中将单词分割成子单词级别的两种相似且常用的技术。 在这两种情况下,词汇表都使用语言中的所有单个字符进行初始化,然后将词汇表中最常见/最可能的符号组合迭代添加到词汇表中。
考虑original paper中的WordPiece算法(我稍微修改了措辞):
- 使用文本中的所有字符初始化单词单元库存。
- 使用 1 中的清单在训练数据上构建语言模型。
- 通过组合当前单词清单中的两个单元以将单词单元清单增加一来生成新的单词单元。从所有可能的词单元中选择新词单元,当添加到模型中时,这些词单元对训练数据的可能性最大。
- 转到 2 直到达到预定义的单词单元限制或可能性增加低于某个阈值。
BPE 算法仅在步骤 3 中有所不同,它只是选择新词单元作为当前子词单元集中下一个最常出现的对的组合。
示例
输入文字:她走了。他是个遛狗者。我走路
前 3 个 BPE 合并:
w a = wa
l k = lk
wa lk = walk
所以在这个阶段,您的词汇表包括所有初始字符,以及wa、lk 和walk。您通常会针对固定数量的合并操作执行此操作。
它如何处理稀有/OOV 词?
很简单,如果使用这样的切分方法,OOV 词是不可能的。任何没有出现在词汇表中的词都会被分解成子词单元。同样,对于稀有词,鉴于我们使用的子词合并数量有限,该词不会出现在词汇表中,因此会被拆分成更频繁的子词。
这有什么帮助?
假设模型看到单词walking。除非这个词在训练语料库中至少出现几次,否则模型无法学会很好地处理这个词。但是,它可能包含walked、walker、walks 等词,每个词只出现几次。如果没有子词分割,所有这些词都会被模型视为完全不同的词。
但是,如果这些被分割为 walk@@ ing、walk@@ ed 等,请注意它们现在都将具有共同的 walk@@,这在训练时会经常发生,并且模型可能能够了解更多。
【讨论】:
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. ?我看到它到处都被引用,但没有人详细说明这究竟意味着什么。
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 次("hug" 出现 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)
假设 Byte-Pair Encoding 训练将在此时停止,然后将学习的合并规则应用于新词(只要这些新词不包含不在基本词汇表中的符号)。例如,单词"bug" 将被标记为["b", "ug"],但"mug" 将被标记为["", "ug"],因为符号“m”不在基本词汇表中。一般而言,"m" 等单个字母不会被 "<unk>" 符号替换,因为训练数据通常包括每个字母至少出现一次,但对于表情符号等非常特殊的字符则可能会出现这种情况。
基本词汇量 + 合并次数,是一个可供选择的超参数。例如,GPT 的词汇量为 40,478,因为它们有 478 个基本字符,并选择在 40,000 次合并后停止训练。
WordPiece 与 BPE
WordPiece 首先初始化词汇表以包含训练数据中出现的每个字符,并逐步学习给定数量的合并规则。与 BPE 相比,WordPiece 不会选择最频繁的符号对,而是选择将训练数据添加到词汇表后的可能性最大化的符号对。参考前面的例子,最大化训练数据的似然性相当于找到一个符号对,其概率除以它的第一个符号后跟它的第二个符号的概率是所有符号对中最大的。例如。只有当"ug" 除以"u"、"g" 的概率大于任何其他符号对时,"u" 和随后的"g" 才会被合并。直观地说,WordPiece 与 BPE 稍有不同,它通过合并两个符号来评估它所失去的东西,以确保它是值得的。
此外,BPE 将 @@ 放在标记的末尾,而 wordpieces 将 ## 放在开头。
【讨论】: