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 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 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 osztályú modell egy olyan -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.
Legyen a bemeneti tér , a tanulási eloszlás a felhasználási tartomány fölött, a zárt célhalmaz pedig . A GlyphLab esetén 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 ahol egy külön, k-adik osztály. A modell kimenete ekkor logit, vagy a logit mellett egy külön elutasítási mechanizmus.
Out-of-distribution (OOD) input: olyan , amelynek eloszlása , vagy amelyre a tartományon kívül esik. Az OOD nem azonos az 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 logitokból számított illetve a döntési konfidencia 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 konfidencia-küszöbbel egészítjük ki: A 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 tartományon, a megadott bemeneti előfeldolgozással és eloszlással tett állításokra érvényes.
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 , . Ha valamely osztályra akkor
Bizonyítás. A softmax definíciója szerint Minden esetén , tehát . Így amiből a nevező felső becslésével a lemma adódik. A korlát éles: ha minden -ra , akkor a nevező pontosan , tehát pontosan a jobb oldal.
A bizonyítás kizárólag a softmax algebrai tulajdonságán alapul, semmilyen feltételt nem használ tartománybeliségéről. Ebből következik a célzott ellenpélda.
Ellenpélda. Vegyünk egy -es, egycsatornás, tehát bemenetet, amelynek minden pixelértéke : 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 és a logit . Ekkor A margin , a lemma szerint a vertical osztály konfidenciája legalább A pontos softmax:
A modell tehát 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.
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 , a konfidencia -ben van. A numerikus ellenőrzéshez float32 mellett abszolút tolerancia elegendő.
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.
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
logit. A [D07] szerint a tanításkor a CrossEntropyLoss közvetlenül ezt a
logitot kapja, int64 célokkal.seed=20261020
véletlengenerátorral
darab
-es
float32 képet készítünk három csoportban:
corrupted_test.npy itt nem OOD
kontroll, mert ugyanahhoz a jelenethez tartozik; azt páros módon, külön
értékeljük.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ésLehetséges jelölt szemléltető kimenet (nem mért!):
| Mennyiség | Jelölt érték |
|---|---|
| validácion | |
| val coverage | |
| accepted val accuracy | |
| zaj OOD rejection | |
| konstans OOD rejection | |
| sakktábla OOD rejection |
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
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.
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.
Számítsa ki a softmax-konfidenciát a logitvektorra, és ellenőrizze a lemmát , , 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.
Írjon függvényt, amely (N, K) alakú float32 logitokra
kiszámítja a
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.
Az alábbi eljárás hibás: a hallgató a teszt OOD zajképeken kiszámítja a konfidencia-eloszlást, és a küszöböt úgy választja, hogy az OOD rejection 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.
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.
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
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
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
és a
különböző szerződéseit érinti.
A margin , . A lemma alsó korlátja: A pontos érték: A két érték különbsége , ami a lemmának megfelelő éles korlát. Az alakellenőrzés: , ö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.
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
,
a második sor maximális softmax-értéke
,
tehát elutasítás. A shape
,
a -1 nem logit index, hanem az unknown szimbólum.
Szélsőeset:
esetén a >= miatt az 1 konfidencia sem fogadható el; ha
ezt el akarjuk kerülni,
helyett
használható, de a float32 véges pontosság miatt célszerű a
>= konvenciót leírni.
A hiba a küszöb kiválasztási adathalmazának megválasztása. Ha a -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 -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.
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 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 -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.
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 háttérrel, a második háttérrel. A konfidencia-eloszlás a két készleten eltolódhat; az elsőn 0,95 rejection-re hangolt 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 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.
A zárt osztályozó a teszt inputot mindig a
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
,
és a csupa egyes kép ellenpéldája
konfidenciát adott értelmetlen inputra. A helyes elutasítási szabályt a
validációs ismert halmazon választott
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.
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.