Catene di Markov: matrice di transizione, distribuzione stazionaria e PageRank
La proprietà di Markov, la matrice di transizione e l’evoluzione della distribuzione in un modello del tempo, la distribuzione stazionaria e il teorema ergodico, l’analisi delle vocali di Markov applicata al Máj di Mácha, il PageRank e la generazione di testo.
Serie Basi di IA Parte 38 di 52
- Mappa dell’intelligenza artificiale: che cos’è ciascuna cosa e come si incastra tutto
- Breve storia dell’intelligenza artificiale: da Turing ai modelli linguistici
- Dati, modello, addestramento, inferenza: i concetti di base su un unico esempio
- Come leggere la notazione matematica: simboli, indici, sommatorie e quantificatori
- Insiemi e relazioni: i mattoncini con cui si costruiscono le definizioni nell’IA
- Funzioni e applicazioni: perché ogni modello di IA è una funzione
- Logica e dimostrazioni: le regole con cui si ragiona nell’IA
- Grafi e alberi: la struttura su cui poggiano la ricerca e le reti neurali
- Algebra lineare per l’apprendimento automatico: vettori, matrici e perché l’IA soprattutto moltiplica
- Derivate, gradiente e regola della catena: come un modello capisce in quale direzione imparare
- Discesa del gradiente: come impara un modello
- Che cos’è la probabilità: dal lancio di un dado agli assiomi di Kolmogorov
- Probabilità condizionata e teorema di Bayes: come cambiare una stima quando scopri qualcosa di nuovo
- Variabile aleatoria e funzione di ripartizione: una sola funzione che dice tutto sulla distribuzione
- Funzione di densità e funzione di massa: perché una variabile continua ha probabilità zero in un punto
- Valore atteso, varianza e covarianza: dove si trova una distribuzione, quanto è larga e che cosa è legato a che cosa
- Panoramica delle distribuzioni di probabilità: Bernoulli, binomiale, Poisson, uniforme, normale ed esponenziale
- Legge dei grandi numeri e teorema del limite centrale: perché le medie si comportano in modo così prevedibile
- Statistica e stima dei parametri: massima verosimiglianza, MAP e intervalli di confidenza
- Teoria dell’informazione: entropia, entropia incrociata e divergenza KL — da dove vengono le funzioni di perdita
- Ricerca nello spazio degli stati: BFS, DFS, UCS e A* con animazioni
- Giochi e avversari: minimax, potatura alfa-beta e Monte Carlo tree search
- Soddisfacimento di vincoli: backtracking, propagazione dei vincoli e AC-3 su un sudoku e una mappa delle regioni ceche
- Logica e sistemi basati sulla conoscenza: concatenazione in avanti e all’indietro, risoluzione e sistemi esperti
- Pianificazione: STRIPS, il mondo dei blocchi, euristiche dal rilassamento e pianificazione negli agenti IA
- Ricerca locale e ricottura simulata: un commesso viaggiatore tra i capoluoghi di regione cechi
- Algoritmi genetici: popolazione, incrocio, mutazione e selezione su uno zaino per l’escursione
- Strategie evolutive e programmazione genetica: dalla regola di un quinto alla legge di Keplero
- Ottimizzazione con colonie di formiche: come una traccia di feromone trova un percorso breve
- Ottimizzazione a sciame di particelle: inerzia, esperienza propria ed esperienza dello sciame
- Neuroevoluzione: evoluzione dei pesi e della forma delle reti neurali e l’algoritmo NEAT
- Insiemi fuzzy e funzioni di appartenenza: come scrivere «un po’ caldo»
- Logica fuzzy e probabilità: perché «un po’ caldo» non significa «probabilmente caldo»
- Logica fuzzy: t-norme, implicazioni e regole SE–ALLORA
- Controllo fuzzy: Mamdani e Sugeno, dal ventilatore al pendolo inverso su un carrello
- Clustering fuzzy: l’algoritmo fuzzy c-means e i punti tra i cluster
- Sistemi neuro-fuzzy (ANFIS): regole fuzzy che imparano dai dati
- Catene di Markov: matrice di transizione, distribuzione stazionaria e PageRank
- Modelli di Markov nascosti: l’algoritmo di Viterbi e il casinò disonesto
- Reti bayesiane: perché l’erba è bagnata e che cosa significa per l’irrigatore
- Filtro di Kalman: come stimare da misure imprecise dove si trova un’auto e a che velocità va
- Tipi di apprendimento automatico: supervisionato, non supervisionato, semi-supervisionato e altri
- Prompt, contesto e RAG: come dare a un modello le informazioni giuste
- Autoencoder variazionali (VAE): immagini nuove da uno spazio latente continuo
- Reti generative avversarie (GAN): il falsario contro il detective
- Modelli di diffusione: come il rumore puro diventa un’immagine
- Processi decisionali di Markov: stati, azioni, ricompense ed equazioni di Bellman
- Q-learning e DQN: imparare il valore delle azioni, dalla tabella alla rete neurale
- Policy gradient e PPO: imparare direttamente la politica
- Come funziona un agente IA: un modello linguistico in un ciclo con strumenti
- Programmare con agenti IA: incarico, test e controllo
- Valutazione e sicurezza dei sistemi di IA: come misurare e come sorvegliare
Programma completo della serie 52 di 83 argomenti pubblicati
- Che cos’è la proprietà di Markov e come la matrice di transizione descrive l’intera catena.
- Perché una catena irriducibile si stabilizza sulla distribuzione stazionaria indipendentemente dall’inizio.
- Come dalle catene è nato il PageRank e che cosa hanno in comune con i modelli linguistici.
Utile sapere prima: Probabilità condizionata e teorema di Bayes: come cambiare una stima quando scopri qualcosa di nuovo, Algebra lineare per l’apprendimento automatico: vettori, matrici e perché l’IA soprattutto moltiplica
Nel 1913 il matematico russo Andrej Markov sedeva davanti all’Evgenij Onegin di Puškin e faceva una cosa che uno studioso di letteratura considererebbe una barbarie: contava quante volte una vocale è seguita da un’altra vocale. Voleva dimostrare che la legge dei grandi numeri vale anche per eventi che dipendono l’uno dall’altro — e nel farlo inventò un modello che oggi calcola l’ordine delle pagine nei motori di ricerca, prevede il tempo, genera testo e sta alla base di un’intera famiglia di algoritmi di intelligenza artificiale. Con questa parte comincia il modulo sui modelli probabilistici.
Si collega alle parti Probabilità condizionata e teorema di Bayes e Algebra lineare per l’apprendimento automatico.
1. Un processo senza memoria
Definizione — catena di Markov
Una successione di variabili casuali X0, X1, X2, … a valori in un insieme finito di stati S è una catena di Markov se per ogni t e per tutti gli stati vale la proprietà di Markov
P(Xt+1 = j | Xt = i, Xt−1, …, X0) = P(Xt+1 = j | Xt = i).
Se questa probabilità non dipende da t, la catena è omogenea.
Il futuro dipende solo dal presente, non da come ci siamo arrivati. Se conosci lo stato di oggi, sai del domani tutto ciò che si può sapere — la storia non aggiunge più nulla. È una semplificazione, ma molto utile: invece di tutto il passato ti basta ricordare un solo numero.
Che cosa porta la proprietà di Markov si vede dalla probabilità di un’intera traiettoria. In generale si scompone con la regola della catena in un prodotto di probabilità condizionate, ciascuna delle quali dipende da tutto il passato. La proprietà di Markov cancella da ogni condizione tutto tranne l’ultimo stato:
P(X0 = x0, …, XT = xT) = π0(x0) · ∏t=1T P(xt | xt−1)
- P(X0 = x0, …)
- probabilità che la catena percorra esattamente questa successione di stati
- π0(x0)
- distribuzione iniziale — da dove parte la catena la matrice non lo dice; questo dato deve arrivare dall’esterno
- ∏t=1T
- prodotto sui passi — i passi si susseguono e ognuno deve «riuscire», per questo si moltiplicano
- P(xt | xt−1)
- probabilità di transizione di un passo, cioè l’elemento della matrice di transizione nella riga xt−1 e nella colonna xt — grazie alla proprietà di Markov dipende solo dallo stato precedente, non da tutta la storia; senza di essa qui ci sarebbe P(xt | x0, …, xt−1)
2. La matrice di transizione
Definizione — matrice di transizione
Una catena omogenea con n stati è determinata dalla matrice di transizione P = (pij), dove pij = P(Xt+1 = j | Xt = i). La matrice è stocastica: pij ≥ 0 e ogni riga ha somma 1.
Una riga della matrice è «che cosa succede domani, se oggi è così». Deve sommare a uno, perché domani qualcosa deve pur succedere.
Un modello giocattolo del tempo con tre stati: dopo un giorno sereno, con probabilità 0,6 è di nuovo sereno, con 0,3 nuvoloso e con 0,1 piove; dopo uno nuvoloso 0,3 / 0,4 / 0,3; dopo uno piovoso 0,2 / 0,4 / 0,4. Come grafo:
La stessa informazione come matrice — la riga è il tempo di oggi, la colonna quello di domani:
| Oggi ↓ / domani → | sereno | nuvoloso | pioggia | somma della riga |
|---|---|---|---|---|
| sereno | 0,6 | 0,3 | 0,1 | 1 |
| nuvoloso | 0,3 | 0,4 | 0,3 | 1 |
| pioggia | 0,2 | 0,4 | 0,4 | 1 |
Esempio — probabilità di una traiettoria
Oggi è sereno (π0 = (1; 0; 0)). Qual è la probabilità che i prossimi tre giorni siano sereno, nuvoloso, pioggia? Secondo la formula della traiettoria
P = 1 · psereno→sereno · psereno→nuvoloso · pnuvoloso→pioggia = 1 · 0,6 · 0,3 · 0,3 = 0,054.
Cioè il 5,4 %. La somma su tutte le 33 = 27 possibili terne di giorni è 1 — proprio perché ogni riga della matrice ha somma 1.
3. Come evolve la distribuzione
Teorema — distribuzione dopo n passi
Se πt è il vettore riga della distribuzione di Xt, allora πt+1 = πt P, e quindi πt = π0 Pt. L’elemento (i, j) della matrice Pn è la probabilità di passare da i a j in n passi.
Se oggi è sereno, domani la distribuzione è (0,6; 0,3; 0,1). Dopodomani è la media delle righe della matrice pesata con questa distribuzione — (0,47; 0,34; 0,19). Ogni giorno una moltiplicazione per la matrice, niente di più.
πt+1(j) = ∑i πt(i) · pij
- πt+1(j)
- probabilità che domani lo stato sia j — una componente del nuovo vettore riga
- ∑i
- somma su tutti gli stati di oggi — in j si può arrivare da qualunque stato e questi percorsi si escludono a vicenda, quindi le loro probabilità si sommano (legge della probabilità totale)
- πt(i)
- quanto è probabile che oggi siamo in i — il peso del percorso che passa per i
- pij
- probabilità di transizione da i a j — per la proprietà di Markov basta conoscere lo stato di oggi
Esempio — la distribuzione per dopodomani
Domani (dopo un oggi sereno) è π1 = (0,6; 0,3; 0,1). Per dopodomani, componente per componente — colonna della matrice moltiplicata per il vettore π1:
- sereno: 0,6 · 0,6 + 0,3 · 0,3 + 0,1 · 0,2 = 0,36 + 0,09 + 0,02 = 0,47,
- nuvoloso: 0,6 · 0,3 + 0,3 · 0,4 + 0,1 · 0,4 = 0,18 + 0,12 + 0,04 = 0,34,
- pioggia: 0,6 · 0,1 + 0,3 · 0,3 + 0,1 · 0,4 = 0,06 + 0,09 + 0,04 = 0,19.
La somma è di nuovo 1. Fra tre giorni, con lo stesso procedimento, si ottiene (0,422; 0,353; 0,225).
Una cosa interessante: dopo circa una settimana non importa se oggi c’è il sole o piove. Le due distribuzioni si incontrano sugli stessi valori e poi non cambiano più. La catena ha «dimenticato» da dove era partita.
Teorema — quanto in fretta la catena dimentica
Se la matrice P con n stati ha n autovalori distinti 1 = λ1, λ2, …, λn e |λk| < 1 per k ≥ 2, allora ogni distribuzione iniziale si scompone negli autovettori sinistri e
πt = π + a2λ2tu2 + … + anλntun,
dove π è la distribuzione stazionaria. Lo scarto da π diminuisce quindi come |λ2|t, dove λ2 è il secondo autovalore più grande in valore assoluto.
πt ≈ π + a2u2 · λ2t
- πt
- distribuzione dopo t giorni
- π
- distribuzione stazionaria — appartiene all’autovalore 1, che elevando a potenza non cambia; per questo è l’unica parte che sopravvive
- a2u2
- scarto iniziale nella direzione del secondo autovettore — solo qui si vede da dove è partita la catena (sole o pioggia); nella componente sereno è positivo per una partenza serena e negativo per una piovosa
- λ2t
- ogni giorno lo scarto si moltiplica per λ2 — la velocità con cui la catena dimentica; i termini restanti con |λ| più piccolo spariscono ancora più in fretta, per questo possiamo trascurarli
Esempio — gli autovalori della matrice del tempo
La somma degli autovalori è la traccia della matrice, 0,6 + 0,4 + 0,4 = 1,4, e il loro prodotto è il determinante, che risulta 0,01. Un autovalore è 1 (le righe hanno somma 1), quindi gli altri due soddisfano λ2 + λ3 = 0,4 e λ2λ3 = 0,01. Sono le radici di λ2 − 0,4λ + 0,01 = 0:
λ2,3 = 0,2 ± √0,03 = (2 ± √3)/10, cioè λ2 ≈ 0,373 e λ3 ≈ 0,027.
Lo scarto della probabilità di sereno dal valore stazionario 0,393, partendo da un giorno sereno, è dopo 3, 4, 5 giorni 0,0286; 0,0107; 0,0040 — ogni giorno circa 0,373 volte quello precedente. Dopo una settimana è 0,0006, e partendo da un giorno di pioggia −0,0005: le due partenze differiscono solo alla quarta cifra decimale. Lo scarto si riduce a un centesimo in ln 0,01 / ln 0,373 ≈ 4,7 giorni.
4. La distribuzione stazionaria
Definizione — distribuzione stazionaria
Una distribuzione π è stazionaria se π P = π — cioè π è un autovettore sinistro della matrice P con autovalore 1.
Definizione — catena irriducibile e aperiodica
Indichiamo con pij(n) l’elemento (i, j) della matrice Pn, cioè la probabilità di passare da i a j in n passi.
- Una catena è irriducibile se per ogni coppia di stati i, j esiste n ≥ 1 con pij(n) > 0.
- Il periodo dello stato i è d(i) = MCD{n ≥ 1 : pii(n) > 0} — il massimo comune divisore delle lunghezze di tutti i percorsi che tornano in i. Se d(i) = 1 lo stato è aperiodico; in una catena irriducibile tutti gli stati hanno lo stesso periodo.
Il tempo è subito entrambe le cose: tutti gli elementi di P sono positivi (basta n = 1) e pii > 0, quindi il ritorno è possibile in 1 passo e il periodo è 1. Al contrario, una catena con due stati che li alterna regolarmente (p12 = p21 = 1) è irriducibile, ma ha periodo 2: π0Pt con partenza (1; 0) salta all’infinito tra (1; 0) e (0; 1), anche se la distribuzione stazionaria (½; ½) esiste.
Teorema — teorema ergodico per catene finite
Se una catena finita è irriducibile (da ogni stato si può arrivare in ogni altro) e aperiodica, ha un’unica distribuzione stazionaria π e per ogni distribuzione iniziale π0 Pt → π. Inoltre la frazione di tempo che la catena trascorre nello stato j tende con probabilità 1 a πj e il tempo medio di ritorno in j è 1/πj.
Se da ogni condizione meteo si può prima o poi arrivare a ogni altra e la catena non gira in un cerchio regolare, si stabilizza su un’unica distribuzione — e indipendentemente dall’inizio. La distribuzione stazionaria ti dice anche quale parte dei giorni, su un lungo periodo, avrà ciascun tipo di tempo.
Per il nostro modello la distribuzione stazionaria risulta esattamente (24/61; 22/61; 15/61) ≈ (0,393; 0,361; 0,246): a lungo andare è sereno il 39 % dei giorni, nuvoloso il 36 % e piove nel 25 %. Dopo un giorno di pioggia aspettiamo la pioggia successiva in media 1/0,246 ≈ 4,07 giorni.
Esempio — la distribuzione stazionaria del tempo a mano
Cerchiamo π = (a; b; c) con πP = π. Colonna per colonna della matrice:
- a = 0,6a + 0,3b + 0,2c, cioè 4a = 3b + 2c,
- b = 0,3a + 0,4b + 0,4c,
- c = 0,1a + 0,3b + 0,4c, cioè 6c = a + 3b.
Le equazioni sono dipendenti (sommandole tutte e tre otteniamo a + b + c = a + b + c), quindi tralasciamo quella di mezzo. Dalla terza a = 6c − 3b, sostituendo nella prima 24c − 12b = 3b + 2c, cioè b = 22c/15 e a = 6c − 66c/15 = 24c/15. Il rapporto è a : b : c = 24 : 22 : 15 e la condizione a + b + c = 1 dà
π = (24/61; 22/61; 15/61) ≈ (0,393; 0,361; 0,246).
Il tempo medio di ritorno alla pioggia è 1/πpioggia = 61/15 ≈ 4,07 giorni.
E la simulazione di un singolo percorso casuale mostra il teorema ergodico in azione:
| Simulazione | sereno | nuvoloso | pioggia |
|---|---|---|---|
| 30 giorni | 0,533 | 0,333 | 0,133 |
| 1 anno (365 giorni) | 0,411 | 0,356 | 0,233 |
| 10 anni (3 650 giorni) | 0,401 | 0,360 | 0,239 |
| distribuzione stazionaria | 0,393 | 0,361 | 0,246 |
La simulazione estrae ogni giorno separatamente dalla riga dello stato di oggi: un numero casuale u in [0, 1) si confronta con le somme progressive della riga. Dopo un giorno sereno u < 0,6 porta a sereno, 0,6 ≤ u < 0,9 a nuvoloso e il resto a pioggia:
stav = sereno
for den in 1 … N:
u = numero casuale in [0, 1)
j = 0
while u ≥ P[stav][j]: # sottrai le probabilità finché u non «cade» nella casella
u = u − P[stav][j]
j = j + 1
stav = j
počet[stav] += 1
podíly = počet / N # per il teorema ergodico → π
La distribuzione stazionaria stessa si può calcolare senza estrazioni, moltiplicando ripetutamente per la matrice:
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): # metodo delle potenze: π ← π P
pi = pi @ P
print(pi.round(3)) # [0.393 0.361 0.246]
5. Markov, Onegin e Máj
Markov passò in rassegna le prime 20 000 lettere dell’Evgenij Onegin e segnò ciascuna come vocale o consonante. Le vocali erano il 43,2 %. Se le lettere si susseguissero in modo indipendente, una vocale seguirebbe una vocale anch’essa nel 43,2 % dei casi. Markov però ne contò solo il 12,8 %, mentre dopo una consonante il 66,3 %. Le lettere dipendono l’una dall’altra — eppure la frazione di vocali in un testo lungo converge in modo affidabile. Questa era la sua dimostrazione che la legge dei grandi numeri non ha bisogno dell’indipendenza.
Ripetiamolo sulla prima strofa di Máj (Maggio), il poema di Karel Hynek Mácha («Byl pozdní večer – první máj…»). Ha 311 lettere, le vocali sono il 37,6 %. La stima della matrice di transizione dai conteggi delle coppie:
| Dopo… | vocale | consonante |
|---|---|---|
| una vocale | 0,051 | 0,949 |
| una consonante | 0,575 | 0,425 |
Nella strofa ci sono solo 6 coppie di vocali consecutive — il ceco ama alternarle con le consonanti ancora più del russo. E la distribuzione stazionaria di questa catena risulta del 37,7 % di vocali: la catena stimata dal testo si «stabilizza» praticamente sulla frazione che nel testo c’è davvero (la differenza la fanno solo la prima e l’ultima lettera).
p̂ij = nij / ∑k nik
- p̂ij
- stima della probabilità di transizione — il cappuccio dice che si tratta di un numero calcolato dai dati, non del valore vero
- nij
- quante volte nel testo i è stato seguito direttamente da j — si contano le coppie di lettere vicine, perché una catena di Markov guarda indietro di un solo passo
- ∑k nik
- quante volte i è stato seguito da qualunque cosa — dividendo, la riga somma a 1, come richiede una matrice stocastica
Esempio — conteggi delle coppie nella prima strofa
311 lettere danno 310 coppie di lettere vicine. Vocale–vocale 6, vocale–consonante 111, consonante–vocale 111, consonante–consonante 82. Da qui
p̂voc→voc = 6/117 = 0,051, p̂voc→con = 111/117 = 0,949, p̂con→voc = 111/193 = 0,575, p̂con→con = 82/193 = 0,425.
Una catena con due stati ha una distribuzione stazionaria data da una formula semplice:
πvoc = pcon→voc / (pvoc→con + pcon→voc)
- πvoc
- frazione di vocali a lungo andare
- pcon→voc
- flusso verso le vocali — più spesso si passa da una consonante a una vocale, più vocali ci sono
- pvoc→con
- flusso dalle vocali — più in fretta si lascia una vocale, meno vocali ci sono
Esempio — Máj e Onegin secondo la formula
Máj: πvoc = 0,575 / (0,949 + 0,575) = 0,377. Più precisamente: le transizioni vocale→consonante e consonante→vocale sono tante quante (111), quindi πvoc = (111/193) / (111/117 + 111/193) = 117/310. La frazione effettiva di vocali è 117/311 — differisce solo nel denominatore, perché l’ultima lettera della strofa («r») non inizia nessuna coppia.
Onegin: dai numeri di Markov (vocale dopo vocale 12,8 %, quindi vocale→consonante 87,2 %; vocale dopo consonante 66,3 %) risulta πvoc = 0,663 / (0,872 + 0,663) = 0,432 — esattamente il 43,2 % di vocali che Markov contò direttamente.
6. PageRank: il navigatore casuale
Nel 1998 Sergey Brin e Larry Page, i fondatori di Google, proposero un modo per ordinare le pagine web per importanza. Immaginarono un navigatore che clicca a caso sui link e si chiesero: su quali pagine passerà più tempo?
Definizione — PageRank
Sia i una pagina con ki link uscenti. Il navigatore casuale con probabilità d (di solito 0,85) clicca su uno dei link scelto uniformemente a caso, altrimenti salta su una qualsiasi delle N pagine:
pij = (1 − d)/N + d/ki se i ha un link verso j, altrimenti (1 − d)/N.
Il PageRank è la distribuzione stazionaria di questa catena. I salti garantiscono che la catena sia irriducibile e aperiodica.
Una pagina importante è quella a cui puntano pagine importanti. La definizione sembra circolare, ma la distribuzione stazionaria la risolve: è esattamente «quanto tempo ci passerò, se continuo a cliccare all’infinito». Il salto occasionale verso un punto qualsiasi impedisce al navigatore di restare intrappolato in un giro di pagine.
In cima c’è C (0,374), a cui punta quasi ogni pagina. Più interessante è A: ha un solo link in entrata, eppure è seconda (0,342) — perché quel link viene da C e C non punta da nessun’altra parte. B, a cui punta solo A, riceve metà del peso di A (0,171). Le pagine D, E e F, che si collegano soprattutto fra loro, restano intorno a 0,04. Il vero PageRank calcolava la stessa cosa per miliardi di pagine, con il metodo delle potenze.
L’equazione π = πP scritta per una sola pagina dà la nota forma del PageRank:
PR(j) = (1 − d)/N + d ∑i→j PR(i) / ki
- PR(j)
- PageRank della pagina j — la frazione di tempo che il navigatore vi trascorre; la somma su tutte le pagine è 1
- (1 − d)/N
- contributo dei salti casuali — lo riceve ogni pagina in egual misura, anche quella a cui non punta nulla; grazie a esso la catena è irriducibile e aperiodica
- d
- probabilità che il navigatore clicchi su un link invece di saltare altrove — 0,85 nell’articolo originale di Brin e Page
- ∑i→j
- somma solo sulle pagine che puntano a j — un link è un «voto» per la pagina di destinazione
- PR(i) / ki
- il voto della pagina i pesa quanto è importante i stessa, e si divide fra tutti i suoi ki link — una pagina con mille link dà a ciascuno solo poco
Esempio — verifica di A, B e C
Per N = 6 e d = 0,85 è (1 − d)/N = 0,025. In A arriva solo il link da C, che ha un unico link (kC = 1); in B solo quello da A, che ne ha due:
- 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.
I valori del metodo delle potenze soddisfano l’equazione — così si riconosce che l’iterazione è arrivata alla fine.
PR = [1/N] * N # parti in modo uniforme
repeat:
nové = [(1 − d)/N] * N # salti casuali
for i in stránky:
if i non ha link: # vicolo cieco: salta ovunque
nové[j] += d · PR[i]/N per tutti i j
else:
for j in odkazy[i]:
nové[j] += d · PR[i]/k_i
PR = nové
until PR quasi non cambia
7. Catene, testo e modelli linguistici
Una catena i cui stati sono lettere si può far generare. Dalle coppie di lettere della prima strofa di Máj stimiamo che cosa segue ciascuna lettera, e poi estraiamo a sorte. Ecco come appaiono 90 caratteri:
lal kou lasvavzvný dnkyl plásnětičaskol dnou ta javu snáscezepráro pl h jin trů bo kylalav
Una sciocchezza — ma una sciocchezza che «suona ceca»: alterna vocali e consonanti, ha parole brevi e sillabe come «lás» o «kol». Claude Shannon fece lo stesso esperimento con l’inglese nel 1948 e mostrò che con un contesto più lungo (terne di lettere, coppie di parole) il testo sembra via via più naturale.
Esempio — la riga «l» del modello a bigrammi
Convertiamo il testo della strofa in minuscole e sostituiamo la punteggiatura con uno spazio. La lettera «l» vi è seguita 31 volte da un altro carattere: 13 volte da uno spazio, 7 volte da «a», 6 volte da «á», 2 volte da «o» e una volta ciascuna da «i», «h», «u». Secondo la formula di stima è quindi
P(spazio | 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 e gli altri 1/31 ≈ 0,03.
La generazione fa poi la stessa cosa della simulazione del tempo: dalla riga del carattere corrente estrae il carattere successivo. Dopo «l» la parola è il più delle volte alla fine — «byl», «lhal», «kol», «bol».
Definizione — modello a n-grammi
Un modello a n-grammi prevede il simbolo successivo in base agli n − 1 precedenti: P(wt | wt−n+1, …, wt−1). È una catena di Markov il cui stato sono gli ultimi n − 1 simboli.
La memoria di una catena si può «allungare» impacchettando nello stato più passato. Un modello linguistico con una finestra di contesto è formalmente anch’esso una catena di Markov: il suo stato è tutto il testo nella finestra. La differenza è che gli stati sono astronomicamente tanti, così le probabilità di transizione non stanno in una tabella, ma le calcola una rete neurale.
Esempio — quanti stati ha un modello a n-grammi
Con un vocabolario di V simboli, un modello a n-grammi ha |V|n−1 stati e in ogni riga |V| probabilità. La strofa di Máj usa 32 caratteri diversi (lettere e spazio):
- bigrammi (n = 2): 32 stati, matrice 32 × 32 = 1 024 numeri — più dei caratteri della strofa, quindi la maggior parte risulta zero;
- trigrammi: 322 = 1 024 stati e oltre 32 mila numeri — la maggior parte delle coppie di lettere nella strofa non compare affatto e le loro righe restano vuote;
- un modello linguistico con un vocabolario di 50 000 token e una finestra di 1 000 token: 50 0001 000 ≈ 104 699 stati.
Per questo un contesto più lungo richiede o dati enormi, o un modello che non prende le probabilità da una tabella, ma le stima con una funzione — una rete neurale.
8. Dove portano le catene di Markov
- Modelli di Markov nascosti — e se lo stato non lo vediamo e ne vediamo solo le manifestazioni? Se ne occupa la prossima parte.
- Processi decisionali di Markov aggiungono azioni e ricompense: su di essi si basa l’apprendimento per rinforzo.
- I metodi Monte Carlo basati su catene di Markov (MCMC) costruiscono una catena la cui distribuzione stazionaria è quella da cui vogliamo campionare — tipicamente la distribuzione a posteriori nella statistica bayesiana. Il criterio di Metropolis della parte sulla ricottura simulata è proprio una catena di questo tipo.
9. Riepilogo
- Una catena di Markov non ha memoria: lo stato successivo dipende solo da quello attuale. La descrive una matrice di transizione stocastica P.
- La distribuzione evolve moltiplicando per la matrice, πt = π0 Pt.
- Una catena irriducibile e aperiodica si stabilizza su un’unica distribuzione stazionaria π = π P, indipendentemente dall’inizio; per il tempo (0,393; 0,361; 0,246).
- Markov mostrò la dipendenza delle lettere sull’Onegin; in Máj una vocale segue una vocale solo nel 5 % dei casi.
- Il PageRank è la distribuzione stazionaria del navigatore casuale; i modelli a n-grammi e anche gli odierni modelli linguistici sono catene di Markov con uno stato grande.
Vuoi metterci le mani? Fai costruire a un agente IA un modello a bigrammi di parole da tutto Máj o dalle tue e-mail e fagli generare frasi — e poi prova con i trigrammi.
La vedi diversamente? Scrivi a support@coden-app.com.