Bayesovské sítě: proč je tráva mokrá a co z toho plyne pro postřikovač
Sdružené rozdělení a jeho faktorizace, bayesovská síť a tabulky podmíněných pravděpodobností, odvozování výčtem, vysvětlení pryč, d-separace a přibližné odvozování vzorkováním — na síti zataženo, postřikovač, déšť, mokrá tráva.
Série Základy AI Díl 40 z 83
- Mapa umělé inteligence: co je co a jak to do sebe zapadá
- Stručná historie umělé inteligence: od Turinga po jazykové modely
- Data, model, trénink, inference: základní pojmy na jednom příkladu
- Jak číst matematický zápis: symboly, indexy, sumy a kvantifikátory
- Množiny a relace: stavebnice, ze které se skládají definice v AI
- Funkce a zobrazení: proč je každý model v AI funkce
- Logika a důkazy: pravidla, podle kterých se v AI uvažuje
- Grafy a stromy: struktura, na které stojí hledání i neuronové sítě
- Lineární algebra pro strojové učení: vektory, matice a proč AI hlavně násobí
- Derivace, gradient a řetízkové pravidlo: jak model zjistí, kterým směrem se učit
- Gradientní sestup: jak se model učí
- Co je pravděpodobnost: od hodu kostkou ke Kolmogorovovým axiomům
- Podmíněná pravděpodobnost a Bayesova věta: jak změnit odhad, když se dozvíte něco nového
- Náhodná veličina a distribuční funkce: jedna funkce, která o rozdělení řekne všechno
- Funkce hustoty a pravděpodobnostní funkce: proč má spojitá veličina v bodě pravděpodobnost nula
- Střední hodnota, rozptyl a kovariance: kde rozdělení leží, jak je široké a co s čím souvisí
- Přehled pravděpodobnostních rozdělení: Bernoulli, binomické, Poisson, rovnoměrné, normální a exponenciální
- Zákon velkých čísel a centrální limitní věta: proč se průměry chovají tak předvídatelně
- Statistika a odhady parametrů: maximální věrohodnost, MAP a intervaly spolehlivosti
- Teorie informace: entropie, křížová entropie a KL divergence — odkud se berou ztrátové funkce
- Prohledávání stavového prostoru: BFS, DFS, UCS a A* s animacemi
- Hry a protivník: minimax, alfa-beta ořezávání a Monte Carlo tree search
- Splňování omezujících podmínek: backtracking, propagace omezení a AC-3 na sudoku a mapě krajů
- Logika a znalostní systémy: dopředné a zpětné řetězení, rezoluce a expertní systémy
- Plánování: STRIPS, svět kostek, heuristiky z relaxace a plánování v AI agentech
- Lokální hledání a simulované žíhání: obchodní cestující přes krajská města
- Genetické algoritmy: populace, křížení, mutace a výběr na batohu na výlet
- Evoluční strategie a genetické programování: od pravidla jedné pětiny po Keplerův zákon
- Optimalizace mravenčí kolonií: jak feromonová stopa najde krátkou cestu
- Optimalizace hejnem částic: setrvačnost, vlastní zkušenost a zkušenost hejna
- Neuroevoluce: evoluce vah i tvaru neuronových sítí a algoritmus NEAT
- Fuzzy množiny a funkce příslušnosti: jak zapsat „trochu teplo“
- Fuzzy logika a pravděpodobnost: proč „trochu teplo“ neznamená „pravděpodobně teplo“
- Fuzzy logika: t-normy, implikace a pravidla KDYŽ–PAK
- Fuzzy řízení: Mamdani a Sugeno od ventilátoru po kyvadlo na vozíku
- Fuzzy shlukování: algoritmus fuzzy c-means a body mezi shluky
- Neuro-fuzzy systémy (ANFIS): fuzzy pravidla, která se učí z dat
- Markovovy řetězce: přechodová matice, stacionární rozdělení a PageRank
- Skryté Markovovy modely: Viterbiho algoritmus a nepoctivé kasino
- Bayesovské sítě: proč je tráva mokrá a co z toho plyne pro postřikovač
- Kalmanův filtr: jak z nepřesných měření odhadnout, kde auto je a jak rychle jede
- Druhy strojového učení: s učitelem, bez učitele, s částečným učitelem a další
- Přeučení a regularizace: proč model, který zná data nazpaměť, selže
- Vyhodnocení modelu: křížová validace, F1 a křivka ROC
- Shlukování a snížení dimenze: k-means, PCA a t-SNE
- Klasifikace a regrese: dvě úlohy učení s učitelem
- Lineární regrese: nejmenší čtverce geometricky i maticově
- Polynomiální a nelineární regrese: jak přímku ohnout
- Logistická regrese: sigmoida, šance a křížová entropie
- Vícetřídní klasifikace a softmax: od dvou tříd k mnoha
- Naivní Bayesův klasifikátor: spamový filtr, který funguje lépe, než by měl
- Ztrátové funkce: co přesně model minimalizuje
- Rozhodovací stromy a k nejbližších sousedů: modely bez vzorců
- Ansámbly: náhodný les a gradient boosting
- SVM a jádrový trik: nejširší hranice a jak ji ohnout
- Signál a vzorkování: proč platí Nyquistův teorém
- Fourierova transformace: rozklad signálu na frekvence
- Filtry a konvoluce: vyhlazení, hrany a odstranění šumu
- Zvuk a řeč: spektrogram, melová škála a MFCC
- Obraz jako signál: pixely, barvy, konvoluce a hrany
- Perceptron a umělý neuron: nejjednodušší neuronová síť a co neumí
- Neuronová síť od nuly: zpětné šíření chyby krok za krokem
- Aktivace, inicializace a normalizace: drobnosti, na kterých hluboká síť stojí
- Konvoluční sítě: jak síť poznává obrázky
- Rekurentní sítě: paměť pro posloupnosti a mizející gradient
- LSTM a GRU: brány, které rozhodují, co si síť zapamatuje
- Autoenkodéry: síť, která se učí data stlačit a zase rozbalit
- Embeddingy a word2vec: jak se slovo stane vektorem
- Mechanismus pozornosti: jak se model naučí, kam se dívat
- Transformery a velké jazykové modely: architektura krok za krokem
- Tokenizace: jak se text rozseká na kousky pro model
- Předtrénování a škálování: proč větší model a víc dat funguje
- Doladění a RLHF: jak se z doplňovače textu stane asistent
- Prompty, kontext a RAG: jak modelu dát správné informace
- Variační autoenkodéry (VAE): nové obrázky ze spojitého latentního prostoru
- Generativní adversariální sítě (GAN): padělatel proti detektivovi
- Difúzní modely: jak se z čistého šumu stane obrázek
- Markovovy rozhodovací procesy: stavy, akce, odměny a Bellmanovy rovnice
- Q-learning a DQN: učení hodnoty akcí od tabulky po neuronovou síť
- Policy gradient a PPO: učení přímo strategie
- Jak funguje AI agent: jazykový model ve smyčce s nástroji
- Programování s AI agenty: zadání, testy a kontrola
- Vyhodnocení a bezpečnost AI systémů: jak měřit a jak hlídat
Celá osnova série 83 z 83 témat hotovo
- Jak bayesovská síť zkrátí obrovskou tabulku pravděpodobností na pár malých tabulek.
- Jak se v síti odvozuje od následků k příčinám a co je vysvětlení pryč.
- Jak z grafu vyčíst, které veličiny jsou nezávislé, a jak se pravděpodobnosti odhadují vzorkováním.
Co se hodí znát předem: Podmíněná pravděpodobnost a Bayesova věta: jak změnit odhad, když se dozvíte něco nového, Grafy a stromy: struktura, na které stojí hledání i neuronové sítě
Ráno vyjdete ven a tráva je mokrá. Pršelo, nebo běžel postřikovač? A když se pak od souseda dozvíte, že v noci pršelo — změní to, co si myslíte o postřikovači? Člověk takhle uvažuje bez přemýšlení. Stroj to dokáže taky, pokud ví, co s čím souvisí. Bayesovská síť je obrázek těchto souvislostí, ze kterého se dá spočítat odpověď na libovolnou otázku. Judea Pearl za ni a za navazující teorii příčinnosti dostal v roce 2011 Turingovu cenu.
Navazuje na díly Podmíněná pravděpodobnost a Bayesova věta a Grafy a stromy.
1. Problém velké tabulky
Úplná informace o několika náhodných veličinách je jejich sdružené rozdělení — pravděpodobnost každé kombinace hodnot. Pro čtyři ano/ne veličiny je kombinací 16, tedy 15 nezávislých čísel. Pro 37 veličin (tolik má známá lékařská síť ALARM pro monitorování pacientů na anestezii) by to bylo přes 137 miliard čísel, i kdyby byly všechny jen ano/ne. Takovou tabulku nikdo nesestaví, neuloží ani neodhadne z dat. Zachrání nás to, že většina veličin spolu souvisí jen nepřímo.
Definice — sdružené rozdělení a počet jeho parametrů
Nechť (Ω, 𝓕, P) je pravděpodobnostní prostor (viz díl Co je pravděpodobnost), n ≥ 1 a X1, …, Xn jsou diskrétní náhodné veličiny na něm (viz díl Náhodná veličina); veličina Xi nabývá hodnot z konečné nebo spočetné množiny 𝒳i, i = 1, …, n. Sdružené rozdělení veličin X1, …, Xn je funkce 𝒳1 × ⋯ × 𝒳n → [0, 1], která každé kombinaci hodnot (x1, …, xn) přiřadí číslo
P(x1, …, xn) = P({ω ∈ Ω : X1(ω) = x1 ∧ … ∧ Xn(ω) = xn}),
také psané P(x1, …, xn) = P(X1 = x1, …, Xn = xn). Z axiomů pravděpodobnosti plyne:
- P(x1, …, xn) ≥ 0 pro všechna (x1, …, xn) ∈ 𝒳1 × ⋯ × 𝒳n;
- ∑(x1, …, xn) ∈ 𝒳1 × ⋯ × 𝒳n P(x1, …, xn) = 1.
Počet parametrů. Jsou-li všechny veličiny dvouhodnotové (|𝒳i| = 2 pro i = 1, …, n, hodnoty ano/ne), má definiční obor 2n prvků. Libovolných 2n − 1 hodnot lze zvolit nezávisle (nezáporných, se součtem nejvýš 1) a poslední je podmínkou 2 určena jako 1 minus jejich součet. Sdružené rozdělení n dvouhodnotových veličin má tedy
2n − 1
nezávislých parametrů — tolik čísel je potřeba, aby bylo určeno jednoznačně.
Výpočet. 24 − 1 = 15; 237 − 1 = 137 438 953 471.
Věta — řetězové pravidlo
Nechť (Ω, 𝓕, P) je pravděpodobnostní prostor, n ≥ 2, X1, …, Xn jsou diskrétní náhodné veličiny s hodnotami v 𝒳1, …, 𝒳n a (x1, …, xn) ∈ 𝒳1 × ⋯ × 𝒳n je kombinace hodnot, pro kterou P(x1, …, xn−1) > 0. Zápisem P(xi | x1, …, xi−1) rozumíme podmíněnou pravděpodobnost (viz díl Podmíněná pravděpodobnost) jevu {Xi = xi} za podmínky {X1 = x1, …, Xi−1 = xi−1}. Pak
P(x1, …, xn) = P(x1) · P(x2 | x1) · P(x3 | x1, x2) ⋯ P(xn | x1, …, xn−1) = ∏i=1n P(xi | x1, …, xi−1),
kde činitel pro i = 1 je P(x1) (prázdná podmínka).
Důkaz: pro k ≤ n − 1 je jev {X1 = x1, …, Xk = xk} nadmnožinou jevu {X1 = x1, …, Xn−1 = xn−1}, takže má kladnou pravděpodobnost a všechny podmíněné pravděpodobnosti ve vzorci jsou definované. Z definice podmíněné pravděpodobnosti
P(xn | x1, …, xn−1) = P(x1, …, xn)/P(x1, …, xn−1),
tedy P(x1, …, xn) = P(xn | x1, …, xn−1) · P(x1, …, xn−1). Totéž použijeme na druhý činitel a tak dál, až zbude P(x1). ∎
Řetězové pravidlo nic nešetří: poslední činitel stále závisí na všech předchozích veličinách, takže je to jen jiný zápis téže obrovské tabulky. Úspora přijde, až některé podmínky vypustíme.
2. Bayesovská síť
Definice — bayesovská síť
Nechť n ≥ 1 a X1, …, Xn jsou veličiny, Xi s hodnotami v konečné neprázdné množině 𝒳i, i = 1, …, n. Bayesovská síť nad těmito veličinami je dvojice (G, Θ), kde
- G = (V, H) je orientovaný acyklický graf (DAG, viz díl Grafy a stromy) s množinou vrcholů V = {X1, …, Xn} a množinou hran H ⊆ V × V; rodiče vrcholu Xi jsou rodiče(Xi) = {Xj ∈ V : (Xj, Xi) ∈ H};
- Θ přiřazuje každému vrcholu Xi tabulku podmíněných pravděpodobností: pro každou kombinaci hodnot u jeho rodičů rozdělení P( · | u) na 𝒳i, tj. čísla P(xi | u) ≥ 0 pro xi ∈ 𝒳i taková, že ∑xi ∈ 𝒳i P(xi | u) = 1. Vrchol bez rodičů má jediné rozdělení P(xi).
Síť určuje sdružené rozdělení veličin X1, …, Xn předpisem
P(x1, …, xn) = ∏i=1n P(xi | rodiče(Xi)) pro všechna (x1, …, xn) ∈ 𝒳1 × ⋯ × 𝒳n,
kde v i-tém činiteli za rodiče(Xi) dosazujeme hodnoty, které mají rodiče v kombinaci (x1, …, xn). Součin je nezáporný a přes všechny kombinace sčítá do 1 (sečteme-li nejdřív přes hodnoty vrcholu, který je v topologickém pořadí poslední, jeho činitel dá 1 a zbude síť bez něj), takže je to opravdu sdružené rozdělení.
Šipky vedou od příčin k následkům. U každé veličiny stačí vědět, jak závisí na svých přímých příčinách — nic víc. Pravděpodobnost celé situace je součin těchto místních čísel. Místo jedné obrovské tabulky máme pár malých.
Proč smí síť napsat jen P(xi | rodiče) a ne celou minulost jako řetězové pravidlo? Protože o grafu předpokládá podmíněné nezávislosti.
Definice — podmíněná nezávislost
Nechť (Ω, 𝓕, P) je pravděpodobnostní prostor a A, C, E jsou diskrétní náhodné veličiny na něm s hodnotami v 𝒜, 𝒞, ℰ (každá z nich může být i skupina veličin, tj. vektor; E smí být prázdná skupina). Zkráceně píšeme P(a | c, e) = P(A = a | C = c, E = e) apod. Veličiny A a C jsou podmíněně nezávislé při E, píšeme A ⊥ C | E, právě když
∀a ∈ 𝒜 ∀c ∈ 𝒞 ∀e ∈ ℰ : P(c, e) > 0 ⇒ P(a | c, e) = P(a | e).
Slovy: když známe hodnotu E, znalost hodnoty C nezmění pravděpodobnost žádné hodnoty A. Rovnost v definici:
P(a | c, e) = P(a | e)
- P(a | c, e)
- co víme o A, když známe E a navíc C
- P(a | e)
- co víme o A ze samotného E; rovnost říká, že C už nic nepřidá — veškerá souvislost A s C vede přes E
Věta — faktorizace je řetězové pravidlo plus místní nezávislosti
Nechť G = (V, H) je orientovaný acyklický graf s vrcholy V = {X1, …, Xn}, které jsou diskrétní náhodné veličiny na pravděpodobnostním prostoru (Ω, 𝓕, P), a vrcholy jsou očíslované topologicky: (Xj, Xi) ∈ H ⇒ j < i. Potomci vrcholu Xi jsou vrcholy různé od Xi, do kterých z Xi vede orientovaná cesta; nepotomci(Xi) = V ∖ ({Xi} ∪ potomci(Xi)). Předpokládejme místní Markovovu podmínku:
∀i ∈ {1, …, n} : Xi ⊥ (nepotomci(Xi) ∖ rodiče(Xi)) | rodiče(Xi),
tj. každá veličina je při známých rodičích podmíněně nezávislá na všech ostatních veličinách, které nejsou jejími potomky. Pak pro každou kombinaci hodnot (x1, …, xn) s P(x1, …, xn−1) > 0 platí
P(x1, …, xn) = ∏i=1n P(xi | rodiče(Xi)).
Důkaz: v řetězovém pravidle v topologickém pořadí stojí P(xi | x1, …, xi−1). Mezi X1, …, Xi−1 jsou všichni rodiče Xi (rodič má menší číslo) a žádný jeho potomek (potomek je v pořadí až za ním), tedy {X1, …, Xi−1} ⊆ nepotomci(Xi). Podle Markovovy podmínky můžeme všechny veličiny kromě rodičů z podmínky vypustit a zbude P(xi | rodiče(Xi)). ∎
Platí to i obráceně: každé rozdělení dané součinem tabulek místní Markovovu podmínku splňuje. Proto lze bayesovskou síť definovat kterýmkoli z obou způsobů.
Naše síť: když je zataženo, je pravděpodobnější déšť a méně pravděpodobné, že někdo zapne postřikovač. Déšť i postřikovač udělají mokrou trávu. Čísla jsou z oblíbeného příkladu Kevina Murphyho:
Síť má 1 + 2 + 2 + 4 = 9 čísel místo 15. U čtyř veličin je to malá úspora, u stovek obrovská: pokud má každý vrchol nejvýš k rodičů, roste počet čísel s n lineárně (n · 2k), ne exponenciálně (2n). Pravděpodobnost situace „zataženo, postřikovač neběžel, pršelo, tráva mokrá“ je 0,5 · 0,9 · 0,8 · 0,9 = 0,324 (barvy podle vzorce níže).
P(z, p, d, t) = P(z) · P(p | z) · P(d | z) · P(t | p, d)
- P(z)
- zataženo nemá rodiče, jeho tabulka je jediné číslo; v příkladu 0,5
- P(p | z)
- postřikovač závisí jen na mracích — tady se od řetězového pravidla nic neliší; v příkladu neběžel při zatažené obloze: 1 − 0,1 = 0,9
- P(d | z)
- řetězové pravidlo by chtělo P(d | z, p); síť předpokládá, že při známé obloze postřikovač o dešti nic neřekne, a tak p z podmínky vypadne; v příkladu 0,8
- P(t | p, d)
- řetězové pravidlo by chtělo P(t | z, p, d); tráva o mracích „ví“ jen přes déšť a postřikovač, a tak vypadne z; v příkladu (postřikovač ne, déšť ano) 0,9
3. Odvozování: z následku k příčině
Definice — odvozování výčtem
Nechť (G, Θ) je bayesovská síť nad veličinami X1, …, Xn a tyto veličiny jsou rozdělené do tří disjunktních skupin: dotaz Q (jedna veličina s hodnotami v 𝒬), důkazy E = (E1, …, Em) s pozorovanými hodnotami e = (e1, …, em) a skryté veličiny Y (všechny ostatní) s množinou kombinací hodnot 𝒴. Předpokládejme P(e) > 0. Pak pro každé q ∈ 𝒬 je
P(q | e) = ∑y ∈ 𝒴 P(q, e, y)/∑q′ ∈ 𝒬 ∑y ∈ 𝒴 P(q′, e, y),
kde každé P(q, e, y) je hodnota sdruženého rozdělení sítě — součin čísel z tabulek podle faktorizace. Odvozování výčtem je algoritmus, který podle tohoto vzorce počítá:
Vstup: síť (G, Θ), dotazová veličina Q, důkazy E = e s P(e) > 0. Výstup: čísla P(q | e) pro všechna q ∈ 𝒬. Kroky:
- Pro každé q ∈ 𝒬 polož S(q) := 0.
- Pro každé q ∈ 𝒬 a každé y ∈ 𝒴 spočítej součin P(q, e, y) z tabulek a přičti ho k S(q).
- Po projití všech (konečně mnoha) dvojic (q, y) polož Z := ∑q′ ∈ 𝒬 S(q′) = P(e) a vrať P(q | e) = S(q)/Z pro každé q ∈ 𝒬.
Projdeme všechny možné světy, které souhlasí s tím, co víme (tráva je mokrá), a podíváme se, jakou váhu mezi nimi mají ty, kde pršelo. Je to Bayesova věta z dílu o podmíněné pravděpodobnosti, jen se sčítá přes víc veličin najednou.
P(q | e) = ∑y P(q, e, y)/∑q′, y P(q′, e, y)
- e
- důkazy — hodnoty, které jsme pozorovali (u nás mokrá tráva); ve všech sčítaných světech jsou pevné
- ∑y
- skryté veličiny (u nás zataženo a postřikovač) neznáme a nezajímají nás, tak sečteme všechny jejich možnosti — marginalizace; světy jsou navzájem neslučitelné, takže se pravděpodobnosti sčítají
- P(q, e, y)
- pravděpodobnost jednoho úplného světa, kde platí dotaz i důkazy — součin čísel z tabulek podle faktorizace
- ∑q′, y P(q′, e, y)
- = P(e), váha všech světů, které souhlasí s důkazy; dělení je definice podmíněné pravděpodobnosti P(q | e) = P(q, e)/P(e) a zaručí, že ∑q P(q | e) = 1 (u ano/ne dotazu P(Q | e) + P(¬Q | e) = 1)
Příklad — P(déšť | mokrá tráva) výčtem
Důkaz je T = ano, dotaz D, skryté jsou Z a P. Světů s mokrou trávou je 23 = 8; každý je součin P(z) · P(p | z) · P(d | z) · P(t | p, d):
| déšť | zataženo | postřikovač | součin | P(svět) |
|---|---|---|---|---|
| ano | ano | ano | 0,5 · 0,1 · 0,8 · 0,99 | 0,0396 |
| ano | ne | ano | 0,5 · 0,5 · 0,2 · 0,99 | 0,0495 |
| ano | ano | ne | 0,5 · 0,9 · 0,8 · 0,9 | 0,3240 |
| ano | ne | ne | 0,5 · 0,5 · 0,2 · 0,9 | 0,0450 |
| ne | ano | ano | 0,5 · 0,1 · 0,2 · 0,9 | 0,0090 |
| ne | ne | ano | 0,5 · 0,5 · 0,8 · 0,9 | 0,1800 |
| ne | ano | ne | 0,5 · 0,9 · 0,2 · 0 | 0,0000 |
| ne | ne | ne | 0,5 · 0,5 · 0,8 · 0 | 0,0000 |
Řádky, kde pršelo, jsou světy P(q, e, y) pro q = déšť ano; jejich součet přes skryté Z, P dá P(D, T) = 0,4581, součet všech osmi P(T) = 0,6471. Poslední dva řádky jsou nulové: bez deště i bez postřikovače tráva mokrá není. Tedy (barvy podle vzorce výše)
P(D | T) = 0,4581/0,6471 = 0,708.
def dotaz(Q, dukazy, sit):
citatel = jmenovatel = 0.0
for svet in vsechna_prirazeni(sit): # 2^n úplných světů
if any(svet[k] != v for k, v in dukazy.items()):
continue # nesouhlasí s důkazy
p = 1.0
for uzel in sit: # faktorizace sítě
p *= P(uzel, svet[uzel], svet[rodice(uzel)])
jmenovatel += p # → P(e)
if svet[Q]:
citatel += p # → P(Q, e)
return citatel / jmenovatel
Předem (bez jakéhokoli pozorování) je pravděpodobnost deště 0,5 a postřikovače 0,3. Mokrá tráva obojí zvýší: P(déšť | mokrá tráva) = 0,708 a P(postřikovač | mokrá tráva) = 0,430. Déšť je pravděpodobnější vysvětlení, protože prší častěji, než běží postřikovač. Mokrá tráva zvýší i pravděpodobnost, že bylo zataženo — z 0,5 na 0,576 —, ačkoli tráva a mraky spolu přímo nesouvisejí. Informace teče sítí proti šipkám.
4. Vysvětlení pryč
Teď se dozvíme, že v noci opravdu pršelo. Co se stane s postřikovačem?
Pravděpodobnost postřikovače spadne z 0,430 na 0,194. Déšť mokrou trávu už vysvětlil, takže pro postřikovač nezbývá důvod. Naopak když víme, že běžel postřikovač, klesne pravděpodobnost deště ze 0,708 na 0,320. Tomuto jevu se říká vysvětlení pryč (explaining away). Dvě příčiny, které spolu předem souvisely jen slabě, se jakmile pozorujeme jejich společný následek, začnou navzájem „vytlačovat“. A kdybychom věděli, že nepršelo, postřikovač by musel běžet: P(postřikovač | mokrá tráva, ne déšť) = 1, protože v naší síti tráva sama od sebe mokrá být nemůže.
Příklad — vysvětlení pryč v číslech
Z tabulky v předchozím příkladu: světy, kde pršelo, běžel postřikovač a tráva je mokrá, mají dohromady P(P, D, T) = 0,0396 + 0,0495 = 0,0891. Proto
P(P | T, D) = P(P, D, T)/P(D, T) = 0,0891/0,4581 = 0,194,
P(D | T, P) = P(P, D, T)/P(P, T) = 0,0891/0,2781 = 0,320
(jmenovatel je pravděpodobnost důkazů P(e), barvy podle vzorce odvozování výčtem výše).
Formálně je vysvětlení pryč nerovnost P(P | T, D) < P(P | T): potvrzení jedné příčiny sníží pravděpodobnost druhé (0,194 < 0,430).
5. Co se dá ze sítě vyčíst: d-separace
Graf neříká jen, jak počítat — říká i, které veličiny jsou na sobě nezávislé, a to bez jediného čísla. Všechny možnosti se skládají ze tří základních tvarů:
- Řetěz A → B → C: A a C spolu souvisejí, ale když známe B, už ne. (Zataženo → déšť → mokrá tráva: kdo ví, jestli pršelo, tomu mraky o trávě nic neřeknou.)
- Vidlička A ← B → C: společná příčina dělá A a C závislými; když ji známe, závislost zmizí. (Postřikovač a déšť předem souvisejí přes mraky: P(postřikovač | déšť) = 0,18, ale P(postřikovač | nepršelo) = 0,42. Když víme, jestli je zataženo, jsou nezávislé.)
- Srážka A → B ← C: příčiny jsou nezávislé, dokud nepozorujeme společný následek — pak se stanou závislými. To je vysvětlení pryč.
Definice — d-separace
Nechť G = (V, H) je orientovaný acyklický graf, A, C ∈ V jsou různé vrcholy a E ⊆ V ∖ {A, C} je množina vrcholů (pozorované veličiny).
- Neorientovaná cesta mezi A a C je posloupnost navzájem různých vrcholů (V0, V1, …, Vk), k ≥ 1, s V0 = A, Vk = C, taková, že (Vj−1, Vj) ∈ H ∨ (Vj, Vj−1) ∈ H pro j = 1, …, k (sousední vrcholy spojuje hrana, směr šipky nehraje roli).
- Vnitřní vrchol Vj cesty (0 < j < k) je středem řetězu, právě když Vj−1 → Vj → Vj+1 nebo Vj−1 ← Vj ← Vj+1; vidličky, právě když Vj−1 ← Vj → Vj+1; srážky, právě když Vj−1 → Vj ← Vj+1 (U → W znamená (U, W) ∈ H). Každý vnitřní vrchol je právě jedním z těchto tří.
- Cesta je zablokovaná množinou E, právě když má vnitřní vrchol Vj, pro který platí aspoň jedno z: (a) Vj je středem řetězu nebo vidličky ∧ Vj ∈ E, (b) Vj je středem srážky ∧ ({Vj} ∪ potomci(Vj)) ∩ E = ∅, kde potomci(Vj) jsou vrcholy, do kterých z Vj vede orientovaná cesta.
- Vrcholy A a C jsou d-separované množinou E, právě když je množinou E zablokovaná každá neorientovaná cesta mezi A a C.
Věta (Verma a Pearl). Nechť (G, Θ) je bayesovská síť, P sdružené rozdělení, které určuje, a A, C, E jako výše. Jsou-li A a C d-separované množinou E, pak A ⊥ C | E vzhledem k P — a to pro každou volbu tabulek Θ.
Informace teče grafem po cestách. Známá veličina uprostřed řetězu nebo vidličky tok zastaví — už je „vysvětlená“. U srážky je to obráceně: dokud následek neznáme, tok tam stojí; jakmile ho pozorujeme, otevře se. Z obrázku se tak dá vyčíst, co je potřeba měřit a co je zbytečné.
V naší síti jsou zataženo a mokrá tráva d-separované, když známe postřikovač i déšť — výpočet to potvrdí: pravděpodobnost zatažené oblohy pak na trávě vůbec nezávisí.
Příklad — tři tvary ověřené výpočtem
- Vidlička postřikovač ← zataženo → déšť. Bez znalosti oblohy: P(P | D) = 0,18 ≠ P(P) = 0,3, závislé. Při známé obloze: P(P | Z, D) = 0,1 = P(P | Z), tedy P ⊥ D | Z.
- Srážka postřikovač → mokrá tráva ← déšť. Při známé obloze jsou P a D nezávislé (P(P | Z, D) = P(P | Z, ¬D) = 0,1), ale jakmile pozorujeme trávu, už ne: P(P | Z, D, T) = 0,109, kdežto P(P | Z, ¬D, T) = 1.
- D-separace zatažené oblohy a mokré trávy množinou {P, D}: obě cesty Z → P → T a Z → D → T jsou řetězy se známým středem, takže jsou zablokované. A opravdu: P(Z | P, D) = 0,444 a P(Z | P, D, T) = 0,444; P(Z | P, ¬D) = 0,048 a P(Z | P, ¬D, T) = 0,048.
6. Přibližné odvozování vzorkováním
Odvozování výčtem prochází všechny kombinace skrytých veličin — v obecné síti exponenciálně mnoho. Přesné odvozování v bayesovských sítích je NP-těžké. Pro velké sítě se proto pravděpodobnosti odhadují simulací.
Algoritmy — vzorkování se zamítáním a vážená věrohodnost
Oba algoritmy mají stejný vstup: bayesovskou síť (G, Θ) nad veličinami X1, …, Xn očíslovanými topologicky (rodič má menší číslo než dítě), dotaz Q = q, důkazy E = e a počet vzorků N ∈ ℕ, N ≥ 1; a stejný výstup: odhad P̂(q | e) čísla P(q | e). Vylosovat xi znamená zvolit náhodně hodnotu z 𝒳i podle rozdělení P( · | u) z tabulky vrcholu Xi, kde u jsou hodnoty jeho rodičů už určené v tomto vzorku.
Vzorkování se zamítáním:
- Polož Npřij := 0, Nq := 0.
- Opakuj Nkrát: pro i = 1, …, n vylosuj xi. Souhlasí-li vzorek s důkazy (každá důkazová veličina má v něm pozorovanou hodnotu), zvyš Npřij o 1 a platí-li v něm navíc Q = q, zvyš o 1 i Nq; jinak vzorek zahoď.
- Po N opakováních skonči a vrať P̂(q | e) = Nq/Npřij (pro Npřij = 0 odhad není definován).
Vážená věrohodnost:
- Polož W := 0, Wq := 0.
- Opakuj Nkrát (k-tý vzorek): polož wk := 1 a pro i = 1, …, n: je-li Xi důkazová veličina s pozorovanou hodnotou ei, polož xi := ei (nelosuj) a wk := wk · P(ei | u), kde u jsou hodnoty rodičů ve vzorku; jinak xi vylosuj. Pak W := W + wk a platí-li ve vzorku Q = q, i Wq := Wq + wk.
- Po N opakováních skonči a vrať P̂(q | e) = Wq/W (pro W = 0 odhad není definován).
Zamítání je poctivé, ale plýtvá: když je důkaz vzácný, skoro všechny vzorky zahodí. Vážená věrohodnost nezahazuje nic — jen každému vzorku přidělí váhu podle toho, jak dobře sedí s tím, co víme.
def zamitani(Q, dukazy, n, sit):
prijato = ano = 0
for _ in range(n):
svet = {}
for uzel in sit: # od příčin k následkům
svet[uzel] = nahoda() < P(uzel, True, svet[rodice(uzel)])
if any(svet[k] != v for k, v in dukazy.items()):
continue # do koše
prijato += 1
ano += svet[Q]
return ano / prijato
def vazena(Q, dukazy, n, sit):
s = s_ano = 0.0
for _ in range(n):
svet, w = {}, 1.0
for uzel in sit:
p = P(uzel, True, svet[rodice(uzel)])
if uzel in dukazy: # důkaz nelosujeme…
svet[uzel] = dukazy[uzel]
w *= p if dukazy[uzel] else 1 - p # …ale zvážíme, jak je pravděpodobný
else:
svet[uzel] = nahoda() < p
s += w
s_ano += w * svet[Q]
return s_ano / s
P̂(Q | e) = ∑k wk [Q platí ve vzorku k]/∑k wk, wk = ∏j P(ej | rodiček)
- wk
- váha vzorku (zeleně jako křivka vážené věrohodnosti v grafu) — součin pravděpodobností všech důkazů ej při hodnotách jejich rodičů, které ve vzorku k padly: důkazy jsme nelosovali, ale vnutili, a tak musíme zohlednit, jak pravděpodobné by byly při ostatních vylosovaných hodnotách — jinak by odhad byl vychýlený
- [Q platí ve vzorku k]
- 1, když ve vzorku platí dotaz, jinak 0 — započítáme jen váhu vzorků, kde pršelo
- ∑k wk
- celková váha; dělením z ní uděláme podíl, stejně jako dělení P(e) při výčtu. Díky němu nevadí, že váhy nesčítají do 1
Příklad — váhy při důkazu „tráva je mokrá“
Jediný důkaz je T = ano, jeho rodiče jsou postřikovač a déšť. Váha vzorku je proto prostě P(T = ano | p, d) z tabulky mokré trávy:
- postřikovač i déšť: w = 0,99,
- jen jedno z nich: w = 0,9,
- ani jedno: w = 0 — takový vzorek nepřispěje nikam, stejně jako by ho zamítání zahodilo.
(Barva podle vzorce výše.)
Na obloze váha nezávisí: zataženo není rodičem trávy.
Se sto vzorky dalo zamítání odhad 0,686 a použilo jich jen 70 — zbylých 30 mělo suchou trávu a šlo do koše. S 10 000 vzorky (z nichž zbylo 6 524) je odhad 0,703, blízko přesné hodnotě 0,708. Chyba klesá jako 1/√N, jak říká centrální limitní věta: pro desetkrát přesnější odhad je potřeba stokrát víc vzorků.
σP̂ = √p(1 − p)/Npřij, Npřij ≈ N · P(e)
- p(1 − p)
- rozptyl jednoho vzorku typu ano/ne (alternativní rozdělení s pravděpodobností p); největší je pro p = 0,5, kdy je jeden vzorek nejméně předvídatelný
- Npřij
- počet vzorků, které se opravdu počítají; u zamítání jen ty, které prošly, a těch je v průměru podíl P(e) — u vzácného důkazu skoro žádné. Rozptyl průměru N nezávislých vzorků je N-krát menší
Příklad — jak velkou chybu čekat
Přesně je p = 0,708 a P(e) = P(T) = 0,6471, takže z 10 000 vzorků čekáme asi 6 471 přijatých (skutečně jich bylo 6 524).
- Npřij = 70: σ = √0,708 · 0,292/70 = 0,054; skutečná chyba |0,686 − 0,708| = 0,022.
- Npřij = 6 524: σ = 0,0056; skutečná chyba 0,0050.
Obě skutečné chyby jsou menší než jedna směrodatná odchylka — v souladu s tím, že asi dvě třetiny odhadů padnou do ±σ (normální rozdělení podle centrální limitní věty).
7. Bayesovské sítě v praxi
- Diagnostika. Lékařské sítě (ALARM, QMR-DT se stovkami nemocí a tisíci příznaků) a diagnostika poruch strojů a sítí: z pozorovaných příznaků odvodit nejpravděpodobnější příčinu — a navrhnout, co změřit dál.
- Učení z dat. Tabulky se dají odhadnout z dat počítáním (metodou maximální věrohodnosti z dílu o statistice), dokonce i když některé hodnoty chybí — algoritmem EM, příbuzným Baumovu–Welchovu algoritmu z minulého dílu.
- Příčinnost. Pearl ukázal, že síť čtená jako graf příčin umí odpovídat i na otázky „co by se stalo, kdybychom zasáhli“ — zapnuli postřikovač sami — což ze samotných korelací vyčíst nejde. Na tom stojí dnešní kauzální odvozování v epidemiologii i ekonomii.
- Příbuzní. Naivní Bayesův klasifikátor je bayesovská síť s jednou příčinou a mnoha nezávislými následky. Skryté Markovovy modely z minulého dílu jsou bayesovská síť rozvinutá v čase.
8. Shrnutí
- Bayesovská síť je orientovaný acyklický graf s tabulkami P(X | rodiče); sdružené rozdělení je součin těchto tabulek. Naše síť potřebuje 9 čísel místo 15.
- Odvozování jde i proti šipkám: mokrá tráva zvýší pravděpodobnost deště na 0,708 a postřikovače na 0,430.
- Vysvětlení pryč: když víme, že pršelo, klesne pravděpodobnost postřikovače na 0,194.
- D-separace přečte nezávislosti přímo z grafu — řetěz a vidlička se pozorováním uzavřou, srážka otevře.
- Přesné odvozování je obecně NP-těžké; vzorkování dává odhady s chybou klesající jako 1/√N.
Chcete si to osahat? Nechte AI agenta postavit bayesovskou síť pro poruchu vlastního auta nebo počítače („nestartuje — baterie, nebo startér?“) a zkuste, jak se mění podezření, když přidáváte pozorování.
Máte na to jiný názor? Napište na support@coden-app.com.