Nucleus Sampling
При сэмплировании top-p (по ядру) каждый токен выбирается из наименьшего набора с суммарной вероятностью p, поэтому размер набора зависит от уверенности модели — в отличие от top-k.
Сэмплирование ядра, также называемое сэмплированием top-p, — это метод декодирования, при котором каждый следующий токен выбирается из наименьшего набора кандидатов, суммарная вероятность которых достигает порога p, после чего из этого набора производится выборка. Ари Холцман и его коллеги из Вашингтонского университета и Allen Institute for AI представили этот метод в 2019 году в работе The Curious Case of Neural Text Degeneration. Работая с GPT-2 Large, они показали, что жадное декодирование и поиск по лучу загоняют языковые модели в унылые повторяющиеся циклы, а выборка из полного распределения приводит к бессвязному тексту; отсечение ненадежного хвоста распределения дает текст, чьи перплексия и разнообразие наиболее близки к человеческому письму. Top-p теперь стал стандартным параметром в API генерации текста практически для каждой большой языковой модели.
Как выбирается ядро#
На каждом шаге языковая модель оценивает каждый токен в своем словаре, а softmax преобразует оценки в вероятности. Затем сэмплирование ядра сортирует токены от наиболее вероятных к наименее вероятным, суммирует их вероятности в этом порядке, пока накопленная сумма не достигнет p, отбрасывает все токены за пределами этого набора, перенормирует оставшиеся вероятности так, чтобы их сумма равнялась единице, и выбирает один токен.
Возьмём четыре варианта с вероятностями 0,50, 0,25, 0,15 и 0,10 и зададим p равным 0,8. Сумма вероятностей первых двух вариантов равна 0,75, что ниже порога, поэтому добавляется третий, и ядро охватывает 0,90 вероятности. Четвёртый токен отбрасывается, а вероятности трёх оставшихся после нормализации составляют примерно 0,56, 0,28 и 0,17.
Главная особенность в том, что размер ядра меняется на каждом шаге. После фразы «Столица Франции —» почти вся вероятность приходится на один токен, и ядро сжимается до одного слова. В начале рассказа вероятность распределяется между сотнями подходящих слов, поэтому ядро расширяется и включает их. Фиксированное число кандидатов не может адаптироваться таким образом.
Та же процедура на PyTorch для одного шага декодирования по словарю из шести токенов:
import torch
# Вероятности следующих токенов для словаря из 6 токенов
probs = torch.tensor([0.10, 0.40, 0.04, 0.25, 0.06, 0.15])
top_p = 0.75
# Сортировка с последующим отбором токенов до достижения суммарной вероятностью значения top_p
sorted_probs, order = probs.sort(descending=True)
cumulative = sorted_probs.cumsum(dim=0)
keep = cumulative - sorted_probs < top_p # Токен, при добавлении которого значение top_p превышено, остаётся в наборе
# Нормализация ядра и выбор следующего идентификатора токена
nucleus = sorted_probs * keep
next_token = order[torch.multinomial(nucleus / nucleus.sum(), num_samples=1)]
print(order[keep].tolist(), next_token.item())В выводе сначала перечислено ядро: идентификаторы токенов 1, 3 и 5, на которые вместе приходится 0,80 вероятности, — а затем выбранный идентификатор. На этом шаге токены 0, 2 и 4 выбрать нельзя. При повторном запуске скрипт выбирает один из трёх оставшихся токенов с вероятностью, пропорциональной их вероятностям.
Сравнение top-p с жадным декодированием, top-k и температурой#
- Жадное декодирование всегда выбирает наиболее вероятный токен. Оно детерминированное и подходит для коротких ответов на фактические вопросы, но длинные выводы обычно начинают повторяться по кругу.
- Сэмплирование top-k сохраняет фиксированное количество кандидатов. При k, равном 50, даже в случае высокой уверенности модель выбирает из 50 токенов, включая бессмысленные, а при низкой уверенности может отбросить подходящие варианты. Top-p заменяет фиксированное количество фиксированной долей вероятности.
- Температура делит оценки модели перед применением softmax. Значения ниже 1 концентрируют распределение на наиболее вероятных вариантах, а значения выше 1 делают его более равномерным. Поскольку top-p применяется после температуры, её повышение также расширяет ядро.
- Сэмплирование min-p сохраняет каждый токен, вероятность которого не меньше заданной доли вероятности наиболее вероятного токена, поэтому порог также зависит от уверенности модели. Hugging Face Transformers, vLLM и llama.cpp предлагают этот метод наряду с top-p.
Поскольку температура и top-p управляют случайностью, стандартная рекомендация — менять что-то одно, а не оба параметра одновременно. Многие движки инференса также позволяют одновременно использовать top-k и top-p: top-k задает жесткий предел числа кандидатов.
Как выбрать значение top-p#
Значение top-p, равное 1.0, отключает фильтр, а типичные значения по умолчанию находятся в диапазоне от 0.9 до 1.0. Top-p только изменяет вероятности самой модели, поэтому фактическая точность зависит от контекста в запросе, например от генерации с дополненной выборкой, которая сокращает число галлюцинаций, предоставляя модели нужные факты. Более высокие значения добавляют разнообразия при мозговых штурмах, в диалогах чат-ботов и творческом письме. Более низкие значения, например 0.5, делают результаты предсказуемее и однообразнее, что подходит для извлечения данных, запросов на классификацию и кода, а декодирование с ограничениями идет дальше и маскирует каждый токен, который нарушил бы заданный формат.
Этот же параметр управляет генерацией текста в конвейерах компьютерного зрения. Когда детекция Ultralytics YOLO26 запускает описание сцены с помощью визуально-языковой модели, интерфейс Ultralytics для LLM передает аргументы запроса, например top_p, непосредственно в API провайдера, поэтому низкое значение, например 0.5, помогает формулировать описания похожих кадров единообразно.










