AI Atlas
Orta· ~2 dk okuma#batch-normalization#layer-norm#training-stability

Batch Normalization

Toplu Normalleştirme

Bir katmandaki aktivasyonları mini-batch içindeki ortalama ve standart sapmalarına göre normalize eden teknik — sinir ağı eğitimini hem hızlandırır hem kararlı hâle getirir.

BATCH NORMALIZATIONBN'sizaktivasyon dağılımı kayarBNBN sonrasımerkezlenmiş, kararlıHer katmanın girdi dağılımını sabitler — daha hızlı ve kararlı eğitim.
Tanım

Derin sinir ağlarında bir katmanın çıktısı, sonraki katmanın girdisi olur. Eğer katmanlar boyunca aktivasyonların dağılımı sürekli değişirse (internal covariate shift), her katman sonsuza dek 'hareket eden hedefe' uyum sağlamaya çalışır — eğitim yavaşlar ve dengesizleşir. Batch normalization, her katmanın girdisini mini-batch'in ortalamasına ve standart sapmasına göre normalize ederek bu sorunu çözer.

Mekanizma şudur: her batch için çıktının her boyutunun ortalaması ve varyansı hesaplanır, normalize edilir, sonra iki öğrenilebilir parametre (γ ve β) ile yeniden ölçeklenir ve kaydırılır. γ ve β modelin hangi dağılımı tercih ettiğini öğrenir. Inference zamanında batch yerine eğitim sırasında biriktirilen yürüyen ortalamalar kullanılır.

Batch normalization 2015'te yayınlandı ve CNN eğitimlerinde devrim yarattı; yüksek learning rate'lere izin verdi, başlangıç değerlerinin etkisini azalttı, dropout ihtiyacını çoğu zaman ortadan kaldırdı. Transformer'larda batch yerine layer normalization kullanılır — sıralı verinin batch dinamiğine daha az bağlı olması istenir. Modern büyük modellerde LayerNorm ve onun varyantı RMSNorm baskın.

Benzetme

Bir orkestrayı düşün. Her sıra çalmaya başladığında ses seviyesini yeniden ayarlamak gerekiyor — biri çok gürültülü, diğeri kayboluyor. Şef, her sıraya 'standart bir referans seviyesinde başla' der; sonra her sıra kendi ifadesini bu standardın etrafında geliştirir. Konser tutarlı kalır, pratik yaparken her sıra diğerinin kapasitesine bağlı olmaktan çıkar. Batch normalization bu standart referansı her katmana sağlar.

Gerçek dünyadan örnek

18 katmanlı bir CNN'i CIFAR-10 üzerinde eğitiyorsun.

- BatchNorm yok: lr=0.1 ile eğitim ilk epoch'ta NaN'a gidiyor. lr=0.001'e düşürünce 60 epoch sonunda %78 doğruluk. - BatchNorm var: lr=0.1 stabil çalışıyor; 30 epoch'ta %85 doğruluk. Hem 2x daha hızlı, hem daha iyi sonuç.

Dropout'a artık ihtiyaç kalmıyor; batch normalization'ın düzenlileştirme etkisi yeterli oldu. Bu yüzden 2015 sonrası CNN mimarileri (ResNet, EfficientNet) BatchNorm'u tüm bloklarına standart olarak yerleştirdi.

Transformer'larda ise hikâye farklı. Sıralı işleme batch boyutuna duyarlıdır; ayrıca inference'da küçük batch'le çalışmak BatchNorm istatistiklerini bozar. Bu yüzden LayerNorm (her örneğin kendi feature'ları üzerinden normalize) standardı oldu.

Kod örnekleri
PyTorch · CNN'de BatchNormPython
import torch.nn as nn

# ResNet bloğunun klasik şekli
class BasicBlock(nn.Module):
    def __init__(self, in_ch, out_ch):
        super().__init__()
        self.conv1 = nn.Conv2d(in_ch, out_ch, 3, padding=1, bias=False)
        self.bn1   = nn.BatchNorm2d(out_ch)
        self.conv2 = nn.Conv2d(out_ch, out_ch, 3, padding=1, bias=False)
        self.bn2   = nn.BatchNorm2d(out_ch)
        self.relu  = nn.ReLU(inplace=True)

    def forward(self, x):
        identity = x
        out = self.relu(self.bn1(self.conv1(x)))
        out = self.bn2(self.conv2(out))
        out += identity
        return self.relu(out)

# Eğitimde model.train() — batch istatistikleri kullanılır
# Inference'da model.eval() — biriktirilmiş yürüyen ortalama kullanılır
Transformer'da LayerNormPython
import torch.nn as nn

# Transformer block'unun standart şeması (pre-LN)
class TransformerBlock(nn.Module):
    def __init__(self, dim, heads, ff_dim):
        super().__init__()
        self.norm1 = nn.LayerNorm(dim)
        self.attn = nn.MultiheadAttention(dim, heads, batch_first=True)
        self.norm2 = nn.LayerNorm(dim)
        self.ff = nn.Sequential(
            nn.Linear(dim, ff_dim), nn.GELU(), nn.Linear(ff_dim, dim),
        )

    def forward(self, x):
        x = x + self.attn(self.norm1(x), self.norm1(x), self.norm1(x))[0]
        x = x + self.ff(self.norm2(x))
        return x
Ne zaman kullan
  • Derin CNN eğitimleri — BatchNorm vazgeçilmez
  • Eğitim dengesiz, kayıp salınıyor ve yüksek lr istiyorsan
  • Internal covariate shift teşhisi olduğunda
  • Transformer ya da sıralı modeller için: LayerNorm/RMSNorm
Ne zaman kullanma
  • Çok küçük batch boyutu (<8) — istatistikler güvenilmez
  • Sıralı modeller (RNN/Transformer) — LayerNorm tercih et
  • Inference'da batch yokken — model.eval() ile biriktirilmiş istatistikleri kullan
Sık yapılan hatalar

model.eval() unutmak

BatchNorm eğitimde batch istatistiklerini, inference'da yürüyen ortalamaları kullanır. eval() çağırmazsan inference sırasında 'tek örneğin istatistiği' kullanılır — sonuç bozulur.

Çok küçük batch boyutu

Batch <8 olduğunda batch istatistikleri kararsız olur, eğitim dengesi bozulur. Group normalization veya layer normalization daha iyidir.

Bias parametresini ihmal etmemek

BatchNorm'dan önce gelen Conv ya da Linear katmanına bias eklemeye gerek yok — BatchNorm'un β parametresi bias görevi görür. bias=False standart pratiktir.