31.1 VAE és variációs alsó korlát

31.1.1 1. Cél, előismeret és induló kérdés

Az autoencoder 29.4. Anomáliapontszám rekonstrukcióból determinisztikus x↦z↦x̂x\mapsto z\mapsto \hat x leképezése akkor hasznos, ha csak rekonstrukció kell, de nem ad generatív leírást: nincs definiált valószínűségi modellje az adatra, és nincs értelmezett előzetes eloszlása a látens téren, amelyből új mintát húzhatnánk. A variational autoencoder (VAE) ezt egészíti ki egy látens változós valószínűségi modellel. Előismeret: a 11.4. Egy teljes PyTorch tanítási iteráció tanítási lépés, a 7.4. Numerikus stabilitás és jelentésmegőrző implementáció stabil log-likelihood-számítás, a 29.4. Anomáliapontszám rekonstrukcióból rekonstrukciós pontszám korlátai, és az 5.4. Függő képek, seedek és resampling statisztikai mintavételi egység gondolata. Visszautalás: a 30.1. Pretext és downstream feladat alfejezetben a reprezentációt downstream feladathoz kötöttük; a 27.1. Pixelszintű klasszifikáció és FCN pixelcélok átlagolását itt a rekonstrukciós likelihood tag átlagolásához idézzük vissza.

Induló kérdés: ha a megfigyelt xx mögött látens zz áll, akkor a posterior p(z∣x)p(z\mid x) a Bayes-szabályból adódna, de a nevező p(x)=∫p(x,z)dzp(x)=\int p(x,z)\,dz. Mi a helyes tréningcél, ha ez az integrál gyakorlatban nem számolható? Becslés: nem a posterior közvetlen tanítása, hanem egy eltolható alsó korlát maximalizálása.

31.1.2 2. Definíciók, jelölések és tenzoralakok

Legyen a megfigyelt adatvektor x∈ℝDx\in\mathbb R^D, a látens vektor z∈ℝKz\in\mathbb R^K, tipikusan K≪DK\ll D. Rögzítünk egy priort (előzetes eloszlást) p(z)p(z); a leggyakoribb választás p(z)=𝒩(z;0,IK)p(z)=\mathcal N(z;0,I_K).

A decoder likelihood egy paraméterezett feltételes sűrűség pθ(x∣z),p_\theta(x\mid z), amely kimondja, hogyan keletkezik az adat a látens változóból. NCHW képbatch esetén X∈ℝN×C×H×WX\in\mathbb R^{N\times C\times H\times W}, de a jelen levezetésben az xx egyetlen megfigyelt vektor; batchelt alaknál az NN dimenziót külön redukció hordozza.

A közös modell pθ(x,z)=pθ(x∣z)p(z),p_\theta(x,z)=p_\theta(x\mid z)\,p(z), a marginális likelihood pedig pθ(x)=∫ℝKpθ(x,z)dz.p_\theta(x)=\int_{\mathbb R^K} p_\theta(x,z)\,dz. A valódi posterior pθ(z∣x)=pθ(x,z)pθ(x),p_\theta(z\mid x)=\frac{p_\theta(x,z)}{p_\theta(x)}, amely általában nem zárt alakú, mert a nevező nagydimenziós integrál.

Emiatt bevezetünk egy encoder distribution-t, qϕ(z∣x),q_\phi(z\mid x), amely a posterior közelítése. Tensorparaméterezés: az encoder egy N×DN\times D bemenetből μ∈ℝN×K\mu\in\mathbb R^{N\times K} és logσ2∈ℝN×K\log\sigma^2\in\mathbb R^{N\times K} tenzort ad; ezzel qϕ(z∣x)=𝒩(z;μϕ(x),diag(σϕ2(x))).q_\phi(z\mid x)=\mathcal N\!\left(z;\mu_\phi(x),\operatorname{diag}\!\left(\sigma_\phi^2(x)\right)\right). A logσ2\log\sigma^2 paraméterezés numerikusan előnyös: a szórásnégyzet pozitivitása kerül a logaritmus mögé, hasonlóan ahhoz, ahogy a 7.4. Numerikus stabilitás és jelentésmegőrző implementáció alfejezetben a logitok stabilitását kezeltük.

