К содержанию
Фонтум Искусственный интеллект Урок 4 / 24 Все уроки

Главная · Курсы · Искусственный интеллект · Программа курса · Модуль II. Как машина учится · урок 4 из 24

Градиентный спуск

Как подбирают числа, которых слишком много, чтобы их перебрать

Градиентный спуск это процедура подбора параметров: посчитать, в какую сторону убывает функция потерь, сделать маленький шаг туда и повторить. Перебор тут бесполезен, при десяти параметрах и ста значениях на каждый машина, проверяющая миллиард вариантов в секунду, потратит около трёх тысяч лет. Размер шага задаёт человек: в тренажёре урока при скорости 0,001 ошибка падает ниже 0,2 за шестьдесят шагов, при 0,01 за пять, а выше 0,04 спуск расходится.

Stanford CS229, лекции об оптимизации. Dive into Deep Learning, главы о линейной регрессии и оптимизации · 22 мин · обновлено 01.10.2026

После урока вы сможете

  • Понимать, почему параметры модели невозможно подобрать перебором
  • Объяснять градиентный спуск как повторение одного дешёвого вопроса
  • Знать, чем грозит слишком крупная и слишком мелкая скорость шага
  • Видеть, где ломается аналогия со спуском с горы в тумане

Начнём с задачи, которую видно целиком. Есть восемь измерений: сколько удобрения внесли на поле и сколько зерна собрали. Точки на графике легли почти на прямую, и нам нужно эту прямую провести. У прямой всего две ручки, наклон и высота, на которой она пересекает вертикальную ось.

Две ручки можно перебрать, и это честный способ. Возьмите сто значений наклона и сто значений высоты, посчитайте для каждой пары промах и выберите лучшую. Десять тысяч проверок укладываются в долю секунды на любом ноутбуке. Пока ручек две, никакая хитрость не нужна.

Беда начинается, когда ручек становится больше. При десяти ручках и тех же ста значениях на каждую перебрать придётся сто в десятой степени вариантов. Машина, проверяющая миллиард вариантов в секунду, потратит на это около трёх тысяч лет. А в сетях, о которых пойдёт речь дальше, ручек бывает миллиард.

Значит, перебор не медленный способ, а невозможный. И всё-таки эти числа подбирают, причём одним приёмом и для двух ручек, и для миллиарда. Приём этот называется градиентным спуском, устроен он проще, чем можно ожидать, и весь урок посвящён именно ему.

Что именно уменьшают

Крутить ручки бессмысленно, пока не знаешь, стало лучше или хуже. Мера нужна заранее, и она у нас уже есть из прошлого урока. Функция потерь это число, измеряющее, насколько ответы модели плохи. Считают её здесь так: у каждой точки берут разницу между предсказанием прямой и тем, что вышло на самом деле.

Дальше каждую разницу возводят в квадрат, складывают и делят сумму на восемь. Получается средний квадрат ошибки, та самая величина, которую тренажёр показывает под графиком. Квадрат нужен по двум причинам, и обе понятны без математики: промах вверх и промах вниз одинаково плохи, а крупный промах штрафуется сильнее мелкого.

Есть и третья причина, которая пригодится уже через минуту. Квадрат меняется плавно: чуть повернули ручку, и число чуть сдвинулось. Если бы потери считали иначе, скажем «сколько точек угадано в точку», они менялись бы скачками. А по скачущей величине непонятно, в какую сторону крутить, и весь дальнейший приём не работал бы.

Теперь задача записана полностью, и звучит она чисто арифметически. Найти два числа, при которых средний квадрат ошибки наименьший. Ни слова про удобрения, урожай и смысл происходящего в этой формулировке нет. Машина решает именно её, и в этом сразу и сила приёма, и его слепота.

Один дешёвый вопрос вместо одного дорогого

Вопрос «какие значения ручек лучшие?» слишком дорог, и его заменяют другим, куда более скромным. «Если повернуть вот эту ручку на чуть-чуть вверх, ошибка вырастет или упадёт?» Ответ на такой вопрос стоит копейки: достаточно посчитать потери здесь и совсем рядом. И приходит он не словами «лучше» или «хуже», а числом.

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

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

Может возникнуть вопрос, зачем шагать мелко, если направление известно. Затем, что известно только направление, а не расстояние до дна. Уклон под ногой говорит, куда идёт склон прямо здесь, и ничего не обещает про то, что будет через сто метров. Крупный шаг верит уклону дальше, чем следует, и через минуту мы увидим, чем это кончается.

Но главное в этой процедуре другое, и это стоит проговорить отдельно. Перебор растёт с числом ручек как степень: добавили ручку, и работа умножилась на сто. Один шаг спуска растёт всего лишь пропорционально числу ручек. Ровно в этой разнице причина того, что обучать сеть с миллиардом параметров вообще возможно.

