การจำแนกประเภทที่มีป้ายกำกับที่มีเสียงดัง?


14

ฉันพยายามฝึกอบรมเครือข่ายประสาทเทียมเพื่อจัดหมวดหมู่ แต่ป้ายกำกับที่ฉันมีเสียงค่อนข้างดัง (ประมาณ 30% ของป้ายกำกับผิด)

การสูญเสียข้ามเอนโทรปีใช้งานได้จริง แต่ฉันสงสัยว่ามีทางเลือกอื่นที่มีประสิทธิภาพมากกว่าในกรณีนี้หรือไม่? หรือการสูญเสียข้ามเอนโทรปีเหมาะสมที่สุดหรือไม่

ฉันไม่แน่ใจ แต่ฉันคิดว่าค่อนข้าง "ตัด" การสูญเสียข้ามเอนโทรปีดังนั้นการสูญเสียจุดข้อมูลหนึ่งจุดจะไม่เกินขอบเขตบน

ขอบคุณ!

ปรับปรุง
ตามคำตอบของลูคัสผมได้ต่อไปนี้สำหรับสัญญาซื้อขายล่วงหน้าสำหรับการส่งออกการทำนายและใส่ของฟังก์ชัน softmax Zดังนั้นฉันเดาว่ามันคือการเพิ่มเทอมที่ราบรื่นลงในอนุพันธ์ สัญญาซื้อขายล่วงหน้าสำหรับการสูญเสียข้ามเอนโทรปีดั้งเดิม: z 3yz Pฉัน=0.3/N+0.7YฉันL=-Σทีฉันเข้าสู่ระบบ(Pฉัน)ลิตร37N

pi=0.3/N+0.7yi
l=tilog(pi)
l
lyi=tilog(pi)pipiyi=0.7tipi=ti37N+yi
lzi=0.7jtjpjyjzi=yijtjyj37N+yjtiyi37N+yi
lyi=tiyi
lzi=yiti
โปรดแจ้งให้เราทราบหากฉันผิด ขอบคุณ!

อัปเดต
ฉันเพิ่งอ่านบทความโดย Googleที่ใช้สูตรเดียวกันกับคำตอบของลูคัส แต่มีการตีความที่แตกต่างกัน

ในส่วนที่ 7 การทำให้เป็นมาตรฐานโมเดลผ่านการปรับให้เรียบของฉลาก

อย่างไรก็ตามการสูญเสียเอนโทรปีนี้อาจทำให้เกิดปัญหาสองประการ ขั้นแรกมันอาจส่งผลให้เกิดความกระชับมากเกินไป: ถ้าแบบจำลองเรียนรู้ที่จะกำหนดความน่าจะเป็นแบบเต็มให้กับป้ายชื่อจริงสำหรับแต่ละตัวอย่างการฝึกอบรมมันไม่รับประกันว่าจะพูดคุยกัน ประการที่สองมันกระตุ้นให้เกิดความแตกต่างระหว่าง logit ที่ใหญ่ที่สุดและอื่น ๆ ทั้งหมดที่จะกลายเป็นขนาดใหญ่และสิ่งนี้รวมกับการไล่ระดับสีล้อมรอบลดความสามารถของแบบจำลองในการปรับตัว สิ่งนี้เกิดขึ้นเพราะตัวแบบมีความมั่นใจในการทำนายมากเกินไปl/zk

แต่แทนที่จะเพิ่มคำที่ปรับให้เรียบลงในการทำนายพวกเขาเพิ่มเข้าไปในความจริงพื้นฐานซึ่งกลายเป็นประโยชน์

ป้อนคำอธิบายรูปภาพที่นี่

ในการทดสอบ ImageNet ด้วย K = 1,000 คลาสเราใช้ u (k) = 1/1000 และ = 0.1 สำหรับ ILSVRC 2012 เราพบว่ามีการปรับปรุงอย่างสม่ำเสมอประมาณ 0.2% แน่นอนสำหรับทั้งข้อผิดพลาดอันดับ 1 และข้อผิดพลาดอันดับ 5ϵ


3
มีงานมากมายในหัวข้อนี้ - github.com/subeeshvasu/Awesome-Learning-with-Label-Noise
guest_anonym

คำตอบ:


10

สิ่งที่ถูกต้องที่นี่คือการเปลี่ยนรูปแบบไม่ใช่การสูญเสีย เป้าหมายของคุณยังคงจัดประเภทจุดข้อมูลให้ถูกต้องมากที่สุดเท่าที่จะทำได้ (ซึ่งเป็นตัวกำหนดความสูญเสีย) แต่สมมติฐานของคุณเกี่ยวกับข้อมูลได้เปลี่ยนไป (ซึ่งถูกเข้ารหัสในรูปแบบสถิติเครือข่ายประสาทเทียมในกรณีนี้)

Letเป็นเวกเตอร์ของความน่าจะเป็นระดับที่ผลิตโดยเครือข่ายประสาทและจะมีการสูญเสียข้ามเอนโทรปีสำหรับฉลากy_tหากต้องการคำนึงถึงสมมติฐานอย่างชัดเจนว่า 30% ของฉลากเป็นเสียงรบกวน (สันนิษฐานว่าเป็นแบบสุ่มอย่างสม่ำเสมอ) เราสามารถเปลี่ยนแบบจำลองของเราเพื่อผลิต( y t , p t ) y tpt(yt,pt)yt

p~t=0.3/N+0.7pt

แทนและเพิ่มประสิทธิภาพ

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

โดยที่คือจำนวนคลาส สิ่งนี้จะทำตัวตามสัญชาตญาณของคุณ จำกัด การสูญเสียให้ จำกัดN


วิธีการคือเท่ากับ+ ถ้าเราใช้สองกรณีคลาสจะเป็น . ในทำนองเดียวกันสำหรับt) ทำไมต้องเลือก ? ขอบคุณ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

ฉันรู้ว่านี่เป็นฟอรัมสถิติและความคาดหวังคือการมุ่งเน้นไปที่การคำนวณทางคณิตศาสตร์ แต่ถ้าเป็นประโยชน์และคุณกำลังใช้ Python จะมีแพ็คเกจสำหรับการจำแนกประเภทที่มีป้ายกำกับที่มีเสียงดังเรียกว่าcleanlab: https://github.com/ cgnorthcutt / cleanlab /

cleanlabแพคเกจหลามpip install cleanlabซึ่งผมเป็นผู้เขียนพบข้อผิดพลาดฉลากในชุดข้อมูลและสนับสนุนการจัดหมวดหมู่ / การเรียนรู้ที่มีป้ายชื่อที่มีเสียงดัง มันทำงานร่วมกับ scikit เรียนรู้, 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.