A KL-divergencia két folytonos sűrűség között DKL(q∥p)=∫q(z)logq(z)p(z)dz,D_{KL}(q\|p)=\int q(z)\log\frac{q(z)}{p(z)}\,dz, ahol a log\log természetes alapú. A divergencia csak akkor véges, ha q(z)=0q(z)=0 ott, ahol p(z)=0p(z)=0; ezt nevezzük a jelen fejezetben támogatási feltételnek. DKL(q∥p)≥0D_{KL}(q\|p)\ge 0, egyenlőség akkor és csak akkor, ha a két sűrűség egybeesik (a nullmértékű eltéréstől eltekintve).

A variációs alsó korlát, más néven ELBO (evidence lower bound): ℒ(x;θ,ϕ)=𝔼qϕ(z∣x)[logpθ(x,z)−logqϕ(z∣x)].\mathcal L(x;\theta,\phi)=\mathbb E_{q_\phi(z\mid x)}\Big[\log p_\theta(x,z)-\log q_\phi(z\mid x)\Big].

31.1.3 3. Az ELBO levezetése Jensen-egyenlőtlenségből

A levezetéshez a Jensen-egyenlőtlenséget megadott alakban vesszük:

Jensen (adott alak). Ha Y≥0Y\ge 0 véges várható értékű véletlen változó, és log\log konkáv, akkor log𝔼[Y]≥𝔼[logY]\log\mathbb E[Y]\ge\mathbb E[\log Y], ahol a −∞-\infty is megengedett. A szigorú konkavitás miatt egyenlőség akkor van, ha YY konstans a valószínűség szerint egy szettől eltekintve. A mértékelméleti finomságot itt nem tárgyaljuk; a tankönyv véges sűrűségekre szorítkozik.

Tétel (ELBO alsó korlát). Tegyük fel, hogy rögzített xx-re qϕ(z∣x)>0q_\phi(z\mid x)>0 mindenütt, ahol pθ(x,z)>0p_\theta(x,z)>0, és 𝔼qϕ(z∣x)|logpθ(x,z)qϕ(z∣x)|<∞\mathbb E_{q_\phi(z\mid x)}\left|\log\frac{p_\theta(x,z)}{q_\phi(z\mid x)}\right|<\infty. Ekkor logpθ(x)≥ℒ(x;θ,ϕ).\log p_\theta(x)\ge \mathcal L(x;\theta,\phi). Egyenlőség akkor és csak akkor áll fenn, ha qϕ(z∣x)=pθ(z∣x)q_\phi(z\mid x)=p_\theta(z\mid x) a qϕq_\phi szerint majdnem mindenütt.

Bizonyítás. A támogatási feltétel miatt a marginális felírható a következőképpen: pθ(x)=∫ℝKpθ(x,z)dz=∫ℝKqϕ(z∣x)pθ(x,z)qϕ(z∣x)dz=𝔼qϕ(z∣x)[R(z)],p_\theta(x)=\int_{\mathbb R^K} p_\theta(x,z)\,dz =\int_{\mathbb R^K} q_\phi(z\mid x)\,\frac{p_\theta(x,z)}{q_\phi(z\mid x)}\,dz =\mathbb E_{q_\phi(z\mid x)}[R(z)], ahol R(z)=pθ(x,z)/qϕ(z∣x)R(z)=p_\theta(x,z)/q_\phi(z\mid x). A véges-ELBO feltétel miatt RR integrálható, és R>0R>0 a qϕq_\phi szerint. Alkalmazzuk a Jensen-egyenlőtlenséget a konkáv log\log-ra: logpθ(x)=log𝔼qϕ(z∣x)[R(z)]≥𝔼qϕ(z∣x)[logR(z)]=ℒ(x;θ,ϕ).\log p_\theta(x)=\log\mathbb E_{q_\phi(z\mid x)}[R(z)] \ge \mathbb E_{q_\phi(z\mid x)}[\log R(z)]=\mathcal L(x;\theta,\phi). Az egyenlőség feltételéből R(z)R(z) konstans qϕq_\phi-szerint; mivel az átlaga pθ(x)p_\theta(x), ezért pθ(x,z)qϕ(z∣x)=pθ(x),\frac{p_\theta(x,z)}{q_\phi(z\mid x)}=p_\theta(x), átrendezve qϕ(z∣x)=pθ(x,z)/pθ(x)=pθ(z∣x)q_\phi(z\mid x)=p_\theta(x,z)/p_\theta(x)=p_\theta(z\mid x). ▫\square