ловушка«Модель ищет минимум»

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

Спуск в тумане, и где эта картинка врёт

Обычно градиентный спуск объясняют одной картинкой, и мы тоже с неё начнём. Здесь это похоже на спуск с горы в густом тумане. Долины не видно, карты нет, но под ногой чувствуется уклон. Нащупали, куда склон идёт вниз, шагнули туда, повторили.

В главном картинка верна: чтобы двигаться вниз, не нужно видеть всю местность, хватает того, что под ногами. Процедура при этом тупая, на каждом шаге одинаковая и не требующая понимания, где именно находится дно. Ровно этими двумя свойствами градиентный спуск и берёт, а никаких других у него нет.

Дальше аналогия начинает врать, и врёт она в трёх местах сразу. У горы, на которой вы стоите, дно одно, а у поверхности потерь ям много. У горы два направления, куда шагнуть, а у сети их миллион, и рисовать это в голове бесполезно. И падение с горы необратимо, а неудачный шаг спуска стоит только времени.

Больше всего беспокойства всегда вызывала первая поломка. Если ям много, спуск должен застревать в первой попавшейся и до хорошего решения не доходить. Практика показала, что глубоким сетям это мешает заметно реже, чем ожидалось. Почему именно так, никто до конца не понял, и в реестре курса вопрос стоит со статусом «спор открыт».

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

на заметкуАналогия и место её слома

Гора в тумане остаётся аналогией, а не описанием. Верна она в том, что для движения вниз хватает местных сведений: карта не нужна. Ломается вот где: у горы одно дно и два направления, а у поверхности потерь ям много и направлений столько же, сколько параметров. Если из урока запомнится только гора, останется впечатление, что обучение это спуск в единственную правильную яму. Это неверно, и найденное дно почти никогда не единственное.

Скорость шага

У спуска есть настройка, которую он себе не выбирает. Это скорость шага (learning rate), она говорит, насколько крупный сдвиг делать в найденном направлении. Задаёт её человек, вместе с остальными числами она не выучивается. И от неё зависит, чем кончится обучение, причём сильнее, чем кажется.

Слишком мелкий шаг ошибок не делает, зато требует терпения. В тренажёре при скорости 0,001 средний квадрат ошибки падает ниже 0,2 примерно за шестьдесят шагов. При скорости 0,01 на то же самое уходит около пяти шагов. На восьми точках разница незаметна, а на большой модели это разница между сутками и месяцем.

Слишком крупный шаг ломает всё, и ломает поучительным образом. Спуск перепрыгивает дно ямы и оказывается на другой стороне выше, чем был. Следующий шаг считается из точки повыше и выходит ещё крупнее, и так до тех пор, пока числа не улетят в бесконечность. Называется это расхождением, и увидеть его стоит своими глазами.

В тренажёре граница проходит примерно на 0,04. Чуть ниже прямая спокойно садится на точки, чуть выше всё разлетается. На максимуме ползунка спуску хватает шести шагов, чтобы уйти в бесконечность. Ошибки в математике здесь нет никакой: есть шаг, который больше, чем позволяет крутизна ямы.

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

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

Когда спуск останавливают

Спуск сам по себе не кончается: он готов делать шаги бесконечно. Где-то его надо остановить, и это отдельное решение человека. Простейший способ состоит в том, чтобы задать число шагов заранее и на нём прерваться. Второй способ предлагает следить за ошибкой и останавливаться, когда она перестала заметно падать.

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

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

Три вида обучения, машинка одна

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

Различаются они тем, откуда берётся число, которое надо уменьшать. У учителя это расхождение с известным ответом. Без учителя считают, насколько плохо описаны данные: скажем, насколько далеко точки от центров найденных групп. С подкреплением труднее всего, потому что награда приходит с опозданием и не сообщает, какое именно действие её заслужило.

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

Что видно в тренажёре

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

Под графиком тренажёр рисует вторую кривую, ошибку по шагам. Такую же кривую печатают в статьях и называют кривой обучения. Теперь понятно, что за ней стоит: каждая её точка и есть один поворот всех ручек сразу. Красивого падения в ноль на ней не бывает, и ждать его не надо.

Дальше поставьте скорость шага на максимум и нажмите «Сто шагов». Ошибка не уменьшится, а обратится в бесконечность за считанные шаги. Верните ползунок к 0,01 и убедитесь, что та же самая процедура сходится спокойно. Минуту стоит потратить на то, чтобы ползунком нащупать границу между двумя режимами.

