Úvod: Informace o měření
La informační teorie, kterou založil Claude Shannon v roce 1948, nám dává nástroje e. pro kvantifikaci nejistoty, měření množství informací obsažených ve zprávě; vyhodnotit, jak dobře se model přibližuje skutečnosti. Ve strojovém učení se tyto pojmy objevují všude: křížová entropie a standardní ztrátová funkce pro klasifikaci, a KL divergence a v srdci VAE a znalostní destilace.
Co se naučíte
- Informační obsah: překvapení jako -log(p)
- Entropie: míra nejistoty rozdělení
- Křížová entropie: nejpoužívanější ztráta pro klasifikaci
- KL divergence: asymetrická vzdálenost mezi distribucemi
- Vzájemná informace: závislost mezi proměnnými
- Zmatenost a její souvislosti s jazykovými modely
Informační obsah: Překvapení
L'informační obsah (nebo sebeinformace) události s pravděpodobností p měří, jak „překvapivá“ událost je:
Intuice: velmi pravděpodobná událost (P \\cca 1) nese málo informací (nízké překvapení). Vzácná událost (P \\cca 0) přináší mnoho informací (velké překvapení). Jednotkou v základně 2 je bit: jeden kousek a množství informací spravedlivého hodu mincí.
Entropie: Průměrná nejistota
L'entropie a očekávanou hodnotu informačního obsahu, tj střední překvapení distribuce:
Pro nepřetržité nasazení:
Základní vlastnosti:
- H(X) \\geq 0 vždy (nejistota není nikdy negativní)
- H(X) = 0 pouze pokud X a deterministický (jedna událost má pravděpodobnost 1)
- H(X) a maximum pro rovnoměrné rozdělení (maximální nejistota)
Příklad: za slušnou minci (P(T) = P(C) = 0,5), entropie e H = -0,5\\log_2(0,5) - 0,5\\log_2(0,5) = 1 bit. Za zmanipulovanou minci s P(T) = 0,99, entropie je asi 0,08 bitu: téměř žádná nejistota, téměř vždy známe výsledek.
import numpy as np
def entropy(probs):
"""Calcola entropia in bit (log base 2)."""
probs = np.array(probs)
probs = probs[probs > 0] # Evita log(0)
return -np.sum(probs * np.log2(probs))
# Moneta equa
print(f"Moneta equa: H = {entropy([0.5, 0.5]):.4f} bit")
# Moneta truccata
print(f"Moneta truccata (0.99): H = {entropy([0.99, 0.01]):.4f} bit")
# Dado a 6 facce (uniforme)
print(f"Dado equo: H = {entropy([1/6]*6):.4f} bit")
# Dado truccato (3 esce il 50%)
probs_loaded = [0.1, 0.1, 0.5, 0.1, 0.1, 0.1]
print(f"Dado truccato: H = {entropy(probs_loaded):.4f} bit")
Křížová entropie: Ztráta klasifikace
La křížová entropie mezi skutečnou distribucí p a distribuce předpovězené modelem q změřte, kolik bitů je potřeba v průměru pro kódování dat p pomocí optimální kód pro q:
V klasifikaci, p a cílové rozdělení (one-hot) e q a výstup softmax. Pro jeden vzorek s etiketou y (one-hot) a předpověď \\klobouk{y}:
Pro binární klasifikaci se zjednodušuje na binární křížová entropie:
Zásadní spojení: minimalizace křížové entropie je ekvivalentní maximalizovat log-pravděpodobnost modelu. To vysvětluje, proč křížová entropie a přirozená ztráta pro klasifikaci: hledáme model, který přiřadí maximum pravděpodobnost k pozorovaným údajům.
import numpy as np
def cross_entropy(p, q):
"""Cross-entropy H(p, q) usando logaritmo naturale."""
q = np.clip(q, 1e-15, 1 - 1e-15) # Evita log(0)
return -np.sum(p * np.log(q))
def binary_cross_entropy(y_true, y_pred):
"""Binary cross-entropy per un singolo campione."""
y_pred = np.clip(y_pred, 1e-15, 1 - 1e-15)
return -(y_true * np.log(y_pred) + (1 - y_true) * np.log(1 - y_pred))
# Classificazione a 3 classi
y_true = np.array([0, 0, 1]) # Classe 3
# Predizione buona
y_pred_good = np.array([0.05, 0.05, 0.90])
print(f"Buona predizione: CE = {cross_entropy(y_true, y_pred_good):.4f}")
# Predizione mediocre
y_pred_mid = np.array([0.2, 0.3, 0.5])
print(f"Predizione media: CE = {cross_entropy(y_true, y_pred_mid):.4f}")
# Predizione sbagliata
y_pred_bad = np.array([0.7, 0.2, 0.1])
print(f"Predizione errata: CE = {cross_entropy(y_true, y_pred_bad):.4f}")
# Binary cross-entropy
print(f"\nBCE(y=1, pred=0.9) = {binary_cross_entropy(1, 0.9):.4f}")
print(f"BCE(y=1, pred=0.5) = {binary_cross_entropy(1, 0.5):.4f}")
print(f"BCE(y=1, pred=0.1) = {binary_cross_entropy(1, 0.1):.4f}")
KL Divergence: Vzdálenost mezi distribucemi
La KL divergence (Kullback-Leibler) měří, jak moc je distribuce q se liší od referenční distribuce p:
Důležité vlastnosti:
- D_{\\text{KL}}(p \\| q) \\geq 0 vždy (Gibbsova nerovnost)
- D_{\\text{KL}}(p \\| q) = 0 tehdy a jen tehdy p = q
- Není symetrický: D_{\\text{KL}}(p \\| q) \\neq D_{\\text{KL}}(q \\| p)
Vztah H(p, q) = H(p) + D_{\\text{KL}}(p \\| q) nám to říká křížová entropie a entropie p plus divergence KL. Pokud H(p) a konstantní (nezávisí na modelu), minimalizovat zkřížená entropie je ekvivalentní minimalizaci KL divergence.
Divergence KL u VAE
Nei Variační automatické kodéry, ztráta zahrnuje KL divergenční člen, který nutí latentní distribuci, aby se blížila standardnímu Gaussovu:
import numpy as np
def kl_divergence(p, q):
"""KL divergence D_KL(p || q)."""
p = np.array(p, dtype=float)
q = np.array(q, dtype=float)
mask = p > 0
return np.sum(p[mask] * np.log(p[mask] / q[mask]))
# Due distribuzioni su 4 classi
p = np.array([0.25, 0.25, 0.25, 0.25]) # Uniforme
q1 = np.array([0.3, 0.2, 0.3, 0.2]) # Leggermente diversa
q2 = np.array([0.9, 0.03, 0.04, 0.03]) # Molto diversa
print(f"KL(p || q1) = {kl_divergence(p, q1):.6f}")
print(f"KL(p || q2) = {kl_divergence(p, q2):.6f}")
# Asimmetria della KL
print(f"\nKL(p || q1) = {kl_divergence(p, q1):.6f}")
print(f"KL(q1 || p) = {kl_divergence(q1, p):.6f}")
# KL per VAE (Gaussiana vs standard normal)
def kl_gaussian(mu, log_var):
"""KL divergence tra N(mu, sigma^2) e N(0, 1)."""
return -0.5 * np.sum(1 + log_var - mu**2 - np.exp(log_var))
mu = np.array([0.5, -0.3, 0.1])
log_var = np.array([-0.5, 0.2, -0.1])
print(f"\nKL(N(mu,sigma^2) || N(0,1)) = {kl_gaussian(mu, log_var):.4f}")
Vzájemné informace
La vzájemná informovanost měří, kolik informací má náhodná proměnná poskytuje na jiném:
Se I(X; Y) = 0, proměnné jsou nezávislé. V ML je vzájemná informace a používá se pro: výběr funkcí (vyberte nejinformativnější funkce), hodnocení shlukování, a jako cíl vZtráta InfoNCE kontrastivního učení.
Zmatenost: Vyhodnocování jazykových vzorů
La zmatek a standardní metrika pro hodnocení jazykových modelů. A definován jako exponenciála průměrné křížové entropie na token:
Zmatek z k znamená, že v průměru model e „zmatený“, jako by si měl jednotně vybrat mezi k možnosti na každém kroku. Čím menší zmatek, tím lepší model.
Souhrn a souvislosti s ML
Klíčové body k zapamatování
- Entropie H(X): měří nejistotu, maximum pro rovnoměrné rozložení
- Křížová entropie H(p,q): standardní ztráta pro klasifikaci
- KL divergence: vzdálenost (asymetrická) mezi rozvody, používaná ve VAE
- Minimalizovat křížovou entropii = maximalizovat logaritmickou pravděpodobnost = minimalizovat KL
- Vzájemné informace: míra závislosti, používaná při výběru rysů a kontrastivním učení
- Zmatek: standardní metrika pro jazykové modely, čím nižší, tím lepší a
V dalším článku: Prozkoumáme PCA a rozměrová redukce. Uvidíme, jak nám kovarianční matice, vlastní vektory a SVD umožní komprimovat data uchovává většinu informací.







