Инференс: от входа к ответу
Прослеживаем полный путь от входного текста до готового ответа модели.
Инференс (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()и отключение градиентов.