Что общего у Таро, Viterbi и LLM: как алгоритм выбирает один смысл из многих

от автора

Представьте, что человек спрашивает о смене профессии и вытягивает три карты: Повешенный → Маг → Колесница. Из одной и той же последовательности можно собрать несколько правдоподобных историй: о паузе и переосмыслении, о найденных ресурсах или о риске принять резкое действие за настоящее решение. Карты одинаковые, а смысловые маршруты — разные. Как интерпретатор выбирает один из них? И можно ли описать этот выбор так же, как поиск гипотезы в распознавании речи, машинном переводе или языковой модели?

От множества трактовок к лучшему пути

Ниже — учебная модель такого процесса. Она ничего не утверждает о мистических свойствах Таро и не оценивает вероятность будущего события. Её предмет — выбор связной интерпретации из нескольких допустимых.

Карта и контекст не дают готовый текст ответа. Сначала система строит несколько структурированных смысловых кандидатов, затем выбирает связный маршрут и только после этого формулирует объяснение для человека.

Рисунок 1. Смысловой поиск и генерация человеческого текста — разные этапы системы.

Рисунок 1. Смысловой поиск и генерация человеческого текста — разные этапы системы.

Исходная гипотеза: карта как функция отображения

Моя исходная идея состоит в том, что механизм работы карты Таро можно рассматривать как функцию отображения. На вход поступают описанный человеком контекст и нативное, словарное значение карты. Функция помещает их сочетание в диапазон допустимых трактовок.

F_{\mathrm{range},i}: \mathcal C\times\mathcal M_i\longrightarrow 2^{\mathcal R}, \qquad \mathcal H_i=F_{\mathrm{range},i}(c,m_i).

Здесь c\in\mathcal C — контекст, m_i\in\mathcal M_i — нативное значение карты i, \mathcal R — пространство интерпретаций, а \mathcal H_i — множество кандидатов. Затем выбирается вариант, который лучше других согласуется с ситуацией:

r_i^{*} = \underset{r\in\mathcal H_i}{\arg\max}\; \operatorname{Compat}(r,c).

Но эта формула сразу выдаёт лучший результат и не показывает, как трактовки влияют друг на друга в раскладе. Следующая карта может сделать более убедительным не только продолжение, но и одно из значений предыдущей карты. Поэтому единицей поиска должен стать не отдельный ответ r_i, а полный смысловой путь.

Общая архитектура

Полезно разделить пять операций: извлечение контекста, построение кандидатов, поиск смыслового пути, переоценку лучшего набора и генерацию понятного человеку объяснения.

Это разделение принципиально. Viterbi и beam search не обязаны писать человеческий текст. Их задача — найти структурированный смысловой маршрут. Отдельный модуль уже превращает этот маршрут в объяснение.

Сначала пример, потом математика

Вернёмся к вопросу о смене профессии. Оставим пять смысловых состояний:

ЗастойПереосмыслениеРесурсыДействиеПереход

Их можно представить как станции. Контекст определяет, на каких станциях человек мог находиться до расклада. Каждая карта открывает несколько дорог к следующим станциям, а вес дороги показывает, насколько естественным считается переход внутри модели.

Начальные веса:

Состояние

Вес

Застой

0.42

Переосмысление

0.28

Ресурсы

0.16

Действие

0.09

Переход

0.05

Самое вероятное начало — «Застой». Для «Повешенного» переходы из него выглядят так:

Следующее состояние

Вес

Застой

0.22

Переосмысление

0.58

Ресурсы

0.10

Действие

0.05

Переход

0.05

Жадная стратегия выбирает на каждом шаге самый сильный доступный вариант. Она получает путь:

Застой → Переосмысление → Действие → Переход

Его вес равен:

0.42\times0.58\times0.45\times0.70=0.076734.

Но существует более сильный полный маршрут:

Переосмысление → Ресурсы → Действие → Переход

0.28\times0.62\times0.76\times0.70=0.0923552.

Он начинается с более слабого локального варианта, но выигрывает за счёт последующих переходов. Его вес примерно на 20.4\% выше. Именно такую ошибку локального выбора должен устранить Viterbi.

Почему матрицы заданы вручную

