11-bo‘lim
Ortiqcha moslashish
Overfitting va underfitting, o'quv va validatsiya egri chiziqlari, yodlash belgilari va muammoni qanday aniqlash.
Ushbu bo‘lim mundarijasi
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):
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 #
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])
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.
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")
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.
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 #
Belgilarni tanish #
| Belgi | Tashxis |
|---|---|
| O'quv yo'qotishi 0 ga yaqin, validatsiya o'smoqda | Ortiqcha moslashish |
| Ikkalasi ham yuqori va tushmayapti | Kam moslashish |
| Ikkalasi ham tushmoqda | Hammasi joyida, davom eting |
| O'quv aniqligi 100%, validatsiya 70% | Yodlab olgan |
| Validatsiya aniqligi o'quvdan yuqori | Odatda eval() yoki bo'lishda xato bor |
Validatsiya to'plami odatda o'quvdan oson emas. Agar validatsiya natijasi tizimli ravishda yaxshiroq chiqsa, sabablar:
model.eval()chaqirilmagan vaDropouto'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 #
| Sabab | Izohi |
|---|---|
| Ma'lumot kam | Model qonuniyat o'rniga namunalarni yodlaydi |
| Model juda katta | 60 namuna uchun 68 000 parametr - haddan ziyod |
| Juda ko'p davr | Eng yaxshi nuqtadan o'tib ketiladi |
| Shovqinli belgilar | Model tasodifiy aloqalarni «qoida» deb qabul qiladi |
| Ma'lumot sizib chiqishi | Javob bilvosita belgilar ichida yashiringan |
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.
- Yuqoridagi kodni ishga tushirib, ikkala yo'qotishni kuzating.
- Eng past validatsiya yo'qotishi qaysi davrda bo'lganini toping.
- 200-davrdagi qiymat undan necha barobar yomonligini hisoblang.
- O'quv yo'qotishi nega aynan 0.0000 ga tushganini tushuntiring.
- Aniqlik deyarli o'zgarmagani holda yo'qotish nega oshganini yozing.
- O'quv namunalarini 60 dan 600 ga oshirib, natijani solishtiring.
- Yashirin qatlamni 256 dan 16 ga kamaytirib, farqni ko'ring.
shovqinni 0.25 dan 1.0 ga oshirib, natijaga ta'sirini kuzating.- Davrlar sonini 20 ga qisqartirib, validatsiya natijasi yaxshilanganini tekshiring.
- 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.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
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.