A gyakorlatban használt felbontás:

Lemma. A fenti feltételek mellett ℒ(x;θ,ϕ)=𝔼qϕ(z∣x)[logpθ(x∣z)]−DKL(qϕ(z∣x)∥p(z)).\mathcal L(x;\theta,\phi)=\mathbb E_{q_\phi(z\mid x)}[\log p_\theta(x\mid z)]-D_{KL}\!\left(q_\phi(z\mid x)\,\|\,p(z)\right).

Bizonyítás. ℒ=𝔼q[logpθ(x∣z)+logp(z)−logqϕ(z∣x)]=𝔼q[logpθ(x∣z)]−𝔼q[logqϕ(z∣x)p(z)],\mathcal L=\mathbb E_q\Big[\log p_\theta(x\mid z)+\log p(z)-\log q_\phi(z\mid x)\Big] =\mathbb E_q[\log p_\theta(x\mid z)]-\mathbb E_q\left[\log\frac{q_\phi(z\mid x)}{p(z)}\right], és a második tag éppen a KL-divergencia. ▫\square

Az első tag a rekonstrukciós tag: a látensből adott xx log-likelihoodja. Ha a dekóder Gauss-likelihood rögzített σd2\sigma_d^2 varianciával: logpθ(x∣z)=−D2log(2πσd2)−12σd2∥x−μθ(z)∥22,\log p_\theta(x\mid z)=-\frac D2\log(2\pi\sigma_d^2)-\frac{1}{2\sigma_d^2}\|x-\mu_\theta(z)\|_2^2, tehát a rekonstrukciós tag az MSE negatív, konstans- és skálafaktorral összekötve. Ez a 29.4. Anomáliapontszám rekonstrukcióból alfejezetben használt rekonstrukciós pontszám valószínűségi jelentése.

Két további, gyakran kevert állapot:

31.1.4 4. Eredeti kézi számpélda

Legyen D=2D=2, K=1K=1, p(z)=𝒩(0,1)p(z)=\mathcal N(0,1), qϕ(z∣x)=𝒩(0.2,0.25)q_\phi(z\mid x)=\mathcal N(0.2,0.25), a dekóder lineáris Gauss: μθ(z)=Wz\mu_\theta(z)=Wz, W=(1,−0.5)W=(1,-0.5), σd2=0.16\sigma_d^2=0.16, és az adat x=(0.4,−0.2)x=(0.4,-0.2). A Gauss–Gauss KL zárt alakját (lásd az F2 feladatot) használva:

DKL(q∥p)=12(σ2+μ2−1−logσ2)=12(0.25+0.04−1+1.386294)=0.338147.D_{KL}(q\|p)=\frac12\left(\sigma^2+\mu^2-1-\log\sigma^2\right) =\frac12(0.25+0.04-1+1.386294)=0.338147.

