Что такое Top-p (nucleus) sampling и как он сочетается с temperature?

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

Top-p (nucleus) sampling%20sampling) — это стратегия декодирования, при которой на каждом шаге генерации выбирается минимальный набор токенов, чья совокупная вероятность не меньше порога p. В отличие от Top-k, Top-p динамически подстраивает размер кандидатов под форму распределения вероятностей, что даёт более естественные и разнообразные тексты. Temperature управляет «остротой» распределения до применения Top-p: более высокая температура делает распределение более равномерным, низкая — более острым. Комбинация работает последовательно: сначала применяется temperature к логитам, затем softmax, затем Top-p отсекает маловероятные токены.


1. Определение Top-p (nucleus) sampling

Top-p sampling (также называемый nucleus sampling) — это метод стохастического декодирования, предложенный в статье Holtzman et al. (2019) «The Curious Case of Neural Text Degeneration». Идея: вместо фиксированного числа токенов (как в Top-k) выбирается динамическое ядро — минимальный набор токенов, сумма вероятностей которых ≥ p (обычно 0.9–0.95). Из этого ядра затем производится случайная выборка с учётом их относительных вероятностей.

Ключевое преимущество метод адаптируется к распределению. Если распределение «острое» (одна высокая вероятность, остальные низкие), ядро будет маленьким. Если распределение «плоское» (много токенов с умеренной вероятностью), ядро будет большим. Это позволяет избежать как слишком детерминированных (Top-k с малым k), так и слишком хаотичных (Top-k с большим k) результатов.


2. Проблема Top-k sampling

Top-k sampling выбирает k токенов с наибольшими вероятностями. Недостатки:

  • Фиксированный k не учитывает форму распределения. Например, если распределение очень острое (одна вероятность 0.9, остальные 0.01), Top-5 захватит много «шумных» токенов, что ухудшит качество.
  • Если распределение плоское (много токенов с вероятностью ~0.05), Top-3 может пропустить важные альтернативы.
  • На практике подбор k требует ручной настройки под каждую модель и задачу.

Top-p решает эти проблемы, динамически определяя размер ядра на основе кумулятивной вероятности.


3. Как работает Top-p: алгоритм

Шаги на каждом шаге генерации:

  1. Получить логиты (logits) из модели — не нормализованные оценки для каждого токена словаря.
  2. Применить temperature scaling (если используется) — разделить логиты на temperature T.
  3. Вычислить softmax от масштабированных логитов — получить вероятности P(token_i).
  4. Отсортировать вероятности по убыванию.
  5. Найти минимальный набор токенов, начиная с самого вероятного, такой что кумулятивная сумма вероятностей ≥ p.
  6. Обнулить вероятности всех токенов вне ядра.
  7. Перенормировать вероятности внутри ядра (разделить на сумму вероятностей ядра).
  8. Произвести случайную выборку одного токена из этого распределения.

Пример: пусть p=0.9, вероятности токенов: A=0.6, B=0.2, C=0.1, D=0.05, E=0.03, F=0.02. Сумма A+B+C = 0.9, значит ядро = {A, B, C}. После перенормировки: A=0.6/0.9=0.667, B=0.222, C=0.111. Выборка производится из этого распределения.


4. Преимущества Top-p перед Top-k

КритерийTop-kTop-p
Размер кандидатовФиксированный kДинамический, зависит от распределения
АдаптивностьНетДа
Риск включения шумаВысокий при остром распределенииНизкий — шумные токены отсекаются
Риск потери важных альтернативВысокий при плоском распределенииНизкий — ядро расширяется
НастройкаОдин гиперпараметр kОдин гиперпараметр p (интуитивно понятный)
ПопулярностьУстареваетСтандарт для современных LLM

На практике Top-p почти всегда предпочтительнее Top-k. Многие современные модели (GPT-4, Llama 2, Claude) по умолчанию используют Top-p с p=0.9 или p=0.95.


5. Что такое temperature в контексте LLM

