Markovove reťazce: prechodová matica, stacionárne rozdelenie a PageRank
Markovova vlastnosť, prechodová matica a vývoj rozdelenia na modeli počasia, stacionárne rozdelenie a ergodická veta, Markovov rozbor samohlások na Máchovom Máji, PageRank a generovanie textu.
Séria Základy AI Diel 38 z 52
- Mapa umelej inteligencie: čo je čo a ako to do seba zapadá
- Stručná história umelej inteligencie: od Turinga po jazykové modely
- Dáta, model, tréning, inferencia: základné pojmy na jednom príklade
- Ako čítať matematický zápis: symboly, indexy, sumy a kvantifikátory
- Množiny a relácie: stavebnica, z ktorej sa skladajú definície v AI
- Funkcie a zobrazenia: prečo je každý model v AI funkcia
- Logika a dôkazy: pravidlá, podľa ktorých sa v AI uvažuje
- Grafy a stromy: štruktúra, na ktorej stojí hľadanie aj neurónové siete
- Lineárna algebra pre strojové učenie: vektory, matice a prečo AI hlavne násobí
- Derivácie, gradient a reťazové pravidlo: ako model zistí, ktorým smerom sa učiť
- Gradientný zostup: ako sa model učí
- Čo je pravdepodobnosť: od hodu kockou ku Kolmogorovovým axiómam
- Podmienená pravdepodobnosť a Bayesova veta: ako zmeniť odhad, keď sa dozviete niečo nové
- Náhodná premenná a distribučná funkcia: jedna funkcia, ktorá o rozdelení povie všetko
- Funkcia hustoty a pravdepodobnostná funkcia: prečo má spojitá premenná v bode pravdepodobnosť nula
- Stredná hodnota, rozptyl a kovariancia: kde rozdelenie leží, aké je široké a čo s čím súvisí
- Prehľad pravdepodobnostných rozdelení: Bernoulliho, binomické, Poissonovo, rovnomerné, normálne a exponenciálne
- Zákon veľkých čísel a centrálna limitná veta: prečo sa priemery správajú tak predvídateľne
- Štatistika a odhady parametrov: maximálna vierohodnosť, MAP a intervaly spoľahlivosti
- Teória informácie: entropia, krížová entropia a KL divergencia — odkiaľ sa berú stratové funkcie
- Prehľadávanie stavového priestoru: BFS, DFS, UCS a A* s animáciami
- Hry a protivník: minimax, alfa-beta orezávanie a Monte Carlo tree search
- Splňovanie obmedzujúcich podmienok: backtracking, propagácia obmedzení a AC-3 na sudoku a mape krajov
- Logika a znalostné systémy: dopredné a spätné reťazenie, rezolúcia a expertné systémy
- Plánovanie: STRIPS, svet kociek, heuristiky z relaxácie a plánovanie v AI agentoch
- Lokálne hľadanie a simulované žíhanie: obchodný cestujúci cez krajské mestá
- Genetické algoritmy: populácia, kríženie, mutácia a výber na batohu na výlet
- Evolučné stratégie a genetické programovanie: od pravidla jednej pätiny po Keplerov zákon
- Optimalizácia mravčou kolóniou: ako feromónová stopa nájde krátku cestu
- Optimalizácia rojom častíc: zotrvačnosť, vlastná skúsenosť a skúsenosť roja
- Neuroevolúcia: evolúcia váh aj tvaru neurónových sietí a algoritmus NEAT
- Fuzzy množiny a funkcie príslušnosti: ako zapísať „trochu teplo“
- Fuzzy logika a pravdepodobnosť: prečo „trochu teplo“ neznamená „pravdepodobne teplo“
- Fuzzy logika: t-normy, implikácie a pravidlá AK–TAK
- Fuzzy riadenie: Mamdani a Sugeno od ventilátora po kyvadlo na vozíku
- Fuzzy zhlukovanie: algoritmus fuzzy c-means a body medzi zhlukmi
- Neuro-fuzzy systémy (ANFIS): fuzzy pravidlá, ktoré sa učia z dát
- Markovove reťazce: prechodová matica, stacionárne rozdelenie a PageRank
- Skryté Markovove modely: Viterbiho algoritmus a nepoctivé kasíno
- Bayesovské siete: prečo je tráva mokrá a čo z toho vyplýva pre postrekovač
- Kalmanov filter: ako z nepresných meraní odhadnúť, kde auto je a ako rýchlo ide
- Druhy strojového učenia: s učiteľom, bez učiteľa, s čiastočným učiteľom a ďalšie
- Prompty, kontext a RAG: ako modelu dať správne informácie
- Variačné autoenkodéry (VAE): nové obrázky zo spojitého latentného priestoru
- Generatívne adversariálne siete (GAN): falšovateľ proti detektívovi
- Difúzne modely: ako sa z čistého šumu stane obrázok
- Markovove rozhodovacie procesy: stavy, akcie, odmeny a Bellmanove rovnice
- Q-learning a DQN: učenie hodnoty akcií od tabuľky po neurónovú sieť
- Policy gradient a PPO: učenie priamo stratégie
- Ako funguje AI agent: jazykový model v slučke s nástrojmi
- Programovanie s AI agentmi: zadanie, testy a kontrola
- Vyhodnocovanie a bezpečnosť AI systémov: ako merať a ako strážiť
Celá osnova série Hotovo: 52 z 83 tém
- Čo je Markovova vlastnosť a ako prechodová matica opisuje celý reťazec.
- Prečo sa nerozložiteľný reťazec ustáli na stacionárnom rozdelení nezávisle od začiatku.
- Ako z reťazcov vznikol PageRank a čo majú spoločné s jazykovými modelmi.
Čo sa hodí vedieť vopred: Podmienená pravdepodobnosť a Bayesova veta: ako zmeniť odhad, keď sa dozviete niečo nové, Lineárna algebra pre strojové učenie: vektory, matice a prečo AI hlavne násobí
V roku 1913 sedel ruský matematik Andrej Markov nad Puškinovým Eugenom Oneginom a robil niečo, čo by literárny vedec považoval za barbarstvo: počítal, koľkokrát po samohláske nasleduje ďalšia samohláska. Chcel ukázať, že zákon veľkých čísel platí aj pre javy, ktoré na sebe závisia — a vymyslel pritom model, ktorý dnes počíta poradie stránok vo vyhľadávači, predpovedá počasie, generuje text a stojí za celou rodinou algoritmov umelej inteligencie. Týmto dielom sa začína modul o pravdepodobnostných modeloch.
Nadväzuje na diely Podmienená pravdepodobnosť a Bayesova veta a Lineárna algebra pre strojové učenie.
1. Proces bez pamäti
Definícia — Markovov reťazec
Nech (Ω, 𝓕, P) je pravdepodobnostný priestor, S konečná neprázdna množina (množina stavov) a X0, X1, X2, … : Ω → S postupnosť náhodných premenných (Xt je stav v čase t ∈ ℕ0). Postupnosť (Xt)t ≥ 0 je Markovov reťazec práve vtedy, keď pre každé t ∈ ℕ0 a všetky stavy i0, …, it−1, i, j ∈ S také, že P(Xt = i, Xt−1 = it−1, …, X0 = i0) > 0, platí Markovova vlastnosť
P(Xt+1 = j | Xt = i, Xt−1 = it−1, …, X0 = i0) = P(Xt+1 = j | Xt = i).
Markovov reťazec je homogénny práve vtedy, keď existujú čísla pij ∈ [0, 1] (i, j ∈ S) také, že
P(Xt+1 = j | Xt = i) = pij pre všetky t ∈ ℕ0 a i, j ∈ S s P(Xt = i) > 0.
Slovami: rozdelenie budúceho stavu závisí len od súčasného stavu, nie od cesty, ktorou sa doň reťazec dostal; pri homogénnom reťazci navyše nezávisí ani od času t. Rozdelenie π0(i) = P(X0 = i) sa nazýva počiatočné rozdelenie.
Budúcnosť závisí len od prítomnosti, nie od toho, ako sme sa do nej dostali. Kto pozná dnešný stav, vie o zajtrajšku všetko, čo sa vedieť dá — história už nič nepridá. Je to zjednodušenie, ale veľmi užitočné: namiesto celej minulosti si stačí pamätať jedno číslo.
Čo Markovova vlastnosť prináša, je vidieť na pravdepodobnosti celej trajektórie. Vo všeobecnosti sa rozkladá reťazovým pravidlom na súčin podmienených pravdepodobností, z ktorých každá závisí od celej minulosti. Markovova vlastnosť z každej podmienky škrtne všetko okrem posledného stavu:
P(X0 = x0, …, XT = xT) = π0(x0) · ∏t=1T P(xt | xt−1)
- P(X0 = x0, …)
- pravdepodobnosť, že reťazec prejde presne touto postupnosťou stavov
- π0(x0)
- počiatočné rozdelenie — odkiaľ reťazec vyrazí, matica nehovorí; tento údaj musí prísť zvonka
- ∏t=1T
- súčin cez kroky — kroky na seba nadväzujú a každý musí „vyjsť“, preto sa násobia
- P(xt | xt−1)
- prechodová pravdepodobnosť jedného kroku, teda prvok prechodovej matice v riadku xt−1 a stĺpci xt — vďaka Markovovej vlastnosti závisí len od predchádzajúceho stavu, nie od celej histórie; bez nej by tu stálo P(xt | x0, …, xt−1)
2. Prechodová matica
Definícia — prechodová matica
Nech n ≥ 1. Matica A = (aij) ∈ ℝn×n je stochastická práve vtedy, keď
- aij ≥ 0 pre všetky i, j ∈ {1, …, n};
- ∑j=1n aij = 1 pre každé i ∈ {1, …, n} (každý riadok má súčet 1).
Nech (Xt)t ≥ 0 je homogénny Markovov reťazec s množinou stavov S = {1, …, n} a číslami pij z definície vyššie. Jeho prechodová matica je
P = (pij)i,j=1n ∈ ℝn×n, pij = P(Xt+1 = j | Xt = i).
Prechodová matica je stochastická: pre pevné i je riadok (pi1, …, pin) rozdelenie pravdepodobnosti stavu Xt+1 za podmienky Xt = i. Naopak každá stochastická matica spolu s počiatočným rozdelením π0 určuje homogénny Markovov reťazec. (Rovnaké písmeno P pre pravdepodobnosť aj pre maticu je ustálené; z kontextu je vždy jasné, ktoré je ktoré.)
Riadok matice je „čo sa stane zajtra, keď je dnes toto“. Musí dávať súčet jedna, pretože zajtra sa niečo stať musí.
Hračkový model počasia s tromi stavmi: po slnečnom dni je s pravdepodobnosťou 0,6 znova slnečno, 0,3 oblačno a 0,1 prší; po oblačnom 0,3; 0,4; 0,3; po daždivom 0,2; 0,4; 0,4 (vždy v poradí slnečno, oblačno, dážď). Ako graf:
Tá istá informácia ako matica — riadok je dnešné počasie, stĺpec zajtrajšie:
| Dnes ↓ / zajtra → | slnečno | oblačno | dážď | súčet riadku |
|---|---|---|---|---|
| slneč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 |
Príklad — pravdepodobnosť jednej trajektórie
Dnes je slnečno (π0 = (1; 0; 0)). Aká je pravdepodobnosť, že ďalšie tri dni budú slnečno, oblačno, dážď? Podľa vzorca pre trajektóriu
P = π0(slnečno) · pslnečno→slnečno · pslnečno→oblačno · poblačno→dážď = 1 · 0,6 · 0,3 · 0,3 = 0,054
(farby podľa vzorca pre trajektóriu vyššie).
Teda 5,4 %. Súčet cez všetkých 33 = 27 možných trojíc dní je 1 — presne preto, že každý riadok matice má súčet 1.
3. Ako sa rozdelenie vyvíja
Veta — rozdelenie po t krokoch
Nech (Xt)t ≥ 0 je homogénny Markovov reťazec s množinou stavov S = {1, …, n} a prechodovou maticou P ∈ ℝn×n. Pre t ∈ ℕ0 označme πt = (πt(1), …, πt(n)) ∈ ℝ1×n riadkový vektor rozdelenia Xt, t. j. πt(i) = P(Xt = i). Potom pre každé t ∈ ℕ0
- πt+1 = πt P, t. j. πt+1(j) = ∑i=1n πt(i) pij pre každé j ∈ S;
- πt = π0 Pt;
- pre každé m ∈ ℕ a i, j ∈ S s P(Xt = i) > 0 platí P(Xt+m = j | Xt = i) = (Pm)ij.
Prvok (i, j) matice Pm je teda pravdepodobnosť prechodu z i do j za m krokov. Bod 1 je zákon úplnej pravdepodobnosti s rozkladom podľa hodnoty Xt, bod 2 z neho vyplýva indukciou.
Keď je dnes slnečno, zajtra je rozdelenie (0,6; 0,3; 0,1). Pozajtra je to priemer riadkov matice vážený týmto rozdelením — (0,47; 0,34; 0,19). Každý deň jedno násobenie maticou, nič viac.
πt+1(j) = ∑i πt(i) · pij
- πt+1(j)
- pravdepodobnosť, že zajtra bude stav j — jedna zložka nového riadkového vektora
- ∑i
- súčet cez všetky dnešné stavy — do j sa dá prísť odkiaľkoľvek a tieto cesty sa navzájom vylučujú, takže sa ich pravdepodobnosti sčítajú (zákon úplnej pravdepodobnosti)
- πt(i)
- aké pravdepodobné je, že dnes sme v i — váha cesty cez i
- pij
- pravdepodobnosť prechodu z i do j — vďaka Markovovej vlastnosti stačí poznať len dnešný stav
Príklad — rozdelenie na pozajtra
Zajtra (po slnečnom dnešku) je π1 = (0,6; 0,3; 0,1). Pre pozajtra po zložkách — stĺpec matice vynásobený vektorom π1:
- slneč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ždom riadku je prvý činiteľ π1(i) a druhý pij (farby podľa vzorca vyššie). Súčet je opäť 1. Za tri dni vyjde rovnakým postupom (0,422; 0,353; 0,225).
Zaujímavá vec: zhruba po týždni je jedno, či dnes svieti slnko, alebo prší. Obe rozdelenia sa stretnú pri rovnakých hodnotách a ďalej sa nemenia. Reťazec „zabudol“, kde začal.
Veta — ako rýchlo reťazec zabúda
Nech P ∈ ℝn×n (n ≥ 2) je prechodová matica homogénneho Markovovho reťazca a predpokladajme, že
- P má n navzájom rôznych (vo všeobecnosti komplexných) vlastných čísel λ1, …, λn, očíslovaných tak, že λ1 = 1 a |λ2| ≥ |λ3| ≥ … ≥ |λn|;
- |λk| < 1 pre všetky k = 2, …, n.
Pre k = 2, …, n nech uk ∈ ℂ1×n je ľavý vlastný vektor prislúchajúci λk (ukP = λkuk) a nech π ∈ ℝ1×n je ľavý vlastný vektor prislúchajúci λ1 = 1 so súčtom zložiek 1 — stacionárne rozdelenie (definícia nižšie). Potom pre každé počiatočné rozdelenie π0 existujú čísla a2, …, an ∈ ℂ také, že pre všetky t ∈ ℕ0
πt = π0Pt = π + a2λ2tu2 + … + anλntun.
Dôvod. Vlastné vektory prislúchajúce rôznym vlastným číslam tvoria bázu, takže π0 = a1π + ∑k≥2 akuk, a násobenie Pt vynásobí k-tu zložku λkt. Pre k ≥ 2 má uk súčet zložiek 0 (z ukP1 = uk1, kde 1 je stĺpec jednotiek, a λk ≠ 1), preto porovnanie súčtov dá a1 = 1.
Odchýlka πt − π teda klesá k nule rádovo ako |λ2|t, kde λ2 je druhé najväčšie vlastné číslo v absolútnej hodnote.
πt ≈ π + a2u2 · λ2t
- πt
- rozdelenie po t dňoch
- π
- stacionárne rozdelenie — patrí k vlastnému číslu 1, ktoré sa umocňovaním nemení; preto je to jediná časť, ktorá prežije
- a2u2
- počiatočná odchýlka v smere druhého vlastného vektora — len tu sa prejaví, odkiaľ reťazec vyšiel (slnko, alebo dážď); pri zložke slnečno je pre slnečný štart kladná a pre daždivý záporná
- λ2t
- každým dňom sa odchýlka zmenší λ2-krát — rýchlosť zabúdania; zvyšné členy s menšími |λ| zmiznú ešte rýchlejšie, preto ich smieme vynechať
Príklad — vlastné čísla matice počasia
Súčet vlastných čísel je stopa matice, 0,6 + 0,4 + 0,4 = 1,4, a ich súčin je determinant, ktorý vyjde 0,01. Jedno vlastné číslo je 1 (riadky majú súčet 1), takže zvyšné dve spĺňajú λ2 + λ3 = 0,4 a λ2λ3 = 0,01. Sú to korene λ2 − 0,4λ + 0,01 = 0:
λ2,3 = 0,2 ± √0,03 = 2 ± √3/10, teda λ2 ≈ 0,373 a λ3 ≈ 0,027.
Odchýlka pravdepodobnosti slnečna od stacionárnej hodnoty 0,393 je pri slnečnom štarte po 3, 4, 5 dňoch 0,0286; 0,0107; 0,0040 — každý deň asi 0,373-krát menšia (farby podľa vzorca vyššie). Po týždni je 0,0006 a pri daždivom štarte −0,0005: oba začiatky sa líšia až na štvrtom desatinnom mieste. Na stotinu sa odchýlka zmenší za t dní, kde 0,373t = 0,01, teda
t = ln 0,01/ln 0,373 ≈ 4,7 dňa.
4. Stacionárne rozdelenie
Definícia — stacionárne rozdelenie
Nech P = (pij) ∈ ℝn×n je prechodová matica homogénneho Markovovho reťazca s množinou stavov S = {1, …, n}. Riadkový vektor π = (π1, …, πn) ∈ ℝ1×n je stacionárne rozdelenie reťazca práve vtedy, keď
- πj ≥ 0 pre každé j ∈ S a ∑j=1n πj = 1 (π je rozdelenie na S);
- π P = π, t. j. πj = ∑i=1n πi pij pre každé j ∈ S.
Podmienka 2 hovorí, že π je ľavý vlastný vektor matice P s vlastným číslom 1. Slovami: ak má X0 rozdelenie π, má podľa vety o rozdelení po t krokoch rozdelenie π aj každé Xt — rozdelenie sa krokom reťazca nezmení.
Definícia — nerozložiteľný a neperiodický reťazec
Nech (Xt)t ≥ 0 je homogénny Markovov reťazec s konečnou množinou stavov S a prechodovou maticou P. Pre i, j ∈ S a m ∈ ℕ označme pij(m) = (Pm)ij pravdepodobnosť prechodu z i do j za m krokov.
- Reťazec je nerozložiteľný (ireducibilný) práve vtedy, keď ∀ i, j ∈ S ∃ m ∈ ℕ : pij(m) > 0.
- Nech i ∈ S je stav, pre ktorý je množina R(i) = {m ∈ ℕ : pii(m) > 0} neprázdna. Perióda stavu i je d(i) = NSD R(i), najväčší spoločný deliteľ dĺžok všetkých ciest, ktoré sa do i vracajú.
- Stav i je neperiodický práve vtedy, keď d(i) = 1. Reťazec je neperiodický práve vtedy, keď sú neperiodické všetky jeho stavy.
V nerozložiteľnom reťazci majú všetky stavy rovnakú periódu, takže stačí overiť jeden stav.
Počasie je oboje hneď: všetky prvky P sú kladné (m = 1 stačí) a pii > 0, takže návrat je možný za 1 krok a perióda je 1. Naopak reťazec s dvoma stavmi, ktorý ich pravidelne strieda (p12 = p21 = 1), je nerozložiteľný, ale má periódu 2: π0Pt pre štart (1; 0) donekonečna preskakuje medzi (1; 0) a (0; 1), hoci stacionárne rozdelenie (½; ½) existuje.
Veta — ergodická veta pre konečné reťazce
Nech (Xt)t ≥ 0 je homogénny Markovov reťazec s konečnou množinou stavov S = {1, …, n} a prechodovou maticou P, ktorý je nerozložiteľný a neperiodický. Potom
- reťazec má práve jedno stacionárne rozdelenie π = (π1, …, πn) a πj > 0 pre každé j ∈ S;
- pre každé počiatočné rozdelenie π0 platí limt→∞ π0Pt = π (po zložkách);
- pre každé počiatočné rozdelenie a každý stav j ∈ S platí s pravdepodobnosťou 1 limT→∞ |{t ∈ {0, …, T − 1} : Xt = j}|/T = πj, t. j. podiel času stráveného v stave j sa blíži k πj;
- pre každý stav j ∈ S je stredná doba návratu do j mj = E[min{t ≥ 1 : Xt = j} | X0 = j] = 1/πj.
Keď sa z každého počasia dá časom dostať do každého a reťazec sa netočí v pravidelnom kolečku, ustáli sa na jednom rozdelení — a to nezávisle od začiatku. Stacionárne rozdelenie zároveň hovorí, akú veľkú časť dní v dlhom období bude ktoré počasie.
Pre náš model vyjde stacionárne rozdelenie presne (24/61; 22/61; 15/61) ≈ (0,393; 0,361; 0,246): dlhodobo je slnečno 39 % dní, oblačno 36 % a prší v 25 %. Po daždivom dni čakáme na ďalší dážď v priemere 1/0,246 ≈ 4,07 dňa.
Príklad — stacionárne rozdelenie počasia ručne
Hľadáme π = (a; b; c) s πP = π. Po stĺpcoch matice:
- a = 0,6a + 0,3b + 0,2c, teda 4a = 3b + 2c,
- b = 0,3a + 0,4b + 0,4c,
- c = 0,1a + 0,3b + 0,4c, teda 6c = a + 3b.
Rovnice sú závislé (sčítaním všetkých troch dostaneme a + b + c = a + b + c), a tak prostrednú vynecháme. Z tretej a = 6c − 3b, dosadením do prvej 24c − 12b = 3b + 2c, teda b = 22c/15 a a = 6c − 66c/15 = 24c/15. Pomer je a : b : c = 24 : 22 : 15 a podmienka a + b + c = 1 dá
π = (24/61; 22/61; 15/61) ≈ (0,393; 0,361; 0,246).
Priemerná doba návratu do dažďa je podľa ergodickej vety mdážď = 1/πdážď = 61/15 ≈ 4,07 dňa.
A simulácia jedného náhodného priebehu ukazuje ergodickú vetu v akcii:
| Simulácia | slnečno | oblačno | dážď |
|---|---|---|---|
| 30 dní | 0,533 | 0,333 | 0,133 |
| 1 rok (365 dní) | 0,411 | 0,356 | 0,233 |
| 10 rokov (3 650 dní) | 0,401 | 0,360 | 0,239 |
| stacionárne rozdelenie | 0,393 | 0,361 | 0,246 |
Simulácia losuje každý deň zvlášť z riadku dnešného stavu: náhodné číslo u z [0, 1) sa porovná s postupnými súčtami riadku. Po slnečnom dni vedie u < 0,6 na slnečno, 0,6 ≤ u < 0,9 na oblačno a zvyšok na dážď:
stav = slnečno
for den in 1 … N:
u = náhodné číslo z [0, 1)
j = 0
while u ≥ P[stav][j]: # odčítavaj pravdepodobnosti, kým u „nepadne“ do priehradky
u = u − P[stav][j]
j = j + 1
stav = j
počet[stav] += 1
podíly = počet / N # podľa ergodickej vety → π
Samotné stacionárne rozdelenie sa dá vypočítať bez losovania, opakovaným násobením maticou:
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): # mocninová metóda: π ← π P
pi = pi @ P
print(pi.round(3)) # [0.393 0.361 0.246]
5. Markov, Onegin a Máj
Markov prešiel prvých 20 000 písmen Eugena Onegina a každé označil ako samohlásku, alebo spoluhlásku. Samohlások bolo 43,2 %. Keby po sebe písmená išli nezávisle, nasledovala by samohláska po samohláske tiež v 43,2 % prípadov. Markov však napočítal len 12,8 %, zatiaľ čo po spoluhláske 66,3 %. Písmená na sebe závisia — a predsa podiel samohlások v dlhom texte spoľahlivo konverguje. To bol jeho dôkaz, že zákon veľkých čísel nepotrebuje nezávislosť.
Zopakujme to na prvej strofe básne Karla Hynka Máchu Máj („Byl pozdní večer – první máj…“, „Bol neskorý večer – prvý máj…“). Má 311 písmen, samohlások je 37,6 %. Odhad prechodovej matice z počtov dvojíc:
| Po… | samohláska | spoluhláska |
|---|---|---|
| samohláske | 0,051 | 0,949 |
| spoluhláske | 0,575 | 0,425 |
V strofe je len 6 dvojíc samohlások za sebou — čeština ich rada strieda so spoluhláskami ešte viac než ruština. A stacionárne rozdelenie tohto reťazca vyjde 37,7 % samohlások: reťazec odhadnutý z textu sa „ustáli“ prakticky na podiele, ktorý v texte skutočne je (rozdiel robia len prvé a posledné písmeno).
p̂ij = nij/∑k nik
- p̂ij
- odhad prechodovej pravdepodobnosti — strieška hovorí, že ide o číslo vypočítané z dát, nie o skutočnú hodnotu
- nij
- koľkokrát v texte po i priamo nasledovalo j — počítajú sa dvojice susedných písmen, pretože Markovov reťazec sa pozerá len o jeden krok späť
- ∑k nik
- koľkokrát po i nasledovalo čokoľvek — delením sa riadok sčíta na 1, ako to stochastická matica vyžaduje
Príklad — počty dvojíc v prvej strofe
311 písmen dáva 310 susedných dvojíc. Samohláska–samohláska 6, samohláska–spoluhláska 111, spoluhláska–samohláska 111, spoluhláska–spoluhláska 82. Odtiaľ
p̂sam→sam = 6/117 = 0,051, p̂sam→spo = 111/117 = 0,949,
p̂spo→sam = 111/193 = 0,575, p̂spo→spo = 82/193 = 0,425
(farby podľa vzorca vyššie; 117 = 6 + 111 dvojíc začína samohláskou, 193 = 111 + 82 spoluhláskou).
Reťazec s dvoma stavmi má stacionárne rozdelenie dané jednoduchým vzorcom:
πsam = pspo→sam/psam→spo + pspo→sam
- πsam
- dlhodobý podiel samohlások
- pspo→sam
- tok do samohlások — čím častejšie sa zo spoluhlásky prejde na samohlásku, tým viac samohlások
- psam→spo
- tok zo samohlások — čím rýchlejšie sa zo samohlásky odchádza, tým menej ich je
Príklad — Máj a Onegin podľa vzorca
Máj (farby podľa vzorca vyššie):
πsam = 0,575/0,949 + 0,575 = 0,377.
Presnejšie: prechodov samohláska→spoluhláska aj spoluhláska→samohláska je rovnako (111), takže
πsam = 111/193/111/117 + 111/193 = 1/193/117 + 1 = 117/310.
Skutočný podiel samohlások je 117/311 — líši sa len menovateľom, pretože posledné písmeno strofy („r“) žiadnu dvojicu nezačína.
Onegin: z Markovových čísel (samohláska po samohláske 12,8 %, teda samohláska→spoluhláska 87,2 %; samohláska po spoluhláske 66,3 %) vychádza
πsam = 0,663/0,872 + 0,663 = 0,432
— presne 43,2 % samohlások, ktoré Markov napočítal priamo.
6. PageRank: náhodný surfer
V roku 1998 navrhli Sergey Brin a Larry Page, zakladatelia Googlu, ako zoradiť webové stránky podľa dôležitosti. Predstavili si surfera, ktorý náhodne kliká na odkazy, a opýtali sa: na ktorých stránkach bude tráviť najviac času?
Definícia — PageRank
Nech N ≥ 1 je počet stránok, stránky sú očíslované 1, …, N a L ⊆ {1, …, N} × {1, …, N} je množina odkazov: (i, j) ∈ L práve vtedy, keď stránka i odkazuje na stránku j. Pre každú stránku i nech ki = |{j : (i, j) ∈ L}| je počet jej odchádzajúcich odkazov a nech d ∈ (0, 1) je tlmiaci faktor (zvyčajne d = 0,85). Reťazec náhodného surfera je homogénny Markovov reťazec so stavmi {1, …, N} a prechodovou maticou P = (pij), kde
- pij = 1 − d/N + d/ki, ak (i, j) ∈ L;
- pij = 1 − d/N, ak ki ≥ 1 a (i, j) ∉ L;
- pij = 1/N pre všetky j, ak ki = 0 (stránka bez odkazov — surfer skočí kamkoľvek).
Každý riadok má súčet ki · d/ki + N · 1 − d/N = 1 (resp. N · 1/N = 1), matica je teda stochastická. PageRank je stacionárne rozdelenie PR = (PR(1), …, PR(N)) tohto reťazca, t. j. PR · P = PR a ∑j PR(j) = 1.
Slovami: surfer s pravdepodobnosťou d klikne na jeden z odkazov aktuálnej stránky (všetky rovnako pravdepodobne), inak skočí na ľubovoľnú z N stránok. Keďže všetky pij > 0, je reťazec nerozložiteľný a neperiodický a podľa ergodickej vety má PageRank jediný.
Dôležitá stránka je tá, na ktorú odkazujú dôležité stránky. Definícia vyzerá kruhová, ale stacionárne rozdelenie ju vyrieši: je to presne „koľko času tam strávim, keď budem donekonečna klikať“. Občasný skok kamkoľvek bráni tomu, aby surfer uviazol v krúžku stránok.
Najvyššie je C (0,374), na ktorú odkazuje skoro každá stránka. Zaujímavejšia je A: má jediný prichádzajúci odkaz, a predsa je druhá (0,342) — pretože ten odkaz vedie z C a C neodkazuje nikam inam. B, na ktorú odkazuje len A, dostane polovicu váhy A (0,171). Stránky D, E a F, ktoré sa hlavne odkazujú medzi sebou, zostanú okolo 0,04. Skutočný PageRank počítal to isté pre miliardy stránok, mocninovou metódou.
Rovnica π = πP rozpísaná pre jednu stránku dáva známy tvar PageRanku:
PR(j) = 1 − d/N + d ∑i→j PR(i)/ki
- PR(j)
- PageRank stránky j — podiel času, ktorý na nej surfer strávi; súčet cez všetky stránky je 1
- 1 − d/N
- príspevok náhodných skokov — dostane ho každá stránka rovnako, aj tá, na ktorú nič neodkazuje; vďaka nemu je reťazec nerozložiteľný a neperiodický
- d
- pravdepodobnosť, že surfer klikne na odkaz, namiesto aby skočil inam — 0,85 v pôvodnom článku Brina a Pagea
- ∑i→j
- súčet len cez stránky, ktoré na j odkazujú — odkaz je „hlas“ pre cieľovú stránku
- PR(i)/ki
- hlas stránky i váži toľko, koľko je i sama dôležitá, a delí sa medzi všetkých jej ki odkazov — stránka s tisíckami odkazov dá každému len málo
Príklad — overenie A, B a C
Pre N = 6 a d = 0,85 je 1 − d/N = 1 − 0,85/6 = 0,025. Do A vedie len odkaz z C, ktorá má jediný odkaz (kC = 1); do B len z A, ktorá má dva (farby podľa vzorca vyššie):
- 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 mocninovej metódy rovnicu spĺňajú — tak sa spozná, že iterácia dobehla.
PR = [1/N] * N # začni rovnomerne
repeat:
nové = [(1 − d)/N] * N # náhodné skoky
for i in stránky:
if i nemá odkazy: # slepá ulička: skoč kamkoľvek
nové[j] += d · PR[i]/N pre všetky j
else:
for j in odkazy[i]:
nové[j] += d · PR[i]/k_i
PR = nové
until PR sa skoro nemení
7. Reťazce, text a jazykové modely
Reťazec, ktorého stavy sú písmená, sa dá nechať generovať. Z dvojíc písmen v prvej strofe Mája odhadneme, čo nasleduje po ktorom písmene, a potom losujeme. Takto vyzerá 90 znakov:
lal kou lasvavzvný dnkyl plásnětičaskol dnou ta javu snáscezepráro pl h jin trů bo kylalav
Nezmysel — ale nezmysel, ktorý „znie po česky“: strieda samohlásky a spoluhlásky, má krátke slová a slabiky ako „lás“ alebo „kol“. Rovnaký pokus urobil Claude Shannon v roku 1948 s angličtinou a ukázal, že s dlhším kontextom (trojice písmen, dvojice slov) text vyzerá čoraz prirodzenejšie.
Príklad — riadok „l“ bigramového modelu
Text strofy prevedieme na malé písmená a interpunkciu nahradíme medzerou. Po písmene „l“ v ňom 31-krát nasleduje ďalší znak: 13-krát medzera, 7-krát „a“, 6-krát „á“, 2-krát „o“ a po jednom „i“, „h“, „u“. Podľa vzorca pre odhad je teda
P(medzera | 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
(farby podľa vzorca pre odhad p̂ij v časti o Máji).
Generovanie potom robí to isté čo simulácia počasia: z riadku aktuálneho znaku vylosuje ďalší znak. Po „l“ je slovo najčastejšie na konci — „byl“, „lhal“, „kol“, „bol“.
Definícia — n-gramový model
Nech V je konečná neprázdna množina symbolov (slovník) a n ≥ 2 celé číslo. N-gramový model rádu n je súbor rozdelení pravdepodobnosti q(· | v) na V, jedno pre každý kontext v = (v1, …, vn−1) ∈ Vn−1. Postupnosť symbolov W1, W2, … s hodnotami vo V sa podľa modelu generuje tak, že pre každé t ≥ n a w ∈ V
P(Wt = w | W1, …, Wt−1) = q(w | Wt−n+1, …, Wt−1),
t. j. ďalší symbol závisí len od n − 1 predchádzajúcich. Postupnosť Yt = (Wt−n+2, …, Wt) ∈ Vn−1 (t ≥ n − 1) je potom homogénny Markovov reťazec s množinou stavov Vn−1: jeho stavom je posledných n − 1 symbolov. Pre n = 2 (bigramy) je stavom jediný symbol a q(w | v) je priamo prechodová pravdepodobnosť pvw.
Pamäť reťazca sa dá „natiahnuť“ tým, že do stavu zabalíme viac minulosti. Jazykový model s kontextovým oknom je formálne tiež Markovov reťazec: jeho stavom je celý text v okne. Rozdiel je v tom, že stavov je astronomicky veľa, a tak prechodové pravdepodobnosti nie sú v tabuľke, ale počíta ich neurónová sieť.
Príklad — koľko stavov má n-gramový model
So slovníkom V symbolov má n-gramový model |V|n−1 stavov a v každom riadku |V| pravdepodobností. Strofa Mája používa 32 rôznych znakov (písmená a medzera):
- bigramy (n = 2): 32 stavov, matica 32 × 32 = 1 024 čísel — viac, než má strofa znakov, takže väčšina z nich vyjde nulová;
- trigramy: 322 = 1 024 stavov a vyše 32 tisíc čísel — väčšinu dvojíc písmen strofa vôbec neobsahuje a ich riadky zostanú prázdne;
- jazykový model so slovníkom 50 000 tokenov a oknom 1 000 tokenov: 50 0001 000 ≈ 104 699 stavov.
Preto dlhší kontext potrebuje buď obrovské dáta, alebo model, ktorý pravdepodobnosti nepočíta z tabuľky, ale odhaduje ich funkciou — neurónovou sieťou.
8. Kam vedú Markovove reťazce
- Skryté Markovove modely — čo ak stav nevidíme a vidíme len jeho prejavy? Tomu sa venuje budúci diel.
- Markovove rozhodovacie procesy pridávajú akcie a odmeny: na nich stojí učenie posilňovaním.
- Metódy Monte Carlo s Markovovými reťazcami (MCMC) postavia reťazec, ktorého stacionárne rozdelenie je to, z ktorého chceme vzorkovať — typicky aposteriórne rozdelenie v bayesovskej štatistike. Metropolisovo kritérium z dielu o simulovanom žíhaní je práve takýto reťazec.
9. Zhrnutie
- Markovov reťazec nemá pamäť: ďalší stav závisí len od súčasného. Opisuje ho stochastická prechodová matica P.
- Rozdelenie sa vyvíja násobením maticou, πt = π0 Pt.
- Nerozložiteľný neperiodický reťazec sa ustáli na jedinom stacionárnom rozdelení π = π P, nezávisle od začiatku; pre počasie (0,393; 0,361; 0,246).
- Markov ukázal závislosť písmen na Oneginovi; v Máji nasleduje samohláska po samohláske len v 5 % prípadov.
- PageRank je stacionárne rozdelenie náhodného surfera; n-gramové aj dnešné jazykové modely sú Markovove reťazce s veľkým stavom.
Chcete si to vyskúšať na vlastnej koži? Nechajte AI agenta postaviť slovný bigramový model z celého Mája alebo z vlastných e-mailov a generovať z neho vety — a potom skúste trigramy.
Máte na to iný názor? Napíšte na support@coden-app.com.