Neuronale Netze: Welche Kostenfunktion soll verwendet werden?


48

Ich benutze TensorFlow für Experimente hauptsächlich mit neuronalen Netzen. Obwohl ich bereits einige Experimente durchgeführt habe (XOR-Problem, MNIST, einiges an Regression, ...), habe ich Schwierigkeiten, die "richtige" Kostenfunktion für bestimmte Probleme zu wählen, da ich insgesamt als Anfänger gelten könnte.

Bevor ich zu TensorFlow kam, habe ich einige vollständig verbundene MLPs und einige wiederkehrende Netzwerke selbst mit Python und NumPy codiert. Meistens hatte ich jedoch Probleme, bei denen ein einfacher Fehlerquadrat und ein einfacher Gradient ausreichend waren.

Da TensorFlow jedoch nicht nur eine ganze Reihe von Kostenfunktionen bietet, sondern auch benutzerdefinierte Kostenfunktionen erstellt, möchte ich wissen, ob es eine Art Tutorial speziell für Kostenfunktionen in neuronalen Netzen gibt. (Ich habe bereits die Hälfte der offiziellen TensorFlow-Tutorials durchgearbeitet, aber sie erklären nicht wirklich, warum bestimmte Kostenfunktionen oder Lernende für bestimmte Probleme verwendet werden - zumindest nicht für Anfänger.)

Um einige Beispiele zu nennen:

cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(y_output, y_train))

Ich vermute, es wendet die Softmax-Funktion auf beide Eingänge an, so dass die Summe eines Vektors gleich 1 ist. Aber was genau ist Kreuzentropie mit Logs? Ich dachte, es summiert die Werte und berechnet die Kreuzentropie ... also eine metrische Messung ?! Wäre das nicht sehr ähnlich, wenn ich die Ausgabe normalisiere, zusammenfasse und den quadratischen Fehler nehme? Warum wird dies zusätzlich zB für MNIST (oder noch viel schwierigere Probleme) verwendet? Wenn ich wie 10 oder vielleicht sogar 1000 Klassen klassifizieren möchte, zerstört die Zusammenfassung der Werte keine Informationen darüber, welche Klasse tatsächlich die Ausgabe war?

cost = tf.nn.l2_loss(vector)

Wofür ist das? Ich dachte, der Verlust von 12 ist so ziemlich der quadratische Fehler, aber die TensorFlow-API gibt an, dass es sich bei der Eingabe nur um einen Tensor handelt. Keine Ahnung ?!

Außerdem habe ich das für Kreuzentropie ziemlich oft gesehen:

cross_entropy = -tf.reduce_sum(y_train * tf.log(y_output))

... aber warum wird das verwendet? Ist der Verlust an Kreuzentropie nicht mathematisch:

-1/n * sum(y_train * log(y_output) + (1 - y_train) * log(1 - y_output))

Wo ist der (1 - y_train) * log(1 - y_output)Teil in den meisten TensorFlow-Beispielen? Fehlt es nicht?


Antworten: Ich weiß, dass diese Frage recht offen ist, aber ich erwarte nicht, dass ich mit jeder einzelnen im Detail aufgelisteten Problem- / Kostenfunktion etwa 10 Seiten bekomme. Ich brauche nur eine kurze Zusammenfassung, wann ich welche Kostenfunktion verwenden soll (im Allgemeinen oder in TensorFlow, das macht mir nicht viel aus) und eine Erklärung zu diesem Thema. Und / oder eine Quelle (n) für Anfänger;)


1
Gute Frage. Willkommen auf der Seite :)
Dawny33

2
Normalerweise wird MSE für die Regression und Cross-Entropy für die Klassifizierung verwendet. Classification Figure of Merit (CFM) wurde von Hampshire und Waibel in "Eine neuartige Zielfunktion zur verbesserten Phonemerkennung unter Verwendung zeitverzögerter neuronaler Netze" eingeführt. Wenn ich mich richtig erinnere, erklären sie auch, warum sie CFM so entworfen haben wie sie.
Martin Thoma

