alterna ai
ALTERNA AI / ГЛАВА 16 · 02

16.2 Ошибка и влияние весов

На предыдущей странице: что считать правильным ответом.

Сначала измеряем уверенность в правильном ответе, затем идём назад по вычислениям. Производная оценки превращается во влияние на вес.

Каждый известный токен готовит прогноз следующего. Ошибка проходит назад по программе, оптимизатор меняет веса, а отдельные данные проверяют результат. Разметка диалога и предпочтений меняет objective.

Градиент начинается с logits

Для одного target y softmax превращает logits z в распределение, а negative log-likelihood штрафует вероятность правильного ID. Устойчивая реализация вычитает максимум до exp. При softmax вместе с cross-entropy производная по каждому logit имеет особенно простую форму. F06.

pj=ezj−m∑kezk−m,L=−log⁡py,∂L∂zj=pj−1[j=y].p_j=\frac{e^{z_j-m}}{\sum_k e^{z_k-m}},\quad L=-\log p_y,\quad \frac{\partial L}{\partial z_j}=p_j-\mathbf 1[j=y].

Положительные компоненты уменьшают неверные logits при gradient descent, отрицательная компонента повышает target logit. Их сумма равна нулю: добавление одной константы ко всем logits не меняет softmax. Для batch/token matrix сначала применяют mask, затем явно выбирают sum или mean по числу валидных targets, а не по размеру padded tensor.

Что показывает модель. Inspector показывает logits, shifted target, probabilities, token loss и dL/dz до прохождения backward через LM head и blocks. Perplexity exp(mean NLL) имеет смысл только при одинаковом tokenizer и одинаковой политике masking; значение нельзя честно сравнивать между произвольными словарями как универсальную шкалу качества.

Граница применимости. Низкая next-token loss не доказывает factuality, безопасность или способность следовать инструкции. Floating-point overflow предотвращается устойчивой формой, но training всё ещё может получить NaN из activations, gradients или optimizer state. Gradient clipping ограничивает norm update-сигнала, а не «исправляет» плохие данные и не гарантирует сходимость.

from math import exp,log
logits_16b=[1.0,0.0,-1.0]; target_16b=0; pivot_16b=max(logits_16b)
raw_16b=[exp(v-pivot_16b) for v in logits_16b]; probs_16b=[v/sum(raw_16b) for v in raw_16b]
loss_16b=-log(probs_16b[target_16b]); grad_16b=[p-(i==target_16b) for i,p in enumerate(probs_16b)]
assert abs(loss_16b-0.40760596444438046)<1e-12 and abs(sum(grad_16b))<1e-12

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

Mask исключает позицию из objective, но token может оставаться входным context.

Исправляем и независимо проверяем. Как этот вопрос продолжает полученный результат?

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