29.2 Denoising és korrupciós modell

29.2.1 Cél, előismeret és induló kérdés

Ez az alfejezet a zajos bemenet és a tiszta célkép közötti páros szerződést vizsgálja. Feltételezzük a 29.1. Lineáris és nemlineáris autoencoder autoencoder-alapfogalmait: az encoder, decoder, latent tér és rekonstrukciós cél ismert. Nincs szükség haladó statisztikai előismeretre; a várható érték és a feltételes eloszlás alapjait az 5.2. Várható érték, variancia és likelihood vezette be.

Induló kérdés: egy 24×24-es szürke képre additív Gauss-zajt teszünk, majd egy modellnek a zajos képből a tiszta képet kell visszaadnia. Mi a legkisebb elérhető per-pixel négyzetes hiba? A válasz nem nulla, és a korrupciós modell, a cél definíciója és a tanító/target szétválasztás nélkül nem is értelmes.

29.2.2 Definíciók és jelölések

Tiszta kép (clean image). Egyetlen megfigyelés x∈ℝC⋅H⋅Wx\in\mathbb R^{C\cdot H\cdot W}, a GlyphLab esetében C=1C=1, H=W=24H=W=24, és minden pixelérték a [0,1][0,1] intervallumba esik. Egy batch X∈ℝN×C×H×WX\in\mathbb R^{N\times C\times H\times W}; az absztrakt képletekben xx oszlopvektorként, d=CHWd=CHW dimenzióval jelenik meg.

Korrupció (corruption). A c:𝒳×ℰ→𝒳c:\mathcal X\times\mathcal E\to\mathcal X leképezés egy tiszta képhez és egy ε\varepsilon zajrealizációhoz rendeli a zajos megfigyelést: y=c(x,ε).y=c(x,\varepsilon). A ℰ\mathcal E tér a zaj értékkészlete. A korrupció lehet véletlen, de a tanítási folyamatban a zajrealizációt explicite kezelni kell.

Zajeloszlás (noise distribution). A korrupció által indukált feltételes eloszlás pY∣Xp_{Y\mid X}. A leggyakoribb laborváltozat az additív Gauss-zaj: ε∼𝒩(0,σ2Id),y=clip[0,1](x+ε),\varepsilon\sim\mathcal N(0,\sigma^2 I_d),\qquad y=\operatorname{clip}_{[0,1]}(x+\varepsilon), ahol a klipelés elemenként min(1,max(0,⋅))\min(1,\max(0,\cdot)). A klipelés miatt a megfigyelt yy peremeloszlása már nem tiszta Gauss, hanem csonkolt/cenzorált eloszlás.

Denoiser. A fθ:ℝd→ℝdf_\theta:\mathbb R^d\to\mathbb R^d függvény a zajos képet a tiszta kép becslésére képezi: x̂=fθ(y)\hat x=f_\theta(y). A 29.1. Lineáris és nemlineáris autoencoder alfejezetben bevezetett encoder–decoder szerkezet természetes választás: az encoder a zajos képet latens reprezentációba képezi, a decoder onnan rekonstruál; a kimenet alakja megegyezik a bemenet alakjával.

Rekonstrukciós veszteség (reconstruction loss). A denoising cél a tiszta target és a becsült kép közötti négyzetes eltérés. Egyetlen páron ℓ(x,y;θ)=∥fθ(y)−x∥22,\ell(x,y;\theta)=\lVert f_\theta(y)-x\rVert_2^2, a teljes batch-en pedig az átlag: L̂(θ)=1N∑i=1N∥fθ(yi)−xi∥22.\hat L(\theta)=\frac1N\sum_{i=1}^N \lVert f_\theta(y_i)-x_i\rVert_2^2. \tag{1} A per-pixel MSE ettől egy d=CHWd=CHW osztóban tér el; a levezetésekben a (1) alakot használjuk, és mindig kimondjuk, melyik normalizálás szerepel. PyTorch MSELoss(reduction='mean') az elemenkénti átlagot adja, ezért ha a (1) alakot akarjuk, a veszteséget 1/N1/N helyett 1/(NCHW)1/(NCHW) átlagként kell kezelni; a gradiensskálát a tanulási ráta kompenzálhatja.

