ИСКУССТВЕННЫЙ ИНТЕЛЛЕКТ

Градиентный спуск: как нейросеть учится, спускаясь с горы в тумане

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

Чтобы научить сеть, не нужно объяснять ей правила — достаточно показать, в какую сторону уменьшается её ошибка, и повторить миллион раз.
Градиентный спуск — это способ найти самую низкую точку, не видя всей карты: щупаешь склон под ногами и делаешь шаг вниз.

Представьте туман

Вы стоите на склоне горы, вокруг густой туман, видно только землю под ногами. Задача — спуститься в долину. Всю карту разглядеть нельзя, но кое-что вы чувствуете: куда наклонён склон прямо здесь. Логичная стратегия — сделать шаг в сторону самого крутого спуска, затем снова прощупать землю и снова шагнуть. Рано или поздно вы окажетесь внизу. Именно так учится нейросеть.

Что за гора и что за высота

У сети есть тысячи или миллиарды весов — тех самых чисел из прошлой статьи. Высота над уровнем моря в нашей аналогии — это ошибка сети: насколько её ответы расходятся с правильными. Чем выше — тем хуже модель. «Спуститься в долину» означает найти такие веса, при которых ошибка минимальна.

Слово градиент — это просто математическое название для «направления самого крутого подъёма». Если идти против градиента, то есть вниз по склону, ошибка уменьшается быстрее всего. Отсюда и название — спуск по антиградиенту.

Размер шага решает всё

Ключевая настройка — длина шага, её называют скоростью обучения. Сделаете шаги слишком маленькими — будете ползти к долине целую вечность. Слишком большими — перепрыгнете низину и будете скакать с одного склона на другой, никогда не попадая в цель.

Шаг слишком малОбучение длится бесконечно, легко застрять
Шаг в самый разПлавный спуск к минимуму ошибки
Шаг слишком великМодель «прыгает» и не сходится

Спуск на простом примере

Допустим, мы ищем минимум функции $f(w) = (w - 3)^2$ — её низшая точка очевидно в $w = 3$. Производная (наклон) равна $2(w-3)$. Сделаем несколько шагов против наклона:

w = 0.0          # стартуем где попало
lr = 0.1         # скорость обучения (размер шага)

for step in range(20):
    grad = 2 * (w - 3)   # наклон склона в точке w
    w = w - lr * grad    # шаг вниз
    print(round(w, 3))

# w плавно подползает к 3.0 — дну долины

Запустите — и увидите, как число подбирается к тройке. Настоящая сеть делает то же самое, только не с одним числом $w$, а с миллиардами весов одновременно.

Откуда сеть знает наклон

Это и есть самая красивая часть. Чтобы посчитать, в какую сторону менять каждый из миллиардов весов, используют алгоритм обратного распространения ошибки. Он берёт итоговую ошибку и аккуратно «раздаёт» её назад по слоям, вычисляя для каждого веса его личный вклад. Так сеть за один проход узнаёт градиент по всем параметрам сразу.

А если долин несколько

У сложной функции может быть много низин, и спуск способен застрять не в самой глубокой. На практике это редко мешает: в пространстве из миллиардов измерений почти всегда находится путь вниз, а небольшая случайность в шагах помогает выбираться из мелких ям. В итоге сеть не находит идеального минимума — но находит достаточно хороший, чтобы хорошо работать. О том, как именно измеряют «высоту» этой горы, — следующая статья про функцию потерь.

#градиентный спуск#нейросети#обучение#оптимизация