Classificação com etiquetas barulhentas?

13

Estou tentando treinar uma rede neural para classificação, mas os rótulos que tenho são bastante barulhentos (cerca de 30% deles estão errados).

A perda de entropia cruzada realmente funciona, mas eu queria saber se existem alternativas mais eficazes nesse caso. ou a perda de entropia cruzada é a ideal?

Não tenho certeza, mas estou pensando em "recortar" a perda de entropia cruzada, de modo que a perda de um ponto de dados não seja maior que um limite superior, isso funcionará?

Obrigado!

Atualização
De acordo com a resposta de Lucas, obtive o seguinte para as derivadas da saída de previsão entrada da função softmax z . Então eu acho que basicamente ele está adicionando um termo de suavização 3yz para os derivados. pi=0,3/N+0,7yil=-Σtilog(pi)l37N

pi=0.3/N+0.7yi
l=tilog(pi)
l
lyi=tilog(pi)pipiyi=0.7tipi=ti37N+yi
Derivados para a perda de entropia cruzada original: l
lzi=0.7jtjpjyjzi=yijtjyj37N+yjtiyi37N+yi
l
lyi=tiyi
Por favor, deixe-me saber se eu estiver errado. Obrigado!
lzi=yiti

Atualização
Acabei de ler um artigo do Google que aplica a mesma fórmula da resposta de Lucas, mas com interpretações diferentes.

Na Seção 7, Regularização do modelo via suavização de etiquetas

l/zk

Mas, em vez de adicionar o termo suavizado às previsões, eles o acrescentaram à verdade básica , que acabou sendo útil.

insira a descrição da imagem aqui

ϵ

dontloo
fonte
3
Existem numerosos trabalhos sobre este tema - github.com/subeeshvasu/Awesome-Learning-with-Label-Noise
guest_anonym

Respostas:

10

A coisa certa a fazer aqui é mudar o modelo, não a perda. Seu objetivo ainda é classificar corretamente o maior número possível de pontos de dados (o que determina a perda), mas suas suposições sobre os dados foram alteradas (que são codificadas em um modelo estatístico , a rede neural nesse caso).

pt(yt,pt)yt

p~t=0.3/N+0.7pt

em vez disso e otimizar

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

N

Lucas
fonte
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

Reconheço que este é um fórum de estatísticas e a expectativa é um foco em derivações matemáticas, mas se puder ser útil e você estiver usando Python, há um pacote de classificação com rótulos barulhentos chamado cleanlab: https://github.com/ cgnorthcutt / cleanlab / .

O cleanlabpacote Python pip install cleanlab, do qual sou autor, encontra erros de rótulo nos conjuntos de dados e suporta classificação / aprendizado com rótulos barulhentos. Funciona com o scikit-learn, PyTorch, Tensorflow, FastText, etc.

Para aprender com etiquetas barulhentas.

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

Para encontrar erros de etiqueta no seu conjunto de dados.

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

Alguns exemplos com FastText (NLP) e PyTorch (MNIST AlexNet).

Documentação: https://l7.curtisnorthcutt.com/cleanlab-python-package

cgnorthcutt
fonte