Функция потерь, perplexity и масштаб

Чтобы обучать модель, нужно числом измерить, насколько она ошибается. Этот урок — про функцию потерь, perplexity и их связь с масштабом.

Кросс-энтропийная потеря — мера ошибки предсказания: чем меньшую вероятность модель дала правильному токену, тем больше потеря.

Как оценить одно предсказание

Модель выдаёт распределение вероятностей по словарю, а мы знаем настоящий следующий токен. Логично наказывать модель тем сильнее, чем меньшую вероятность она присвоила правильному ответу. Это и есть кросс-энтропия: потеря равна −log(вероятность правильного токена). Дала 0.9 — потеря крошечная; дала 0.01 — потеря большая. Посмотрим зависимость.

import math

# Модель предсказывает распределение по словарю, мы знаем правильный токен.
# Потеря (cross-entropy) = -log(вероятность, которую модель дала правильному токену).
def loss_for(prob_correct):
    return -math.log(prob_correct)

print("Чем увереннее модель в правильном токене, тем меньше потеря:")
for p in (0.9, 0.5, 0.1, 0.01):
    L = loss_for(p)
    print(f"  P(правильный)={p:>4}  ->  loss={L:.3f}  ->  perplexity={math.exp(L):.1f}")

print()
print("Perplexity ~ 'среди скольких равновероятных вариантов модель путается'.")
print("perplexity 1.0 = модель уверена идеально; чем выше, тем хуже.")

Вывод:

Чем увереннее модель в правильном токене, тем меньше потеря:
  P(правильный)= 0.9  ->  loss=0.105  ->  perplexity=1.1
  P(правильный)= 0.5  ->  loss=0.693  ->  perplexity=2.0
  P(правильный)= 0.1  ->  loss=2.303  ->  perplexity=10.0
  P(правильный)=0.01  ->  loss=4.605  ->  perplexity=100.0

Perplexity ~ 'среди скольких равновероятных вариантов модель путается'.
perplexity 1.0 = модель уверена идеально; чем выше, тем хуже.

Здесь же видна perplexity — это просто exp(потеря). Её удобно трактовать как «среди скольких равновероятных вариантов модель эффективно путается». Perplexity 1 — идеальная уверенность; 100 — модель будто гадает среди сотни вариантов. Чем ниже perplexity, тем лучше модель предсказывает текст.

Как из потери учится вся модель

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

Потеря и масштаб

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

Почему нельзя гнаться за нулевой потерей

Нулевая потеря означала бы, что модель идеально предсказывает каждый токен, — а это невозможно и нежелательно. Естественный язык по своей природе неоднозначен: после «Я пошёл в…» уместны и «магазин», и «кино», и «парк». Модель и не должна быть уверена на 100% — она должна давать разумное распределение. Слишком низкая потеря на обучающих данных часто означает переобучение (зубрёжку), а не понимание.

Итог

  • Кросс-энтропийная потеря = −log(вероятности правильного токена); меньше вероятность — больше штраф.
  • Perplexity = exp(потеря) — «среди скольких вариантов модель путается»; меньше — лучше.
  • Веса обновляют по градиенту потери; триллионы шагов и дают обученную модель.
  • Потеря — главный измеритель масштаба; нулевая потеря недостижима и нежелательна из-за неоднозначности языка.
Проверьте себя
1. Как кросс-энтропийная потеря зависит от уверенности модели в правильном токене?
AЧем выше вероятность правильного токена, тем больше потеря
BЧем выше вероятность правильного токена, тем меньше потеря
CПотеря не зависит от вероятности
DПотеря всегда равна 1
2. Что показывает perplexity?
AРазмер словаря
BСреди скольких равновероятных вариантов модель эффективно путается (ниже — лучше)
CЧисло параметров
DДлину контекстного окна
3. Почему нулевая потеря на обучении нежелательна?
AОна невозможна технически и всегда означает поломку
BЯзык неоднозначен, а слишком низкая потеря означает зубрёжку (переобучение), а не понимание
CПотому что perplexity тогда станет бесконечной
DЭто ускоряет генерацию слишком сильно
Поддержать проект