Mundarija (22)
- 1. Kirish va motivatsiya
- 2. Nazariya — chuqur tushuntirish
- 2.1. Gradient va qadam
- 2.2. O'rganish tezligi
- 2.3. Standartlashtirish nega shart
- 2.4. Stoxastik va mini-batch
- 2.5. Konvergensiya diagnostikasi
- 2.6. SGDRegressor
- 2.7. Tuzoqlar
- 2.8. Iterativ yechim — universal vosita
- 3. Tez ma'lumotnoma
- 4. Batafsil misollar
- Misol 1 — Qo'lda gradient tushish
- Misol 2 — Standartlashtirish nega hal qiluvchi
- Misol 3 — Batch, stoxastik va mini-batch
- Misol 4 — SGDRegressor va oqim rejimi
- 5. To'g'ri va noto'g'ri tushunishlar
- 6. Keng tarqalgan xatolar va yechimlari
- 7. Integratsiya — bu bilim qayerda kerak bo'ladi
- 8. Eng yaxshi amaliyotlar
- 9. Amaliy topshiriq
- Xulosa
13.6-dars: Gradient tushish
13-QISM — REGRESSIYA · 6-dars
1. Kirish va motivatsiya
Chiziqli regressiyada koeffitsiyentlarni analitik topish mumkin (w = (XTX)^(-1)XTy). Lekin bu yo'l ikki holatda ishlamaydi: ma'lumot juda katta bo'lsa (matritsa xotiraga sig'maydi) yoki yo'qotish funksiyasi analitik yechimga ega bo'lmasa (logistik regressiya — 13.10, neyron tarmoqlar). Shunda gradient tushish ishlatiladi: yechimga qadam-baqadam yaqinlashish.
Bu darsda: gradient nima va nega u eng tik yo'nalishni ko'rsatadi, o'rganish tezligi (learning rate) va uning tanlovi, standartlashtirish nega hal qiluvchi, stoxastik (SGD) va mini-batch variantlar, konvergensiya diagnostikasi va sklearn dagi SGDRegressor.
Real vaziyat. Jamoa 40 million qatorli ma'lumotda regressiya qurmoqchi: XTX matritsasi hisoblash uchun butun ma'lumotni xotiraga yuklash kerak — imkonsiz. SGDRegressor bilan ma'lumot oqim sifatida qismlarga bo'lib o'qitildi: 6 daqiqada OLS ga deyarli teng natija. Lekin birinchi urinish tarqab ketgan edi — sabab: belgilar standartlashtirilmagan (biri 0-1, boshqasi 0-500 000).
Bu darsda gradient tushishni o'rganamiz.
Bu darsda:
- Gradient va qadam
- O'rganish tezligi
- Standartlashtirish nega shart
- Stoxastik va mini-batch
- Konvergensiya diagnostikasi
- SGDRegressor
- Tuzoqlar
- Amaliy: qo'lda va sklearn bilan
ℹ Misollar real numpy/sklearn bilan (Python 3.14).
2. Nazariya — chuqur tushuntirish
2.1. Gradient va qadam
Yo'qotish: J(w) = (1/n) · sum (y_i - x_i·w)^2
Gradient (har koeffitsiyent bo'yicha hosila):
grad = -(2/n) · XT (y - Xw)
Qadam: w_yangi = w - lr · grad lr — o'rganish tezligi
Gradient — yo'qotish eng tez O'SADIGAN yo'nalish;
shuning uchun uning TESKARISIGA qadam tashlaymiz Gradient tushish — optimallashtirishning eng oddiy va eng keng tarqalgan usuli: joriy nuqtada eng tik pastga tushish yo'nalishini hisoblab, shu tomonga kichik qadam tashlash va takrorlash. Kvadratik yo'qotish qavariq (convex) bo'lgani uchun chiziqli regressiyada yagona minimum bor — gradient tushish har doim unga yaqinlashadi (to'g'ri lr bilan).
2.2. O'rganish tezligi
lr juda KICHIK → sekin konvergensiya (minglab iteratsiya)
lr juda KATTA → sakrab o'tadi, yo'qotish o'sadi, tarqab ketadi (NaN)
lr to'g'ri → yo'qotish tez va barqaror kamayadi
Tanlash: 0.001, 0.01, 0.1, 0.3 ni sinang va yo'qotish egri chizig'iga qarang
Zamonaviy usul: moslashuvchan lr (Adam, RMSProp — 22-qism) yoki jadval (schedule) O'rganish tezligi — gradient tushishdagi eng muhim giperparametr. Diagnostika oddiy: yo'qotish egri chizig'i — u silliq kamayishi kerak. Sakrab turgan egri chiziq — lr katta; deyarli gorizontal — lr kichik. sklearn da learning_rate="invscaling" yoki "adaptive" avtomatik kamaytiradi.
2.3. Standartlashtirish nega shart
Belgilar masshtabi juda farq qilsa, yo'qotish sirti CHO'ZILGAN vodiy bo'ladi:
gradient vodiy devoriga perpendikulyar yo'naladi → zigzag → sekin konvergensiya
Standartlashtirishdan keyin sirt DUMALOQ → to'g'ri yo'nalish → tez konvergensiya
Analitik yechim (lstsq) uchun standartlashtirish SHART EMAS
Gradient tushish uchun — deyarli MAJBURIY Bu — gradient usullaridagi eng ko'p uchraydigan amaliy xato. StandardScaler shart emas (OLS uchun), lekin majburiy (SGD uchun) — farqni tushunish muhim. Shartlilik soni (condition number — 10.5) katta bo'lsa, konvergensiya bir necha tartibga sekinlashadi.
2.4. Stoxastik va mini-batch
TO'LIQ (batch): har qadamda BARCHA n namuna → aniq gradient, qimmat
STOXASTIK (SGD): har qadamda BITTA namuna → shovqinli, juda tez, xotira talab qilmaydi
MINI-BATCH: har qadamda 32-256 namuna → amaliy muvozanat (standart)
Epoxa (epoch) — butun ma'lumotdan bir marta o'tish
SGD shovqini foydali ham: lokal minimumlardan chiqishga yordam beradi (DL da) Mini-batch — zamonaviy standart: u to'liq gradientning barqarorligi bilan SGD ning tezligini birlashtiradi va GPU da samarali. Chiziqli regressiyada SGD oqim rejimida ishlash imkonini beradi: ma'lumot xotiraga sig'masa ham model o'qitiladi (partial_fit).
2.5. Konvergensiya diagnostikasi
1. Yo'qotish egri chizig'i — silliq kamayadimi?
2. Koeffitsiyentlar o'zgarishi — kichrayyaptimi?
3. Analitik yechim bilan solishtirish (kichik ma'lumotda)
4. To'xtash mezoni: |J_yangi - J_eski| < tol yoki maksimal iteratsiya
Belgilar:
yo'qotish o'sadi/NaN → lr katta
juda sekin kamayadi → lr kichik yoki standartlashtirilmagan
tebranib turadi → SGD normasi (o'rtachalab qarang) Yo'qotish egri chizig'i — gradient usullarining asosiy diagnostikasi (22-qismda ham xuddi shunday). Chiziqli regressiyada natijani analitik yechim bilan solishtirish mumkin — bu o'rganish uchun eng yaxshi tekshiruv: gradient tushish to'g'ri ishlasa, koeffitsiyentlar lstsq bilan mos tushadi.
2.6. SGDRegressor
from sklearn.linear_model import SGDRegressor
model = SGDRegressor(loss="squared_error", penalty="l2", alpha=1e-4,
learning_rate="invscaling", eta0=0.01,
max_iter=1000, tol=1e-4, random_state=0)
# MAJBURIY: StandardScaler bilan pipeline ichida
model.partial_fit(X_batch, y_batch) # oqim rejimi (katta ma'lumot) SGDRegressor — katta ma'lumot uchun chiziqli modellar oilasi: loss ni o'zgartirib OLS (squared_error), Huber (huber — 13.11) yoki epsilon-insensitive (SVR) olish mumkin; penalty bilan Ridge/Lasso/ElasticNet (13.7-13.8). Kichik ma'lumotda esa oddiy LinearRegression/Ridge aniqroq va qulayroq — SGD ni faqat kerak bo'lganda ishlating.
2.7. Tuzoqlar
Asosiy tuzoqlar: standartlashtirmaslik (eng ko'p uchraydigan); lr ni sinamasdan tanlash; yo'qotish egri chizig'iga qaramaslik; kichik ma'lumotda SGD ishlatish (keraksiz); max_iter ni juda kichik qo'yish; SGD natijasini analitik yechim bilan solishtirmaslik; partial_fit da ma'lumot tartibini aralashtirmaslik; test to'plamida fit qilish 12.9-bob.
2.8. Iterativ yechim — universal vosita
Gradient tushish yo'qotishning eng tik pasayish yo'nalishiga kichik qadamlar tashlaydi: w ← w - lr·grad. Chiziqli regressiyada yo'qotish qavariq — yagona minimumga yaqinlashadi. Ikki hal qiluvchi tafsilot: o'rganish tezligi (katta bo'lsa tarqab ketadi, kichik bo'lsa sekin) va standartlashtirish (bo'lmasa zigzag va sekin konvergensiya). Mini-batch — amaliy standart; SGDRegressor katta yoki oqim ma'lumotida ishlaydi. Bu usul chiziqli regressiyadan ko'ra ko'proq Deep Learning uchun muhim (22-qism). Keyingi dars — Ridge regularizatsiyasi.
3. Tez ma'lumotnoma
import numpy as np
from sklearn.linear_model import SGDRegressor
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
# qo'lda
def gradient_tushish(X, y, lr=0.1, qadam=500):
w = np.zeros(X.shape[1])
tarix = []
for _ in range(qadam):
xato = X @ w - y
w -= lr * (2 / len(y)) * (X.T @ xato)
tarix.append(np.mean(xato ** 2))
return w, tarix
# sklearn
Pipeline([("sc", StandardScaler()),
("m", SGDRegressor(eta0=0.01, max_iter=2000, tol=1e-5, random_state=0))])
# oqim rejimi
for X_b, y_b in bo_laklar:
model.partial_fit(sc.transform(X_b), y_b)
QOIDA: standartlashtir · lr ni sina · yo'qotish egrisiga qara · lstsq bilan solishtirGradient xulosasi
grad = -(2/n)·XT(y - Xw) · w ← w - lr·grad
lr katta — tarqaydi · lr kichik — sekin · standartlashtirish majburiy
Batch (aniq) / SGD (tez) / mini-batch (standart) · epoxa — bir to'liq o'tish
SGDRegressor — katta va oqim ma'lumot uchun4. Batafsil misollar
Misollar real numpy/sklearn bilan (Python 3.14).
Misol 1 — Qo'lda gradient tushish
"""Gradient tushish analitik yechimga yaqinlashadi (real numpy)."""
import numpy as np
def yarat(seed: int = 3, n: int = 2000):
rng = np.random.default_rng(seed)
x1 = rng.normal(0, 1, n)
x2 = rng.normal(0, 1, n)
y = 5 + 2.0 * x1 - 1.5 * x2 + rng.normal(0, 1, n)
X = np.column_stack([np.ones(n), x1, x2])
return X, y
def tushish(X, y, lr: float, qadam: int = 300):
w = np.zeros(X.shape[1])
tarix = []
for _ in range(qadam):
xato = X @ w - y
tarix.append(float(np.mean(xato ** 2)))
w = w - lr * (2 / len(y)) * (X.T @ xato)
return w, tarix
def main() -> None:
X, y = yarat()
print("=== 1. Analitik yechim ===")
w_aniq = np.linalg.lstsq(X, y, rcond=None)[0]
print(f" w = [{', '.join(f'{v:.4f}' for v in w_aniq)}] (haqiqiy: 5, 2, -1.5)")
print(f" MSE = {np.mean((X @ w_aniq - y) ** 2):.6f}")
print("\n=== 2. Gradient tushish, lr = 0.1 ===")
w, tarix = tushish(X, y, 0.1)
for q in [0, 1, 5, 20, 100, 299]:
print(f" qadam {q:>3}: MSE = {tarix[q]:10.4f}")
print(f" yakuniy w = [{', '.join(f'{v:.4f}' for v in w)}]")
print(f" analitikdan farq = {np.abs(w - w_aniq).max():.2e}")
print("\n=== 3. Turli o'rganish tezligi ===")
for lr in [0.001, 0.01, 0.1, 0.5, 1.1]:
w, tarix = tushish(X, y, lr, 200)
holat = "tarqadi" if not np.isfinite(tarix[-1]) or tarix[-1] > tarix[0] \
else f"MSE {tarix[-1]:.4f}"
print(f" lr = {lr:<6}: {holat}")
print("\n=== 4. Nechta qadam kerak ===")
for lr in [0.01, 0.05, 0.1, 0.3]:
w, tarix = tushish(X, y, lr, 1000)
maqsad = np.mean((X @ w_aniq - y) ** 2) * 1.001
kerak = next((i for i, v in enumerate(tarix) if v <= maqsad), None)
print(f" lr = {lr:<5}: {kerak} qadam (analitikdan 0.1% ichida)")
print(" ⭐ Qavariq masalada gradient tushish har doim yechimga keladi")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. Analitik yechim ===
w = [4.9893, 1.9810, -1.4671] (haqiqiy: 5, 2, -1.5)
MSE = 1.020647
=== 2. Gradient tushish, lr = 0.1 ===
qadam 0: MSE = 32.6300
qadam 1: MSE = 21.0392
qadam 5: MSE = 4.2437
qadam 20: MSE = 1.0241
qadam 100: MSE = 1.0206
qadam 299: MSE = 1.0206
yakuniy w = [4.9893, 1.9810, -1.4671]
analitikdan farq = 8.88e-16
=== 3. Turli o'rganish tezligi ===
lr = 0.001 : MSE 15.0340
lr = 0.01 : MSE 1.0293
lr = 0.1 : MSE 1.0206
lr = 0.5 : MSE 1.0206
lr = 1.1 : tarqadi
=== 4. Nechta qadam kerak ===
lr = 0.01 : 252 qadam (analitikdan 0.1% ichida)
lr = 0.05 : 49 qadam (analitikdan 0.1% ichida)
lr = 0.1 : 23 qadam (analitikdan 0.1% ichida)
lr = 0.3 : 6 qadam (analitikdan 0.1% ichida)
⭐ Qavariq masalada gradient tushish har doim yechimga keladiNima ko'rsatdi: 2.1, 2.2-bo'limlar.
Misol 2 — Standartlashtirish nega hal qiluvchi
"""Masshtab farqi konvergensiyani qanday buzadi (real numpy)."""
import numpy as np
def tushish(X, y, lr: float, qadam: int = 2000):
"""Tarqab ketishi mumkin — shuning uchun hisob errstate ichida."""
w = np.zeros(X.shape[1])
tarix = []
with np.errstate(all="ignore"):
for _ in range(qadam):
xato = X @ w - y
j = float(np.mean(xato ** 2))
if not np.isfinite(j):
return w, tarix + [np.inf]
tarix.append(j)
w = w - lr * (2 / len(y)) * (X.T @ xato)
return w, tarix
def main() -> None:
rng = np.random.default_rng(7)
n = 3000
kichik = rng.uniform(0, 1, n) # 0..1
katta = rng.uniform(0, 500_000, n) # 0..500000
y = 10 + 30 * kichik + 0.00004 * katta + rng.normal(0, 1, n)
Xom = np.column_stack([np.ones(n), kichik, katta])
ort = Xom[:, 1:].mean(axis=0)
sd = Xom[:, 1:].std(axis=0)
Std = np.column_stack([np.ones(n), (Xom[:, 1:] - ort) / sd])
print("=== 1. Shartlilik soni ===")
print(f" xom belgilar: {np.linalg.cond(Xom):.3e}")
print(f" standartlashtirilgan: {np.linalg.cond(Std):.3e}")
print("\n=== 2. Xom belgilar bilan gradient tushish ===")
for lr in [1e-12, 1e-10, 1e-8]:
w, tarix = tushish(Xom, y, lr, 2000)
holat = "tarqadi" if not np.isfinite(tarix[-1]) else f"MSE {tarix[-1]:.4f}"
print(f" lr = {lr:.0e}: {holat}")
print("\n=== 3. Standartlashtirilgan belgilar bilan ===")
for lr in [0.01, 0.1, 0.3]:
w, tarix = tushish(Std, y, lr, 2000)
holat = "tarqadi" if not np.isfinite(tarix[-1]) else f"MSE {tarix[-1]:.4f}"
print(f" lr = {lr:<5}: {holat}")
print("\n=== 4. Analitik yechim bilan solishtirish ===")
w_aniq = np.linalg.lstsq(Std, y, rcond=None)[0]
w_grad, tarix = tushish(Std, y, 0.3, 2000)
print(f" analitik MSE = {np.mean((Std @ w_aniq - y) ** 2):.6f}")
print(f" gradient MSE = {tarix[-1]:.6f}")
print(f" koeffitsiyent farqi = {np.abs(w_grad - w_aniq).max():.2e}")
print(" ⭐ Gradient tushishda standartlashtirish — majburiy")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. Shartlilik soni ===
xom belgilar: 1.149e+06
standartlashtirilgan: 1.030e+00
=== 2. Xom belgilar bilan gradient tushish ===
lr = 1e-12: MSE 244.9026
lr = 1e-10: tarqadi
lr = 1e-08: tarqadi
=== 3. Standartlashtirilgan belgilar bilan ===
lr = 0.01 : MSE 0.9555
lr = 0.1 : MSE 0.9555
lr = 0.3 : MSE 0.9555
=== 4. Analitik yechim bilan solishtirish ===
analitik MSE = 0.955492
gradient MSE = 0.955492
koeffitsiyent farqi = 3.55e-14
⭐ Gradient tushishda standartlashtirish — majburiyNima ko'rsatdi: 2.3-bo'lim.
Misol 3 — Batch, stoxastik va mini-batch
"""Uch variantning tezligi va barqarorligi (real numpy)."""
import numpy as np
def main() -> None:
rng = np.random.default_rng(11)
n, p = 20_000, 10
X = np.column_stack([np.ones(n), rng.normal(0, 1, (n, p))])
haqiqiy = np.concatenate([[3.0], rng.normal(0, 1.5, p)])
y = X @ haqiqiy + rng.normal(0, 1, n)
w_aniq = np.linalg.lstsq(X, y, rcond=None)[0]
mse_aniq = float(np.mean((X @ w_aniq - y) ** 2))
def ishga_tushir(hajm: int, epoxa: int, lr: float):
w = np.zeros(X.shape[1])
yangilanish = 0
tarix = []
for _ in range(epoxa):
tartib = rng.permutation(n)
for boshi in range(0, n, hajm):
idx = tartib[boshi:boshi + hajm]
xato = X[idx] @ w - y[idx]
w = w - lr * (2 / len(idx)) * (X[idx].T @ xato)
yangilanish += 1
tarix.append(float(np.mean((X @ w - y) ** 2)))
return w, tarix, yangilanish
print(f"=== 1. Analitik yechim: MSE = {mse_aniq:.4f} ===")
print("\n=== 2. Uch variant (5 epoxa) ===")
for nom, hajm, lr in [("to'liq (batch)", n, 0.5), ("mini-batch 64", 64, 0.05),
("stoxastik (1)", 1, 0.01)]:
w, tarix, yang = ishga_tushir(hajm, 5, lr)
print(f" {nom:<15}: MSE {tarix[-1]:.4f}, "
f"{yang:>6} yangilanish, farq {abs(tarix[-1] - mse_aniq):.5f}")
print("\n=== 3. Epoxalar bo'yicha (mini-batch 64) ===")
w, tarix, _ = ishga_tushir(64, 8, 0.05)
for i, v in enumerate(tarix, 1):
print(f" epoxa {i}: MSE = {v:.4f}")
print("\n=== 4. To'liq gradient bir xil natijaga sekinroq keladi ===")
for epoxa in [1, 5, 20, 100]:
_, t_batch, _ = ishga_tushir(n, epoxa, 0.5)
_, t_mini, _ = ishga_tushir(64, epoxa, 0.05)
print(f" {epoxa:>3} epoxa: to'liq {t_batch[-1]:7.4f}, "
f"mini-batch {t_mini[-1]:7.4f}")
print(" ⭐ Mini-batch bir epoxada ko'p yangilanish qiladi — tezroq")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. Analitik yechim: MSE = 0.9904 ===
=== 2. Uch variant (5 epoxa) ===
to'liq (batch) : MSE 0.9904, 5 yangilanish, farq 0.00000
mini-batch 64 : MSE 1.0073, 1565 yangilanish, farq 0.01694
stoxastik (1) : MSE 1.0820, 100000 yangilanish, farq 0.09159
=== 3. Epoxalar bo'yicha (mini-batch 64) ===
epoxa 1: MSE = 0.9975
epoxa 2: MSE = 0.9962
epoxa 3: MSE = 0.9982
epoxa 4: MSE = 0.9979
epoxa 5: MSE = 0.9982
epoxa 6: MSE = 0.9966
epoxa 7: MSE = 0.9969
epoxa 8: MSE = 0.9995
=== 4. To'liq gradient bir xil natijaga sekinroq keladi ===
1 epoxa: to'liq 1.0015, mini-batch 0.9968
5 epoxa: to'liq 0.9904, mini-batch 0.9940
20 epoxa: to'liq 0.9904, mini-batch 0.9994
100 epoxa: to'liq 0.9904, mini-batch 0.9991
⭐ Mini-batch bir epoxada ko'p yangilanish qiladi — tezroqNima ko'rsatdi: 2.4, 2.5-bo'limlar.
Misol 4 — SGDRegressor va oqim rejimi
"""sklearn bilan katta ma'lumot (real numpy/sklearn)."""
import warnings
import numpy as np
from sklearn.linear_model import LinearRegression, SGDRegressor
from sklearn.metrics import mean_absolute_error
from sklearn.model_selection import train_test_split
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
def main() -> None:
rng = np.random.default_rng(19)
n, p = 200_000, 12
X = rng.normal(0, 1, (n, p)) * rng.uniform(0.5, 3000, p)
haqiqiy = rng.normal(0, 2, p)
y = 7 + X @ haqiqiy + rng.normal(0, 3, n)
Xtr, Xte, ytr, yte = train_test_split(X, y, test_size=0.2, random_state=0)
print("=== 1. Analitik yechim (LinearRegression) ===")
m = LinearRegression().fit(Xtr, ytr)
print(f" test MAE = {mean_absolute_error(yte, m.predict(Xte)):.4f}")
print("\n=== 2. SGD standartlashtirishSIZ ===")
with warnings.catch_warnings():
warnings.simplefilter("ignore")
with np.errstate(all="ignore"):
sgd = SGDRegressor(max_iter=50, tol=None, eta0=0.001, random_state=0)
sgd.fit(Xtr, ytr)
bashorat = sgd.predict(Xte)
chekli = bool(np.isfinite(sgd.coef_).all())
print(f" koeffitsiyentlar chekli: {chekli}")
if chekli and np.isfinite(bashorat).all():
print(f" test MAE = {mean_absolute_error(yte, bashorat):.4f}")
else:
print(" natija: TARQAB KETDI (cheksizlik) — masshtab farqi juda katta")
print("\n=== 3. SGD standartlashtirish bilan ===")
quvur = Pipeline([("sc", StandardScaler()),
("m", SGDRegressor(max_iter=200, tol=1e-5, eta0=0.01,
learning_rate="invscaling",
random_state=0))]).fit(Xtr, ytr)
print(f" test MAE = {mean_absolute_error(yte, quvur.predict(Xte)):.4f}")
print(f" iteratsiyalar: {quvur.named_steps['m'].n_iter_}")
print("\n=== 4. Oqim rejimi (partial_fit) ===")
sc = StandardScaler().fit(Xtr[:5000]) # birinchi bo'lakda fit
oqim = SGDRegressor(eta0=0.01, learning_rate="invscaling", random_state=0)
hajm = 10_000
for epoxa in range(3):
tartib = rng.permutation(len(Xtr))
for boshi in range(0, len(Xtr), hajm):
idx = tartib[boshi:boshi + hajm]
oqim.partial_fit(sc.transform(Xtr[idx]), ytr[idx])
print(f" epoxa {epoxa + 1}: test MAE = "
f"{mean_absolute_error(yte, oqim.predict(sc.transform(Xte))):.4f}")
print(" ⭐ Ma'lumot xotiraga sig'masa ham model o'qitiladi")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. Analitik yechim (LinearRegression) ===
test MAE = 2.3960
=== 2. SGD standartlashtirishSIZ ===
koeffitsiyentlar chekli: True
test MAE = 328165686330862.9375
=== 3. SGD standartlashtirish bilan ===
test MAE = 2.5234
iteratsiyalar: 23
=== 4. Oqim rejimi (partial_fit) ===
epoxa 1: test MAE = 2.5170
epoxa 2: test MAE = 2.5387
epoxa 3: test MAE = 2.5070
⭐ Ma'lumot xotiraga sig'masa ham model o'qitiladiNima ko'rsatdi: 2.6-bo'lim.
5. To'g'ri va noto'g'ri tushunishlar
| Noto'g'ri fikr | To'g'risi |
|---|---|
| "Gradient tushish — regressiya uchun" | Asosan DL uchun |
| "Standartlashtirish ixtiyoriy" | SGD uchun majburiy |
| "Katta lr — tez natija" | Tarqab ketadi |
| "SGD aniqroq" | Shovqinli, lekin tez |
| "Batch har doim yaxshi" | Mini-batch amaliy |
| "Yo'qotish egri chizig'i keraksiz" | Asosiy diagnostika |
| "SGD kichik ma'lumotda ham kerak" | Kerak emas |
| "Gradient tushish lokal minimumga tushadi" | Qavariq masalada yo'q |
6. Keng tarqalgan xatolar va yechimlari
1. Standartlashtirmaslik
SGDRegressor().fit(X, y) # ⚠️
Pipeline([("sc", StandardScaler()), ("m", SGDRegressor())]) # ✅2. lr ni sinamaslik
lr = 0.5 # tarqadi # ⚠️
# 0.001, 0.01, 0.1 ni sinab, egri chiziqqa qarang # ✅3. Yo'qotishni kuzatmaslik
for _ in range(1000): w -= lr * grad # ⚠️
tarix.append(mse); # keyin egri chiziqni ko'ring # ✅4. Kichik ma'lumotda SGD
SGDRegressor().fit(X, y) # n = 500 # ⚠️
LinearRegression().fit(X, y) # ✅5. max_iter kichik
SGDRegressor(max_iter=5) # ⚠️
SGDRegressor(max_iter=1000, tol=1e-4) # ✅6. partial_fit da aralashtirmaslik
for b in boblar: model.partial_fit(b.X, b.y) # tartiblangan # ⚠️
# har epoxada permutation bilan aralashtiring # ✅7. Scaler ni har bo'lakda qayta fit qilish
for b in boblar: sc.fit(b.X) # ⚠️
sc = StandardScaler().fit(X_birinchi) # yoki partial_fit # ✅7. Integratsiya — bu bilim qayerda kerak bo'ladi
- 10.5-dars (o'tilgan): Shartlilik soni
- 13.1-dars (o'tilgan): Analitik yechim
- 13.7-dars: Regularizatsiya bilan gradient
- 13.10-dars: Logistik regressiya — analitik yechim yo'q
- 22-qism: Neyron tarmoqlar va orqaga tarqalish
8. Eng yaxshi amaliyotlar
Har doim standartlashtiring.
lr ni sinab tanlang.
Yo'qotish egri chizig'ini chizing.
Mini-batch dan boshlang.
Analitik yechim bilan solishtiring.
Kichik ma'lumotda SGD ishlatmang.
Har epoxada aralashtiring.
tol va max_iter ni qo'ying.
9. Amaliy topshiriq
Vazifa 1: Bashorat qiling
1. # gradient nima?
2. # qadam formulasi?
3. # lr katta bo'lsa?
4. # lr kichik bo'lsa?
5. # nega standartlashtirish?
6. # epoxa nima?
7. # mini-batch hajmi?
8. # SGD afzalligi?
9. # asosiy diagnostika?
10. # qavariq masalada lokal minimum bormi?
11. # partial_fit nima uchun?
12. # kichik ma'lumotda nima ishlatiladi?Javoblar
- Eng tik o'sish yo'nalishi
- w ← w - lr·grad
- Tarqab ketadi
- Sekin
- Vodiy cho'zilib zigzag bo'ladi
- Butun ma'lumotdan bir o'tish
- 32-256
- Tezlik va xotira
- Yo'qotish egri chizig'i
- Yo'q
- Oqim rejimi
- LinearRegression / Ridge
Vazifa 2: Xatolarni tuzating
1. SGDRegressor().fit(X, y) # masshtablanmagan
2. lr = 1.5
3. for _ in range(5000): w -= lr * grad # kuzatuvsiz
4. SGDRegressor().fit(X, y) # n = 400
5. for b in boblar: sc.fit(b.X); model.partial_fit(sc.transform(b.X), b.y)Javoblar
1. Pipeline([("sc", StandardScaler()), ("m", SGDRegressor())])
2. # 0.001..0.3 oralig'ida sinang
3. tarix.append(mse) # va egri chiziqni tekshiring
4. LinearRegression().fit(X, y)
5. sc = StandardScaler().fit(X_birinchi) # bir martaVazifa 3: Qo'lda gradient
Modellang:
- Yo'qotish va gradient
- Turli lr
- Analitik bilan solishtirish
- Qadamlar soni
Vazifa 4: Masshtab
Modellang:
- Turli masshtabli belgilar
- Shartlilik soni
- Konvergensiya
- Standartlashtirish ta'siri
Vazifa 5: Uch variant
Modellang:
- Batch, SGD, mini-batch
- Yangilanishlar soni
- Epoxalar
- Xulosa
Vazifa 6: SGDRegressor
Modellang:
- Pipeline
- Oqim rejimi
- Analitik bilan solishtirish
- Tavsiya
Vazifa 7: O'ylash
Chiziqli regressiyada aniq analitik yechim bor, shunga qaramay zamonaviy ML deyarli butunlay gradient usullariga qurilgan. Nima uchun?
Javob
Qisqa javob: analitik yechim faqat tor holatlar uchun mavjud (kvadratik yo'qotish, chiziqli model, kichik p). Gradient tushish esa universal: har qanday differensiallanadigan yo'qotish va model uchun ishlaydi, xotira talabi kichik va parallellashtiriladi.
1. Analitik yechimning chegaralari
| Chegara | Izoh |
|---|---|
| Faqat kvadratik yo'qotish | Logistik, Huber, kvantil uchun yo'q |
(XTX)^(-1) — O(p^3) |
p katta bo'lsa qimmat |
| Butun X xotirada | Milliard qator sig'maydi |
| Faqat chiziqli model | Neyron tarmoq uchun mumkin emas |
2. Gradientning universalligi
- Har qanday differensiallanadigan yo'qotish
- Har qanday model (avtomatik differensiallash bilan)
- Oqim va taqsimlangan o'qitish
- GPU da samarali (matritsa amallari)
3. Nega bu DL uchun hal qiluvchi
- Neyron tarmoqda parametr soni millionlab
- Yo'qotish qavariq emas — analitik yechim tushunchasi yo'q
- Orqaga tarqalish (22-qism) — gradientni samarali hisoblash usuli
4. Chiziqli regressiyada qachon gradient
- n juda katta yoki oqim ma'lumot
- Onlayn o'qitish (model doimiy yangilanadi)
- Maxsus yo'qotish (kvantil — 12.8, Huber — 13.11)
5. Xulosa
- Analitik yechim — tor, lekin aniq
- Gradient — sekinroq, lekin universal
- Kichik ma'lumotda analitikni oling
- Gradient bilimlari DL uchun asos
Nimani mustahkamlaydi: 2.1, 2.6-bo'limlar.
Xulosa
Bu darsda gradient tushishni o'rgandik.
Eng muhim uch fikr:
Iterativ yaqinlashish.
w ← w - lr·grad, bundagrad = -(2/n)·XT(y - Xw). Kvadratik yo'qotish qavariq bo'lgani uchun chiziqli regressiyada lokal minimum yo'q — to'g'rilrbilan gradient tushish har doim analitik yechimga keladi (bunilstsqbilan solishtirib tekshirish mumkin).Ikki hal qiluvchi tafsilot. O'rganish tezligi: katta bo'lsa tarqab ketadi (yo'qotish o'sadi, NaN), kichik bo'lsa minglab qadam kerak — diagnostika yo'qotish egri chizig'i. Standartlashtirish: masshtab farqi yo'qotish sirtini cho'zilgan vodiyga aylantiradi va gradient zigzag qiladi; OLS uchun shart emas, SGD uchun majburiy.
Mini-batch — amaliy standart. To'liq gradient aniq, lekin qimmat; stoxastik (1 namuna) tez, lekin shovqinli; 32-256 lik bo'laklar ikkalasining afzalligini birlashtiradi va bir epoxada ko'p yangilanish beradi.
SGDRegressor+partial_fitma'lumot xotiraga sig'masa ham o'qitish imkonini beradi; kichik ma'lumotda esa oddiyLinearRegressionaniqroq va qulayroq.
Keyingi darsda Ridge regularizatsiyasini o'rganamiz: L2 jarima, alpha ni tanlash, multikollinearlikni davolash va bias-variance muvozanati.
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!