Szivárgás (leakage). A tanító, validációs vagy tesztelési folyamatban a teszt splithez tartozó tiszta target vagy a teszt zajrealizációjára vonatkozó információ bejut a modellparaméterekbe vagy a modellválasztásba. A denoising beállításban a legsúlyosabb szivárgás az, ha egy tiszta tesztkép tanítási targetként szerepel: ekkor a teszt nem a korrupció eltávolítását méri, hanem a targetek memorizálását.

29.2.3 A várható denoising cél

A denoising feladat valószínűségi megfogalmazása a várható négyzetes hiba minimalizálása. Legyen XX a tiszta kép véletlen vektor, Y=c(X,ε)Y=c(X,\varepsilon) a korrupt megfigyelés. A cél az összes mérhető g:ℝd→ℝdg:\mathbb R^d\to\mathbb R^d függvény fölött: L(g)=𝔼[∥X−g(Y)∥22].L(g)=\mathbb E\bigl[\lVert X-g(Y)\rVert_2^2\bigr]. \tag{2}

Tétel (MSE-optimális denoiser). Tegyük fel, hogy 𝔼∥X∥22<∞\mathbb E\lVert X\rVert_2^2<\infty. Ekkor az a gg minimalizálja a (2) célfüggvényt, amelyre g*(y)=𝔼[X∣Y=y]g^*(y)=\mathbb E[X\mid Y=y] (a feltételes várható érték alkalmas regular verziója), és a minimum L(g*)=𝔼[∥X−𝔼[X∣Y]∥22].L(g^*)=\mathbb E\bigl[\lVert X-\mathbb E[X\mid Y]\rVert_2^2\bigr].

Bizonyítás. Legyen m(Y)=𝔼[X∣Y]m(Y)=\mathbb E[X\mid Y], és írjuk fel a különbséget: X−g(Y)=(X−m(Y))+(m(Y)−g(Y)).X-g(Y)=(X-m(Y))+(m(Y)-g(Y)). A normanégyzetet kifejtve: ∥X−g(Y)∥2=∥X−m(Y)∥2+∥m(Y)−g(Y)∥2+2(X−m(Y))⊤(m(Y)−g(Y)).\lVert X-g(Y)\rVert^2=\lVert X-m(Y)\rVert^2+\lVert m(Y)-g(Y)\rVert^2+2(X-m(Y))^\top(m(Y)-g(Y)). Vegyük mindkét oldal várható értékét. A kereszttag feltételes várható értékét kell megvizsgálni: $$\mathbb E\bigl[(X-m(Y))^\top(m(Y)-g(Y))\bigr] =\mathbb E\Bigl[\mathbb E\bigl[(X-m(Y))^\top(m(Y)-g(Y))\mid Y\bigr]\Bigr].$$ A feltételes várható érték tulajdonsága miatt az YY-tól függő (m(Y)−g(Y))(m(Y)-g(Y)) kiemelhető: 𝔼[(X−m(Y))⊤(m(Y)−g(Y))∣Y]=(m(Y)−g(Y))⊤𝔼[X−m(Y)∣Y]=0,\mathbb E\bigl[(X-m(Y))^\top(m(Y)-g(Y))\mid Y\bigr] =(m(Y)-g(Y))^\top \mathbb E[X-m(Y)\mid Y]=0, mert 𝔼[X−m(Y)∣Y]=0\mathbb E[X-m(Y)\mid Y]=0 a feltételes várható érték definíciója szerint. A másodmomentum-feltétel és a Cauchy–Schwarz-egyenlőtlenség biztosítja, hogy a várható értékek végesek és a kiemelés jogszerű. Így L(g)=L(g*)+𝔼[∥m(Y)−g(Y)∥22]≥L(g*),L(g)=L(g^*)+\mathbb E\bigl[\lVert m(Y)-g(Y)\rVert_2^2\bigr]\ge L(g^*), és egyenlőség pontosan akkor áll, ha g(Y)=m(Y)g(Y)=m(Y) majdnem mindenütt. ∎

A tétel elméleti optimumot ad, de nem konstruktív: a 𝔼[X∣Y]\mathbb E[X\mid Y] általában nem zárt alakú, ezért a gyakorlatban fθf_\theta paraméteres közelítést használunk. Az (1) empirikus veszteség a (2) várható cél Monte Carlo-közelítése, ha a (xi,yi)(x_i,y_i) párok független minták a közös korrupciós eloszlásból.

