COMRAD404 / GLOSSARY

Perplexity (перплексия)

Perplexity

Перплексия (PPL) — метрика для autoregressive языковых моделей: это экспонента среднего отрицательного log-likelihood. Разбираем формулу, sliding-window оценку и типичные ошибки сравнения.

TL;DR

Перплексия — это метрика для causal language models, равная экспоненте среднего отрицательного log-likelihood на тестовом тексте.

Перплексия (perplexity, PPL) — метрика качества языковой модели для задач предсказания следующего токена, обычно для авторегрессионных или causal language models. Формально это экспонента среднего отрицательного log-likelihood на тестовом тексте: чем ниже значение, тем выше вероятность, которую модель присваивает правильным токенам.

Английский термин: perplexity. Также встречается: PPL, «перплексия». Здесь речь идёт именно о метрике, а не о сервисе Perplexity AI: если вы искали продукт для поиска с ИИ, смотрите карточку Perplexity, инструкцию как начать использовать Perplexity для поиска и сравнения Perplexity vs ChatGPT и Perplexity vs Google поиск.

Метрика не появилась вместе с LLM: она использовалась в language modeling и раньше. Но в контексте современных трансформеров её чаще обсуждают как быстрый способ проверить, насколько хорошо causal LM предсказывает следующий токен на фиксированном корпусе.

Простыми словами

Можно представить это как тест на «уверенное продолжение текста». Вы даёте модели начало фразы, а затем смотрите, насколько высокую вероятность она отдаёт реальному следующему токену. Если правильные продолжения регулярно получают высокую вероятность, перплексия будет ниже.

Грубо говоря, это метрика не про «общий интеллект» модели, а про качество её вероятностного прогноза на конкретном наборе текстов. Поэтому одна и та же модель может показать разные значения, если поменять токенизатор, тестовый корпус, длину контекста или сам протокол оценки.

Как это работает

В документации Hugging Face Perplexity (PPL) названа одной из самых распространённых метрик оценки языковых моделей. Там же она определяется как экспонента среднего отрицательного log-likelihood и описывается как величина, эквивалентная exp(cross-entropy).

текст
  -> токенизация
  -> токены x1, x2, x3, ..., xT
  -> модель считает p(x_t | x_<t)
  -> для истинных токенов берём -log p
  -> усредняем по предсказанным токенам
  -> берём exp(...)
  -> получаем PPL
  1. Текст разбивается на токены. Это важно, потому что токенизация напрямую влияет на итоговое значение PPL.
  2. Для каждого токена модель оценивает вероятность истинного продолжения с учётом предыдущего контекста.
  3. Вероятности переводятся в отрицательные логарифмы: редкие или плохо предсказанные токены штрафуют сильнее.
  4. Затем считается среднее по токенам.
  5. После экспоненты получается итоговая перплексия.

Если вы считаете loss через PyTorch, связь здесь прямая: в документации CrossEntropyLoss указано, что этот критерий эквивалентен последовательности LogSoftmax, затем NLLLoss. Поэтому для token-level оценки у вас часто получается простое соотношение: сначала средняя cross-entropy, затем её экспонента как PPL.

Две практические оговорки из официальной документации Hugging Face особенно важны. Во-первых, стандартная перплексия применима к autoregressive/causal LM и не определена для masked LM вроде BERT. Во-вторых, для fixed-length models не стоит грубо резать длинный текст на непересекающиеся чанки: Hugging Face рекомендует sliding-window или strided evaluation, потому что такой режим использует больше левого контекста и обычно даёт более точную оценку.

Где применяется

  • В бенчмарках и статьях. В статье OpenAI про GPT-2 в таблице 3 для модели 762M указана перплексия 19.93 на WikiText2. Это пример того, как PPL используется для сравнения языковых моделей на фиксированном датасете.
  • В инженерной валидации causal LM. Если вы обучаете или дообучаете модель предсказания следующего токена, PPL позволяет отслеживать, улучшается ли вероятностное качество на валидационном наборе.
  • При выборе протокола оценки для fixed-length моделей. Один и тот же чекпоинт может получить заметно разные значения в зависимости от stride и того, теряете ли вы контекст между окнами.
  • Для интерпретации loss. Если в пайплайне уже считается средняя token-level cross-entropy, перплексия часто используется как более привычная надстройка над тем же сигналом качества.

Практический пример

Ниже — упрощённая схема вычисления PPL по логике официального примера Hugging Face для GPT-2 large на WikiText-2. Названия переменных условные: важен сам порядок действий.

# Упрощённая логика по мотивам официального примера Hugging Face
input_ids = tokenizer(test_text)
stride = 512
sum_nll = 0
count_tokens = 0

for each sliding window over input_ids:
    window = input_ids[begin:end]
    labels = copy(window)
    labels[context_tokens] = -100   # контекст не включаем в loss

    outputs = model(window, labels=labels)
    sum_nll += outputs.loss * predicted_token_count
    count_tokens += predicted_token_count

