我注意到在tensorflow中有两个关于负采样的函数来计算损失(sampled_softmax_loss和nce_loss)。这两个函数的参数是相似的,但我真的想知道两者的区别是什么?
发布于 2017-04-10 09:57:18
Sample softmax是关于选择给定数目的样本,并试图得到softmax损失。这里的主要目的是使采样的softmax的结果等于我们真正的softmax。因此,算法基本上集中在从给定分布中选择这些样本。另一方面,NCE损失更多的是选择噪声样本,并试图模拟真实的softmax。它只需要一个真正的类和一个K噪声类。
发布于 2017-02-28 14:12:57
softmax试图对输出中的所有样本进行标准化。有一个非正态分布(对数对你的标签),这不是一个最佳的损失函数。注意,尽管它们具有相同的参数,但它们使用函数的方式是不同的。看看这里的文档:loss.md,并阅读这一行:
默认情况下,这将使用日志统一(Zipfian)分布进行抽样,因此您的标签必须按照降低频率的顺序排序,以获得良好的结果。有关更多细节,请参见log_uniform_candidate_sampler。
看一看这篇文章,他们解释了为什么他们会用它来嵌入单词:http://papers.nips.cc/paper/5165-learning-word-embeddings-efficiently-with-noise-contrastive-estimation.pdf
希望这能有所帮助!
发布于 2018-05-28 20:03:58
查看TensorFlow sampling.pdf的文档
它们看起来非常相似,但抽样softmax只适用于单个标签,而NCE则扩展到标签是多个集合的情况。然后,NCE可以对期望的计数进行建模,而不是对标签的存在/缺失进行建模。我不清楚何时使用sampled_softmax的确切示例。
https://stackoverflow.com/questions/42509878
复制相似问题