Additív Gauss-zaj esete. Legyen Y=X+NY=X+N, ahol N∼𝒩(0,σ2I)N\sim\mathcal N(0,\sigma^2 I) független XX-től, és a klipelést egyelőre elhagyjuk. A sűrűség: $$p_{Y\mid X}(y\mid x)=\prod_{j=1}^d \frac{1}{\sqrt{2\pi\sigma^2}}\exp\Bigl(-\frac{(y_j-x_j)^2}{2\sigma^2}\Bigr).$$ A Bayes-szabállyal a posterior: $$p_{X\mid Y}(x\mid y)\propto p_X(x)\exp\Bigl(-\frac{1}{2\sigma^2}\lVert y-x\rVert_2^2\Bigr),$$ ahol pXp_X a tiszta képek eloszlása. A Bayes-optimális denoiser tehát g*(y)=𝔼[X∣Y=y]=∫xpX∣Y(x∣y)dx.g^*(y)=\mathbb E[X\mid Y=y]=\int x\,p_{X\mid Y}(x\mid y)\,dx. Ez általában nem yy és nem is lineáris függvénye yy-nak. A célfüggvény a Tétel szerint: L(θ)=𝔼X,N[∥fθ(X+N)−X∥22],L(\theta)=\mathbb E_{X,N}\bigl[\lVert f_\theta(X+N)-X\rVert_2^2\bigr], a klipeléses változatban pedig Y=clip(X+N,0,1)Y=\operatorname{clip}(X+N,0,1) mellett ugyanez a képlet, de a YY eloszlása a csonkolás miatt különbözik a tiszta Gauss-esettől.

29.2.4 Eredeti kézi kis példa

Legyen d=1d=1, X∈{0,1}X\in\{0,1\} egyenlő valószínűséggel, N∼𝒩(0,1)N\sim\mathcal N(0,1) független, és Y=X+NY=X+N. A Bayes-optimális denoiser a posterior várható érték: g*(y)=0.5pN(y−1)0.5pN(y)+0.5pN(y−1)=pN(y−1)pN(y)+pN(y−1),g^*(y)=\frac{0.5\,p_N(y-1)}{0.5\,p_N(y)+0.5\,p_N(y-1)}=\frac{p_N(y-1)}{p_N(y)+p_N(y-1)}, ahol pNp_N a standard normális sűrűség. A y=0,7y=0{,}7 pontban pN(0,7)≈0,3123p_N(0{,}7)\approx0{,}3123 és pN(−0,3)≈0,3814p_N(-0{,}3)\approx0{,}3814, így g*(0,7)=0,38140,3123+0,3814≈0,5498.g^*(0{,}7)=\frac{0{,}3814}{0{,}3123+0{,}3814}\approx0{,}5498. Az identikus leképezés x̂=0,7\hat x=0{,}7-et adna, a triviális átlag x̂=0,5\hat x=0{,}5; az optimális becslés a 00-ra húz, mert a megfigyelés közelebb van a 00 móduszú esethez. A Tétel garantálja, hogy semmilyen más gg-vel nem érhető el kisebb várható négyzetes hiba ennél a zajmodellnél.

29.2.5 Labor: zajos–tiszta párok szintetikus alakzatokon

A labor kizárólag a GlyphLab saját, procedurális adatát használja. A cél: additív Gauss-korrupcióval párokat készíteni, a teszt zajrealizációját külön seeddel generálni, és a szivárgást szisztematikusan ellenőrizni. A modell tanítását nem végezzük el ebben a laborban; a párok előállítása és a baseline kiértékelés az átadandó eredmény.

import csv
import numpy as np
from pathlib import Path

DATA = Path("data")
SIGMA = 0.25
TRAIN_SEED = 20261020
VAL_SEED   = 20261021
TEST_SEED  = 20261022

def read_split_indices(metadata_path: Path) -> dict[str, np.ndarray]:
    """A metadata.csv split oszlopából indexeket olvas be int64-ként."""
    idx: dict[str, list[int]] = {"train": [], "val": [], "test": []}
    with metadata_path.open(newline="", encoding="utf-8") as f:
        for row in csv.DictReader(f):
            idx[row["split"]].append(int(row["index"]))
    return {k: np.asarray(v, dtype=np.int64) for k, v in idx.items()}

