分类器只收敛到一个类 - 增加多样性

时间:2016-07-16 17:39:46

标签: classification tensorflow

我想迫使分类器不能始终得出相同的结果(无人监管,所以我没有目标):

  max_indices = tf.argmax(result, 1)
  cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(result, max_indices, name="cross_entropy_per_example")
  cross_entropy_mean = tf.reduce_mean(cross_entropy, name="cross_entropy")

其中:

  • 结果是从推理返回的logits
  • max_indices 因此是所有批次的预测类(size = matchsize)
  • 这里实施的
  • cross_entropy 衡量预测结果实际预测的强度(就像测量信心一样)

然后我进行优化以最大限度地减少损失。基本上我希望网络尽可能强烈地预测班级。

显然,这会收敛到一些随机类,然后将对该类中的所有内容进行分类。

所以我想要的是添加惩罚以防止批处理中的所有预测都相同。我检查了数学并提出了Shannon Diversity作为一个很好的衡量标准,但我无法在tensorflow中实现这一点。知道如何做到这一点,无论是采用多样性措施还是任何替代措施?

THX

1 个答案:

答案 0 :(得分:1)

一个好的经验法则是让损失函数反映出您实际想要优化的内容。如果你想增加多样性,那么让你的损失函数真正衡量多样性是有意义的。

虽然我确信有更正确的方法,但这里有一个启发式方法可以让您更接近您提到的Shannon Diversity:

  1. 让我们假设softmax的输出实际上接近预测类的输出,并且对于所有其他类都接近于零。

  2. 然后每个类别的比例是批次中softmax的输出总和除以批量大小。

  3. 然后,近似Shannon Diversity的损失函数将是:

  4. sm = tf.softmax(result)
    proportions = tf.reduce_mean(result, 0) # approximated proportion of each class
    addends = proportions * tf.log(proportions) # multiplied by the log of itself
    loss = tf.reduce_sum(addends) # add them up together to get the loss
    

    当我更多地思考它时,它可能会破坏而不是试图使类多样化而是做出非常不确定的预测(有效地打破了原始的假设,即softmax是预测类的单热编码的良好近似)。为了解决这个问题,我会把上面描述的损失和你原来的损失加在一起。我描述的损失将优化近似的香农多样性,而你的原始损失将阻止softmax变得越来越不确定。