1
Ich denke, reduct_sum (y_train * tf.log (y_output)) wird häufig verwendet, weil es ein ziemlich verbreitetes "einfaches Fallbeispiel" ist. Der Fehler jedes Stapels wird summiert, was bedeutet, dass Ihr Fehler die doppelten Kosten (und die Größe des Gradienten) verursacht, wenn sich Ihre batch_sizes verdoppeln. Durch die einfache Änderung von "reduction_mean" wird das Debuggen und Spielen mit Einstellungen meiner Meinung nach zumindest verständlicher.
Neuron

Antworten:


33

Diese Antwort bezieht sich auf die allgemeinen Kostenfunktionen, die nicht mit TensorFlow zusammenhängen, und befasst sich hauptsächlich mit dem Teil Ihrer Frage, der "einige Erklärungen zu diesem Thema" enthält.

In den meisten Beispielen / Tutorials, denen ich folgte, war die verwendete Kostenfunktion etwas willkürlich. Es ging mehr darum, den Leser mit einer bestimmten Methode vertraut zu machen, nicht mit der Kostenfunktion. Es sollte Sie nicht davon abhalten, dem Tutorial zu folgen, um mit den Tools vertraut zu sein, aber meine Antwort sollte Ihnen helfen, die Kostenfunktion für Ihre eigenen Probleme zu wählen.

Wenn Sie Antworten zu Entropie-, Logit-, L2-Normen oder anderen spezifischen Themen wünschen, empfehle ich Ihnen, mehrere spezifischere Fragen zu stellen. Dies erhöht die Wahrscheinlichkeit, dass jemand mit spezifischen Kenntnissen Ihre Frage sieht.


Die Wahl der richtigen Kostenfunktion zur Erzielung des gewünschten Ergebnisses ist ein kritischer Punkt für Probleme beim maschinellen Lernen. Der grundlegende Ansatz, wenn Sie nicht genau wissen, was Sie von Ihrer Methode erwarten, besteht darin, Mean Square Error (Wikipedia) für Regressionsprobleme und Prozentualer Fehler für Klassifizierungsprobleme zu verwenden. Wenn Sie jedoch gute Ergebnisse mit Ihrer Methode erzielen möchten , müssen Sie good und damit die angemessene Kostenfunktion definieren. Dies beruht sowohl auf Domain-Kenntnissen (was sind Ihre Daten, was möchten Sie erreichen) als auch auf Kenntnissen der Tools, die Ihnen zur Verfügung stehen.

Ich glaube nicht, dass ich Sie durch die bereits in TensorFlow implementierten Kostenfunktionen führen kann, da ich nur sehr wenige Kenntnisse über das Tool habe, aber ich kann Ihnen ein Beispiel geben, wie Sie verschiedene Kostenfunktionen schreiben und bewerten.


Um die verschiedenen Unterschiede zwischen den Kostenfunktionen zu veranschaulichen, verwenden wir das Beispiel des Binärklassifizierungsproblems, bei dem für jede Stichprobe die Klasse .xnf(xn){0,1}