def add_gaussian_noise(
    clean: np.ndarray, sigma: float, seed: int
) -> tuple[np.ndarray, np.ndarray]:
    """Additív Gauss-zaj, majd elemenkénti [0,1] klipelés.

    clean: (M, C, H, W) float32, [0,1]
    Vissza: (noisy, noise), mindkettő float32, noisy [0,1].
    """
    rng = np.random.default_rng(seed)
    noise = rng.normal(0.0, sigma, clean.shape).astype(np.float32)
    noisy = np.clip(clean + noise, 0.0, 1.0).astype(np.float32)
    return noisy, noise

# 1. Bemenet és split
images = np.load(DATA / "images.npy")          # (360,1,24,24) float32
meta_idx = read_split_indices(DATA / "metadata.csv")
train = images[meta_idx["train"]]
val   = images[meta_idx["val"]]
test  = images[meta_idx["test"]]

# 2. Korrupció: train/val/test külön zajseeddel
train_noisy, train_noise = add_gaussian_noise(train, SIGMA, TRAIN_SEED)
val_noisy,   val_noise   = add_gaussian_noise(val,   SIGMA, VAL_SEED)
test_noisy,  test_noise  = add_gaussian_noise(test,  SIGMA, TEST_SEED)

# 3. Alak- és tartománykontroll
for name, arr in [("train_noisy", train_noisy), ("val_noisy", val_noisy),
                  ("test_noisy", test_noisy)]:
    assert arr.shape == train.shape, name
    assert np.isfinite(arr).all(), name
    assert 0.0 <= arr.min() and arr.max() <= 1.0, name

# 4. Leakage-ellenőrzés: a tiszta testképek nem lehetnek train targetek
assert len(set(meta_idx["train"]).intersection(meta_idx["test"])) == 0

# 5. Baseline-ok, per-pixel MSE-ként
def mse(a: np.ndarray, b: np.ndarray) -> float:
    return float(np.mean((a - b) ** 2))

identity_mse = mse(test_noisy, test)   # a zajos input mint predikció
const_pred = np.full_like(test, np.mean(train))  # tanítási átlag konstansként
const_mse = mse(const_pred, test)
noise_energy = float(np.mean(test_noise ** 2))   # a vizsgált zaj átlagos energiája

print(f"shapes: train_noisy={train_noisy.shape}, test_noisy={test_noisy.shape}")
print(f"dtype: {train_noisy.dtype}, device: CPU (NumPy)")
print(f"identity baseline MSE={identity_mse:.6f}")
print(f"const baseline MSE={const_mse:.6f}")
print(f"noise energy={noise_energy:.6f}")

A futáskor a data/images.npy és data/metadata.csv fájloknak a munkakönyvtár data almappájában kell lenniük. Futtatási parancs:

python denoising_pairs.py

Ellenőrzés és értelmezés. Az identikus baseline y↦yy\mapsto y per-pixel MSE-je várhatóan σ2=0,0625\sigma^2=0{,}0625 körül mozog, de a [0,1][0,1] klipelés a szélső pixeleknél csökkenti a hibát, ezért a tényleges érték kisebb lehet. A konstans baseline a tiszta képek varianciáját méri: ha a képek intenzitása erősen változó, ez nagyobb σ2\sigma^2-nél; ha a képek közel konstansak, kisebb. A zajenergia a ténylegesen hozzáadott ε\varepsilon négyzetes átlaga, és csak a klipelés nélküli zajt méri. A denoisernek az identikus és a konstans baseline alá kell mennie; a sikeres tanulás szükséges feltétele, hogy a validációs MSE az identikus baseline alatt legyen.

A kimenet a fenti kód futtatása nélkül nem mért érték; a megadott képletek és a GlyphLab szerződés alapján számított szemléltetésként az identikus baseline ≈0,06\approx0{,}06, a konstans baseline a tiszta képek szórásától függ, a zajenergia ≈0,0625\approx0{,}0625 körüli.

29.2.6 Feladatok

F1 (fogalmi, nehézség 1). Definiálja a corruption, denoising és leakage fogalmát a denoising tanítási protokollban. Magyarázza el, miért vezetne az fθ(y)=yf_\theta(y)=y identikus leképezéshez az a hibás cél, amely a zajos képet önmagával hasonlítja. A válaszban adjon egy kis ellenpéldát: legyen y=x+εy=x+\varepsilon, és mutassa meg, hogy az ∥fθ(y)−y∥2\lVert f_\theta(y)-y\rVert^2 minimalizálója az identitás.

