传统上,似乎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)
Update: 我试图预测word2vec所以在采样过程中我可以根据预测矢量的最近邻点选择下一个单词 .
1 回答
您想要预测单词嵌入的原因是什么?你从哪里得到"ground truth"字嵌入?对于word2vec模型,您通常会在未来的模型中重复使用经过训练的单词嵌入 . 如果您训练了嵌入大小为50的
word2vec
模型,那么您将拥有50-d嵌入,您可以将其保存并在未来的模型中使用 . 如果您只想重新创建现有的地面实况word2vec模型,那么您可以使用这些值 . 典型的word2vec将通过continuous-bag-of-words or skip-gram进行常规softmax输出,然后保存生成的字嵌入 .如果你确实有理由尝试生成一个创建试图匹配word2vec的模型,那么在这里查看你的损失函数是一些建议 . 我不相信你应该正常化你的输出或你的目标 - 你可能希望那些不受影响(如果你已将它们标准化,目标不再是"ground truth"目标 . 而且,它似乎你正在使用
dim=0
,现在已经弃用并替换为axis
. 您是否尝试了dim
的不同值?这应该表示计算余弦距离的维度,我认为0th
维度是错误的维度(因为这可能应该是批量大小 . 我会尝试使用axis=-1
(最后一个维度)或axis=1
的值,看看你是否观察到任何差异 .另外,你的优化/学习率是多少?如果学习率太小,那么实际上你可能无法向正确的方向移动 .