avg_nll = sum_nll / count_tokens
ppl = torch.exp(avg_nll)

Ключевая деталь — маскирование контекстных токенов значением -100. В официальном примере Hugging Face так исключают уже известную часть окна из расчёта loss, чтобы модель штрафовалась только за новые целевые токены.

На странице документации приведены контрольные значения для этого сценария: 19.44 при stride=1024 и 16.44 при stride=512. Практический смысл такой: более плотная sliding-window оценка может заметно снизить PPL, потому что модель реже остаётся без нужного левого контекста.

Но эти числа нельзя переносить «как есть» на другие модели. Они привязаны к конкретному чекпоинту, корпусу, токенизации и протоколу оценки.

Чем отличается от cross-entropy, NLL и masked LM-оценки

Понятие Что это такое Связь с PPL Что важно помнить
Perplexity (PPL) Экспонента среднего отрицательного log-likelihood Итоговая метрика в «обычном» масштабе Ниже — лучше только в сопоставимых условиях
Cross-entropy loss Средняя loss-функция по токенам PPL эквивалентна exp(cross-entropy) Связь корректна, если loss считается по тем же целевым токенам
NLL Отрицательный log-likelihood истинных токенов После усреднения и экспоненты даёт PPL Это «внутренний» логарифмический масштаб, а не финальная метрика
Masked LM вроде BERT Модель предсказывает замаскированные позиции, а не следующий токен слева направо Стандартная PPL из документации Hugging Face для таких моделей не определена Нельзя без оговорок переносить методику causal LM на BERT

Отдельная путаница связана с названием Perplexity: в новостях и обзорах это часто сервис, а в ML-метриках — именно PPL. Поисковый запрос один, смыслов два.

Ограничения и заблуждения

  • Заблуждение: «чем ниже PPL, тем модель лучше вообще». На практике это означает только то, что модель лучше предсказывает токены на данном тестовом наборе и при данном протоколе оценки.
  • Заблуждение: «можно сравнивать любые опубликованные значения». Нельзя без оговорок сравнивать PPL между моделями, если различаются токенизатор, корпус, длина контекста или способ разбиения текста.
  • Заблуждение: «PPL подходит и для BERT». В официальной документации Hugging Face стандартная перплексия не определена для masked language models вроде BERT.
  • Заблуждение: «достаточно порезать текст на равные чанки». Для fixed-length моделей такое разбиение обычно грубее и хуже, чем sliding-window оценка.

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

Редакционное ограничение: эта статья описывает классическую PPL для авторегрессионных моделей по официальным материалам, проверенным по состоянию на 2026-08-14. В предоставленном наборе источников нет достаточной базы для отдельного разбора альтернативных подходов вроде pseudo-perplexity для masked LM, поэтому они здесь не рассматриваются.

Источники

Вопросы и ответы

Что означает низкая перплексия?

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

Можно ли напрямую сравнивать PPL разных моделей?

Только если совпадают токенизация, корпус, длина контекста и протокол оценки. Документация Hugging Face прямо предупреждает, что токенизация влияет на значение PPL.

Как связаны cross-entropy и перплексия?

Для causal LM перплексия определяется как экспонента среднего отрицательного log-likelihood и эквивалентна exp(cross-entropy). Если у вас уже есть средняя token-level cross-entropy, PPL получается экспонентой этого значения.

Почему обычная перплексия не подходит для BERT?

Потому что стандартная формулировка PPL в официальной документации относится к авторегрессионным моделям, которые предсказывают следующий токен слева направо. Для masked LM вроде BERT такая метрика в этом виде не определена.

Почему уменьшение stride может снизить PPL?

Потому что при более плотном скольжении окон модель теряет меньше левого контекста между фрагментами длинного текста. На официальном примере Hugging Face для GPT-2 large значение с stride=512 лучше, чем с stride=1024.

Источники

SOURCES

Вопросы и ответы

FAQ
Что означает низкая перплексия?

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

Можно ли напрямую сравнивать PPL разных моделей?

Только если совпадают токенизация, корпус, длина контекста и протокол оценки. Документация Hugging Face прямо предупреждает, что токенизация влияет на значение PPL.

Как связаны cross-entropy и перплексия?

Для causal LM перплексия определяется как экспонента среднего отрицательного log-likelihood и эквивалентна exp(cross-entropy). Если у вас уже есть средняя token-level cross-entropy, PPL получается экспонентой этого значения.

Почему обычная перплексия не подходит для BERT?

Потому что стандартная формулировка PPL в официальной документации относится к авторегрессионным моделям, которые предсказывают следующий токен слева направо. Для masked LM вроде BERT такая метрика в этом виде не определена.

Почему уменьшение stride может снизить PPL?

Потому что при более плотном скольжении окон модель теряет меньше левого контекста между фрагментами длинного текста. На официальном примере Hugging Face для GPT-2 large значение с stride=512 лучше, чем с stride=1024.

Читайте также

LINKS