Как модель выбирает следующий токен: логиты, softmax и сэмплирование

Модель не ищет готовый ответ в базе и не выбирает слово из короткого списка. На каждом шаге она получает последовательность уже имеющихся токенов, считает оценку (логит) для каждого токена своего словаря, превращает оценки в вероятности через softmax и берёт один токен по правилу отбора — жадному, с температурой, top-k или top-p. Именно правило отбора решает, будет ли ответ всегда одинаковым или разным при одном и том же вопросе.

Что такое токен и почему модель предсказывает именно его

Токен — это кусочек текста, который токенизатор вырезает из строки: часть слова, целое слово, знак препинания или пробел с буквой. Фразу «Столица Франции —» токенизатор может разбить на «Столиц», «а», « Фран», «ции», « —». Точное разбиение зависит от конкретного токенизатора и словаря модели, поэтому не стоит переносить его с одной модели на другую.

Модель работает не с буквами и не со словами целиком, а с последовательностью таких кусочков. На каждом шаге она видит все предыдущие токены в пределах контекстного окна — максимального объёма входа, который модель способна обработать за раз. Чем больше окно, тем больше предыдущего текста влияет на следующий выбор.

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

Отсюда важное следствие. Ответ строится токен за токеном, а не целиком. Ошибка на раннем шаге попадает во вход для следующих шагов и влияет на всю дальнейшую генерацию.

От скрытого состояния к логитам: как считается оценка каждого кандидата

Внутри модели — нейросеть-трансформер. Она обрабатывает вход и на последней позиции формирует скрытое состояние: вектор чисел, который сжимает информацию о контексте. Этот вектор ещё не является ответом и не содержит готового слова.

Дальше скрытое состояние умножают на матрицу проекции (её называют unembedding) и получают вектор логитов. Его длина равна размеру словаря: для словаря из 50 000 токенов будет 50 000 логитов. Логит — это ненормированная оценка, произвольное число, которое показывает, насколько модель склоняется к соответствующему токену. Само по себе оно не вероятность: может быть отрицательным, большим или маленьким.

Именно на этом этапе модель «рассматривает» все токены словаря сразу. Не существует отдельного шага, где она перебирает варианты по одному. Логиты считаются для всего словаря за один проход.

Softmax и вероятности: как логиты превращаются в распределение

Softmax — функция, которая превращает произвольные числа в вероятности с суммой 1. Работает она так: каждый логит возводят в экспоненту, затем делят на сумму всех экспонент. Экспонента делает большие числа относительно ещё большими, а маленькие — относительно маленькими, поэтому распределение получается «заострённым» на лидерах.

Возьмём четыре токена-кандидата после промпта «Столица Франции —» и условные логиты: «Париж» = 4.0, «город» = 1.0, «Лион» = 0.5, «является» = 0.5. Считаем экспоненты: exp(4.0) ≈ 54.6, exp(1.0) ≈ 2.72, exp(0.5) ≈ 1.65, exp(0.5) ≈ 1.65. Сумма ≈ 60.6. Делим каждую экспоненту на сумму и получаем вероятности: «Париж» ≈ 0.90, «город» ≈ 0.045, «Лион» ≈ 0.027, «является» ≈ 0.027. Сумма равна 1, как и должно быть.

Числа здесь иллюстративные: они показывают механику, а не поведение конкретной модели. Но обратите внимание на масштаб: разница логитов всего в 3 единицы дала вероятность 0.90 против 0.045. Если логиты близки, распределение будет более плоским, и у менее вероятных токенов появится реальный шанс.

Стратегии выбора: greedy, temperature, top-k и top-p

Распределение вероятностей — это ещё не выбор. Конкретный токен берут по правилу, и именно оно определяет, насколько ответ будет предсказуемым.

  • Жадный выбор (greedy, argmax). Всегда берётся токен с максимальной вероятностью. Ответ детерминированный при одинаковом входе, но склонен к повторам и не даёт вариативности.
  • Температура. Логиты делят на число T перед softmax. При T меньше 1 распределение становится резче, лидер получает ещё большую долю. При T больше 1 распределение размягчается, шансы выравниваются. При T = 0 выбор фактически сводится к жадному.
  • Top-k. Оставляют k токенов с наибольшими вероятностями, остальные отбрасывают, затем выбирают среди оставшихся с их относительными вероятностями.
  • Top-p (nucleus sampling). Оставляют минимальный набор токенов, чья суммарная вероятность достигает p, а хвост отсекают. При p = 0.95 в набор попадут только те кандидаты, которые вместе дают 95% вероятности.

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

