Wprowadzenie: Informacje pomiarowe
La teoria informacji, założona przez Claude'a Shannona w 1948 roku, zapewnia nam narzędzia aby określić ilościowo niepewność, zmierzyć ilość informacji zawartej w komunikacie, np ocenić, jak dobrze model jest zbliżony do rzeczywistości. W uczeniu maszynowym pojawiają się te pojęcia wszędzie: entropia krzyżowa oraz domyślną funkcję straty dla klasyfikacji, the Rozbieżność KL oraz w sercu VAE i destylacji wiedzy.
Czego się nauczysz
- Treść informacyjna: niespodzianka jako -log(p)
- Entropia: miara niepewności rozkładu
- Entropia krzyżowa: najczęściej stosowana strata do klasyfikacji
- Dywergencja KL: asymetryczna odległość między rozkładami
- Wzajemna informacja: zależność między zmiennymi
- Perplexity i jego powiązania z modelami językowymi
Treść informacyjna: Niespodzianka
L'treść informacyjna (lub samoinformacja) o zdarzeniu z prawdopodobieństwem p mierzy, jak „zaskakujące” jest to wydarzenie:
Intuicja: bardzo prawdopodobne zdarzenie (P \\około 1) niesie ze sobą niewiele informacji (niskie zaskoczenie). Rzadkie wydarzenie (P \\około 0) przynosi wiele informacji (duże zaskoczenie). Jednostką o podstawie 2 jest fragment: jeden kawałek oraz ilość informacji o uczciwym rzucie monetą.
Entropia: średnia niepewność
L'entropia oraz oczekiwaną wartość treści informacyjnej, tj średnie zaskoczenie dystrybucji:
Do ciągłego wdrażania:
Podstawowe właściwości:
- H(X) \\geq 0 zawsze (niepewność nigdy nie jest ujemna)
- H(X) = 0 tylko jeśli X i deterministyczne (pojedyncze zdarzenie ma prawdopodobieństwo 1)
- H(X) i maksimum dla rozkładu równomiernego (maksymalna niepewność)
Przykład: za uczciwą monetę (P(T) = P(C) = 0,5), entropia tj H = -0,5\\log_2(0,5) - 0,5\\log_2(0,5) = 1 fragment. Za sfałszowaną monetę z P(T) = 0,99, entropia wynosi około 0,08 bitu: prawie żadnej niepewności, prawie zawsze znamy wynik.
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")
Entropia krzyżowa: utrata klasyfikacji
La entropia krzyżowa pomiędzy rozkładem rzeczywistym p i rozkład przewidywany przez model q zmierzyć, ile bitów jest potrzebnych średnio do kodowania danych p za pomocą optymalny kod dla q:
W klasyfikacji p i dystrybucja docelowa (jedno-gorąca) e q i wyjście softmax. Dla pojedynczej próbki z etykietą y (jeden gorący) i przewidywanie \\kapelusz{y}:
W przypadku klasyfikacji binarnej upraszcza to binarna entropia krzyżowa:
Podstawowe połączenie: minimalizowanie entropii krzyżowej jest równoważne zmaksymalizować prawdopodobieństwo logu modelu. To wyjaśnia, dlaczego entropia krzyżowa i naturalna strata dla klasyfikacji: szukamy modelu, który przypisuje maksimum prawdopodobieństwo do obserwowanych danych.
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}")
Rozbieżność KL: Odległość między rozkładami
La Rozbieżność KL (Kullback-Leibler) mierzy, jaki jest rozkład q różni się od rozkładu referencyjnego p:
Ważne właściwości:
- D_{\\text{KL}}(p \\| q) \\geq 0 zawsze (nierówność Gibbsa)
- D_{\\text{KL}}(p \\| q) = 0 wtedy i tylko wtedy p = q
- To nie jest symetryczne: D_{\\text{KL}}(p \\| q) \\neq D_{\\text{KL}}(q \\| p)
Związek H(p, q) = H(p) + D_{\\text{KL}}(p \\| q) nam to mówi entropia krzyżowa i entropia p plus rozbieżność KL. O ile H(p) i stała (niezależna od modelu), zminimalizować entropia krzyżowa jest równoważna minimalizacji rozbieżności KL.
Rozbieżność KL w VAE
Nei Autoenkodery wariacyjne, strata obejmuje składnik rozbieżności KL, który wymusza rozkład utajony zbliżony do standardowego Gaussa:
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}")
Wzajemne informacje
La wzajemne informacje mierzy, ile informacji ma zmienna losowa zapewnia na innym:
Se Ja(X; Y) = 0, zmienne są niezależne. W ML, wzajemne informacje i wykorzystywane do: wybór funkcji (wybierz funkcje najbardziej informacyjne), ocena klastrów i jako cel wStrata InfoNCE uczenia się kontrastowego.
Zakłopotanie: ocena wzorców językowych
La zakłopotanie oraz standardowa metryka do oceny modeli językowych. I zdefiniowany jako wykładniczy średniej entropii krzyżowej na token:
Zakłopotanie k oznacza, że średnio model e „zdezorientowany”, jakby musiał jednolicie wybierać pomiędzy k opcje na każdym kroku. Im mniejsza złożoność, tym lepszy model.
Podsumowanie i powiązania z ML
Kluczowe punkty do zapamiętania
- Entropia H(X): mierzy niepewność, maksimum dla rozkładu równomiernego
- Entropia krzyżowa H(p,q): strata standardowa dla klasyfikacji
- Rozbieżność KL: odległość (asymetryczna) pomiędzy rozkładami, stosowana w VAE
- Minimalizuj entropię krzyżową = maksymalizuj logarytm wiarygodności = minimalizuj KL
- Wzajemne informacje: miara zależności, stosowana w selekcji cech i uczeniu kontrastowym
- Zakłopotanie: standardowa metryka dla modeli językowych, im niższa, tym lepsza
W następnym artykule:Będziemy badać PCA i redukcja wymiarowa. Zobaczymy, jak macierz kowariancji, wektory własne i SVD pozwalają nam kompresować dane przechowując większość informacji.