F2 (levezetési, nehézség 2). Legyen X∈{1,3}X\in\{1,3\}, P(X=1)=0,4P(X=1)=0{,}4, P(X=3)=0,6P(X=3)=0{,}6, és Y=X+NY=X+N, ahol N∼𝒩(0,0,52)N\sim\mathcal N(0,0{,}5^2) független. Vezesse le a Bayes-optimális denoiser képletét, számítsa ki f*(2,1)f^*(2{,}1) értékét, és adja meg a feltételes minimális négyzetes hibát Y=2,1Y=2{,}1 esetén. A megoldásban a közös normáló konstans kiesését mutassa ki.

F3 (implementációs, nehézség 2). Írjon Python-függvényt, amely a GlyphLab data/images.npy tömbjéből készít zajos–tiszta párokat: a train, val, test splithez külön seedet használ, additív Gauss-zajt ad σ=0,2\sigma=0{,}2 mellett, és a zajos képet a [0,1][0,1] intervallumba klipeli. A függvény ellenőrizze, hogy a kimeneti zajos tömb alakja megegyezik a bemenettel, minden érték véges, és a test split tiszta célja nem szerepel a train targetek között.

F4 (hibakeresési, nehézség 2). Az alábbi kódrészlet hibás:

train_clean = images[train_idx]
test_clean = images[test_idx]
train_noisy = add_gaussian_noise(train_clean, SIGMA, TRAIN_SEED)[0]
target = np.concatenate([train_clean, test_clean], axis=0)  # ???
model.fit(train_noisy, target)

Lokalizálja a hibát, adja meg a következményét, és javítsa ki úgy, hogy a tanítás után a teszt splitre vonatkozó MSE független maradjon. A javított kódban mutassa be az ellenőrzést is.

F5 (kísérlettervezési, nehézség 3). Tervezzen kísérletet annak mérésére, hogy egy fθf_\theta denoiser hogyan általánosít egy új, a tanításnál nem látott zajszintre. A tanítás σ=0,1\sigma=0{,}1 zajjal történik, a teszt σ=0,3\sigma=0{,}3 és σ=0,5\sigma=0{,}5 mellett is futtatandó. Adja meg a megfigyelési egységet, a baseline-okat, a metrikát, a split- és seed-szabályt, valamint a következtetés érvényességi határát.

29.2.7 Megoldások és indoklás

F1. A corruption a c(x,ε)c(x,\varepsilon) leképezés, amely tiszta képből zajos megfigyelést ad; a denoising a zajos megfigyelésből a tiszta kép becslése; a leakage a teszt splithez tartozó tiszta cél vagy zajrealizáció-információ bejutása a tanítási folyamatba. Ha a cél a zajos kép önmaga, azaz L̂(θ)=1N∑i∥fθ(yi)−yi∥2\hat L(\theta)=\frac1N\sum_i\lVert f_\theta(y_i)-y_i\rVert^2, akkor a cél minimális értéke nulla, és a fθ(y)=yf_\theta(y)=y identitás eléri. Ezért a modell nem tanul zajtalanítást, csak identitást. Az ellenpélda a fenti képletben közvetlen: bármely fθ(y)=yf_\theta(y)=y megoldás nulla hibát ad, függetlenül a zaj mértékétől.

