1-bo‘lim

Neyron tarmoq nima

Qoidalar yozish o'rniga misollardan o'rganish - g'oyaning mohiyati va bitta neyronning ishi.

🕑 13 daqiqa o‘qish 📄 1 106 so‘z 👁 1 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Qachon qoida yozib bo'lmaydi
  2. Bitta neyron
  3. Og'irliklar nimani anglatadi
  4. Siljish (bias) nima uchun kerak
  5. Ko'p neyron - qatlam
  6. Xato bo'lganda nima ko'rasiz
  7. Bu darslikda nima bo'ladi
  8. Xulosa

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:

QoidaNima 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.

Mashinali o'qitish qachon to'g'ri tanlov
VazifaYechim
Soliqni hisoblashOddiy kod - qoida aniq
Parolni tekshirishOddiy kod
Sanani formatlashOddiy kod
Rasmdagi obyektni tanishNeyron tarmoq
Matn ma'nosini tushunishNeyron tarmoq
Ovozni matnga aylantirishNeyron 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.

Bitta neyron - uchta amal x₁ x₂ x₃ w₁ w₂ w₃ Σ + b f(z) faollashtirish y z = x₁w₁ + x₂w₂ + x₃w₃ + b y = f(z) Butun neyron shu ikki satrdan iborat - qolgani takrorlash va sozlash
Ko'paytirish, qo'shish, egish - neyronning butun ishi

Buni kodga ko'chiramiz.

Python
import numpy as np
Python
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}")
Natija
z = -0.1500

np.dot - bu shunchaki qisqartma. Uzun yozuv aynan bir xil natija beradi:

Python
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}")
Natija
qo'lda:  -0.1500
np.dot:  -0.1500
Nima uchun NumPy kerak

Yuqoridagi for sikli uchta son uchun bir xil ishlaydi. Lekin haqiqiy tarmoqda millionlab ko'paytirish bo'ladi.

Yondashuv1000 x 1000 matritsa uchun
Python sikliBir necha soniya
NumPyBir 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.

Python
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}")
Natija
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.

Og'irliklarni odam tanlamaydi

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'limNima qo'shiladi
6Xatoni o'lchash
7-8Xatoni kamaytirish yo'nalishini topish
9-11Ko'p qatlamli tarmoqda buni bajarish

Shu sababli neyron tarmoq "dasturlanmaydi" - u o'qitiladi.

Siljish (bias) nima uchun kerak #

Python
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}")
Natija
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.

Siljishni og'irlik sifatida yozish

Ba'zi kitoblarda siljish alohida emas, doim 1 ga teng qo'shimcha kirish sifatida yoziladi:

YozuvShakli
Alohidaz = x @ w + b
Birlashtirilganz = [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.

Python
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)
Natija
[-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.

Matritsa shakllari - eng ko'p xato qilinadigan joy

kirish @ ogirliklar ishlashi uchun shakllar mos kelishi kerak:

Ob'ektShakliMa'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 #

Python
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])
Natija
ValueError
matmul: Input operand 1 has a mismatch in its core dimension

Bu xatoni ko'rganda birinchi qadam - ikkala shaklni ham chop etish:

Python
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])
Natija
kirish: (3,)  ogirliklar: (2, 2)
mos kelishi kerak: 3 va 2

Bu darslikda nima bo'ladi #

Bo'limlarMavzu
1-2Neyron va NumPy asoslari
3-5Faollashtirish va oldinga tarqalish
6-8Yo'qotish funksiyasi va gradient tushish
9-11Orqaga tarqalish - qo'lda va kodda
12XOR - birinchi ishlaydigan tarmoq
13-15Boshlash, paketlar, optimizatorlar
16-17Haddan ortiq moslashuv va ma'lumot tayyorlash
18-19Softmax va tarmoqni baholash
20Raqamlarni tanuvchi to'liq tarmoq
Kutubxona ishlatmaymiz - ataylab

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:

MuammoKutubxona nima deydiSabab qayerda
Yo'qotish kamaymayaptiHech nimaO'qitish tezligi, boshlash
Yo'qotish nan bo'ldinanGradient portlashi
Test aniqligi pastHech nimaHaddan 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.

Amaliy topshiriq
  1. Uchta kirish va uchta og'irlik bilan z ni hisoblang.
  2. Xuddi shu natijani for sikli bilan takrorlang.
  3. Og'irliklardan birini ikki barobar oshiring - natija qanday o'zgardi?
  4. Barcha kirishlarni nolga tenglang va siljishning ta'sirini ko'ring.
  5. Uchta kirish, to'rtta neyronli qatlam yarating.
  6. Natijaning shaklini print(x.shape) bilan tekshiring.
  7. Ataylab mos kelmaydigan shakl bering va xatoni o'qing.
  8. Imtihon misolidagi og'irliklarni o'zgartirib, natijaga ta'sirini ko'ring.
  9. Qaysi vazifalarda neyron tarmoq kerak emasligini uchta misol bilan yozing.
  10. Nima uchun for sikli 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 + b va y = 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.

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.