Что такое 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: алгоритм
Шаги на каждом шаге генерации:
- Получить логиты (logits) из модели — не нормализованные оценки для каждого токена словаря.
- Применить temperature scaling (если используется) — разделить логиты на temperature
T. - Вычислить softmax от масштабированных логитов — получить вероятности
P(token_i). - Отсортировать вероятности по убыванию.
- Найти минимальный набор токенов, начиная с самого вероятного, такой что кумулятивная сумма вероятностей ≥
p. - Обнулить вероятности всех токенов вне ядра.
- Перенормировать вероятности внутри ядра (разделить на сумму вероятностей ядра).
- Произвести случайную выборку одного токена из этого распределения.
Пример: пусть 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-k | Top-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.
- Модель выдаёт логиты.
- Применяем temperature scaling: logits_scaled = logits / T.
- Вычисляем softmax от
logits_scaled→ вероятности. - Применяем Top-p к этим вероятностям: отсекаем хвост, перенормируем.
- Сэмплируем из полученного распределения.
Почему именно так 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 (для визуализации распределений).
Шаги:
- Загрузить предобученную модель GPT-2 и токенизатор.
- Написать функцию
generate_with_sampling(text, strategy, params), которая принимает промпт и возвращает сгенерированный текст. - Реализовать 4 стратегии: greedy (argmax), Top-k (k=50), Top-p (p=0.9), temperature (T=0.7) + Top-p.
- Для одного и того же промпта сгенерировать по 10 вариантов каждой стратегией.
- Оценить разнообразие (distinct n-grams), перплексию (perplexity) и субъективное качество.
- Визуализировать распределение вероятностей первого токена после промпта для разных температур.
Ожидаемый результат Вы увидите, что greedy даёт одинаковые ответы, Top-k иногда включает шум, Top-p даёт более естественные вариации, а комбинация temperature + Top-p позволяет тонко настраивать креативность.
Связь с другими вопросами
| Вопрос | Тема |
|---|---|
| 292 | Что такое temperature в LLM и как он влияет на генерацию? |
| 294 | Как работает beam search и чем отличается от sampling? |
| 295 | Что такое repetition penalty и как его использовать? |
| 296 | Как оценивать качество генерации текста (perplexity, diversity)? |
| 297 | Какие методы декодирования используются в агентных системах? |
| 298 | Как избежать галлюцинаций при генерации в RAG? |
Навигация
- Предыдущий: 292
- Следующий: 294
- Индекс: 00. Индекс разборов