Faza 01 · lecția 06

Probabilități și distribuții

Scopul lecției: Tip: Învățare Limbaj: Python Cerințe preliminare: Faza 1, lecțiile 01–04 Durată: ~75 de minute

Versiunea curentă AlexBred.com: primele 100 de lecții ale programului în limba română.

Curs
AI Engineering from Scratch
Fază
Fundamente matematice
Lectură
16 min.
Verificat
Cuprinsul lecției
  1. Obiective de învățare
  2. Problema
  3. Conceptul
  4. Evenimente, spații ale rezultatelor posibile și probabilitate
  5. Probabilitatea condiționată și independența
  6. Funcții de masă și funcții de densitate ale probabilității
  7. Distribuții uzuale
  8. Speranța matematică și varianța
  9. Distribuții comune și marginale
  10. De ce distribuția normală apare pretutindeni
  11. Logaritmii probabilităților
  12. Softmax ca distribuție de probabilitate
  13. Eșantionarea
  14. Construirea soluției
  15. Pasul 1: Noțiuni de bază despre probabilități
  16. Pasul 2: PMF și PDF de la zero
  17. Pasul 3: Speranța matematică și varianța
  18. Pasul 4: Eșantionarea din distribuții
  19. Pasul 5: Softmax și logaritmii probabilităților
  20. Pasul 6: Demonstrarea teoremei limită centrale
  21. Pasul 7: Vizualizarea
  22. Utilizarea soluției
  23. Exerciții
  24. Termeni-cheie
  25. Lecturi suplimentare

Probabilitatea este limbajul prin care IA exprimă incertitudinea.

Tip: Învățare Limbaj: Python Cerințe preliminare: Faza 1, lecțiile 01–04 Durată: ~75 de minute

Obiective de învățare

  • Implementarea de la zero a funcțiilor PMF și PDF pentru distribuțiile Bernoulli, categorială, Poisson, uniformă și normală
  • Calcularea speranței matematice și a varianței și utilizarea teoremei limită centrale pentru a explica de ce distribuțiile gaussiene sunt predominante
  • Construirea funcțiilor softmax și log-softmax cu ajutorul tehnicii de stabilitate numerică bazate pe scăderea celui mai mare logit
  • Calcularea pierderii prin entropie încrucișată pornind de la logituri (engl. logits) și corelarea acesteia cu log-verosimilitatea negativă

Problema

Un clasificator produce [0.03, 0.91, 0.06]. Un model lingvistic alege următorul cuvânt dintre 50.000 de candidați. Un model de difuzie generează imagini prin eșantionarea din distribuții învățate. Toate acestea sunt exemple ale probabilității puse în practică.

Multe predicții ale modelelor sunt distribuții de probabilitate sau parametri ai unor distribuții, iar numeroase funcții de pierdere compară predicțiile cu o distribuție-țintă. Acest lucru nu este valabil pentru orice model și orice funcție de pierdere, dar probabilitățile rămân indispensabile în învățarea automată (machine learning, ML). Fără ele, nu puteți interpreta multe lucrări, depana modele probabilistice sau înțelege unele cauze pentru care pierderea din timpul antrenării devine NaN.

Notă tehnică a traducerii: Originalul afirmă universal că orice predicție este o distribuție și orice pierdere măsoară distanța dintre două distribuții. Formularea a fost restrânsă la cazurile în care această interpretare este corectă.

Conceptul

Evenimente, spații ale rezultatelor posibile și probabilitate

Spațiul rezultatelor posibile S este mulțimea tuturor rezultatelor care pot apărea. Un eveniment este o submulțime a acestui spațiu. Probabilitatea asociază evenimentelor numere cuprinse între 0 și 1.

Aruncarea unei monede:
  S = {H, T}
  P(H) = 0.5,  P(T) = 0.5

O singură aruncare a zarului:
  S = {1, 2, 3, 4, 5, 6}
  P(par) = P({2, 4, 6}) = 3/6 = 0.5

Întreaga teorie a probabilităților este definită de trei axiome:

  1. P(A) >= 0 pentru orice eveniment A
  2. P(S) = 1 (întotdeauna se produce un rezultat)
  3. Pentru orice șir numărabil de evenimente incompatibile două câte două, probabilitatea reuniunii lor este suma probabilităților; în particular, P(A sau B) = P(A) + P(B) când A și B sunt incompatibile

Toate celelalte noțiuni, precum teorema lui Bayes, speranțele matematice și distribuțiile, decurg din aceste trei reguli.

Probabilitatea condiționată și independența

