Функция потерь, 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(потеря) — «среди скольких вариантов модель путается»; меньше — лучше.
- Веса обновляют по градиенту потери; триллионы шагов и дают обученную модель.
- Потеря — главный измеритель масштаба; нулевая потеря недостижима и нежелательна из-за неоднозначности языка.