alterna ai
ALTERNA AI / ГЛАВА 17 · 03

17.3 Как выбирается один вариант

На предыдущей странице: следующий запуск использует сохранённое.

Оценки уже получены. Теперь температура и ограничения кандидатов задают правило выбора; веса от этого не обучаются.

Первый запуск обрабатывает префикс. Каждый последующий добавляет одну позицию; K/V прошлых позиций можно сохранять. Выборка и сжатое хранение решают разные задачи.

Logits задаёт модель, выбор token задаёт decoder

Greedy decoding выбирает argmax; sampling сначала преобразует logits temperature, затем может ограничить кандидатов top-k или nucleus top-p. При temperature T>0 используется softmax(z/T): малое T концентрирует distribution, большое делает её более ровной. T=0 лучше задавать отдельным greedy режимом, а не делить на ноль.

Nucleus выбирает минимальный prefix кандидатов, отсортированных по вероятности, с cumulative mass не меньше p, затем перенормирует его. F10.

Sp=min⁡{S:∑j∈Spj≥p},p~j=pj∑k∈Sppk1[j∈Sp].S_p=\min\left\{S:\sum_{j\in S}p_j\ge p\right\},\qquad \tilde p_j=\frac{p_j}{\sum_{k\in S_p}p_k}\mathbf1[j\in S_p].

Что показывает модель. Inspector обязан показывать исходные logits, temperature distribution, оставшихся кандидатов и renormalized probabilities. Seed относится к pseudo-random draw, а не к model distribution. При одинаковых weights/prefix/policy/seed deterministic runtime должен повторить IDs, но это тест воспроизводимости, не качества.

Граница применимости. Top-p не проверяет факты и безопасность. Порядок применения repetition penalty, top-k, top-p и constraints влияет на результат и входит в API contract. Floating-point ties требуют стабильного tie-break. Beam search оптимизирует собственный sequence score и также не гарантирует хороший человеческий ответ.

from math import exp
logits_17c=[2.0,1.0,0.0]; temperature_17c=1.0; top_p_17c=0.8
raw_17c=[exp(v/temperature_17c-max(logits_17c)) for v in logits_17c]
probs_17c=[v/sum(raw_17c) for v in raw_17c]; order_17c=sorted(range(3),key=lambda i:(-probs_17c[i],i))
kept_17c=[]; mass_17c=0.0
for i_17c in order_17c:
    kept_17c.append(i_17c); mass_17c+=probs_17c[i_17c]
    if mass_17c>=top_p_17c: break
assert kept_17c==[0,1] and abs(sum(probs_17c[i] for i in kept_17c)-mass_17c)<1e-12

Код повторяет только что разобранные операции. Полный проверяемыйPython-пример главы доступен отдельным файлом; показанный короткий фрагмент не заменяет его реализацию.

Seed управляет воспроизводимой выборкой, а не model forward.

Несколько запросов используют общую вычислительную работу. Как этот вопрос продолжает полученный результат?

Python-примеры главы 17 Академическая база →