P(A|B) este probabilitatea evenimentului A, cu condiția ca B să se fi produs și P(B) > 0.

Notă tehnică a traducerii: Originalul prezintă numai cazul cu două evenimente al axiomei de aditivitate numărabilă și omite condiția P(B) > 0 pentru probabilitatea condiționată.

P(A|B) = P(A și B) / P(B)

Exemplu: pachet de cărți
  P(Rege | Figură) = P(Rege și Figură) / P(Figură)
                    = (4/52) / (12/52)
                    = 4/12 = 1/3

Două evenimente sunt independente atunci când cunoașterea unuia nu oferă nicio informație despre celălalt:

Independență:  P(A|B) = P(A)
Echivalent cu: P(A și B) = P(A) * P(B)

Aruncările unei monede sunt independente. Extragerea cărților fără revenire nu este.

Funcții de masă și funcții de densitate ale probabilității

Variabilele aleatoare discrete au o funcție de masă a probabilității (probability mass function, PMF). Fiecărui rezultat îi corespunde o probabilitate precisă, care poate fi citită direct.

PMF: P(X = k)

Zar echitabil:
  P(X = 1) = 1/6
  P(X = 2) = 1/6
  ...
  P(X = 6) = 1/6

  Suma tuturor probabilităților = 1

Variabilele aleatoare continue au o funcție de densitate a probabilității (probability density function, PDF). Densitatea într-un singur punct nu reprezintă o probabilitate. Probabilitatea se obține prin integrarea densității pe un interval.

PDF: f(x)

P(a <= X <= b) = integrala lui f(x) de la a la b

f(x) poate fi mai mare decât 1 (densitate, nu probabilitate)
integrala lui f(x) de la -inf la +inf = 1

Această distincție este importantă în ML. Ieșirea softmax a unui clasificator parametrizează funcția PMF a unei distribuții categoriale, deoarece clasele sunt discrete. VAE-urile modelează de regulă variabile latente continue prin funcții de densitate.

Distribuții uzuale

Bernoulli: o încercare, două rezultate. Modelează clasificarea binară.

P(X = 1) = p
P(X = 0) = 1 - p
Media = p,  Varianța = p(1-p)

Categorială: o încercare, k rezultate. Modelează clasificarea cu mai multe clase, a cărei ieșire este softmax.

P(X = i) = p_i,  unde suma valorilor p_i = 1
Exemplu: P(pisică) = 0.7,  P(câine) = 0.2,  P(pasăre) = 0.1

Uniformă: toate rezultatele sunt la fel de probabile. Este utilizată pentru inițializarea aleatorie.

Discretă: P(X = k) = 1/n pentru k din {1, ..., n}
Continuă: f(x) = 1/(b-a) pentru x din [a, b]

Normală (gaussiană): curba în formă de clopot. Este parametrizată prin medie (mu) și varianță (sigma^2).

f(x) = (1 / sqrt(2*pi*sigma^2)) * exp(-(x - mu)^2 / (2*sigma^2))

Normală standard: mu = 0, sigma = 1
  68% dintre date se află în intervalul de 1 sigma
  95% în intervalul de 2 sigma
  99.7% în intervalul de 3 sigma

Poisson: numărul evenimentelor rare dintr-un interval fix. Modelează ratele de apariție ale evenimentelor.

P(X = k) = (lambda^k * e^(-lambda)) / k!
Media = lambda,  Varianța = lambda

Speranța matematică și varianța

Speranța matematică este media ponderată a rezultatelor.

Discretă:  E[X] = suma valorilor x_i * P(X = x_i)
Continuă:  E[X] = integrala lui x * f(x) dx

Varianța, numită și dispersie, măsoară împrăștierea în jurul mediei.

Var(X) = E[(X - E[X])^2] = E[X^2] - (E[X])^2
Abaterea standard = sqrt(Var(X))

În ML, riscul populațional este speranța matematică a pierderii pe distribuția datelor, iar media empirică a pierderii îl aproximează pe un eșantion. Varianța oferă informații despre stabilitatea estimărilor. O varianță ridicată a gradienților înseamnă o antrenare zgomotoasă.

Distribuții comune și marginale

O distribuție comună P(X, Y) descrie simultan două variabile aleatoare.

Exemplu de funcție PMF comună (X = vreme, Y = umbrelă):

Y=0 (fără umbrelă) Y=1 (umbrelă) P(X) marginală
X=0 (soare) 0.40 0.10 P(X=0) = 0.50
X=1 (ploaie) 0.05 0.45 P(X=1) = 0.50
P(Y) marginală P(Y=0) = 0.45 P(Y=1) = 0.55 1.00