Конкретные значения температуры и top-p по умолчанию различаются у моделей и API. Не переносите настройки одной модели на другую: смотрите документацию того сервиса, которым пользуетесь.

Конкретный пример: пошаговый выбор одного токена

Сведём этапы в один цикл. Контекст — «Столица Франции —». После расчёта логитов и softmax при температуре 1 получаем распределение из предыдущего раздела: «Париж» ≈ 0.90, «город» ≈ 0.045, «Лион» ≈ 0.027, «является» ≈ 0.027.

При жадном выборе или температуре 0 берём «Париж» — ответ будет одинаковым при каждом запуске. При температуре 1 и top-p = 0.95 оставляем «Париж» и «город»: их сумма 0.945, что меньше 0.95. Добавляем «Лион» — сумма 0.972, порог достигнут, хвост отсекаем. Выбор идёт между тремя токенами с их относительными вероятностями, и «город» получает реальный шанс.

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

Чем стратегии отличаются на практике

Сравним поведение стратегий по ключевым условиям: предсказуемость, разнообразие и риск ухода в маловероятные варианты.

Стратегия Что делает Предсказуемость Когда подходит
Greedy / T = 0 Берёт самый вероятный токен Высокая, ответ воспроизводим Задачи с одним правильным ответом, извлечение фактов
Температура < 1 Заостряет распределение Высокая, но с небольшой вариативностью Ответы, где нужна аккуратность
Температура > 1 Размягчает распределение Низкая, растёт разнообразие Черновики, брейншторм
Top-k Оставляет k лидеров Средняя, зависит от k Когда нужно ограничить хвост
Top-p Оставляет набор с суммой вероятности p Средняя, адаптируется к форме распределения Универсальный компромисс

Вывод меняется в зависимости от формы распределения. Если модель уверена и лидер набирает 0.99, top-p = 0.95 оставит один токен, и результат будет почти как при жадном выборе. Если распределение плоское, тот же top-p включит много кандидатов, и разнообразие вырастет. Поэтому один и тот же параметр даёт разный эффект на разных промптах.

Что это значит на практике и какие есть ограничения

Модель не «понимает» текст в человеческом смысле — она оптимизирует вероятность следующего токена по контексту. Это объясняет и сильные, и слабые стороны. Плавность и связность речи получаются хорошо, потому что модель училась на огромных текстах. А фактическая точность не гарантирована: правдоподобно звучащий токен может оказаться неверным.

Параметры отбора влияют на баланс между креативностью и точностью. Высокая температура повышает разнообразие, но увеличивает шанс ухода в маловероятные и потенциально ошибочные варианты. Низкая температура делает ответы стабильнее, но может приводить к повторам и шаблонности.

Галлюцинации — это не отдельный баг, а следствие механизма: модель всегда выдаёт какое-то распределение и всегда выбирает токен, даже если правильного ответа в контексте нет. Чувствительность к промпту тоже объяснима: изменение входных токенов меняет скрытое состояние и всё распределение.

При температуре 0 и одинаковом входе результат воспроизводим при прочих равных условиях. Но «прочие равные» включают одну и ту же версию модели, одинаковый токенизатор и одинаковые настройки — на практике они могут отличаться, и тогда ответ изменится.

Если вам нужен стабильный результат, ставьте температуру 0 и проверяйте ответ по первоисточнику. Если нужны варианты для выбора — поднимите температуру и ограничьте хвост через top-p. Конкретные значения подбирайте под свою модель по её документации: универсальных настроек, которые работают одинаково везде, нет.

Почему при температуре 0 ответы всё равно иногда отличаются?

Потому что «температура 0» означает жадный выбор только при прочих равных условиях. Если изменилась версия модели, токенизатор, системный промпт или настройки API, распределение тоже изменится, и лидером может стать другой токен.

Модель действительно перебирает все слова словаря?

Нет. Логиты для всего словаря считаются за один проход нейросети, без поштучного перебора. «Перебор» — это метафора, а не описание вычислений.

Что лучше: top-k или top-p?

Зависит от задачи. Top-k фиксирует число кандидатов и проще в настройке. Top-p адаптируется к форме распределения: при уверенной модели оставляет мало вариантов, при плоской — больше. Для универсального компромисса чаще берут top-p.

Можно ли сделать генерацию полностью детерминированной?

Жадный выбор или температура 0 убирают случайность самого отбора. Но полная воспроизводимость требует одинаковой версии модели, токенизатора и настроек. На практике это условие не всегда выполнимо, поэтому проверяйте результат, а не полагайтесь на гарантию.