Frage

ich benutze Tensorflow für Experimente hauptsächlich mit neuronalen Netzwerken. Obwohl ich einige Experimente gemacht habe (XOR-Problem, MNIST, einige Regressionsmaterial, ...), habe ich jetzt Probleme, die "richtige" Kostenfunktion für spezifische Probleme zu wählen, da ich insgesamt als Anfänger angesehen werden kann.

Bevor ich zu TensorFlow kam, habe ich einige voll verbundene MLPs und einige wiederkehrende Netzwerke selbst codiert Python und Numpy Aber meistens hatte ich Probleme, bei denen ein einfacher quadratischer Fehler und ein einfacher Gradiententescise ausreichend waren.

Da TensorFlow jedoch selbst eine Menge Kostenfunktionen selbst bietet und benutzerdefinierte Kostenfunktionen erstellt, möchte ich wissen, ob es möglicherweise speziell für Kostenfunktionen für neuronale Netzwerke gibt? (Ich habe bereits die Hälfte der offiziellen Tensorflow -Tutorials gemacht, aber sie erklären nicht wirklich warum Spezifische Kostenfunktionen oder Lernende werden für bestimmte Probleme verwendet - zumindest nicht für Anfänger)

Einige Beispiele geben:

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

Ich denke, es wendet die Softmax -Funktion auf beiden Eingängen an, so dass die Summe eines Vektors gleich 1 ist. Aber was genau ist die Kreuzung mit Logits? Ich dachte, es fasst die Werte zusammen und berechnet die Kreuzentropie ... also einige metrische Messungen?! Wäre das nicht sehr ähnlich, wenn ich die Ausgabe normalisiere, zusammenfassen und den quadratischen Fehler aufnehmen? Warum wird dieser gebrauchte EG für MNIST (oder noch viel schwierigere Probleme) verwendet? Wenn ich wie 10 oder sogar 1000 Klassen klassifizieren möchte, zerstören die Werte nicht vollständig Informationen darüber die Klasse war eigentlich die Ausgabe?

cost = tf.nn.l2_loss(vector)

Wofür ist das? Ich dachte, der L2 -Verlust ist so ziemlich der quadratische Fehler, aber TensorFlows API sagt, dass es nur ein Tensor ist. Versteht die Idee überhaupt nicht ?!

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

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

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

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

Wo ist der, die, das (1 - y_train) * log(1 - y_output) Teil an den meisten Tensorflow -Beispielen? Fehlt es nicht?


Antworten: Ich weiß, dass diese Frage ziemlich offen ist, aber ich erwarte nicht, wie 10 Seiten mit jeder im Detail aufgeführten einzelnen Problem-/Kostenfunktion zu bekommen. Ich brauche nur eine kurze Zusammenfassung darüber, wann die Kostenfunktion (im Allgemeinen oder in Tensorflow, egal) und eine Erklärung zu diesem Thema egal ist. Und/oder einige Quellen für Anfänger;)

War es hilfreich?

Lösung

Diese Antwort ist auf der Allgemeines Seite der Kostenfunktionen, die nicht mit TensorFlow zusammenhängen, und wird hauptsächlich den Teil Ihrer Frage "eine Erklärung zu diesem Thema" befassen.

In den meisten Beispielen/Tutorial folgte die verwendete Kostenfunktion etwas willkürlich. Der Punkt war mehr, den Leser einer bestimmten Methode einzuführen, nicht in die Kostenfunktion speziell. Es sollte Sie nicht aufhalten, das Tutorial zu folgen, um mit den Tools vertraut zu sein. Meine Antwort sollte Ihnen jedoch helfen, wie Sie die Kostenfunktion für Ihre eigenen Probleme auswählen.

Wenn Sie Antworten auf Kreuzentropie, Logit, L2-Normen oder irgendetwas Spezifisches wünschen, empfehle ich Ihnen, mehrere, spezifischere Fragen zu veröffentlichen. Dies erhöht die Wahrscheinlichkeit, dass jemand mit spezifischem Wissen Ihre Frage sieht.


