Пример 1. Траектория параметра
Цель
Понять, как именно параметр модели движется во время обучения.
Не итоговый коэффициент, не качество прогноза, а сам процесс: как меняется значение w от эпохи к эпохе, как ведет себя градиент и как уменьшается ошибка.
Этот пример нужен для того, чтобы формула
перестала быть абстрактной записью и превратилась в наблюдаемый процесс.
Сценарий
Мы намеренно убираем любую предметную область. Нас интересует только динамика обучения. Берем максимально простой набор данных:
x = [1, 2, 3, 4]
y = [2, 4, 6, 8]Здесь зависимость идеальная: y=2x.
Правильное значение параметра – w=2.
Модель предельно простая:
Функция ошибки – среднеквадратичная (MSE). Метод оптимизации – batch gradient descent.
Начинаем обучение с w=0.
Реализация на pure PHP
Что происходит математически
Ошибка:
Производная:
Каждая эпоха делает одно и то же:
Считает текущую ошибку
Считает градиент
Сдвигает параметр в сторону уменьшения ошибки
В нашем конкретном наборе данных можно упростить выражение. Поскольку yi=2xiyi, производная принимает вид:
Это означает, что градиент линейно пропорционален расстоянию до оптимального значения 2. Именно поэтому знак градиента меняется при переходе через 2, а его величина уменьшается по мере приближения к минимуму.
Что важно увидеть глазами
Когда вы запускаете код, вы видите таблицу:
эпоха
текущее значение w
значение градиента
значение ошибки
И именно здесь начинается настоящее понимание.
Во-первых, пока w<2, градиент отрицательный.
Это означает, что формула обновления
увеличивает w. Параметр движется вправо – к минимуму.
Во-вторых, по мере приближения к w=2 величина градиента уменьшается. Шаги становятся короче. Движение замедляется. Это естественно: склон становится пологим.
В нашем примере при learning rate = 0.1 параметр уже на первой эпохе перелетает через 2. После этого знак градиента меняется, и начинается движение в обратную сторону. Возникают затухающие колебания вокруг минимума, которые постепенно уменьшаются по мере снижения величины градиента.
Именно это и есть реальная работа производной: она не говорит, где минимум. Она говорит, куда двигаться сейчас.
Интерпретация как движения по ландшафту
Можно представить себе график ошибки как гладкий холм.
Пока мы на левом склоне, наклон направлен вправо
В точке минимума наклон равен нулю
На правом склоне наклон направлен влево
Градиент – это локальный наклон поверхности. Обновление параметра – это шаг вниз по этому наклону. Каждая строка вывода в консоли – это один шаг по поверхности ошибки.
Выводы
Этот пример показывает несколько фундаментальных вещей.
Во-первых, градиент – это направление движения, а не ответ. Он не сообщает нам минимум напрямую, он лишь указывает локальный склон.
Во-вторых, уменьшение шага происходит естественно. Никакой дополнительной логики не требуется – градиент сам уменьшается возле минимума.
В-третьих, обучение – это не мгновенный расчет, а последовательность маленьких коррекций.
И самое главное: формула обновления параметра перестает быть символом из учебника. Она становится реальным процессом изменения числа от эпохи к эпохе.
После этого примера градиентный спуск становится более понятным. Это просто движение по поверхности ошибки – шаг за шагом.
Чтобы самостоятельно протестировать этот код, установите примеры из официального репозитория GitHub или воспользуйтесь онлайн-демонстрацией для его запуска.
Last updated