L2 cezası
Zorluk: Kolay Çözüldüdüzenlileştirme
L2 cezası (L2 penalty), weight’lerin (ağırlık) karelerinin toplamıyla orantılı bir terimdir; loss’a (kayıp) eklenir ve büyük weight’leri cezalandırır. Bu, bir düzenlileştirme (regularization) yöntemidir; gradyana yansıması weight decay (ağırlık azaltma) olarak bilinir.
l2_penalty(W, lam) fonksiyonunu yaz. W herhangi bir şekilde (shape) bir weight dizisidir (array), lam ceza katsayısı ‘dır. Fonksiyon iki şey hesaplar: cezanın kendisini ve cezanın W’ye göre gradyanını.
Yani ceza, tüm weight’lerin karelerinin toplamının katıdır; gradyanı ise her weight’in kendisinin katıdır. (ceza, dW) çiftini tuple olarak döndür: ceza tek bir Python float, dW ise W ile aynı shape’te bir array.
Örnekler
Girdi: W = [[1.0, -2.0], [3.0, 0.5]], lam = 0.1
Çıktı: (0.7125, array([[ 0.1 , -0.2 ],
[ 0.3 , 0.05]]))
Girdi: W = [3.0, -4.0], lam = 1.0
Çıktı: (12.5, array([ 3., -4.]))
Girdi: W = [[0.0, 0.0, 0.0], [0.0, 0.0, 0.0]], lam = 0.5
Çıktı: (0.0, array([[0., 0., 0.],
[0., 0., 0.]]))
İpucu 1
np.sum(W ** 2), W’nin tüm elemanlarının karelerini toplayıp tek bir sayı verir. Kare almak işareti kaldırır: negatif weight’ler da cezayı artırır.
İpucu 2
Cezanın önündeki çarpan ‘dir. lam * np.sum(W ** 2) bunun iki katını verir.
İpucu 3
Kareler toplamının her weight’e göre türevi ‘dir; ile çarpınca kalır. Gradyan, W’nin lam katıdır.
Gereksinimler
Wherhangi bir shape’te olabilir (vektör ya da matris);lambir sayıdır.- Dönüş değeri
(ceza, dW)tuple’ı. Ceza tek birfloatolmalı, array değil;np.sum’ın verdiğinp.float64de kabul edilir. - Cezada çarpanı vardır, yalnızca değil. Böylece gradyan temiz çıkar: .
dW,Wile aynı shape’te yeni bir array’dir;W’nin kendisi olmamalı.W’yi değiştirme. Fonksiyon bittiğinde çağıran kodun array’i aynı kalır.- Weight’ler üzerinde döngü kullanma: NumPy ifadeleri yeter.
L2 penalty, büyük weight’leri pahalı yapar. Eğitimde toplam loss olur. Veriye uymak için weight’leri büyütmek artık ceza getirir, bu yüzden model daha küçük weight’lerle yetinir ve overfitting azalır.
Bir örnekle hesapla. ve olsun. Kareler toplamı olur. Ceza , gradyan ‘dir.
Gradyanın olması, her güncellemenin weight’i sıfıra doğru çektiği anlamına gelir. Öğrenme oranı (learning rate) ile adım olur: weight her adımda biraz küçülür. Bu yüzden yöntemin adı weight decay’dir.
Cezanın yalnızca weight’lere uygulandığını bil: sapmalara (bias) genelde uygulanmaz.
Daha fazlası için Normalizasyon ve düzenlileştirme dersine bak.
Cezayı ile kareler toplamının çarpımı olarak hesapla; gradyan ‘dir:
import numpy as npdef l2_penalty(W: np.ndarray, lam: float) -> tuple[float, np.ndarray]: penalty = 0.5 * lam * np.sum(W ** 2) dW = lam * W return float(penalty), dW
Sık yapılan hata, yerine kullanıp gradyanı da buna uydurmamaktır. Ceza ise gradyan olur; ikisinin tutarlı olması gerekir. Bu problemde ceza ve gradyan ‘dir.
Bir diğer hata kareler toplamı yerine toplamın karesini almaktır (np.sum(W) ** 2): ile birbirini götürür.
Bu problemde bir sorun mu var?