Что такое 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).
| Порядок | Название | Формула |
|---|---|---|
| 0 | Unigram | (P(w_k)) |
| 1 | Bigram | (P(w_k \mid w_{k-1})) |
| 2 | Trigram | (P(w_k \mid w_{k-2}, w_{k-1})) |
| n-1 | N-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 или скачать тексты вручную)
Шаги:
- Загрузка и токенизация: прочитать текстовый файл, привести к нижнему регистру, разбить на слова (токены) с помощью регулярного выражения
\w+. Добавить специальные токены<s>(начало предложения) и</s>(конец). - Подсчёт частот: построить
Counterдля униграмм (одиночных слов) и биграмм (пар слов). Для биграмм ключ — кортеж(prev, curr). - Оценка вероятности предложения: для предложения, разбитого на токены, вычислить произведение (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|})).
- Генерация текста: начать с
<s>, на каждом шаге выбирать следующее слово случайно из распределения (P(\cdot \mid [text](/wiki/text){prev})) (можно использоватьrandom.choicesс весами). Остановиться при генерации</s>или достижении максимальной длины. - Тестирование: вычислить вероятности для осмысленного предложения (например, «мама мыла раму») и для бессмысленного набора слов. Сравнить.
Ожидаемый результат:
- Понимание, как цепное правило и марковское предположение превращаются в конкретные вычисления.
- Наблюдение ограничений n-грамм: модель не улавливает дальние зависимости, даёт неестественные продолжения.
- Осознание, почему современные LLM используют нейросетевые архитектуры — они снимают ограничение на длину контекста и лучше обобщают.
Связь с другими вопросами
| Вопрос | Тема |
|---|---|
| 677 | N-граммы и сглаживание |
Навигация
- Предыдущий: 921
- Следующий: 923
- Индекс: 00. Индекс разборов