Markovovy řetězce: přechodová matice, stacionární rozdělení a PageRank
Markovova vlastnost, přechodová matice a vývoj rozdělení na modelu počasí, stacionární rozdělení a ergodická věta, Markovův rozbor samohlásek na Máchově Máji, PageRank a generování textu.
Série Základy AI Díl 38 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
- Co je Markovova vlastnost a jak přechodová matice popisuje celý řetězec.
- Proč se nerozložitelný řetězec ustálí na stacionárním rozdělení nezávisle na začátku.
- Jak z řetězců vznikl PageRank a co mají společného s jazykovými modely.
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, Lineární algebra pro strojové učení: vektory, matice a proč AI hlavně násobí
V roce 1913 seděl ruský matematik Andrej Markov nad Puškinovým Evženem Oněginem a dělal něco, co by literární vědec považoval za barbarství: počítal, kolikrát po samohlásce následuje další samohláska. Chtěl ukázat, že zákon velkých čísel platí i pro jevy, které na sobě závisejí — a vymyslel při tom model, který dnes počítá pořadí stránek ve vyhledávači, předpovídá počasí, generuje text a stojí za celou rodinou algoritmů umělé inteligence. Tímhle dílem začíná modul o pravděpodobnostních modelech.
Navazuje na díly Podmíněná pravděpodobnost a Bayesova věta a Lineární algebra pro strojové učení.
1. Proces bez paměti
Definice — Markovův řetězec
Nechť (Ω, 𝓕, P) je pravděpodobnostní prostor, S konečná neprázdná množina (množina stavů) a X0, X1, X2, … : Ω → S posloupnost náhodných veličin (Xt je stav v čase t ∈ ℕ0). Posloupnost (Xt)t ≥ 0 je Markovův řetězec, právě když pro každé t ∈ ℕ0 a všechny stavy i0, …, it−1, i, j ∈ S takové, že P(Xt = i, Xt−1 = it−1, …, X0 = i0) > 0, platí Markovova vlastnost
P(Xt+1 = j | Xt = i, Xt−1 = it−1, …, X0 = i0) = P(Xt+1 = j | Xt = i).
Markovův řetězec je homogenní, právě když existují čísla pij ∈ [0, 1] (i, j ∈ S) taková, že
P(Xt+1 = j | Xt = i) = pij pro všechna t ∈ ℕ0 a i, j ∈ S s P(Xt = i) > 0.
Slovy: rozdělení příštího stavu závisí jen na současném stavu, ne na cestě, kterou se do něj řetězec dostal; u homogenního řetězce navíc nezávisí ani na čase t. Rozdělení π0(i) = P(X0 = i) se nazývá počáteční rozdělení.
Budoucnost závisí jen na přítomnosti, ne na tom, jak jsme se do ní dostali. Kdo zná dnešní stav, ví o zítřku všechno, co se vědět dá — historie už nic nepřidá. Je to zjednodušení, ale velmi užitečné: místo celé minulosti si stačí pamatovat jedno číslo.
Co Markovova vlastnost přináší, je vidět na pravděpodobnosti celé trajektorie. Obecně se rozkládá řetízkovým pravidlem na součin podmíněných pravděpodobností, z nichž každá závisí na celé minulosti. Markovova vlastnost z každé podmínky škrtne všechno kromě posledního stavu:
P(X0 = x0, …, XT = xT) = π0(x0) · ∏t=1T P(xt | xt−1)
- P(X0 = x0, …)
- pravděpodobnost, že řetězec projde přesně touhle posloupností stavů
- π0(x0)
- počáteční rozdělení — odkud řetězec vyrazí, matice neříká; tenhle údaj musí přijít zvenku
- ∏t=1T
- součin přes kroky — kroky na sebe navazují a každý musí „vyjít“, proto se násobí
- P(xt | xt−1)
- přechodová pravděpodobnost jednoho kroku, tedy prvek přechodové matice v řádku xt−1 a sloupci xt — díky Markovově vlastnosti závisí jen na předchozím stavu, ne na celé historii; bez ní by tu stálo P(xt | x0, …, xt−1)
2. Přechodová matice
Definice — přechodová matice
Nechť n ≥ 1. Matice A = (aij) ∈ ℝn×n je stochastická, právě když
- aij ≥ 0 pro všechna i, j ∈ {1, …, n};
- ∑j=1n aij = 1 pro každé i ∈ {1, …, n} (každý řádek má součet 1).
Nechť (Xt)t ≥ 0 je homogenní Markovův řetězec s množinou stavů S = {1, …, n} a čísly pij z definice výše. Jeho přechodová matice je
P = (pij)i,j=1n ∈ ℝn×n, pij = P(Xt+1 = j | Xt = i).
Přechodová matice je stochastická: pro pevné i je řádek (pi1, …, pin) rozdělení pravděpodobnosti stavu Xt+1 za podmínky Xt = i. Naopak každá stochastická matice spolu s počátečním rozdělením π0 určuje homogenní Markovův řetězec. (Stejné písmeno P pro pravděpodobnost i pro matici je ustálené; z kontextu je vždy jasné, které je které.)
Řádek matice je „co se stane zítra, když dnes je tohle“. Musí se sčítat na jedničku, protože zítra se něco stát musí.
Hračkový model počasí se třemi stavy: po slunečném dni je s pravděpodobností 0,6 zase slunečno, 0,3 oblačno a 0,1 prší; po oblačném 0,3; 0,4; 0,3; po deštivém 0,2; 0,4; 0,4 (vždy v pořadí slunečno, oblačno, déšť). Jako graf:
Táž informace jako matice — řádek je dnešní počasí, sloupec zítřejší:
| Dnes ↓ / zítra → | slunečno | oblačno | déšť | součet řádku |
|---|---|---|---|---|
| slunečno | 0,6 | 0,3 | 0,1 | 1 |
| oblačno | 0,3 | 0,4 | 0,3 | 1 |
| déšť | 0,2 | 0,4 | 0,4 | 1 |
Příklad — pravděpodobnost jedné trajektorie
Dnes je slunečno (π0 = (1; 0; 0)). Jaká je pravděpodobnost, že další tři dny budou slunečno, oblačno, déšť? Podle vzorce pro trajektorii
P = π0(slunečno) · pslunečno→slunečno · pslunečno→oblačno · poblačno→déšť = 1 · 0,6 · 0,3 · 0,3 = 0,054
(barvy podle vzorce pro trajektorii výše).
Tedy 5,4 %. Součet přes všech 33 = 27 možných trojic dní je 1 — přesně proto, že každý řádek matice má součet 1.
3. Jak se rozdělení vyvíjí
Věta — rozdělení po t krocích
Nechť (Xt)t ≥ 0 je homogenní Markovův řetězec s množinou stavů S = {1, …, n} a přechodovou maticí P ∈ ℝn×n. Pro t ∈ ℕ0 označme πt = (πt(1), …, πt(n)) ∈ ℝ1×n řádkový vektor rozdělení Xt, tj. πt(i) = P(Xt = i). Pak pro každé t ∈ ℕ0
- πt+1 = πt P, tj. πt+1(j) = ∑i=1n πt(i) pij pro každé j ∈ S;
- πt = π0 Pt;
- pro každé m ∈ ℕ a i, j ∈ S s P(Xt = i) > 0 platí P(Xt+m = j | Xt = i) = (Pm)ij.
Prvek (i, j) matice Pm je tedy pravděpodobnost přechodu z i do j za m kroků. Bod 1 je zákon celkové pravděpodobnosti s rozkladem podle hodnoty Xt, bod 2 z něj plyne indukcí.
Když dnes je slunečno, zítra je rozdělení (0,6; 0,3; 0,1). Pozítří je to průměr řádků matice vážený tímhle rozdělením — (0,47; 0,34; 0,19). Každý den jedno násobení matice, nic víc.
πt+1(j) = ∑i πt(i) · pij
- πt+1(j)
- pravděpodobnost, že zítra bude stav j — jedna složka nového řádkového vektoru
- ∑i
- součet přes všechny dnešní stavy — do j se dá přijít odkudkoli a tyto cesty se navzájem vylučují, takže se jejich pravděpodobnosti sčítají (zákon celkové pravděpodobnosti)
- πt(i)
- jak pravděpodobné je, že dnes jsme v i — váha cesty přes i
- pij
- pravděpodobnost přechodu z i do j — z Markovovy vlastnosti stačí znát jen dnešní stav
Příklad — rozdělení na pozítří
Zítra (po slunečném dnešku) je π1 = (0,6; 0,3; 0,1). Pro pozítří po složkách — sloupec matice vynásobený vektorem π1:
- slunečno: 0,6 · 0,6 + 0,3 · 0,3 + 0,1 · 0,2 = 0,36 + 0,09 + 0,02 = 0,47,
- oblačno: 0,6 · 0,3 + 0,3 · 0,4 + 0,1 · 0,4 = 0,18 + 0,12 + 0,04 = 0,34,
- déšť: 0,6 · 0,1 + 0,3 · 0,3 + 0,1 · 0,4 = 0,06 + 0,09 + 0,04 = 0,19.
V každém řádku je první činitel π1(i) a druhý pij (barvy podle vzorce výše). Součet je opět 1. Za tři dny vyjde stejným postupem (0,422; 0,353; 0,225).
Zajímavá věc: po zhruba týdnu je jedno, jestli dnes svítí, nebo prší. Obě rozdělení se sejdou u stejných hodnot a dál se nemění. Řetězec „zapomněl“, kde začal.
Věta — jak rychle řetězec zapomíná
Nechť P ∈ ℝn×n (n ≥ 2) je přechodová matice homogenního Markovova řetězce a předpokládejme, že
- P má n navzájem různých (obecně komplexních) vlastních čísel λ1, …, λn, očíslovaných tak, že λ1 = 1 a |λ2| ≥ |λ3| ≥ … ≥ |λn|;
- |λk| < 1 pro všechna k = 2, …, n.
Pro k = 2, …, n nechť uk ∈ ℂ1×n je levý vlastní vektor příslušný λk (ukP = λkuk) a nechť π ∈ ℝ1×n je levý vlastní vektor příslušný λ1 = 1 se součtem složek 1 — stacionární rozdělení (definice níže). Pak pro každé počáteční rozdělení π0 existují čísla a2, …, an ∈ ℂ taková, že pro všechna t ∈ ℕ0
πt = π0Pt = π + a2λ2tu2 + … + anλntun.
Důvod. Vlastní vektory příslušné různým vlastním číslům tvoří bázi, takže π0 = a1π + ∑k≥2 akuk, a násobení Pt vynásobí k-tou složku λkt. Pro k ≥ 2 má uk součet složek 0 (z ukP1 = uk1, kde 1 je sloupec jedniček, a λk ≠ 1), proto porovnání součtů dá a1 = 1.
Odchylka πt − π tedy klesá k nule řádově jako |λ2|t, kde λ2 je druhé největší vlastní číslo v absolutní hodnotě.
πt ≈ π + a2u2 · λ2t
- πt
- rozdělení po t dnech
- π
- stacionární rozdělení — patří k vlastnímu číslu 1, které se mocněním nemění; proto je to jediná část, která přežije
- a2u2
- počáteční odchylka ve směru druhého vlastního vektoru — jen tady se projeví, odkud řetězec vyšel (slunce, nebo déšť), u složky slunečno je pro slunečný start kladná a pro deštivý záporná
- λ2t
- každým dnem se odchylka zmenší λ2-krát — rychlost zapomínání; zbylé členy s menšími |λ| zmizí ještě rychleji, proto je smíme vynechat
Příklad — vlastní čísla matice počasí
Součet vlastních čísel je stopa matice, 0,6 + 0,4 + 0,4 = 1,4, a jejich součin je determinant, který vyjde 0,01. Jedno vlastní číslo je 1 (řádky mají součet 1), takže zbylé dvě splňují λ2 + λ3 = 0,4 a λ2λ3 = 0,01. Jsou to kořeny λ2 − 0,4λ + 0,01 = 0:
λ2,3 = 0,2 ± √0,03 = 2 ± √3/10, tedy λ2 ≈ 0,373 a λ3 ≈ 0,027.
Odchylka pravděpodobnosti slunečna od stacionární hodnoty 0,393 je při slunečném startu po 3, 4, 5 dnech 0,0286; 0,0107; 0,0040 — každý den asi 0,373-krát menší (barvy podle vzorce výše). Po týdnu je 0,0006 a při deštivém startu −0,0005: oba začátky se liší až na čtvrtém desetinném místě. Na setinu se odchylka zmenší za t dní, kde 0,373t = 0,01, tedy
t = ln 0,01/ln 0,373 ≈ 4,7 dne.
4. Stacionární rozdělení
Definice — stacionární rozdělení
Nechť P = (pij) ∈ ℝn×n je přechodová matice homogenního Markovova řetězce s množinou stavů S = {1, …, n}. Řádkový vektor π = (π1, …, πn) ∈ ℝ1×n je stacionární rozdělení řetězce, právě když
- πj ≥ 0 pro každé j ∈ S a ∑j=1n πj = 1 (π je rozdělení na S);
- π P = π, tj. πj = ∑i=1n πi pij pro každé j ∈ S.
Podmínka 2 říká, že π je levý vlastní vektor matice P s vlastním číslem 1. Slovy: má-li X0 rozdělení π, má podle věty o rozdělení po t krocích rozdělení π i každé Xt — rozdělení se krokem řetězce nezmění.
Definice — nerozložitelný a neperiodický řetězec
Nechť (Xt)t ≥ 0 je homogenní Markovův řetězec s konečnou množinou stavů S a přechodovou maticí P. Pro i, j ∈ S a m ∈ ℕ označme pij(m) = (Pm)ij pravděpodobnost přechodu z i do j za m kroků.
- Řetězec je nerozložitelný (ireducibilní), právě když ∀ i, j ∈ S ∃ m ∈ ℕ : pij(m) > 0.
- Nechť i ∈ S je stav, pro který je množina R(i) = {m ∈ ℕ : pii(m) > 0} neprázdná. Perioda stavu i je d(i) = NSD R(i), největší společný dělitel délek všech cest, které se do i vracejí.
- Stav i je neperiodický, právě když d(i) = 1. Řetězec je neperiodický, právě když jsou neperiodické všechny jeho stavy.
V nerozložitelném řetězci mají všechny stavy stejnou periodu, takže stačí ověřit jeden stav.
Počasí je obojí hned: všechny prvky P jsou kladné (m = 1 stačí) a pii > 0, takže návrat je možný za 1 krok a perioda je 1. Naproti tomu řetězec se dvěma stavy, který je pravidelně střídá (p12 = p21 = 1), je nerozložitelný, ale má periodu 2: π0Pt pro start (1; 0) donekonečna přeskakuje mezi (1; 0) a (0; 1), přestože stacionární rozdělení (½; ½) existuje.
Věta — ergodická věta pro konečné řetězce
Nechť (Xt)t ≥ 0 je homogenní Markovův řetězec s konečnou množinou stavů S = {1, …, n} a přechodovou maticí P, který je nerozložitelný a neperiodický. Pak
- řetězec má právě jedno stacionární rozdělení π = (π1, …, πn) a πj > 0 pro každé j ∈ S;
- pro každé počáteční rozdělení π0 platí limt→∞ π0Pt = π (po složkách);
- pro každé počáteční rozdělení a každý stav j ∈ S platí s pravděpodobností 1 limT→∞ |{t ∈ {0, …, T − 1} : Xt = j}|/T = πj, tj. podíl času stráveného ve stavu j se blíží πj;
- pro každý stav j ∈ S je střední doba návratu do j mj = E[min{t ≥ 1 : Xt = j} | X0 = j] = 1/πj.
Když se z každého počasí dá časem dostat do každého a řetězec se netočí v pravidelném kolečku, ustálí se na jednom rozdělení — a to nezávisle na začátku. Stacionární rozdělení zároveň říká, jak velkou část dní v dlouhém období bude které počasí.
Pro náš model vyjde stacionární rozdělení přesně (24/61; 22/61; 15/61) ≈ (0,393; 0,361; 0,246): dlouhodobě je slunečno 39 % dní, oblačno 36 % a prší ve 25 %. Po deštivém dni čekáme na další déšť v průměru 1/0,246 ≈ 4,07 dne.
Příklad — stacionární rozdělení počasí ručně
Hledáme π = (a; b; c) s πP = π. Po sloupcích matice:
- a = 0,6a + 0,3b + 0,2c, tedy 4a = 3b + 2c,
- b = 0,3a + 0,4b + 0,4c,
- c = 0,1a + 0,3b + 0,4c, tedy 6c = a + 3b.
Rovnice jsou závislé (sečtením všech tří dostaneme a + b + c = a + b + c), a tak prostřední vynecháme. Z třetí a = 6c − 3b, dosazením do první 24c − 12b = 3b + 2c, tedy b = 22c/15 a a = 6c − 66c/15 = 24c/15. Poměr je a : b : c = 24 : 22 : 15 a podmínka a + b + c = 1 dá
π = (24/61; 22/61; 15/61) ≈ (0,393; 0,361; 0,246).
Průměrná doba návratu do deště je podle ergodické věty mdéšť = 1/πdéšť = 61/15 ≈ 4,07 dne.
A simulace jednoho náhodného průběhu ukazuje ergodickou větu v akci:
| Simulace | slunečno | oblačno | déšť |
|---|---|---|---|
| 30 dní | 0,533 | 0,333 | 0,133 |
| 1 rok (365 dní) | 0,411 | 0,356 | 0,233 |
| 10 let (3 650 dní) | 0,401 | 0,360 | 0,239 |
| stacionární rozdělení | 0,393 | 0,361 | 0,246 |
Simulace losuje každý den zvlášť z řádku dnešního stavu: náhodné číslo u z [0, 1) se porovná s postupnými součty řádku. Po slunečném dni vede u < 0,6 na slunečno, 0,6 ≤ u < 0,9 na oblačno a zbytek na déšť:
stav = slunečno
for den in 1 … N:
u = náhodné číslo z [0, 1)
j = 0
while u ≥ P[stav][j]: # odečítej pravděpodobnosti, dokud u „nepadne“ do přihrádky
u = u − P[stav][j]
j = j + 1
stav = j
počet[stav] += 1
podíly = počet / N # podle ergodické věty → π
Stacionární rozdělení samo se dá spočítat bez losování, opakovaným násobením maticí:
import numpy as np
P = np.array([[0.6, 0.3, 0.1],
[0.3, 0.4, 0.3],
[0.2, 0.4, 0.4]])
pi = np.ones(3) / 3
for _ in range(100): # mocninná metoda: π ← π P
pi = pi @ P
print(pi.round(3)) # [0.393 0.361 0.246]
5. Markov, Oněgin a Máj
Markov prošel prvních 20 000 písmen Evžena Oněgina a každé označil jako samohlásku, nebo souhlásku. Samohlásek bylo 43,2 %. Kdyby po sobě písmena šla nezávisle, následovala by samohláska po samohlásce také ve 43,2 % případů. Markov ale napočítal jen 12,8 %, zatímco po souhlásce 66,3 %. Písmena na sobě závisejí — a přesto podíl samohlásek v dlouhém textu spolehlivě konverguje. To byl jeho důkaz, že zákon velkých čísel nepotřebuje nezávislost.
Zopakujme to na první sloce Máchova Máje („Byl pozdní večer – první máj…“). Má 311 písmen, samohlásek je 37,6 %. Odhad přechodové matice z počtů dvojic:
| Po… | samohláska | souhláska |
|---|---|---|
| samohlásce | 0,051 | 0,949 |
| souhlásce | 0,575 | 0,425 |
Ve sloce je jen 6 dvojic samohlásek za sebou — čeština je ráda střídá se souhláskami ještě víc než ruština. A stacionární rozdělení tohoto řetězce vyjde 37,7 % samohlásek: řetězec odhadnutý z textu se „ustálí“ prakticky na podílu, který v textu skutečně je (rozdíl dělají jen první a poslední písmeno).
p̂ij = nij/∑k nik
- p̂ij
- odhad přechodové pravděpodobnosti — stříška říká, že jde o číslo spočítané z dat, ne o skutečnou hodnotu
- nij
- kolikrát v textu po i přímo následovalo j — počítají se dvojice sousedních písmen, protože Markovův řetězec se dívá jen o jeden krok zpět
- ∑k nik
- kolikrát po i následovalo cokoli — dělením se řádek sečte na 1, jak to stochastická matice vyžaduje
Příklad — počty dvojic v první sloce
311 písmen dává 310 sousedních dvojic. Samohláska–samohláska 6, samohláska–souhláska 111, souhláska–samohláska 111, souhláska–souhláska 82. Odtud
p̂sam→sam = 6/117 = 0,051, p̂sam→sou = 111/117 = 0,949,
p̂sou→sam = 111/193 = 0,575, p̂sou→sou = 82/193 = 0,425
(barvy podle vzorce výše; 117 = 6 + 111 dvojic začíná samohláskou, 193 = 111 + 82 souhláskou).
Řetězec se dvěma stavy má stacionární rozdělení dané jednoduchým vzorcem:
πsam = psou→sam/psam→sou + psou→sam
- πsam
- dlouhodobý podíl samohlásek
- psou→sam
- tok do samohlásek — čím častěji se ze souhlásky přejde na samohlásku, tím víc samohlásek
- psam→sou
- tok ze samohlásek — čím rychleji se ze samohlásky odchází, tím méně jich je
Příklad — Máj a Oněgin podle vzorce
Máj (barvy podle vzorce výše):
πsam = 0,575/0,949 + 0,575 = 0,377.
Přesněji: přechodů samohláska→souhláska i souhláska→samohláska je stejně (111), takže
πsam = 111/193/111/117 + 111/193 = 1/193/117 + 1 =117/310.
Skutečný podíl samohlásek je 117/311 — liší se jen jmenovatelem, protože poslední písmeno sloky („r“) žádnou dvojici nezačíná.
Oněgin: z Markovových čísel (samohláska po samohlásce 12,8 %, tedy samohláska→souhláska 87,2 %; samohláska po souhlásce 66,3 %) vychází
πsam = 0,663/0,872 + 0,663 = 0,432
— přesně 43,2 % samohlásek, které Markov napočítal přímo.
6. PageRank: náhodný surfař
V roce 1998 navrhli Sergey Brin a Larry Page, zakladatelé Googlu, jak seřadit webové stránky podle důležitosti. Představili si surfaře, který náhodně kliká na odkazy, a zeptali se: na kterých stránkách bude trávit nejvíc času?
Definice — PageRank
Nechť N ≥ 1 je počet stránek, stránky jsou očíslované 1, …, N a L ⊆ {1, …, N} × {1, …, N} je množina odkazů: (i, j) ∈ L, právě když stránka i odkazuje na stránku j. Pro každou stránku i nechť ki = |{j : (i, j) ∈ L}| je počet jejích odchozích odkazů a nechť d ∈ (0, 1) je tlumicí faktor (obvykle d = 0,85). Řetězec náhodného surfaře je homogenní Markovův řetězec se stavy {1, …, N} a přechodovou maticí P = (pij), kde
- pij = 1 − d/N + d/ki, je-li (i, j) ∈ L;
- pij = 1 − d/N, je-li ki ≥ 1 a (i, j) ∉ L;
- pij = 1/N pro všechna j, je-li ki = 0 (stránka bez odkazů — surfař skočí kamkoli).
Každý řádek má součet ki · d/ki + N · 1 − d/N = 1 (resp. N · 1/N = 1), matice je tedy stochastická. PageRank je stacionární rozdělení PR = (PR(1), …, PR(N)) tohoto řetězce, tj. PR · P = PR a ∑j PR(j) = 1.
Slovy: surfař s pravděpodobností d klikne na jeden z odkazů aktuální stránky (všechny stejně pravděpodobně), jinak skočí na libovolnou z N stránek. Protože všechna pij > 0, je řetězec nerozložitelný a neperiodický a podle ergodické věty má PageRank jediný.
Důležitá stránka je ta, na kterou odkazují důležité stránky. Definice vypadá kruhová, ale stacionární rozdělení ji vyřeší: je to přesně „kolik času tam strávím, když budu donekonečna klikat“. Občasný skok kamkoli brání tomu, aby surfař uvízl v kroužku stránek.
Nejvýš je C (0,374), na kterou odkazuje skoro každá stránka. Zajímavější je A: má jediný příchozí odkaz, a přesto je druhá (0,342) — protože ten odkaz vede z C a C neodkazuje nikam jinam. B, na kterou odkazuje jen A, dostane polovinu váhy A (0,171). Stránky D, E a F, které se hlavně odkazují mezi sebou, zůstanou kolem 0,04. Skutečný PageRank počítal totéž pro miliardy stránek, mocninnou metodou.
Rovnice π = πP rozepsaná pro jednu stránku dává známý tvar PageRanku:
PR(j) = 1 − d/N + d ∑i→j PR(i)/ki
- PR(j)
- PageRank stránky j — podíl času, který na ní surfař stráví; součet přes všechny stránky je 1
- 1 − d/N
- příspěvek náhodných skoků — dostane ho každá stránka stejně, i ta, na kterou nic neodkazuje; díky němu je řetězec nerozložitelný a neperiodický
- d
- pravděpodobnost, že surfař klikne na odkaz, místo aby skočil jinam — 0,85 v původním článku Brina a Page
- ∑i→j
- součet jen přes stránky, které na j odkazují — odkaz je „hlas“ pro cílovou stránku
- PR(i)/ki
- hlas stránky i váží tolik, kolik je i sama důležitá, a dělí se mezi všech jejích ki odkazů — stránka s tisíci odkazy dá každému jen málo
Příklad — ověření A, B a C
Pro N = 6 a d = 0,85 je 1 − d/N = 1 − 0,85/6 = 0,025. Do A vede jen odkaz z C, které má jediný odkaz (kC = 1); do B jen z A, které má dva (barvy podle vzorce výše):
- PR(A) = 0,025 + 0,85 · 0,37351/1 = 0,34248,
- PR(B) = 0,025 + 0,85 · 0,34248/2 ≈ 0,1706,
- PR(C) = 0,025 + 0,85 · (PR(A)/2 + PR(B)/1 + PR(D)/2 + PR(E)/3 + PR(F)/1) = 0,025 + 0,85 · 0,41001 = 0,37351.
Hodnoty mocninné metody rovnici splňují — tak se pozná, že iterace doběhla.
PR = [1/N] * N # začni rovnoměrně
repeat:
nové = [(1 − d)/N] * N # náhodné skoky
for i in stránky:
if i nemá odkazy: # slepá ulička: skoč kamkoli
nové[j] += d · PR[i]/N pro všechna j
else:
for j in odkazy[i]:
nové[j] += d · PR[i]/k_i
PR = nové
until PR se skoro nemění
7. Řetězce, text a jazykové modely
Řetězec, jehož stavy jsou písmena, se dá nechat generovat. Z dvojic písmen v první sloce Máje odhadneme, co následuje po kterém písmenu, a pak losujeme. Takhle vypadá 90 znaků:
lal kou lasvavzvný dnkyl plásnětičaskol dnou ta javu snáscezepráro pl h jin trů bo kylalav
Nesmysl — ale nesmysl, který „zní česky“: střídá samohlásky a souhlásky, má krátká slova a slabiky jako „lás“ nebo „kol“. Stejný pokus udělal Claude Shannon v roce 1948 s angličtinou a ukázal, že s delším kontextem (trojice písmen, dvojice slov) text vypadá čím dál přirozeněji.
Příklad — řádek „l“ bigramového modelu
Text sloky převedeme na malá písmena a interpunkci nahradíme mezerou. Písmeno „l“ je v něm 31krát následováno dalším znakem: 13krát mezerou, 7krát „a“, 6krát „á“, 2krát „o“ a po jednom „i“, „h“, „u“. Podle vzorce pro odhad je tedy
P(mezera | l) = 13/31 ≈ 0,42, P(a | l) = 7/31 ≈ 0,23, P(á | l) = 6/31 ≈ 0,19,
P(o | l) = 2/31 ≈ 0,06 a ostatní 1/31 ≈ 0,03
(barvy podle vzorce pro odhad p̂ij v části o Máji).
Generování pak dělá totéž co simulace počasí: z řádku aktuálního znaku vylosuje další znak. Po „l“ je slovo nejčastěji u konce — „byl“, „lhal“, „kol“, „bol“.
Definice — n-gramový model
Nechť V je konečná neprázdná množina symbolů (slovník) a n ≥ 2 celé číslo. N-gramový model řádu n je soubor rozdělení pravděpodobnosti q(· | v) na V, jedno pro každý kontext v = (v1, …, vn−1) ∈ Vn−1. Posloupnost symbolů W1, W2, … s hodnotami ve V se podle modelu generuje tak, že pro každé t ≥ n a w ∈ V
P(Wt = w | W1, …, Wt−1) = q(w | Wt−n+1, …, Wt−1),
tj. další symbol závisí jen na n − 1 předchozích. Posloupnost Yt = (Wt−n+2, …, Wt) ∈ Vn−1 (t ≥ n − 1) je pak homogenní Markovův řetězec s množinou stavů Vn−1: jeho stavem je posledních n − 1 symbolů. Pro n = 2 (bigramy) je stavem jediný symbol a q(w | v) je přímo přechodová pravděpodobnost pvw.
Paměť řetězce se dá „natáhnout“ tím, že do stavu zabalíme víc minulosti. Jazykový model s kontextovým oknem je formálně taky Markovův řetězec: jeho stavem je celý text v okně. Rozdíl je v tom, že stavů je astronomicky mnoho, a tak přechodové pravděpodobnosti nejsou v tabulce, ale počítá je neuronová síť.
Příklad — kolik stavů má n-gramový model
Se slovníkem V symbolů má n-gramový model |V|n−1 stavů a v každém řádku |V| pravděpodobností. Sloka Máje používá 32 různých znaků (písmena a mezera):
- bigramy (n = 2): 32 stavů, matice 32 × 32 = 1 024 čísel — víc, než má sloka znaků, takže většina z nich vyjde nulová;
- trigramy: 322 = 1 024 stavů a přes 32 tisíc čísel — většinu dvojic písmen sloka vůbec neobsahuje a jejich řádky zůstanou prázdné;
- jazykový model se slovníkem 50 000 tokenů a oknem 1 000 tokenů: 50 0001 000 ≈ 104 699 stavů.
Proto delší kontext potřebuje buď obrovská data, nebo model, který pravděpodobnosti nepočítá z tabulky, ale odhaduje je funkcí — neuronovou sítí.
8. Kam vedou Markovovy řetězce
- Skryté Markovovy modely — co když stav nevidíme a vidíme jen jeho projevy? Tomu se věnuje příští díl.
- Markovovy rozhodovací procesy přidávají akce a odměny: na nich stojí zpětnovazební učení.
- Metody Monte Carlo s Markovovými řetězci (MCMC) postaví řetězec, jehož stacionární rozdělení je to, ze kterého chceme vzorkovat — typicky aposteriorní rozdělení v bayesovské statistice. Metropolisovo kritérium z dílu o simulovaném žíhání je právě takový řetězec.
9. Shrnutí
- Markovův řetězec nemá paměť: další stav závisí jen na současném. Popisuje ho stochastická přechodová matice P.
- Rozdělení se vyvíjí násobením maticí, πt = π0 Pt.
- Nerozložitelný neperiodický řetězec se ustálí na jediném stacionárním rozdělení π = π P, nezávisle na začátku; pro počasí (0,393; 0,361; 0,246).
- Markov ukázal závislost písmen na Oněginovi; v Máji následuje samohláska po samohlásce jen v 5 % případů.
- PageRank je stacionární rozdělení náhodného surfaře; n-gramové i dnešní jazykové modely jsou Markovovy řetězce s velkým stavem.
Chcete si to osahat? Nechte AI agenta postavit slovní bigramový model z celého Máje nebo z vlastních e-mailů a generovat z něj věty — a pak zkuste trigramy.
Máte na to jiný názor? Napište na support@coden-app.com.