Это не статистика реальных чтений. Матрицы специально сконструированы как контролируемый контрпример, в котором greedy проигрывает глобальному поиску. Такой пример позволяет проверить код и объяснить алгоритм. Для продуктовой или научной модели веса пришлось бы оценивать на размеченных данных, отдельно проверяя устойчивость словаря состояний и переносимость между контекстами.

Формальная модель

Обозначим наблюдаемый вход:

X=(C,Q,K_{1:n},P_{1:n}),

где C — контекст, Q — вопрос, K_i — карта, а P_i — её позиция. Пусть Z_i\in\mathcal S — смысловое состояние после шага i.

Начальное распределение зависит от контекста и вопроса:

\pi_0(s)=P_\theta(Z_0=s\mid X)=P_\theta(Z_0=s\mid C,Q),\qquad\sum_{s\in\mathcal S}\pi_0(s)=1.

Текущая карта задаёт стохастическую матрицу переходов:

T_i(u,v):=P_\theta(Z_i=v\mid Z_{i-1}=u,C,Q,K_i,P_i),\qquad\sum_{v\in\mathcal S}T_i(u,v)=1.

Марковское допущение утверждает, что вся необходимая память уже содержится в последнем состоянии:

P_\theta(Z_i=v\mid Z_{0:i-1}=z_{0:i-1},X)=T_i(z_{i-1},v).

Тогда условная вероятность пути h=(z_0,z_1,\ldots,z_n) факторизуется:

P_\theta(h\mid X)=\pi_0(z_0)\prod_{i=1}^{n}T_i(z_{i-1},z_i),

а задача поиска имеет вид:

h^{*}=\underset{h\in\mathcal S^{n+1}}{\arg\max}\;P_\theta(h\mid X).

В примере есть 5^{4}=625 путей. Их можно перебрать, но при росте числа карт и состояний полный перебор становится экспоненциальным.

Это условная неоднородная цепь Маркова, а не классическая HMM: карты здесь не являются наблюдениями, порождёнными скрытым состоянием. Однако задача поиска максимального пути имеет ту же динамическую структуру, что и декодирование Viterbi для HMM [1].

Этап 1. Viterbi сохраняет лучшего победителя для каждой станции

Перейдём к логарифмам:

\ell(h;X)=\log\pi_0(z_0)+\sum_{i=1}^{n}\log T_i(z_{i-1},z_i).

Для невозможного перехода принимается \log 0=-\infty. Обозначим через \delta_i(v) лучшую оценку префикса, который заканчивается в v:

\delta_0(v)=\log\pi_0(v),\delta_i(v)=\max_{u\in\mathcal S}\left[\delta_{i-1}(u)+\log T_i(u,v)\right].

Для восстановления маршрута запоминается предшественник:

\psi_i(v)=\underset{u\in\mathcal S}{\arg\max}\left[\delta_{i-1}(u)+\log T_i(u,v)\right].

Если два пути пришли в одно состояние, а все будущие переходы зависят только от этого состояния, проигравший путь уже не сможет обогнать победителя. Поэтому Viterbi хранит не все истории, а одного победителя для каждого конечного состояния. Он находит точный максимум за O(nm^{2}) операций при m=|\mathcal S| [1].

Упрощённый псевдокод:

for card in cards:    for next_state in states:        best[next_state] = max(            previous[current_state]            + log_transition(card, current_state, next_state)            for current_state in states        )

В учебном примере Viterbi и полный перебор находят один путь с весом 0.0923552, а greedy остаётся на 0.076734.

Две разные логики отсечения

Рисунок 2. Viterbi оставляет победителя на каждой «станции», а beam с шириной B=2 удерживает две лучшие частичные истории.

Рисунок 2. Viterbi оставляет победителя на каждой «станции», а beam с шириной B=2 удерживает две лучшие частичные истории.

Эта схема показывает важное различие. Viterbi не является «beam с большой шириной»: он использует структуру задачи и объединяет эквивалентные префиксы. Beam search просто ограничивает число живых гипотез.

Где Viterbi перестаёт быть достаточным

Для описанной цепи Viterbi уже решает задачу точно. Beam search здесь не нужен. Он появляется после расширения модели.

Сравним два пути:

Застой → Переосмысление → ДействиеРесурсы → Ресурсы → Действие

