CodeBlanks Logo Icon CodeBlanks

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.

Başlangıç kodu

model.py
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))

# buraya yaz

Örnek çözüm

model.py
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)

Beklenen çıktı

0.2147 0.0015 0.001
(500, 2)

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Darboğaz boyutu artırılırsa yeniden kurma hatası genellikle ne olur?

  • Azalır Doğru cevap
  • Artar
  • Değişmez
  • Tanımsız olur

Açıklama: Daha geniş kod daha çok bilgi taşır.

2 Yeniden kurma hatasını hesapla.

Soru
kayip = ((dec(enc(x)) - x) ** ____).mean()
Cevap
kayip = ((dec(enc(x)) - x) ** 2).mean()

Açıklama: Ortalama kare hata.

3 Eşleştir.

Kavram Anlamı
encoder x → z
decoder z → x̂
darboğaz Küçük kod boyutu
β KL ağırlığı

Uzman bölümündeki tüm dersler