Distribuția marginală se obține prin însumarea după cealaltă variabilă:

P(X = x) = suma lui P(X = x, Y = y) peste toate valorile lui y

Totalurile liniilor și coloanelor din tabelul de mai sus sunt distribuțiile marginale.

De ce distribuția normală apare pretutindeni

În forma sa clasică, teorema limită centrală afirmă că suma sau media standardizată a multor variabile aleatoare independente și identic distribuite, cu varianță finită, converge în distribuție către o normală.

Aruncarea unui zar:       distribuție uniformă (plată)
Media a 2 zaruri:         distribuție triunghiulară (cu vârf)
Media a 30 de zaruri:     curbă în formă de clopot aproape perfectă

Rezultatul necesită ipoteze; de exemplu, nu se aplică distribuției Cauchy, care nu are varianță finită.

Din acest motiv:

  • Erorile de măsurare sunt aproximativ normale, fiind produse de numeroase surse independente mici
  • Pentru inițializarea ponderilor rețelelor neuronale se folosesc uneori distribuții normale, ca alegere de proiectare, nu ca o consecință automată a teoremei
  • Zgomotul gradientului în SGD poate fi aproximativ normal când agregarea gradienților satisface ipoteze adecvate
  • Distribuția normală este distribuția cu entropie maximă pentru o medie și o varianță date

Notă tehnică a traducerii: Originalul extinde teorema la orice distribuție inițială și leagă direct inițializarea normală a ponderilor de aceasta. Au fost adăugate ipotezele clasice și a fost separată alegerea inginerească de consecința teoremei.

Logaritmii probabilităților

Probabilitățile exprimate direct produc probleme numerice. Înmulțirea multor probabilități mici conduce în cele din urmă la subdepășire numerică (underflow), adică la rotunjirea valorii la zero.

P(propoziție) = P(cuvânt1) * P(cuvânt2) * ... * P(cuvânt_n)
              = 0.01 * 0.003 * 0.02 * ...
              -> 0.0 după suficient de mulți termeni (pentru 0.01 repetat în double: aproximativ 162)

Logaritmii probabilităților rezolvă această problemă. Înmulțirile devin adunări.

log P(propoziție) = log P(cuvânt1) + log P(cuvânt2) + ... + log P(cuvânt_n)
                  = -4.6 + -5.8 + -3.9 + ...
                  -> număr finit (fără underflow)

Reguli:

  • log(a * b) = log(a) + log(b)
  • Logaritmii probabilităților sunt întotdeauna <= 0, deoarece 0 < P <= 1
  • O valoare mai negativă indică un rezultat mai puțin probabil
  • Pierderea prin entropie încrucișată este opusul logaritmului probabilității clasei corecte

Softmax ca distribuție de probabilitate

Rețelele neuronale produc scoruri brute, numite logituri. Softmax le transformă într-o distribuție de probabilitate validă.

softmax(z_i) = exp(z_i) / suma valorilor exp(z_j) pentru toate valorile j

Proprietăți:
  - Toate ieșirile se află în intervalul (0, 1)
  - Suma tuturor ieșirilor este 1
  - Se păstrează ordinea relativă a intrărilor
  - exp() amplifică diferențele dintre logituri

Tehnica softmax: scădeți cel mai mare logit înainte de exponențiere pentru a preveni depășirea numerică (overflow).

z = [100, 101, 102]
exp(102) produce overflow în float32, dar rămâne finit în float64

z_shifted = z - max(z) = [-2, -1, 0]
exp(0) = 1  (sigur)

Același rezultat matematic, fără overflow în niciunul dintre aceste formate.

Log-softmax combină softmax cu logaritmul pentru a asigura stabilitatea numerică. PyTorch utilizează intern această funcție pentru pierderea prin entropie încrucișată.

Eșantionarea

Eșantionarea înseamnă extragerea aleatorie a unor valori dintr-o distribuție. În ML:

  • Dropout anulează aleatoriu activările unor neuroni
  • Augmentarea datelor aplică transformări alese aleatoriu
  • Modelele lingvistice eșantionează următorul token din distribuția prezisă
  • Modelele de difuzie eșantionează zgomot și îl elimină progresiv

Eșantionarea din distribuții arbitrare necesită tehnici precum eșantionarea prin transformare inversă, eșantionarea prin respingere sau trucul reparametrizării, utilizat în VAE-uri.

gaussian-pdf

Construirea soluției

Pasul 1: Noțiuni de bază despre probabilități

import math
import random

def factorial(n):
    result = 1
    for i in range(2, n + 1):
        result *= i
    return result