Оба заканчиваются состоянием «Действие», поэтому локальная цепь считает их эквивалентными для будущего. Но их повествовательный смысл различается. Интерпретация может зависеть от всей истории: от противоречий между картами, повторов, соответствия контексту и разнообразия альтернатив.

Расширенную оценку запишем так:

F(h;X)=\ell(h;X)+\lambda_C f_C(h,X)+\lambda_G f_G(h)-\lambda_R f_R(h),

где f_C оценивает соответствие контексту, f_G — глобальную связность, а f_R штрафует повторы и противоречия.

Если эти компоненты зависят от всей истории или от свободного текста, оптимальная подструктура исчезает. Историю можно включить в расширенное состояние, но число состояний быстро растёт. Теперь нужен приближённый поиск.

Этап 2. Beam search сохраняет несколько историй

Начальный beam содержит B лучших стартовых состояний:

\mathcal B_0=\operatorname{TopB}_{z\in\mathcal S}\log\pi_0(z).

Пусть \mathcal B_{i-1} — набор из B живых префиксов. На следующем шаге строятся все допустимые продолжения:

\mathcal C_i=\left\{h\oplus v:h\in\mathcal B_{i-1},\;v\in\mathcal V(h,K_i)\right\}.

Затем остаются B кандидатов с наибольшей доступной оценкой префикса:

\mathcal B_i=\operatorname{TopB}_{h\in\mathcal C_i}F_i(h;X).

При B=1 это жадный поиск. Если каждая гипотеза имеет не более b продолжений, beam оценивает порядка O(nBb) кандидатов. В задачах генерации последовательностей такой декодер приближённо максимизирует условную вероятность при ограниченном бюджете [2].

На нашем контрпримере:

Метод

Лучший путь

Вес пути

Greedy / beam B=1

Застой → Переосмысление → Действие → Переход

0.076734

Beam B=2

Переосмысление → Ресурсы → Действие → Переход

0.092355

Viterbi

Переосмысление → Ресурсы → Действие → Переход

0.092355

Полный перебор

Переосмысление → Ресурсы → Действие → Переход

0.092355

Рисунок 3. При B=1 локальный выбор теряет глобальный максимум; начиная с B=2 учебный beam удерживает победивший путь.

Рисунок 3. При B=1 локальный выбор теряет глобальный максимум; начиная с B=2 учебный beam удерживает победивший путь.

Совпадение при B=2 относится только к этому примеру. Удалённая из beam гипотеза не возвращается, поэтому общей гарантии оптимальности нет. Более того, увеличение ширины может улучшать внутреннюю вероятность и одновременно ухудшать внешнюю метрику качества [3].

Обычный beam также часто возвращает несколько почти одинаковых формулировок. Diverse Beam Search добавляет штраф за сходство между группами гипотез и направлен на получение содержательно разных вариантов [4].

Поиск пути и генерация текста — разные задачи

Пусть поисковый модуль вернул множество структурированных путей:

\mathcal P_B=\operatorname{Search}_\theta(X).

LLM может сначала переоценить этот небольшой набор:

\widetilde h=\underset{h\in\mathcal P_B}{\arg\max}\left[F_\theta(h;X)+\lambda_L R_\phi(h,X)\right],

а затем превратить выбранный путь в текст:

y\sim P_\phi(y\mid\widetilde h,X).

Здесь R_\phi — оценка кандидата языковой моделью, а P_\phi — модель вербализации. Один и тот же LLM технически может выполнять обе операции, но архитектурно их полезно разделять: тогда можно проверить, ошибся поиск, reranking или генератор текста.

Работы по информационному поиску показывают, что LLM действительно можно использовать для переупорядочивания конечного списка документов [14]. Перенос этого приёма на смысловые пути остаётся гипотезой, которую необходимо проверять отдельно: высокая языковая убедительность ещё не означает корректную интерпретацию.

Результаты поиска и соседние методы

Итоговая схема сопоставляет Viterbi, beam search, diverse beam, A*, MCTS и LLM reranking по глобальности поиска и вычислительной стоимости.

Рисунок 4. Методы по-разному балансируют глобальность поиска и вычислительную стоимость; LLM reranking оценивает уже найденный конечный список.

Рисунок 4. Методы по-разному балансируют глобальность поиска и вычислительную стоимость; LLM reranking оценивает уже найденный конечный список.
Рисунок 5. Верхние смысловые пути полного перебора: синим отмечен глобальный максимум, оранжевым — результат жадного поиска.

