18-bo‘lim
Neyron tarmoqlar asoslari
Perseptron, ko'p qatlamli tarmoq, faollashtirish funksiyalari, teskari tarqalish va chuqur o'qitishga kirish.
Ushbu bo‘lim mundarijasi
Neyron tarmoqlar - zamonaviy sun'iy intellektning asosi. Ular ovozni tanish, tarjima va rasm yaratishning ortida turadi.
Sun'iy neyron #
import numpy as np
def neyron(kirishlar, vaznlar, siljish):
yigindi = np.dot(kirishlar, vaznlar) + siljish
return 1 / (1 + np.exp(-yigindi)) # sigmoid
kirishlar = np.array([0.5, 0.3, 0.8])
vaznlar = np.array([0.4, -0.2, 0.7])
siljish = 0.1
print(f"Chiqish: {neyron(kirishlar, vaznlar, siljish):.4f}")
Chiqish: 0.6900
Formulani solishtiring:
Logistik regressiya: y = sigmoid(w·x + b)
Bitta neyron: y = f(w·x + b)
Ular bir xil. Kuch neyronlarni ko'p qatlamda birlashtirishdan paydo bo'ladi.
Nima uchun ko'p qatlam kerak? #
Bitta neyron faqat chiziqli chegara chiza oladi. Klassik misol - XOR masalasi:
| x1 | x2 | XOR |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
from sklearn.linear_model import LogisticRegression
X_xor = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
y_xor = np.array([0, 1, 1, 0])
model = LogisticRegression().fit(X_xor, y_xor)
print(f"Chiziqli model aniqligi: {model.score(X_xor, y_xor):.2f}")
Chiziqli model aniqligi: 0.50
50% - tasodifdan yaxshi emas.
from sklearn.neural_network import MLPClassifier
tarmoq = MLPClassifier(
hidden_layer_sizes=(4,),
activation="relu",
max_iter=5000,
random_state=42,
)
tarmoq.fit(X_xor, y_xor)
print(f"Neyron tarmoq aniqligi: {tarmoq.score(X_xor, y_xor):.2f}")
Neyron tarmoq aniqligi: 1.00
U ma'lumotni yangi fazoga ko'chiradi, u yerda sinflar chiziqli ajraladi.
Bu SVM ning yadro hiylasiga o'xshaydi - lekin bu yerda almashtirish o'rganiladi, oldindan tanlanmaydi.
Ko'p qatlamli tarmoq #
Faollashtirish funksiyalari #
Agar faollashtirish bo'lmasa:
qatlam2(qatlam1(x)) = W2·(W1·x + b1) + b2 = (W2·W1)·x + (W2·b1 + b2)
Bu yana bitta chiziqli funksiya. 100 qatlam ham bitta qatlamga teng bo'lardi.
Chiziqsizlik - neyron tarmoqning butun kuchi.
| Funksiya | Chiqish oralig'i | Qachon |
|---|---|---|
relu | [0, ∞) | Yashirin qatlamlar (standart) |
tanh | [-1, 1] | RNN, kichik tarmoqlar |
logistic | [0, 1] | Ikkilik chiqish qatlami |
softmax | Yig'indisi 1 | Ko'p sinfli chiqish qatlami |
identity | (-∞, ∞) | Regressiya chiqish qatlami |
Teskari tarqalish #
Tarmoq qanday o'rganadi?
Amaliy misol #
from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import make_pipeline
from sklearn.neural_network import MLPClassifier
raqamlar = load_digits()
X, y = raqamlar.data, raqamlar.target
print(f"Namunalar: {X.shape[0]}, belgilar: {X.shape[1]}")
print(f"Sinflar: {np.unique(y)}")
Namunalar: 1797, belgilar: 64
Sinflar: [0 1 2 3 4 5 6 7 8 9]
X_o, X_s, y_o, y_s = train_test_split(
X, y, test_size=0.2, random_state=42, stratify=y
)
tarmoq = make_pipeline(
StandardScaler(),
MLPClassifier(
hidden_layer_sizes=(128, 64),
activation="relu",
solver="adam",
alpha=0.001,
learning_rate_init=0.001,
max_iter=500,
early_stopping=True,
validation_fraction=0.1,
n_iter_no_change=15,
random_state=42,
),
)
tarmoq.fit(X_o, y_o)
print(f"O'qitish: {tarmoq.score(X_o, y_o):.3f}")
print(f"Sinov: {tarmoq.score(X_s, y_s):.3f}")
O'qitish: 1.000
Sinov: 0.978
Muhim parametrlar #
| Parametr | Ma'nosi |
|---|---|
hidden_layer_sizes | Qatlamlar va ulardagi neyronlar: (128, 64) |
activation | Faollashtirish: relu (standart) |
solver | Optimizator: adam (standart), sgd, lbfgs |
alpha | L2 regularizatsiya kuchi |
learning_rate_init | O'qitish tezligi |
batch_size | Bir qadamda nechta namuna |
max_iter | Maksimal epoxalar |
early_stopping | Yaxshilanish to'xtasa - to'xtash |
- Bitta yashirin qatlamdan boshlang
- Neyronlar soni: kirish va chiqish orasida
- Yetarli bo'lmasa - qatlam qo'shing
- Odatiy naqsh: qatlamlar torayib boradi
(128, 64, 32)
Jadval ma'lumotida 2-3 qatlam odatda yetarli. Chuqurroq tarmoqlar rasm va matn uchun kerak.
O'qitish jarayonini kuzatish #
import matplotlib.pyplot as plt
model = tarmoq.named_steps["mlpclassifier"]
plt.figure(figsize=(9, 5))
plt.plot(model.loss_curve_, label="O'qitish xatosi")
if hasattr(model, "validation_scores_"):
plt.plot(model.validation_scores_, label="Validatsiya aniqligi")
plt.xlabel("Epoxa")
plt.legend()
plt.grid(alpha=0.3)
plt.show()
print(f"Epoxalar: {model.n_iter_}")
print(f"Yakuniy xato: {model.loss_:.5f}")
early_stopping=True ni yoqingBu parametr validatsiya natijasi yaxshilanishdan to'xtaganda o'qitishni to'xtatadi.
Natijada:
- Qayta o'qitish oldini olinadi
- Vaqt tejaladi
max_iterni katta qo'yish xavfsiz bo'ladi
Regressiya uchun #
from sklearn.neural_network import MLPRegressor
model = make_pipeline(
StandardScaler(),
MLPRegressor(
hidden_layer_sizes=(64, 32),
max_iter=1000,
early_stopping=True,
random_state=42,
),
)
from sklearn.compose import TransformedTargetRegressor
model = TransformedTargetRegressor(
regressor=make_pipeline(StandardScaler(), MLPRegressor(...)),
transformer=StandardScaler(),
)
Nishon 0-1000000 oralig'ida bo'lsa, gradientlar juda katta bo'lib o'qitish buziladi.
Muammolar va yechimlar #
| Muammo | Belgi | Yechim |
|---|---|---|
| O'qimaydi | Xato tushmayapti | Masshtablang, learning_rate ni oshiring |
| Sakraydi | Xato u yoqdan bu yoqqa | learning_rate ni kamaytiring |
NaN chiqadi | Xato cheksizlikka ketdi | learning_rate ni juda kamaytiring |
| Qayta o'qish | O'qitish a'lo, sinov yomon | alpha ni oshiring, early_stopping |
| Juda sekin | Soatlab o'qiydi | Kichikroq tarmoq, batch_size ni oshiring |
| Yaqinlashmadi | ConvergenceWarning | max_iter ni oshiring |
# Konvergentsiya ogohlantirishi
tarmoq = MLPClassifier(max_iter=100)
tarmoq.fit(X_o, y_o)
ConvergenceWarning: Stochastic Optimizer: Maximum iterations (100)
reached and the optimization hasn't converged yet.
Yechim: max_iter ni oshiring va early_stopping=True qo'ying.
Neyron tarmoq qachon kerak? #
| Kerak | Kerak emas |
|---|---|
| Rasm, video | Kichik jadval ma'lumoti |
| Matn, tarjima | Tushuntirish muhim bo'lsa |
| Ovoz | Kam ma'lumot (1000 dan kam) |
| Juda murakkab naqshlar | Oddiy model yetarli bo'lsa |
| Katta ma'lumot | Tez natija kerak bo'lsa |
from sklearn.ensemble import HistGradientBoostingClassifier
hgb = HistGradientBoostingClassifier(random_state=42)
hgb.fit(X_o, y_o)
print(f"Boosting: {hgb.score(X_s, y_s):.3f}")
print(f"Neyron tarmoq: {tarmoq.score(X_s, y_s):.3f}")
Ko'plab tadqiqotlar shuni ko'rsatadi: jadval ma'lumotida gradient boosting neyron tarmoqdan yaxshiroq yoki teng ishlaydi, lekin ancha tezroq o'qiydi va kamroq sozlash talab qiladi.
Neyron tarmoqning ustunligi - tuzilmasiz ma'lumotda (rasm, matn, ovoz).
Chuqur o'qitishga o'tish #
scikit-learn ning MLPClassifier - o'rganish uchun yaxshi, lekin jiddiy
loyihalar uchun cheklangan.
pip install torch
# yoki
pip install tensorflow
import torch
import torch.nn as nn
class Tarmoq(nn.Module):
def __init__(self, kirish_olchami, sinflar_soni):
super().__init__()
self.qatlamlar = nn.Sequential(
nn.Linear(kirish_olchami, 128),
nn.ReLU(),
nn.Dropout(0.3),
nn.Linear(128, 64),
nn.ReLU(),
nn.Dropout(0.3),
nn.Linear(64, sinflar_soni),
)
def forward(self, x):
return self.qatlamlar(x)
model = Tarmoq(kirish_olchami=64, sinflar_soni=10)
print(model)
| Imkoniyat | scikit-learn | PyTorch / TensorFlow |
|---|---|---|
| Oddiy MLP | Ha | Ha |
| GPU | Yo'q | Ha |
| Konvolyutsion (rasm) | Yo'q | Ha |
| Rekurrent (ketma-ketlik) | Yo'q | Ha |
| Transformer | Yo'q | Ha |
| O'z arxitekturangiz | Yo'q | Ha |
| Arxitektura | Nima uchun |
|---|---|
| CNN | Rasm, video - fazoviy naqshlar |
| RNN, LSTM | Ketma-ketlik, vaqt qatorlari |
| Transformer | Matn, tarjima, katta til modellari |
| GAN, Diffusion | Yangi rasm yaratish |
| Autoencoder | Siqish, anomaliya aniqlash |
Bu mavzular alohida darslikni talab qiladi.
- XOR masalasini logistik regressiya bilan yechishga urinib ko'ring.
MLPClassifierbilan yeching - nechta neyron yetarli?load_digitsma'lumotida tarmoq quring.hidden_layer_sizesni(32,),(128,),(128, 64)qilib solishtiring.loss_curve_ni chizing.early_stopping=TruevaFalsenatijalarini solishtiring.alphani0.0001dan1gacha o'zgartirib ta'sirini o'lchang.- Masshtablashsiz o'qiting - nima bo'ladi?
HistGradientBoostingClassifierbilan solishtiring - qaysi biri yaxshi?- Noto'g'ri tasniflangan raqamlarni chizib ko'ring.
Xulosa #
- Bitta neyron - logistik regressiyaning aynan o'zi.
- Kuch ko'p qatlamli birlashmadan paydo bo'ladi.
- Faollashtirish funksiyasisiz tarmoq bitta chiziqli qatlamga teng.
- ReLU - yashirin qatlamlar uchun standart tanlov.
- Teskari tarqalish har bir vaznning xatoga hissasini hisoblaydi.
- Masshtablash majburiy - aks holda tarmoq o'qimaydi.
early_stopping=Trueqayta o'qitishdan himoya qiladi va vaqt tejaydi.- Jadval ma'lumotida gradient boosting ko'pincha ustun.
- Neyron tarmoq rasm, matn va ovozda tengsiz.
- Jiddiy loyihalar uchun PyTorch yoki TensorFlow kerak.
Keyingi bo'limda modelni ishlab chiqarishga chiqarishni 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.