Ez az alfejezet a diszkrét valószínűségi vektorok három alapvető információelméleti mennyiségét, az entrópiát, a cross-entropy-t és a Kullback–Leibler-divergenciát (KL) vezeti be. A cél, hogy a hallgató pontosan számolni tudjon, értse a support szerepét, és felkészüljön a következő alfejezetben tárgyalt, logitsból számolt osztályozási veszteségre.
Előismeret a 3.1. Vektor, norma és skalárszorzat vektor- és távolságfogalma, az 5.4. Függő képek, seedek és resampling statisztikai egységek kezelése és a 6.1. Objektív, reguláris tag és gradienslépés batch-átlag/reduction konvenciója. A 6.4. Momentum és adaptív optimizálók optimalizálóból tudjuk, hogy a gradienslépés célfüggvényt csökkent; itt azt alapozzuk meg, hogy a veszteség mit mér valószínűségi értelemben.
Induló kérdés. Egy háromosztályos feladatban az igaz címke one-hot eloszlása . Két modell és eloszlást ad. nyilván jobb, de mennyivel? A természetes logaritmussal nat, míg nat: a rosszabb, mint , és a különbség nagyobb, mint a nyers sugallja.
Diszkrét valószínűségi vektor. Legyen egész. A vektor valószínűségi vektor, ha
Batchelt alakban , ahol minden sor egy-egy valószínűségi vektor; ebben az alfejezetben egyetlen sorral dolgozunk.
Support. A valószínűségi vektor supportja (tartóhalmaza) azon indexek halmaza, ahol pozitív a tömeg:
Entrópia. A valószínűségi vektor entrópiája
ahol a természetes logaritmus (natural logarithm), az egység pedig nat. A tagot a -val azonosítjuk, mert . Az entrópia a bizonytalanság mértéke: pontosan akkor, ha egyetlen kimenetelre koncentrálódik, a maximum pedig az egyenletes eloszlásnál áll elő. Az utóbbi következik a KL nemnegativitásából, ha : .
Cross-entropy. Két valószínűségi vektor, és esetén a célhoz és predikcióhoz tartozó cross-entropy
a konvencióval a tagokra. Ha valamely -re és , akkor ; ezt a support-csapdát később külön elemezzük. Az első argumentum a megfigyelt vagy cél-eloszlás, a második a modell által adott eloszlás.
KL-divergencia. Ugyanazon feltételekkel
ahol a tagok nullák. A KL a és eloszlások közötti, irányított információnövekmény; nem szimmetrikus általában, és nem metrikus távolság. Egysége szintén nat, ha természetes logaritmust használunk.
Tétel (a cross-entropy entrópia–KL felbontása). Legyenek valószínűségi vektorok. A fenti konvenciókkal
A három mennyiség pontosan akkor véges egyidejűleg, ha .
Bizonyítás. A definíciókat behelyettesítve:
A második egyenlőségnél tagként adtunk hozzá és vontunk ki -t. A tagok a konvenció miatt nem járulnak hozzá. A véges-értékű feltételhez: mindig véges, mert véges sok tag összege. A cross-entropy és a KL pontosan akkor véges, ha nincs olyan , amelyre és , vagyis . Ha a tartalmazás sérül, akkor és , az egyenlőség pedig a kiterjesztett valós számokon fennáll; a szokásos gyakorlati esetben azonban a véges feltételt követeljük meg.
A nemnegativitás külön is indokolható a elemi egyenlőtlenségből, amely minden -ra igaz, egyenlőséggel csak -ben. Ha a support feltétel teljesül, minden -re , ezért
Az utolsó lépésben , a tartón kívüli része pedig nemnegatív, ezért . A tartalmazás nem jelenti, hogy a tartóján kívül nulla, ezért ez az összeg általában kisebb -nél: például , mellett , míg .
Ebből az is következik, hogy minden support-feltételt teljesítő -ra. Egyenlőség, , pontosan akkor áll, ha a lánc mindkét egyenlőtlensége egyenlőség: a egyenlőtlenség minden tagra, vagyis , tehát a tartóján; és , vagyis a tartón kívül nulla. A kettő együtt , és fordítva esetén nyilván .
Legyen , és . Először az entrópia:
A cross-entropy:
A KL a tételből . Közvetlenül:
ami a kerekítési hibán belül egyezik.
Az alábbi minimális Python-munkamenet NumPy-ben számol. Nincs
véletlen mintavétel, ezért seed nem szükséges; a determinisztikus
képletek és a rögzített tömbök adják a reprodukálhatóságot. A dtype
float64, a device pedig CPU, mert a NumPy ebben a laborban
nem használ gyorsítóabsztrakciót.
# lab/n025_entropy_lab.py
import numpy as np
DTYPE = np.float64
# DEVICE = "CPU" (NumPy, nincs külön eszközkezelés)
def entropy(p):
p = np.asarray(p, dtype=DTYPE)
return -np.sum(np.where(p > 0, p * np.log(p), 0.0))
def cross_entropy(p, q):
p = np.asarray(p, dtype=DTYPE)
q = np.asarray(q, dtype=DTYPE)
return -np.sum(np.where(p > 0, p * np.log(q), 0.0))
def kl_divergence(p, q):
p = np.asarray(p, dtype=DTYPE)
q = np.asarray(q, dtype=DTYPE)
if np.any((p > 0) & (q == 0)):
return np.inf
return np.sum(np.where(p > 0, p * np.log(p / q), 0.0))
# 1) Nemszimmetria
p = np.array([0.2, 0.8], dtype=DTYPE)
q = np.array([0.7, 0.3], dtype=DTYPE)
kl_pq = kl_divergence(p, q)
kl_qp = kl_divergence(q, p)
print(f"KL(p||q) = {kl_pq:.9f}")
print(f"KL(q||p) = {kl_qp:.9f}")
print(f"kulonbseg = {abs(kl_pq - kl_qp):.9f}")
# 2) Support-csapda: supp(p) ⊆ supp(q), de nem fordítva
p = np.array([0.5, 0.0, 0.5], dtype=DTYPE)
q = np.array([0.4, 0.3, 0.3], dtype=DTYPE)
print(f"KL(p||q) = {kl_divergence(p, q):.9f}")
print(f"KL(q||p) = {kl_divergence(q, p)}")
# Ellenőrzés a tételre
print(f"H(p,q)-H(p) = {cross_entropy(p, q) - entropy(p):.9f}")Futtatás a lab munkakönyvtárból:
python n025_entropy_lab.pyA várt kimenet szemléltetése (a kód által számolt érték):
KL(p||q) = 0.534082485
KL(q||p) = 0.582584342
kulonbseg = 0.048501857
KL(p||q) = 0.366985341
KL(q||p) = inf
H(p,q)-H(p) = 0.366985341
Értelmezés. Az első esetben a két irányú KL érték különbözik, tehát a KL nem szimmetrikus. A második esetben , míg , ezért a felőli irány véges, a felőli irány viszont végtelen, mert , de . A harmadik sor a levezetett tételt numerikusan ellenőrzi: a cross-entropy és az entrópia különbsége egyenlő a KL-lel.
F1 (fogalmi, nehézség 1). Definiálja a support fogalmát, és magyarázza el, miért éppen a feltétel garantálja a végességét. Adjon -re olyan párt, amelyre az egyik irány véges, a másik végtelen.
F2 (levezetési, nehézség 1). Legyen és . Számolja ki négy tizedesjegyre , , , , és értékét, majd ellenőrizze a felbontási tételt mindkét irányban.
F3 (implementációs, nehézség 2). Írjon
Python-függvényt, amely két
hosszú tömböt fogad, ellenőrzi, hogy elemeik nemnegatívak és összegük 1,
majd visszaadja a három mennyiséget. A függvény jelezze a
support-csapdát: ha
és
,
a cross-entropy és a KL legyen inf. Tesztelje
,
bemenettel.
F4 (hibakeresési, nehézség 2). A következő kód a cross-entropy kiszámítására készült:
def ce(p, q):
return -np.mean(p * np.log(q))Magyarázza el, miért hibás ez a függvény az , bemenetre, és lokalizálja a hibák okát, következményét és javítását. Ellenőrizze a javított változatot a megadott bemeneten.
F5 (kísérleti/transzfer, nehézség 3). Egy kalibrációs kísérletben három modell ugyanazon darab, független jelenetből származó tesztpéldára eloszlást ad, a cél pedig one-hot vektor. Tervezzen protokollt annak eldöntésére, melyik modell célhoz legközelebbi eloszlást ad: adja meg a megfigyelési egységet, a pontozófüggvényt, a csoportos kiértékelés indokát az 5.4. Függő képek, seedek és resampling tapasztalata alapján, és azt, miért nem a szimmetrizált KL-t választja elsődleges veszteségnek. A következtetési korlátot is nevezze meg.
F1 megoldás. A support a pozitív valószínűségű indexek halmaza: . Ha és , akkor a tag miatt a KL végtelen; ha minden indexre , a tagok végesek, és véges sok tag összege véges. Példa -re: , . Ekkor , ezért ; viszont véges, mert .
F2 megoldás. . Ellenőrzés: ; . A négy tizedesjegyre kerekített eltérés a közbenső kerekítésből adódik.
F3 megoldás.
import numpy as np
def info_measures(p, q, tol=1e-12):
p = np.asarray(p, dtype=np.float64)
q = np.asarray(q, dtype=np.float64)
assert p.ndim == q.ndim == 1 and p.shape == q.shape
assert np.all(p >= 0) and np.all(q >= 0)
assert abs(p.sum() - 1.0) < tol and abs(q.sum() - 1.0) < tol
H = -np.sum(np.where(p > 0, p * np.log(p), 0.0))
ce = -np.sum(np.where(p > 0, p * np.log(q), 0.0))
kl = ce - H
if np.any((p > 0) & (q == 0)):
ce = np.inf
kl = np.inf
return H, ce, kl
p = np.array([0.5, 0.0, 0.5])
q = np.array([0.4, 0.3, 0.3])
print(info_measures(p, q))
# Várható: (0.6931471805599453, 1.060132521889987, 0.3669853413300417)F4 megoldás. Három hiba van. (1) A
np.mean a sum helyett átlagol, ezért a
hosszú vektorra a helyes összeg
-szorosát
adná; ez a batch-reduction félreértése, hasonlóan a 6.1. Objektív, reguláris tag és gradienslépés
alfejezetben tárgyalt mean/sum megkülönböztetéshez. (2) A
tagokra
lehet nan, ha
;
a konvenció szerint ezeket a tagokat nullának kell venni. (3) Ha
és
,
a függvény inf-et ad, de a np.mean miatt az
inf átlagolása elfedi, melyik koordináta okozza a
problémát. A javított függvény a laborban szereplő
cross_entropy, amely
np.where(p > 0, ...)-rel kezeli a nulla tagokat,
összeget számol, és a support-csapdát inf-fel jelzi. A
megadott bemenetre
,
:
a harmadik koordinátán
és
,
ezért
;
a
tag nulla, a második tag
,
de az összeg a végtelen miatt inf.
F5 megoldásminta. A megfigyelési egység a jelenet
(scene_id), nem az egyes kép, mert a GlyphLab-szerződés
szerint ugyanazon jelenet nézetei korrelálnak. A pontozófüggvény a
jelenetenkénti átlagos cross-entropy:
ahol a one-hot cél, a modell predikciója. A modellválasztásnál a legalacsonyabb a cél, de a bizonytalanság becslésére jelenetalapú bootstrapet használunk, nem képenkéntit. A szimmetrizált KL-t azért nem választjuk elsődleges veszteségnek, mert a tanulási cél aszimmetrikus: a modell eloszlását büntetjük a megfigyelt célhoz képest, a irány a nem megfigyelt eseményekre más súlyt helyezne, és a support-csapda iránya is megfordulna. A korlát: a tesztjelenetek kis száma és a procedurális adat miatt az eredmény nem általánosítható valós képi vagy termelési feladatra.
Tévedés. „A KL-divergencia távolság, ezért szimmetrikus.” Ez hamis. A 3.1. Vektor, norma és skalárszorzat alfejezetben a metrikus távolság három tulajdonságát láttuk; a KL a szimmetriát sérti. A labor első esetében . Másik gyakori tévedés, hogy ; valójában , mert .
Önellenőrzés. Adott vektorokra ellenőrizze, hogy (1) az elemek nemnegatívak és összegük 1; (2) a support-feltétel teljesül-e; (3) a számítás a konvenciót használja-e; (4) a cross-entropy és az entrópia különbsége valóban a KL-t adja-e.
Visszahívás. A 6.1. Objektív, reguláris tag és gradienslépés alfejezetben a batch-átlag reduction a gradiens skáláját is meghatározta; itt a cross-entropy batch-átlaga ugyanígy viselkedik. A 6.4. Momentum és adaptív optimizálók alfejezetben látott frissítési szabályok ezt a célfüggvényt fogják csökkenteni; a KL nemszimmetriája pedig a modellválasztási irányt rögzíti.
A diszkrét valószínűségi vektor entrópiája a bizonytalanságot méri, a cross-entropy a cél- és predikciós eloszlás közötti átlagos negatív log-valószínűséget, a KL-divergencia pedig a kettő irányított eltérését. A három mennyiségre fennáll a felbontás; mindhárom pontosan akkor véges, ha . A KL nemnegatív, de nem szimmetrikus és nem metrikus távolság. A nullás support-csapdát a , eset okozza, amely végtelen cross-entropy-t és KL-t ad. A labor ezt két kis eloszláson numerikusan is ellenőrizte.
A 7.2. Softmax és többosztályos cross-entropy
alfejezetben a többosztályos softmax és a logits-alapú cross-entropy
következik, ahol a modell kimenete nem feltétlenül normalizált, és a
numerikus stabilitás miatt a softmax és a logaritmus együttes
implementálása kerül előtérbe; a [D07] szerint a PyTorch
CrossEntropyLoss logits bemenetet vár int64
célindexszel.