6-bo‘lim

Yo'qotish funksiyasi va optimizator

MSE, MAE va CrossEntropy, optimizatorning uch qadami, SGD bilan Adam farqi va o'rganish tezligini tanlash.

🕑 9 daqiqa o‘qish 📄 717 so‘z 👁 0 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Yo'qotish: regressiya uchun
  2. Yo'qotish: tasniflash uchun
  3. Optimizatorning uch qadami
  4. SGD va Adam
  5. O'rganish tezligi
  6. Xulosa

Modelda parametrlar bor, lekin u hali nima o'rganishi kerakligini bilmaydi. Buning uchun ikkita narsa kerak:

  • Yo'qotish funksiyasi - «javobing qanchalik noto'g'ri» degan o'lchov.
  • Optimizator - o'sha xatoni kamaytirish uchun parametrlarni o'zgartiruvchi qoida.

Yo'qotish: regressiya uchun #

Uzluksiz sonni bashorat qilayotganda (narx, harorat, og'irlik) ikkita asosiy tanlov bor:

Python
import torch
import torch.nn as nn

bashorat = torch.tensor([2.5, 0.0, 2.1, 7.8])
haqiqiy  = torch.tensor([3.0, -0.5, 2.0, 7.0])

mse = nn.MSELoss()
mae = nn.L1Loss()

print("MSE:", round(mse(bashorat, haqiqiy).item(), 4))
print("MAE:", round(mae(bashorat, haqiqiy).item(), 4))
Natija
MSE: 0.2875
MAE: 0.475

Ichida nima bo'layotganini ko'rish uchun qo'lda hisoblaymiz:

Python
qol = bashorat - haqiqiy
print("qo'lda MSE:", round((qol ** 2).mean().item(), 4))
print("qo'lda MAE:", round(qol.abs().mean().item(), 4))
Natija
qo'lda MSE: 0.2875
qo'lda MAE: 0.475

Hech qanday sehr yo'q: MSE - farqlar kvadratining o'rtachasi, MAE - modullarining o'rtachasi.

FunksiyaFormulaXususiyati
nn.MSELoss(bashorat - haqiqiy)² o'rtachasiKatta xatoni qattiq jazolaydi
nn.L1Loss (MAE)(bashorat - haqiqiy).abs() o'rtachasiChetdagi qiymatlarga chidamli
nn.SmoothL1LossIkkalasining o'rtasiKichik xatoda MSE, kattada MAE
Qaysi birini tanlash

Ma'lumotingizda chetdagi g'alati qiymatlar (outlier) bo'lsa, MSE o'shalarga yopishib qoladi - chunki xato kvadratga ko'tariladi. Bunday holda MAE yoki SmoothL1Loss ni sinang.

Yo'qotish: tasniflash uchun #

Sinfni bashorat qilayotganda CrossEntropyLoss ishlatiladi:

Python
logit = torch.tensor([[2.0, 0.5, -1.0],
                      [0.1, 3.0,  0.2]])
nishon = torch.tensor([0, 1])

ce = nn.CrossEntropyLoss()
print("CrossEntropy:", round(ce(logit, nishon).item(), 4))
print("softmax:", torch.softmax(logit, dim=1).round(decimals=3).tolist())
Natija
CrossEntropy: 0.1755
softmax: [[0.786, 0.175, 0.039], [0.049, 0.896, 0.054]]

Birinchi namunada model 0-sinfga 78.6% ishondi, ikkinchisida 1-sinfga 89.6%. Ikkalasi ham to'g'ri, shuning uchun yo'qotish kichik.

CrossEntropyLoss ga softmax bermang

Bu eng ko'p uchraydigan xatolardan biri. nn.CrossEntropyLoss softmax ni o'z ichida bajaradi. Agar modelning oxiriga nn.Softmax qo'shsangiz, softmax ikki marta qo'llanadi.

Natija: model o'qiydi, lekin sekin va yomon - xato xabari chiqmaydi. Modelning oxirgi qatlami toza nn.Linear bo'lishi kerak, uning chiqishi esa logit deb ataladi.

Optimizatorning uch qadami #

Optimizator har doim bir xil uchlikda ishlatiladi:

Python
torch.manual_seed(42)

model = nn.Linear(1, 1)
print("boshlang'ich w =", round(model.weight.item(), 4), "| b =", round(model.bias.item(), 4))

opt = torch.optim.SGD(model.parameters(), lr=0.1)
x = torch.tensor([[1.0]])
y = torch.tensor([[2.0]])

for qadam in range(3):
    opt.zero_grad()
    yoqotish = mse(model(x), y)
    yoqotish.backward()
    print(f"  {qadam+1}: yo'qotish={yoqotish.item():.4f}  w.grad={model.weight.grad.item():.4f}  w={model.weight.item():.4f}")
    opt.step()

print("oxirgi w =", round(model.weight.item(), 4))
Natija
boshlang'ich w = 0.7645 | b = 0.83
  1: yo'qotish=0.1644  w.grad=-0.8109  w=0.7645
  2: yo'qotish=0.0592  w.grad=-0.4865  w=0.8456
  3: yo'qotish=0.0213  w.grad=-0.2919  w=0.8943
oxirgi w = 0.9235

Yo'qotish 0.16 dan 0.02 gacha tushdi, w esa o'sib bordi. Gradient manfiy edi - demak w ni oshirish kerak, optimizator aynan shuni qildi.

Har bir o'quv qadamida takrorlanadigan uchlik 1. zero_grad() eski gradientlarni tozalaydi 2. backward() yangi gradientlarni hisoblaydi 3. step() parametrlarni yangilaydi keyingi paket uchun qaytadan Tartibni buzmang step() ni backward() dan oldin qo'ysangiz, model eski gradient bilan yangilanadi
zero_grad -> backward -> step: bu uchlik har bir paketda takrorlanadi

SGD va Adam #

Optimizatorlar gradientdan qanday foydalanishi bilan farq qiladi. Ularni halqa shaklidagi sun'iy masalada solishtiramiz:

Python
X = torch.randn(500, 2)
y = ((X[:, 0] ** 2 + X[:, 1] ** 2) < 1.0).long()
kriteriya = nn.CrossEntropyLoss()

def tarmoq():
    torch.manual_seed(42)
    return nn.Sequential(nn.Linear(2, 16), nn.ReLU(),
                         nn.Linear(16, 16), nn.ReLU(),
                         nn.Linear(16, 2))

for nom, yasa in [("SGD (lr=0.05)", lambda p: torch.optim.SGD(p, lr=0.05)),
                  ("SGD + momentum", lambda p: torch.optim.SGD(p, lr=0.05, momentum=0.9)),
                  ("Adam (lr=0.05)", lambda p: torch.optim.Adam(p, lr=0.05))]:
    model = tarmoq()
    opt = yasa(model.parameters())
    for _ in range(100):
        opt.zero_grad()
        yoqotish = kriteriya(model(X), y)
        yoqotish.backward()
        opt.step()
    aniqlik = (model(X).argmax(dim=1) == y).float().mean().item()
    print(f"{nom:16s} yo'qotish = {yoqotish.item():.4f}   aniqlik = {aniqlik:.1%}")
Natija
SGD (lr=0.05)    yo'qotish = 0.5934   aniqlik = 62.6%
SGD + momentum   yo'qotish = 0.0886   aniqlik = 99.0%
Adam (lr=0.05)   yo'qotish = 0.0112   aniqlik = 100.0%

Bir xil model, bir xil urug', bir xil qadamlar soni - lekin natija juda boshqacha. Oddiy SGD 100 qadamda deyarli hech narsa o'rganmadi, Adam esa masalani to'liq yechdi.

Bu har doim shunday emas

Oddiy chiziqli masalada (nn.Linear bitta o'zi) natija teskari bo'ladi: u yerda SGD tezroq yaqinlashadi. Adam ning ustunligi ko'p qatlamli, notekis masalalarda ko'rinadi - real loyihalarda esa aynan shunday masalalar uchraydi.

OptimizatorQachon ishlatiladi
SGD(lr=...)Oddiy, sozlash talab qiladi, chiziqli masalalarda kuchli
SGD(momentum=0.9)Klassik tasvir modellarida - SGD dan ancha yaxshi
Adam(lr=1e-3)Birinchi tanlov: deyarli sozlashsiz ishlaydi
AdamW(lr=1e-3)Adam + to'g'ri weight decay - katta modellarda standart

O'rganish tezligi #

lr (learning rate) - eng muhim sozlama. U har qadamda qanchalik katta siljish qilinishini belgilaydi:

lr juda kichiklr to'g'rilr juda katta
Yo'qotish sekin tushadiBarqaror tushadiSakraydi yoki nan bo'ladi
Soatlab kutasizBir necha davrda natijaModel umuman o'qimaydi
Qayerdan boshlash

Adam uchun lr=1e-3 (0.001) - eng ko'p ishlatiladigan boshlang'ich qiymat. Yo'qotish tushmasa 10 barobar kichraytiring, juda sekin tushsa 10 barobar kattalashtiring. Boshqa sozlamalarga tegishdan oldin lr ni to'g'rilang.

Amaliy topshiriq
  1. MSE va MAE ni bir xil bashoratlar uchun hisoblang va farqini tushuntiring.
  2. Bitta bashoratni 100 ga o'zgartirib, qaysi yo'qotish ko'proq o'sganini ko'ring.
  3. CrossEntropyLoss ni to'g'ri va noto'g'ri nishon bilan sinab, qiymatni solishtiring.
  4. Modelga nn.Softmax qo'shib, o'qish sekinlashganini kuzating, keyin olib tashlang.
  5. zero_grad -> backward -> step uchligini 5 qadam davomida chop eting.
  6. step() ni backward() dan oldin qo'yib, natija qanday buzilganini ko'ring.
  7. lr ni 0.001, 0.05 va 5.0 qilib, uchta natijani jadvalga yozing.
  8. Xuddi shu masalada SGD va Adam ni taqqoslang.
  9. SGD ga momentum=0.9 qo'shib, farqni o'lchang.
  10. AdamW ni sinab, Adam bilan natijasini solishtiring.

Xulosa #

  • Yo'qotish funksiyasi modelning javobi qanchalik noto'g'riligini bitta songa aylantiradi.
  • Regressiya uchun MSELoss, chetdagi qiymatlar ko'p bo'lsa L1Loss.
  • MSE xatoni kvadratga ko'taradi - shuning uchun katta xatolarga o'ta sezgir.
  • Tasniflash uchun CrossEntropyLoss ishlatiladi.
  • U softmax ni o'z ichida bajaradi - modelning oxiriga softmax qo'shmang.
  • Optimizator har qadamda uchta amalni bajaradi: zero_grad(), backward(), step().
  • Bu tartibni buzsangiz, model eski gradient bilan yangilanadi.
  • Adam ko'p qatlamli masalalarda deyarli sozlashsiz ishlaydi - birinchi tanlov shu.
  • Oddiy chiziqli masalada SGD tezroq bo'lishi mumkin - «eng yaxshi optimizator» degan narsa yo'q.
  • lr eng muhim sozlama: Adam uchun 1e-3 dan boshlang, kerak bo'lsa 10 barobarga o'zgartiring.

Keyingi bo'limda ma'lumotni modelga paket-paket yetkazib beradigan Dataset va DataLoader bilan tanishamiz.

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.