Диагностика Mock-интервью
Главная · LLM: обучение и инференс

Сэмплирование: temperature, top-k, top-p

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

Интуиция

После каждого шага генерации трансформер возвращает вектор логитов (logits) — по одному числу на каждый токен словаря. Softmax превращает их в вероятности: «коврик» — 30%, «подоконник» — 18%, «стол» — 12% и так далее. Дальше решаем мы: можно всегда брать самый вероятный токен, а можно «кидать кубик» по этому распределению.

Самый простой вариант — жадная генерация (greedy decoding): всегда берём argmax. Звучит разумно, но на практике текст быстро вырождается: модель зацикливается и повторяет одни и те же фразы («я думаю, что я думаю, что я думаю…»). Дело в том, что самый вероятный токен на каждом шаге — не то же самое, что самая осмысленная последовательность в целом, а повторение уже сказанного часто локально «безопасно» для модели.

Как это работает: температура

Температура (temperature) — это деление логитов на число T до softmax:

pi = exp(zi / T) / Σj exp(zj / T)

При T → 0 разрывы между логитами раздуваются, и почти вся масса уходит одному токену — получаем жадную генерацию. При T = 1 распределение остаётся «как обучено». При T → ∞ различия стираются и распределение стремится к равномерному — модель начинает нести случайный набор токенов. Важно: температура не добавляет модели «креативности» в буквальном смысле — она лишь перераспределяет массу между вариантами, которые модель и так считала возможными.

💡 Ключевая мысль Модель предсказывает распределение, а декодер решает, как из него выбирать. Temperature управляет остротой распределения, top-k и top-p — тем, какой хвост маловероятных токенов мы вообще допускаем к розыгрышу.

Top-k, top-p и min-p: обрезаем хвост

Даже при разумной температуре в словаре остаются тысячи токенов с крошечной, но ненулевой вероятностью. Изредка кубик падает на один из них — и предложение уезжает в бессмыслицу. Поэтому хвост распределения обрезают:

Частотные штрафы (frequency / presence penalty) бьют по другой проблеме — повторам: логиты уже использованных токенов понижаются, и модели становится «дороже» ходить по кругу.

Beam search и практика

Лучевой поиск (beam search) держит несколько лучших префиксов и ищет последовательность с максимальной суммарной вероятностью. Для машинного перевода и распознавания речи это работает, но для открытой генерации — плохо: максимально вероятный текст оказывается предсказуемым, обрубленным и полным повторов, потому что человеческая речь на самом деле не «максимально вероятна».

Практические ориентиры: для кода, извлечения фактов и структурированных ответов температуру опускают к 0–0.3 — важна точность, а не разнообразие. Для брейншторма и художественного текста поднимают к 0.8–1.2 и включают top-p ≈ 0.9–0.95.

⚠️ Подводный камень «T = 0 гарантирует одинаковые ответы» — не совсем. Жадная генерация детерминирована лишь в идеальном мире: недетерминизм плавающей точки на GPU, разный батчинг на сервере и обновления модели дают чуть разные логиты, а один изменившийся токен меняет всё продолжение. Seed и фиксированное окружение помогают воспроизводимости, но у большинства API-провайдеров строгих гарантий нет.
🎤 На собеседовании
  • «Что делает температура математически?» — делит логиты до softmax: T < 1 обостряет распределение, T > 1 сглаживает, в пределах — argmax и равномерное.
  • «Чем top-p лучше top-k?» — размер отсечки адаптируется к уверенности модели, а не фиксирован заранее.
  • «Почему greedy вырождается?» — локально вероятный токен ≠ глобально хороший текст; типичный симптом — циклы повторов, лечится сэмплированием и штрафами.
  • «Какие параметры поставишь для генерации SQL?» — низкая температура (≈0–0.2), можно top-p пониже; разнообразие тут вредно.