Сэмплирование: temperature, top-k, top-p
Языковая модель не выдаёт «следующий токен» — она выдаёт распределение вероятностей над всем словарём. Как именно из него выбирать токен — это и есть сэмплирование, и от него зависит, будет ли текст скучным, живым или бредовым.
Интуиция
После каждого шага генерации трансформер возвращает вектор логитов (logits) — по одному числу на каждый токен словаря. Softmax превращает их в вероятности: «коврик» — 30%, «подоконник» — 18%, «стол» — 12% и так далее. Дальше решаем мы: можно всегда брать самый вероятный токен, а можно «кидать кубик» по этому распределению.
Самый простой вариант — жадная генерация (greedy decoding): всегда берём argmax. Звучит разумно, но на практике текст быстро вырождается: модель зацикливается и повторяет одни и те же фразы («я думаю, что я думаю, что я думаю…»). Дело в том, что самый вероятный токен на каждом шаге — не то же самое, что самая осмысленная последовательность в целом, а повторение уже сказанного часто локально «безопасно» для модели.
Как это работает: температура
Температура (temperature) — это деление логитов на число T до softmax:
При T → 0 разрывы между логитами раздуваются, и почти вся масса уходит одному токену — получаем жадную генерацию. При T = 1 распределение остаётся «как обучено». При T → ∞ различия стираются и распределение стремится к равномерному — модель начинает нести случайный набор токенов. Важно: температура не добавляет модели «креативности» в буквальном смысле — она лишь перераспределяет массу между вариантами, которые модель и так считала возможными.
Top-k, top-p и min-p: обрезаем хвост
Даже при разумной температуре в словаре остаются тысячи токенов с крошечной, но ненулевой вероятностью. Изредка кубик падает на один из них — и предложение уезжает в бессмыслицу. Поэтому хвост распределения обрезают:
- Top-k — оставить k самых вероятных токенов (например, 50), остальные занулить и перенормировать. Просто, но негибко: когда модель уверена, k = 50 — слишком много, когда не уверена — слишком мало.
- Top-p / nucleus sampling — оставить минимальный набор токенов, чья суммарная вероятность ≥ p (например, 0.9). Размер «ядра» адаптивный: у уверенной модели в нём 1–2 токена, у неуверенной — десятки. Именно поэтому top-p почти вытеснил top-k.
- Min-p — оставить токены с вероятностью не меньше доли от максимальной (например, 10% от pmax). Ещё один адаптивный вариант, популярный в open-source-инференсе.
Частотные штрафы (frequency / presence penalty) бьют по другой проблеме — повторам: логиты уже использованных токенов понижаются, и модели становится «дороже» ходить по кругу.
Beam search и практика
Лучевой поиск (beam search) держит несколько лучших префиксов и ищет последовательность с максимальной суммарной вероятностью. Для машинного перевода и распознавания речи это работает, но для открытой генерации — плохо: максимально вероятный текст оказывается предсказуемым, обрубленным и полным повторов, потому что человеческая речь на самом деле не «максимально вероятна».
Практические ориентиры: для кода, извлечения фактов и структурированных ответов температуру опускают к 0–0.3 — важна точность, а не разнообразие. Для брейншторма и художественного текста поднимают к 0.8–1.2 и включают top-p ≈ 0.9–0.95.
- «Что делает температура математически?» — делит логиты до softmax: T < 1 обостряет распределение, T > 1 сглаживает, в пределах — argmax и равномерное.
- «Чем top-p лучше top-k?» — размер отсечки адаптируется к уверенности модели, а не фиксирован заранее.
- «Почему greedy вырождается?» — локально вероятный токен ≠ глобально хороший текст; типичный симптом — циклы повторов, лечится сэмплированием и штрафами.
- «Какие параметры поставишь для генерации SQL?» — низкая температура (≈0–0.2), можно top-p пониже; разнообразие тут вредно.