Марковські ланцюги: матриця переходів, стаціонарний розподіл і PageRank
Марковська властивість, матриця переходів і зміна розподілу на моделі погоди, стаціонарний розподіл і ергодична теорема, Марковів аналіз голосних на поемі Махи «Máj», PageRank і генерування тексту.
Серія Основи ШІ Частина 38 з 52
- Мапа штучного інтелекту: що є що і як усе це пов’язано
- Коротка історія штучного інтелекту: від Тюрінга до мовних моделей
- Дані, модель, тренування, інференс: основні поняття на одному прикладі
- Як читати математичний запис: символи, індекси, суми та квантори
- Множини й відношення: конструктор, з якого складаються означення в ШІ
- Функції й відображення: чому кожна модель у ШІ — це функція
- Логіка й доведення: правила, за якими міркують у ШІ
- Графи й дерева: структура, на якій тримаються пошук і нейронні мережі
- Лінійна алгебра для машинного навчання: вектори, матриці й чому ШІ передусім множить
- Похідні, градієнт і правило ланцюжка: як модель дізнається, у якому напрямку вчитися
- Градієнтний спуск: як навчається модель
- Що таке ймовірність: від кидка кубика до аксіом Колмогорова
- Умовна ймовірність і теорема Баєса: як змінити оцінку, коли дізнаєтеся щось нове
- Випадкова величина і функція розподілу: одна функція, яка каже про розподіл усе
- Функція щільності та функція маси ймовірності: чому неперервна величина має в точці ймовірність нуль
- Математичне сподівання, дисперсія і коваріація: де лежить розподіл, наскільки він широкий і що з чим пов’язано
- Огляд розподілів ймовірностей: Бернуллі, біноміальний, Пуассона, рівномірний, нормальний і експоненційний
- Закон великих чисел і центральна гранична теорема: чому середні поводяться так передбачувано
- Статистика й оцінювання параметрів: максимальна правдоподібність, MAP і довірчі інтервали
- Теорія інформації: ентропія, перехресна ентропія і KL-дивергенція — звідки беруться функції втрат
- Пошук у просторі станів: BFS, DFS, UCS і A* з анімаціями
- Ігри та суперник: мінімакс, альфа-бета відсікання і Monte Carlo tree search
- Задоволення обмежень: бектрекінг, поширення обмежень і AC-3 на судоку та мапі чеських країв
- Логіка й системи, засновані на знаннях: пряме і зворотне виведення, резолюція та експертні системи
- Планування: STRIPS, світ кубиків, евристики з релаксації та планування в AI-агентах
- Локальний пошук та імітація відпалу: комівояжер через обласні центри Чехії
- Генетичні алгоритми: популяція, схрещування, мутація і добір на рюкзаку для походу
- Еволюційні стратегії і генетичне програмування: від правила однієї п’ятої до закону Кеплера
- Оптимізація мурашиною колонією: як феромоновий слід знаходить короткий шлях
- Оптимізація роєм частинок: інерція, власний досвід і досвід рою
- Нейроеволюція: еволюція ваг і форми нейронних мереж та алгоритм NEAT
- Нечіткі множини й функції належності: як записати «трохи тепло»
- Нечітка логіка та ймовірність: чому «трохи тепло» не означає «імовірно тепло»
- Нечітка логіка: t-норми, імплікації та правила ЯКЩО–ТО
- Нечітке керування: Мамдані та Суґено від вентилятора до маятника на візку
- Нечітка кластеризація: алгоритм fuzzy c-means і точки між кластерами
- Нейро-нечіткі системи (ANFIS): нечіткі правила, які навчаються з даних
- Марковські ланцюги: матриця переходів, стаціонарний розподіл і PageRank
- Приховані марковські моделі: алгоритм Вітербі й нечесне казино
- Байєсівські мережі: чому трава мокра і що з цього випливає для дощувача
- Фільтр Калмана: як за неточними вимірюваннями оцінити, де авто і як швидко воно їде
- Види машинного навчання: з учителем, без учителя, з частковим залученням учителя та інші
- Промпти, контекст і RAG: як дати моделі правильну інформацію
- Варіаційні автокодувальники (VAE): нові зображення з неперервного латентного простору
- Генеративні змагальні мережі (GAN): фальшувальник проти детектива
- Дифузійні моделі: як із чистого шуму постає зображення
- Марковські процеси ухвалення рішень: стани, дії, винагороди й рівняння Беллмана
- Q-навчання і DQN: як навчитися цінності дій — від таблиці до нейронної мережі
- Policy gradient і PPO: навчання безпосередньо політики
- Як працює ШІ-агент: мовна модель у циклі з інструментами
- Програмування з AI-агентами: завдання, тести й перевірка
- Оцінювання і безпека систем ШІ: як вимірювати і як стежити
Повна програма серії Готово: 52 з 83 тем
- Що таке марковська властивість і як матриця переходів описує весь ланцюг.
- Чому незвідний ланцюг усталюється на стаціонарному розподілі незалежно від початку.
- Як із ланцюгів виник PageRank і що в них спільного з мовними моделями.
Що варто знати заздалегідь: Умовна ймовірність і теорема Баєса: як змінити оцінку, коли дізнаєтеся щось нове, Лінійна алгебра для машинного навчання: вектори, матриці й чому ШІ передусім множить
1913 року російський математик Андрій Марков сидів над Пушкіновим «Євгенієм Онєгіним» і робив те, що літературознавець вважав би варварством: рахував, скільки разів після голосної йде ще одна голосна. Він хотів показати, що закон великих чисел діє і для подій, які одна від одної залежать, — і при цьому вигадав модель, яка сьогодні обчислює порядок сторінок у пошуковику, передбачає погоду, генерує текст і стоїть за цілою родиною алгоритмів штучного інтелекту. Цією частиною починається модуль про ймовірнісні моделі.
Продовжує частини Умовна ймовірність і теорема Баєса та Лінійна алгебра для машинного навчання.
1. Процес без пам’яті
Означення — марковський ланцюг
Послідовність випадкових величин X0, X1, X2, … зі значеннями у скінченній множині станів S є марковським ланцюгом, якщо для всіх t і всіх станів виконується марковська властивість
P(Xt+1 = j | Xt = i, Xt−1, …, X0) = P(Xt+1 = j | Xt = i).
Якщо ця ймовірність не залежить від t, ланцюг однорідний.
Майбутнє залежить лише від теперішнього, а не від того, як ми до нього дійшли. Хто знає сьогоднішній стан, знає про завтра все, що можна знати, — історія вже нічого не додасть. Це спрощення, але дуже корисне: замість усього минулого достатньо пам’ятати одне число.
Що дає марковська властивість, видно на ймовірності цілої траєкторії. Загалом вона за ланцюговим правилом розкладається на добуток умовних ймовірностей, кожна з яких залежить від усього минулого. Марковська властивість у кожній умові викреслює все, крім останнього стану:
P(X0 = x0, …, XT = xT) = π0(x0) · ∏t=1T P(xt | xt−1)
- P(X0 = x0, …)
- ймовірність того, що ланцюг пройде саме цю послідовність станів
- π0(x0)
- початковий розподіл — звідки ланцюг вирушить, матриця не каже; ці дані мають прийти ззовні
- ∏t=1T
- добуток за кроками — кроки йдуть один за одним і кожен має «вийти», тому вони перемножуються
- P(xt | xt−1)
- ймовірність переходу за один крок, тобто елемент матриці переходів у рядку xt−1 і стовпці xt — завдяки марковській властивості залежить лише від попереднього стану, а не від усієї історії; без неї тут стояло б P(xt | x0, …, xt−1)
2. Матриця переходів
Означення — матриця переходів
Однорідний ланцюг з n станами задається матрицею переходів P = (pij), де pij = P(Xt+1 = j | Xt = i). Матриця стохастична: pij ≥ 0 і сума кожного рядка дорівнює 1.
Рядок матриці — це «що станеться завтра, якщо сьогодні ось так». У сумі він мусить давати одиницю, бо завтра щось статися мусить.
Іграшкова модель погоди з трьома станами: після сонячного дня з імовірністю 0,6 знову сонячно, 0,3 хмарно і 0,1 дощ; після хмарного 0,3 / 0,4 / 0,3; після дощового 0,2 / 0,4 / 0,4. У вигляді графа:
Та сама інформація у вигляді матриці — рядок означає сьогоднішню погоду, стовпець завтрашню:
| Сьогодні ↓ / завтра → | сонячно | хмарно | дощ | сума рядка |
|---|---|---|---|---|
| сонячно | 0,6 | 0,3 | 0,1 | 1 |
| хмарно | 0,3 | 0,4 | 0,3 | 1 |
| дощ | 0,2 | 0,4 | 0,4 | 1 |
Приклад — ймовірність однієї траєкторії
Сьогодні сонячно (π0 = (1; 0; 0)). Яка ймовірність того, що наступні три дні будуть сонячно, хмарно, дощ? За формулою для траєкторії
P = 1 · pсонячно→сонячно · pсонячно→хмарно · pхмарно→дощ = 1 · 0,6 · 0,3 · 0,3 = 0,054.
Тобто 5,4 %. Сума за всіма 33 = 27 можливими трійками днів дорівнює 1 — саме тому, що сума кожного рядка матриці дорівнює 1.
3. Як змінюється розподіл
Теорема — розподіл після n кроків
Якщо πt — вектор-рядок розподілу Xt, то πt+1 = πt P, а отже πt = π0 Pt. Елемент (i, j) матриці Pn — це ймовірність переходу з i в j за n кроків.
Якщо сьогодні сонячно, то завтра розподіл (0,6; 0,3; 0,1). Післязавтра це середнє рядків матриці, зважене цим розподілом, — (0,47; 0,34; 0,19). Щодня одне множення на матрицю, нічого більше.
πt+1(j) = ∑i πt(i) · pij
- πt+1(j)
- ймовірність, що завтра буде стан j — одна компонента нового вектора-рядка
- ∑i
- сума за всіма сьогоднішніми станами — в j можна прийти звідки завгодно, і ці шляхи взаємно виключають один одного, тож їхні ймовірності додаються (формула повної ймовірності)
- πt(i)
- наскільки ймовірно, що сьогодні ми в i — вага шляху через i
- pij
- ймовірність переходу з i в j — завдяки марковській властивості досить знати лише сьогоднішній стан
Приклад — розподіл на післязавтра
Завтра (після сонячного сьогодні) π1 = (0,6; 0,3; 0,1). Для післязавтра покомпонентно — стовпець матриці, помножений на вектор π1:
- сонячно: 0,6 · 0,6 + 0,3 · 0,3 + 0,1 · 0,2 = 0,36 + 0,09 + 0,02 = 0,47,
- хмарно: 0,6 · 0,3 + 0,3 · 0,4 + 0,1 · 0,4 = 0,18 + 0,12 + 0,04 = 0,34,
- дощ: 0,6 · 0,1 + 0,3 · 0,3 + 0,1 · 0,4 = 0,06 + 0,09 + 0,04 = 0,19.
Сума знову дорівнює 1. Через три дні тим самим способом вийде (0,422; 0,353; 0,225).
Цікава річ: приблизно через тиждень уже байдуже, світить сьогодні сонце чи йде дощ. Обидва розподіли сходяться до однакових значень і далі не змінюються. Ланцюг «забув», звідки почав.
Теорема — як швидко ланцюг забуває
Якщо матриця P з n станами має n різних власних значень 1 = λ1, λ2, …, λn і |λk| < 1 для k ≥ 2, то кожен початковий розподіл розкладається за лівими власними векторами і
πt = π + a2λ2tu2 + … + anλntun,
де π — стаціонарний розподіл. Відхилення від π, отже, спадає як |λ2|t, де λ2 — друге за абсолютною величиною власне значення.
πt ≈ π + a2u2 · λ2t
- πt
- розподіл через t днів
- π
- стаціонарний розподіл — належить до власного значення 1, яке при піднесенні до степеня не змінюється; тому це єдина частина, що виживає
- a2u2
- початкове відхилення в напрямку другого власного вектора — лише тут проявляється, звідки ланцюг вийшов (сонце чи дощ); у компоненті «сонячно» воно для сонячного старту додатне, а для дощового від’ємне
- λ2t
- щодня відхилення множиться на λ2 — це швидкість забування; решта членів із меншими |λ| зникають ще швидше, тому їх можна відкинути
Приклад — власні значення матриці погоди
Сума власних значень — це слід матриці, 0,6 + 0,4 + 0,4 = 1,4, а їхній добуток — визначник, який дорівнює 0,01. Одне власне значення дорівнює 1 (сума кожного рядка дорівнює 1), тож два інші задовольняють λ2 + λ3 = 0,4 і λ2λ3 = 0,01. Це корені рівняння λ2 − 0,4λ + 0,01 = 0:
λ2,3 = 0,2 ± √0,03 = (2 ± √3)/10, тобто λ2 ≈ 0,373 і λ3 ≈ 0,027.
Відхилення ймовірності сонячної погоди від стаціонарного значення 0,393 за сонячного старту через 3, 4, 5 днів становить 0,0286; 0,0107; 0,0040 — щодня воно множиться приблизно на 0,373. Через тиждень воно 0,0006, а за дощового старту −0,0005: обидва початки відрізняються лише в четвертому знаку після коми. До сотої відхилення зменшиться за ln 0,01 / ln 0,373 ≈ 4,7 дня.
4. Стаціонарний розподіл
Означення — стаціонарний розподіл
Розподіл π стаціонарний, якщо π P = π — тобто π є лівим власним вектором матриці P з власним значенням 1.
Означення — незвідний і аперіодичний ланцюг
Позначмо pij(n) елемент (i, j) матриці Pn, тобто ймовірність переходу з i в j за n кроків.
- Ланцюг незвідний, якщо для кожних двох станів i, j існує n ≥ 1 з pij(n) > 0.
- Період стану i — це d(i) = НСД{n ≥ 1 : pii(n) > 0} — найбільший спільний дільник довжин усіх шляхів, які повертаються в i. Якщо d(i) = 1, стан аперіодичний; у незвідному ланцюгу всі стани мають однаковий період.
Погода є і тим, і іншим одразу: усі елементи P додатні (досить n = 1) і pii > 0, тож повернення можливе за 1 крок і період дорівнює 1. Натомість ланцюг із двома станами, який регулярно їх чергує (p12 = p21 = 1), незвідний, але має період 2: π0Pt для старту (1; 0) безкінечно перескакує між (1; 0) і (0; 1), хоча стаціонарний розподіл (½; ½) існує.
Теорема — ергодична теорема для скінченних ланцюгів
Якщо скінченний ланцюг незвідний (з кожного стану можна потрапити в кожен) і аперіодичний, він має єдиний стаціонарний розподіл π і для кожного початкового розподілу π0 Pt → π. Крім того, частка часу, яку ланцюг проводить у стані j, з імовірністю 1 прямує до πj, а середній час повернення в j дорівнює 1/πj.
Коли з кожної погоди з часом можна потрапити в кожну, а ланцюг не крутиться по регулярному колу, він усталюється на одному розподілі — і до того ж незалежно від початку. Стаціонарний розподіл водночас каже, яку частку днів за довгий період буде та чи інша погода.
Для нашої моделі стаціонарний розподіл виходить точно (24/61; 22/61; 15/61) ≈ (0,393; 0,361; 0,246): у довгостроковій перспективі сонячно 39 % днів, хмарно 36 %, а дощ іде у 25 %. Після дощового дня наступного дощу чекаємо в середньому 1/0,246 ≈ 4,07 дня.
Приклад — стаціонарний розподіл погоди вручну
Шукаємо π = (a; b; c) з πP = π. За стовпцями матриці:
- a = 0,6a + 0,3b + 0,2c, тобто 4a = 3b + 2c,
- b = 0,3a + 0,4b + 0,4c,
- c = 0,1a + 0,3b + 0,4c, тобто 6c = a + 3b.
Рівняння залежні (додавши всі три, отримаємо a + b + c = a + b + c), тож середнє відкинемо. З третього a = 6c − 3b, після підстановки в перше 24c − 12b = 3b + 2c, тобто b = 22c/15 і a = 6c − 66c/15 = 24c/15. Відношення a : b : c = 24 : 22 : 15, і умова a + b + c = 1 дає
π = (24/61; 22/61; 15/61) ≈ (0,393; 0,361; 0,246).
Середній час повернення до дощу 1/πдощ = 61/15 ≈ 4,07 дня.
А симуляція одного випадкового перебігу показує ергодичну теорему в дії:
| Симуляція | сонячно | хмарно | дощ |
|---|---|---|---|
| 30 днів | 0,533 | 0,333 | 0,133 |
| 1 рік (365 днів) | 0,411 | 0,356 | 0,233 |
| 10 років (3 650 днів) | 0,401 | 0,360 | 0,239 |
| стаціонарний розподіл | 0,393 | 0,361 | 0,246 |
Симуляція щодня окремо розігрує наступний стан із рядка сьогоднішнього стану: випадкове число u з [0, 1) порівнюється з послідовними сумами рядка. Після сонячного дня u < 0,6 означає сонячно, 0,6 ≤ u < 0,9 хмарно, а решта дощ:
stav = сонячно
for den in 1 … N:
u = випадкове число з [0, 1)
j = 0
while u ≥ P[stav][j]: # віднімай імовірності, доки u не «впаде» в комірку
u = u − P[stav][j]
j = j + 1
stav = j
počet[stav] += 1
podíly = počet / N # за ергодичною теоремою → π
Сам стаціонарний розподіл можна обчислити без розігрування, повторним множенням на матрицю:
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): # степеневий метод: π ← π P
pi = pi @ P
print(pi.round(3)) # [0.393 0.361 0.246]
5. Марков, Онєгін і «Máj»
Марков пройшов перші 20 000 літер «Євгенія Онєгіна» і кожну позначив як голосну або приголосну. Голосних було 43,2 %. Якби літери йшли одна за одною незалежно, голосна після голосної траплялася б теж у 43,2 % випадків. Але Марков нарахував лише 12,8 %, тоді як після приголосної — 66,3 %. Літери одна від одної залежать — і все ж частка голосних у довгому тексті надійно збігається. Це був його доказ того, що закон великих чисел не потребує незалежності.
Повторімо це на першій строфі поеми Карела Гінека Махи «Máj» («Травень»; «Byl pozdní večer – první máj…»). Вона має 311 літер, голосних серед них 37,6 %. Оцінка матриці переходів із кількостей пар:
| Після… | голосна | приголосна |
|---|---|---|
| голосної | 0,051 | 0,949 |
| приголосної | 0,575 | 0,425 |
У строфі лише 6 пар голосних поспіль — чеська любить чергувати їх із приголосними ще більше, ніж російська. А стаціонарний розподіл цього ланцюга дає 37,7 % голосних: ланцюг, оцінений із тексту, «усталюється» практично на тій частці, яка в тексті справді є (різницю дають лише перша й остання літери).
p̂ij = nij / ∑k nik
- p̂ij
- оцінка ймовірності переходу — дашок означає, що це число, обчислене з даних, а не справжнє значення
- nij
- скільки разів у тексті після i безпосередньо йшло j — рахуються пари сусідніх літер, бо марковський ланцюг дивиться лише на один крок назад
- ∑k nik
- скільки разів після i йшло будь-що — після ділення сума рядка дорівнює 1, як того вимагає стохастична матриця
Приклад — кількості пар у першій строфі
311 літер дають 310 пар сусідніх літер. Голосна–голосна 6, голосна–приголосна 111, приголосна–голосна 111, приголосна–приголосна 82. Звідси
p̂гол→гол = 6/117 = 0,051, p̂гол→пр = 111/117 = 0,949, p̂пр→гол = 111/193 = 0,575, p̂пр→пр = 82/193 = 0,425.
Ланцюг із двома станами має стаціонарний розподіл, заданий простою формулою:
πгол = pпр→гол / (pгол→пр + pпр→гол)
- πгол
- довгострокова частка голосних
- pпр→гол
- потік у голосні — що частіше з приголосної переходимо на голосну, то більше голосних
- pгол→пр
- потік із голосних — що швидше від голосної йдемо далі, то менше їх
Приклад — «Máj» і «Онєгін» за формулою
«Máj»: πгол = 0,575 / (0,949 + 0,575) = 0,377. Точніше: переходів голосна→приголосна і приголосна→голосна однаково (111), тож πгол = (111/193) / (111/117 + 111/193) = 117/310. Справжня частка голосних — 117/311; відрізняється лише знаменник, бо остання літера строфи («r») жодної пари не починає.
«Онєгін»: з чисел Маркова (голосна після голосної 12,8 %, тобто голосна→приголосна 87,2 %; голосна після приголосної 66,3 %) виходить πгол = 0,663 / (0,872 + 0,663) = 0,432 — точно ті 43,2 % голосних, які Марков нарахував безпосередньо.
6. PageRank: випадковий серфер
1998 року Сергій Брін і Ларрі Пейдж, засновники Google, запропонували, як упорядкувати вебсторінки за важливістю. Вони уявили собі серфера, який навмання клацає на посилання, і запитали: на яких сторінках він проводитиме найбільше часу?
Означення — PageRank
Сторінка i має ki вихідних посилань. Випадковий серфер з імовірністю d (зазвичай 0,85) клацає на одне з посилань, вибране рівномірно випадково, інакше стрибає на будь-яку з N сторінок:
pij = (1 − d)/N + d/ki, якщо i посилається на j, інакше (1 − d)/N.
PageRank — це стаціонарний розподіл цього ланцюга. Стрибки гарантують, що ланцюг незвідний і аперіодичний.
Важлива сторінка — та, на яку посилаються важливі сторінки. Означення здається замкненим колом, але стаціонарний розподіл його розв’язує: це саме «скільки часу я там проведу, якщо клацатиму безкінечно». Час від часу стрибок будь-куди не дає серферу застрягти в кільці сторінок.
Найвище стоїть C (0,374), на яку посилається майже кожна сторінка. Цікавіша A: має єдине вхідне посилання, і все ж вона друга (0,342) — бо це посилання веде з C, а C більше нікуди не посилається. B, на яку посилається лише A, отримує половину ваги A (0,171). Сторінки D, E і F, які посилаються переважно одна на одну, лишаються біля 0,04. Справжній PageRank обчислював те саме для мільярдів сторінок, степеневим методом.
Рівняння π = πP, розписане для однієї сторінки, дає відомий вигляд PageRank:
PR(j) = (1 − d)/N + d ∑i→j PR(i) / ki
- PR(j)
- PageRank сторінки j — частка часу, яку на ній проведе серфер; сума за всіма сторінками дорівнює 1
- (1 − d)/N
- внесок випадкових стрибків — його однаково отримує кожна сторінка, навіть та, на яку ніщо не посилається; завдяки йому ланцюг незвідний і аперіодичний
- d
- ймовірність, що серфер клацне на посилання, а не стрибне деінде, — 0,85 в оригінальній статті Бріна і Пейджа
- ∑i→j
- сума лише за сторінками, які посилаються на j — посилання є «голосом» за цільову сторінку
- PR(i) / ki
- голос сторінки i важить стільки, наскільки важлива сама i, і ділиться між усіма її ki посиланнями — сторінка з тисячами посилань дає кожному лише дрібку
Приклад — перевірка A, B і C
Для N = 6 і d = 0,85 маємо (1 − d)/N = 0,025. До A веде лише посилання з C, яка має єдине посилання (kC = 1); до B — лише з A, яка має два:
- 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.
Значення, отримані степеневим методом, рівняння задовольняють — так видно, що ітерація завершилася.
PR = [1/N] * N # почни рівномірно
repeat:
nové = [(1 − d)/N] * N # випадкові стрибки
for i in stránky:
if i не має посилань: # глухий кут: стрибни будь-куди
nové[j] += d · PR[i]/N для всіх j
else:
for j in odkazy[i]:
nové[j] += d · PR[i]/k_i
PR = nové
until PR майже не змінюється
7. Ланцюги, текст і мовні моделі
Ланцюг, станами якого є літери, можна змусити генерувати. З пар літер у першій строфі «Máj» оцінимо, що йде після якої літери, а потім розігруємо. Ось так виглядає 90 символів:
lal kou lasvavzvný dnkyl plásnětičaskol dnou ta javu snáscezepráro pl h jin trů bo kylalav
Нісенітниця — але нісенітниця, яка «звучить по-чеськи»: чергує голосні й приголосні, має короткі слова і склади на кшталт «lás» чи «kol». Такий самий дослід 1948 року провів Клод Шеннон з англійською і показав, що з довшим контекстом (трійки літер, пари слів) текст виглядає дедалі природніше.
Приклад — рядок «l» біграмної моделі
Текст строфи переведемо в малі літери, а розділові знаки замінимо пробілом. Після літери «l» у ньому 31 раз іде ще якийсь символ: 13 разів пробіл, 7 разів «a», 6 разів «á», 2 рази «o» і по одному разу «i», «h», «u». За формулою оцінки, отже,
P(пробіл | 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, а решта 1/31 ≈ 0,03.
Генерування потім робить те саме, що й симуляція погоди: з рядка поточного символу розігрує наступний символ. Після «l» слово найчастіше закінчується — «byl», «lhal», «kol», «bol».
Означення — n-грамна модель
N-грамна модель передбачає наступний символ за n − 1 попередніми: P(wt | wt−n+1, …, wt−1). Це марковський ланцюг, станом якого є останні n − 1 символів.
Пам’ять ланцюга можна «розтягнути», якщо запакувати в стан більше минулого. Мовна модель із контекстним вікном формально теж марковський ланцюг: її станом є весь текст у вікні. Різниця в тому, що станів астрономічно багато, тож ймовірності переходів не записані в таблиці, а їх обчислює нейронна мережа.
Приклад — скільки станів має n-грамна модель
Зі словником із V символів n-грамна модель має |V|n−1 станів і в кожному рядку |V| ймовірностей. Строфа «Máj» використовує 32 різні символи (літери і пробіл):
- біграми (n = 2): 32 стани, матриця 32 × 32 = 1 024 числа — більше, ніж у строфі символів, тож більшість із них виходить нульовою;
- триграми: 322 = 1 024 стани і понад 32 тисячі чисел — більшості пар літер у строфі взагалі немає, і їхні рядки лишаються порожніми;
- мовна модель зі словником 50 000 токенів і вікном 1 000 токенів: 50 0001 000 ≈ 104 699 станів.
Тому довший контекст потребує або величезних даних, або моделі, яка не бере ймовірності з таблиці, а оцінює їх функцією — нейронною мережею.
8. Куди ведуть марковські ланцюги
- Приховані марковські моделі — що, як стану ми не бачимо, а бачимо лише його прояви? Цьому присвячена наступна частина.
- Марковські процеси прийняття рішень додають дії та винагороди: на них тримається навчання з підкріпленням.
- Методи Монте-Карло з марковськими ланцюгами (MCMC) будують ланцюг, стаціонарний розподіл якого — саме той, з якого ми хочемо брати вибірку, — зазвичай апостеріорний розподіл у баєсівській статистиці. Критерій Метрополіса з частини про імітацію відпалу — саме такий ланцюг.
9. Підсумок
- Марковський ланцюг не має пам’яті: наступний стан залежить лише від поточного. Його описує стохастична матриця переходів P.
- Розподіл змінюється множенням на матрицю, πt = π0 Pt.
- Незвідний аперіодичний ланцюг усталюється на єдиному стаціонарному розподілі π = π P незалежно від початку; для погоди (0,393; 0,361; 0,246).
- Марков показав залежність літер на «Онєгіні»; у «Máj» голосна йде після голосної лише в 5 % випадків.
- PageRank — стаціонарний розподіл випадкового серфера; n-грамні й сучасні мовні моделі — це марковські ланцюги з великим станом.
Хочете спробувати самі? Попросіть ШІ-агента побудувати словесну біграмну модель з усього «Máj» або з ваших власних електронних листів і генерувати з неї речення — а потім спробуйте триграми.
Маєте іншу думку? Напишіть на support@coden-app.com.