Sinir ağları nasıl öğrenir?
Kısaca
- Bir nöronun ağırlık, bias ve aktivasyondan oluştuğunu görmek
- Tek nöronun neden XOR’u çözemediğini ve katmanların neyi değiştirdiğini anlamak
- Geri yayılımın (backpropagation) gradyanı nasıl hesapladığını sezmek
- PyTorch ile küçük bir ağ eğitmek
İlk adım: aşağıdaki Tek nöron deneyini bul ve içindeki görevi çöz. Okumadan önce kurcalamak, okuduğunu çok daha kolay anlamanı sağlar.
Sinir ağları, bugünkü yapay zekânın neredeyse tamamının temelinde. Bu derste tek bir nörondan başlayıp katmanlara çıkacak ve küçük bir ağı kendin eğiteceksin.
Bir nöron
Yapay nöron üç şey yapar:
- Girdileri ağırlıklarıyla çarpıp toplar:
z = w₁x₁ + w₂x₂ + b - Sonucu bir aktivasyon fonksiyonundan geçirir. Bu, sayıyı belli bir aralığa sokan küçük bir dönüşümdür. Burada sigmoid kullanıyoruz:
σ(z) = 1 / (1 + e⁻ᶻ). Ne kadar büyük ya da küçük bir sayı gelirse gelsin, onu 0 ile 1 arasına sıkıştırır. - Çıktıyı bir olasılık gibi okuruz: 0,5’in üstü bir sınıf, altı diğeri.
Olasılığın tam 0,5 olduğu yer bir çizgidir: karar sınırı. Ağırlıklar çizginin açısını, sabit terim (bias) ise yerini belirler.
Aşağıda önce kaydırıcılarla çizgiyi elle yerleştirmeye çalış. Sonra Eğit’e bas: gradyan iniş aynı işi senin yerine yapacak. Ardından XOR veri setine geç.
- epoch
- 0
- kayıp (log)
- 0.743
- doğruluk
- %33
Ağırlıklar çizginin açısını, bias çizginin yerini değiştirir. Elle dene ya da eğit.
XOR ve katmanlar
XOR’da sınıflar çapraz köşelerde. Tek bir düz çizgiyle ayrılamaz; dört noktanın en fazla üçü doğru sınıflanabilir. 1969’da Minsky ve Papert’in bu gözlemi, sinir ağlarına olan ilgiyi yıllarca soğuttu.
Çözüm, nöronları katmanlar hâlinde dizmek. İlk katmandaki birkaç nöron birkaç farklı çizgi çizer; sonraki katman bu çizgileri birleştirip eğri bir sınır oluşturur. Katmanların arasında sigmoid ya da ReLU gibi bir aktivasyon olmak zorunda. Bunlar çizgiyi bükebilen tek parça. Onlar olmadan kaç katman koyarsan koy, sonuç yine tek bir düz çizgi olur.
Şimdi aynı XOR problemini, iki gizli katmanı olan küçük bir ağa ver. “XOR” desenini seç ve izle: tek nöronun yapamadığını katmanlar başarıyor. Kendi desenini de çizebilirsin.
- tur (epoch)
- 0
- hata (kayıp)
- 0.000
- doğruluk
- %0
Makine, renkleri ayıran sınırı kendi kendine arıyor. Kimse ona kuralı söylemedi; yalnızca örnekleri görüyor.
Geri yayılım, tek paragrafta
Çok katmanlı bir ağda her ağırlığın kayba etkisini bilmemiz gerekiyor. Geri yayılım (backpropagation) bunu sondan başa doğru hesaplar. Çıktıdaki hata, bir önceki katmana payı oranında dağıtılır; o katman da kendi payını bir öncekine dağıtır. Bunu sağlayan matematik kuralına zincir kuralı denir. Elle yazmak öğreticidir; pratikte PyTorch gibi kütüphaneler bunu loss.backward() ile otomatik yapar.
Aşağıdaki levhada bunu canlı izleyebilirsin: turuncu noktalar ileri geçişi, mavi kesikli çizgiler geri yayılımı gösteriyor. Kenarların kalınlığı ağırlığın büyüklüğü; kayıp düştükçe XOR tablosundaki tahminler hedefe oturuyor. Sonra gizli katmanı tek nörona indir ve ne olduğuna bak.
PyTorch ile XOR’u çöz
uv add torch
import torch
from torch import nn
X = torch.tensor([[0., 0.], [0., 1.], [1., 0.], [1., 1.]])
y = torch.tensor([[0.], [1.], [1.], [0.]])
model = nn.Sequential(
nn.Linear(2, 8), # gizli katman: 8 nöron
nn.ReLU(),
nn.Linear(8, 1),
nn.Sigmoid(),
)
kayip_fn = nn.BCELoss()
opt = torch.optim.Adam(model.parameters(), lr=0.05)
for epoch in range(500):
opt.zero_grad() # önceki gradyanları sil
kayip = kayip_fn(model(X), y)
kayip.backward() # geri yayılım
opt.step() # gradyan iniş adımı
print(model(X).detach().round()) # [[0],[1],[1],[0]]
Bu döngü (zero_grad → ileri → kayıp → backward → step) bir sohbet modelini eğitirken de değişmez. Değişen yalnızca veri, model ve ölçek.
nn.Linear(2, 8) satırındaki 8’i 1 yap ve tekrar çalıştır. Gizli katmanda tek nöron kalınca ne oluyor?
Kendini dene
1. Tek bir nöron XOR’u neden çözemez?
2. Aktivasyon fonksiyonlarını kaldırırsak çok katmanlı ağ neye dönüşür?
3. PyTorch’ta loss.backward() ne yapar?
Daha derine inmek istersen