使用预训练的 fasttext 权重更新 Tensorflow 嵌入层中的权重

Weights update in Tensorflow embedding layer with pretrained fasttext weights

我不确定我的理解是否正确但是...

在训练seq2seq模型时,我想在embedding层启动一组预训练的fasttext权重的目的之一是减少测试环境中的未知词(这些未知词不在训练集中).由于预训练的fasttext模型词汇量较大,在测试环境中,未知词可以用fasttext词表外词向量来表示,其应该与训练集中的语义相似词具有相似的方向

但是,由于嵌入层中的初始 fasttext 权重将通过训练过程进行更新(更新权重会产生更好的结果)。我想知道更新后的嵌入权重是否会扭曲单词之间的语义相似性关系并破坏快速文本词汇表外单词向量的表示? (并且,在初始嵌入层中那些更新的嵌入权重和词向量之间,但它们相应的 ID 没有出现在训练数据中)

如果输入ID可以是从预训练模型中提取的分布式表示向量,然后通过查找table将这些预训练词向量(训练时固定权重)映射到嵌入层(这些权重将在训练时更新),这会是更好的解决方案吗?

如有任何建议,我们将不胜感激!

你对这个问题的看法是正确的:当使用预先训练的向量并在你的最终模型中对其进行微调时,不常见或没有出现在你的训练集中的词将不会得到任何更新。

现在,通常可以测试您的特定情况下问题的严重程度。例如。如果你有一个验证集,尝试微调而不是微调权重,看看模型在验证集上的表现有什么不同。

如果您在未进行微调时发现验证集的性能有很大差异,可以通过以下几种方法来处理此问题:

a) 在不可训练的嵌入之后添加一个线性变换层。在许多情况下,微调嵌入会对 space 进行仿射变换,因此可以在可在测试时应用的单独层中捕获它。

例如A是预训练嵌入矩阵:

embeds = tf.nn.embedding_lookup(A, tokens)
X = tf.get_variable("X", [embed_size, embed_size])
b = tf.get_vairable("b", [embed_size])
embeds = tf.mul(embeds, X) + b

b) 在不可训练的嵌入矩阵 A 中保留预训练的嵌入。添加可训练的嵌入矩阵 B,它在你的训练集中具有较小的流行词词汇量和嵌入大小。在 A 和 B 中查找单词(例如,如果单词不在词汇表中,则使用 ID=0),连接结果并将其用作模型的输入。通过这种方式,您将教您的模型主要使用 A,有时依赖 B 作为训练集中的流行词。

fixed_embeds = tf.nn.embedding_lookup(A, tokens)
B = tf.get_variable("B", [smaller_vocab_size, embed_size])
oov_tokens = tf.where(tf.less(tokens, smaller_vocab_size), tokens, tf.zeros(tf.shape(tokens), dtype=tokens.dtype))
dyn_embeds = tf.nn.embedding_lookup(B, oov_tokens)
embeds = tf.concat([fixed_embeds, dyn_embeds], 1)