A rekonstrukciós tag várható értékéhez a lineáris dekóder miatt: 𝔼q∥x−Wz∥2=∥x−Wμ∥2+σ2∥W∥2.\mathbb E_q\|x-Wz\|^2=\|x-W\mu\|^2+\sigma^2\|W\|^2. Itt ∥x−Wμ∥2=∥(0.2,−0.1)∥2=0.05\|x-W\mu\|^2=\|(0.2,-0.1)\|^2=0.05, ∥W∥2=1.25\|W\|^2=1.25, ezért 0.05+0.25⋅1.25=0.36250.05+0.25\cdot 1.25=0.3625. A konstanssal: 𝔼qlogp(x∣z)=−log(2π⋅0.16)−0.36252⋅0.16=−0.005296−1.132813=−1.138108.\mathbb E_q\log p(x\mid z)=-\log(2\pi\cdot 0.16)-\frac{0.3625}{2\cdot 0.16} =-0.005296-1.132813=-1.138108. Így az ELBO −1.138108−0.338147=−1.476255-1.138108-0.338147=-1.476255.

Ellenőrzésként a modell marginálisa zárt alakú, mert lineáris Gauss: pθ(x)=𝒩(0,σd2I2+WW⊤)p_\theta(x)=\mathcal N\left(0,\sigma_d^2 I_2+WW^\top\right), mivel a generatív prior p(z)=𝒩(0,1)p(z)=\mathcal N(0,1) varianciája 11, nem pedig a közelítő posterior qq-ban szereplő σ2=0,25\sigma^2=0{,}25. Numerikusan logpθ(x)≈−1.164303\log p_\theta(x)\approx -1.164303, tehát valóban ELBO≤logpθ(x)\mathrm{ELBO}\le\log p_\theta(x), a rés körülbelül 0,3119520{,}311952, ami DKL(qϕ(z∣x)‖pθ(z∣x))D_{KL}(q_\phi(z\mid x)\Vert p_\theta(z\mid x)).

Mennyiség Képlet/közelítő Érték
𝔼qlogp(x∣z)\mathbb E_q\log p(x\mid z) −log(2πσd2)−12σd2𝔼q∥x−Wz∥2-\log(2\pi\sigma_d^2)-\frac{1}{2\sigma_d^2}\mathbb E_q\|x-Wz\|^2 −1.138108-1.138108
DKL(q∥p)D_{KL}(q\|p) 12(σ2+μ2−1−logσ2)\frac12(\sigma^2+\mu^2-1-\log\sigma^2) 0.3381470.338147
ELBO rekonstrukciós tag mínusz KL −1.476255-1.476255
Egymintás MC a z=0.3z=0.3-nál logp(x∣z)+logp(z)−logq(z∣x)\log p(x\mid z)+\log p(z)-\log q(z\mid x) −0.762505-0.762505

Az egymintás Monte-Carlo érték nagymértékben eltér az ELBO-tól; ez a jelölt szemléltetés, nem annak a bizonyítéka, hogy az ELBO-t egy mintával becsülni kell.

31.1.5 5. Konkrét labor: toy Gauss-látens, rekonstrukció/KL skála

A következő kód a fenti kézi példát hajtja végre float64 CPU-n; a determinisztikus értékek a 4. szakasz számításaiból jönnek, az MC-sorok csak a kód tényleges futtatása után tekinthetők mértnek. Munkakönyvtár: lab/n121.

# munkakönyvtár: lab/n121
# parancs: python vae_elbo_toy.py
import math
import torch

torch.manual_seed(20261020)
torch.set_default_dtype(torch.float64)

x = torch.tensor([0.4, -0.2])              # (D,), D=2
mu = torch.tensor([0.2])                   # (K,), K=1
sigma2 = torch.tensor([0.25])              # q szórásnégyzete
W = torch.tensor([1.0, -0.5])              # (K,D) dekódolt lineáris súly
sigma_d2 = 0.16
D = x.shape[0]

def gauss_kl(mu, sigma2):
    # q=N(mu, diag(sigma2)), p=N(0,I)
    return 0.5 * (sigma2 + mu**2 - 1.0 - torch.log(sigma2)).sum()