def combinations(n, k):
    return factorial(n) // (factorial(k) * factorial(n - k))

def conditional_probability(p_a_and_b, p_b):
    return p_a_and_b / p_b

p_king_given_face = conditional_probability(4/52, 12/52)
print(f"P(King | Face card) = {p_king_given_face:.4f}")

Pasul 2: PMF și PDF de la zero

def bernoulli_pmf(k, p):
    return p if k == 1 else (1 - p)

def categorical_pmf(k, probs):
    return probs[k]

def poisson_pmf(k, lam):
    return (lam ** k) * math.exp(-lam) / factorial(k)

def uniform_pdf(x, a, b):
    if a <= x <= b:
        return 1.0 / (b - a)
    return 0.0

def normal_pdf(x, mu, sigma):
    coeff = 1.0 / (sigma * math.sqrt(2 * math.pi))
    exponent = -0.5 * ((x - mu) / sigma) ** 2
    return coeff * math.exp(exponent)

Notă tehnică a traducerii: Implementarea originală a funcției bernoulli_pmf întoarce 1 - p pentru orice k != 1, inclusiv pentru valori din afara suportului {0, 1}. Ramura corectă este p if k == 1 else (1 - p if k == 0 else 0.0).

Pasul 3: Speranța matematică și varianța

def expected_value(values, probabilities):
    return sum(v * p for v, p in zip(values, probabilities))

def variance(values, probabilities):
    mu = expected_value(values, probabilities)
    return sum(p * (v - mu) ** 2 for v, p in zip(values, probabilities))

die_values = [1, 2, 3, 4, 5, 6]
die_probs = [1/6] * 6
mu = expected_value(die_values, die_probs)
var = variance(die_values, die_probs)
print(f"Die: E[X] = {mu:.4f}, Var(X) = {var:.4f}, SD = {var**0.5:.4f}")

Pasul 4: Eșantionarea din distribuții

def sample_bernoulli(p, n=1):
    return [1 if random.random() < p else 0 for _ in range(n)]

def sample_categorical(probs, n=1):
    cumulative = []
    total = 0
    for p in probs:
        total += p
        cumulative.append(total)
    samples = []
    for _ in range(n):
        r = random.random()
        for i, c in enumerate(cumulative):
            if r <= c:
                samples.append(i)
                break
    return samples

def sample_normal_box_muller(mu, sigma, n=1):
    samples = []
    for _ in range(n):
        u1 = random.random()
        u2 = random.random()
        z = math.sqrt(-2 * math.log(u1)) * math.cos(2 * math.pi * u2)
        samples.append(mu + sigma * z)
    return samples

Notă tehnică a traducerii: random.random() poate întoarce 0.0, caz în care log(u1) nu este definit. O alegere sigură pentru Box–Muller este u1 = 1.0 - random.random(), care produce valori în intervalul (0, 1].

Pasul 5: Softmax și logaritmii probabilităților

def softmax(logits):
    max_logit = max(logits)
    shifted = [z - max_logit for z in logits]
    exps = [math.exp(z) for z in shifted]
    total = sum(exps)
    return [e / total for e in exps]

def log_softmax(logits):
    max_logit = max(logits)
    shifted = [z - max_logit for z in logits]
    log_sum_exp = max_logit + math.log(sum(math.exp(z) for z in shifted))
    return [z - log_sum_exp for z in logits]

def cross_entropy_loss(logits, target_index):
    log_probs = log_softmax(logits)
    return -log_probs[target_index]

Pasul 6: Demonstrarea teoremei limită centrale

def demonstrate_clt(dist_fn, n_samples, n_averages):
    averages = []
    for _ in range(n_averages):
        samples = [dist_fn() for _ in range(n_samples)]
        averages.append(sum(samples) / len(samples))
    return averages

Pasul 7: Vizualizarea

import matplotlib.pyplot as plt

xs = [mu + sigma * (i - 500) / 100 for i in range(1001)]
ys = [normal_pdf(x, mu, sigma) for x, mu, sigma in ...]
plt.plot(xs, ys)

Notă tehnică a traducerii: Blocul original nu poate fi executat ca atare: mu și sigma nu sunt definite, iar ... nu furnizează triple iterabile. O variantă minimală definește mu, sigma = 0.0, 1.0, apoi ys = [normal_pdf(x, mu, sigma) for x in xs].

Implementările complete, împreună cu toate vizualizările, se află în code/probability.py.

Utilizarea soluției

Cu NumPy și SciPy, toate operațiile de mai sus pot fi exprimate într-o singură linie:

