Eine einfachere Möglichkeit, Ableitungen von Verlustfunktionen für die Klassifizierung zu verstehen und wann/wie sie in PyTorch angewendet werden
Egal, ob Sie neu in der Erforschung neuronaler Netzwerke sind oder ein erfahrener Profi, dies sollte eine nützliche Lektüre sein, um mehr Instinct über Verlustfunktionen zu erlangen. Als jemand, der während des Modelltrainings viele verschiedene Verlustfunktionen testet, bin ich über kleine Particulars zwischen den Funktionen gestolpert. Ich habe Stunden damit verbracht, eine intuitive Darstellung von Verlustfunktionen aus Lehrbüchern, Forschungsarbeiten und Movies zu recherchieren. Ich wollte nicht nur die Ableitungen Das hat mir geholfen, die Konzepte zu verstehen, aber häufige Fallstricke und Anwendungsfälle für Einstufung in PyTorch.
Bevor wir beginnen, müssen wir einige grundlegende Begriffe definieren, die ich verwenden werde.
- Trainingsdatensatz: {xᵢ, yᵢ}
- Verlustfunktion: L(φ)
- Ausgabe der Modellvorhersage f(xᵢ, φ) mit Parametern φ
- Bedingte Wahrscheinlichkeit: Pr(y|x)
- Parametrische Verteilung: Pr(y|ω) mit ω Darstellung von Netzwerkparametern für die Verteilung über j
Kehren wir zunächst zu den Grundlagen zurück. Eine allgemeine Annahme ist, dass neuronale Netze einen skalaren Output aus dem Modell berechnen f(xᵢ, φ). Die meisten neuronalen Netze sind heutzutage jedoch darauf trainiert, Parameter einer Verteilung vorherzusagen j. (im Gegensatz zu vorhergesagt den Wert von j).
In der Realität wird ein Netzwerk eine bedingte Wahrscheinlichkeitsverteilung ausgeben Pr(y|x) über mögliche Ausgänge j. Mit anderen Worten: Jeder Eingabedatenpunkt führt zu einer Wahrscheinlichkeitsverteilung, die für jede Ausgabe generiert wird. Das Netzwerk möchte die Parameter für die Wahrscheinlichkeitsverteilung lernen und diese Parameter und die Verteilung dann verwenden, um die Ausgabe vorherzusagen.
Die traditionelle Definition einer Verlustfunktion ist eine Funktion, die Ziel- und prognostizierte Ausgaben vergleicht. Aber wir haben gerade gesagt, dass eine Netzwerk-Rohausgabe eine Verteilung und keine Skalarausgabe ist. Wie ist das additionally möglich?
Wenn wir dies aus der Sichtweise betrachten, die wir gerade definiert haben, schiebt eine Verlustfunktion jeden ja eine höhere Wahrscheinlichkeit in der Verteilung haben Pr(yᵢ|xᵢ). Der entscheidende Punkt ist, dass unsere Verteilung verwendet wird, um die wahre Ausgabe basierend auf Parametern aus unserer Modellausgabe vorherzusagen. Anstatt unsere Eingabe zu verwenden xᵢ für die Verteilung, können wir uns eine parametrische Verteilung vorstellen Pr(y|ω) Wo ω stellt Wahrscheinlichkeitsverteilungsparameter dar. Wir berücksichtigen immer noch die Eingabe, aber es wird eine andere ωᵢ = f(xᵢ, φ) für jede xᵢ.
Notiz: Um ein verwirrendes Konzept zu klären: φ stellt die Modellparameter dar und ω stellt die Wahrscheinlichkeitsverteilungsparameter dar
GUm zur traditionellen Definition einer Verlustfunktion zurückzukehren, müssen wir eine Ausgabe erhalten, die wir vom Modell verwenden können. Aus unserer Wahrscheinlichkeitsverteilung scheint es logisch, φ das ergibt die größte Wahrscheinlichkeit für jeden xᵢ. Wir brauchen additionally die Gesamtheit φ das die größte Wahrscheinlichkeit über alle Trainingspunkte hinweg ergibt ICH (alle Herleitungen sind aus Understanding Deep Studying (1) adaptiert):
Wir multiplizieren die generierten Wahrscheinlichkeiten aus jeder Verteilung und erhalten φ das die maximale Wahrscheinlichkeit ergibt (genannt maximale Wahrscheinlichkeit). Dazu müssen wir annehmen, dass die Daten unabhängig und identisch verteilt sind. Doch nun stoßen wir auf ein Drawback: Was ist, wenn die Wahrscheinlichkeiten sehr klein sind? Unser Multiplikationsergebnis wird sich 0 nähern (ähnlich wie bei einem verschwindenden Gradientenproblem). Außerdem ist unser Programm möglicherweise nicht in der Lage, so kleine Zahlen zu verarbeiten.
Um dies zu beheben, führen wir eine logarithmische Funktion! Indem wir die Eigenschaften von Logarithmen nutzen, können wir unsere Wahrscheinlichkeiten addieren, anstatt sie zu multiplizieren. Wir wissen, dass der Logarithmus eine monoton zunehmende Funktion ist, sodass unsere ursprüngliche Ausgabe erhalten bleibt und mit dem Logarithmus skaliert wird.
Das letzte, was wir brauchen, um unsere traditionelle unfavourable Log-Probability zu erhalten, ist die Minimierung der Ausgabe. Wir maximieren derzeit die Ausgabe, additionally multiplizieren wir einfach mit einer negativen Zahl und nehmen das minimale Argument (denken Sie an einige grafische Beispiele, um sich davon zu überzeugen):
Indem wir die Modellergebnisse einfach als Wahrscheinlichkeitsverteilung visualisieren, versuchen wir, φ das ergibt die maximale Wahrscheinlichkeit, und durch Anwenden eines Logarithmus haben wir einen negativen Log-Probability-Verlust abgeleitet! Dies kann auf viele Aufgaben angewendet werden, indem man eine logische Wahrscheinlichkeitsverteilung wählt. Gängige Klassifizierungsbeispiele werden unten gezeigt.
Wenn Sie sich fragen, wie eine skalare Ausgabe aus dem Modell generiert wird während Inferenzes ist einfach das Most der Verteilung:
Notiz: Dies ist lediglich eine Ableitung der negativen Log-Probability. In der Praxis wird höchstwahrscheinlich auch in der Verlustfunktion eine Regularisierung vorhanden sein.
Bis zu diesem Punkt haben wir die unfavourable Log-Probability abgeleitet. Das ist wichtig zu wissen, aber es ist in den meisten Lehrbüchern oder On-line-Ressourcen zu finden. Wenden wir dies nun auf die Klassifizierung an, um seine Anwendung zu verstehen.
Randnotiz: Wenn Sie daran interessiert sind, dies auf Regression angewendet zu sehen, bietet Understanding Deep Studying (1) großartige Beispiele mit univariater Regression und einer Gauß-Verteilung zur Ableitung des mittleren quadratischen Fehlers
Binäre Klassifizierung
Ziel der binären Klassifizierung ist die Zuordnung eines Eingangs X zu einer von zwei Klassenbezeichnungen j ∈ {0, 1}. Wir werden die Bernoulli-Verteilung als unsere bevorzugte Wahrscheinlichkeitsverteilung verwenden.
Dies ist nur eine ausgefallene Artwork, die Wahrscheinlichkeit auszudrücken, dass die Ausgabe wahr ist, aber die Gleichung ist notwendig, um unsere Verlustfunktion abzuleiten. Wir brauchen das Modell f(x, φ) Ausgabe P zur Erzeugung der prognostizierten Ausgabewahrscheinlichkeit. Bevor wir jedoch P in Bernoulli muss es zwischen 0 und 1 liegen (es ist additionally eine Wahrscheinlichkeit). Die Funktion der Wahl hierfür ist eine Sigmoidfunktion: σ(z)
Ein Sigmoid komprimiert die Ausgabe P auf einen Wert zwischen 0 und 1. Daher lautet unsere Eingabe für Bernoulli p = σ(f(x, φ)). Damit ergibt sich unsere Wahrscheinlichkeitsverteilung:
Wenn wir zur negativen Log-Probability zurückkehren, erhalten wir Folgendes:
Kommt Ihnen das bekannt vor? Dies ist die Verlustfunktion der binären Kreuzentropie (BCE)! Die wichtigste Instinct dabei ist, zu verstehen, warum ein Sigmoid verwendet wird. Wir haben eine skalare Ausgabe und diese muss auf einen Wert zwischen 0 und 1 skaliert werden. Es gibt andere Funktionen, die dies können, aber das Sigmoid wird am häufigsten verwendet.
BCE in PyTorch
Bei der Implementierung von BCE in PyTorch gibt es ein paar Tips, auf die Sie achten sollten. Es gibt zwei verschiedene BCE-Funktionen in PyTorch: BCELoss() Und BCEWithLogitsLoss(). Ein häufiger Fehler (den ich gemacht habe) ist das falsche Vertauschen der Anwendungsfälle.
BCELoss(): Diese Torch-Funktion gibt den Verlust MIT ANWENDUNG DES SIGMOIDS aus. Die Ausgabe ist ein Wahrscheinlichkeit.
BCEWithLogitsLoss(): Die Torch-Funktion gibt Logits aus, die die Rohausgaben des Modells. Es wird KEIN SIGMOID ANGEWENDET. Wenn Sie dies verwenden, müssen Sie ein torch.sigmoid() zum Ausgang.
Dies ist besonders wichtig für Switch Studying, da das Modell, auch wenn Sie wissen, dass es mit BCE trainiert wurde, unbedingt das richtige verwendet. Andernfalls wenden Sie versehentlich nach BCELoss() eine Sigmoidfunktion an, wodurch das Netzwerk nicht lernt …
Sobald eine Wahrscheinlichkeit mit einer der beiden Funktionen berechnet wurde, muss sie während der Inferenz interpretiert werden. Die Wahrscheinlichkeit ist die Vorhersage des Modells, wie wahrscheinlich es ist, dass die Wahrscheinlichkeit wahr ist (Klassenbezeichnung 1). Um die Abbruchwahrscheinlichkeit einer wahren Bezeichnung zu bestimmen, ist eine Schwellenwertbildung erforderlich. p = 0,5 wird häufig verwendet, aber es ist wichtig, verschiedene Schwellenwahrscheinlichkeiten zu testen und zu optimieren. Eine gute Idee ist es, ein Histogramm der Ausgabewahrscheinlichkeiten zu zeichnen, um die Zuverlässigkeit der Ausgaben zu sehen, bevor man sich für einen Schwellenwert entscheidet.
Mehrklassenklassifizierung
Ziel der Multiklassenklassifizierung ist die Zuordnung eines Eingangs X zu einem von Ok > 2 Klassenbezeichnungen j ∈ {1, 2, …, Ok}. Wir werden die kategorische Verteilung als unsere bevorzugte Wahrscheinlichkeitsverteilung verwenden.
Dabei wird jeder Klasse für eine bestimmte Ausgabe lediglich eine Wahrscheinlichkeit zugewiesen, und die Summe aller Wahrscheinlichkeiten muss 1 ergeben. Wir benötigen das Modell f(x, φ) Ausgabe P zur Erzeugung der prognostizierten Ausgabewahrscheinlichkeit. Das Summenproblem tritt wie bei der binären Klassifizierung auf. Bevor wir eingeben können P in Bernoulli muss es eine Wahrscheinlichkeit zwischen 0 und 1 sein. Eine Sigmoidfunktion funktioniert nicht mehr, da sie jeden Klassenwert auf eine Wahrscheinlichkeit skaliert, aber es gibt keine Garantie, dass alle Wahrscheinlichkeiten 1 ergeben. Dies ist vielleicht nicht sofort ersichtlich, aber es wird ein Beispiel gezeigt:
Wir brauchen eine Funktion, die beide Einschränkungen sicherstellen kann. Dafür wird ein Softmax gewählt. Ein Softmax ist eine Erweiterung eines Sigmoids, stellt aber sicher, dass die Summe aller Wahrscheinlichkeiten 1 ergibt.
Dies bedeutet, dass die Wahrscheinlichkeitsverteilung ein Softmax ist, das auf die Modellausgabe angewendet wird. Die Wahrscheinlichkeit der Berechnung eines Labels okay: Pr(y = okay|x) = Sₖ(f(x, φ)).
Um die Verlustfunktion für die Mehrklassenklassifizierung abzuleiten, können wir den Softmax- und Modell-Output in den negativen Log-Probability-Verlust einsetzen:
Dies ist die Herleitung für Multiklassen-Kreuzentropie. Es ist wichtig, sich daran zu erinnern, dass der einzige Time period, der zur Verlustfunktion beiträgt, die Wahrscheinlichkeit der wahren Klasse ist. Wenn Sie Kreuzentropie gesehen haben, sind Sie eher mit einer Funktion vertraut, bei der p(x) Und q(x). Dies ist identisch mit der Gleichung für den Kreuzentropieverlust, in der p(x) = 1 für die wahre Klasse und 0 für alle anderen Klassen. q(x) ist der Softmax der Modellausgabe. Die andere Ableitung der Kreuzentropie ergibt sich aus der Verwendung von KL Divergence, und Sie können dieselbe Verlustfunktion erreichen, indem Sie einen Time period als Dirac-Delta-Funktion behandeln, bei der wahre Ausgaben existieren, und den anderen Time period als Modellausgabe mit Softmax. Es ist wichtig zu beachten, dass beide Wege zur gleichen Verlustfunktion führen.
Kreuzentropie in PyTorch
Anders als bei der binären Kreuzentropie gibt es in PyTorch nur eine Verlustfunktion für die Kreuzentropie. nn.KreuzEntropyLoss gibt die Modellausgabe mit bereits angewendetem Softmax zurück. Die Inferenz kann durchgeführt werden, indem die Softmax-Modellausgabe mit der größten Wahrscheinlichkeit verwendet wird (wobei die höchste Wahrscheinlichkeit wie erwartet verwendet wird).
Dies waren zwei intestine untersuchte Klassifizierungsbeispiele. Bei einer komplexeren Aufgabe kann es einige Zeit dauern, sich für eine Verlustfunktion und Wahrscheinlichkeitsverteilung zu entscheiden. Es gibt viele Diagramme, die Wahrscheinlichkeitsverteilungen mit beabsichtigten Aufgaben abgleichen, aber es gibt immer Raum zum Erkunden.
Für bestimmte Aufgaben kann es hilfreich sein, Verlustfunktionen zu kombinieren. Ein häufiger Anwendungsfall hierfür ist eine Klassifizierungsaufgabe, bei der es hilfreich sein kann, einen (binären) Kreuzentropieverlust mit einem modifizierten Cube-Koeffizientenverlust zu kombinieren. Meistens werden die Verlustfunktionen addiert und durch einige Hyperparameter skaliert, um den Beitrag jeder einzelnen Funktion zum Verlust zu steuern.