def recon_expected(x, mu, sigma2, W, sigma_d2):
    # E_q ||x - W z||^2 = ||x - W mu||^2 + sigma2 * ||W||^2
    mean_residual = x - W * mu
    quad = mean_residual.pow(2).sum() + sigma2 * W.pow(2).sum()
    const = -0.5 * D * math.log(2.0 * math.pi * sigma_d2)
    return const - quad / (2.0 * sigma_d2)

def mc_elbo(x, mu, sigma2, W, sigma_d2, n_samples):
    sigma = sigma2.sqrt()
    with torch.no_grad():
        z = mu + sigma * torch.randn(n_samples, 1)   # (n_samples, K)
        log_pz = -0.5 * (math.log(2.0 * math.pi) + z.pow(2)).sum(dim=1)
        log_qz = -0.5 * (math.log(2.0 * math.pi * sigma2)
                         + (z - mu).pow(2) / sigma2).sum(dim=1)
        diff = x - W * z                              # (n_samples, D)
        log_px = -0.5 * D * math.log(2.0 * math.pi * sigma_d2) \
                 - diff.pow(2).sum(dim=1) / (2.0 * sigma_d2)
        return (log_px + log_pz - log_qz).mean()

kl = gauss_kl(mu, sigma2)
recon = recon_expected(x, mu, sigma2, W, sigma_d2)
elbo = recon - kl

C = sigma_d2 * torch.eye(2) + torch.outer(W, W)  # p(z)=N(0,1), nem q varianciája
logdet = torch.slogdet(C).logabsdet
maha = x @ torch.linalg.solve(C, x)
log_px = -0.5 * D * math.log(2.0 * math.pi) - 0.5 * logdet - 0.5 * maha

print(f"KL(q||prior)      = {kl.item():.6f}")
print(f"E_q log p(x|z)    = {recon.item():.6f}")
print(f"ELBO (zart)       = {elbo.item():.6f}")
print(f"log p(x)          = {log_px.item():.6f}")
print(f"ELBO <= log p(x)  : {(elbo <= log_px).item()}")
print("MC 100000 (jelolt) ~ -1.4763; csak futtatas utan rogzitendo")

Jelölt kimenet (a determinisztikus sorok a kézi számításból, nem mért futásból):

KL(q||prior)      = 0.338147
E_q log p(x|z)    = -1.138108
ELBO (zart)       = -1.476255
log p(x)          = -1.164303
ELBO <= log p(x)  : True
MC 100000 (jelolt) ~ -1.4763; csak futtatas utan rogzitendo

Értelmezés: a rekonstrukciós tag skálája csak a σd2\sigma_d^2 likelihood-varianciával együtt értelmezhető; a KL-tag bünteti a priorhoz képesti eltérést. A két tag összege alsó korlát, tehát ha az egyik tagot önkényes β\beta súllyal skálázzuk, az már nem ugyanazon marginális likelihood alsó korlátja (ez a β\beta-VAE heurisztika, amelyet nem tárgyalunk ELBO-állításként). A valós futtatás után az MC-érték 0.010.01 abszolút tűrésnél közelebb kell legyen a zárt ELBO-hoz.

