训练RNN输出word2vec嵌入而不是logits

时间:2018-02-17 16:39:46

标签: python tensorflow machine-learning deep-learning

传统上,似乎RNN使用logits来预测序列中的下一个时间步。在我的情况下,我需要RNN输出word2vec(50深度)矢量预测。这意味着成本函数基于2个向量:Y系列中下一个单词的实际向量和Y_hat,即网络预测。

我尝试使用cosine distance费用功能,但网络似乎没有学习(我已经让它在AWS P3上运行了10个小时,费用总是在0.7左右)

这样的模型是否可行?如果是这样,应该使用什么成本函数?

TF中的余弦距离:

cosine_distance = tf.losses.cosine_distance(tf.nn.l2_normalize(outputs, 2), tf.nn.l2_normalize(targets, 2), axis=2)

更新 我试图预测word2vec所以在采样期间我可以根据预测矢量的最近邻居选择下一个单词。

1 个答案:

答案 0 :(得分:4)

您想要预测单词嵌入的原因是什么?你从哪里得到“地面真相”一词嵌入?对于word2vec模型,您通常会在未来的模型中重复使用经过训练的字嵌入。如果您训练的word2vec模型的嵌入大小为50,那么您将拥有50-d嵌入,您可以将其保存并在未来的模型中使用。如果您只想重新创建现有的地面实况word2vec模型,那么您可以使用这些值。典型的word2vec将通过continuous-bag-of-words or skip-gram定期进行softmax输出,然后保存生成的单词嵌入。

如果你真的有理由尝试生成一个创建试图匹配word2vec的模型,那么在这里查看你的损失函数是一些建议。我不相信你应该正常化你的输出或你的目标 - 你可能希望那些不受影响(如果你已将它们标准化,目标不再是“基本事实”目标。而且,它似乎你正在使用{{ 1}}现已被弃用并替换为dim=0。您是否为axis尝试了不同的值?这应该代表计算余弦距离的维度,我认为{{1}维度将是错误的维度(因为这可能应该是批量大小。我会尝试使用dim(最后维度)或0th的值,看看您是否观察到任何差异。

另外,你的优化/学习率是多少?如果学习率太小,那么实际上你可能无法向正确的方向移动。