alterna ai
ALTERNA AI / ГЛАВА 00 · 03

Когда модель действительно учится

На предыдущей странице: вход и правило преобразования.

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

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

Критерий превращает ошибку в число

Пусть x=2, известный target y*=6, а модель с w=1, b=0 выдаёт y=2. Для автоматической настройки недостаточно сказать «ответ плохой». Нужно определить objective. Возьмём squared error одного примера:

e=y−y∗,L=12e2.e=y-y^*,\qquad L=\frac12e^2.

Loss неотрицателен и равен нулю при точном совпадении. Множитель 1/2 сокращает двойку в производной. Это учебный regression objective, а не универсальная мера для любой модели.

Для dataset из N примеров empirical risk может быть средним:

LD(θ)=1N∑a=1N12(fθ(xa)−ya∗)2.L_D(\theta)=\frac1N\sum_{a=1}^{N}\frac12\left(f_\theta(x_a)-y_a^*\right)^2.

Оптимизатор видит этот критерий на выбранных данных. Он не минимизирует напрямую «разумность», безопасность или качество на всех возможных будущих inputs.

Вывод градиента без чёрного ящика

Для y=wx+b увеличим w на малое δ, сохраняя x и b. Новая ошибка равна e+xδ, поэтому

L(w+δ,b)−L(w,b)δ=ex+12x2δ.\frac{L(w+\delta,b)-L(w,b)}{\delta} =ex+\frac12x^2\delta.

При δ→0 получаем ∂L/∂w=ex. Аналогично ∂L/∂b=e. Градиент

∇θL=[ex,e]\nabla_\theta L=[ex,e]

указывает направление локального роста в координатах (w,b). Gradient descent использует противоположное направление:

wnew=w−ηex,bnew=b−ηe,w_{new}=w-\eta ex,\qquad b_{new}=b-\eta e,

где η>0 — learning rate. Оба gradient values относятся к одному старому состоянию и должны применяться одновременно. Если сначала обновить w, пересчитать e, а потом обновить b, получится другой алгоритм.

Один полностью проверяемый шаг

Для x=2, w=1, b=0, y*=6, η=.1:

Стадия Вычисление Значение
Forward y=1·2+0 2
Error e=2−6 −4
Loss .5·(−4)² 8
Gradient [ex,e] [−8,−4]
Update (1,0)−.1·(−8,−4) (1.8,.4)
Новый forward 1.8·2+.4 4
Новый loss .5·(4−6)² 2

Почему большой шаг способен ухудшить loss

Подставим update в новую ошибку для того же примера:

enew=[1−η(x2+1)]e.e_{new}=\left[1-\eta(x^2+1)\right]e.

При x=2 множитель равен 1−5η. Для η=.1 модуль ошибки уменьшается вдвое. При η=.2 этот единственный пример попадает точно на линию 2w+b=6. При η=.4 ошибка меняет знак, но сохраняет модуль, поэтому loss остаётся 8. При η=.5 модуль становится в 1.5 раза больше, а loss вырастает до 18.

Условие уменьшения ненулевого loss в этой конкретной одномерной по данным задаче:

∣1−5η∣<1⟺0<η<0.4.|1-5\eta|<1\quad\Longleftrightarrow\quad0<\eta<0.4.

Это не универсальный допустимый диапазон для нейросетей. Он выведен из выбранного x, objective и одновременного update двух параметров.

Нулевой training loss не доказывает закон мира

Для одного примера любой parameter pair на прямой 2w+b=6 даёт loss 0. Например, (3,0), (2,2) и (1,4) одинаково объясняют единственную точку, но дают разные predictions при x=3. Оптимизация training objective и обобщение — разные вопросы. Нужны отдельные данные, предположения о задаче и оценка на неиспользованных примерах.

Training и inference — разные ветви вычисления

Процесс Нужен target Вычисляет gradient Обновляет parameters
Training step Да для supervised примера Да Да, на стадии update
Inference / forward Нет Не требуется Нет

Добавление примера в prompt меняет input. Это может изменить activations и output при тех же weights. Few-shot режим GPT-3 описан без gradient updates во время запроса [S05]. Название in-context learning не следует автоматически интерпретировать как запись новых коэффициентов в parameter store.

Отдельно от model forward приложение может сохранять историю, а будущий training pipeline — использовать разрешённые данные. Утверждение «обычный inference не обновляет weights» не является обещанием, что конкретный сервис нигде не хранит сообщения. Это разные границы системы, политики и операции.

Прозрачный Python: один update

def train_step(eta=.1):
    x,w,b,target = 2,1,0,6
    y = w*x+b
    error = y-target
    loss = .5*error**2
    gw,gb = error*x,error
    new_w,new_b = w-eta*gw,b-eta*gb
    new_y = new_w*x+new_b
    return {'y':y,'loss':loss,'gradient':[gw,gb],
            'updated':[new_w,new_b],'new_y':new_y,'new_loss':.5*(new_y-target)**2}

В библиотеке autograd эти производные вычислит граф операций. В этой главе они выписаны вручную; NumPy/PyTorch и autograd подробно появятся после математического фундамента.

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

Forward и loss вычисляют значения по старым параметрам. Только update присваивает новые значения параметрам.

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

Академическая база →