Sıradaki

Batch norm ileri geçişi

Zorluk: Orta

normalizasyon

Batch normalization (yığın normalizasyonu), bir layer’ın (katman) çıktılarını her feature için batch üzerinden ortalaması 0, varyansı 1 olacak biçimde yeniden ölçekler. Ardından öğrenilebilir iki parametre, γ\gamma ve β\beta, ölçeği ve kaymayı geri verir.

batchnorm_forward(X, gamma, beta, eps=1e-5) fonksiyonunu yaz. X, şekli (shape) (n, d) olan bir batch’tir: her satır bir örnek (sample), her sütun bir öznitelik (feature). gamma ve beta shape’i (d,) olan vektörlerdir.

Hesap eğitim modundadır ve dört adımdan oluşur:

  1. Her feature’ın ortalamasını ve varyansını batch üzerinden hesapla.
  2. XX‘ten ortalamayı çıkar.
  3. Sonucu σ2+ϵ\sqrt{\sigma^2 + \epsilon}‘a böl.
  4. γ\gamma ile çarp, β\beta‘yı ekle.

Formül, jj. feature için şudur:

μj=1n∑i=1nXij,σj2=1n∑i=1n(Xij−μj)2,Yij=γj Xij−μjσj2+ϵ+βj\mu_j = \frac{1}{n}\sum_{i=1}^{n} X_{ij}, \qquad \sigma_j^2 = \frac{1}{n}\sum_{i=1}^{n} (X_{ij} - \mu_j)^2, \qquad Y_{ij} = \gamma_j \,\frac{X_{ij} - \mu_j}{\sqrt{\sigma_j^2 + \epsilon}} + \beta_j

Yani her sütun kendi ortalamasına ve yayılımına göre ayarlanır. ϵ\epsilon (eps), varyans 00 olduğunda sıfıra bölmeyi önleyen küçük bir sabittir. Shape’i (n, d) olan tek bir array döndür.

Örnekler

Girdi: X = [[1.0, 2.0, 0.0], [3.0, 6.0, 1.0], [5.0, 4.0, 5.0], [7.0, 0.0, 2.0]], gamma = [1.0, 1.0, 1.0], beta = [0.0, 0.0, 0.0], eps = 1e-05
Çıktı: array([[-1.34163944, -0.44721315, -1.06904344], [-0.44721315, 1.34163944, -0.53452172], [ 0.44721315, 0.44721315, 1.60356516], [ 1.34163944, -1.34163944, 0. ]])

Girdi: X = [[1.0, 2.0], [3.0, 6.0]], gamma = [2.0, 3.0], beta = [0.5, -1.0], eps = 0.0
Çıktı: array([[-1.5, -4. ], [ 2.5, 2. ]])

Girdi: X = [[-2.0, 10.0], [0.5, -4.0], [3.0, 7.0]], gamma = [0.5, -1.5], beta = [1.0, 2.0], eps = 0.001
Çıktı: array([[0.38770104, 0.58770512], [1. , 4.07690424], [1.61229896, 1.33539064]])

İpucu 1

X.mean(axis=0), her sütunun ortalamasını verir: batch boyunca iner ve shape’i (d,) olan bir vektör üretir. Varyans için de aynı ekseni kullan.

İpucu 2

X - mean ifadesinde (n, d) ile (d,) shape’leri uyuşur: her satırdan aynı ortalama vektörü çıkarılır. gamma ve beta da aynı şekilde her satıra uygulanır.

İpucu 3

Önce var + eps değerini hesapla, sonra karekökünü al. Normalleşmiş değer (X - mean) / np.sqrt(var + eps) olur. Sonunda gamma * ... + beta ile ölçekle ve kaydır.

Gereksinimler

  • X shape’i (n, d) olan bir array’dir, gamma ve beta shape’i (d,) olan array’lerdir.
  • Dönüş değeri X ile aynı (n, d) shape’inde bir NumPy array’i.
  • İstatistikleri her feature için batch üzerinden hesapla: ortalama ve varyans axis=0 boyuncadır.
  • Varyansı nn‘ye böl (n−1n - 1‘e değil); NumPy’ın var’ı bunu varsayılan olarak yapar.
  • eps karekökün içindedir: σ2+ϵ\sqrt{\sigma^2 + \epsilon}, σ2+ϵ\sqrt{\sigma^2} + \epsilon değil.
  • Varyansı 00 olan bir feature’da sonuç NaN olmaz; çıktı βj\beta_j‘ye eşit olur.
  • X’i, gamma’yı ve beta’yı değiştirme. Fonksiyon bittiğinde çağıran kodun array’leri aynı kalır.
  • Örnekler ve feature’lar üzerinde döngü kullanma.

Batch norm, layer’ın çıktılarını her feature için aynı ölçeğe getirir. Bir feature’ın değerleri 00 ile 10001000 arasında, bir diğerininki 00 ile 0,010{,}01 arasında olabilir. Normalleşmeden sonra ikisi de ortalaması 00, yayılımı 11 olan değerlere dönüşür.

Bunu bir örnekle gör. İlk feature’ın batch’teki değerleri 11 ve 33 olsun. Ortalama 22, varyans 11 olur ve normalleşmiş değerler −1-1 ile 11‘dir. γ=2\gamma = 2 ve β=0,5\beta = 0{,}5 ise çıktı −1,5-1{,}5 ile 2,52{,}5 olur.

γ\gamma ve β\beta normalizasyonun geri alınmasına izin verir. Ağ ortalama 00, varyans 11 yerine başka bir ölçek isterse bunu öğrenir. Böylece normalizasyon, ağın ifade gücünü kısıtlamaz.

Bu problem yalnızca eğitim modunu ister: ortalama ve varyans, o batch’in kendisinden gelir. Çıkarımda (inference) tek bir örnek de gelebilir; bu yüzden gerçek uygulamalar eğitimde biriktirilmiş (running) ortalama ve varyansı kullanır. Bunu burada yazmıyorsun.

Daha fazlası için Normalizasyon ve düzenlileştirme dersine bak.

Ortalamayı ve varyansı axis=0 boyunca al, normalleştir, sonra γ\gamma ve β\beta‘yı uygula:

import numpy as npdef batchnorm_forward(X: np.ndarray, gamma: np.ndarray, beta: np.ndarray, eps: float = 1e-5) -> np.ndarray:    mean = X.mean(axis=0)    var = X.var(axis=0)    X_hat = (X - mean) / np.sqrt(var + eps)    return gamma * X_hat + beta

Sık yapılan hata, yanlış ekseni kullanmaktır (axis=1, keepdims=True ile). O zaman istatistikler her örnek için hesaplanır; bu layer normalization olur ve batch norm değildir. Bir feature’ın sütunu normalleşmez.

Bir diğer hata eps’i karekökün dışına koymaktır (np.sqrt(var) + eps): varyans küçükken sonuç farklı çıkar.

Bu problemde bir sorun mu var?

solution.py
import numpy as npdef batchnorm_forward(X: np.ndarray, gamma: np.ndarray, beta: np.ndarray, eps: float = 1e-5) -> np.ndarray:    """Batch'i feature başına normalleştirir, sonra gamma ile ölçekleyip beta ile kaydırır."""    # Kodunu buraya yaz.    return np.zeros_like(X)

İçindekiler

Geri bildirim

Tür