Aivaro
  • Оглавление
  • Вопросы
  • Практика
  • Вики
  • Материалы сообщества
  • Тесты
  • Поиск
✈Telegram @ai_varo
RUEN中文
…
Оглавление/Вопросы/#922

Что такое Language Model с точки зрения вероятности последовательности? Как P(w₁, …, wₙ) раскладывается через chain rule?

Краткий тезис

Языковая модель (Language Model, LM) — это вероятностное распределение над последовательностями токенов (слов, подслов или символов). Её фундаментальная задача — оценить вероятность целого предложения (P(w_1, w_2, \dots, w_n)). Эта совместная вероятность раскладывается через цепное правило (chain rule) в произведение условных вероятностей каждого следующего слова при условии всех предыдущих. На практике прямое вычисление невозможно из-за экспоненциального роста числа контекстов, поэтому применяют марковское приближение (n-граммы). Современные LLM (Large Language Models) реализуют ту же идею, но снимают ограничение на длину контекста за счёт архитектуры Transformer, что позволяет моделировать (P(w_t \mid [text](/wiki/text){context})) без усечения истории.

2. Chain rule: (P(w_1 \dots w_n) = \prod_{k=1}^n P(w_k \mid w_1 \dots w_{k-1}))

Цепное правило вероятности (chain rule) — тождество, справедливое для любой последовательности событий:

[ P(w_1, w_2, \dots, w_n) = P(w_1) \cdot P(w_2 \mid w_1) \cdot P(w_3 \mid w_1, w_2) \cdots P(w_n \mid w_1, \dots, w_{n-1}). ]

Пример для предложения «я люблю машинное обучение»:

[ P([text](/wiki/text){я, люблю, машинное, обучение}) = P([text](/wiki/text){я}) \cdot P([text](/wiki/text){люблю} \mid [text](/wiki/text){я}) \cdot P([text](/wiki/text){машинное} \mid [text](/wiki/text){я, люблю}) \cdot P([text](/wiki/text){обучение} \mid [text](/wiki/text){я, люблю, машинное}). ]

Каждый множитель — условная вероятность очередного слова при условии всей предыдущей истории (контекста). Если бы мы могли точно оценить все эти условные распределения, то получили бы истинную вероятность предложения.

Проблема: количество возможных контекстов растёт экспоненциально с длиной последовательности. Для словаря размером (|V|) число различных контекстов длины (k-1) равно (|V|^{k-1}). Даже для умеренного (|V| = 10^5) и (k=5) это (10^{20}) — невозможно ни хранить, ни оценить статистически.


3. Марковское предположение

Чтобы сделать задачу разрешимой, вводят марковское предположение (Markov assumption): вероятность текущего слова зависит только от ограниченного числа предыдущих слов, а не от всей истории. Формально:

[ P(w_k \mid w_1, \dots, w_{k-1}) \approx P(w_k \mid w_{k-n+1}, \dots, w_{k-1}), ]

где (n) — порядок модели. Такие модели называют n-граммами (n-gram).

ПорядокНазваниеФормула
0Unigram(P(w_k))
1Bigram(P(w_k \mid w_{k-1}))
2Trigram(P(w_k \mid w_{k-2}, w_{k-1}))
n-1N-gram(P(w_k \mid w_{k-n+1}, \dots, w_{k-1}))

Пример bigram-модели для того же предложения:

[ P([text](/wiki/text){я, люблю, машинное, обучение}) \approx P([text](/wiki/text){я}) \cdot P([text](/wiki/text){люблю} \mid [text](/wiki/text){я}) \cdot P([text](/wiki/text){машинное} \mid [text](/wiki/text){люблю}) \cdot P([text](/wiki/text){обучение} \mid [text](/wiki/text){машинное}). ]

Оценка вероятностей производится по корпусу через подсчёт частот:

[ P(w_k \mid w_{k-1}) = \frac{[text](/wiki/text){count}(w_{k-1}, w_k)}{[text](/wiki/text){count}(w_{k-1})}. ]