Рисунок 5. Верхние смысловые пути полного перебора: синим отмечен глобальный максимум, оранжевым — результат жадного поиска.

Метод

Что сохраняется

Когда полезен

Ограничение

Viterbi

Один лучший префикс для каждого состояния

Локальный score и конечная цепь

Требует оптимальной подструктуры

Beam search

B лучших префиксов глобально

Большое ветвление, свободный текст

Может рано удалить будущего победителя

Diverse Beam Search

Несколько групп с учётом различий

Нужны разные перспективы

Разнообразие зависит от выбранного штрафа

A*

Очередь путей по стоимости g+h

Есть информативная эвристика остатка

Точная гарантия требует допустимой эвристики [11]

MCTS / UCT

Статистика выборочных продолжений

Есть симулятор или дорогая итоговая награда

При конечном бюджете результат приближённый [12]

LLM reranking

Уже найденный конечный список

Нужна глобальная языковая оценка

Нет гарантии поиска и возможны смещения модели

A* особенно интересен, если можно построить верхнюю оценку будущего score или, после перехода к стоимости -F, нижнюю оценку оставшихся затрат. MCTS уместен только тогда, когда продолжения можно симулировать, а качество полного пути оценивается чёрным ящиком. Для трёх карт оба метода были бы избыточны.

Более общая математика: фактор-граф и CRF

Цепь Маркова — не единственный способ записать задачу. Если смысл первой и третьей карты взаимодействует напрямую или весь путь проверяется отдельным глобальным правилом, удобнее использовать фактор-граф:

P_\theta(h\mid X)=\frac{1}{Z_\theta(X)}\prod_{a\in\mathcal A}\psi_a(h_a,X).

Каждый фактор \psi_a оценивает только связанное с ним подмножество переменных h_a. Обычная цепь получается, если оставить начальный фактор и попарные факторы соседних состояний. Фактор-граф делает явными более дальние зависимости, но точный вывод на графе с циклами может стать дорогим [9].

Ещё более естественный мост к NLP — linear-chain Conditional Random Field:

P_\theta(h\mid X)=\frac{1}{Z_\theta(X)}\exp\left(\theta^{\top} f_0(z_0,X)+\sum_{i=1}^{n}\theta^{\top} f(z_{i-1},z_i,X,i)\right).

CRF сразу моделирует условное распределение пути при известном входе и позволяет включать произвольные признаки контекста, карты и позиции. Если факторы остаются локальными и попарными, MAP-путь всё ещё можно найти рекурсией Viterbi. Разница в том, что локальные переходные вероятности заменяются потенциалами признаков, а распределение по полным путям глобально нормируется через Z_\theta(X) [10].

От пяти ярлыков к семантическим эмбеддингам

Пять состояний удобны для объяснения, но реальный смысл редко укладывается в фиксированный список. Альтернатива — представлять трактовку вектором e_i\in\mathbb{R}^{d}:

s_i=\operatorname{sim}\left(e_i,g_\theta(C,Q,M(K_i))\right)+\rho\,\operatorname{sim}(e_{i-1},e_i).

Первый член оценивает близость трактовки к контексту и карте, второй — связность соседних смыслов. Современные sentence-embedding модели позволяют получать такие векторные представления текста [13].

Но непрерывное пространство нельзя просто перебрать рекурсией по пяти состояниям. Практический компромисс — сначала извлечь для каждой карты top-k текстовых кандидатов по близости эмбеддингов, затем применить beam search или reranking к конечному набору.

Как превратить иллюстрацию в исследование

Качественное исследование AI-поддержки Таро описывает эту практику как согласование множественных смыслов в ситуации, где случайно выбранная карта не имеет причинной связи с вопросом [5]. Эксперименты с очными и слепыми чтениями, эффект персональной валидации и активная роль клиента показывают, почему контекст и обратную связь нельзя смешивать с вкладом самой карты [6–8].

