Přeskočit na obsah
coden

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.

13 minut Matěj Žalmánek 2026-10-15

Série Základy AI Díl 38 z 83
  1. Mapa umělé inteligence: co je co a jak to do sebe zapadá
  2. Stručná historie umělé inteligence: od Turinga po jazykové modely
  3. Data, model, trénink, inference: základní pojmy na jednom příkladu
  4. Jak číst matematický zápis: symboly, indexy, sumy a kvantifikátory
  5. Množiny a relace: stavebnice, ze které se skládají definice v AI
  6. Funkce a zobrazení: proč je každý model v AI funkce
  7. Logika a důkazy: pravidla, podle kterých se v AI uvažuje
  8. Grafy a stromy: struktura, na které stojí hledání i neuronové sítě
  9. Lineární algebra pro strojové učení: vektory, matice a proč AI hlavně násobí
  10. Derivace, gradient a řetízkové pravidlo: jak model zjistí, kterým směrem se učit
  11. Gradientní sestup: jak se model učí
  12. Co je pravděpodobnost: od hodu kostkou ke Kolmogorovovým axiomům
  13. Podmíněná pravděpodobnost a Bayesova věta: jak změnit odhad, když se dozvíte něco nového
  14. Náhodná veličina a distribuční funkce: jedna funkce, která o rozdělení řekne všechno
  15. Funkce hustoty a pravděpodobnostní funkce: proč má spojitá veličina v bodě pravděpodobnost nula
  16. Střední hodnota, rozptyl a kovariance: kde rozdělení leží, jak je široké a co s čím souvisí
  17. Přehled pravděpodobnostních rozdělení: Bernoulli, binomické, Poisson, rovnoměrné, normální a exponenciální
  18. Zákon velkých čísel a centrální limitní věta: proč se průměry chovají tak předvídatelně
  19. Statistika a odhady parametrů: maximální věrohodnost, MAP a intervaly spolehlivosti
  20. Teorie informace: entropie, křížová entropie a KL divergence — odkud se berou ztrátové funkce
  21. Prohledávání stavového prostoru: BFS, DFS, UCS a A* s animacemi
  22. Hry a protivník: minimax, alfa-beta ořezávání a Monte Carlo tree search
  23. Splňování omezujících podmínek: backtracking, propagace omezení a AC-3 na sudoku a mapě krajů
  24. Logika a znalostní systémy: dopředné a zpětné řetězení, rezoluce a expertní systémy
  25. Plánování: STRIPS, svět kostek, heuristiky z relaxace a plánování v AI agentech
  26. Lokální hledání a simulované žíhání: obchodní cestující přes krajská města
  27. Genetické algoritmy: populace, křížení, mutace a výběr na batohu na výlet
  28. Evoluční strategie a genetické programování: od pravidla jedné pětiny po Keplerův zákon
  29. Optimalizace mravenčí kolonií: jak feromonová stopa najde krátkou cestu
  30. Optimalizace hejnem částic: setrvačnost, vlastní zkušenost a zkušenost hejna
  31. Neuroevoluce: evoluce vah i tvaru neuronových sítí a algoritmus NEAT
  32. Fuzzy množiny a funkce příslušnosti: jak zapsat „trochu teplo“
  33. Fuzzy logika a pravděpodobnost: proč „trochu teplo“ neznamená „pravděpodobně teplo“
  34. Fuzzy logika: t-normy, implikace a pravidla KDYŽ–PAK
  35. Fuzzy řízení: Mamdani a Sugeno od ventilátoru po kyvadlo na vozíku
  36. Fuzzy shlukování: algoritmus fuzzy c-means a body mezi shluky
  37. Neuro-fuzzy systémy (ANFIS): fuzzy pravidla, která se učí z dat
  38. Markovovy řetězce: přechodová matice, stacionární rozdělení a PageRank
  39. Skryté Markovovy modely: Viterbiho algoritmus a nepoctivé kasino
  40. Bayesovské sítě: proč je tráva mokrá a co z toho plyne pro postřikovač
  41. Kalmanův filtr: jak z nepřesných měření odhadnout, kde auto je a jak rychle jede
  42. Druhy strojového učení: s učitelem, bez učitele, s částečným učitelem a další
  43. Přeučení a regularizace: proč model, který zná data nazpaměť, selže
  44. Vyhodnocení modelu: křížová validace, F1 a křivka ROC
  45. Shlukování a snížení dimenze: k-means, PCA a t-SNE
  46. Klasifikace a regrese: dvě úlohy učení s učitelem
  47. Lineární regrese: nejmenší čtverce geometricky i maticově
  48. Polynomiální a nelineární regrese: jak přímku ohnout
  49. Logistická regrese: sigmoida, šance a křížová entropie
  50. Vícetřídní klasifikace a softmax: od dvou tříd k mnoha
  51. Naivní Bayesův klasifikátor: spamový filtr, který funguje lépe, než by měl
  52. Ztrátové funkce: co přesně model minimalizuje
  53. Rozhodovací stromy a k nejbližších sousedů: modely bez vzorců
  54. Ansámbly: náhodný les a gradient boosting
  55. SVM a jádrový trik: nejširší hranice a jak ji ohnout
  56. Signál a vzorkování: proč platí Nyquistův teorém
  57. Fourierova transformace: rozklad signálu na frekvence
  58. Filtry a konvoluce: vyhlazení, hrany a odstranění šumu
  59. Zvuk a řeč: spektrogram, melová škála a MFCC
  60. Obraz jako signál: pixely, barvy, konvoluce a hrany
  61. Perceptron a umělý neuron: nejjednodušší neuronová síť a co neumí
  62. Neuronová síť od nuly: zpětné šíření chyby krok za krokem
  63. Aktivace, inicializace a normalizace: drobnosti, na kterých hluboká síť stojí
  64. Konvoluční sítě: jak síť poznává obrázky
  65. Rekurentní sítě: paměť pro posloupnosti a mizející gradient
  66. LSTM a GRU: brány, které rozhodují, co si síť zapamatuje
  67. Autoenkodéry: síť, která se učí data stlačit a zase rozbalit
  68. Embeddingy a word2vec: jak se slovo stane vektorem
  69. Mechanismus pozornosti: jak se model naučí, kam se dívat
  70. Transformery a velké jazykové modely: architektura krok za krokem
  71. Tokenizace: jak se text rozseká na kousky pro model
  72. Předtrénování a škálování: proč větší model a víc dat funguje
  73. Doladění a RLHF: jak se z doplňovače textu stane asistent
  74. Prompty, kontext a RAG: jak modelu dát správné informace
  75. Variační autoenkodéry (VAE): nové obrázky ze spojitého latentního prostoru
  76. Generativní adversariální sítě (GAN): padělatel proti detektivovi
  77. Difúzní modely: jak se z čistého šumu stane obrázek
  78. Markovovy rozhodovací procesy: stavy, akce, odměny a Bellmanovy rovnice
  79. Q-learning a DQN: učení hodnoty akcí od tabulky po neuronovou síť
  80. Policy gradient a PPO: učení přímo strategie
  81. Jak funguje AI agent: jazykový model ve smyčce s nástroji
  82. Programování s AI agenty: zadání, testy a kontrola
  83. 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 si odnesete
  • 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í.

