在Tensorflow中,sampled_softmax_loss和softmax_cross_entropy_with_logits之间有什么区别

时间:2016-02-06 12:54:41

标签: python machine-learning deep-learning tensorflow

在tensorflow中,有一些名为softmax_cross_entropy_with_logitssampled_softmax_loss的方法。

我阅读了tensorflow文档并搜索了谷歌以获取更多信息,但我无法找到差异。对我来说,两者都使用softmax函数计算损失。

使用sampled_softmax_loss计算损失

loss = tf.reduce_mean(tf.nn.sampled_softmax_loss(...))

使用softmax_cross_entropy_with_logits计算损失

loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(P, Q))

对我来说,计算softmax损失与计算softmaxed交叉熵(例如cross_entropy(softmax(train_x)))相同

有人可以告诉我为什么有两种不同的方法,我应该在哪种情况下使用哪种方法?

2 个答案:

答案 0 :(得分:18)

如果您的目标词汇量(或者您想要预测的类别数量)非常大,那么使用常规softmax非常困难,因为您必须计算词典中每个单词的概率。使用sampled_softmax_loss您只需考虑词汇量的子集 V 来计算您的损失。

如果我们采样(我们的 V )小于词汇量大小,则采样softmax才有意义。如果您的词汇量(标签数量)很小,那么使用sampled_softmax_loss就没有意义了。

您可以在本文中看到实施细节: http://arxiv.org/pdf/1412.2007v2.pdf

此外,您还可以看到使用它的示例 - 在此example

中对序列进行排序的序列

答案 1 :(得分:2)

采样:

在两种情况下,Sampled都意味着你没有为所有可能的输出计算它(例如:字典中的单词太多,无法在每个派生中获取所有这些单词,所以我们只需要几个对NLP问题进行抽样和学习)。

softmax_cross_entropy_with_logits

这是交叉熵并接收logits作为输入并产生可用作损失的内容。

sampled_softmax_loss

这是一个采样的softmax_cross_entropy_with_logits,因此在使用交叉熵之前只需要几个样本,而不是使用完整的交叉熵:https://github.com/tensorflow/tensorflow/blob/r1.2/tensorflow/python/ops/nn_impl.py#L1269