11-bo‘lim

Ortiqcha moslashish

Overfitting va underfitting, o'quv va validatsiya egri chiziqlari, yodlash belgilari va muammoni qanday aniqlash.

🕑 6 daqiqa o‘qish 📄 612 so‘z 👁 0 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Muammoni ko'rsatamiz
  2. 200 davr o'qitamiz
  3. Ikki chekka
  4. Belgilarni tanish
  5. Sabablari
  6. Xulosa

Bir model o'quv to'plamida 100% aniqlik beradi, lekin yangi ma'lumotda 88% da qotib qoladi. Bu ortiqcha moslashish (overfitting) - chuqur o'rganishdagi eng keng tarqalgan muammo.

Muammoni ko'rsatamiz #

Ataylab yomon sharoit yaratamiz: oz ma'lumot (60 namuna) va katta model (256 neyronli ikki qatlam):

Python
import torch
import torch.nn as nn
from torch.utils.data import TensorDataset, DataLoader

def malumot(n_oquv=60, n_valid=400, shovqin=0.25, urug=42):
    g = torch.Generator().manual_seed(urug)
    X = torch.randn(n_oquv + n_valid, 8, generator=g)
    mantiq = (X[:, 0] * 1.5 - X[:, 1] + X[:, 2] * 0.5)
    mantiq = mantiq + torch.randn(len(X), generator=g) * shovqin
    y = (mantiq > 0).long()
    return (TensorDataset(X[:n_oquv], y[:n_oquv]),
            TensorDataset(X[n_oquv:], y[n_oquv:]))

def tarmoq(yashirin=256, dropout=0.0):
    torch.manual_seed(0)
    qatlamlar = [nn.Linear(8, yashirin), nn.ReLU()]
    if dropout: qatlamlar.append(nn.Dropout(dropout))
    qatlamlar += [nn.Linear(yashirin, yashirin), nn.ReLU()]
    if dropout: qatlamlar.append(nn.Dropout(dropout))
    qatlamlar.append(nn.Linear(yashirin, 2))
    return nn.Sequential(*qatlamlar)

Faqat 3 ta belgi (X[0], X[1], X[2]) javobga ta'sir qiladi, qolgan 5 tasi - shovqin. Modelda esa 68 mingdan ortiq parametr bor.

200 davr o'qitamiz #

Python
kriteriya = nn.CrossEntropyLoss()

def baholash(model, dl):
    model.eval(); j = t = 0; yo = 0.0
    with torch.no_grad():
        for xb, yb in dl:
            o = model(xb)
            yo += kriteriya(o, yb).item() * len(yb)
            t += (o.argmax(1) == yb).sum().item()
            j += len(yb)
    return yo / j, t / j

def oqit(model, oquv_dl, valid_dl, davrlar=200, wd=0.0, chop=None):
    opt = torch.optim.Adam(model.parameters(), lr=0.01, weight_decay=wd)
    tarix = []
    for davr in range(1, davrlar + 1):
        model.train(); s = 0.0; n = 0
        for xb, yb in oquv_dl:
            opt.zero_grad()
            l = kriteriya(model(xb), yb)
            l.backward(); opt.step()
            s += l.item() * len(yb); n += len(yb)
        vy, va = baholash(model, valid_dl)
        tarix.append((davr, s / n, vy, va))
        if chop and davr in chop:
            print(f"{davr:5d} | {s/n:10.4f} | {vy:12.4f} | {va:13.2%}")
    return tarix

oquv, valid = malumot()
torch.manual_seed(7)
oquv_dl = DataLoader(oquv, batch_size=16, shuffle=True)
valid_dl = DataLoader(valid, batch_size=64)

print("Davr | O'quv yo'q. | Valid. yo'q. | Valid. aniqlik")
print("------|------------|--------------|---------------")
tarix = oqit(tarmoq(), oquv_dl, valid_dl, 200, chop=[1,5,10,25,50,100,150,200])
Natija
Davr | O'quv yo'q. | Valid. yo'q. | Valid. aniqlik
------|------------|--------------|---------------
    1 |     0.5389 |       0.5705 |        69.50%
    5 |     0.0106 |       0.4183 |        88.00%
   10 |     0.0001 |       0.6221 |        88.25%
   25 |     0.0000 |       0.7558 |        88.25%
   50 |     0.0000 |       0.7649 |        88.50%
  100 |     0.0000 |       0.7771 |        88.25%
  150 |     0.0000 |       0.7869 |        88.25%
  200 |     0.0000 |       0.7954 |        88.25%

Diqqat bilan qarang. O'quv yo'qotishi 0.0000 ga tushdi - model 60 ta namunani to'liq yodlab oldi. Validatsiya yo'qotishi esa 10-davrdan keyin o'sishda davom etdi.

Python
eng = min(tarix, key=lambda r: r[2])
print(f"eng past validatsiya yo'qotishi: {eng[2]:.4f} ({eng[0]}-davrda)")
print(f"200-davrda: {tarix[-1][2]:.4f}  -> {tarix[-1][2]/eng[2]:.1f} barobar yomon")
Natija
eng past validatsiya yo'qotishi: 0.1604 (3-davrda)
200-davrda: 0.7954  -> 5.0 barobar yomon

Eng yaxshi model 3-davrda edi. Qolgan 197 davr uni faqat yomonlashtirdi.