F2. A posterior a Bayes-szabállyal, a közös pNp_N konstanssal: P(X=1∣Y=y)=0,4pN(y−1)0,4pN(y−1)+0,6pN(y−3),P(X=3∣Y=y)=1−P(X=1∣Y=y).P(X=1\mid Y=y)=\frac{0{,}4\,p_N(y-1)}{0{,}4\,p_N(y-1)+0{,}6\,p_N(y-3)},\qquad P(X=3\mid Y=y)=1-P(X=1\mid Y=y). A denoiser f*(2,1)=1⋅P(X=1∣Y=2,1)+3⋅P(X=3∣Y=2,1)f^*(2{,}1)=1\cdot P(X=1\mid Y=2{,}1)+3\cdot P(X=3\mid Y=2{,}1). A normális sűrűség közös 10,52π\frac{1}{0{,}5\sqrt{2\pi}} szorzója kiesik; csak az exponenciális tagokat kell számolni: pN(1,1)∝e−1,12/(2⋅0,25)=e−2,42≈0,0889,p_N(1{,}1)\propto e^{-1{,}1^2/(2\cdot 0{,}25)}=e^{-2{,}42}\approx0{,}0889, pN(−0,9)∝e−0,92/(0,5)=e−1,62≈0,198.p_N(-0{,}9)\propto e^{-0{,}9^2/(0{,}5)}=e^{-1{,}62}\approx0{,}198. Súlyozatlanul a súlyok 0,4⋅0,0889=0,035560{,}4\cdot0{,}0889=0{,}03556 és 0,6⋅0,198=0,11880{,}6\cdot0{,}198=0{,}1188; a normalizálás után P(X=1∣Y=2,1)=0,035560,03556+0,1188≈0,2304,P(X=3∣Y=2,1)≈0,7696.P(X=1\mid Y=2{,}1)=\frac{0{,}03556}{0{,}03556+0{,}1188}\approx0{,}2304,\qquad P(X=3\mid Y=2{,}1)\approx0{,}7696. Így f*(2,1)≈0,2304+3⋅0,7696=2,539.f^*(2{,}1)\approx0{,}2304+3\cdot0{,}7696=2{,}539. A feltételes minimális négyzetes hiba a posterior variancia: (1−2,539)2⋅0,2304+(3−2,539)2⋅0,7696≈0,545+0,163=0,708.(1-2{,}539)^2\cdot0{,}2304+(3-2{,}539)^2\cdot0{,}7696\approx0{,}545+0{,}163=0{,}708. Alakellenőrzés: a kimenet skalár, a posterior valószínűségek összege egy, a variancia nemnegatív.

F3. A megoldás a labor kódjának megfelelő függvény:

def make_noisy_pairs(images, meta, sigma, train_seed, val_seed, test_seed):
    idx = read_split_indices(meta)
    train_clean = images[idx["train"]]
    val_clean   = images[idx["val"]]
    test_clean  = images[idx["test"]]

    def noisy(clean, seed):
        rng = np.random.default_rng(seed)
        n = rng.normal(0.0, sigma, clean.shape).astype(np.float32)
        return np.clip(clean + n, 0.0, 1.0).astype(np.float32), n.astype(np.float32)

    train_noisy, train_noise = noisy(train_clean, train_seed)
    val_noisy,   val_noise   = noisy(val_clean,   val_seed)
    test_noisy,  test_noise  = noisy(test_clean,  test_seed)
    assert train_noisy.shape == train_clean.shape
    assert np.isfinite(train_noisy).all()
    assert train_noisy.min() >= 0.0 and train_noisy.max() <= 1.0
    assert len(set(idx["train"]).intersection(idx["test"])) == 0
    return (train_noisy, train_clean), (val_noisy, val_clean), (test_noisy, test_clean)

Használat: a meta lehet a data/metadata.csv elérési út vagy egy DataFrame; itt a read_split_indices a CSV-t olvassa. A tolerancia a klipelésnél nem szükséges, mert a np.clip pontosan a megadott határokat adja; a shape-eket egész számokként ellenőrizzük.

F4. A hiba az np.concatenate([train_clean, test_clean]) sorban van: a tiszta tesztképek bekerülnek a tanítási targetek közé. Következmény: a modell a teszt tiszta céljának memorizálása révén hamisan alacsony teszt MSE-t érhet el, miközben új zajos mintán gyengén teljesít; a kiértékelés torzított. Javítás: csak a train splitből készítsünk tanítópárokat, a test célját kizárólag a végső tesztnél használjuk:

train_clean = images[train_idx]
train_noisy = add_gaussian_noise(train_clean, SIGMA, TRAIN_SEED)[0]
model.fit(train_noisy, train_clean)
test_noisy = add_gaussian_noise(images[test_idx], SIGMA, TEST_SEED)[0]
test_mse = np.mean((model.predict(test_noisy) - images[test_idx]) ** 2)
assert not np.array_equal(model.predict(test_noisy), images[test_idx])

Az ellenőrzés: a train_idx és test_idx diszjunktságát a labor 4. lépése garantálja; a teszt MSE-t csak egyszer, a modell kiválasztása után számítjuk.

