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

In Tensorflow, what is the difference between sampled_softmax_loss and softmax_cross_entropy_with_logits

在tensorflow中,有方法叫做softmax_cross_entropy_with_logits and sampled_softmax_loss

我阅读了 tensorflow 文档并搜索了 google 以获取更多信息,但我找不到不同之处。在我看来,两者都使用 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 损失与计算 softmax 交叉熵相同(例如 cross_entropy(softmax(train_x))

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

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

采样的 softmax 只有在我们采样(我们的 V)小于词汇量时才有意义。如果你的词汇量(标签数量)很小,那么使用 sampled_softmax_loss.

是没有意义的

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

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

中的序列到序列翻译

采样:

抽样,在这两种情况下都意味着您不会计算所有可能的输出(例如:如果字典中的单词太多而无法在每次推导时全部使用,所以我们只使用一些样本并从中学习 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