31.1.6 6. Feladatok

  1. F1 (fogalmi, nehézség 1). Különböztesse meg a qϕ(z∣x)q_\phi(z\mid x) encoder eloszlást és a pθ(z∣x)p_\theta(z\mid x) valódi posteriort. Adjon olyan qq-t és pp-t, ahol DKL(q∥p)D_{KL}(q\|p) nem véges, és nevezze meg, mely támogatási feltétel sérül. Átadandó: rövid magyarázat és képletpélda.

  2. F2 (levezetési, nehézség 2). Vezesse le a q=𝒩(μ,σ2)q=\mathcal N(\mu,\sigma^2), p=𝒩(0,1)p=\mathcal N(0,1) KL-zárt alakot d=1d=1-re, majd számítsa ki μ=0.4\mu=0.4, σ2=1.5\sigma^2=1.5 értéket. Átadandó: teljes levezetés és numerikus érték.

  3. F3 (implementációs, nehézség 2). Készítsen batchelt függvényt, amely x∈ℝN×Dx\in\mathbb R^{N\times D} mátrixra, qq diagonális Gauss paraméterekkel és lineáris Gauss dekóderrel kiszámolja a zárt ELBO-t, majd MC-becsléssel ellenőrzi. Átadandó: teljes kód, shape-ellenőrzés, S=100000S=100000-es tolerancia.

  4. F4 (hibakeresési, nehézség 2). Az alábbi sor hibás: z = mu + logvar * eps, ahol logvar a logσ2\log\sigma^2 encoder kimenet. Azonosítsa a hibát, következményét, javítását és empirikus ellenőrzését. Átadandó: ok, következmény, javított kód, visszaellenőrzés.

  5. F5 (kísérleti/transzfer, nehézség 3). Tervezzen GlyphLab VAE-kísérletet, amely a corrupted_test rekonstrukciós romlását párosan méri a tiszta test adathoz képest, anélkül hogy a korrupt halmazt modellválasztásra használná. Átadandó: protokoll a split, baseline, metrika, statisztikai egység és következtetési határ megadásával.

31.1.7 7. Megoldások és indoklás

F1 megoldás. A qϕq_\phi egy encoder által paraméterezett, zártan előállítható közelítő sűrűség; a pθ(z∣x)p_\theta(z\mid x) a modell posteriorja, amely a Bayes-szabályból adódik, és általában nem számolható, mert pθ(x)p_\theta(x) integrált tartalmaz. Példa: p(z∣x)=Uniform[0,1]p(z\mid x)=\mathrm{Uniform}[0,1], q=𝒩(0,1)q=\mathcal N(0,1). Ekkor qq pozitív tömeget ad [0,1][0,1]-en kívül, ahol p=0p=0; a log(q/0)\log(q/0) tag divergál, így DKL(q∥p)=∞D_{KL}(q\|p)=\infty. A véges KL feltétele az, hogy q(z)=0q(z)=0 ott, ahol p(z)=0p(z)=0.

F2 megoldás. A Gauss-sűrűség logaritmusa: logq(z)=−12log(2πσ2)−(z−μ)22σ2,logp(z)=−12log(2π)−z22.\log q(z)=-\frac12\log(2\pi\sigma^2)-\frac{(z-\mu)^2}{2\sigma^2},\qquad \log p(z)=-\frac12\log(2\pi)-\frac{z^2}{2}. A qq szerinti várható értékben 𝔼[(z−μ)2]=σ2\mathbb E[(z-\mu)^2]=\sigma^2 és 𝔼[z2]=μ2+σ2\mathbb E[z^2]=\mu^2+\sigma^2, ezért 𝔼qlogq=−12log(2πσ2)−12,𝔼qlogp=−12log(2π)−12(μ2+σ2).\mathbb E_q\log q=-\frac12\log(2\pi\sigma^2)-\frac12,\qquad \mathbb E_q\log p=-\frac12\log(2\pi)-\frac12(\mu^2+\sigma^2). Kivonva: DKL(q∥p)=𝔼qlogq−𝔼qlogp=12(σ2+μ2−1−logσ2).D_{KL}(q\|p)=\mathbb E_q\log q-\mathbb E_q\log p =\frac12\left(\sigma^2+\mu^2-1-\log\sigma^2\right). A megadott értékekkel 12(1.5+0.16−1−log1.5)=0.127268\frac12(1.5+0.16-1-\log 1.5)=0.127268. Ellenőrzés: log1.5≈0.405465\log 1.5\approx 0.405465, a zárójeles tag 0.2545350.254535, felezve 0.1272680.127268.

F3 megoldás. A lineáris dekóder teljesíti z@Wz@W alakot; a zárt várható négyzetes hiba a diagonális variancia miatt összegként bomlik.

import math, torch

torch.set_default_dtype(torch.float64)