F5. Egy lehetséges terv: a megfigyelési egység a GlyphLab scene_id-je, mert a két nézet ugyanannak a jelenetnek a zajos változata; a split scene-szinten rétegzett. A modell tanítása σ=0,1\sigma=0{,}1 zajjal, a validáció σ=0,1\sigma=0{,}1 mellett választja a legjobb checkpointot. A teszteléshez a tiszta test splitet három külön zajrealizációval korrumpáljuk: σ=0,1\sigma=0{,}1, 0,30{,}3, 0,50{,}5, mindegyikhez külön seedet használva. Baseline-ok: az identikus y↦yy\mapsto y és a tanítási átlag konstans prediktor, minden zajszinten; a metrika a per-pixel MSE és a PSNR =10log10(1/MSE)=10\log_{10}(1/\mathrm{MSE}). A kiértékelést a modell rögzítése után egyszer futtatjuk. Érvényességi határ: az eredmény csak a választott zajcsaládra és a szintetikus GlyphLab adatra vonatkozik; a klipelés miatt a magas σ\sigma esetén a tényleges zaj torzul, ezért a σ=0,5\sigma=0{,}5 eredmény nem ekvivalens egy valós érzékelő zajával.

29.2.8 Tipikus tévedés ellenpéldával

A leggyakoribb hiba az, hogy a tiszta tesztkép tanítási targetként megjelenik. Tegyük fel, hogy a 60 tesztképből 10 tiszta targetet véletlenül a train célhoz csatolunk. Egy olyan modell, amely a train párokat memorizálja, a teszt ezen 10 elemére nulla közeli MSE-t adhat, míg a maradék 50 elemre a denoising teljesítménye gyenge. Az átlagos teszt MSE így optimistán alacsony lesz, de nem a zajtalanítás minőségét méri. A helyes protokoll: a train generálásakor kizárólag a train split képeit használjuk, a test tiszta célját pedig csak a végső kiértékelésben töltjük be.

29.2.9 Önellenőrzés és korábbi fogalom visszahívása

Ellenőrzendő: a target mindig a tiszta kép, a veszteség redukciója explicite rögzített, a zajrealizációk seedjei a splitenként elkülönülnek. A 28.2. Sziámi és triplet cél triplet céljával párhuzamos: ott a pozitív pár közelítése, itt a zajos–tiszta pár közvetlen rekonstrukciója a cél; margin és negatív pár hiányában a denoising collapse-je a konstans prediktor, nem a konstans embedding. A 25.2. Multilabel és hierarchikus cél megfigyelési maszkjának tanulsága: ha tudjuk, mely pixelek korruptak, a loss súlyozható; itt minden pixel megfigyelt, ezért a maszk nem szükséges. A 17.2. AlexNet és a kísérleti kontextus kísérleti kontextusa emlékeztet: a zajmodell és a kiértékelési feltételek rögzítése nélkül az eredmény nem általánosítható.

29.2.10 Rövid összefoglaló

A denoising cél a zajos yy megfigyelésből a tiszta xx kép becslése, a korrupciós leképezés c(x,ε)c(x,\varepsilon) rögzítése mellett. A várható négyzetes hibát a feltételes várható érték 𝔼[X∣Y]\mathbb E[X\mid Y] minimalizálja; a tétel feltétele 𝔼∥X∥2<∞\mathbb E\lVert X\rVert^2<\infty. Az additív Gauss-zaj modelljében a posterior a tiszta kép priorjától függ, ezért az optimum általában nem zárt alakú. Az empirikus veszteség az átlagos rekonstrukciós hiba, per-pixel MSE-re az elemszámmal normalizálva. A labor a GlyphLab adatra külön train/val/test zajseeddel állít elő párokat; a tiszta tesztcél tanítási targetként való megjelenése szivárgás, és a teszt MSE-t torzítja.

29.2.11 Következő alkalmazás

A 29.3. Regularizált latent reprezentáció egység a regularizált latent reprezentációt tárgyalja: ott a denoising célhoz hasonló rekonstrukciós veszteség mellé egy latent-térbeli büntetőtag kerül, amely a reprezentáció eloszlását szabályozza. A most bevezetett zajos–tiszta páros szerződés és a szivárgásvizsgálat ott is kötelező kiindulópont.

29.2.12 Felhasznált források