使用预训练的快速文本权重

时间:2017-05-19 02:44:43

标签: tensorflow word-embedding

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

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

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

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

任何建议都将不胜感激!

1 个答案:

答案 0 :(得分:0)

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

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

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

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

E.g。 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),concat结果并将其输入到模型中。通过这种方式,您将教会您的模型主要使用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)