def closed_elbo_batch(x, mu, var, W, sigma_d2):
    # x: (N,D), mu: (N,K), var: (N,K), W: (K,D)
    N, D = x.shape
    K = mu.shape[1]
    recon_const = -0.5 * D * math.log(2.0 * math.pi * sigma_d2)
    mean_quad = (x - mu @ W).pow(2).sum(dim=1)          # (N,)
    w_norm2 = W.pow(2).sum(dim=1)                        # (K,)
    var_quad = (var * w_norm2.unsqueeze(0)).sum(dim=1)  # (N,)
    recon = recon_const - (mean_quad + var_quad) / (2.0 * sigma_d2)
    kl = 0.5 * (var + mu.pow(2) - 1.0 - var.log()).sum(dim=1)
    return recon - kl, recon, kl

def mc_elbo_batch(x, mu, var, W, sigma_d2, S):
    N, D = x.shape
    N_, K = mu.shape
    eps = torch.randn(N, S, K)
    z = mu.unsqueeze(1) + var.unsqueeze(1).sqrt() * eps
    log_pz = -0.5 * (math.log(2.0 * math.pi) + z.pow(2)).sum(-1)
    log_qz = -0.5 * (torch.log(2.0 * math.pi * var.unsqueeze(1))
                     + (z - mu.unsqueeze(1)).pow(2) / var.unsqueeze(1)).sum(-1)
    diff = x.unsqueeze(1) - z @ W              # (N,S,D)
    log_px = (-0.5 * D * math.log(2.0 * math.pi * sigma_d2)
              - diff.pow(2).sum(-1) / (2.0 * sigma_d2))
    return (log_px + log_pz - log_qz).mean(dim=1)

x = torch.tensor([[0.4, -0.2], [0.1, 0.3]])
mu = torch.tensor([[0.2], [0.0]])
var = torch.tensor([[0.25], [1.0]])
W = torch.tensor([[1.0, -0.5]])
closed = closed_elbo_batch(x, mu, var, W, 0.16)[0]
# ellenőrzés: closed = [-1.476255, -4.224046]
torch.manual_seed(7)
mc = mc_elbo_batch(x, mu, var, W, 0.16, 100000)
print(closed)
print(mc)
assert torch.allclose(closed, mc, atol=0.02), "MC eltérés túl nagy"

A második sor zárt értéke: μ=0\mu=0, σ2=1\sigma^2=1 miatt 𝔼q∥x−Wz∥2=∥x∥2+1⋅1.25=0.10+1.25=1.35\mathbb E_q\|x-Wz\|^2=\|x\|^2+1\cdot1.25=0.10+1.25=1.35, a rekonstrukciós tag −0.005296−1.35/0.32=−4.224046-0.005296-1.35/0.32=-4.224046, a KL 12(1+0−1−log1)=0\frac12(1+0-1-\log 1)=0.

F4 megoldás. A hiba oka: logvar a logσ2\log\sigma^2, ezért közvetlen szorzóként nem a szórást használja. A mintavételezett zz eloszlása nem az a qq, amelynek KL-jét kiszámoljuk, így a gradiensbecslés inkonzisztens. Következmény: a tényleges mintavételi variancia (logσ2)2(\log\sigma^2)^2 lenne σ2\sigma^2 helyett, ami a paramétertől függően túl nagy vagy túl kicsi is lehet (például logσ2=−2\log\sigma^2=-2 esetén 44 a helyes e−2≈0,135e^{-2}\approx0{,}135 helyett). Javítás:

z = mu + torch.exp(0.5 * logvar) * eps

Ellenőrzés: sok eps minta után Var(z)≈exp(logvar)\mathrm{Var}(z)\approx\exp(\operatorname{logvar}), például z.std(0).pow(2) és logvar.exp() összevetése 0.010.01 tűréssel.

