Ana içeriğe geç

Orta11 dkB — Görüntü ve CNN

Klasik mimariler (LeNet → ResNet)

Önkoşul:CNN mimarisinin tamamı

Kanca

  1. derste TEK bir CNN’in yapısını gördük. Ama gerçek dünyada kullanılan mimariler, 1998’den 2015’e kadar İNANILMAZ değişti — 7 katmandan 152 katmana. Bu sıçramayı mümkün kılan TEK bir fikri bu derste keşfedeceğiz.

Sezgi

CNN mimarileri zamanla DERİNLEŞTİ, ama bu derinleşme 2015’e kadar ciddi bir engelle karşılaştı: kaybolan gradyan (5. ders). ResNet’in “atlama bağlantısı” (skip/residual connection) fikri, bu engeli aşıp 1000+ katmanlı ağları bile eğitilebilir kıldı.

Mekanizma

Önce tarihe bakalım — gerçek mimarilerin katman ve parametre sayıları:

LeNet'ten ResNet'e

# CNN mimarileri, 1998'den 2015'e KATMAN SAYISI bakımından devasa büyüdü.
# Bu sayılar, yayınlanmış makalelerden alınmış GERÇEK rakamlardır.
mimariler = [
    ("LeNet-5", 1998, 7, "60 bin"),
    ("AlexNet", 2012, 8, "60 milyon"),
    ("VGG-16", 2014, 16, "138 milyon"),
    ("ResNet-50", 2015, 50, "25 milyon"),
    ("ResNet-152", 2015, 152, "60 milyon"),
]

print(f"{'Mimari':<14} {'Yıl':<8} {'Katman sayısı':<16} {'Parametre sayısı':<16}")
for isim, yil, katman, parametre in mimariler:
    print(f"{isim:<14} {yil:<8} {katman:<16} {parametre:<16}")

print("\nVGG-16'dan ResNet-50'ye geçişte katman sayısı 16'dan 50'ye ÇIKTI ama parametre sayısı 138M'dan 25M'a DÜŞTÜ.")
print("ResNet, daha DERİN ama daha VERİMLİ bir mimari -- bunun sırrı: atlama (skip/residual) bağlantıları.")
Mimari         Yıl      Katman sayısı    Parametre sayısı
LeNet-5        1998     7                60 bin          
AlexNet        2012     8                60 milyon       
VGG-16         2014     16               138 milyon      
ResNet-50      2015     50               25 milyon       
ResNet-152     2015     152              60 milyon       

VGG-16'dan ResNet-50'ye geçişte katman sayısı 16'dan 50'ye ÇIKTI ama parametre sayısı 138M'dan 25M'a DÜŞTÜ.
ResNet, daha DERİN ama daha VERİMLİ bir mimari -- bunun sırrı: atlama (skip/residual) bağlantıları.

VGG-16’dan ResNet-50’ye geçişte katman sayısı 16’dan 50’ye ÇIKARKEN parametre sayısı 138M’dan 25M’a DÜŞÜYOR — ResNet hem daha derin HEM daha verimli. Şimdi NEDEN 2015’ten önce böyle derin ağlar eğitilemediğini görelim:

Derin bir ağda kaybolan gradyan

# Neden 2015'ten ÖNCE kimse 50+ katmanlı ağlar eğitemedi? 5. dersteki kaybolan
# gradyan sorununu, GERÇEK bir konvolüsyon zincirinde tekrar görelim.
def blok_olustur(std=0.02):
    konv = nn.Conv2d(8, 8, 3, padding=1)
    nn.init.normal_(konv.weight, std=std)
    nn.init.zeros_(konv.bias)
    return konv

def duz_ag_olustur(derinlik):
    katmanlar = []
    for _ in range(derinlik):
        katmanlar.append(blok_olustur())
        katmanlar.append(nn.ReLU())
    return nn.Sequential(*katmanlar)

def girdi_gradyan_normu(ag, girdi):
    girdi = girdi.clone().requires_grad_(True)
    kayip = ag(girdi).sum()
    kayip.backward()
    return girdi.grad.norm().item()

girdi = torch.randn(1, 8, 8, 8)
print(f"\n{'Derinlik':<10} {'Düz ağ (atlama YOK) gradyan normu':<36}")
for derinlik in [10, 20, 30]:
    duz_ag = duz_ag_olustur(derinlik)
    norm = girdi_gradyan_normu(duz_ag, girdi)
    print(f"{derinlik:<10} {norm:<36.3e}")

print("\n30 katmanda gradyan norm 0.0'a (float32 hassasiyetinin ALTINA) düşüyor -- 5. dersteki kaybolan gradyanın")
print("konvolüsyon zincirindeki YENİDEN karşımıza çıkışı. Bu yüzden 2015'ten önce çok derin ağlar eğitilemedi.")