Для проверки вычислительной модели нужен отдельный протокол:

  1. До обучения зафиксировать словарь состояний и правила разметки.

  2. Собрать обезличенные пары «контекст — карты» и несколько независимых интерпретаций для каждой пары.

  3. Использовать нескольких аннотаторов и измерить их согласованность.

  4. Учить веса только на training-части, а сравнивать алгоритмы на отложенных примерах.

  5. Добавить контрольные варианты: ответ без карт, перемешанные значения карт, случайные слова и скрытый от интерпретатора контекст.

  6. Раздельно оценивать качество смыслового пути, качество итогового текста, разнообразие альтернатив и инструментальную пользу для пользователя.

  7. Сравнить greedy, Viterbi, beam, diverse beam и LLM reranking при одинаковом вычислительном бюджете.

  8. Провести анализ чувствительности: возмущать веса и проверять, насколько устойчив лучший путь.

Если исследовательский вопрос касается предсказания внешних событий, это уже другой эксперимент: прогноз нужно фиксировать заранее, задавать временной горизонт и сравнивать с моделью, которая видит тот же контекст, но не видит карт.

Вывод: Таро здесь — наглядный интерфейс общей задачи

В этой постановке карта не выдаёт готовый ответ. Она меняет веса в пространстве возможных смыслов. Контекст задаёт начальные предпочтения, алгоритм поиска собирает связный путь, а генератор превращает структуру в текст.

Если оценка раскладывается по локальным переходам конечной цепи, Viterbi даёт точный максимум. Если важны полная история, свободный текст и несколько альтернатив, появляются beam search, diverse decoding, A*, MCTS и LLM reranking. Фактор-графы и CRF позволяют выразить более богатые зависимости, а эмбеддинги снимают ограничение фиксированного словаря состояний.

Та же схема возникает далеко за пределами Таро:

неоднозначный вход      ↓локальные варианты      ↓поиск глобально связной последовательности      ↓человекочитаемое представление

В распознавании речи локальными вариантами становятся фонемы или слова, в машинном переводе — токены перевода, в разметке текста — последовательности тегов, а в LLM — продолжения контекста. Таро здесь интересно не как исключение из вычислительной логики, а как необычно наглядный пример того, как система строит один связный смысл из множества допустимых.

Источники

  1. Lawrence R. Rabiner. A Tutorial on Hidden Markov Models and Selected Applications in Speech Recognition. Proceedings of the IEEE, 1989.

  2. Markus Freitag, Yaser Al-Onaizan. Beam Search Strategies for Neural Machine Translation. ACL, 2017.

  3. Eldan Cohen, Christopher Beck. Empirical Analysis of Beam Search Performance Degradation in Neural Sequence Models. ICML, 2019.

  4. Ashwin K. Vijayakumar et al. Diverse Beam Search for Improved Description of Complex Scenes. AAAI, 2018.

  5. Matthew K. Prock et al. Interpretive Cultures: Resonance, Randomness, and Negotiated Meaning for AI-Assisted Tarot Divination. CHI, 2026.

  6. Susan J. Blackmore. Divination with Tarot Cards: An Empirical Study. Journal of the Society for Psychical Research, 1983.

  7. Bertram R. Forer. The Fallacy of Personal Validation: A Classroom Demonstration of Gullibility. Journal of Abnormal and Social Psychology, 1949.

  8. Christopher A. Roe. Persuasion in the Context of a Psychic Reading. PhD thesis, University of Edinburgh, 1996.

  9. Frank R. Kschischang, Brendan J. Frey, Hans-Andrea Loeliger. Factor Graphs and the Sum-Product Algorithm. IEEE Transactions on Information Theory, 2001.

  10. John Lafferty, Andrew McCallum, Fernando C. N. Pereira. Conditional Random Fields: Probabilistic Models for Segmenting and Labeling Sequence Data. ICML, 2001.

  11. Peter E. Hart, Nils J. Nilsson, Bertram Raphael. A Formal Basis for the Heuristic Determination of Minimum Cost Paths. IEEE Transactions on Systems Science and Cybernetics, 1968.

  12. Levente Kocsis, Csaba Szepesvári. Bandit Based Monte-Carlo Planning. ECML, 2006.

  13. Nils Reimers, Iryna Gurevych. Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks. EMNLP-IJCNLP, 2019.

  14. Weiwei Sun et al. Is ChatGPT Good at Search? Investigating Large Language Models as Re-Ranking Agents. EMNLP, 2023.

Дополнительные объяснения на русском:

ссылка на оригинал статьи https://habr.com/ru/articles/1065656/