我阅读了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))
对我来说,计算软最大损耗和计算软最大交叉熵是一样的(例如cross_entropy(softmax(train_x))
)
有人能告诉我为什么有两种不同的方法,我应该在哪种情况下使用哪种方法吗?
如果你的目标词汇量(或者你想预测的类的数量)真的很大,那么很难使用常规的softmax,因为你必须计算字典中每个单词的概率。通过使用
sampled_softmax_loss
,您只需要考虑词汇表的子集V来计算您的损失。采样的softmax只有在采样(我们的V)小于词汇表大小时才有意义。如果您的词汇表(标签数量)很小,那么使用
sampled_softmax_loss
是没有意义的。您可以在本文中看到实现的详细信息: http://arxiv.org/pdf/1412.2007v2.pdf
此外,您还可以看到在这个example中使用-Sequence-to-Sequence转换的示例
取样:
抽样,在这两种情况下,都意味着你不能计算出所有可能的输出(例如:字典中的单词太多,无法在每次派生时提取所有单词,所以我们只提取几个样本,并学习关于NLP问题的知识)。
softmax_cross_entropy_with_logits
:这是交叉熵,接收logit作为输入,并产生可用作损失的结果。
sampled_softmax_loss
:这是一个带对数的采样软最大交叉熵,所以在使用交叉焓之前只需要几个样本,而不是使用完全交叉焓:https://github.com/tensorflow/tensorflow/blob/r1.2/tensorflow/python/ops/nn_impl.py#L1269
相关问题 更多 >
编程相关推荐