1-bo‘lim
Neyron tarmoq nima
Qoidalar yozish o'rniga misollardan o'rganish - g'oyaning mohiyati va bitta neyronning ishi.
Ushbu bo‘lim mundarijasi
Dasturchi odatda qoidalar yozadi: "agar shunday bo'lsa, unday qil". Neyron tarmoq boshqacha ishlaydi - unga misollar beriladi, u esa qoidani o'zi topadi.
Qachon qoida yozib bo'lmaydi #
Rasmda mushuk bor-yo'qligini aniqlaydigan dastur yozing. Qoidalarni sanab ko'ring:
| Qoida | Nima uchun ishlamaydi |
|---|---|
| "Mo'ylovi bor" | Yon tomondan ko'rinmaydi |
| "To'rt oyoqli" | It ham to'rt oyoqli |
| "Junli" | Yorug'lik va rang o'zgaradi |
| "Quloqlari uchli" | Zoti har xil |
Har qoida uchun istisno topiladi. Odam esa mushuqni bir qarashda taniydi - lekin qanday tanishini tushuntira olmaydi.
| Vazifa | Yechim |
|---|---|
| Soliqni hisoblash | Oddiy kod - qoida aniq |
| Parolni tekshirish | Oddiy kod |
| Sanani formatlash | Oddiy kod |
| Rasmdagi obyektni tanish | Neyron tarmoq |
| Matn ma'nosini tushunish | Neyron tarmoq |
| Ovozni matnga aylantirish | Neyron tarmoq |
Qoida aniq bo'lsa - kod yozing. Neyron tarmoq faqat qoidani odam ham ayta olmaydigan joyda kerak.
Bu muhim ogohlantirish: bugun ko'p loyihalarda mashinali
o'qitish oddiy if yetarli bo'lgan joyda ishlatiladi -
natijada tizim murakkab, sekin va tushuntirib bo'lmaydigan
bo'lib qoladi.
Bitta neyron #
Neyron - juda oddiy narsa. U kiruvchi sonlarni oladi, har birini og'irlikka ko'paytiradi, qo'shadi va natijani qaytaradi.
Buni kodga ko'chiramiz.
import numpy as np
kirish = np.array([1.5, -2.0, 0.5])
ogirliklar = np.array([0.4, 0.3, -0.7])
siljish = 0.2
yigindi = float(np.dot(kirish, ogirliklar) + siljish)
print(f"z = {yigindi:.4f}")
z = -0.1500
np.dot - bu shunchaki qisqartma. Uzun yozuv aynan bir xil
natija beradi:
kirish = np.array([1.5, -2.0, 0.5])
ogirliklar = np.array([0.4, 0.3, -0.7])
siljish = 0.2
qolda = 0.0
for x, w in zip(kirish, ogirliklar):
qolda += x * w
qolda += siljish
print(f"qo'lda: {qolda:.4f}")
print(f"np.dot: {float(np.dot(kirish, ogirliklar) + siljish):.4f}")
qo'lda: -0.1500
np.dot: -0.1500
Yuqoridagi for sikli uchta son uchun bir xil ishlaydi.
Lekin haqiqiy tarmoqda millionlab ko'paytirish bo'ladi.
| Yondashuv | 1000 x 1000 matritsa uchun |
|---|---|
| Python sikli | Bir necha soniya |
| NumPy | Bir necha millisoniya |
Sabab: NumPy amallarni C darajasida, butun massivga birdan bajaradi. Bu vektorlashtirish deb ataladi va 2-bo'limning asosiy mavzusi.
Shuning uchun darslikda for siklidan iloji boricha
qochamiz - u faqat tushuntirish uchun ishlatiladi.
Og'irliklar nimani anglatadi #
Og'irlik - kiruvchi belgining qanchalik muhimligi.
Talaba imtihondan o'tadimi degan savolni ko'ramiz. Uchta belgi bor: tayyorgarlik soatlari, oldingi baho, uyqu soatlari.
belgilar = ["soat", "oldingi baho", "uyqu"]
qiymatlar = np.array([8.0, 4.0, 7.0])
ogirliklar = np.array([0.5, 0.9, 0.1])
for nom, q, w in zip(belgilar, qiymatlar, ogirliklar):
print(f"{nom:<14} {q:>5.1f} x {w:>4.1f} = {q * w:>5.2f}")
print(f"{'jami':<14} {'':>5} {'':>4} {float(qiymatlar @ ogirliklar):>5.2f}")
soat 8.0 x 0.5 = 4.00
oldingi baho 4.0 x 0.9 = 3.60
uyqu 7.0 x 0.1 = 0.70
jami 8.30
Bu og'irliklar "oldingi baho eng muhim, uyqu deyarli ahamiyatsiz" degan qarorni ifodalaydi.
Yuqoridagi uchta son (0.5, 0.9, 0.1) ni biz o'zimiz
yozdik. Haqiqiy tarmoqda ular o'qitish jarayonida
topiladi.
Butun darslikning mavzusi shu: og'irliklarni tasodifiy qiymatdan boshlab, misollarga qarab asta-sekin to'g'rilash.
| Bo'lim | Nima qo'shiladi |
|---|---|
| 6 | Xatoni o'lchash |
| 7-8 | Xatoni kamaytirish yo'nalishini topish |
| 9-11 | Ko'p qatlamli tarmoqda buni bajarish |
Shu sababli neyron tarmoq "dasturlanmaydi" - u o'qitiladi.
Siljish (bias) nima uchun kerak #
kirish = np.array([0.0, 0.0])
ogirliklar = np.array([0.7, -0.3])
print(f"siljishsiz: {float(kirish @ ogirliklar):.2f}")
print(f"siljish bilan: {float(kirish @ ogirliklar + 1.5):.2f}")
siljishsiz: 0.00
siljish bilan: 1.50
Kirish nolga teng bo'lganda og'irliklar hech nima qila olmaydi - natija majburan nol. Siljish neyronga "men odatda faolman" yoki "men odatda jimman" deyish imkonini beradi.
Ba'zi kitoblarda siljish alohida emas, doim 1 ga teng qo'shimcha kirish sifatida yoziladi:
| Yozuv | Shakli |
|---|---|
| Alohida | z = x @ w + b |
| Birlashtirilgan | z = [1, x₁, x₂] @ [b, w₁, w₂] |
Ikkalasi matematik jihatdan aynan bir xil. Alohida yozuv kodda tushunarliroq, shuning uchun darslikda shuni ishlatamiz.
Bu farqni bilish muhim - eski maqolalarni o'qiganingizda
x₀ = 1 degan g'alati qatorni ko'rsangiz, u aynan shu.
Ko'p neyron - qatlam #
Bitta neyron bitta savolga javob beradi. Bir necha neyron birga ishlaganda qatlam hosil bo'ladi.
kirish = np.array([1.5, -2.0, 0.5])
# uchta kirish, ikkita neyron -> (3, 2) matritsa
ogirliklar = np.array([
[0.4, -0.1],
[0.3, 0.8],
[-0.7, 0.2],
])
siljishlar = np.array([0.2, -0.5])
chiqish = kirish @ ogirliklar + siljishlar
print(np.round(chiqish, 4))
print("shakl:", chiqish.shape)
[-0.15 -2.15]
shakl: (2,)
Bitta amal bilan ikkala neyron ham hisoblandi. Bu vektorlashtirishning kuchi: neyronlar soni o'nlab yoki minglab bo'lsa ham, kod o'zgarmaydi.
kirish @ ogirliklar ishlashi uchun shakllar mos kelishi
kerak:
| Ob'ekt | Shakli | Ma'nosi |
|---|---|---|
kirish | (3,) | Uchta belgi |
ogirliklar | (3, 2) | 3 kirish, 2 neyron |
| Natija | (2,) | Ikkita neyron chiqishi |
Qoida: ichki o'lchamlar teng bo'lsin. (3,) @ (3, 2)
ishlaydi, (3,) @ (2, 3) esa xato beradi.
Kod yozayotganda print(x.shape) ni tez-tez ishlating -
bu darslikdagi eng foydali nosozlik topish usuli.
Xato bo'lganda nima ko'rasiz #
kirish = np.array([1.5, -2.0, 0.5])
notogri = np.array([[0.4, -0.1], [0.3, 0.8]]) # (2, 2) - shakl mos emas
try:
kirish @ notogri
except ValueError as xato:
print(type(xato).__name__)
print(str(xato)[:60])
ValueError
matmul: Input operand 1 has a mismatch in its core dimension
Bu xatoni ko'rganda birinchi qadam - ikkala shaklni ham chop etish:
kirish = np.array([1.5, -2.0, 0.5])
notogri = np.array([[0.4, -0.1], [0.3, 0.8]])
print("kirish:", kirish.shape, " ogirliklar:", notogri.shape)
print("mos kelishi kerak:", kirish.shape[0], "va", notogri.shape[0])
kirish: (3,) ogirliklar: (2, 2)
mos kelishi kerak: 3 va 2
Bu darslikda nima bo'ladi #
| Bo'limlar | Mavzu |
|---|---|
| 1-2 | Neyron va NumPy asoslari |
| 3-5 | Faollashtirish va oldinga tarqalish |
| 6-8 | Yo'qotish funksiyasi va gradient tushish |
| 9-11 | Orqaga tarqalish - qo'lda va kodda |
| 12 | XOR - birinchi ishlaydigan tarmoq |
| 13-15 | Boshlash, paketlar, optimizatorlar |
| 16-17 | Haddan ortiq moslashuv va ma'lumot tayyorlash |
| 18-19 | Softmax va tarmoqni baholash |
| 20 | Raqamlarni tanuvchi to'liq tarmoq |
PyTorch yoki TensorFlow da neyron tarmoq o'nta qatorda yoziladi. Nima uchun uni noldan yozamiz?
Chunki tayyor kutubxona ishlatgan odam xato bo'lganda nima qilishini bilmaydi:
| Muammo | Kutubxona nima deydi | Sabab qayerda |
|---|---|---|
| Yo'qotish kamaymayapti | Hech nima | O'qitish tezligi, boshlash |
Yo'qotish nan bo'ldi | nan | Gradient portlashi |
| Test aniqligi past | Hech nima | Haddan ortiq moslashuv |
Bu sabablarning barchasi ichkarida yotadi. Bir marta noldan yozib chiqqan odam ularni taniydi.
Darslikni tugatgach PyTorch ga o'tishingiz mumkin - va u sizga endi sehr emas, tanish narsa bo'lib ko'rinadi.
- Uchta kirish va uchta og'irlik bilan
zni hisoblang. - Xuddi shu natijani
forsikli bilan takrorlang. - Og'irliklardan birini ikki barobar oshiring - natija qanday o'zgardi?
- Barcha kirishlarni nolga tenglang va siljishning ta'sirini ko'ring.
- Uchta kirish, to'rtta neyronli qatlam yarating.
- Natijaning shaklini
print(x.shape)bilan tekshiring. - Ataylab mos kelmaydigan shakl bering va xatoni o'qing.
- Imtihon misolidagi og'irliklarni o'zgartirib, natijaga ta'sirini ko'ring.
- Qaysi vazifalarda neyron tarmoq kerak emasligini uchta misol bilan yozing.
- Nima uchun
forsikli o'rniga NumPy ishlatilishini tushuntiring.
Xulosa #
- Qoida aniq bo'lsa - oddiy kod yozing, tarmoq kerak emas.
- Neyron: kirishlarni og'irlikka ko'paytiradi, qo'shadi, egadi.
z = x @ w + bvay = f(z)- butun neyron shu.- Og'irlik - belgining muhimlik darajasi.
- Og'irliklarni odam tanlamaydi - ular o'qitishda topiladi.
- Siljish neyronga kirish nol bo'lganda ham javob berish imkonini beradi.
- Bir necha neyron birga qatlam hosil qiladi - kod o'zgarmaydi.
(3,) @ (3, 2)ishlaydi, ichki o'lchamlar teng bo'lsin.- Nosozlik qidirishda
print(x.shape)- eng foydali vosita. - Kutubxonasiz yozish xatolarni tanish imkonini beradi.
Keyingi bo'limda NumPy ni chuqurroq ko'ramiz: vektorlashtirish, translyatsiya va matritsa amallari.
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.