Derinlik   Düz ağ (atlama YOK) gradyan normu   
10         4.146e-08                           
20         3.655e-18                           
30         0.000e+00                           

30 katmanda gradyan norm 0.0'a (float32 hassasiyetinin ALTINA) düşüyor -- 5. dersteki kaybolan gradyanın
konvolüsyon zincirindeki YENİDEN karşımıza çıkışı. Bu yüzden 2015'ten önce çok derin ağlar eğitilemedi.

30 katmanlı bir konvolüsyon zincirinde, gradyan tam olarak 0.0’a (float32’nin temsil edebileceği en küçük sayının bile ALTINA) düşüyor. Çoğu kişi “5. dersteki kaybolan gradyan sadece basit örneklerde olur” sanır. Yanlış, çünkü GERÇEK konvolüsyon katmanlarında da AYNI matematik geçerli.

Matematik

Atlama (residual) bağlantısının türevi
y=x+f(x)y = x + f(x)yx=1+fx\frac{\partial y}{\partial x} = 1 + \frac{\partial f}{\partial x}
SembolAnlamı
xxBloğun girdisi
f(x)f(x)Bloğun “öğrenilen” dönüşümü (konvolüsyon + aktivasyon)
y=x+f(x)y = x + f(x)Bloğun çıktısı — girdi DOĞRUDAN çıktıya eklenir

Türevdeki "11" terimi KRİTİK: f(x)f'(x) ne kadar küçük olursa olsun (kaybolsa bile), gradyan en azından bu "11" üzerinden HER ZAMAN geri akabilir. Bu, gradyanın asla TAMAMEN sıfırlanmamasını garanti eder.

Kod

Bu fikri gerçek bir “artık blok” (residual block) ile test edelim:

Atlama bağlantısının etkisi

# ResNet'in çözümü: her bloğun çıktısına GİRDİYİ GERİ EKLEMEK (y = x + f(x)).
class ArtikBlok(nn.Module):
    def __init__(self, std=0.02):
        super().__init__()
        self.konv = blok_olustur(std)
        self.relu = nn.ReLU()

    def forward(self, x):
        return x + self.relu(self.konv(x))  # ATLAMA (skip) bağlantısı

def artik_ag_olustur(derinlik):
    return nn.Sequential(*[ArtikBlok() for _ in range(derinlik)])

print(f"\n{'Derinlik':<10} {'Artık ağ (atlama VAR) gradyan normu':<36}")
for derinlik in [10, 20, 30]:
    artik_ag = artik_ag_olustur(derinlik)
    norm = girdi_gradyan_normu(artik_ag, girdi)
    print(f"{derinlik:<10} {norm:<36.4f}")

print("\nAYNI derinlikte, atlama bağlantılı ağın gradyanı SIFIRA gitmiyor -- tam tersine, derinlikle BÜYÜYOR.")
print("Neden: y = x + f(x)'in türevi, dy/dx = 1 + f'(x) -- '1' terimi, gradyanın HER ZAMAN en az bir doğrudan")
print("yol üzerinden geri akmasını GARANTİ ediyor. Bu basit fikir, 1000+ katmanlı ağları eğitilebilir kıldı.")

Derinlik   Artık ağ (atlama VAR) gradyan normu 
10         34.2274                             
20         54.9939                             
30         99.4524                             

AYNI derinlikte, atlama bağlantılı ağın gradyanı SIFIRA gitmiyor -- tam tersine, derinlikle BÜYÜYOR.
Neden: y = x + f(x)'in türevi, dy/dx = 1 + f'(x) -- '1' terimi, gradyanın HER ZAMAN en az bir doğrudan
yol üzerinden geri akmasını GARANTİ ediyor. Bu basit fikir, 1000+ katmanlı ağları eğitilebilir kıldı.

AYNI derinlikte (30 katman), atlama bağlantılı ağın gradyanı sıfıra gitmek yerine 99.45’e kadar BÜYÜYOR. Tek fark: her bloğun çıktısına girdiyi geri eklemek.

Ağ derinliğine karşı gradyan normunu log ölçekte gösteren grafik; atlama bağlantısı olmayan ağ hızla sıfıra düşerken atlama bağlantılı ağ yüksek kalıyor.
Düz bir ağda derinlik arttıkça gradyan sıfıra çöküyor; atlama bağlantıları bu çöküşü tamamen önlüyor.

Nerede işe yarar

