如何为 Out of Vocabulary Word 初始化词嵌入?

数据挖掘 机器学习 深度学习 nlp 词嵌入
2021-10-15 22:57:53

我正在尝试使用 CoNLL-2003 NER (English) Dataset,并且我正在尝试使用预训练的嵌入。我正在使用 SENNA 预训练嵌入。现在,我的词汇表中有大约 20k 个单词,而其中的嵌入仅可用于 9.5k 个单词。

我目前的方法是20k X embedding_size用零初始化一个数组,并初始化我知道嵌入的 9.5k 个单词,并使所有嵌入都可以学习。

我的问题是最好的方法是什么?对此类研究的任何参考都会非常有帮助吗?

我后来在 Stackoverflow 上也问过类似的问题,这里是链接。

1个回答

您在这里有几个选择。其中,我认为 1 将是最容易实现的,因为它是标准语言模型,在损失中添加了对齐项。如果您认为自己有时间,我会推荐 2a,因为我认为它的性能可能会好得多。

1 使用现有的语料库来学习新词的嵌入

您可以按照您的描述执行此操作,但我会使用随机噪声而不是零来初始化未知嵌入。这可能会很好,但它的问题是模型无法知道 SENNA 嵌入比随机初始化的嵌入更受信任。因此,通常需要更多(时间、示例等)才能很好地训练这一点。

另一种选择是尝试捕捉已知嵌入和随机初始化嵌入之间的差异。我的建议是创建自己的嵌入 [20k x emb_dim] 并根据需要对其进行初始化。然后对模型因偏离 SENNA 嵌入而造成的损失添加惩罚。这就是在像这样的双语嵌入模型中所做的。这将推动已知嵌入接近 SENNA,并允许未知嵌入自由变化。随着训练的进行,您还可以减少此对齐惩罚的系数。

您可以在专门的嵌入任务(如 CBOW)中学习这些嵌入,也可以将其作为主要任务的一部分。

2 未知嵌入的混合模型

第二种方法是完全放弃尝试学习未知单词的嵌入。<unk>通常,大多数词 RNN 模型通过诸如标签之类的东西对低频词执行此操作。对你来说,这将是你词汇量的一半。幸运的是,有很多工具可以填充这些词汇外 (OOV) 单词。

2a 子词嵌入

正如@Emre 指出的那样,子词嵌入已被用于解决词汇外问题。这是一个使用子词嵌入来实现“开放词汇”模型的模型示例。这意味着您可以将预训练的嵌入(您不需要使其可学习)与字符级模型相结合,以了解何时以及如何生成 OOV 单词。

2b<unk>更换

另一种方法是,作为后处理步骤,用<unk>语料库中的单词替换符号。您可以构建自己的语言模型(即使是简单的马尔可夫链也会有所改进)。此外,一些现代模型具有更复杂的替换方法,效果很好。