시끄러운 레이블로 분류?


14

분류를 위해 신경망을 훈련하려고하지만 레이블이 다소 시끄 럽습니다 (라벨의 약 30 %가 잘못되었습니다).

교차 엔트로피 손실이 실제로 작동하지만이 경우 더 효과적인 대안이 있는지 궁금합니다. 또는 교차 엔트로피 손실이 최적입니까?

확실하지는 않지만 교차 엔트로피 손실을 어느 정도 "클리핑"하여 하나의 데이터 포인트에 대한 손실이 상한보다 크지 않을 것이라고 생각하고 있습니까?

감사!

업데이트
Lucas의 답변에 따르면, 나는 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
내가 틀렸다면 알려주십시오. 감사!

업데이트
방금 Lucas의 답변과 동일한 공식을 적용하지만 해석이 다른 Google의 논문 을 읽었습니다 .

섹션 7 레이블 평활화를 통한 모델 정규화

그러나이 문제 (교차 엔트로피 손실)는 두 가지 문제를 일으킬 수 있습니다. 먼저, 과적 합을 초래할 수 있습니다. 모형이 각 훈련 예에 대한 근거 정보에 완전한 확률을 할당하는 것을 배우면 일반화 할 수는 없습니다. 둘째, 가장 큰 로짓과 다른 모든 의 차이가 커지도록 장려하며, 경계 경사 와 결합 하면 모형의 적응 능력이 감소합니다. 직관적으로, 이것은 모델이 예측에 대해 너무 확신하기 때문에 발생합니다.l/zk

그러나 평활화 용어를 예측에 추가하는 대신,이를 기초 사실에 추가하여 도움이되는 것으로 나타났습니다.

여기에 이미지 설명을 입력하십시오

K = 1000 클래스의 ImageNet 실험에서 u (k) = 1/1000 및 = 0.1을 사용했습니다. ILSVRC 2012의 경우 상위 1 개 오류와 상위 5 개 오류 모두에 대해 약 0.2 % 절대 값이 지속적으로 개선되었습니다.ϵ


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

나는 이것이 통계 포럼이고 수학 기대에 대한 기대가 있음을 알고 있지만, 유용하고 파이썬을 사용하는 경우 시끄러운 레이블이있는 분류 패키지가 있습니다 cleanlab: https://github.com/ cgnorthcutt / cleanlab / .

cleanlab파이썬 패키지는 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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.