您在这里有几个选择。其中,我认为 1 将是最容易实现的,因为它是标准语言模型,在损失中添加了对齐项。如果您认为自己有时间,我会推荐 2a,因为我认为它的性能可能会好得多。
1 使用现有的语料库来学习新词的嵌入
您可以按照您的描述执行此操作,但我会使用随机噪声而不是零来初始化未知嵌入。这可能会很好,但它的问题是模型无法知道 SENNA 嵌入比随机初始化的嵌入更受信任。因此,通常需要更多(时间、示例等)才能很好地训练这一点。
另一种选择是尝试捕捉已知嵌入和随机初始化嵌入之间的差异。我的建议是创建自己的嵌入 [20k x emb_dim] 并根据需要对其进行初始化。然后对模型因偏离 SENNA 嵌入而造成的损失添加惩罚。这就是在像这样的双语嵌入模型中所做的。这将推动已知嵌入接近 SENNA,并允许未知嵌入自由变化。随着训练的进行,您还可以减少此对齐惩罚的系数。
您可以在专门的嵌入任务(如 CBOW)中学习这些嵌入,也可以将其作为主要任务的一部分。
2 未知嵌入的混合模型
第二种方法是完全放弃尝试学习未知单词的嵌入。<unk>
通常,大多数词 RNN 模型通过诸如标签之类的东西对低频词执行此操作。对你来说,这将是你词汇量的一半。幸运的是,有很多工具可以填充这些词汇外 (OOV) 单词。
2a 子词嵌入
正如@Emre 指出的那样,子词嵌入已被用于解决词汇外问题。这是一个使用子词嵌入来实现“开放词汇”模型的模型示例。这意味着您可以将预训练的嵌入(您不需要使其可学习)与字符级模型相结合,以了解何时以及如何生成 OOV 单词。
2b<unk>
更换
另一种方法是,作为后处理步骤,用<unk>
语料库中的单词替换符号。您可以构建自己的语言模型(即使是简单的马尔可夫链也会有所改进)。此外,一些现代模型具有更复杂的替换方法,效果很好。