Инференс: от входа к ответу

Прослеживаем полный путь от входного текста до готового ответа модели.

Инференс (inference) — применение уже обученной модели для получения предсказания (в отличие от обучения, где веса меняются).

Полный путь данных

текст
  | токенизатор
  v
input_ids + attention_mask
  | модель (forward)
  v
логиты (сырые числа по классам)
  | softmax
  v
вероятности
  | argmax
  v
метка ответа

Pipeline проходит этот путь автоматически. Но полезно понимать каждый шаг, чтобы при необходимости вмешаться.

Что такое логиты

Модель классификации выдаёт логиты — сырые числа, по одному на класс. Они не вероятности: могут быть отрицательными, не суммируются в единицу. Чтобы превратить их в вероятности, применяют функцию softmax.

Softmax своими руками

Softmax можно посчитать на чистом Python (стандартная библиотека, реально запускается):

import math

def softmax(logits):
    m = max(logits)
    exps = [math.exp(x - m) for x in logits]
    s = sum(exps)
    return [e / s for e in exps]

logits = [2.0, 1.0, -1.0]
probs = softmax(logits)
print("вероятности:", [round(p, 3) for p in probs])
print("сумма:", round(sum(probs), 3))
print("выбран класс:", probs.index(max(probs)))

Вывод:

вероятности: [0.705, 0.259, 0.035]
сумма: 1.0
выбран класс: 0

Самый большой логит (2.0) даёт самую высокую вероятность. Вычитание максимума (x - m) — приём для численной устойчивости, чтобы exp не переполнился.

Как работает под капотом

Forward-проход модели — это последовательное умножение матриц через слои трансформера; результат для классификации — вектор логитов длиной в число классов. На инференсе градиенты не считаются, поэтому используют режим model.eval() и контекст без вычисления градиентов — это быстрее и экономит память. Для генеративных моделей вместо softmax+argmax по классам идёт выбор следующего токена (с учётом температуры и других параметров сэмплирования).

Частые ошибки

  • Трактовать логиты как вероятности. Нужно сперва применить softmax.
  • Забыть model.eval(). Тогда слои вроде dropout ведут себя как при обучении и портят предсказание.
  • Считать градиенты на инференсе. Это лишний расход памяти и времени.

Итог

  • Инференс — применение готовой модели: текст в input_ids в логиты в ответ.
  • Логиты — сырые числа; softmax превращает их в вероятности.
  • argmax выбирает класс с наибольшей вероятностью.
  • На инференсе нужен model.eval() и отключение градиентов.
Проверьте себя
1. Что такое логиты?
AГотовые вероятности классов
BСырые числа модели, по одному на класс, до softmax
CНазвания токенов
DВеса модели
2. Что делает функция softmax?
AСжимает модель
BПревращает логиты в вероятности, суммирующиеся в единицу
CТокенизирует текст
DСчитает градиенты
3. Зачем перед инференсом вызывать model.eval()?
AЧтобы ускорить токенизацию
BЧтобы слои вроде dropout вели себя как при предсказании, а не при обучении
CЧтобы скачать модель
DЧтобы посчитать градиенты