25.4 Nyílt halmaz és ismeretlen input

25.4.1 1. Cél, előismeret és induló becslés

Eddig minden osztályozó azt feltételezte, hogy a teszt input ugyanabból az eloszlásból származik, mint a tanító adat, és a célhalmaz éppen KK osztály. A GlyphLab esetén ez a három orientáció. A valós felhasználásban azonban a modell olyan képet is kaphat, amely nem a generátor szerződése szerint készült: üres konstans kép, véletlen zaj, más képtípus. Ekkor a modell még mindig az egyik ismert osztályt fogja mondani, mert a kimeneti rétege csak KK logitot ad. Ebben az egységben ezt a nyílt halmaz helyzetet kezeljük: megkülönböztetjük az ismeretlen osztály, az out-of-distribution (OOD) és az elutasítás fogalmát.

Előismeret: a softmax és a többosztályos cross-entropy a 7.2. Softmax és többosztályos cross-entropy alfejezetből; a kis adaton mért baseline és fair comparison a 25.3. Kis adat és feature-alapú baseline alfejezetből; a loss- és alak-szerződés ellenőrzése a 24.4. VI. ellenőrző pont: megbízható CNN-training alfejezetből; továbbá a 21.4. Osztályarány, súlyozás és céleloszlás alfejezetben tárgyalt megfigyelés, hogy a softmax-konfidencia nem automatikusan kalibrált valószínűség.

Induló becslés. Mekkora maximális softmax-konfidenciát adhat egy K=3K=3 osztályú modell egy olyan 24×2424\times 24-es képre, amely csupa egyes értéket tartalmaz, tehát nem tartalmaz semmilyen vonalat? A választ a 3. szakasz kézzel számolt ellenpéldája adja meg.

25.4.2 2. Definíciók és intuíció

Legyen a bemeneti tér 𝒳=ℝC×H×W\mathcal X=\mathbb R^{C\times H\times W}, a tanulási eloszlás ptrainp_{\mathrm{train}} a 𝒟in⊆𝒳\mathcal D_{\mathrm{in}}\subseteq\mathcal X felhasználási tartomány fölött, a zárt célhalmaz pedig 𝒴={0,…,K−1}\mathcal Y=\{0,\ldots,K-1\}. A GlyphLab esetén ptrainp_{\mathrm{train}} a generátor által definiált eloszlás a három vonaltípus fölött.

Nyílt halmazú osztályozás (open-set classification): a döntés célhalmaza 𝒴open={0,…,K−1,unknown},\mathcal Y_{\mathrm{open}}=\{0,\ldots,K-1,\mathrm{unknown}\}, ahol unknown\mathrm{unknown} egy külön, k-adik osztály. A modell kimenete ekkor K+1K+1 logit, vagy a KK logit mellett egy külön elutasítási mechanizmus.

Out-of-distribution (OOD) input: olyan xx, amelynek eloszlása q≠ptrainq\ne p_{\mathrm{train}}, vagy amelyre a 𝒟in\mathcal D_{\mathrm{in}} tartományon kívül esik. Az OOD nem azonos az unknown\mathrm{unknown} osztállyal: egy OOD input lehet egy ismert osztályú, de más körülmények között készült kép, vagy egyáltalán nem vonatkozó objektum. A modell önmagában, további feltételezés nélkül nem tudja megmondani, hogy bemenete OOD-e.

Softmax-konfidencia: a Z∈ℝN×KZ\in\mathbb R^{N\times K} logitokból számított pik=softmax(Z)ik=eZik∑j=1KeZij,p_{ik}=\mathrm{softmax}(Z)_{ik}=\frac{e^{Z_{ik}}}{\sum_{j=1}^{K}e^{Z_{ij}}}, illetve a döntési konfidencia ci=maxk∈𝒴pik∈[1K,1].c_i=\max_{k\in\mathcal Y}p_{ik}\in\left[\frac1K,1\right]. Ez egy normalizált pontszám, nem feltétlenül az adott osztály tényleges valószínűsége; a 21.4. Osztályarány, súlyozás és céleloszlás kalibrációs tárgyalása szerint ehhez külön kalibrációs adat és metrika kell.

