Nöron Modeli · Aktivasyon Fonksiyonları · Karar Sınırı
Hafta 1'de dili öğrendik: tensör, nokta çarpım, matris. Bu hafta o dille ilk cümleyi kuruyoruz: tek bir nöron.
Biyolojik nörondan
McCulloch–Pitts'e, oradan y = f(w·x + b)'ye.
Bir nöron = bir karar doğrusu. AND kolay, XOR tek nöronla imkânsız; iki katmanla?
f neden şart? XOR'u nasıl çözer? Hangi f, hangi katmanda?
Bu hafta ağırlıkları biz vereceğiz. Hafta 3'te nöron onları veriden kendisi öğrenecek.
İnsan beyninde yaklaşık 86 milyar nöron; her biri binlerce sinapsla bağlı. Öğrenme = sinaps güçlerinin değişmesi.
| Biyolojik | Ne yapar? | Yapay karşılığı |
|---|---|---|
| Dendrit | sinyal alır | girdi xᵢ |
| Sinaps gücü | sinyali güçlendirir / zayıflatır | ağırlık wᵢ (+ / −) |
| Hücre gövdesi | toplar | net girdi Σ wᵢxᵢ + b |
| Akson tepeciği | eşiği aşınca ateşler | aktivasyon f(net) |
| Akson | sonucu iletir | çıktı y |
Esin, kopya değil: gerçek nöron zamanda "atım" (spike) üretir, kimyası karmaşıktır. Yapay nöron yalnızca ağırlıklı topla + eşikle fikrini alır.
Nörofizyolog ve psikiyatrist. Sorusu: düşünce, nöronların etkinliğine nasıl indirgenir?
Kendi kendini yetiştirmiş, o sırada ~20 yaşında bir mantıkçı; modelin matematiğini kurdu.
Nöronun "hep-ya-hiç" doğasından yola çıkıp sinir etkinliğini önermeler mantığıyla ifade etmek.
Bu nöronlardan kurulan ağlar AND, OR, NOT ile her mantık fonksiyonunu hesaplayabilir.
von Neumann, 1945 EDVAC raporunda bilgisayarı bu nöronlarla anlattı; YSA'nın ve otomata kuramının başlangıcı.
| # | Varsayım (1943) | Modelde ne demek? |
|---|---|---|
| 1 | Etkinlik hep-ya-hiç | girdi ve çıktı ikili: 0 / 1 |
| 2 | Ateşlemek için belirli sayıda uyarıcı sinaps gerekir | eşik θ (teta): Σ xᵢ ≥ θ |
| 3 | Tek önemli gecikme sinaptik gecikmedir | ayrık zaman: t → t+1 |
| 4 | Tek bir baskılayıcı sinaps ateşlemeyi tamamen engeller | mutlak baskılama (veto) → NOT |
| 5 | Ağın yapısı zamanla değişmez | ağırlıklar sabit → öğrenme yok |
…ve o anda hiçbir baskılayıcı girdi etkin değilse (yoksa y = 0).
Uyarıcı girdilerin hepsi eşit ağırlıklı (1). Nöronu belirleyen tek sayı θ: aynı nöron farklı θ ile farklı bir kapı olur.
5. varsayım modelin sınırı: ağırlıkları ve θ'yı biz seçiyoruz. Öğrenmeyi Hebb (1949) ve Rosenblatt (1958) getirecek → H3 H4
Karar sınırı \( x_1 + x_2 = \theta \) doğrusu; sağ üst taraf ateşler (y = 1).
| x₁ | x₂ | x₁+x₂ | AND | OR |
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 |
| 0 | 1 | 1 | 0 | 1 |
| 1 | 0 | 1 | 0 | 1 |
| 1 | 1 | 2 | 1 | 1 |
Girdiler 0/1 olduğundan x₁+x₂ ∈ {0, 1, 2}. AND için 1 < θ ≤ 2, OR için 0 < θ ≤ 1 olan her θ aynı kapıyı verir; doğruları aralığın ortasına (1.5 ve 0.5) çizdik. ● ateşler · ○ ateşlemez
Ağırlıklı toplam = Hafta 1'in nokta çarpımı. Nöronun tüm "zekâsı" w, b ve f'nin seçiminde.
"\( \mathbf{w}^\top\mathbf{x} \ge \theta \) ise ateşle" ile "\( \mathbf{w}^\top\mathbf{x} + b \ge 0 \) ise ateşle" aynı şeydir: \( b = -\theta \). Bias, karar sınırını kaydırır.
Sabit bir girdi ekle: \( x_0 = 1,\; w_0 = b \). Artık \( \text{net} = \tilde{\mathbf{w}}^\top \tilde{\mathbf{x}} \) — bias da sıradan bir ağırlık olur ve aynı kuralla öğrenilir H3.
Kaynaklarda ikisini de göreceksiniz: erken modeller (McCulloch–Pitts, Rosenblatt) eşik θ ile, PyTorch gibi kütüphaneler ve birçok ders kitabı bias b ile yazar. İkisi aynı şeydir: b = −θ.
McCulloch–Pitts gibi basamak kullandık. Başka bir f seçseydik aynı net bambaşka bir cevap verirdi — aktivasyon bölümünde göreceğiz.
import torch
x = torch.tensor([1., 2., -1.]) # girdi shape: (3,)
w = torch.tensor([0.5, -0.25, 0.75]) # ağırlıklar shape: (3,)
b = torch.tensor(0.2) # bias shape: () → skaler
w * x # tensor([ 0.5000, -0.5000, -0.7500]) ← üç çarpım
(w * x).sum() + b # tensor(-0.5500) ← topla, b'yi ekle
net = w @ x + b # tensor(-0.5500) ← tek adımda: nokta çarpım
y = (net >= 0).float() # tensor(0.) ← basamak: ateşlemez
xt = torch.cat([torch.ones(1), x]) # [1, 1, 2, -1] bias hilesi
wt = torch.cat([b.view(1), w]) # [0.2, 0.5, -0.25, 0.75]
wt @ xt # tensor(-0.5500) → aynı net!
Elle ↔ kod: çarp → w * x
· topla → .sum() · ikisi birden → @ (Hafta 1'in nokta çarpımı). Sonuç
elle bulduğumuzla birebir aynı: −0.55 ve 0.
🔈 okunuş:
σ “sigma” = sigmoid
tanh “tanh” = hiperbolik tanjant
Çizgi kalınlığı = |w|, mavi = uyarıcı (+), kırmızı = baskılayıcı (−). Başlangıç = slayt 10'daki nöron. Dene: nöronu ateşletmek için hangi kaydırıcıyı oynatırsın?
w vektörü doğruya diktir ve "1" tarafını gösterir (Hafta 1: nokta çarpımın işareti).
b, doğruyu eğimini değiştirmeden kaydırır. b olmasa doğru hep orijinden geçerdi.
3 girdide düzlem, n girdide hiperdüzlem. Fikir aynı: uzayı ikiye böler.
Bir nöronun çözebildiği problemler = tek bir doğruyla ayrılabilenler. Hadi deneyelim →
● hedef 1 · ○ hedef 0 · kırmızı halka = yanlış sınıflanan. XOR'da 4/4'ü bulabilir misin?
w₁, w₂, b ∈ [−3, 3], adım 0.25 → 15.625 kombinasyon tarandı. En iyi sonuç: 3 / 4. AND ve OR ise 4/4.
XOR'un "1"leri (0,1) ve (1,0) çaprazda. Onları "0"lardan ayıracak tek bir doğru yok: problem doğrusal ayrılamaz.
1969'da Minsky ve Papert bunu gösterince YSA araştırmaları yıllarca yavaşladı. Peki çıkış yolu ne? Bir doğru yetmiyorsa… iki doğru çizelim →
| x₁ x₂ | h₁ = OR | h₂ = NAND | y = h₁ AND h₂ | XOR |
|---|---|---|---|---|
| 0 0 | 0 | 1 | 0 | 0 ✓ |
| 0 1 | 1 | 1 | 1 | 1 ✓ |
| 1 0 | 1 | 1 | 1 | 1 ✓ |
| 1 1 | 1 | 0 | 0 | 0 ✓ |
Her gizli nöron bir doğru çizer; çıkış nöronu bu doğruların kararlarını birleştirir. Daha çok gizli nöron = daha çok doğru = daha karmaşık bölge. Parçalar tanıdık: slayt 7'deki AND/OR nöronları! Peki çıkış nöronu bu işi nasıl görüyor? →
● hedef 1 · ○ hedef 0 · mavi kenar +1, kırmızı −1. Ağırlıkları burada biz seçtik; makine kendisi bulacak H5–H6. Sıradaki soru: f neden bu kadar önemli? →
Gizli katman XOR'u çözdü, ama f'yi kaldırınca çözüm çöktü. Demek ki anahtar f'nin seçimi. Üç gerekçe:
f olmadan katmanlar tek bir doğrusal katmana çöker. XOR gibi problemler ancak doğrusal olmayan f + gizli katmanla çözülür H5H6
Basamak yalnız "evet/hayır" der. Sigmoid çıktıyı (0, 1)'e sıkıştırır: "%37 evet" gibi, ne kadar emin olduğunu söyler.
Pürüzsüz f: w'deki küçük değişim → y'de küçük değişim. Makine ağırlığı adım adım ayarlayabilir. Basamakta ya hiç değişmez ya sıçrar H3
Sırayla açalım: önce doğrusal olmama →
Slayt 16'daki XOR ağı, ama bu kez f yok:
(0,0), (0,1), (1,0), (1,1): dördü de −0.5. XOR şöyle dursun, bu ağ hiçbir şeyi ayıramıyor.
y = v₁h₁ + v₂h₂ + c = (v₁ − v₂)(x₁ + x₂) + sabit → yine tek nöron, tek doğru. Hiçbir v XOR'u çözemez.
X = torch.tensor([[0., 0.], [0., 1.], [1., 0.], [1., 1.]])
W1 = torch.tensor([[1., 1.], [-1., -1.]]); b1 = torch.tensor([-0.5, 1.5]) # OR, NAND
W2 = torch.tensor([[1., 1.]]); b2 = torch.tensor([-1.5]) # AND
step = lambda z: (z >= 0).float()
(X @ W1.T + b1) @ W2.T + b2 # f yok → [-0.5, -0.5, -0.5, -0.5]
W2 @ W1, W2 @ b1 + b2 # tek katmana katlandı: W = [[0., 0.]], b = [-0.5]
step(step(X @ W1.T + b1) @ W2.T + b2) # f var → [0, 1, 1, 0] XOR ✓
Hafta 1'deki matris çarpımı iki doğrusal katmanı tek matrise katlar; 100 katman = 1 katman. Doğrusal olmayan f bu katlamayı bozar, derinliğin anlamı budur H6. Peki sigmoid gibi yumuşak bir f de büker mi? → (Çıktılar PyTorch ile alındı.)
| Ad | f(z) | Çıktı aralığı | Derste nerede? |
|---|---|---|---|
| Basamak | 1 (z ≥ 0), 0 | {0, 1} | Ayrık perceptron H4 |
| Doğrusal | z | (−∞, ∞) | ADALINE / Delta H3 |
| Sigmoid σ | 1 / (1 + e⁻ᶻ) | (0, 1) | Sürekli perceptron H5 |
| tanh | (eᶻ − e⁻ᶻ)/(eᶻ + e⁻ᶻ) | (−1, 1) | ÇKA gizli katman H6 |
| ReLU | max(0, z) | [0, ∞) | Derin ağlar, CNN H14 |
Her biri çıktıyı farklı bir aralığa taşır (gerekçe 2). Aynı net'e uygulayıp görelim →
Slayt 10'daki nöron: net = −0.55. Aynı girdi, aynı ağırlıklar — yalnızca f değişiyor:
| f | y = f(−0.55) | Nöron ne diyor? |
|---|---|---|
| basamak | 0 | "Kesinlikle hayır." Ne kadar yaklaştığını söylemez. |
| sigmoid | 0.3659 | "%37 ihtimalle evet." Olasılık gibi okunur. |
| tanh | −0.5005 | "Hafif hayır." Sıfır merkezli: −1 … +1. |
| ReLU | 0 | "Sessiz." Negatif net'i tamamen keser. |
Aktivasyon, nöronun "karakterini" belirler. Peki neden bu kadar çok aktivasyon var — hangisi nerede işe yarar? →
h = 2x + 1, y = 3h − 1 → y = 6x + 2
ReLU(x) + ReLU(−x) → y = |x|
f'nin işi uzayı bükmek. Şart: doğrusal olmamalı. Bugün en çok ReLU kullanılır; nedenini öğrenmeyle göreceğiz H3
f'nin işi çıktıyı görevin diline çevirmek: fiyat mı, olasılık mı, sınıf mı? Seçimi görevin istediği aralık belirler.
"En iyi aktivasyon" diye bir şey yok. Doğru soru: hangi katmanda, hangi iş için?
| Görev | İstenen çıktı | Çıktı f'si | Yanlış seçersen… |
|---|---|---|---|
| Regresyon (ev fiyatı, sıcaklık) | herhangi bir sayı | doğrusal | sigmoid: en fazla 1 → "2,5 milyon" diyemez |
| İkili sınıf (spam mı?) | olasılık (0, 1) | sigmoid | doğrusal: "−0.4 olasılık" anlamsız |
| Çok sınıf (rakam 0–9) | 10 olasılık, toplamı 1 | softmax (ileride) | 10 ayrı sigmoid: toplam 1 olmaz |
| Çok etiket (fotoğrafta neler var?) | her etikete ayrı olasılık | her çıkışa sigmoid | softmax: "kedi ve köpek" diyemez |
| Direksiyon açısı (sınırlı) | (−1, 1) aralığı | tanh | doğrusal: ±1'i aşabilir |
Basamak? En net cevabı verir ama düz basamaklar öğrenmeye izin vermez H3. Kararı eğitimden sonra eşikle veririz: σ ≥ 0.5 → "spam".
Peki gizli katmanda hangisi? Kısa cevap: bugün çoğunlukla ReLU. Nedenini öğrenmenin matematiğiyle göreceğiz H3. Şimdi sıra sizde →
Önce tahmin et, sonra karta tıkla. Soru hep aynı: hangi katman, hangi iş?
Çıktı katmanı?
doğrusal — fiyat 0–1'e sığmaz, her sayı olabilmeli.
Çıktı katmanı?
sigmoid — P(spam); ≥ 0.5 ise "spam".
Çıktı katmanı?
softmax — 10 olasılık, toplamı 1; en büyüğü cevap.
Birden çoğu olabilir. Çıktı katmanı?
her çıkışa sigmoid — etiketler birbirinden bağımsız.
Gizli katmanlar?
ReLU — bugünün varsayılanı: hesabı ucuz, derin ağlarda iyi öğrenir (nedeni → H3).
Çıktı katmanı?
tanh — çıktı doğal olarak (−1, 1) aralığında kalır.
import torch
class Noron:
def __init__(self, w, b, f):
self.w = torch.tensor(w, dtype=torch.float32) # ağırlıklar
self.b = b # bias
self.f = f # aktivasyon
def __call__(self, x):
net = self.w @ torch.tensor(x, dtype=torch.float32) + self.b
return self.f(net)
ve = Noron([1., 1.], -1.5, lambda z: (z >= 0).float()) # AND kapısı
[ve(x).item() for x in [(0, 0), (0, 1), (1, 0), (1, 1)]] # [0.0, 0.0, 0.0, 1.0]
n = Noron([0.5, -0.25, 0.75], 0.2, torch.sigmoid) # slayt 10'daki nöron
n([1, 2, -1]) # tensor(0.3659)
dtype=torch.float32 şart:
(0, 1) gibi tamsayı girdiler yoksa int64 olur ve @ hata verir.
katman = torch.nn.Linear(2, 3) # 2 girdi → 3 nöron
katman.weight.shape # torch.Size([3, 2]) çıkış × giriş
X = torch.randn(5, 2) # 5 örnek (batch)
Y = torch.sigmoid(katman(X)) # (5, 3): her örnek için 3 nöron
# aynı anda, tek matris çarpımıyla
torch.allclose(katman(X), X @ katman.weight.T + katman.bias) # True
Ağırlık matrisinin her satırı bir nöronun w vektörü. 3 nöron → 3 satır.
X @ W.T + b: Hafta 1'in kapağındaki
Y = X @ W buydu!
Bu katmanları üst üste dizince (aralarına aktivasyon koyarak) çok katmanlı algılayıcı elde ederiz H6.
✅ Biyolojik esin: dendrit → x, sinaps → w, gövde → Σ, tepecik → f
✅ Model: net = wᵀx + b,
y = f(net); bias = −eşik
✅ Nöron = karar doğrusu: AND/OR evet, XOR hayır
✅ Aktivasyon şart: doğrusal olmama, çıktıyı biçimlendirme, öğrenilebilirlik
✅ XOR: gizli katman + doğrusal olmayan f uzayı büker; f yoksa katmanlar tek doğruya çöker
✅ Kod: Noron sınıfı →
nn.Linear = yan yana nöronlar
✅ Rol: gizli katman şekli üretir → ReLU / tanh; çıktı katmanı göreve göre → doğrusal / sigmoid / softmax
✅ Aralıklar: basamak {0, 1} · sigmoid (0, 1) · tanh (−1, 1) · ReLU [0, ∞) · doğrusal (−∞, ∞)
1 · Mantık kapıları. Noron sınıfıyla
AND, OR ve NAND için w ve b'yi elle bul. Kontrol: 4 girdide 4/4.
2 · Çiz. matplotlib ile basamak, sigmoid, tanh ve ReLU'yu z ∈ [−6, 6]'da çiz. Her birinin çıktı aralığı ne? Hangisi hangi çıktı görevine uyar?
3 · Katmanlar çöker mi? torch.float64
ile 3 doğrusal katmanı tek W, b'ye indir ve allclose ile
doğrula. Araya relu koyunca ne değişiyor?
4 · XOR'a meydan oku. Tek nöronla XOR'u çözmeye çalış. Olmuyorsa nedenini slayt 15'teki geometriyle bir cümleyle açıkla.
İpucu: NAND = AND'in tersi. AND'in w ve b'sinin işaretlerini çevirmek yeter mi? Dene.
Bu hafta ağırlıkları biz verdik. Gelecek hafta nöron onları veriden kendisi bulacak: Hebb kuralı ve Delta (Widrow–Hoff) kuralı. Bunun için yeni bir araç gerekecek: türev — "w'yi biraz değiştirirsem y ne kadar değişir?"
🔈 okunuş: Δ “delta”: değişim miktarı·η “eta”: öğrenme oranı
← Ders Ana Sayfasına Dön