Beginnend mit rechnerischen Eigenschaften ; Wie zwei Funktionen, die dasselbe messen, zu unterschiedlichen Ergebnissen führen können. Nehmen Sie die folgende einfache Kostenfunktion; der Prozentsatz der Fehler. Wenn Sie Stichproben haben, ist die vorhergesagte Klasse und die wahre Klasse, die Sie minimieren möchtenNf(yn)yn

  • 1Nn{1 if f(xn)yn0 otherwise=nyn[1f(xn)]+[1yn]f(xn) .

Diese Kostenfunktion hat den Vorteil, dass sie leicht interpretierbar ist. Es ist jedoch nicht glatt; Wenn Sie nur zwei Samples haben, "springt" die Funktion von 0 auf 0,5 auf 1. Dies führt zu Inkonsistenzen, wenn Sie versuchen, den Gradientenabstieg für diese Funktion zu verwenden. Eine Möglichkeit, dies zu vermeiden, besteht darin, die Kostenfunktion so zu ändern, dass Zuweisungswahrscheinlichkeiten verwendet werden. . Die Funktion wirdp(yn=1|xn)

  • 1Nnynp(yn=0|xn)+(1yn)p(yn=1|xn) .

Diese Funktion ist flüssiger und funktioniert besser bei einem Gefälle-Abstieg. Sie erhalten ein "feineres" Modell. Es hat jedoch ein anderes Problem; Wenn Sie eine Stichprobe haben, die mehrdeutig ist, sagen wir, Sie haben nicht genug Informationen, um etwas Besseres als zu sagen . Die Verwendung eines Gradientenabfalls für diese Kostenfunktion führt dann zu einem Modell, das diese Wahrscheinlichkeit so weit wie möglich erhöht und somit möglicherweise überanpassung.p(yn=1|xn)=0.5

Ein weiteres Problem dieser Funktion ist, dass wenn während , Sie sicher sind, dass Sie Recht haben, aber Sie liegen falsch. Um dieses Problem zu vermeiden, können Sie das Protokoll der Wahrscheinlichkeit . Da und , hat die folgende Funktion nicht das im vorherigen Absatz beschriebene Problem:p(yn=1|xn)=1yn=0logp(yn|xn)log(0)=log(1)=0

  • 1Nnynlogp(yn=0|xn)+(1yn)logp(yn=1|xn) .

Dies sollte veranschaulichen, dass unterschiedliche Definitionen zur Optimierung derselben Sache , des Fehlerprozentsatzes, möglicherweise unterschiedliche Ergebnisse liefern, wenn sie rechnerisch leichter zu verstehen sind.

Es ist möglich , Kostenfunktionen und , die zu messen gleiche Konzept , aber könnte Ihre Methode , um bessere Ergebnisse als führe .ABAB


Lassen Sie uns nun sehen, wie unterschiedliche Kosten unterschiedliche Konzepte messen können. Im Kontext des Informationsabrufs möchten wir, wie bei der Google-Suche (wenn wir das Ranking ignorieren), dass die zurückgegebenen Ergebnisse wie folgt aussehen

  • hohe Präzision haben , keine irrelevanten Informationen zurückgeben
  • Haben Sie einen hohen Erinnerungswert , geben Sie so viele relevante Ergebnisse wie möglich zurück
  • Präzision und Rückruf (Wikipedia)

Beachten Sie, dass Ihr Algorithmus, wenn er alles zurückgibt , jedes mögliche relevante Ergebnis zurückgibt und daher einen hohen Rückruf aufweist, jedoch eine sehr geringe Genauigkeit aufweist. Wenn es jedoch nur ein Element zurückgibt , dasjenige, von dem es am sichersten ist, dass es relevant ist, hat es eine hohe Genauigkeit, aber einen geringen Rückruf.

Um solche Algorithmen beurteilen zu können, ist die übliche Kostenfunktion der Score (Wikipedia) . Der häufigste Fall ist der -score, der Präzision und Rückruf gleichermaßen bewertet, der allgemeine Fall jedoch der -score, und Sie können optimieren , um ihn zu erhaltenFF1Fββ

  • Höherer Rückruf, wenn Sieβ>1
  • Höhere Präzision, wenn Sie .β<1

In einem solchen Szenario entscheidet die Auswahl der Kostenfunktion darüber, welchen Kompromiss Ihr Algorithmus eingehen soll .

Ein anderes Beispiel, das oft angesprochen wird, ist der Fall der medizinischen Diagnose. Sie können eine Kostenfunktion auswählen, die mehr falsch negative oder falsch positive Ergebnisse bestraft, je nachdem, was vorzuziehen ist:

  • Gesündere Menschen werden als krank eingestuft (Dann können wir gesunde Menschen behandeln, was teuer ist und sie verletzen kann, wenn sie tatsächlich nicht krank sind.)
  • Mehr kranke Menschen werden als gesund eingestuft (aber dann könnten sie ohne Behandlung sterben)

Zusammenfassend definiert die Definition der Kostenfunktion das Ziel Ihres Algorithmus. Der Algorithmus definiert, wie Sie dorthin gelangen.


Randnotiz: Einige Kostenfunktionen verfügen über nützliche Algorithmen, um ihre Ziele zu erreichen. Zum Beispiel gibt es einen guten Weg zum Minimum des Scharnierverlustes (Wikipedia) , indem das doppelte Problem in SVM (Wikipedia) gelöst wird.


10

Bei der Beantwortung Ihrer Frage zu Cross-Entropie werden Sie feststellen, dass beide von Ihnen genannten Aspekte dasselbe sind.

1n(y_trainlog(y_output)+(1y_train)log(1y_output))

das, was Sie erwähnt haben, ist einfach der binäre Kreuzentropieverlust, bei dem Sie annehmen, dass ein Skalar von 0/1 ist und dass wieder ein Skalar ist, der die Wahrscheinlichkeit angibt, dass die Ausgabe 1 ist.y_trainy_output

Die andere Gleichung, die Sie erwähnt haben, ist eine allgemeinere Variante, die sich auf mehrere Klassen erstreckt

-tf.reduce_sum(y_train * tf.log(y_output)) ist dasselbe wie schreiben

ntrain_problog(out_prob)

wobei sich die Summe über die mehreren Klassen erstreckt und die Wahrscheinlichkeiten für jede Klasse gelten. Im binären Fall ist es eindeutig genau das Gleiche wie das, was zuvor erwähnt wurde. Der Term wird weggelassen, da er in keiner Weise zur Verlustminimierung beiträgt, da er eine Konstante ist.n


4

BLUF: iteratives Ausprobieren mit Teilmenge von Daten und Matplotlib.

Lange Antwort:

Mein Team hatte vor nicht allzu langer Zeit mit der gleichen Frage zu kämpfen. Alle Antworten hier sind großartig, aber ich wollte Ihnen meine "Anfängerantwort" für den Kontext und als Ausgangspunkt für Leute, die neu im maschinellen Lernen sind, mitteilen.

Sie möchten eine Kostenfunktion anstreben, die für Ihre spezifische Auswahl von Algorithmus und Datensatz glatt und konvex ist. Das liegt daran, dass Ihr Algorithmus die Gewichte sicher und effizient anpassen kann, um schließlich das globale Minimum dieser Kostenfunktion zu erreichen. Wenn Ihre Kostenfunktion mit lokalen Max- und Min-Werten "holprig" ist und / oder kein globales Minimum hat, kann es für Ihren Algorithmus schwierig sein, konvergierend vorzugehen. Die Gewichte springen möglicherweise überall herum und liefern letztendlich keine genauen und / oder konsistenten Vorhersagen.

Wenn Sie beispielsweise die lineare Regression verwenden, um das Gewicht (reelle Zahl, in Pfund) einer Person anhand ihrer Größe (reelle Zahl, in Zoll) und ihres Alters (reelle Zahl, in Jahren) vorherzusagen, sollte die mittlere quadratische Fehlerkostenfunktion lauten eine schöne, glatte, konvexe Kurve. Ihr Algorithmus wird keine Probleme mit der Konvergenz haben.

Angenommen, Sie verwenden stattdessen einen logistischen Regressionsalgorithmus für ein Binärklassifizierungsproblem, z. B. die Vorhersage des Geschlechts einer Person basierend darauf, ob die Person in den letzten 30 Tagen Windeln gekauft hat und ob die Person in den letzten 30 Tagen Bier gekauft hat. In diesem Fall führt der mittlere quadratische Fehler möglicherweise nicht zu einer glatten konvexen Oberfläche, was sich negativ auf das Training auswirken kann. Und das würden Sie experimentell feststellen.

Beginnen Sie mit einer Testversion mit MSE und einer kleinen und einfachen Auswahl Ihrer Daten oder mit Scheindaten, die Sie für dieses Experiment generiert haben. Visualisieren Sie, was mit matplotlib (oder der von Ihnen bevorzugten Plotlösung) los ist. Ist die resultierende Fehlerkurve glatt und konvex? Versuchen Sie es erneut mit einer zusätzlichen Eingabevariablen. Ist die resultierende Oberfläche noch glatt und konvex? Durch dieses Experiment stellen Sie möglicherweise fest, dass MSE zwar nicht zu Ihrem Problem / Ihrer Lösung passt, die Kreuzentropie jedoch eine glatte konvexe Form ergibt, die Ihren Anforderungen besser entspricht. Sie könnten das also mit einem größeren Beispieldatensatz ausprobieren und sehen, ob die Hypothese immer noch zutrifft. Wenn dies der Fall ist, können Sie es einige Male mit Ihrem vollständigen Trainingssatz versuchen und sehen, wie es funktioniert und ob es konsistent ähnliche Modelle liefert. Ist dies nicht der Fall, wählen Sie eine andere Kostenfunktion und wiederholen Sie den Vorgang.

Diese Art von hochgradig iterativem Trial-and-Error-Prozess hat für mich und mein Team von Datenanfängern sehr gut funktioniert. Wir können uns darauf konzentrieren, Lösungen für unsere Fragen zu finden, ohne tief in die mathematische Theorie hinter Kostenfunktionsauswahl und -analyse eintauchen zu müssen Modelloptimierung.

Natürlich wurde ein Großteil dieses Versuchs und Irrtums bereits von anderen durchgeführt, daher nutzen wir auch das öffentliche Wissen, um frühzeitig die Auswahl der möglicherweise guten Kostenfunktionen herauszufiltern. Beispielsweise ist die Kreuzentropie im Allgemeinen eine gute Wahl für Klassifizierungsprobleme, unabhängig davon, ob es sich um eine binäre Klassifizierung mit logistischer Regression wie im obigen Beispiel oder um eine kompliziertere Mehrfachetikettenklassifizierung mit einer Softmax-Schicht als Ausgabe handelt. Während MSE eine gute erste Wahl für lineare Regressionsprobleme ist, bei denen Sie eine skalare Vorhersage anstelle der Wahrscheinlichkeit einer Zugehörigkeit zu einer bekannten Kategorie aus einer bekannten Menge möglicher Kategorien anstreben. d könnte nur eine gewichtete Summe der Eingänge plus Bias ohne Aktivierungsfunktion haben.

Hoffe, diese Antwort hilft anderen Anfängern da draußen, ohne allzu simpel und offensichtlich zu sein.


3

Regrading deine Frage

Wo ist der Teil (1 - y_train) * log (1 - y_output) in den meisten TensorFlow-Beispielen? Fehlt es nicht?

Die Antwort ist, dass die meisten Ausgabefunktionen Softmax sind. Das bedeutet, dass Sie nicht unbedingt alle Wahrscheinlichkeiten in falschen Fällen reduzieren müssen, da sie automatisch reduziert werden, wenn Sie die Wahrscheinlichkeit für die richtige erhöhen

Zum Beispiel:

vor der Optimierung

y_output = [0.2, 0.2, 0.6] und y_train = [0, 0, 1]

nach der Optimierung

y_output = [0.15, 0.15, 0.7] und y_train = [0, 0, 1]

Hierbei ist zu beachten, dass, obwohl wir gerade die dritte Amtszeit erhöht haben, alle anderen Amtszeiten automatisch reduziert werden

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.