Как работает perplexity и как ее интерпретировать? Связь с cross-entropy?
Краткий тезис
Perplexity (перплексия) — это метрика неопределённости языковой модели при предсказании следующего токена. Она вычисляется как экспонента от cross-entropy (кросс-энтропии) и показывает, сколько равновероятных вариантов модель «видит» на месте правильного токена. Чем ниже perplexity, тем увереннее модель. Для современных LLM на тестовых данных типичны значения 10–20, что означает, что модель в среднем выбирает из 10–20 вариантов, а не из десятков тысяч. Связь с cross-entropy прямая: PPL = exp(CE), поэтому оптимизация cross-entropy loss автоматически снижает perplexity.
1. Определение perplexity
Perplexity — это статистическая мера, показывающая, насколько хорошо вероятностная модель предсказывает выборку. В контексте языковых моделей она оценивает, насколько «удивлена» модель, встречая каждый следующий токен в тексте. Чем меньше удивление, тем ниже perplexity.
Формально для последовательности токенов (w_1, w_2, \dots, w_N) perplexity определяется как:
[ [text](/wiki/text){PPL}(w_1, \dots, w_N) = \exp\left( -\frac{1}{N} \sum_{i=1}^N \log p(w_i \mid w_{<i}) \right) ]
где (p(w_i \mid w_{<i})) — вероятность, которую модель присваивает правильному токену (w_i) с учётом предыдущих токенов.
2. Связь с cross-entropy
Cross-entropy (кросс-энтропия) для языковой модели — это среднее отрицательное логарифмическое правдоподобие (negative log-likelihood) на тестовых данных:
[ H(p, q) = -\frac{1}{N} \sum_{i=1}^N \log q(w_i \mid w_{<i}) ]
где (q) — предсказания модели, а (p) — истинное распределение (one-hot для правильного токена). Тогда:
[ [text](/wiki/text){PPL} = \exp(H(p, q)) ]
Таким образом, perplexity — это просто экспонента от cross-entropy. Если cross-entropy равна 2.3 (натуральные логи), то perplexity ≈ 10. Если cross-entropy = 0.69, то perplexity ≈ 2.
| Cross-entropy (nat) | Perplexity | Интерпретация |
|---|---|---|
| 0.0 | 1.0 | Модель абсолютно уверена (один вариант) |
| 0.69 | 2.0 | Модель выбирает из 2 равновероятных вариантов |
| 2.30 | 10.0 | Модель «видит» 10 равновероятных токенов |
| 4.61 | 100.0 | Модель не уверена, 100 вариантов |
| 6.91 | 1000.0 | Очень плохая модель (почти случайный выбор) |
3. Интерпретация значений perplexity
- PPL = 1 — идеальная модель: она всегда присваивает вероятность 1 правильному токену. На практике недостижимо из-за шума в данных.
- PPL = 2 — модель в среднем «колеблется» между двумя токенами. Это очень хороший результат (например, для английского языка с токенизатором BPE).
- PPL = 10–20 — типичный диапазон для современных LLM (GPT-3, LLaMA) на тестовых корпусах. Модель рассматривает 10–20 вариантов, что говорит о высокой уверенности.
- PPL = 100 — модель почти не обучена: она «видит» 100 равновероятных токенов, что близко к случайному угадыванию из словаря размером 50k+.
- PPL > 1000 — модель хуже случайной (например, если токенизатор не подходит или данные из другого домена).
Важно Perplexity зависит от токенизатора (tokenizer). Если словарь маленький (например, 10k токенов), то PPL будет ниже, чем для большого словаря (100k), даже при одинаковом качестве модели. Поэтому сравнивать PPL можно только для моделей с одинаковым токенизатором и на одинаковых данных.
4. Perplexity для LLM vs классических n-граммных моделей
В классических n-граммных моделях (n-gram models) perplexity вычислялась по той же формуле, но вероятности оценивались по частотам n-грамм. Для них PPL в 100–500 считалась нормальной. Нейросетевые модели (RNN, Transformer) снизили PPL до 20–40, а современные LLM — до 10–20.
| Тип модели | Типичная PPL (на тестовом корпусе) |
|---|---|
| 3-граммная модель | 200–500 |
| LSTM (2015) | 40–80 |
| GPT-2 (2019) | 20–35 |
| GPT-3 (2020) | 10–20 |
| LLaMA-2 70B (2023) | 5–10 |
5. Как вычисляется perplexity на практике
- Токенизация (tokenization): текст разбивается на токены с помощью того же токенизатора, что использовался при обучении модели.
- Прямой проход (forward pass): модель получает последовательность токенов и для каждой позиции (i) выдаёт логиты (logits) — не нормализованные вероятности.
- Softmax: логиты превращаются в вероятности (p(w_i \mid w_{<i})).
- Логарифмирование: берётся натуральный логарифм вероятности правильного токена.
- Усреднение: сумма логарифмов делится на количество токенов (N).
- Экспонента: результат экспоненцируется.
Пример на Python с использованием библиотеки transformers:
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
model_name = "gpt2"
model = AutoModelForCausalLM.from_pretrained(model_name)
tokenizer = AutoTokenizer.from_pretrained(model_name)
text = "The quick brown fox jumps over the lazy dog."
inputs = tokenizer(text, return_tensors="pt")
with torch.no_grad():
outputs = model(**inputs, labels=inputs["input_ids"])
loss = outputs.loss # это cross-entropy (среднее по токенам)
perplexity = torch.exp(loss)
print(f"Perplexity: {perplexity.item():.2f}")
Примечание loss в transformers уже усреднён по всем токенам, поэтому torch.exp(loss) даёт perplexity.
6. Ограничения perplexity
- Зависимость от токенизатора: разные токенизаторы дают разную PPL даже для одной модели.
- Не учитывает семантику: модель может давать низкую PPL на бессмысленном, но грамматически правильном тексте (например, «I am am am»).
- Не подходит для оценки генерации: PPL измеряет только предсказание следующего токена, а не качество длинных ответов, их связность или фактологическую точность.
- Чувствительность к длине контекста: для очень коротких текстов PPL может быть нестабильной.
- Не отражает «калибровку» (calibration): модель может быть уверенной, но ошибочной (overconfidence).
7. Perplexity в контексте fine-tuning и evaluation
При fine-tuning (дообучении) LLM на специфическом домене (например, медицинские тексты) PPL на тестовых данных из этого домена — ключевая метрика. Снижение PPL говорит о том, что модель лучше предсказывает токены в данной области.
Однако PPL не должна быть единственной метрикой. Например, после fine-tuning на инструкциях (instruction tuning) PPL может даже вырасти, но качество ответов улучшится. Поэтому PPL используют вместе с другими метриками (BLEU, ROUGE, human evaluation, faithfulness).
8. Связь с cross-entropy loss в обучении
Во время обучения LLM минимизируется cross-entropy loss (кросс-энтропийная функция потерь). Градиенты обратного распространения обновляют веса так, чтобы увеличить вероятность правильных токенов. Поскольку PPL = exp(loss), минимизация loss автоматически снижает PPL.
На практике loss часто измеряют в nats (натуральные логарифмы) или bits (логарифм по основанию 2). Perplexity в bits: ([text](/wiki/text){PPL}_2 = 2^{[text](/wiki/text){CE}_2}). Например, CE = 1 bit → PPL = 2.
9. Пример интерпретации: сравнение двух моделей
| Модель | Cross-entropy (nats) | Perplexity |
|---|---|---|
| A | 2.30 | 10.0 |
| B | 3.00 | 20.1 |
Модель A в два раза «увереннее» (среднее число вариантов 10 против 20). На практике разница в 2–3 единицы PPL может быть статистически значимой, но не всегда заметна человеку.
10. Альтернативы и дополнения
- Bits-per-character (BPC) — для символьных моделей.
- Bits-per-byte (BPB) — для байтовых токенизаторов.
- Word-level perplexity — редко используется из-за большого словаря.
- Surprisal (удивление) — логарифм обратной вероятности одного токена.
Для оценки генерации текста применяют perplexity на ответах (per-token perplexity на сгенерированном тексте), но это не показывает, насколько ответ соответствует запросу.
Пет-проект для закрепления
Задача Реализовать скрипт, который вычисляет perplexity для нескольких моделей (GPT-2, TinyLLaMA, DistilGPT-2) на одном и том же текстовом датасете (например, первые 1000 символов «Войны и мира»). Сравнить результаты и объяснить различия.
Инструменты Python, transformers, torch, datasets (опционально).
Шаги:
- Загрузить три модели и их токенизаторы.
- Взять текст (можно из файла или строки).
- Для каждой модели вычислить loss и perplexity.
- Вывести таблицу с результатами.
- Написать короткий анализ: почему одна модель лучше другой (размер, архитектура, токенизатор).
Ожидаемый результат Понимание, как токенизатор и размер модели влияют на PPL. Например, GPT-2 (124M) даст PPL ~30, а TinyLLaMA (1.1B) ~15. Если токенизаторы разные, сравнение будет некорректным — это важный вывод.
Связь с другими вопросами
| Вопрос | Тема |
|---|---|
| 1 | Как работает cross-entropy loss в LLM? |
| 2 | Какие метрики используются для оценки LLM? |
| 3 | Что такое loss function и как она влияет на обучение? |
| 4 | Как работает fine-tuning и как оценить его качество? |
| 5 | Что такое tokenization и как она влияет на perplexity? |
| 6 | Как оценивать качество генерации текста (BLEU, ROUGE, human eval)? |
Навигация
- Предыдущий: 657
- Следующий: 659
- Индекс: 00. Индекс разборов