Elutasítás (rejection): a predikciót egy τ\tau konfidencia-küszöbbel egészítjük ki: ŷi={argmaxkZik,ha ci≥τ,unknown,ha ci<τ.\hat y_i=\begin{cases} \arg\max_k Z_{ik}, & \text{ha } c_i\ge\tau,\\ \mathrm{unknown}, & \text{ha } c_i<\tau. \end{cases} A τ\tau egy döntési paraméter, nem a modell paramétere. Az elfogadási arány (coverage) és az elfogadottakon mért pontosság együtt jellemzi a szabályt.

Monitoring: a felhasználás során a konfidencia-eloszlást, az elfogadási arányt és az osztálygyakoriságokat folyamatosan figyeljük. Ha ezek eltérnek a validációs eloszlástól, az domain-eltolódást jelezhet, de önmagában nem bizonyítja azt.

A domain tehát a szerződés része: a modell csak a 𝒟in\mathcal D_{\mathrm{in}} tartományon, a megadott bemeneti előfeldolgozással és eloszlással tett állításokra érvényes.

25.4.3 3. A nagy softmax-konfidencia ellenpéldája

A levezetési kötelezettség egy olyan szemléltető ellenpélda, ahol az input értelmetlen, mégis nagy a softmax maximuma. Ehhez először kimondunk egy pontos alsó korlátot.

Lemma (margin és softmax-konfidencia). Legyen z∈ℝKz\in\mathbb R^K, p=softmax(z)p=\mathrm{softmax}(z). Ha valamely yy osztályra zy−maxk≠yzk=M≥0,z_y-\max_{k\ne y}z_k=M\ge 0, akkor py≥11+(K−1)e−M.p_y\ge\frac{1}{1+(K-1)e^{-M}}.

Bizonyítás. A softmax definíciója szerint py=ezy∑j=1Kezj=11+∑j≠yezj−zy.p_y=\frac{e^{z_y}}{\sum_{j=1}^{K}e^{z_j}} =\frac{1}{1+\sum_{j\ne y}e^{z_j-z_y}}. Minden j≠yj\ne y esetén zj≤zy−Mz_j\le z_y-M, tehát ezj−zy≤e−Me^{z_j-z_y}\le e^{-M}. Így ∑j≠yezj−zy≤(K−1)e−M,\sum_{j\ne y}e^{z_j-z_y}\le (K-1)e^{-M}, amiből a nevező felső becslésével a lemma adódik. A korlát éles: ha minden j≠yj\ne y-ra zj=zy−Mz_j=z_y-M, akkor a nevező pontosan 1+(K−1)e−M1+(K-1)e^{-M}, tehát pyp_y pontosan a jobb oldal.

A bizonyítás kizárólag a softmax algebrai tulajdonságán alapul, semmilyen feltételt nem használ xx tartománybeliségéről. Ebből következik a célzott ellenpélda.

Ellenpélda. Vegyünk egy 2×22\times 2-es, egycsatornás, tehát x∈ℝ4x\in\mathbb R^{4} bemenetet, amelynek minden pixelértéke 11: x=(1,1,1,1)⊤.x=(1,1,1,1)^\top. A GlyphLab generátor szerint a képek maszkja egy vékony vonalat tartalmaz, a háttér 0; a csupa egyes kép ezért nem eleme a felhasználási tartománynak. Legyen az utolsó affin réteg W=(1−1−1−1−11−1−1−1−11−1),b=(4,0,0)⊤,W=\begin{pmatrix} 1 & -1 & -1 & -1\\ -1 & 1 & -1 & -1\\ -1 & -1 & 1 & -1 \end{pmatrix},\qquad b=(4,0,0)^\top, és a logit z=Wx+bz=Wx+b. Ekkor z=(1−1−1−1+4−1+1−1−1+0−1−1+1−1+0)=(2−2−2).z=\begin{pmatrix}1-1-1-1+4\\ -1+1-1-1+0\\ -1-1+1-1+0\end{pmatrix} =\begin{pmatrix}2\\ -2\\ -2\end{pmatrix}. A margin M=2−(−2)=4M=2-(-2)=4, a lemma szerint a vertical osztály konfidenciája legalább 11+2e−4≈0,9646.\frac{1}{1+2e^{-4}}\approx 0{,}9646. A pontos softmax: p1=e2e2+2e−2≈0,9647,p2=p3≈0,0176.p_1=\frac{e^{2}}{e^{2}+2e^{-2}}\approx 0{,}9647,\qquad p_2=p_3\approx 0{,}0176.

A modell tehát 96,5%96{,}5\% konfidenciával mondja a vertical osztályt egy olyan képre, amelyen nincs vonal. A konfidencia nagy, az input mégis OOD. Ez nem azt mutatja, hogy a softmax hibás, hanem azt, hogy a softmax maximuma a logitok különbségét tükrözi, és a tanult affin döntési lap a tartományon kívül tetszőlegesen magas pontszámot adhat. Az ellenpélda a [D07] dokumentáció logits-szerződését követi: a modell logitot ad, a softmax a kiértékeléskor alkalmazott külön lépés.

25.4.4 4. Kézi példa után minimális kód

A fenti számítás stabil NumPy-implementációja a 7.4. Numerikus stabilitás és jelentésmegőrző implementáció alfejezetben bevezetett max-levonásos trükkel:

import numpy as np

x = np.ones((4,), dtype=np.float32)
W = np.array([[1, -1, -1, -1],
              [-1, 1, -1, -1],
              [-1, -1, 1, -1]], dtype=np.float32)
b = np.array([4, 0, 0], dtype=np.float32)

z = W @ x + b                      # (3,) float32

def softmax(z):
    z_stable = z - np.max(z)
    e = np.exp(z_stable)
    return e / e.sum()

p = softmax(z)
print("z =", z)
print("p =", p)
print("max confidence =", p.max())

Várt kimenet:

z = [ 2. -2. -2.]
p = [0.9647444  0.0176278  0.0176278]
max confidence = 0.9647444

A shape (3,)(3,), a konfidencia [1/3,1][1/3,1]-ben van. A numerikus ellenőrzéshez float32 mellett 10−510^{-5} abszolút tolerancia elegendő.

25.4.5 5. Labor: ismert és külön OOD kontroll validáción választott elutasítással

A labor célja egy terv és annak implementációs váza, nem egy elvégzett mérés. Az alábbi kimeneteket ezért kifejezetten jelölt szemléltetésként közöljük, nem mért eredményként.

Protokoll.

  1. Ismert adat: a lab/data/images.npy, labels.npy, metadata.csv és a manifest.json betöltése a split szerint. A modell a 25.3. Kis adat és feature-alapú baseline alfejezetben tanított kis CNN; a kimenet minden képre Z∈ℝN×3Z\in\mathbb R^{N\times 3} logit. A [D07] szerint a tanításkor a CrossEntropyLoss közvetlenül ezt a logitot kapja, int64 célokkal.
  2. Validációs küszöbválasztás: a val halmaz (Nval=60N_{\mathrm{val}}=60 kép) logitjaiból számítjuk a cic_i konfidenciát. Rögzítünk egy cél-coverage-t, például 0,950{,}95, és a τ\tau küszöböt úgy választjuk, hogy a val képek legfeljebb 5%5\%-át utasítsuk el: τ\tau a 33 legkisebb konfidencia közül a legnagyobb, azaz a harmadik legkisebb érték. A küszöböt nem az OOD kontrollon hangoljuk.
  3. Külön OOD kontroll: a seed=20261020 véletlengenerátorral 200200 darab 24×2424\times 24-es float32 képet készítünk három csoportban:
  4. Mértékek: az OOD kontrollra számítjuk az elutasítási arányt 1−coveragê1-\hat{\mathrm{coverage}}, az elfogadott ismert val képek pontosságát, és a validációs coverage-t. A cél nem egyetlen nyerő szám, hanem a coverage–rejection trade-off rögzítése.

Minimális kód a szabályhoz:

# lab/rejection_rule.py
import numpy as np

def softmax_max(logits):
    z = logits - logits.max(axis=1, keepdims=True)
    p = np.exp(z)
    p = p / p.sum(axis=1, keepdims=True)
    return p.max(axis=1)

def choose_threshold(conf, target_coverage):
    n = len(conf)
    n_reject = int(np.floor((1.0 - target_coverage) * n))
    if n_reject == 0:
        return conf.min() - 1e-6  # mindent elfogadunk
    return float(np.partition(conf, n_reject - 1)[n_reject - 1])

def predict_with_rejection(logits, tau):
    pred = logits.argmax(axis=1)
    conf = softmax_max(logits)
    pred = np.where(conf >= tau, pred, -1)  # -1 = unknown
    return pred, conf

# Feltételezett, nem mért bemenetek
val_logits = np.load("lab/val_logits.npy")   # (60,3) float32
val_labels = np.load("lab/val_labels.npy")   # (60,) int64
ood_logits = np.load("lab/ood_logits.npy")   # (200,3) float32

conf_val = softmax_max(val_logits)
tau = choose_threshold(conf_val, 0.95)
pred_val, _ = predict_with_rejection(val_logits, tau)
accept_val = pred_val != -1

_, conf_ood = predict_with_rejection(ood_logits, tau)
accept_ood = conf_ood >= tau

print("tau:", tau)
print("val coverage:", accept_val.mean())   # várt: 0.95
print("accepted val acc:", np.mean(pred_val[accept_val] == val_labels[accept_val]))
print("OOD rejection:", 1.0 - accept_ood.mean())  # jelölt szemléltetés

Lehetséges jelölt szemléltető kimenet (nem mért!):

Mennyiség Jelölt érték
τ\tau validácion 0,7130{,}713
val coverage 0,950{,}95
accepted val accuracy 0,930{,}93
zaj OOD rejection 0,860{,}86
konstans OOD rejection 0,740{,}74
sakktábla OOD rejection 0,610{,}61

A futtatás ellenőrzése: python lab/rejection_rule.py; az OOD logitokat előzetesen a befagyasztott modell model.eval() állapotában, inference_mode() alatt mentettük. Az OOD rejection a τ\tau rögzítése után számolható, és nem használható modell- vagy küszöbválasztásra. Az [S02] értelmében az elfogadási arány pontbecslése mellett a bizonytalanságot külön, független jelenetekre alapozott intervallummal kell jelenteni; itt a scene_id a független mintavételi egység, ahogyan az 5.4. Függő képek, seedek és resampling alfejezetben szerepelt.

25.4.6 6. Feladatok

25.4.6.1 F1. Fogalmi feladat (nehézség 1)

Magyarázza el, miért nem azonos az ismeretlen osztály és az OOD input. Adjon egy-egy konkrét példát a GlyphLab keretében. Válaszát a 2. szakasz definícióira alapozza.

25.4.6.2 F2. Levezetési feladat (nehézség 2)

Számítsa ki a softmax-konfidenciát a z=(6,0,0)⊤z=(6,0,0)^\top logitvektorra, és ellenőrizze a lemmát K=3K=3, y=1y=1, M=6M=6 mellett. Mennyi a lemma által adott alsó korlát, és mennyi a pontos érték? Válaszát legalább négy tizedesjegyre adja meg.

25.4.6.3 F3. Implementációs feladat (nehézség 2)

Írjon függvényt, amely (N, K) alakú float32 logitokra kiszámítja a τ\tau küszöb melletti pred tömböt, ahol pred[i] = -1 elutasítás esetén, egyébként a legnagyobb logit indexe. A függvény a 3. szakasz stabil softmaxát használja. Ellenőrizze a z = [[2,-2,-2], [0.1,0.2,0.01]], tau=0.9 bemeneten; adja meg a kimenetet és indokolja.

25.4.6.4 F4. Hibakeresési feladat (nehézség 2)

Az alábbi eljárás hibás: a hallgató a teszt OOD zajképeken kiszámítja a konfidencia-eloszlást, és a τ\tau küszöböt úgy választja, hogy az OOD rejection 0,950{,}95 legyen; majd ugyanezen az OOD halmazon jelenti a rejection arányt. Mi a hiba, mi a következménye, és mi a javítás? Ellenőrzésként fogalmazza meg, melyik adathalmazon szabad a küszöböt beállítani.

25.4.6.5 F5. Kísérleti/transzfer feladat (nehézség 3)

Tervezzen monitoring protokollt egy gyártásba helyezett GlyphLab-osztályozó számára, ahol hetente 500 új kép érkezik, és a domain-eltolódást kívánjuk jelezni. Adja meg a megfigyelési egységet, a számított metrikákat, a riasztási szabályt és annak korlátját. A terv legyen a 24.4. VI. ellenőrző pont: megbízható CNN-training ellenőrzőpontban rögzített protokollkészítési elvekkel összhangban.

25.4.7 7. Megoldások és indoklás

25.4.7.1 F1 megoldás

Az ismeretlen osztály a célhalmaz része: a modellnek van egy külön kimeneti lehetősége arra, hogy a képet nem sorolja a KK ismert osztályba. Az OOD ezzel szemben az input eloszlás tulajdonsága: a kép nem a tanulási eloszlásból származik. GlyphLab példa: egy zajkép OOD input; ha a döntési szabályunk a τ\tau alatti konfidenciánál elutasít, akkor az unknown célhoz kerül. Ugyanakkor egy ismert osztályú, de erősen eltérő világítású vonalkép is lehet OOD; az elutasítás ekkor helyes lehet, de nem jelenti azt, hogy a képnek ne lenne ismert címkéje. A két fogalom a 𝒴open\mathcal Y_{\mathrm{open}} és a 𝒟in\mathcal D_{\mathrm{in}} különböző szerződéseit érinti.

25.4.7.2 F2 megoldás

A margin M=6M=6, K=3K=3. A lemma alsó korlátja: p1≥11+2e−6≈0,995054.p_1\ge\frac{1}{1+2e^{-6}}\approx 0{,}995054. A pontos érték: p1=e6e6+1+1=e6e6+2≈0,995099.p_1=\frac{e^6}{e^6+1+1}=\frac{e^6}{e^6+2}\approx 0{,}995099. A két érték különbsége 4,5⋅10−54{,}5\cdot 10^{-5}, ami a lemmának megfelelő éles korlát. Az alakellenőrzés: p2=p3=(1−p1)/2≈0,00245p_2=p_3=(1-p_1)/2\approx 0{,}00245, összegük 1. A margin növelésével a konfidencia 1-hez tart, függetlenül attól, hogy az input a tanulási tartományból származik-e.

25.4.7.3 F3 megoldás

import numpy as np

def softmax_max(logits):
    z = logits - logits.max(axis=1, keepdims=True)
    p = np.exp(z)
    p = p / p.sum(axis=1, keepdims=True)
    return p.max(axis=1)

def predict_or_reject(logits, tau):
    pred = logits.argmax(axis=1)
    conf = softmax_max(logits)
    pred = np.where(conf >= tau, pred, -1)
    return pred

logits = np.array([[2, -2, -2],
                   [0.1, 0.2, 0.01]], dtype=np.float32)
tau = 0.9
print(predict_or_reject(logits, tau))

Kimenet: [ 0 -1], mert az első sor konfidenciája 0,9647≥0,90{,}9647\ge 0{,}9, a második sor maximális softmax-értéke e0,2/(e0,1+e0,2+e0,01)≈0,352e^{0{,}2}/(e^{0{,}1}+e^{0{,}2}+e^{0{,}01})\approx 0{,}352, tehát elutasítás. A shape (2,)(2,), a -1 nem logit index, hanem az unknown szimbólum. Szélsőeset: τ=1\tau=1 esetén a >= miatt az 1 konfidencia sem fogadható el; ha ezt el akarjuk kerülni, τ\tau helyett τ−ε\tau-\varepsilon használható, de a float32 véges pontosság miatt célszerű a >= konvenciót leírni.

25.4.7.4 F4 megoldás

A hiba a küszöb kiválasztási adathalmazának megválasztása. Ha a τ\tau-t az OOD tesztképeken hangoljuk, és ugyanazon a halmazon mérjük a rejection arányt, akkor a mért mutató optimistán becsült: a küszöböt éppen ahhoz a zajrealizációhoz igazítottuk. A következmény: más zajtípusra a rejection összeomolhat. A javítás: a τ\tau-t a validációs ismert halmazon, egy rögzített coverage-cél alapján választjuk, és az OOD kontrollt csak ezután, a befagyasztott modellen értékeljük. Ellenőrzés: a validáción számított coverage megfelel a célkitűzésnek, az OOD rejection pedig csak jelentett, nem optimalizált mennyiség.

25.4.7.5 F5 megoldásminta

A megfigyelési egység a kép, de a heti riasztáshoz a heti batch a csoportosítási egység. Minden héten kiszámítjuk: az elfogadási arányt a rögzített τ\tau mellett; az elfogadott képek osztályeloszlását; a konfidenciák átlagát és alsó kvartilisét. A riasztási szabály: ha a heti elfogadási arány legalább két egymást követő héten a validációs coverage alá esik több mint 5 százalékponttal, vagy az osztályeloszlás χ2\chi^2-távolsága a validációs eloszlástól meghalad egy előre rögzített korlátot, akkor domain-eltolódás gyanút jelzünk. A korlát: a riasztás nem bizonyít OOD-ot, csak további címkézett mintavételt indít; a validációs eloszlás maga is becsült 60 képről, ezért a küszöböket konfidencia-intervallummal együtt kell értelmezni. A protokoll a 24.4. VI. ellenőrző pont: megbízható CNN-training alapján seedet, modell-állapotot, logits-verziót és a riasztási naplót együtt rögzíti.

25.4.8 8. Tipikus tévedés, önellenőrzés és visszahívás

Tipikus tévedés. „Az OOD-felismerés bizonyított, mert egyetlen zajteszten 95% rejection adódott.” Ez nem bizonyíték. Egyetlen tesztkészleten hangolt küszöbbel a mért rejection kiválasztási torzítást tartalmaz: egy másik, kissé eltérő zajeloszláson ugyanaz a szabály lényegesen rosszabb lehet. Formális ellenpélda: legyen az első zajkészlet egyenletes U[0,1]U[0,1] háttérrel, a második U[0,0,8]U[0,0{,}8] háttérrel. A konfidencia-eloszlás a két készleten eltolódhat; az elsőn 0,95 rejection-re hangolt τ\tau a másodikon 0,60 alatti rejectiont is adhat. A helyes állítás: a rejection szabályt az ismert validáción kell rögzíteni, és az OOD értékelést több, független kontrollcsoporton kell megismételni.

Önellenőrzés. 1) Meg tudja-e fogalmazni, miért nem elegendő a softmax maximuma az OOD detektáláshoz? 2) A laborban a τ\tau küszöb melyik adathalmazon lett választva? 3) Mi a különbség a coverage és a rejection arány között?

