在TensorFlow中,sampled_softmax_loss和nce_loss有什么区别?

9

我注意到在TensorFlow中有两个函数可以用于计算损失,分别为sampled_softmax_loss和nce_loss。这两个函数的参数非常相似,但我真的想知道它们之间的区别是什么?

3个回答

3

样本softmax的主要目标是选取给定数量的样本并尝试获得softmax损失。 这里的主要目标是使采样softmax的结果等于我们真实的softmax。 因此,算法基本上集中在从给定分布中选择这些样本。

另一方面,NCE损失更多地是选择噪声样本并尝试模仿真实的softmax。 它只会考虑一个真正的类别和K个噪声类别。


1
Sampled softmax试图对输出中的所有样本进行归一化。由于分布不是正常分布(标签上的对数),因此这不是最优损失函数。请注意,尽管它们具有相同的参数,但使用该函数的方式是不同的。在此处查看文档:https://github.com/calebchoo/Tensorflow/blob/master/tensorflow/g3doc/api_docs/python/functions_and_classes/shard4/tf.nn.nce_loss.md 并阅读以下行:

默认情况下,这使用对数均匀(Zipfian)分布进行采样,因此您的标签必须按降频顺序排序才能获得良好的结果。有关更多详细信息,请参见log_uniform_candidate_sampler。

看一下这篇论文,在其中他们解释了为什么在单词嵌入中使用它:http://papers.nips.cc/paper/5165-learning-word-embeddings-efficiently-with-noise-contrastive-estimation.pdf
希望这能帮到您!

第一个链接已经失效,请使用以下链接:https://github.com/calebchoo/Tensorflow/blob/master/tensorflow/g3doc/api_docs/python/functions_and_classes/shard4/tf.nn.nce_loss.md - Denis Kuzin
谢谢!链接已修复。 - rmeertens
你的标签必须按照降序排列。这在实践中意味着什么?你必须按照标签频率对小批量中的示例进行排序吗? - eggie5
1
@eggie5,编码为0的id应该是你语料库中出现最频繁的。而编码为“n_ids-1”的id应该是你语料库中出现最不频繁的。 - YQ.Wang

0

看看 TensorFlow 的这份文档 https://www.tensorflow.org/extras/candidate_sampling.pdf 吧。

它们看起来非常相似,但是 Sampled Softmax 只适用于单标签的情况,而 NCE 扩展到标签为多重集的情况。NCE 可以建模期望计数而不是标签的存在/不存在。我不清楚何时使用 Sampled Softmax 的确切示例。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接