Klassifizierung mit lauten Etiketten?


13

Ich versuche, ein neuronales Netzwerk für die Klassifizierung zu trainieren, aber die Beschriftungen, die ich habe, sind ziemlich laut (ungefähr 30% der Beschriftungen sind falsch).

Der Kreuzentropieverlust funktioniert zwar, aber ich habe mich gefragt, ob es in diesem Fall Alternativen gibt, die effektiver sind. oder ist der Kreuzentropieverlust das Optimum?

Ich bin mir nicht sicher, aber ich denke darüber nach, den Kreuzentropieverlust etwas zu "beschneiden", so dass der Verlust für einen Datenpunkt nicht größer als eine Obergrenze ist. Funktioniert das?

Vielen Dank!

Update
Nach Lucas 'Antwort habe ich für die Ableitungen für die Vorhersageausgabe und die Eingabe der Softmax-Funktion Folgendes erhalten . Ich denke also, dass es im Wesentlichen einen Glättungsterm zu den Ableitungen hinzufügt . Ableitungen für den ursprünglichen Kreuzentropieverlust: yz37N

pi=0.3/N+0.7yi
l=tilog(pi)
lyi=tilog(pi)pipiyi=0.7tipi=ti37N+yi
lzi=0.7jtjpjyjzi=yijtjyj37N+yjtiyi37N+yi
lyi=tiyi
lzi=yiti
Bitte lassen Sie mich wissen, wenn ich falsch liege. Vielen Dank!

Update
Ich habe gerade einen Artikel von Google gelesen , der dieselbe Formel wie in Lucas 'Antwort verwendet, jedoch unterschiedliche Interpretationen aufweist.

In Abschnitt 7 Modellregularisierung über Label Smoothing

Dies (der Kreuzentropieverlust) kann jedoch zwei Probleme verursachen. Erstens kann dies zu einer Überanpassung führen: Wenn das Modell lernt, dem Groundtruth-Label für jedes Trainingsbeispiel die volle Wahrscheinlichkeit zuzuweisen, kann keine Verallgemeinerung garantiert werden. Zweitens werden die Unterschiede zwischen dem größten Logit und allen anderen groß, und dies verringert in Kombination mit dem begrenzten Gradienten die Anpassungsfähigkeit des Modells. Intuitiv geschieht dies, weil das Modell hinsichtlich seiner Vorhersagen zu sicher wird.l/zk

Aber anstatt den Vorhersagen den Glättungsbegriff hinzuzufügen, fügten sie ihn der Grundwahrheit hinzu , was sich als hilfreich herausstellte.

Geben Sie hier die Bildbeschreibung ein

In unseren ImageNet-Experimenten mit K = 1000 Klassen haben wir u (k) = 1/1000 und = 0,1 verwendet. Für ILSVRC 2012 haben wir eine konsistente Verbesserung von etwa 0,2% absolut sowohl für den Top-1-Fehler als auch für den Top-5-Fehler festgestellt.ϵ


3
Es gibt zahlreiche Arbeiten zu diesem Thema - github.com/subeeshvasu/Awesome-Learning-with-Label-Noise
guest_anonym

Antworten:


10

Das Richtige hier ist, das Modell zu ändern, nicht den Verlust. Ihr Ziel ist es immer noch, so viele Datenpunkte wie möglich korrekt zu klassifizieren (was den Verlust bestimmt), aber Ihre Annahmen über die Daten haben sich geändert (die in einem statistischen Modell , in diesem Fall dem neuronalen Netzwerk, codiert sind ).

Sei ein Vektor von Klassenwahrscheinlichkeiten, die vom neuronalen Netzwerk erzeugt werden, und der Kreuzentropieverlust für das Label . Um explizit die Annahme zu berücksichtigen, dass 30% der Etiketten Rauschen sind (als gleichmäßig zufällig angenommen), könnten wir unser Modell ändern, um es zu produzierenpt(yt,pt)yt

p~t=0.3/N+0.7pt

stattdessen und optimieren

t(yt,0.3/N+0.7pt),

Dabei ist die Anzahl der Klassen. Dies wird sich tatsächlich etwas entsprechend Ihrer Intuition verhalten und den Verlust auf endlich begrenzen.N


Wie ist ist gleich . Wenn wir zwei Fall Klasse nehmen dann wird . Ähnliches gilt für . Warum Begriff? Dankep~t0.3/N+0.7ptp~tProb(y~=+1|t)=0.7Prob(y=+1|t)+0.3Prob(y=1|t)Prob(y~=1|t)=0.7Prob(y=1|t)+0.3Prob(y=+1|t)1/N
Ahnung

0

Ich erkenne, dass dies ein Statistikforum ist und die Erwartung einen Schwerpunkt auf mathematische Ableitungen legt. Wenn dies jedoch hilfreich sein kann und Sie Python verwenden, gibt es ein Paket zur Klassifizierung mit verrauschten Bezeichnungen mit dem Namen cleanlab: https://github.com/ cgnorthcutt / cleanlab / .

Das cleanlabPython-Paket, pip install cleanlabfür das ich Autor bin, findet Beschriftungsfehler in Datensätzen und unterstützt die Klassifizierung / das Lernen mit verrauschten Beschriftungen. Es funktioniert mit Scikit-Learn, PyTorch, Tensorflow, FastText usw.

Zum Lernen mit lauten Etiketten.

# Code taken from https://github.com/cgnorthcutt/cleanlab
from cleanlab.classification import LearningWithNoisyLabels
from sklearn.linear_model import LogisticRegression

# Learning with noisy labels in 3 lines of code.

# Wrap around any classifier. Works with sklearn/pyTorch/Tensorflow/FastText/etc.
lnl = LearningWithNoisyLabels(clf=LogisticRegression())
lnl.fit(X = X_train_data, s = train_noisy_labels)
# Estimate the predictions you would have gotten by training with *no* label errors.
predicted_test_labels = lnl.predict(X_test)

So finden Sie Beschriftungsfehler in Ihrem Datensatz.

from cleanlab.latent_estimation import estimate_cv_predicted_probabilities

# Find the indices of label errors in 2 lines of code.

probabilities = estimate_cv_predicted_probabilities(
    X_train_data, 
    train_noisy_labels, 
    clf=LogisticRegression(),
)
label_error_indices = get_noise_indices(
    s = train_noisy_labels, 
    psx = probabilities, 
)

Einige Beispiele mit FastText (NLP) und PyTorch (MNIST AlexNet).

Dokumentation: https://l7.curtisnorthcutt.com/cleanlab-python-package

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.