И последнее, ради чего тренажёр стоит открыть. Прямую через восемь точек можно провести и точной формулой, безо всякого спуска. Но формула существует для прямой и не существует для сети с миллиардом параметров. Спуск же работает и там и там, и вся его цена сводится к повторению мелкого шага.

Чего спуск не обещает

Стоит сразу отделить то, что спуск умеет, от того, чего от него ждут. Умеет он ровно одно: уменьшать число, которое ему дали, на данных, которые ему показали. Ни на что другое процедура не настроена и настроена быть не может. Значит, ответственность за то, какое число ей подсунули, лежит целиком на человеке.

Отсюда два предупреждения, к которым курс вернётся не раз. Система оптимизирует то, что записано в функции потерь, а не то, что имелось в виду. И маленькая ошибка на обучающих данных сама по себе не значит почти ничего. Модель может опуститься на самое дно ямы и оказаться бесполезной на новых примерах.

Это не придирка и не редкий случай, а обычное положение дел. Ему посвящён урок 6, где кривая проходит через все обучающие точки и промахивается мимо новых. Спуск в этом не виноват: он честно сделал то, о чём его просили. Вопрос всегда в том, о чём именно его попросили.

Что дальше

В этом уроке одно место осталось непроговорённым, и оно самое важное. Мы сказали, что направление считается для каждой ручки, но не сказали как. Для двух ручек это очевидно, а для миллиона вовсе нет. Ответ называется обратным распространением ошибки, и ему посвящён урок 5.

Там же появится исключающее «или», задача, о которую в 1969 году споткнулась однослойная схема. Сеть будет учить её у вас на глазах, и ровно тем же спуском, что и здесь. Разница только в двух вещах: ручек станет больше, а ошибку придётся раскладывать по слоям.

тренажёр урока 4

Спуск ощупью

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

Открыть тренажёр

Ключевые работы и результаты

Stanford CS229 «Machine Learning»2018Открытый курс с лекциями и конспектами. Градиентный спуск вводится в первых же лекциях как основная процедура подбора параметров, а не как один из многих приёмов.
A. Zhang, Z. Lipton, M. Li, A. Smola, «Dive into Deep Learning»2023Открытый учебник под лицензией CC BY-SA 4.0. Линейная регрессия разбирается там дважды: точной формулой и градиентным спуском, чтобы было видно, что спуск не приближение, а другой способ добраться до того же ответа.

Что подтвердилось, а что нет

мифКомпьютер подбирает параметры перебором вариантов, просто очень быстро.

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

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

Поверхность потерь у больших сетей действительно не имеет одного дна, и ожидание застревания выглядело естественным. Практика показывает, что для глубоких сетей это мешает реже, чем ждали. Почему именно, до конца не понято. У маленьких моделей проблема видна прямо в тренажёре урока 5: сеть с двумя скрытыми нейронами застревает примерно в каждом третьем запуске.

сильно ослабленоЧтобы обучение точно сошлось, достаточно взять скорость шага поменьше.

В осторожной форме верно: мелкий шаг действительно снимает расхождение, и спуск перестаёт разлетаться. В сильной форме неверно, потому что за надёжность платят временем. В тренажёре при скорости 0,001 нужно около шестидесяти шагов там, где при 0,01 хватает пяти. На большой модели такая разница означает месяц вместо суток. Скорость шага не мелочь, которую можно выставить наугад в безопасную сторону.

Термины

градиентный спускgradient descent
Процедура подбора параметров: посчитать, в какую сторону убывает функция потерь, сделать маленький шаг туда и повторить. Стоимость шага растёт с числом параметров пропорционально, а не как степень.
градиентgradient
Набор чисел, показывающий для каждого параметра, в какую сторону и насколько круто меняется функция потерь. Указывает направление самого быстрого роста ошибки, поэтому шаг делают в противоположную сторону.
скорость шагаlearning rate
Насколько крупный сдвиг делают в найденном направлении. Задаётся человеком и не выучивается: слишком крупная приводит к расхождению, слишком мелкая растягивает обучение.
расхождениеdivergence
Обучение, при котором ошибка не падает, а растёт до бесконечности. Возникает, когда шаг больше, чем позволяет крутизна ямы: спуск перепрыгивает дно и с каждым разом уходит дальше.
локальный минимумlocal minimum
Яма на поверхности потерь, из которой мелкими шагами не выбраться, хотя где-то есть яма глубже. У больших сетей таких ям много, а насколько сильно они мешают на практике, спор открыт.
функция потерьloss function
Число, измеряющее, насколько ответы модели плохи: чем хуже, тем больше. Её выбор это решение о том, что считать ошибкой, а не техническая мелочь.
параметрparameter
Настраиваемое число модели. Обучением называют подбор положений всех параметров так, чтобы ответы на известных примерах совпадали с известными ответами.
машинное обучениеmachine learning
Способ получить правило не написанием, а подбором: на вход подают данные и ответы, на выходе получают правило в виде набора чисел.

