【问题标题】:Loss on masked tensors蒙面张量的损失
【发布时间】:2017-11-07 01:16:47
【问题描述】:

假设我有类似的日志

[[4.3, -0.5, -2.7, 0, 0],
[0.5, 2.3, 0, 0, 0]]

显然第一个示例中的最后两个和第二个示例中的最后三个被屏蔽(即它们为零)并且不应影响损失和梯度计算。

如何计算此 logits 和相应标签之间的交叉熵损失?为了理智,这个例子的标签可以像

[[1, 0, 0, 0, 0],
[0, 1, 0, 0, 0]]

(一个问题:Softmax,然后是 log,logits 上的也适用于掩码零,tf 的交叉熵方法也会考虑这些元素的损失。)

(另外,您可以这样思考问题:我在批次中有不同长度的 logits,即我的 logits 分别为 eg.1 和 eg.2 的长度 3 和 2。标签后面也是如此。 )

【问题讨论】:

    标签: python tensorflow machine-learning nlp


    【解决方案1】:

    在这种情况下,使用 TF2 可能能够使用索引。 这就是我最终要做的。

    mask = logits != 0 
    weights = tf.cast(mask, tf.float32) 
    labels = tf.cast(labels, tf.float32)
    logits = tf.cast(logits, tf.float32)
    tf.compat.v1.losses.softmax_cross_entropy(labels[mask], logits[mask]) 
    

    【讨论】:

      【解决方案2】:

      屏蔽交叉熵损失是库中涵盖的常见操作。它实际上处理了更一般的权重概念;为掩码提供二进制权重。

      mask = tf.equal(logits, 0) # as in the OP
      weights = tf.to_float(mask) # convert to (0, 1) weights
      loss = tf.losses.softmax_cross_entropy(labels, logits, weights)
      

      不要通过实际计算输出的softmax然后交叉熵来计算softmax交叉熵,你会失去同时进行计算的精度和稳定性。

      【讨论】:

      • 我实际上需要常规的 softmax,所以我可以从中采样,tf 没有提供加权版本。
      • 这个采样是损失计算的一部分吗?如果没有,出于上述原因,我仍然建议使用tf.losses.softmax_cross_entropy。如果需要,您仍然可以独立计算 logits 的 softmax。
      • 这也要求标签是一个热编码的。我需要稀疏版本的地方。不支持权重。另外,我无法让您的代码正常工作。 pastebin.com/e1pL7B51
      • 稀疏版本也支持权重(至少现在支持,虽然它是 v1 兼容的,所以现在可能有一段时间了):tensorflow.org/api_docs/python/tf/compat/v1/losses/…
      【解决方案3】:

      你可以这样做:

      import tensorflow as tf
      logits = [[4.3, -0.5, -2.7, 0, 0], [0.5, 2.3, 0, 0, 0]]
      labels = [[1, 0, 0, 0, 0], [0, 1, 0, 0, 0]]
      loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(logits=logits, labels=labels))
      

      【讨论】:

        【解决方案4】:

        我最终做了以下事情:

        import tensorflow as tf
        import numpy as np
        prelim_scores=tf.constant([[4.3, -0.5, -2.7, 0, 0],[0.5, 2.3, 0, 0, 0]])
        mask=tf.constant([[True,True,True,False,False],[True,True,False,False,False]])
        dummy_scores = tf.ones_like(prelim_scores) * -99999.0  # the base matrix to choose from if dummy relation
        scores = tf.where(mask, prelim_scores,dummy_scores)  # [B, MAX_NUM_ACTIONS]
        a=tf.nn.softmax(scores)
        with tf.Session() as sess:
           print(sess.run(a))
        

        结果是:

        [[9.9094123e-01 8.1551941e-03 9.0362143e-04 0 0]

        [1.4185105e-01 8.5814887e-01 0 0 0]]

        致谢:here

        【讨论】:

          猜你喜欢
          • 2018-12-16
          • 2018-12-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-09-02
          • 2018-02-03
          • 2019-02-11
          • 2019-01-24
          相关资源
          最近更新 更多