我注意到在张量流中有两个关于负采样的函数来计算损失( sampled_softmax_loss 和 nce_loss )。这两个函数的参数类似,但我真的想知道两者之间有什么区别?
答案 0 :(得分:3)
示例softmax就是选择给定数字的样本并尝试获得softmax损失。这里的主要目标是使采样softmax的结果等于我们的真softmax。因此算法基本上集中在从给定分布中选择那些样本。 另一方面,NCE损失更多的是选择噪声样本并尝试模拟真正的softmax。它只需要一个真正的类和一个K噪声类。
答案 1 :(得分: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
希望这有帮助!
答案 2 :(得分:0)
从TensorFlow https://www.tensorflow.org/extras/candidate_sampling.pdf
查看此文档它们看起来非常相似,但采样softmax仅适用于单个标签,而NCE适用于标签为多集的情况。然后,NCE可以对预期计数进行建模,而不是标签的存在/不存在。我不清楚何时使用sampled_softmax的确切示例。