Temperature — гиперпараметр, контролирующий «креативность» генерации. Математически: логиты делятся на temperature T перед softmax:

P(token_i) = exp(logit_i / T) / sum_j exp(logit_j / T)
  • T → 0: распределение становится «острым» — почти вся масса вероятности сосредоточена на самом вероятном токене (детерминированная генерация, greedy).
  • T = 1: исходное распределение модели.
  • T > 1: распределение становится более равномерным — низковероятные токены получают больше шансов (больше разнообразия, но риск бессвязности).
  • T < 1: распределение становится более острым — модель более уверена в своих предсказаниях.

Важно temperature не меняет ранжирование токенов (порядок сохраняется), только «крутизну» кривой вероятностей.


6. Комбинация temperature и Top-p: порядок применения

Правильный порядок: сначала temperature, потом Top-p.

  1. Модель выдаёт логиты.
  2. Применяем temperature scaling: logits_scaled = logits / T.
  3. Вычисляем softmax от logits_scaled → вероятности.
  4. Применяем Top-p к этим вероятностям: отсекаем хвост, перенормируем.
  5. Сэмплируем из полученного распределения.

Почему именно так Temperature изменяет форму распределения, а Top-p затем «обрезает» его. Если бы мы сначала применили Top-p к исходным вероятностям, а потом temperature, то temperature мог бы «размазать» вероятность на отсечённые токены, что нарушило бы логику nucleus.

Пример влияния

  • Высокая температура (T=2) делает распределение плоским → Top-p с p=0.9 включит много токенов (ядро большое) → генерация разнообразная.
  • Низкая температура (T=0.5) делает распределение острым → Top-p с тем же p=0.9 включит мало токенов (ядро маленькое) → генерация более детерминированная.

Таким образом, temperature и Top-p работают в тандеме: temperature задаёт общую «энтропию», а Top-p убирает совсем неправдоподобные варианты.


7. Практические рекомендации по настройке

  • Для творческих задач (поэзия, диалоги, story generation): T=0.7–1.0, p=0.9–0.95.
  • Для фактологических ответов (QA, суммаризация): T=0.1–0.3, p=0.8–0.9 (или вообще greedy).
  • Для кода: обычно T=0.2–0.4, p=0.9 — баланс между точностью и небольшим разнообразием.
  • Для агентов (Agentic RAG): часто используют T=0.5–0.7, p=0.9, чтобы агент мог выбирать разные действия, но не уходил в бессмыслицу.

Важно параметры сильно зависят от модели. Рекомендуется проводить небольшой grid search на валидационном наборе.


8. Математическая основа: softmax и масштабирование

Напомним формулу softmax с temperature:

P_i = exp(z_i / T) / Σ_j exp(z_j / T)

где z_i — логит i-го токена.

При T → 0:

  • Если z_max — максимальный логит, то exp(z_max / T) доминирует, и P_max → 1, остальные → 0.
  • Это эквивалентно argmax (greedy decoding).

При T → ∞:

  • Все exp(z_i / T) → 1, распределение становится равномерным: P_i → 1/V (V — размер словаря).

Top-p после softmax отсекает хвост распределения. Математически это эквивалентно выбору подмножества S токенов, такого что Σ_{i∈S} P_i ≥ p и S минимально по включению.


9. Пример кода на Python

import numpy as np

def top_p_sampling(logits, p=0.9, temperature=1.0):
    # Step 1: temperature scaling
    logits = logits / temperature
    
    # Step 2: softmax
    probs = np.exp(logits - np.max(logits))  # численная стабильность
    probs = probs / np.sum(probs)
    
    # Step 3: sort probabilities descending
    sorted_indices = np.argsort(probs)[::-1]
    sorted_probs = probs[sorted_indices]
    
    # Step 4: find nucleus
    cumulative_probs = np.cumsum(sorted_probs)
    mask = cumulative_probs <= p
    # включаем первый токен, где cumulative > p, чтобы сумма была >= p
    nucleus_indices = sorted_indices[:np.sum(mask) + 1]
    
    # Step 5: renormalize
    nucleus_probs = probs[nucleus_indices]
    nucleus_probs = nucleus_probs / np.sum(nucleus_probs)
    
    # Step 6: sample
    sampled_idx = np.random.choice(nucleus_indices, p=nucleus_probs)
    return sampled_idx

