Aktivasyon Fonksiyonu
Activation Function
Bir nöronun girdilerinin ağırlıklı toplamını çıktıya dönüştüren doğrusal olmayan fonksiyon — sinir ağına 'düşünme' kapasitesini kazandırır.
Bir sinir ağı sadece doğrusal katmanlardan oluşsa, yığılmış matris çarpımları sonunda yine tek bir doğrusal dönüşüme eşitti — yani derinlik anlamsızlaşırdı. Aktivasyon fonksiyonu, her nöronun çıktısına doğrusal olmayan bir dönüşüm uygular ve ağa karmaşık örüntüleri öğrenme kapasitesi kazandırır.
En çok kullanılan aktivasyonlar:
- ReLU (Rectified Linear Unit): max(0, x). Modern derin
öğrenmenin standardı. Negatif girdiler 0 olur, pozitifler
değişmez. Hızlı ve gradyan ölmesi azdır ama "ölü ReLU"
problemi vardır (sürekli 0 çıktı veren nöronlar).
- Leaky ReLU / GELU / SiLU: ReLU varyantları. Negatif
tarafta küçük bir eğim bırakarak ölü nöron problemini
hafifletir. GELU özellikle transformer'larda standart.
- Sigmoid: 1 / (1+e^-x). Çıktı 0–1 arasında. Klasik
ikili sınıflandırma çıkışında kullanılır ama gizli
katmanlarda gradient vanishing sorunu yapar.
- Tanh: [-1, 1] aralığında merkezi 0'da olan sigmoid
benzeri.
- Softmax: çok sınıflı sınıflandırma çıktısında — N
sınıfa olasılık dağılımı verir.
Aktivasyon seçimi modelin öğrenme hızını ve son performansını belirgin etkiler. CNN'ler ve transformer'lar için ReLU/GELU, çıkış katmanı için soruna göre sigmoid/softmax/identity tercih edilir.
Bir kapı iğnesi gibi. Üzerine bir kuvvet uyguluyorsun; belirli bir eşiğin altındaysa hiçbir şey olmuyor (sıfır çıktı), eşiğin üstündeyse iğne hareket ediyor (kuvvete orantılı çıktı). ReLU tam olarak budur — eşiği 0 olan, sadece pozitif yönde tepki veren bir mekanik. Sigmoid ise yumuşak bir kapı; küçük dokunuşa hafif tepki, büyük kuvvette doyuma ulaşıp daha fazla açılmıyor.
Bir görüntü sınıflandırma CNN'i tasarlıyorsun. Üç gizli katmanın her biri konvolüsyon + aktivasyon + pooling şeklinde. Üç farklı aktivasyon dener, ImageNet alt kümesinde başarıyı kıyaslarsın:
| Aktivasyon | Doğruluk | Eğitim hızı | Notlar | |-----------|----------|-------------|--------| | Sigmoid | %71 | yavaş | derin katmanlarda gradient vanishing | | ReLU | %78 | hızlı | bazı nöronlar ölü kalıyor | | GELU | %79 | hızlı | smooth, transformer'lar tercih ediyor |
ReLU veya GELU seçimi gerçekten anlamlı fark yaratıyor. Çıkış katmanı 1000 sınıflı olduğu için softmax kullanılır; çıktı vektörü olasılık dağılımına dönüşür ve cross-entropy kaybı bu olasılıklarla gerçek etiketi kıyaslar.
import torch
import torch.nn as nn
x = torch.linspace(-3, 3, 7)
print("Girdi:", x.tolist())
activations = {
"ReLU": nn.ReLU(),
"LeakyReLU": nn.LeakyReLU(0.01),
"GELU": nn.GELU(),
"Sigmoid": nn.Sigmoid(),
"Tanh": nn.Tanh(),
}
for name, fn in activations.items():
y = fn(x).tolist()
print(f"{name:10s}: {[round(v, 3) for v in y]}")
# ReLU negatifleri 0'a kırpıyor
# GELU smooth, küçük negatif değerleri kısmen geçiriyor
# Sigmoid 0–1 arasına sıkıştırıyorlogits = torch.tensor([[2.0, 1.0, 0.1]]) # ham skorlar
probs = nn.functional.softmax(logits, dim=-1)
print(probs) # tensor([[0.659, 0.242, 0.099]])
# Üç olasılık toplamı 1.0; çok sınıflı tahmin için tipik- Sinir ağı tasarlarken — her gizli katman aktivasyon ister
- Gizli katmanlarda: ReLU, LeakyReLU, GELU, SiLU
- Çıkış katmanında: ikili sınıflandırma için sigmoid, çok sınıflı için softmax, regresyon için identity
- Klasik ML algoritmaları (rastgele orman, SVM vb.) — aktivasyon kavramı yok
- Çıkış katmanına yanlış aktivasyon koymak — örn. çok sınıflı için sigmoid
Ölü ReLU problemi
Bir nöronun girdisi sürekli negatif olursa, ReLU her zaman 0 verir, gradient 0, nöron öğrenmeyi durdurur. LeakyReLU veya GELU bu sorunu büyük ölçüde çözer.
Sigmoid'i derin ağda kullanmak
Sigmoid'in türevi en fazla 0.25; üst üste çarpınca gradyan 0'a yaklaşır (vanishing gradient). Gizli katmanlarda ReLU/GELU tercih edilir.
Yanlış çıkış aktivasyonu
Regresyonda sigmoid kullanırsan 0–1 arası sıkışırsın; çok sınıflıda sigmoid kullanırsan olasılıklar toplamı 1 olmaz. Soruna uygun çıkış katmanı seç.