【问题标题】:In Tensorflow, what is the difference between sampled_softmax_loss and softmax_cross_entropy_with_logits在Tensorflow中,sampled_softmax_loss和softmax_cross_entropy_with_logits有什么区别
【发布时间】:2016-05-16 10:33:08
【问题描述】:

在tensorflow中,有称为softmax_cross_entropy_with_logitssampled_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 损失与计算 softmaxed 交叉熵相同(例如 cross_entropy(softmax(train_x))

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

【问题讨论】:

    标签: python machine-learning deep-learning tensorflow


    【解决方案1】:

    抽样:

    抽样,在这两种情况下都意味着您没有计算出所有可能的输出(例如:如果字典中的单词太多而无法在每次推导时获取所有单词,那么我们只取几个样本并针对 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

    【讨论】:

      【解决方案2】:

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

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

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

      您还可以看到使用它的示例 - 在此 example 中的序列到序列转换

      【讨论】:

      • 嗨,Farseer,我在与上述相同的问题上有些挣扎。我的输出词汇只有大约 100 个标签。现在,tensorflow 只提供了 sampled_softmax_loss 函数。除了这个,我可以使用 tf.nn.softmax(tf.matmul(inputs, tf.transpose(weights)) + biases) 函数吗?或者我可以直接使用 seq2seq_model.py 吗?
      • 您好 Farseer,“样本”步骤是只发生在训练阶段还是同时发生在训练和预测阶段?
      猜你喜欢
      • 2016-09-15
      • 2016-03-18
      • 2017-04-05
      • 2020-03-16
      • 2016-02-10
      • 1970-01-01
      • 2018-11-10
      • 1970-01-01
      相关资源
      最近更新 更多