Bu modulda chuqur o’rganishning mexanizmi ochildi: neyron tarmoq qanday tuziladi va u qanday o’qitiladi.
Neyron tarmoq tuzilishi
Neyron tarmoq — oddiy amallarning qatlam-qatlam zanjiri. Bitta qatlam kirishni chiziqli o’zgartiradi (z = Wx + b), so’ng natijadan aktivatsiya funksiyasi o’tkaziladi. Aktivatsiyasiz istalgancha qatlam ham bitta chiziqli funksiyaga yig’ilib qolardi — aynan nochiziqlilik tarmoqqa murakkab bog’lanishlarni o’rganish imkonini beradi.
Keng tarqalgan aktivatsiyalar:
| Funksiya | Formula | Qayerda |
|---|---|---|
| ReLU | max(0, z) | yashirin qatlamlarning standarti |
| Sigmoid | 1/(1+e⁻ᶻ) | ikkilik klassifikatsiya chiqishi |
| Softmax | eᶻⁱ/Σeᶻʲ | ko’p sinfli chiqish (ehtimollar) |
Kirishdan chiqishgacha hisoblab borish forward pass deyiladi:
import torch
import torch.nn as nn
model = nn.Sequential(
nn.Linear(4, 16), # 4 xususiyat -> 16 neyron
nn.ReLU(),
nn.Linear(16, 3), # 16 -> 3 sinf
)
x = torch.rand(8, 4) # 8 misolli batch
print(model(x).shape)
Natija:
torch.Size([8, 3])
Loss: xatoni o’lchash
Tarmoq javobini haqiqiy javob bilan solishtiradigan funksiya — loss. Regressiyada MSE (nn.MSELoss), klassifikatsiyada cross-entropy (nn.CrossEntropyLoss) ishlatiladi. E’tibor: PyTorch’ning CrossEntropyLossi ichida softmax bor — modelning oxiriga yana softmax qo’yish keng tarqalgan xato (ehtimollar ikki marta "yumshab", o’qitish sustlashadi).
Backpropagation va gradient
O’qitish savoli: lossni kamaytirish uchun millionlab og’irlikning har birini qaysi tomonga surish kerak? Javobni backpropagation beradi — hosila olishning zanjir qoidasini hisoblash grafi bo’ylab orqaga qo’llab, har bir parametr uchun gradientni topadi. PyTorch buni avtomatik qiladi:
loss = loss_fn(model(x), y) # forward
loss.backward() # backward: hamma gradientlar hisoblanadi
backward() gradientlarni parametrlarning .grad maydoniga qo’shib boradi — shuning uchun har iteratsiya oldidan optimizer.zero_grad() chaqirilmasa, gradientlar yig’ilib ketib o’qitish buziladi. Bu — yangi boshlovchining eng klassik xatosi.
Optimizatorlar
Gradient tayyor bo’lgach, parametrlarni yangilash usulini optimizator belgilaydi. SGD — sof gradient qadami (w -= lr * grad); Adam — har parametrga moslashuvchan qadam tanlaydigan, amalda eng ko’p ishlatiladigan standart boshlanish nuqtasi:
optimizer = torch.optim.Adam(model.parameters(), lr=1e-3)
Learning rate bu yerda ham bosh sozlama: katta — loss sakraydi, kichik — o’qitish cho’zilib ketadi. 1e-3 (Adam uchun) — oqilona boshlang’ich qiymat.
Amaliyot
- Yuqoridagi
nn.Sequentialmodelini terib,model(x).shapechiqishini o’zingiz izohlang (nega 8 va nega 3?). - ReLU’ni qo’lda yozing (
torch.clamp(z, min=0)) vann.ReLU()bilan bir xil natija berishini tekshiring. w = torch.tensor(2.0, requires_grad=True)uchunloss = (w*3 - 12)**2ni hisoblabbackward()chaqiring;w.gradqiymatini qo’lda tekshiring.- Aktivatsiyasiz ikki
Linearqatlam nima uchun bittaLinearga teng ekanini bir jumlada yozing. zero_grad()tashlab ketilsa gradientlarga nima bo’lishini 3-mashq kodida ikki martabackward()chaqirib ko’rsating.
Modul testi keyingi darsda.