Die Auswahl der richtigen Kostenfunktion für die Erreichung des gewünschten Ergebniss ist ein kritischer Punkt bei Problemen des maschinellen Lernens. Der grundlegende Ansatz, wenn Sie nicht genau wissen, was Sie von Ihrer Methode wollen, ist die Verwendung Mittlerer quadratischer Fehler (Wikipedia) für Regressionsprobleme und Prozentsatz des Fehlers bei Klassifizierungsproblemen. Wenn Sie jedoch wollen gut Ergebnisse aus Ihrer Methode müssen Sie benötigen Gut definieren, und so die angemessene Kostenfunktion definieren. Dies ergibt sich sowohl aus dem Domänenwissen (was sind Ihre Daten, was möchten Sie erreichen) als auch aus dem Wissen über die Ihnen zur Verfügung stehenden Tools.

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


Um die verschiedenen Unterschiede zwischen den Kostenfunktionen zu veranschaulichen, verwenden wir das Beispiel des Binärklassifizierungsproblems, wo wir für jede Probe wollen $ x_n $, die Klasse $ f (x_n) in {0,1 } $.

Beginnen mit Computereigenschaften; Wie zwei Funktionen, die das "gleiche Ding" messen, zu unterschiedlichen Ergebnissen führen können. Nehmen Sie die folgende, einfache Kostenfunktion; Der Prozentsatz des Fehlers. Wenn Sie haben $ N $ Proben, $ f (y_n) $ ist die vorhergesagte Klasse und $ y_n $ Die wahre Klasse möchten Sie minimieren

  • $ frac {1} {n} sum_n links { begin {array} {ll} 1 & text {if} f (x_n) non = y_n 0 & text {sonst} Ende {Array} rechts. = sum_n y_n [1-f (x_n)] + [1-y_n] f (x_n) $.

Diese Kostenfunktion hat den Vorteil, leicht interpretierbar zu sein. Es ist jedoch nicht glatt; Wenn Sie nur zwei Proben haben, "springt" die Funktion von 0 bis 0,5 bis 1. Dies führt zu Inkonsistenzen, wenn Sie versuchen, einen Gradientenabstieg für diese Funktion zu verwenden. Eine Möglichkeit, dies zu vermeiden, besteht darin, die Kostenfunktion zu ändern, um die Zuordnungswahrscheinlichkeiten zu verwenden. $ p (y_n = 1 | x_n) $. Die Funktion wird

  • $ frac {1} {n} sum_n y_n p (y_n = 0 | x_n) + (1 - y_n) p (y_n = 1 | x_n) $.

Diese Funktion ist reibungsloser und funktioniert besser mit einem Gradientenabstiegsansatz. Sie erhalten ein "feineres" Modell. Es hat jedoch ein anderes Problem; Wenn Sie ein Beispiel haben, das mehrdeutig ist, sagen Sie, Sie haben nicht genügend Informationen, um etwas Besseres zu sagen als $ p (y_n = 1 | x_n) = 0,5 $. Die Verwendung von Gradientenabstiegungen in dieser Kostenfunktion führt dann zu einem Modell, das diese Wahrscheinlichkeit so weit wie möglich erhöht und damit möglicherweise über ein überflutet wird.

Ein weiteres Problem dieser Funktion ist, dass wenn $ p (y_n = 1 | x_n) = 1 $ während $ y_n = 0 $, Sie haben sicher, dass Sie Recht haben, aber Sie liegen falsch. Um dieses Problem zu vermeiden, können Sie das Protokoll der Wahrscheinlichkeit nehmen. $ log p (y_n | x_n) $. Wie $ log (0) = Infty $ und $ log (1) = 0 $, Die folgende Funktion hat nicht das im vorherige Absatz beschriebene Problem:

  • $ frac {1} {n} sum_n y_n log p (y_n = 0 | x_n) + (1 - y_n) log p (y_n = 1 | x_n) $.

Dies sollte veranschaulichen, dass um die Optimierung der Optimierung gleiche Sache, Der Prozentsatz des Fehlers, unterschiedliche Definitionen können unterschiedliche Ergebnisse liefern, wenn sie rechnerisch einfacher zu verstehen sind.

Es ist für Kostenfunktionen möglich $ A $ und $ B $ um das zu messen Gleiches Konzept, aber $ A $ könnte Ihre Methode zu besseren Ergebnissen führen als $ B $.


Lassen Sie sich nun ansehen, wie unterschiedliche Kostenfunktionen unterschiedliche Konzepte messen können. Im Zusammenhang mit dem Abrufen von Informationen wie bei der Google -Suche (wenn wir das Ranking ignorieren) möchten wir, dass die zurückgegebenen Ergebnisse zu

  • hoch haben Präzision, keine irrelevanten Informationen zurückgeben
  • hoch haben abrufen, kehren Sie so viele relevante Ergebnisse wie möglich zurück
  • Präzision und Rückruf (Wikipedia)

Beachten Sie, dass wenn Ihr Algorithmus zurückgibt alles, Es wird jedes relevante Ergebnis zurückgeben und somit einen hohen Rückruf haben, aber eine sehr schlechte Präzision haben. Andererseits, wenn es nur zurückkommt eines Element, das, das am sichersten ist, ist relevant, es wird eine hohe Präzision, aber einen geringen Rückruf haben.

Um solche Algorithmen zu beurteilen, ist die gemeinsame Kostenfunktion die $ F $-Score (Wikipedia). Der gemeinsame Fall ist der $ F_1 $-Score, die Präzision und Rückruf gleichen Gewicht verleiht, aber der allgemeine Fall ist es $ F_ beta $-Score, und Sie können optimieren $ beta $ bekommen

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

In einem solchen Szenario, Die Auswahl der Kostenfunktion besteht darin, den Kompromiss Ihres Algorithmus auszuwählen.

Ein häufiges Beispiel, das häufig aufgebracht wird, ist der Fall der medizinischen Diagnose.

  • Weitere Menschen werden als krank eingestuft (aber dann können wir gesunde Menschen behandeln, was kostspielig ist und sie möglicherweise verletzen, wenn sie tatsächlich nicht krank sind)
  • Mehr kranke Menschen werden als gesund eingestuft (aber dann könnten sie ohne Behandlung sterben)

Abschließend definiert die Definition der Kostenfunktion das Ziel Ihres Algorithmus. Der Algorithmus definiert, wie man dorthin gelangt.


Randnotiz: Einige Kostenfunktionen haben gute Algorithmus -Möglichkeiten, um ihre Ziele zu erreichen. Zum Beispiel ein guter Weg zum Minimum der Scharnierverlust (Wikipedia) existiert durch Lösung des doppelten Problems in SVM (Wikipedia)

Andere Tipps

Um Ihre Frage zu Cross Entropy zu beantworten, werden Sie feststellen, dass beide, die Sie erwähnt haben, dasselbe sind.

$ - frac {1} {n} sum (y _train * log (y _output) + (1 - y _train) cdot log (1 - y _output)) $

Das Sie erwähnt haben, ist einfach der Binärkreuzentropieverlust, bei dem Sie annehmen, dass $ y _train $ ein 0/1 Skalar ist und dass $ y _output $ erneut ein Skalar ist, der die Wahrscheinlichkeit angibt, dass die Ausgabe 1 beträgt.

Die andere, die Sie erwähnte Gleichung

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

$- sum_n train _prob cdot log (out _prob) $

Wo die Summation über den mehreren Klassen liegt und die Wahrscheinlichkeiten für jede Klasse sind. Klar im binären Fall ist es genau das Gleiche wie das, was zuvor erwähnt wurde. Die $ n $ -Remester wird weggelassen, da sie in keiner Weise zur Verlustminimierung beiträgt, da sie konstant ist.

BLUF: Iterativer Versuch und Irrtum mit Teilmenge von Daten und Matplotlib.

Lange Antwort:

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

Sie möchten eine Kostenfunktion anstreben, die für Ihre spezifische Auswahl des Algorithmus und des Datensatzes reibungslos 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 den lokalen Maxe und Mins "holprig" ist und/oder kein globales Minimum hat, kann es Ihrem Algorithmus möglicherweise schwer konvergieren. Seine Gewichte könnten überall springen und letztendlich nicht genaue und/oder konsistente Vorhersagen erhalten.

Wenn Sie beispielsweise eine lineare Regression verwenden, um das Gewicht eines Menschen (reelle Zahl, in Pfund) basierend auf seiner Größe (reelle Zahl, in Zoll) und Alter (reelle Zahl, in Jahren) vorherzusagen, sollte die mittlere Quadratfehlerkostenfunktion sein Eine schöne, glatte, konvexe Kurve. Ihr Algorithmus hat keine Probleme miteinander.

Angenommen, Sie verwenden stattdessen einen logistischen Regressionsalgorithmus für ein Binärklassifizierungsproblem, wie das Geschlecht 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 bietet der mittlere quadratische Fehler möglicherweise keine glatte konvexe Oberfläche, die für das Training schlecht sein könnte. Und das würden Sie durch Experimente erzählen.

Sie können mit der Verwendung von MSE und einer kleinen und einfachen Stichprobe Ihrer Daten oder mit Scheindaten, die Sie für dieses Experiment generiert haben, mit der Verwendung von MSE und einer einfachen Stichprobe ausführen. Visualisieren Sie, was mit Matplotlib vor sich geht (oder welche Plotlösung Sie bevorzugen). Ist die resultierende Fehlerkurve glatt und konvex? Versuchen Sie es erneut mit einer zusätzlichen Eingangsvariablen ... Ist die resultierende Oberfläche immer noch glatt und konvex? Durch dieses Experiment können Sie feststellen, dass MSE zwar nicht zu Ihrem Problem/Ihrer Lösung passt, eine Kreuzentropie eine glatte konvexe Form bietet, die Ihren Anforderungen besser entspricht. Sie können das also mit einem größeren Beispieldatensatz ausprobieren und feststellen, ob die Hypothese noch gilt. Und wenn dies der Fall ist, können Sie es einige Male mit Ihrem vollständigen Trainingssatz ausprobieren und sehen, wie es funktioniert und ob es konsequent ähnliche Modelle liefert. Wenn dies nicht der Fall ist, wählen Sie eine andere Kostenfunktion und wiederholen Sie den Vorgang.

Diese Art von iterativem Prozess und Irrtum hat für mich und mein Team von Anfänger-Datenwissenschaftlern ziemlich gut gearbeitet und wir können uns darauf konzentrieren, Lösungen für unsere Fragen zu finden, ohne tief in die mathematische Theorie hinter der Auswahl der Kostenfunktion eintauchen zu müssen Modelloptimierung.

Natürlich wurde ein Großteil dieses Versuchs und Irrtums bereits von anderen Personen gemacht. Daher nutzen wir auch öffentliche Kenntnisse, um uns dabei zu helfen, unsere Entscheidungen zu filtern, was zu Beginn des Prozesses gute Kostenfunktionen sein könnten. Zum Beispiel 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 das obige Beispiel oder eine kompliziertere Multi-Label-Klassifizierung 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 Mitgliedschaft in einer bekannten Kategorie einer bekannten Reihe möglicher Kategorien suchen, in diesem Fall anstelle einer Softmax -Schicht als Ausgabe. D könnte nur eine gewichtete Summe der Eingänge plus Verzerrung ohne Aktivierungsfunktion haben.

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

Regelt 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

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]

Hier beobachten Sie, dass alle anderen Begriffe automatisch reduziert werden

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit datascience.stackexchange
scroll top