Bu beş mimarinin her biri, kendi döneminin bir “aşılması gereken engelini” temsil eder:

  • LeNet-5 (1998): İlk pratik CNN — el yazısı rakam tanıma için.
  • AlexNet (2012): ReLU (8. ders), dropout (22. ders) ve GPU eğitimiyle ImageNet yarışmasını kazanıp derin öğrenmeyi ana akıma taşıdı.
  • VGG (2014): “Sadece 3×3 çekirdekler kullan, derinliği artır” fikrinin basitliğiyle etkili oldu.
  • ResNet (2015): Atlama bağlantılarıyla, o zamana kadar İMKANSIZ sayılan derinlikleri (152+ katman) eğitilebilir kıldı.
  • Atlama bağlantıları bugün NEREDEYSE HER modern mimaride (transformer’lar dahil, NLP kategorisinde göreceğiz) bir şekilde kullanılıyor.

Bu 3 hatayı yaparsın:

  1. “Daha derin ağ her zaman daha iyi” sanmak — derinlik, atlama bağlantıları gibi bir ÇÖZÜM olmadan faydasız (hatta zararlı) olabilir.
  2. Atlama bağlantılarını sadece “ResNet’e özgü egzotik bir teknik” sanmak — aslında son derece basit bir fikir (y = x + f(x)).
  3. Parametre sayısı ile katman sayısını KARIŞTIRMAK — ResNet-50, VGG-16’dan hem DERİN hem daha AZ parametreli.

Kendini test et

1. Notebook'ta 30 katmanlı düz bir ağda gradyan neden tam olarak 0.0'a düştü?
  1. Kod hatalıydı
  2. Her katmanda gradyan küçük bir sayıyla çarpılıyor; 30 kez üst üste çarpılınca sonuç float32'nin temsil edebileceği en küçük sayının bile altına iniyor (5. ders: kaybolan gradyan) (doğru cevap)
  3. PyTorch 30 katmanı desteklemiyor
  4. Girdi yanlış tanımlandı

Neden: 5. dersteki zincir kuralı mantığı burada da geçerli: her katmanda küçültücü bir çarpan varsa, bu çarpanlar katman sayısıyla üstel olarak küçülür -- 30 katman sonunda sonuç, float32'nin en küçük temsil edilebilir sayısının bile altına düşer.

2. Atlama bağlantısının (y = x + f(x)) türevindeki '1' terimi neden bu kadar önemli?
  1. Önemli değildir, sadece matematiksel bir detaydır
  2. f'(x) ne kadar küçük olursa olsun (kaybolsa bile), gradyan '1' terimi üzerinden HER ZAMAN geri akabilir -- bu, gradyanın tamamen sıfırlanmasını ENGELLER (doğru cevap)
  3. Bu terim öğrenme oranını değiştirir
  4. Bu terim sadece ilk katmanı etkiler

Neden: dy/dx = 1 + f'(x) formülündeki sabit '1', f'(x) sıfıra gitse bile toplam türevin en az 1 olmasını garanti eder -- bu da gradyanın derin bir ağda bile TAMAMEN kaybolmasını önler.

3. ResNet-50'nin VGG-16'dan hem daha derin (50 vs 16 katman) hem daha az parametreli (25M vs 138M) olması neyi gösteriyor?
  1. Katman sayısı ile parametre sayısı her zaman doğru orantılıdır
  2. Derinlik ve parametre sayısı BAĞIMSIZ tasarım kararlarıdır -- akıllı mimari tasarımı (örn. global average pooling, verimli bloklar) derinliği artırırken parametre sayısını azaltabilir (doğru cevap)
  3. ResNet-50 aslında VGG-16'dan daha küçük bir modeldir
  4. Bu rakamlar hatalıdır

Neden: VGG'nin parametrelerinin çoğu son tam bağlı katmanlarından gelir; ResNet gibi mimariler bu büyük FC katmanları yerine global average pooling gibi verimli tekniklerle, daha derin olsalar bile çok daha az parametre kullanabilir.

Özet

Özet

  • CNN mimarileri 1998 (LeNet, 7 katman) ile 2015 (ResNet-152, 152 katman) arasında devasa derinleşti.
  • Derin ağlarda kaybolan gradyan (5. ders), 2015'ten önce çok derin ağların eğitilmesini engelleyen temel sorundu.
  • ResNet'in atlama (residual) bağlantısı, y = x + f(x) ile, gradyanın her zaman en az bir "doğrudan yol" üzerinden akmasını garanti eder.
  • Notebook'ta 30 katmanlı bir ağda bu fikir, gradyanı sıfırdan 99.45'e taşıdı.
  • Atlama bağlantıları bugün transformer'lar dahil neredeyse her modern mimarinin temel bir bileşenidir.
Sonraki adım: Veri artırma →