Классификация с шумными метками?

13

Я пытаюсь обучить нейронную сеть для классификации, но у меня довольно шумные ярлыки (около 30% ярлыков ошибочны).

Потеря перекрестной энтропии действительно работает, но мне было интересно, есть ли альтернативы, более эффективные в этом случае? или потеря кросс-энтропии является оптимальной?

Я не уверен, но я думаю о некоторой «отсечке» кросс-энтропийной потери, так что потеря для одной точки данных будет не больше некоторой верхней границы, будет ли это работать?

Спасибо!

Обновление
Согласно ответу Лукаса, я получил следующее для производных для прогнозного выхода и ввода функции softmax . Таким образом, я предполагаю, что по сути это добавление сглаживающего члена к производным. Производные для исходной кросс-энтропийной потери: 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
Пожалуйста, дайте мне знать, если я не прав. Спасибо!

Обновление
Я только что случайно прочитал статью Google, в которой применяется та же формула, что и в ответе Лукаса, но с разными интерпретациями.

В разделе 7 Регуляризация модели с помощью сглаживания меток

Это (перекрестная потеря энтропии), однако, может вызвать две проблемы. Во-первых, это может привести к переобучению: если модель учится назначать полную вероятность метке основополагающего факта для каждого примера обучения, обобщение не гарантируется. Во-вторых, он способствует тому, что различия между самым большим логитом и всеми остальными становятся большими, и это, в сочетании с ограниченным градиентом , снижает способность модели адаптироваться. Интуитивно это происходит потому, что модель становится слишком уверенной в своих прогнозах.l/zk

Но вместо того, чтобы добавить сглаживающий термин к предсказаниям, они добавили его в основную истину , которая оказалась полезной.

введите описание изображения здесь

В наших экспериментах ImageNet с классами K = 1000 мы использовали u (k) = 1/1000 и = 0.1. Для ILSVRC 2012 мы обнаружили постоянное улучшение примерно на 0,2% абсолютного как для ошибки топ-1, так и для ошибки топ-5.ϵ

dontloo
источник
3
Есть много работ на эту тему - github.com/subeeshvasu/Awesome-Learning-with-Label-Noise
guest_anonym

Ответы:

10

Здесь нужно изменить модель, а не потерю. Ваша цель по-прежнему состоит в том, чтобы правильно классифицировать как можно больше точек данных (что определяет потери), но ваши предположения о данных изменились (которые закодированы в статистической модели , в данном случае нейронной сети).

Пусть - вектор вероятностей классов, создаваемых нейронной сетью, а - потеря перекрестной энтропии для метки . Чтобы явно учесть предположение, что 30% меток являются шумом (предполагается, что они равномерно случайны), мы могли бы изменить нашу модель для полученияpt(yt,pt)yt

p~t=0.3/N+0.7pt

вместо этого и оптимизировать

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)1/NProb(y~=1|t)=0.7Prob(y=1|t)+0.3Prob(y=+1|t)1/N
предчувствие
0

Я признаю, что это форум статистики, и ожидание сосредоточено на математических выводах, но если это может быть полезно, и вы используете Python, есть пакет для классификации с шумными метками cleanlab: https://github.com/ cgnorthcutt / cleanlab / .

Пакет cleanlabPython pip install cleanlab, для которого я являюсь автором, находит ошибки меток в наборах данных и поддерживает классификацию / обучение с шумными метками. Работает с Scikit-Learn, PyTorch, Tensorflow, FastText и т. Д.

Для обучения с шумными метками.

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

Чтобы найти ошибки метки в вашем наборе данных.

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

Некоторые примеры с FastText (NLP) и PyTorch (MNIST AlexNet).

Документация: https://l7.curtisnorthcutt.com/cleanlab-python-package

cgnorthcutt
источник