import numpy as np
from scipy import stats

normal = stats.norm(loc=0, scale=1)
samples = normal.rvs(size=10000)
print(f"Mean: {np.mean(samples):.4f}, Std: {np.std(samples):.4f}")
print(f"P(X < 1.96) = {normal.cdf(1.96):.4f}")

logits = np.array([2.0, 1.0, 0.1])
from scipy.special import softmax, log_softmax
probs = softmax(logits)
log_probs = log_softmax(logits)
print(f"Softmax: {probs}")
print(f"Log-softmax: {log_probs}")

Ați construit aceste funcții de la zero. Acum știți ce fac apelurile bibliotecilor.

Exerciții

  1. Implementați eșantionarea prin transformare inversă pentru distribuția exponențială. Verificați rezultatul prin eșantionarea a 10.000 de valori și compararea histogramei cu funcția PDF reală.

  2. Construiți un tabel al distribuției comune pentru două zaruri măsluite. Calculați distribuțiile marginale și verificați dacă zarurile sunt independente.

  3. Calculați pierderea prin entropie încrucișată pentru un clasificator cu cinci clase, care produce logiturile [2.0, 0.5, -1.0, 3.0, 0.1], atunci când clasa corectă are indicele 3. Apoi verificați rezultatul cu nn.CrossEntropyLoss din PyTorch.

  4. Scrieți o funcție care primește o listă ce conține logaritmii probabilităților și returnează secvența cea mai probabilă, logaritmul probabilității totale și probabilitatea directă echivalentă. Testați-o cu o propoziție de 50 de cuvinte, fiecare cu probabilitatea 0.01.

Termeni-cheie

Termen Formulare uzuală Ce înseamnă de fapt
Spațiul rezultatelor posibile „Toate posibilitățile” Mulțimea S a tuturor rezultatelor posibile ale unui experiment
PMF „Funcția de probabilitate” O funcție care oferă probabilitatea exactă a fiecărui rezultat discret, iar suma valorilor sale este 1
PDF „Curba probabilității” O funcție de densitate pentru variabile continue. Integrați-o pe un interval pentru a obține probabilitatea.
Probabilitate condiționată „Probabilitatea în anumite condiții” P(A|B) = P(A și B) / P(B). Reprezintă baza raționamentului bayesian și a teoremei lui Bayes.
Independență „Nu se influențează reciproc” P(A și B) = P(A) * P(B). Cunoașterea unui eveniment nu vă oferă nicio informație despre celălalt.
Speranță matematică „Media” Suma tuturor rezultatelor, ponderate cu probabilitățile lor. Funcția de pierdere este o speranță matematică.
Varianță „Gradul de împrăștiere” Speranța matematică a pătratului abaterii de la medie. Varianță ridicată = estimări zgomotoase și instabile.
Distribuție normală „Curba în formă de clopot” f(x) = (1/sqrt(2pisigma^2)) * exp(-(x-mu)^2/(2*sigma^2)). Apare frecvent, inclusiv în situații care satisfac ipotezele teoremei limită centrale.
Teorema limită centrală „Mediile devin normale” Media standardizată a multor variabile independente și identic distribuite, cu varianță finită, converge în distribuție către o normală.
Distribuție comună „Două variabile împreună” P(X, Y) descrie probabilitatea fiecărei combinații de rezultate ale variabilelor X și Y.
Distribuție marginală „Însumați după cealaltă variabilă” P(X) = sum_y P(X, Y). Recuperează distribuția unei variabile din distribuția comună.
Logaritmul probabilității „Logaritmul probabilității” log P(x). Transformă produsele în sume și previne subdepășirea numerică în secvențe lungi.
Softmax „Transformarea scorurilor în probabilități” softmax(z_i) = exp(z_i) / sum(exp(z_j)). Transformă logituri cu valori reale într-o distribuție de probabilitate validă.
Entropie încrucișată „Funcția de pierdere” H(p, q) = -sum(p * log(q)) = H(p) + KL(p
Logituri „Ieșirile brute ale modelului” Scoruri nenormalizate înainte de softmax. Numele provine de la funcția logistică.
Eșantionare „Extragerea unor valori aleatorii” Generarea valorilor conform unei distribuții de probabilitate. Aceasta este una dintre modalitățile prin care modelele generează ieșiri.

Lecturi suplimentare


Sursă: Probability and Distributions — originalul Navigare: înapoi: 01.05 — Regula lanțului și diferențierea automată · Faza 1 — Fundamente matematice · Catalog complet · în continuare: 01.07 — Teorema lui Bayes.