Laicky řečeno

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)
Celý řetězec tak popisuje počáteční rozdělení a jedna tabulka přechodů.

2. Přechodová matice

Definice — přechodová matice

Nechť n ≥ 1. Matice A = (aij) ∈ ℝn×n je stochastická, právě když

  1. aij ≥ 0 pro všechna i, j ∈ {1, …, n};
  2. ∑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é.)

Laicky řečeno

Řá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:

0,3 0,1 0,6 slunečno 0,3 0,3 0,4 oblačno 0,2 0,4 0,4 déšť
Přechodový diagram počasí

Táž informace jako matice — řádek je dnešní počasí, sloupec zítřejší:

Dnes ↓ / zítra →slunečnooblačnodéšťsoučet řádku
slunečno0,60,30,11
oblačno0,30,40,31
déšť0,20,40,41
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

  1. πt+1 = πt P, tj. πt+1(j) = ∑i=1n πt(i) pij pro každé j ∈ S;
  2. πt = π0 Pt;
  3. 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í.

Laicky řečeno

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
Pro všechna j naráz je to součin řádkového vektoru s maticí: πt+1 = πtP.
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).

00,51 0246810 den (počet dní od dneška) pravděpodobnost stavu P (0–1)
Rozdělení počasí po dnech slunečnooblačnodéšť plně: dnes slunečnopřerušovaně: dnes prší

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

  1. 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|;
  2. |λ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ž

  1. πj ≥ 0 pro každé j ∈ S a ∑j=1n πj = 1 (π je rozdělení na S);
  2. π 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ů.

  1. Řetězec je nerozložitelný (ireducibilní), právě když ∀ i, j ∈ S ∃ m ∈ ℕ : pij(m) > 0.
  2. 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í.
  3. 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

  1. řetězec má právě jedno stacionární rozdělení π = (π1, …, πn) a πj > 0 pro každé j ∈ S;
  2. pro každé počáteční rozdělení π0 platí limt→∞ π0Pt = π (po složkách);
  3. 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;
  4. 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.
Laicky řečeno

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:

Simulaceslunečnooblačnodéšť
30 dní0,5330,3330,133
1 rok (365 dní)0,4110,3560,233
10 let (3 650 dní)0,4010,3600,239
stacionární rozdělení0,3930,3610,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áskasouhláska
samohlásce0,0510,949
souhlásce0,5750,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
Relativní četnost je zároveň odhad metodou maximální věrohodnosti: ze všech matic dává pozorovanému textu největší pravděpodobnost.
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
Vzorec plyne z rovnováhy toků: v ustáleném stavu πsam · psam→sou = πsou · psou→sam a πsam + πsou = 1.
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

  1. pij = 1 − d/N + d/ki,   je-li (i, j) ∈ L;
  2. pij = 1 − d/N,   je-li ki ≥ 1 a (i, j) ∉ L;
  3. 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ý.

Laicky řečeno

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.

A 0,342 B 0,171 C 0,374 D 0,036 E 0,041 F 0,036
PageRank malého webu; plocha kruhu odpovídá PageRanku

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
V tomto tvaru platí, když má každá stránka aspoň jeden odkaz (ki ≥ 1), jako v našem malém webu; stránka bez odkazů by svůj PageRank rozdělila rovným dílem mezi všech N stránek.
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.

Laicky řečeno

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.

Agent na vašem počítači, ovládaný z telefonu