您对这个问题是正确的:在您的最终模型中使用预训练向量并对其进行微调时,训练集中不常见或未出现的单词不会得到任何更新。
现在,通常可以测试您的特定情况有多少问题。例如,如果您有一个验证集,请尝试微调而不是微调权重,看看验证集上的模型性能有何不同。
如果您在不进行微调时发现验证集的性能有很大差异,可以通过以下几种方法来处理:
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)