1

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

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

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

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

任何建议将不胜感激!

4

1 回答 1

1

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

现在,通常可以测试您的特定情况有多少问题。例如,如果您有一个验证集,请尝试微调而不是微调权重,看看验证集上的模型性能有何不同。

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

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

例如 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 中查找单词(例如,如果单词超出 vocab 使用 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)
于 2017-05-19T16:18:19.607 回答