Faqat aniqlikka qarab xulosa qilmang

Yuqoridagi jadvalda aniqlik 88% atrofida deyarli o'zgarmadi - ko'rinishdan hech nima yomonlashmagandek.

Lekin yo'qotish 5 barobar oshdi. Bu degani: model bir xil javoblarni beryapti, lekin ularga haddan tashqari ishonch bilan. Noto'g'ri javoblarda ham 99% ishonch bildiradi. Bunday modelga tayanib bo'lmaydi.

Shuning uchun ikkala o'lchovni ham kuzating.

Ikki chekka #

Uch xil holat Kam moslashish underfitting O'quv: yomon Validatsiya: yomon Model juda sodda yoki kam o'qitilgan To'g'ri muvozanat maqsad shu O'quv: yaxshi Validatsiya: yaxshi Umumiy qonuniyatni o'rgangan Ortiqcha moslashish overfitting O'quv: mukammal Validatsiya: yomon Shovqinni ham yodlab olgan Farqni faqat model ko'rmagan ma'lumot ko'rsatadi shuning uchun validatsiya to'plami har doim kerak
Ortiqcha moslashgan model ma'lumotdagi shovqinni ham qoida deb qabul qiladi

Belgilarni tanish #

BelgiTashxis
O'quv yo'qotishi 0 ga yaqin, validatsiya o'smoqdaOrtiqcha moslashish
Ikkalasi ham yuqori va tushmayaptiKam moslashish
Ikkalasi ham tushmoqdaHammasi joyida, davom eting
O'quv aniqligi 100%, validatsiya 70%Yodlab olgan
Validatsiya aniqligi o'quvdan yuqoriOdatda eval() yoki bo'lishda xato bor
Nega oxirgi qator xato belgisi?

Validatsiya to'plami odatda o'quvdan oson emas. Agar validatsiya natijasi tizimli ravishda yaxshiroq chiqsa, sabablar:

  • model.eval() chaqirilmagan va Dropout o'quvni qiyinlashtiryapti (kichik farq normal).
  • Validatsiya to'plamiga o'quv namunalari tushib qolgan (ma'lumot sizib chiqishi).
  • Validatsiya to'plami juda kichik va natija tasodifiy.

Sabablari #

SababIzohi
Ma'lumot kamModel qonuniyat o'rniga namunalarni yodlaydi
Model juda katta60 namuna uchun 68 000 parametr - haddan ziyod
Juda ko'p davrEng yaxshi nuqtadan o'tib ketiladi
Shovqinli belgilarModel tasodifiy aloqalarni «qoida» deb qabul qiladi
Ma'lumot sizib chiqishiJavob bilvosita belgilar ichida yashiringan
Ortiqcha moslashish - yomon xabar emas

Agar modelingiz ortiqcha moslashayotgan bo'lsa, demak u o'rganishga qodir. Bu muammoni yechish mumkin: keyingi bo'lim aynan shu haqda.

Haqiqiy yomon holat - model hech nima o'rgana olmasligi (kam moslashish). U yerda avval model kuchini oshirish kerak.

Amaliy topshiriq
  1. Yuqoridagi kodni ishga tushirib, ikkala yo'qotishni kuzating.
  2. Eng past validatsiya yo'qotishi qaysi davrda bo'lganini toping.
  3. 200-davrdagi qiymat undan necha barobar yomonligini hisoblang.
  4. O'quv yo'qotishi nega aynan 0.0000 ga tushganini tushuntiring.
  5. Aniqlik deyarli o'zgarmagani holda yo'qotish nega oshganini yozing.
  6. O'quv namunalarini 60 dan 600 ga oshirib, natijani solishtiring.
  7. Yashirin qatlamni 256 dan 16 ga kamaytirib, farqni ko'ring.
  8. shovqin ni 0.25 dan 1.0 ga oshirib, natijaga ta'sirini kuzating.
  9. Davrlar sonini 20 ga qisqartirib, validatsiya natijasi yaxshilanganini tekshiring.
  10. Har uch holat (kam, to'g'ri, ortiqcha) uchun bittadan misol yozing.

Xulosa #

  • Ortiqcha moslashish - model o'quv ma'lumotini yodlab, yangisida yomon ishlashi.
  • Belgisi: o'quv yo'qotishi tushib boradi, validatsiya yo'qotishi o'sadi.
  • Bizning misolda eng yaxshi model 3-davrda edi, qolgan 197 davr uni yomonlashtirdi.
  • Aniqlik o'zgarmagani holda yo'qotish oshishi mumkin - model noto'g'ri javobga ishonch ortiradi.
  • Shuning uchun aniqlik va yo'qotishni birga kuzating.
  • Kam moslashish - teskari muammo: ikkala yo'qotish ham yuqori qoladi.
  • Asosiy sabablar: ma'lumot kamligi, model kattaligi, davr ko'pligi, shovqinli belgilar.
  • Validatsiya natijasi o'quvdan tizimli yaxshi bo'lsa, kodda xato yoki ma'lumot sizib chiqqan.
  • Muammoni faqat model ko'rmagan ma'lumot ochib beradi.
  • Ortiqcha moslashish model o'rganishga qodir ekanini bildiradi - bu tuzatiladigan holat.

Keyingi bo'limda uni tuzatishning beshta usulini o'lchab ko'ramiz.

Xatolik topdingizmi?

Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.