Makine Öğrenmesi
Encoder-Decoder
VAE, encoder ile dağılım parametrelerini ve decoder ile veri üretir.
Encoder-Decoder: otokodlayıcı
VAE'nin temeli otokodlayıcıdır: encoder x'i küçük bir kod z'ye sıkıştırır, decoder z'den x'i geri kurar; kayıp yeniden kurma hatasıdır. Darboğaz (z boyutu) modeli verinin en önemli yapısını öğrenmeye zorlar:
enc = nn.Sequential(nn.Linear(784, 128), nn.ReLU(), nn.Linear(128, 2))
dec = nn.Sequential(nn.Linear(2, 128), nn.ReLU(), nn.Linear(128, 784))
kayip = ((dec(enc(x)) - x) ** 2).mean()
Doğrusal katmanlı ve MSE kayıplı bir otokodlayıcının en iyi çözümü PCA ile aynı alt uzayı bulur; doğrusal olmayan katmanlar daha karmaşık yapıları yakalar.
VAE kaybı
VAE kaybı iki terimin toplamıdır: yeniden kurma hatası ve KL. Aralarındaki denge önemlidir; β-VAE, KL'yi bir β katsayısıyla ağırlıklandırır:
kayip = yeniden_kurma + beta * kl
# beta büyük: düzgün, ayrışık gizil uzay ama bulanık çıktı
# beta küçük: keskin çıktı ama düzensiz gizil uzay
Bu derste doğrusal otokodlayıcının en iyi çözümünü SVD ile bulup darboğazın etkisini ölçeceksin.
Uygulama Doğrusal otokodlayıcı
Verilen X (5 boyutlu, gerçekte 2 boyutlu yapı + küçük gürültü) için merkezle ve SVD al. yeniden_kur(k) fonksiyonu ilk k bileşenle kodlayıp geri kursun (Z = Xc @ V[:k].T, Xc_hat = Z @ V[:k]). k = 1, 2, 3 için ortalama kare hatayı round(..., 4) ile aynı satırda yazdır. Ardından k = 2 kodunun şeklini yazdır.
Örnek çözümü göster
import numpy as np
rng = np.random.default_rng(0)
gizli = rng.normal(size=(500, 2))
X = gizli @ rng.normal(size=(2, 5)) + 0.05 * rng.normal(size=(500, 5))
Xc = X - X.mean(axis=0)
_, _, V = np.linalg.svd(Xc, full_matrices=False)
def yeniden_kur(k):
Z = Xc @ V[:k].T
return Z, Z @ V[:k]
print(*[round(((yeniden_kur(k)[1] - Xc) ** 2).mean(), 4) for k in [1, 2, 3]])
print(yeniden_kur(2)[0].shape)
Kendini test et
-
Darboğaz boyutu artırılırsa yeniden kurma hatası genellikle ne olur?
- Azalır
- Artar
- Değişmez
- Tanımsız olur
Cevabı göster
Azalır — Daha geniş kod daha çok bilgi taşır.
-
Yeniden kurma hatasını hesapla.
kayip = ((dec(enc(x)) - x) ** ____).mean()
Cevabı göster
kayip = ((dec(enc(x)) - x) ** 2).mean()
-
Eşleştir.
- encoder
- x → z
- decoder
- z → x̂
- darboğaz
- Küçük kod boyutu
- β
- KL ağırlığı
Sıradaki ders: Özet - GAN ve VAE