Layer norm ileri geçişi
Zorluk: Orta Çözüldü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:
- Her satırın ortalamasını ve varyansını, o satırın feature’ı üzerinden hesapla.
- Satırdan ortalamayı çıkar.
- Sonucu ‘a böl.
- ile çarp, ‘yı ekle.
Formül, . örnek için şudur:
Yani her satır kendi ortalamasına ve yayılımına göre ayarlanır; diğer örneklerin çıktıya etkisi yoktur. (eps), varyans 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
Xshape’i(n, d)olan bir array’dir,gammavebetashape’i(d,)olan array’lerdir.- Dönüş değeri
Xile aynı(n, d)shape’inde bir NumPy array’i. - İstatistikleri her örnek için feature’lar üzerinden hesapla: ortalama ve varyans
axis=1boyuncadır. - Varyansı ‘ye böl (‘e değil); NumPy’ın
var’ı bunu varsayılan olarak yapar. epskarekökün içindedir: , değil.- Tüm feature’ları aynı olan bir örnekte sonuç NaN olmaz; çıktı ‘ya eşit olur.
X’i,gamma’yı vebeta’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 olsa da aynı çalışır ve eğitimle çıkarım arasında fark kalmaz.
Bir örnekle gör. Satır olsun. Ortalama , varyans olur ve normalleşmiş değerler ‘dir. ve ise çıktı 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. ve sonradan bunu geri verir.
Batch norm feature başına, layer norm örnek başına normalleştirir:
| Yöntem | İstatistikler | Eksen |
|---|---|---|
| Batch norm | Her feature için batch üzerinden | axis=0 |
| Layer norm | Her örnek için feature’lar üzerinden | axis=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 ve ‘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?