2016-07-16 11 views
2

Ich möchte einen Klassifikator zwingen, nicht mit den gleichen Ergebnissen die ganze Zeit (ohne Aufsicht, so habe ich keine Ziele) zu kommen:Classifier konvergiert gegen nur eine Klasse - Erhöhung Diversity

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") 

Wo:

  • Ergebnis sind die Logits von Inferenz
  • max_indices zurück sind somit die vorhergesagten Klassen über alle Chargen (size = matc hsize)
  • cross_entropy wie hier Maßnahmen umgesetzt, wie stark das vorhergesagte Ergebnis in der Tat vorhergesagt wird (als ob einfach das Vertrauen Messung)

ich dann optimieren, um diesen Verlust zu minimieren. Grundsätzlich möchte ich, dass das Netz eine Klasse so stark wie möglich vorhersagt.

Offensichtlich konvergiert dies zu irgendeiner zufälligen Klasse und wird dann alles in dieser einen Klasse klassifizieren.

Also was ich will, ist eine Strafe hinzuzufügen, um zu verhindern, dass alle Vorhersagen in einer Charge gleich sind. Ich überprüfte die Mathematik und kam mit der Shannon Diversity als ein gutes Maß, aber ich kann dies nicht in Tensorflow implementieren. Irgendeine Idee, wie man das macht, entweder mit der angegebenen Diversitätsmaßnahme oder einem Ersatz?

Thx

Antwort

1

Eine gute Faustregel ist, die Verlustfunktion zu haben, die auf das, was Sie wirklich wollen, optimieren widerspiegelt. Wenn Sie die Vielfalt erhöhen möchten, wäre es sinnvoll, wenn Ihre Verlustfunktion tatsächlich die Diversität misst.

Während ich bin sicher, dass es ein richtiger Weg, es zu tun, hier eine Heuristik ist, die Sie näher an der Shannon Diversity bekommen Sie erwähnen:

  1. Lassen Sie uns eine Hypothese machen, dass der Ausgang des softmax ist für die vorhergesagte Klasse in der Nähe von eins und für alle anderen Klassen nahe null.

  2. Dann ist der Anteil jeder Klasse die Summe der Ausgaben der Softmax über die Charge geteilt durch die Losgröße.

  3. Dann wird die Verlustfunktion, die den Shannon Diversity annähert würde etwas entlang der Linien der folgenden sein:

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 

Wenn ich denke, mehr darüber, könnte es möglicherweise brechen und stattdessen Klassen zu diversifizieren versuchen stattdessen machen sie sehr unsichere Vorhersagen (was effektiv die ursprüngliche Annahme, dass Softmax eine gute Näherung für die Ein-Hot-Codierung der vorhergesagten Klasse ist, bricht). Um es zu umgehen, würde ich zusammen den Verlust, den ich oben beschrieben habe, und Ihren ursprünglichen Verlust aus Ihrer Frage zusammenzählen. Der Verlust, den ich beschrieben habe, wird die angenäherte Shannon-Diversity optimieren, während Ihr ursprünglicher Verlust verhindern wird, dass die Softmax immer unsicherer wird.

+0

Das sieht nach einer sehr vielversprechenden Idee aus. Werde versuchen, Tonit oder morgen und melden :-) Thx so weit – friesel

+0

Hat den Trick gemacht. Vielen Dank. In tf.reduce_mean (sm, 0) geändert – friesel