Sıradaki

Layer norm ileri geçişi

Zorluk: Orta

normalizasyon

Layer normalization (katman normalizasyonu), her örneği kendi feature’ları üzerinden ortalaması 0, varyansı 1 olacak biçimde yeniden ölçekler. Batch norm’un tersine istatistikler batch’e değil, tek bir örneğe aittir. Transformer’lar bu yöntemi kullanır.

layernorm_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 dört adımdan oluşur:

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

Formül, ii. örnek için şudur:

μi=1d∑j=1dXij,σi2=1d∑j=1d(Xij−μi)2,Yij=γj Xij−μiσi2+ϵ+βj\mu_i = \frac{1}{d}\sum_{j=1}^{d} X_{ij}, \qquad \sigma_i^2 = \frac{1}{d}\sum_{j=1}^{d} (X_{ij} - \mu_i)^2, \qquad Y_{ij} = \gamma_j \,\frac{X_{ij} - \mu_i}{\sqrt{\sigma_i^2 + \epsilon}} + \beta_j

Yani her satır kendi ortalamasına ve yayılımına göre ayarlanır; diğer örneklerin çıktıya etkisi yoktur. ϵ\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, 3.0, 6.0], [0.0, 4.0, 4.0, 0.0], [5.0, 1.0, 2.0, 8.0]], gamma = [1.0, 1.0, 1.0, 1.0], beta = [0.0, 0.0, 0.0, 0.0], eps = 1e-05
Çıktı: array([[-1.06904344, -0.53452172, 0. , 1.60356516], [-0.99999875, 0.99999875, 0.99999875, -0.99999875], [ 0.36514813, -1.09544438, -0.73029626, 1.46059251]])

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

Girdi: X = [[-2.0, 10.0, 7.0], [0.5, -4.0, 1.0]], gamma = [0.5, -1.5, 2.0], beta = [1.0, 2.0, -1.0], eps = 0.001
Çıktı: array([[ 0.31360673, 0.52915727, -0.21555054], [ 1.29647041, 4.11235165, 0.63058724]])

İpucu 1

X.mean(axis=1, keepdims=True), her satırın ortalamasını verir ve shape’i (n, 1) olan bir sütun üretir. Varyans için de aynı ekseni kullan.

İpucu 2

keepdims=True olmadan ortalamanın shape’i (n,) olur ve X - mean uyuşmaz ya da yanlış eksene yayınlanır (broadcasting). (n, 1) shape’i, her satırdan kendi ortalamasını çıkarı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 örnek için feature’lar üzerinden hesapla: ortalama ve varyans axis=1 boyuncadır.
  • Varyansı dd‘ye böl (d−1d - 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.
  • Tüm feature’ları aynı olan bir örnekte sonuç NaN olmaz; çıktı β\boldsymbol{\beta}‘ya 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.

Layer norm, her örneği bağımsız olarak normalleştirir. Bir örneğin çıktısı batch’teki diğer örneklere bağlı değildir. Bu yüzden batch boyutu 11 olsa da aynı çalışır ve eğitimle çıkarım arasında fark kalmaz.

Bir örnekle gör. Satır [1,3][1, 3] olsun. Ortalama 22, varyans 11 olur ve normalleşmiş değerler [−1,1][-1, 1]‘dir. γ=[2,3]\gamma = [2, 3] ve β=[0,5,−1]\beta = [0{,}5, -1] ise çıktı [−1,5,2][-1{,}5, 2] olur.

Bir satırı pozitif bir sayıyla çarpmak ya da ona bir sayı eklemek layer norm çıktısını değiştirmez. Ölçek ve kayma, ortalama ve varyans tarafından zaten ortadan kalkar. γ\gamma ve β\beta sonradan bunu geri verir.

Batch norm feature başına, layer norm örnek başına normalleştirir:

YöntemİstatistiklerEksen
Batch normHer feature için batch üzerindenaxis=0
Layer normHer örnek için feature’lar üzerindenaxis=1

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

Ortalamayı ve varyansı axis=1 boyunca, keepdims=True ile al; normalleştir, sonra γ\gamma ve β\beta‘yı uygula:

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

Sık yapılan hata, yanlış ekseni kullanmaktır (axis=0). O zaman istatistikler her feature için batch üzerinden hesaplanır; bu batch norm olur ve layer norm değildir.

Bir diğer hata keepdims=True’yu unutmaktır: (n,) shape’indeki ortalama, (n, d) shape’indeki X’ten satır satır çıkarılmaz.

Bu problemde bir sorun mu var?

solution.py
import numpy as npdef layernorm_forward(X: np.ndarray, gamma: np.ndarray, beta: np.ndarray, eps: float = 1e-5) -> np.ndarray:    """Her örneği kendi feature'ları üzerinden 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