F5 megoldásminta. Adat: GlyphLab images.npy, splitet metadata.csv scene_id szerint megtartva; train/val/test a kezdőlabor szerint. Modell: K=8K=8 látens dimenziós, konvolúciós encoder/decoder VAE; baseline: azonos architektúra determinisztikus autoencoder. Metrika: képenkénti MSE, majd jelenetenként a két nézet átlaga. Választás: a legjobb checkpoint kizárólag val rekonstrukciós veszteségen. Teszt: tiszta és corrupted_test páronként ugyanazon scene/view sorrendben; a páros különbséget jelenetalapú cluster bootstrap intervallummal jellemezzük, mert a független mintavételi egység a scene, nem a kép. Következtetési határ: a korrupt hiba növekedése a betanítási tartomány érzékenységét méri, nem általános valós képminőséget; negatív vagy nulla eredmény is elfogadható korrekt riporttal.

31.1.8 8. Gyakori tévedés ellenpéldával

A gyakori tévedés: „a VAE nem más, mint hagyományos autoencoder zajos latenssel.” Ez hiányos, mert nem mond likelihoodot. Tekintsünk két modellt, amelyek ugyanazt az encoder–decoder párt használják, és mindkettő ugyanazt a mintavételezett z=μ+σεz=\mu+\sigma\varepsilon rekonstrukciót adja. Az egyik p(x∣z)=𝒩(x;μθ(z),I)p(x\mid z)=\mathcal N(x;\mu_\theta(z), I) értékkel definiálja a likelihoodot, a másik 𝒩(x;μθ(z),0.01I)\mathcal N(x;\mu_\theta(z),0.01I)-vel. Az MSE-optimum ugyanaz, de a rekonstrukciós tag skálája és a teljes ELBO különbözik, mert az explicit likelihood normalizáló konstansa más. Zajos latenttér önmagában nem ad generatív célfüggvényt; a VAE-t az ℒ\mathcal L maximalizálása és a hozzá tartozó likelihood definiálja.

31.1.9 9. Önellenőrzés és visszahívás

Ellenőrzés: a kézi példában KL≥0\ge 0; ELBO=−1.476255≤logp(x)=−1.164303=-1.476255\le\log p(x)=-1.164303; az egymintás MC nem helyettesíti a zárt várható értéket. Kódellenőrzés: xx (D,)(D,), WW (K,D)(K,D) szorzás W*z broadcasthellyel (S,D)(S,D)-t ad; a KL-tag a KK dimenzión összegzendő. Numerikus ellenőrzés: float64, cpu, tolerancia 0.010.01–0.020.02. Visszahívás: a 29.4. Anomáliapontszám rekonstrukcióból alfejezetben bevezetett rekonstrukciós pontszám itt a Gauss-dekóder likelihood negatív, konstanseltolt változataként jelenik meg; a 7.4. Numerikus stabilitás és jelentésmegőrző implementáció log-likelihood-stabilizálást kategorikus dekódernél kell újra elővenni.

31.1.10 Rövid összefoglaló

A VAE látens zz változót vezet be, priorral és pθ(x∣z)p_\theta(x\mid z) dekóder-likelihooddal. A posterior pθ(z∣x)p_\theta(z\mid x) a pθ(x)p_\theta(x) marginalizáló integrál miatt általában nem zárt, ezért qϕ(z∣x)q_\phi(z\mid x) encoder-közelítést illesztünk. Az ELBO a Jensen-egyenlőtlenségből a logpθ(x)\log p_\theta(x) alsó korlátjaként vezethető le, és felbomlik rekonstrukciós tagra és DKL(qϕ‖p)D_{KL}(q_\phi\Vert p) büntetőtagra. A levezetés feltétele a támogatási feltétel és az integrabilitás. A toy Gauss-példa a rekonstrukció/KL skáláját, a labor a zárt képlet és az MC-becslés viszonyát ellenőrzi.

31.1.11 Következő alkalmazás

A 31.2. GAN mint minimax probléma a GAN minimax célját mutatja be; ott az adott likelihoodú generatív cél helyett egy diszkriminátor jelenti a tanítójelet. A most megismert likelihood-, prior- és posteriorfogalom ahhoz kell, hogy a két modellcsalád feltevéseit elkülönítsük.

31.1.12 Források