Klasyfikacja z głośnymi etykietami?


14

Próbuję wytrenować sieć neuronową do klasyfikacji, ale etykiety, które mam, są raczej hałaśliwe (około 30% etykiet jest błędnych).

Strata między entropią rzeczywiście działa, ale zastanawiałem się, czy są jakieś alternatywy bardziej skuteczne w tym przypadku? czy utrata przez entropię jest optymalna?

Nie jestem pewien, ale myślę o pewnym „przycięciu” utraty entropii krzyżowej, tak że utrata jednego punktu danych nie będzie większa niż górna granica, czy to zadziała?

Dzięki!

Aktualizacja
Zgodnie z odpowiedzią Lucasa, otrzymałem następujące dane dla pochodnych dla wyjściowej prognozy i wejścia funkcji softmax z . Sądzę więc, że w zasadzie dodaje się termin wygładzający 3yz do instrumentów pochodnych. pi=0,3/N+0,7yil=-tilog(pi)l37N

pi=0.3/N+0.7yi
l=tilog(pi)
lyi=tilog(pi)pipiyi=0.7tipi=ti37N+yi
Pochodne dla pierwotnej utraty entropii krzyżowej: l
lzi=0.7jtjpjyjzi=yijtjyj37N+yjtiyi37N+yi
l
lyi=tiyi
Daj mi znać, jeśli się mylę. Dzięki!
lzi=yiti

Aktualizacja
Właśnie zdarzyło mi się przeczytać artykuł Google, który stosuje tę samą formułę jak w odpowiedzi Lucasa, ale z różnymi interpretacjami.

W rozdziale 7 Regularyzacja modelu poprzez wygładzanie etykiet

l/zk

Ale zamiast dodać termin wygładzający do prognoz, dodali go do podstawowej prawdy , która okazała się pomocna.

wprowadź opis zdjęcia tutaj

ϵ


Odpowiedzi:


10

Właściwą rzeczą do zrobienia jest zmiana modelu, a nie strata. Twoim celem jest nadal poprawna klasyfikacja jak największej liczby punktów danych (co determinuje utratę), ale twoje założenia dotyczące danych uległy zmianie (które są zakodowane w modelu statystycznym , w tym przypadku sieci neuronowej).

pt(yt,pt)yt

p~t=0.3/N+0.7pt

zamiast tego i zoptymalizować

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

N


p~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

0

Zdaję sobie sprawę, że jest to forum statystyk i oczekiwanie dotyczy głównie pochodnych matematycznych, ale jeśli może być pomocne i używasz języka Python, istnieje pakiet do klasyfikacji z głośnymi etykietami o nazwie cleanlab: https://github.com/ cgnorthcutt / cleanlab / .

cleanlabPakiet Python, pip install cleanlabdla którego jestem autorem, znaleziska oznakować błędy w zestawów danych i obsługuje klasyfikacji / uczenia się z głośnym etykiet. Działa z scikit-learn, PyTorch, Tensorflow, FastText itp.

Do nauki z głośnymi etykietami.

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

Aby znaleźć błędy etykiet w zestawie danych.

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

Kilka przykładów z FastText (NLP) i PyTorch (MNIST AlexNet).

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.