Visszahívás. A 21.4. Osztályarány, súlyozás és céleloszlás alfejezetből: a softmax-konfidencia normalizált pontszám, és a kalibráltság külön, adaton ellenőrzött tulajdonság. A 13.4. Határkezelés és frekvenciaintuíció alfejezetből: az OOD képek esetén a padding-hatás is eltérhet, mert a határfeltétel a tartománybeli képekre lett tervezve; ez további óvatosságot indokol a konfidencia értelmezésében.

25.4.9 Rövid összefoglaló

A zárt osztályozó a teszt inputot mindig a KK ismert osztály egyikébe sorolja. A nyílt halmazú döntés ezt egy unknown lehetőséggel egészíti ki; az OOD fogalma az input eloszlására vonatkozik. A softmax-konfidencia csak a logitok különbségét tükrözi: a lemmában megmutattuk, hogy margin esetén a maximális konfidencia alsó korlátja 1/(1+(K−1)e−M)1/(1+(K-1)e^{-M}), és a csupa egyes kép ellenpéldája 96,5%96{,}5\% konfidenciát adott értelmetlen inputra. A helyes elutasítási szabályt a validációs ismert halmazon választott τ\tau adja; az OOD kontrollt a rögzített szabállyal, külön értékeljük. Egyetlen zajteszt nem bizonyít OOD-felismerést, csak ellenőrzött protokoll és monitoring adhat megbízható képet.

25.4.10 Következő alkalmazás

A 26.1. Dobozkoordináta, IoU és lokalizációs loss egységben a kép nem egyetlen osztálycímkét, hanem befoglaló dobozokat kap: bevezetjük a dobozkoordinátákat, az IoU-t és a lokalizációs veszteséget.

25.4.11 Források