Проблема разреженности: даже для bigram многие пары не встречаются в обучающих данных, что даёт нулевую вероятность. Для борьбы применяют сглаживание (smoothing): additive smoothing, Kneser-Ney, Good-Turing и др.

Марковское предположение — компромисс между точностью и вычислительной сложностью. Чем больше (n), тем более «осмысленными» становятся предсказания, но растёт разреженность и требования к памяти.


4. Связь с LLM: автокомплит

Современные Large Language Models (например, GPT, LLaMA, Gemma) также моделируют (P(w_t \mid [text](/wiki/text){context})), где контекст — вся предыдущая последовательность (до нескольких тысяч токенов). Они не делают марковского предположения — архитектура Transformer с механизмом self-attention позволяет учитывать любые дальние зависимости.

Автокомплит (autocomplete) — это задача генерации следующего токена. На каждом шаге модель выдаёт распределение вероятностей по словарю, и выбирается токен:

  • Жадный поиск: (w_t = \arg\max P(w \mid [text](/wiki/text){context})).
  • Сэмплирование: случайный выбор из распределения (часто с температурой).
  • Beam search: сохранение нескольких гипотез.

Таким образом, LLM остаётся вероятностной моделью последовательности, но с гораздо более мощным представлением контекста. Цепное правило по-прежнему выполняется, но теперь каждый множитель вычисляется нейронной сетью, а не таблицей частот.

Пример (упрощённо):

[ P([text](/wiki/text){«обучение»} \mid [text](/wiki/text){«я люблю машинное»}) = [text](/wiki/text){softmax}([text](/wiki/text){logits}), ]

где logits — выход последнего слоя Transformer после обработки контекста.


Пет-проект для закрепления

Задача: реализовать простую bigram-языковую модель на небольшом корпусе текстов (например, русские сказки или новости). Оценить вероятность нескольких предложений и сгенерировать случайный текст.

Инструменты:

  • Python 3.x
  • Библиотеки: collections (Counter), re (токенизация), random
  • Корпус: можно взять из открытых источников (например, NLTK corpora или скачать тексты вручную)

Шаги:

  1. Загрузка и токенизация: прочитать текстовый файл, привести к нижнему регистру, разбить на слова (токены) с помощью регулярного выражения \w+. Добавить специальные токены <s> (начало предложения) и </s> (конец).
  2. Подсчёт частот: построить Counter для униграмм (одиночных слов) и биграмм (пар слов). Для биграмм ключ — кортеж (prev, curr).
  3. Оценка вероятности предложения: для предложения, разбитого на токены, вычислить произведение (P(w_k \mid w_{k-1})) с использованием сглаживания (например, add-one smoothing: (P(w_k \mid w_{k-1}) = \frac{[text](/wiki/text){count}(w_{k-1}, w_k) + 1}{[text](/wiki/text){count}(w_{k-1}) + |V|})).
  4. Генерация текста: начать с <s>, на каждом шаге выбирать следующее слово случайно из распределения (P(\cdot \mid [text](/wiki/text){prev})) (можно использовать random.choices с весами). Остановиться при генерации </s> или достижении максимальной длины.
  5. Тестирование: вычислить вероятности для осмысленного предложения (например, «мама мыла раму») и для бессмысленного набора слов. Сравнить.

Ожидаемый результат:

  • Понимание, как цепное правило и марковское предположение превращаются в конкретные вычисления.
  • Наблюдение ограничений n-грамм: модель не улавливает дальние зависимости, даёт неестественные продолжения.
  • Осознание, почему современные LLM используют нейросетевые архитектуры — они снимают ограничение на длину контекста и лучше обобщают.

Связь с другими вопросами

ВопросТема
677N-граммы и сглаживание

Навигация

  • Предыдущий: 921
  • Следующий: 923
  • Индекс: 00. Индекс разборов