Практикум · Нащупать границу расхождения

Про скорость шага можно прочитать, а можно найти её границу руками за пять минут. Второе запоминается прочно, потому что число вы получите своё. Всё делается в тренажёре этого урока.

  1. Откройте тренажёр, оставьте скорость шага 0,01 и нажмите «Один шаг» пять раз подряд. Выпишите после каждого нажатия значения w, b и ошибки: вам нужен не результат, а то, как меняется размер шага.
  2. Нажмите «Сбросить», поставьте ползунок на максимум и нажмите «Один шаг» три раза. Запишите, что стало с ошибкой, и объясните себе словами, почему она выросла, хотя направление было выбрано верно.
  3. Найдите границу между двумя режимами. Двигайте ползунок сверху вниз и на каждом значении нажимайте «Сто шагов», пока спуск не перестанет разлетаться. Запишите найденное число, оно понадобится в следующем шаге.
  4. Проверьте границу на устойчивость: возьмите значение чуть меньше найденного и чуть больше, и на каждом сделайте по сто шагов. Опишите в двух строках, чем поведение по одну сторону границы отличается от поведения по другую.
  5. Поставьте скорость 0,001 и считайте, сколько раз пришлось нажать «Сто шагов», чтобы ошибка опустилась ниже 0,2. Сравните с числом шагов при 0,01 и запишите ответ на вопрос: что именно покупается мелким шагом и чем за это платят.

Вопросы для самопроверки

Вопрос 1

Почему параметры модели не подбирают перебором значений?

  • Перебор дал бы менее точный ответ, чем градиентный спуск: найденные им параметры оказываются хуже
  • Перебор требует размеченных данных, которых обычно нет
  • Число вариантов растёт с числом параметров как степень и быстро становится непроходимым
  • Перебор несовместим с функцией потерь: её значение вычисляется только по ходу градиентного спуска, шаг за шагом
Вопрос 2

Что такое градиент в этой процедуре?

  • Направление и крутизна: набор чисел, показывающий для каждого параметра, куда и насколько круто меняется ошибка
  • Скорость, с которой обучается модель: величина градиента и задаёт число шагов в секунду
  • Разница между предсказанием и правильным ответом на одном примере
  • Число слоёв в сети: глубину сети и называют её градиентом
Вопрос 3

Скорость шага поставили заметно больше нужного. Что произойдёт?

  • Обучение пойдёт быстрее и закончится точнее: крупный шаг быстрее добирается до дна ямы
  • Модель переобучится: чем крупнее шаг, тем плотнее модель садится на обучающие примеры
  • Ничего страшного: тут всё зависит от задачи, и общего правила нет
  • Спуск перепрыгнет дно, ошибка начнёт расти и уйдёт в бесконечность
Вопрос 4

Где ломается аналогия «спуск с горы в тумане»?

  • В том, что у идущего с горы есть карта местности, а у модели её нет: без карты спуск невозможен
  • У горы одно дно и два направления, а у поверхности потерь ям много и направлений столько же, сколько параметров
  • В тумане ничего не видно, а модель видит всю поверхность потерь сразу и выбирает самую глубокую яму
  • Гора со временем не меняется, а данные меняются
Вопрос 5

Что общего у обучения с учителем, без учителя и с подкреплением?

  • Все три требуют размеченных данных: без правильных ответов уменьшать было бы нечего
  • Все три дают примерно одинаковое качество, если дать им одни и те же данные
  • Ни в одном из них нет общей процедуры: три вида обучения устроены совершенно по-разному
  • Во всех трёх есть число, которое уменьшают, и шаг в сторону его убывания

Ответы и разбор открываются в самопроверке урока: она считает результат и отмечает урок пройденным. Пройти самопроверку.

Что читать

  • Dive into Deep Learning (d2l.ai), глава о линейной регрессии: Ровно наш пример с прямой и точками, но с формулами и кодом. Полезно посмотреть, даже если формулы пропускать: видно, что весь спуск занимает десяток строк.
  • Тренажёр «Спуск ощупью» в этом уроке: Проверка урока руками: поставьте скорость шага на максимум и посмотрите, как обучение разлетается за шесть шагов. Ошибки в коде при этом нет.
Все курсы и разделы школы
Фонтум

Открытая школа: университетские программы и практикумы на русском. Целиком, бесплатно, без регистрации.

Курс «Искусственный интеллект»

ВАШ СЛЕДУЮЩИЙ ВОПРОС

Что хотите понять?