Klasifikasi dengan label berisik?

13

Saya mencoba untuk melatih jaringan saraf untuk klasifikasi, tetapi label yang saya miliki agak bising (sekitar 30% dari label salah).

Kehilangan lintas-entropi memang berhasil, tetapi saya bertanya-tanya apakah ada alternatif yang lebih efektif dalam kasus ini? atau apakah kerugian lintas-entropi paling optimal?

Saya tidak yakin tetapi saya berpikir untuk "memotong" kehilangan lintas-entropi, sehingga kehilangan untuk satu titik data tidak akan lebih besar dari batas atas, apakah itu akan berhasil?

Terima kasih!

Pembaruan
Menurut jawaban Lucas, saya mendapatkan yang berikut untuk turunannya untuk hasil prediksi dan input dari fungsi softmax . Jadi saya kira pada dasarnya itu menambahkan istilah smoothing ke turunannya. \ frac {\ partial l} { \ partial z_i} = 0.7 \ sum_j \ frac {t_j} {p_j} \ frac {\ partial y_j} {\ partial z_i} = y_i \ sum_jt_j \ frac {y_j} {\ frac {3} {7N} + y_j} - t_i \ frac {y_i} {\ frac {3} {7N} + y_i} Derivatif untuk kehilangan lintas-entropi asli: \ frac {\ partial l} {\ partial y_i} = - \ frac {t_i} {y_i}z 3yz pi=0,3/N+0,7yil=-Σtilog(pi)l37N

halsaya=0,3/N+0,7ysaya
l=-tsayacatatan(halsaya)
l
lysaya=-tsayacatatan(halsaya)halsayahalsayaysaya=-0,7tsayahalsaya=-tsaya37N+ysaya
lzsaya=0,7jtjhaljyjzsaya=ysayajtjyj37N+yj-tsayaysaya37N+ysaya
lysaya=-tsayaysaya
lzsaya=ysaya-tsaya
Tolong beri tahu saya jika saya salah. Terima kasih!

Pembaruan
Saya kebetulan membaca makalah oleh Google yang menerapkan rumus yang sama seperti dalam jawaban Lucas tetapi dengan interpretasi yang berbeda.

Dalam Bagian 7 Model Pengaturan melalui Label Smoothing

Ini (kehilangan entropi silang), bagaimanapun, dapat menyebabkan dua masalah. Pertama, ini dapat menyebabkan pemasangan yang berlebihan: jika model belajar untuk menetapkan probabilitas penuh ke label groundtruth untuk setiap contoh pelatihan, itu tidak dijamin untuk digeneralisasi. Kedua, ini mendorong perbedaan antara logit terbesar dan semua yang lain untuk menjadi besar, dan ini, dikombinasikan dengan gradien terikat , mengurangi kemampuan model untuk beradaptasi. Secara intuitif, ini terjadi karena model menjadi terlalu percaya diri tentang prediksi.l/zk

Tetapi alih-alih menambahkan istilah penghalusan ke prediksi, mereka menambahkannya ke kebenaran dasar , yang ternyata bermanfaat.

masukkan deskripsi gambar di sini

Dalam percobaan ImageNet kami dengan K = 1000 kelas, kami menggunakan u (k) = 1/1000 dan = 0,1. Untuk ILSVRC 2012, kami telah menemukan peningkatan yang konsisten sekitar 0,2% absolut baik untuk kesalahan top-1 dan kesalahan top-5.ϵ

dontloo
sumber
3
Ada banyak karya tentang topik ini - github.com/subeeshvasu/Awesome-Learning-with-Label-Noise
guest_anonym

Jawaban:

10

Hal yang benar untuk dilakukan di sini adalah mengubah model, bukan kerugiannya. Tujuan Anda masih mengklasifikasikan poin data sebanyak mungkin dengan benar (yang menentukan kerugian), tetapi asumsi Anda tentang data telah berubah (yang dikodekan dalam model statistik , jaringan saraf dalam kasus ini).

Biarkan menjadi vektor probabilitas kelas yang dihasilkan oleh jaringan saraf dan menjadi kehilangan lintas-entropi untuk label . Untuk secara eksplisit mempertimbangkan asumsi bahwa 30% dari label adalah noise (diasumsikan acak secara acak), kita dapat mengubah model kita untuk menghasilkanhalt(yt,halt)yt

hal~t=0,3/N+0,7halt

sebagai gantinya dan optimalkan

t(yt,0,3/N+0,7halt),

di mana adalah jumlah kelas. Ini sebenarnya akan berperilaku agak sesuai dengan intuisi Anda, membatasi kerugian menjadi terbatas.N

Lucas
sumber
Bagaimana sama dengan . Jika kita mengambil dua case kelas maka akan menjadi . Demikian pula untuk . Mengapa istilah ? Terima kasihhal~t0,3/N+0,7halthal~tPrHaib(y~=+1|t)=0,7PrHaib(y=+1|t)+0,3PrHaib(y=-1|t)PrHaib(y~=-1|t)=0,7PrHaib(y=-1|t)+0,3PrHaib(y=+1|t)1/N
firasat
0

Saya menyadari bahwa ini adalah forum statistik dan harapannya adalah fokus pada derivasi matematika, tetapi jika itu bisa membantu dan Anda menggunakan Python, ada paket untuk klasifikasi dengan label berisik yang disebut cleanlab: https://github.com/ cgnorthcutt / cleanlab / .

The cleanlabpaket Python, pip install cleanlab, yang saya seorang penulis, penemuan label kesalahan dalam dataset dan mendukung klasifikasi / belajar dengan label berisik. Ia bekerja dengan scikit-learn, PyTorch, Tensorflow, FastText, dll.

Untuk belajar dengan label berisik.

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

Untuk menemukan kesalahan label pada dataset Anda.

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

Beberapa contoh dengan FastText (NLP) dan PyTorch (MNIST AlexNet).

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

cgnorthcutt
sumber