Пример 1. Траектория параметра

Цель

Понять, как именно параметр модели движется во время обучения.

Не итоговый коэффициент, не качество прогноза, а сам процесс: как меняется значение ww от эпохи к эпохе, как ведет себя градиент и как уменьшается ошибка.

Этот пример нужен для того, чтобы формула

w=wηdLdww = w - \eta \cdot \frac{dL}{dw}

перестала быть абстрактной записью и превратилась в наблюдаемый процесс.

Сценарий

Мы намеренно убираем любую предметную область. Нас интересует только динамика обучения. Берем максимально простой набор данных:

x = [1, 2, 3, 4]
y = [2, 4, 6, 8]

Здесь зависимость идеальная: y=2xy = 2x.

Правильное значение параметра – w=2w = 2.

Модель предельно простая:

y^=wx\hat{y} = w \cdot x

Функция ошибки – среднеквадратичная (MSE). Метод оптимизации – batch gradient descent.

Начинаем обучение с w=0w = 0.

Реализация на pure PHP

Что происходит математически

Ошибка:

L(w)=1n(wxiyi)2L(w) = \frac{1}{n} \sum (w x_i - y_i)^2

Производная:

dLdw=2nxi(wxiyi)\frac{dL}{dw} = \frac{2}{n} \sum x_i (w x_i - y_i)

Каждая эпоха делает одно и то же:

  1. Считает текущую ошибку

  2. Считает градиент

  3. Сдвигает параметр в сторону уменьшения ошибки

В нашем конкретном наборе данных можно упростить выражение. Поскольку yi=2xiyiy_i=2x_iy_i​, производная принимает вид:

dLdw=15(w2)\frac{dL}{dw} = 15 (w - 2)

Это означает, что градиент линейно пропорционален расстоянию до оптимального значения 2. Именно поэтому знак градиента меняется при переходе через 2, а его величина уменьшается по мере приближения к минимуму.

Что важно увидеть глазами

Когда вы запускаете код, вы видите таблицу:

  • эпоха

  • текущее значение ww

  • значение градиента

  • значение ошибки

И именно здесь начинается настоящее понимание.

Во-первых, пока w<2w < 2, градиент отрицательный.

Это означает, что формула обновления

w=wηgradientw = w - \eta \cdot gradient

увеличивает ww. Параметр движется вправо – к минимуму.

Во-вторых, по мере приближения к w=2w = 2 величина градиента уменьшается. Шаги становятся короче. Движение замедляется. Это естественно: склон становится пологим.

В нашем примере при learning rate = 0.1 параметр уже на первой эпохе перелетает через 2. После этого знак градиента меняется, и начинается движение в обратную сторону. Возникают затухающие колебания вокруг минимума, которые постепенно уменьшаются по мере снижения величины градиента.

Именно это и есть реальная работа производной: она не говорит, где минимум. Она говорит, куда двигаться сейчас.

Интерпретация как движения по ландшафту

Можно представить себе график ошибки как гладкий холм.

  • Пока мы на левом склоне, наклон направлен вправо

  • В точке минимума наклон равен нулю

  • На правом склоне наклон направлен влево

Градиент – это локальный наклон поверхности. Обновление параметра – это шаг вниз по этому наклону. Каждая строка вывода в консоли – это один шаг по поверхности ошибки.

Выводы

Этот пример показывает несколько фундаментальных вещей.

Во-первых, градиент – это направление движения, а не ответ. Он не сообщает нам минимум напрямую, он лишь указывает локальный склон.

Во-вторых, уменьшение шага происходит естественно. Никакой дополнительной логики не требуется – градиент сам уменьшается возле минимума.

В-третьих, обучение – это не мгновенный расчет, а последовательность маленьких коррекций.

И самое главное: формула обновления параметра перестает быть символом из учебника. Она становится реальным процессом изменения числа от эпохи к эпохе.

После этого примера градиентный спуск становится более понятным. Это просто движение по поверхности ошибки – шаг за шагом.

circle-info

Чтобы самостоятельно протестировать этот код, установите примеры из официального репозитория GitHubarrow-up-right или воспользуйтесь онлайн-демонстрациейarrow-up-right для его запуска.

Last updated