# Пример использования
logits = np.array([2.0, 1.0, 0.5, 0.1, -0.5, -1.0])
token_id = top_p_sampling(logits, p=0.9, temperature=0.8)
print(f"Sampled token ID: {token_id}")

Этот код демонстрирует базовую реализацию. В реальных фреймворках (Hugging Face Transformers) эти шаги уже встроены в метод generate() с параметрами top_p и temperature.


10. Ограничения и альтернативы

Ограничения Top-p

  • Не решает проблему повторов (repetition). Для этого используются repetition penalty или frequency penalty.
  • При очень низком p (например, 0.1) может стать слишком детерминированным, как greedy.
  • Не учитывает типичность (typicality) — некоторые токены могут быть вероятны, но неестественны в контексте.

Альтернативы

  • Typical sampling (Meister et al., 2022) — выбирает токены, чья вероятность близка к средней энтропии распределения.
  • Mirostat (Basu et al., 2021) — динамически регулирует p или k для контроля перплексии.
  • Beam search — детерминированный поиск нескольких гипотез, часто используется в переводе.
  • Contrastive search (Su et al., 2022) — штрафует повторяющиеся n-граммы.

Тем не менее, комбинация temperature + Top-p остаётся самым распространённым выбором в индустрии.


11. Связь с Agentic RAG

В Agentic RAG агент (LLM) принимает решения: какие инструменты вызвать, какие документы запросить, как интерпретировать результаты. Стратегия сэмплирования критически влияет на поведение агента:

  • Слишком низкая температура + маленькое p → агент будет всегда выбирать одно и то же действие, не исследуя альтернативы.
  • Слишком высокая температура + большое p → агент может начать «галлюцинировать» инструменты или генерировать невалидные JSON.

Оптимальная настройка для агентов: T=0.5–0.7, p=0.9–0.95. Это даёт баланс между исследованием и эксплуатацией. Некоторые продвинутые системы используют адаптивную температуру: снижают её, когда агент уверен (высокая вероятность правильного действия), и повышают при неопределённости.


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

Задача Реализовать и сравнить стратегии сэмплирования (greedy, Top-k, Top-p, temperature) на небольшой языковой модели (например, GPT-2 из Hugging Face) для задачи генерации текста.

Инструменты Python, Transformers, NumPy, Matplotlib (для визуализации распределений).

Шаги:

  1. Загрузить предобученную модель GPT-2 и токенизатор.
  2. Написать функцию generate_with_sampling(text, strategy, params), которая принимает промпт и возвращает сгенерированный текст.
  3. Реализовать 4 стратегии: greedy (argmax), Top-k (k=50), Top-p (p=0.9), temperature (T=0.7) + Top-p.
  4. Для одного и того же промпта сгенерировать по 10 вариантов каждой стратегией.
  5. Оценить разнообразие (distinct n-grams), перплексию (perplexity) и субъективное качество.
  6. Визуализировать распределение вероятностей первого токена после промпта для разных температур.

Ожидаемый результат Вы увидите, что greedy даёт одинаковые ответы, Top-k иногда включает шум, Top-p даёт более естественные вариации, а комбинация temperature + Top-p позволяет тонко настраивать креативность.


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

ВопросТема
292Что такое temperature в LLM и как он влияет на генерацию?
294Как работает beam search и чем отличается от sampling?
295Что такое repetition penalty и как его использовать?
296Как оценивать качество генерации текста (perplexity, diversity)?
297Какие методы декодирования используются в агентных системах?
298Как избежать галлюцинаций при генерации в RAG?

Навигация