🔴 Сложный ⏱️ 55 минут

Производная по направлению и градиент

📋 Содержание урока

Производная по направлению и градиент 🧭

Все предыдущие уроки о функциях нескольких переменных держали тебя в жёстких рамках координатных осей. Частная производная $\partial f/\partial x$ показывает, как меняется функция, если двигаться строго вдоль оси $x$, ни на градус в сторону, а $\partial f/\partial y$ — то же самое, но вдоль оси $y$. Но в реальности движение почти никогда не происходит строго вдоль осей. Если ты идёшь по холмистой местности, тебя может интересовать скорость подъёма не «строго на север» и не «строго на восток», а именно в том направлении, куда ты действительно шагаешь, — скажем, на северо-восток под углом 37 градусов. Сегодня мы обобщим понятие частной производной на произвольное направление и получим для этого мощный инструмент — градиент.

Давай сразу скажем прямо, без экивоков: этот урок — один из самых важных во всём курсе для тебя как будущего специалиста по машинному обучению. Причина простая: главный алгоритм, на котором держится практически всё современное глубокое обучение, — градиентный спуск — буквально формулируется в двух предложениях, каждое из которых мы разберём сегодня в деталях. Первое: посчитать градиент функции потерь по всем весам модели. Второе: сделать маленький шаг в направлении, противоположном градиенту, потому что именно туда функция потерь убывает быстрее всего. Когда ты видишь, как обучается нейросеть — как строка loss.backward(); optimizer.step() заставляет веса модели плавно сползать к точке, где ошибка минимальна, — за этими двумя строчками кода стоит ровно та математика, которую мы разберём сегодня: градиент как вектор частных производных и доказанный факт, что он указывает направление наискорейшего роста функции.

Представь себя туристом, который заблудился в горах глубокой ночью в густом тумане. Карты нет, фонарика нет — есть только твои ноги, которые чувствуют локальный наклон почвы под собой. Ты не видишь общей картины, не знаешь, где находится ближайшая долина, но в каждой отдельной точке можешь понять, в какую сторону земля уходит вниз круче всего, и сделать маленький шаг именно туда. Повторяя этот процесс — почувствовал наклон, шагнул в сторону самого крутого спуска, снова почувствовал наклон — ты рано или поздно окажешься в какой-нибудь низине. Это и есть градиентный спуск в чистом виде, только вместо горного склона — функция потерь нейросети, а вместо направления «вниз» — направление, противоположное градиенту.

В этом уроке мы пройдём полный путь: сначала научимся вычислять производную по направлению — скорость изменения функции вдоль произвольного единичного вектора. Затем соберём частные производные в единый объект — градиент — и докажем (не поверим на слово, а именно докажем, через неравенство Коши-Буняковского), почему этот вектор указывает направление наискорейшего роста функции, а не какое-то другое. Разберёмся, почему градиент всегда перпендикулярен линиям уровня — геометрический факт, без которого сложно по-настоящему понять поведение функции многих переменных. И завершим урок полноценным разделом про градиентный спуск: выведем формулу шага $w_{new}=w-\eta\nabla L(w)$ с нуля, а не просто продиктуем её, и явно, шаг за шагом, прогоним численный пример спуска по параболоиду, чтобы ты своими глазами увидел, как точка ползёт к минимуму.

История: откуда это взялось?

Как ни удивительно, идея градиентного спуска — метода, который сегодня без преувеличения крутит колёса всей индустрии искусственного интеллекта, — старше самого слова «градиент» в его современном математическом смысле. В 1847 году французский математик Огюстен Луи Коши, тот самый, чьё имя ты уже встречал в связи с рядами и признаками сходимости, представил Парижской академии наук работу под названием «Общий метод решения систем одновременных уравнений». В ней он предложил именно ту идею, которую мы будем разбирать сегодня: если нужно найти точку, минимизирующую сумму квадратов каких-то невязок (по сути, функцию потерь в современных терминах), можно двигаться от произвольной стартовой точки маленькими шагами, каждый раз выбирая направление наискорейшего локального убывания этой функции — то есть направление, противоположное вектору частных производных.

Коши пришёл к этой идее не из абстрактного интереса к оптимизации, а из вполне практической нужды. Середина XIX века была временем бурного расцвета небесной механики: буквально за год до публикации Коши, в 1846 году, французский астроном Урбен Леверье вычислил положение неизвестной планеты (будущего Нептуна) на основе анализа возмущений в движении Урана — вычисления, которые требовали решения огромных систем нелинейных уравнений. Задачи такого рода — уточнение орбит небесных тел по неточным наблюдениям — сводились к минимизации суммарной ошибки между предсказанием модели и реальными данными, и Коши искал систематический численный способ решать такие задачи, не полагаясь на удачную догадку о начальном приближении. Метод, который он предложил, работал: сделать шаг в направлении наискорейшего спуска, оценить новую ошибку, повторить.

Важно понимать, что во времена Коши слово «градиент» в его нынешнем узком математическом смысле — векторе из частных производных — ещё не существовало. Термин пришёл в математику и физику чуть позже, в работах по теории потенциала и электромагнетизму (в частности, у Джеймса Клерка Максвелла, который использовал его для описания скорости изменения физических полей — температуры, давления, потенциала). Само слово происходит от латинского gradiens — «шагающий», от того же корня, что и «градус» (единица «шага» угла) и обычное русское слово «прогрессировать». Метод Коши почти столетие оставался скорее теоретическим курьёзом, чем рабочим инструментом: без вычислительных машин делать даже несколько десятков шагов итеративного спуска вручную для сколько-нибудь сложной задачи было практически невозможно. Настоящий расцвет метода наступил только во второй половине XX века вместе с появлением компьютеров, а затем — в последние полтора десятилетия — вместе со взрывным ростом глубокого обучения, где градиентный спуск (в многочисленных модернизированных вариантах вроде Adam или RMSProp, но с той же самой идеей в основе) стал рабочей лошадкой, обучающей модели с миллиардами параметров. Забавно, что метод, придуманный для уточнения орбит планет, оказался ровно тем инструментом, который два столетия спустя учит нейросети распознавать лица и переводить тексты.

Производная по направлению: обобщаем частную производную

Интуиция: скорость подъёма не только «на север» и «на восток»

Давай разберёмся, что вообще значит «скорость изменения функции в произвольном направлении». Представь карту высот местности — функцию $f(x,y)$, где каждой точке $(x,y)$ соответствует высота над уровнем моря. Частная производная $\partial f/\partial x$ отвечает на вопрос «с какой скоростью меняется высота, если я иду строго на восток», а $\partial f/\partial y$ — «строго на север». Но что, если ты идёшь по тропинке, которая ведёт, скажем, точно на северо-восток, под углом 45 градусов к обеим осям? Ни $\partial f/\partial x$, ни $\partial f/\partial y$ по отдельности не дают тебе прямого ответа — а комбинация обеих величин, как мы сейчас увидим, даёт.

Идея производной по направлению максимально естественна: зафиксируй направление движения в виде единичного вектора $v$ (единичного — то есть длины ровно $1$, потому что нас интересует «чистая» скорость изменения на единицу пройденного пути, а не скорость, искажённая длиной произвольно выбранного вектора), и посмотри, как быстро меняется значение функции, если двигаться из точки вдоль этого вектора с бесконечно малым шагом. Это ровно та же логика, что и в определении обычной производной одной переменной, только шаг делается не по прямой $x$, а по прямой, идущей в направлении $v$ через точку $(x_0,y_0)$.

Определение

Определение (производная по направлению). Пусть функция $f$ определена в окрестности точки $x_0=(x_0,y_0,\dots)$, а $v=(v_1,v_2,\dots)$ — единичный вектор, то есть $|v|=1$. Производной функции $f$ в точке $x_0$ по направлению $v$ называется предел

$$D_v f(x_0) = \lim_{t\to0}\frac{f(x_0+tv)-f(x_0)}{t}$$

Если функция $f$ дифференцируема в точке $x_0$, этот предел вычисляется по простой формуле через градиент и скалярное произведение:

$$D_v f(x_0) = \nabla f(x_0)\cdot v = \frac{\partial f}{\partial x_1}v_1+\frac{\partial f}{\partial x_2}v_2+\dots$$

Частный случай: если $v$ совпадает с ортом координатной оси (например, $v=(1,0)$ в двумерном случае), формула даёт в точности обычную частную производную $\partial f/\partial x$ — то есть частная производная является лишь одним из бесконечного множества возможных направлений, а вовсе не каким-то особым, привилегированным понятием.

Обрати особое внимание на требование $|v|=1$: формула $D_v f=\nabla f\cdot v$ работает именно для единичного вектора. Если у тебя есть направляющий вектор произвольной длины, скажем $w=(3,4)$, его сначала нужно нормировать — разделить на собственную длину, — и только потом подставлять в формулу. Это одна из самых частых технических ошибок на этой теме, и мы вернёмся к ней в разделе про частые ошибки.

Разбор примеров

Пример 1 (лёгкий). Найти производную функции $f(x,y)=x^2+3y$ в точке $(1,1)$ по направлению вектора $v=(1,0)$.

Вектор $v=(1,0)$ уже единичный ($|v|=\sqrt{1^2+0^2}=1$), нормировать не нужно. Находим градиент: $\nabla f=(2x,3)$, в точке $(1,1)$: $\nabla f(1,1)=(2,3)$. По формуле:

$$D_v f = (2,3)\cdot(1,0) = 2\cdot1+3\cdot0 = 2$$

Ответ: $D_v f(1,1)=2$. Логично: направление $(1,0)$ — это в точности направление оси $x$, поэтому производная по направлению совпала с частной производной $\partial f/\partial x=2x=2$.

Пример 2 (средний). Найти производную функции $f(x,y)=xy$ в точке $(2,3)$ по направлению вектора $w=(3,4)$.

Здесь вектор $w=(3,4)$ не единичный: $|w|=\sqrt{3^2+4^2}=\sqrt{25}=5\ne1$. Сначала нормируем:

$$v = \frac{w}{|w|} = \left(\frac35,\frac45\right)$$

Теперь находим градиент: $\nabla f=(y,x)$, в точке $(2,3)$: $\nabla f(2,3)=(3,2)$. Вычисляем производную по направлению уже нормированного вектора:

$$D_v f = (3,2)\cdot\left(\frac35,\frac45\right) = \frac95+\frac85 = \frac{17}{5} = 3{,}4$$

Ответ: $D_v f(2,3)=\dfrac{17}{5}=3{,}4$. Если бы ты забыл нормировать вектор и вслепую подставил $w=(3,4)$ в скалярное произведение, получил бы $(3,2)\cdot(3,4)=9+8=17$ — число ровно в $5$ раз больше правильного (потому что $|w|=5$), и это совершенно другая, неверная величина: она отвечает не на вопрос «какова скорость изменения на единицу пути», а на вопрос про какую-то произвольную, ничем не мотивированную «единицу», связанную с исходной длиной вектора $w$.

Пример 3 (сложный, машинное обучение). Функция потерь простой модели с двумя весами задана как $L(w_1,w_2)=(w_1-2)^2+3(w_2+1)^2$. В точке $w=(0,0)$ оптимизатор с накопленным моментом (velocity) собирается сделать шаг в направлении единичного вектора $v=(0{,}6,\,0{,}8)$ (обрати внимание: $0{,}6^2+0{,}8^2=0{,}36+0{,}64=1$, вектор действительно единичный). Определить, вырастет или уменьшится функция потерь, если сделать маленький шаг именно в этом направлении.

Находим градиент: $\nabla L=(2(w_1-2),\,6(w_2+1))$. В точке $(0,0)$: $\nabla L(0,0)=(2\cdot(-2),\,6\cdot1)=(-4,6)$. Вычисляем производную по направлению:

$$D_v L = (-4,6)\cdot(0{,}6,\,0{,}8) = -2{,}4+4{,}8 = 2{,}4$$

Ответ: $D_v L(0,0)=2{,}4>0$ — производная по направлению положительна, значит вдоль этого конкретного направления функция потерь растёт, а не убывает. Это значит, что накопленный момент в данный момент «тянет» веса в невыгодную сторону, и если бы оптимизатор слепо двигался именно по этому направлению, ошибка модели увеличилась бы. Этот пример — прямая подсказка к тому, что мы разберём чуть позже: существует одно совершенно конкретное направление, вдоль которого функция потерь убывает быстрее всего, и оно однозначно определяется градиентом.

Почему это важно

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

Градиент — вектор всех частных производных

Интуиция: компас, а не просто список чисел

Частные производные $\partial f/\partial x$, $\partial f/\partial y$ и так далее — это просто набор отдельных чисел, каждое из которых живёт само по себе. Градиент — это следующий концептуальный шаг: взять все эти числа и собрать их в единый вектор, который живёт в том же пространстве, что и точка, где мы его вычислили. Это принципиально важное отличие от производной по направлению: производная по направлению — это просто число (скорость изменения вдоль конкретного вектора), а градиент — это вектор, у которого есть и длина, и направление, причём и то, и другое несёт содержательный смысл, который мы раскроем в следующем разделе.

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

Определение

Определение (градиент). Градиентом функции $f(x_1,x_2,\dots,x_n)$, дифференцируемой в точке $x_0$, называется вектор, составленный из всех её частных производных первого порядка, вычисленных в этой точке:

$$\nabla f(x_0) = \left(\frac{\partial f}{\partial x_1},\ \frac{\partial f}{\partial x_2},\ \dots,\ \frac{\partial f}{\partial x_n}\right)_{x_0}$$

Символ $\nabla$ называется «набла» (по форме напоминает перевёрнутую арфу — древнегреческий музыкальный инструмент, от которого и произошло название). Часто вместо $\nabla f$ пишут $\operatorname{grad}f$ — обе записи означают одно и то же.

Градиент — это функция от точки: в каждой точке области определения $f$ у неё, вообще говоря, свой собственный градиент, свой вектор. Если ты уже встречал полный дифференциал из прошлого урока, заметишь прямую связь: полный дифференциал $df=\dfrac{\partial f}{\partial x}dx+\dfrac{\partial f}{\partial y}dy+\dots$ — это в точности скалярное произведение градиента на вектор бесконечно малых приращений $dx=(dx,dy,\dots)$, то есть $df=\nabla f\cdot dx$. Градиент — это тот самый объект, который «упаковывает» всю информацию о линейном приближении функции в компактный вектор.

Разбор примеров

Пример 1 (лёгкий). Найти градиент функции $f(x,y)=3x^2y-y^3$ в точке $(1,2)$.

Находим частные производные:

$$\frac{\partial f}{\partial x}=6xy, \qquad \frac{\partial f}{\partial y}=3x^2-3y^2$$

В точке $(1,2)$: $\dfrac{\partial f}{\partial x}=6\cdot1\cdot2=12$, а $\dfrac{\partial f}{\partial y}=3\cdot1-3\cdot4=3-12=-9$.

Ответ: $\nabla f(1,2)=(12,-9)$.

Пример 2 (средний). Найти градиент функции трёх переменных $f(x,y,z)=\ln(x^2+y^2+z^2)$ в точке $(1,2,2)$.

По правилу дифференцирования сложной функции (логарифм от суммы квадратов):

$$\frac{\partial f}{\partial x}=\frac{2x}{x^2+y^2+z^2}, \qquad \frac{\partial f}{\partial y}=\frac{2y}{x^2+y^2+z^2}, \qquad \frac{\partial f}{\partial z}=\frac{2z}{x^2+y^2+z^2}$$

В точке $(1,2,2)$ сумма квадратов равна $1+4+4=9$. Подставляем:

$$\frac{\partial f}{\partial x}=\frac29, \qquad \frac{\partial f}{\partial y}=\frac49, \qquad \frac{\partial f}{\partial z}=\frac49$$

Ответ: $\nabla f(1,2,2)=\left(\dfrac29,\dfrac49,\dfrac49\right)$.

Пример 3 (сложный, машинное обучение). Функция потерь модели с двумя весами задана как $L(w_1,w_2)=(w_1-3)^2+2(w_2+1)^2$ (парабола вращения, вытянутая вдоль оси $w_2$ — этот пример мы позже используем как основной в разделе про градиентный спуск). Найти общую формулу градиента и его значение в точке $(0,0)$.

Дифференцируем по каждой переменной, считая вторую константой:

$$\frac{\partial L}{\partial w_1}=2(w_1-3), \qquad \frac{\partial L}{\partial w_2}=4(w_2+1)$$

Общая формула градиента: $\nabla L(w_1,w_2)=(2(w_1-3),\,4(w_2+1))$. В точке $(0,0)$:

$$\nabla L(0,0) = (2\cdot(0-3),\ 4\cdot(0+1)) = (-6,4)$$

Ответ: $\nabla L(w_1,w_2)=(2(w_1-3),4(w_2+1))$, а в конкретной точке $(0,0)$ градиент равен $(-6,4)$. Обрати внимание на естественное свойство: градиент равен нулевому вектору $(0,0)$ ровно в точке $(3,-1)$ — а это, как несложно проверить, и есть точка минимума этой функции потерь. Это не совпадение: в точке минимума гладкой функции градиент обязан обращаться в ноль, к этому факту мы вернёмся в следующем уроке про экстремумы функций нескольких переменных.

Почему это важно

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

Почему градиент указывает направление наискорейшего роста: неравенство Коши-Буняковского

Интуиция: скалярное произведение как «доля усилия, потраченная в нужную сторону»

Давай разберёмся, почему из всех бесконечного множества направлений именно направление вдоль градиента даёт максимальную производную по направлению — и сделаем это не на веру, а строгим рассуждением. Ключевая формула у нас уже есть: $D_v f=\nabla f\cdot v$. Вспомни (или воскреси в памяти) геометрический смысл скалярного произведения двух векторов:

$$a\cdot b = |a|\,|b|\cos\theta$$

где $\theta$ — угол между векторами $a$ и $b$. Скалярное произведение — это, по сути, «длина вектора $a$, умноженная на ту часть длины вектора $b$, что смотрит точно в направлении $a$». Если векторы смотрят в одну сторону ($\theta=0$), всё «усилие» вектора $b$ идёт в направлении $a$, и произведение максимально. Если они перпендикулярны ($\theta=90°$), вклад вектора $b$ в направлении $a$ равен нулю. Если смотрят в противоположные стороны ($\theta=180°$), произведение становится максимально отрицательным.

Применим это к $D_v f=\nabla f\cdot v=|\nabla f|\,|v|\cos\theta=|\nabla f|\cos\theta$ (последнее равенство — потому что $v$ единичный, $|v|=1$, а $\theta$ — угол между градиентом и направлением $v$). Косинус принимает значения от $-1$ до $1$, значит $D_v f$ меняется в диапазоне от $-|\nabla f|$ до $|\nabla f|$ при переборе всех возможных направлений $v$. Максимум $D_v f=|\nabla f|$ достигается ровно тогда, когда $\cos\theta=1$, то есть $\theta=0$ — направление $v$ совпадает с направлением градиента.

Теорема

Теорема (о направлении наискорейшего роста). Пусть функция $f$ дифференцируема в точке $x_0$ и $\nabla f(x_0)\ne0$. Тогда среди всех единичных векторов $v$ производная по направлению $D_v f(x_0)$ достигает:

— наибольшего значения $|\nabla f(x_0)|$ при $v=\dfrac{\nabla f(x_0)}{|\nabla f(x_0)|}$ (направление вдоль градиента — направление наискорейшего роста);

— наименьшего значения $-|\nabla f(x_0)|$ при $v=-\dfrac{\nabla f(x_0)}{|\nabla f(x_0)|}$ (направление против градиента, антиградиент, — направление наискорейшего убывания).

Для любого другого единичного вектора $v$ выполняется строгое неравенство $-|\nabla f(x_0)| < D_vf(x_0) < |\nabla f(x_0)|$.

Формально это прямое следствие неравенства Коши-Буняковского для скалярного произведения: для любых векторов $a,b$ выполняется $|a\cdot b|\le|a|\,|b|$, причём равенство достигается тогда и только тогда, когда векторы коллинеарны (параллельны друг другу, с совпадающим или противоположным направлением). Применённое к $D_v f=\nabla f\cdot v$ с единичным $v$, это неравенство даёт ровно $|D_v f|\le|\nabla f|$, с равенством ровно тогда, когда $v$ параллелен $\nabla f$ — либо сонаправлен (плюс-максимум), либо противонаправлен (минус-минимум). Заметь, что это доказательство работает в пространстве абсолютно любой размерности — не только для функций двух переменных, но и для функций от десяти, ста или ста миллионов переменных (то есть для весов реальной нейросети), поскольку неравенство Коши-Буняковского верно для скалярного произведения в пространстве $\mathbb{R}^n$ при любом $n$.

Разбор примеров

Пример 1 (лёгкий). Для функции $f(x,y)=x^2+y^2$ в точке $(3,4)$ найти направление и величину наискорейшего роста, а также направление и величину наискорейшего убывания.

Градиент: $\nabla f=(2x,2y)$, в точке $(3,4)$: $\nabla f(3,4)=(6,8)$. Его модуль:

$$|\nabla f(3,4)| = \sqrt{6^2+8^2} = \sqrt{100} = 10$$

Направление наискорейшего роста — нормированный градиент: $u=\dfrac{(6,8)}{10}=(0{,}6,\,0{,}8)$, максимальная скорость роста равна $10$. Направление наискорейшего убывания — антиградиент: $-u=(-0{,}6,\,-0{,}8)$, минимальная (самая отрицательная) скорость равна $-10$.

Ответ: максимальная скорость роста $10$ в направлении $(0{,}6,\,0{,}8)$, максимальная скорость убывания $-10$ в направлении $(-0{,}6,\,-0{,}8)$.

Пример 2 (средний, проверка теоремы на трёх направлениях). Для функции $f(x,y)=xy$ в точке $(2,3)$ вычислить производную по направлению вдоль трёх векторов: вдоль градиента, перпендикулярно градиенту и вдоль произвольного «среднего» направления — и убедиться, что теорема выполняется.

Градиент: $\nabla f=(y,x)$, в точке $(2,3)$: $\nabla f(2,3)=(3,2)$, $|\nabla f|=\sqrt{9+4}=\sqrt{13}$.

Направление вдоль градиента: $u_1=\dfrac{(3,2)}{\sqrt{13}}$. $D_{u_1}f=(3,2)\cdot\dfrac{(3,2)}{\sqrt{13}}=\dfrac{9+4}{\sqrt{13}}=\dfrac{13}{\sqrt{13}}=\sqrt{13}=|\nabla f|$ — максимум, как и предсказывает теорема.

Направление перпендикулярно градиенту (вектор, перпендикулярный $(3,2)$, — это, например, $(-2,3)$, нормированный: $u_2=\dfrac{(-2,3)}{\sqrt{13}}$): $D_{u_2}f=(3,2)\cdot\dfrac{(-2,3)}{\sqrt{13}}=\dfrac{-6+6}{\sqrt{13}}=0$ — производная по направлению равна нулю, что тоже согласуется с теоремой: перпендикулярное направление даёт ровно середину диапазона между максимумом и минимумом.

Произвольное направление $u_3=(1,0)$ (уже единичный): $D_{u_3}f=(3,2)\cdot(1,0)=3$. Проверяем, что $3$ действительно лежит строго между $-\sqrt{13}\approx-3{,}606$ и $\sqrt{13}\approx3{,}606$ — да, выполняется.

Ответ: все три вычисленных значения ($\sqrt{13}\approx3{,}606$, $0$ и $3$) подтверждают теорему: направление вдоль градиента даёт максимум, перпендикулярное направление — ровно ноль, а произвольное направление — какое-то промежуточное значение, никогда не превышающее модуль градиента.

Пример 3 (сложный, общий случай через угол). Доказать, что для функции $f(x,y)=xy$ в точке $(2,3)$ формула $D_vf=|\nabla f|\cos\theta$ (где $\theta$ — угол между $v$ и $\nabla f$) даёт согласованный результат, если направление $v$ образует с градиентом угол $\theta=60°$.

Как найдено в примере 2, $\nabla f(2,3)=(3,2)$, $|\nabla f|=\sqrt{13}$. По формуле:

$$D_v f = |\nabla f|\cos60° = \sqrt{13}\cdot\frac12 = \frac{\sqrt{13}}{2}\approx1{,}803$$

Чтобы проверить это напрямую, нужно построить конкретный единичный вектор $v$, образующий угол $60°$ именно с вектором $(3,2)$, и вычислить скалярное произведение явно — такая проверка требует поворота вектора градиента на угол $60°$ (матрицей поворота) и вычисления косинуса через арккосинус угла наклона исходного вектора; выполнив эти вычисления, получаешь то же самое значение $D_v f\approx1{,}803$, что подтверждает формулу.

Ответ: $D_v f=\dfrac{\sqrt{13}}{2}\approx1{,}803$ — при увеличении угла между направлением движения и градиентом производная по направлению плавно убывает от максимума $\sqrt{13}$ (при $\theta=0$) до нуля (при $\theta=90°$) и дальше до минимума $-\sqrt{13}$ (при $\theta=180°$), в точности как предсказывает косинус угла.

Почему это важно

Это, пожалуй, центральный теоретический результат всего урока: строгое доказательство того, что градиент — не просто «удобный вектор из частных производных», а объект с чётким, доказанным геометрическим смыслом. Причём заметь: доказательство опирается не на какое-то специфическое свойство функций двух переменных, а на общее неравенство Коши-Буняковского, которое работает в пространстве любой размерности. Именно поэтому одна и та же идея — «двигайся против градиента, чтобы уменьшать функцию как можно быстрее» — работает одинаково хорошо что для игрушечной функции двух переменных на бумаге, что для функции потерь нейросети с миллиардами весов: математика не делает разницы между $n=2$ и $n=10^9$.

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

Интуиция: идти по горизонтали — значит не подниматься и не опускаться

Возьми снова карту высот и нарисуй на ней линию уровня — множество всех точек с одинаковой высотой $f(x,y)=c$ (на топографической карте это в точности линии, которые ты видишь нарисованными: каждая соединяет точки одной и той же высоты). Если ты идёшь строго вдоль такой линии, твоя высота по определению не меняется ни на йоту — значит, производная по направлению вдоль касательной к линии уровня должна быть равна нулю. А мы только что выяснили из неравенства Коши-Буняковского, что производная по направлению равна нулю ровно тогда, когда направление перпендикулярно градиенту. Отсюда прямой вывод: градиент в каждой точке перпендикулярен линии уровня, проходящей через эту точку.

Определение и доказательство

Утверждение (перпендикулярность градиента линии уровня). Пусть кривая $\gamma(t)=(x(t),y(t))$ целиком лежит на линии уровня $f(x,y)=c$ функции $f$, то есть $f(\gamma(t))=c$ для всех $t$. Тогда в каждой точке этой кривой градиент $\nabla f$ перпендикулярен касательному вектору $\gamma'(t)$ к кривой.

Доказательство прямое: продифференцируем тождество $f(\gamma(t))=c$ по параметру $t$, используя цепное правило для функции многих переменных (из урока про частные производные и полный дифференциал):

$$\frac{d}{dt}f(\gamma(t)) = \nabla f(\gamma(t))\cdot\gamma'(t) = \frac{d}{dt}c = 0$$

Скалярное произведение градиента на касательный вектор кривой равно нулю в каждой точке — а это в точности означает, что векторы перпендикулярны (скалярное произведение двух ненулевых векторов равно нулю тогда и только тогда, когда угол между ними составляет $90°$). Что и требовалось доказать.

Разбор примеров

Пример 1 (лёгкий). Линии уровня функции $f(x,y)=x^2+y^2$ — окружности $x^2+y^2=c$. Проверить перпендикулярность градиента касательной к окружности в точке $(3,4)$.

Градиент: $\nabla f=(2x,2y)$, в точке $(3,4)$: $\nabla f(3,4)=(6,8)$ — вектор, направленный от центра окружности к точке $(3,4)$, то есть радиальный. Касательная к окружности в любой точке перпендикулярна радиусу — это базовый факт геометрии окружности, который здесь автоматически подтверждает общий результат: градиент квадратичной функции $x^2+y^2$ — это всегда радиальный вектор, направленный точно по радиусу от центра, а значит перпендикулярный касательной к окружности постоянного уровня.

Ответ: градиент $(6,8)$ перпендикулярен касательной к окружности $x^2+y^2=25$ в точке $(3,4)$, так как направлен строго по радиусу.

Пример 2 (средний). Для функции $f(x,y)=x^2-y^2$ найти направление касательной к линии уровня, проходящей через точку $(2,1)$, и явно проверить перпендикулярность градиенту.

Градиент: $\nabla f=(2x,-2y)$, в точке $(2,1)$: $\nabla f(2,1)=(4,-2)$. Вектор, перпендикулярный $(4,-2)$, находится поворотом на $90°$ по правилу $(a,b)\to(-b,a)$: получаем $(2,4)$ (или, для краткости, пропорциональный ему $(1,2)$).

Проверяем скалярным произведением:

$$(4,-2)\cdot(2,4) = 4\cdot2+(-2)\cdot4 = 8-8 = 0$$

Ответ: скалярное произведение действительно равно нулю — касательное направление к линии уровня $x^2-y^2=3$ в точке $(2,1)$ есть $(2,4)$ (с точностью до направления и нормировки), и оно перпендикулярно градиенту $(4,-2)$, как и утверждает теорема.

Пример 3 (сложный, физическая интерпретация). Стационарное распределение температуры металлической пластины задано функцией $T(x,y)$. Закон Фурье гласит, что вектор плотности теплового потока направлен по антиградиенту температуры: $q=-k\nabla T$ (тепло течёт от горячего к холодному, то есть в направлении наискорейшего убывания температуры). Объяснить, почему это означает, что тепловой поток всегда перпендикулярен изотермам (линиям равной температуры).

Изотермы — это в точности линии уровня функции $T(x,y)$. Мы только что доказали, что градиент $\nabla T$ (а значит, и антиградиент $-\nabla T$, коллинеарный ему, только с противоположным знаком) перпендикулярен линии уровня в каждой её точке. Поскольку вектор теплового потока $q=-k\nabla T$ пропорционален антиградиенту, он автоматически перпендикулярен изотерме, проходящей через эту же точку.

Ответ: тепло никогда не течёт «вдоль» линии постоянной температуры (иначе температура вдоль этой линии менялась бы, что противоречит самому определению изотермы) — оно всегда течёт строго поперёк изотерм, в направлении наибыстрейшего падения температуры. Это прямое физическое проявление той же самой математики, которую мы доказали выше для абстрактной функции $f(x,y)$.

Почему это важно

Перпендикулярность градиента линиям уровня — это не отдельный изолированный факт, а прямое, неизбежное следствие всего, что мы уже доказали: раз вдоль линии уровня функция не меняется, а вдоль градиента меняется быстрее всего, эти два направления просто обязаны быть перпендикулярны друг другу. Этот геометрический факт особенно ценен для интуитивного понимания графиков функций многих переменных: если ты видишь карту линий уровня (например, топографическую карту или график изолиний функции потерь), ты сразу знаешь, куда «смотрит» градиент в любой точке — перпендикулярно ближайшей линии уровня, в сторону более плотно расположенных линий (это и есть направление более крутого подъёма).

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

Интуиция: спуск с горы в тумане, шаг за шагом

Вернёмся к образу из вступления: ты стоишь на склоне горы глубокой ночью в тумане, у тебя нет карты, есть только ощущение локального наклона почвы под ногами. Стратегия очевидна: определи, в какую сторону земля уходит вниз круче всего, сделай маленький шаг именно туда, снова определи направление, снова шагни — и повторяй, пока не окажешься в низине (или хотя бы в её окрестности). Это ровно то, чем занимается градиентный спуск, только «наклон почвы» — это градиент функции потерь $L(w)$ по вектору весов модели $w$, а «шаг вниз» — это шаг в направлении антиградиента $-\nabla L(w)$, того самого направления наискорейшего убывания, которое мы строго доказали выше через неравенство Коши-Буняковского.

Вывод формулы шага

Разберёмся, как именно из общего доказанного факта «антиградиент — направление наискорейшего убывания» получить конкретную практическую формулу обновления весов. Отправная точка — линейное приближение функции $L$ вблизи текущей точки $w$ (это то же самое разложение через полный дифференциал, которое ты видел в прошлом уроке, только записанное в векторной форме):

$$L(w+\Delta w) \approx L(w) + \nabla L(w)\cdot\Delta w$$

Мы хотим выбрать приращение $\Delta w$ фиксированной небольшой длины так, чтобы значение $L(w+\Delta w)$ уменьшилось как можно сильнее. Из приближения видно, что для этого нужно сделать скалярное произведение $\nabla L(w)\cdot\Delta w$ как можно более отрицательным. Мы уже знаем из неравенства Коши-Буняковского (доказанного выше для производной по направлению), что при фиксированной длине $\Delta w$ это скалярное произведение минимально, когда $\Delta w$ направлен точно противоположно $\nabla L(w)$. Если зафиксировать длину шага равной $\eta$ (эта величина называется скоростью обучения, или learning rate), получаем:

$$\Delta w = -\eta\,\frac{\nabla L(w)}{|\nabla L(w)|}$$

Это «чистый» метод наискорейшего спуска: шаг фиксированной длины $\eta$ строго в направлении антиградиента. Но в подавляющем большинстве реализаций машинного обучения используется чуть более простая формула — без нормировки на длину градиента:

$$\boxed{w_{new} = w - \eta\,\nabla L(w)}$$

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

$$L(w-\eta\nabla L(w)) \approx L(w) - \eta\,\nabla L(w)\cdot\nabla L(w) = L(w) - \eta\,|\nabla L(w)|^2$$

Поскольку $|\nabla L(w)|^2\ge0$ всегда (это сумма квадратов, отрицательной быть не может), при любом $\eta>0$ и $\nabla L(w)\ne0$ правая часть строго меньше $L(w)$ — это готовое, прямое доказательство того, что шаг $w-\eta\nabla L(w)$ при достаточно малом $\eta$ гарантированно уменьшает функцию потерь. Но есть и практическое преимущество перед нормированной версией: величина шага автоматически подстраивается под крутизну рельефа. Там, где градиент большой (крутой склон, далеко от минимума), шаг получается большим — можно быстро приближаться к цели. А там, где градиент маленький (пологий рельеф, близко к минимуму), шаг автоматически уменьшается — что даёт плавное, аккуратное «торможение» при подходе к минимуму, вместо того чтобы перепрыгивать через него раз за разом с постоянной длиной шага, как это было бы с нормированной версией.

Формула градиентного спуска. Чтобы минимизировать дифференцируемую функцию потерь $L(w)$, начиная с произвольной точки $w^{(0)}$, повторяют шаг

$$w^{(t+1)} = w^{(t)} - \eta\,\nabla L\!\left(w^{(t)}\right)$$

где $\eta>0$ — скорость обучения (learning rate). При достаточно малом $\eta$ и $\nabla L\ne0$ каждый шаг гарантированно уменьшает значение функции потерь; при неудачно (слишком большом) выбранном $\eta$ метод может колебаться или расходиться, вместо того чтобы сходиться к минимуму.

Разбор примеров

Пример 1 (лёгкий, один шаг вручную). Функция потерь $L(w)=w^2$ (одна переменная), старт $w_0=5$, скорость обучения $\eta=0{,}1$. Найти $w_1$ после одного шага.

Градиент (в одномерном случае — просто производная): $L'(w)=2w$, в точке $w_0=5$: $L'(5)=10$.

$$w_1 = w_0 - \eta\,L'(w_0) = 5 - 0{,}1\cdot10 = 5-1 = 4$$

Ответ: $w_1=4$. Значение функции потерь уменьшилось с $L(5)=25$ до $L(4)=16$ — шаг действительно приблизил нас к минимуму в точке $w=0$.

Пример 2 (средний, несколько шагов на параболоиде). Полностью повторим пример из теории: функция потерь $L(w_1,w_2)=(w_1-3)^2+2(w_2+1)^2$ с явным минимумом в точке $(3,-1)$ (где $L=0$), старт $w^{(0)}=(0,0)$, скорость обучения $\eta=0{,}1$. Найти точки после четырёх шагов градиентного спуска.

Общая формула градиента (уже найдена выше): $\nabla L=(2(w_1-3),\,4(w_2+1))$.

Шаг 1. $\nabla L(0,0)=(2\cdot(-3),\,4\cdot1)=(-6,4)$.

$$w^{(1)} = (0,0) - 0{,}1\cdot(-6,4) = (0+0{,}6,\ 0-0{,}4) = (0{,}6,\,-0{,}4)$$

Шаг 2. $\nabla L(0{,}6,\,-0{,}4)=(2\cdot(0{,}6-3),\,4\cdot(-0{,}4+1))=(2\cdot(-2{,}4),\,4\cdot0{,}6)=(-4{,}8,\,2{,}4)$.

$$w^{(2)} = (0{,}6,\,-0{,}4) - 0{,}1\cdot(-4{,}8,\,2{,}4) = (0{,}6+0{,}48,\ -0{,}4-0{,}24) = (1{,}08,\,-0{,}64)$$

Шаг 3. $\nabla L(1{,}08,\,-0{,}64)=(2\cdot(1{,}08-3),\,4\cdot(-0{,}64+1))=(2\cdot(-1{,}92),\,4\cdot0{,}36)=(-3{,}84,\,1{,}44)$.

$$w^{(3)} = (1{,}08,\,-0{,}64) - 0{,}1\cdot(-3{,}84,\,1{,}44) = (1{,}08+0{,}384,\ -0{,}64-0{,}144) = (1{,}464,\,-0{,}784)$$

Шаг 4. $\nabla L(1{,}464,\,-0{,}784)=(2\cdot(1{,}464-3),\,4\cdot(-0{,}784+1))=(2\cdot(-1{,}536),\,4\cdot0{,}216)=(-3{,}072,\,0{,}864)$.

$$w^{(4)} = (1{,}464,\,-0{,}784) - 0{,}1\cdot(-3{,}072,\,0{,}864) = (1{,}464+0{,}3072,\ -0{,}784-0{,}0864) = (1{,}7712,\,-0{,}8704)$$
Шаг $w_1$ $w_2$ $L(w_1,w_2)$
$0$ $0$ $0$ $9+2=11$
$1$ $0{,}6$ $-0{,}4$ $5{,}76+0{,}72=6{,}48$
$2$ $1{,}08$ $-0{,}64$ $3{,}686+0{,}259=3{,}946$
$3$ $1{,}464$ $-0{,}784$ $2{,}360+0{,}093=2{,}454$
$4$ $1{,}7712$ $-0{,}8704$ $1{,}511+0{,}0336=1{,}545$

Ответ: точка планомерно приближается к минимуму $(3,-1)$, а значение функции потерь монотонно убывает на каждом шаге: $11\to6{,}48\to3{,}946\to2{,}454\to1{,}545$. Обрати внимание на любопытную деталь: координата $w_1$ сходится медленнее координаты $w_2$ относительно своего расстояния до цели — это следствие разной «крутизны» параболоида вдоль разных осей (коэффициент $2$ при $(w_2+1)^2$ делает эту координату более чувствительной к градиенту, чем координату $w_1$ с коэффициентом $1$). Несложно показать, что расстояние $w_1^{(t)}-3$ убывает как геометрическая прогрессия со знаменателем $(1-2\eta)=0{,}8$ за шаг, а $w_2^{(t)}+1$ — со знаменателем $(1-4\eta)=0{,}6$ за шаг, поэтому вторая координата сходится к минимуму заметно быстрее первой.

Пример 3 (сложный, критичность выбора learning rate). Для той же одномерной функции $L(w)=w^2$ определить, при каком значении скорости обучения $\eta$ метод градиентного спуска расходится, если стартовать из любой ненулевой точки.

Один шаг: $w_{new}=w-\eta\cdot2w=(1-2\eta)w$. Последовательность $w^{(t)}=(1-2\eta)^t\,w^{(0)}$ сходится к нулю тогда и только тогда, когда $|1-2\eta|<1$, что равносильно $0<\eta<1$. При $\eta=1$ множитель $(1-2\eta)=-1$, и последовательность бесконечно колеблется между $w^{(0)}$ и $-w^{(0)}$, никогда не сходясь. При $\eta>1$ множитель $|1-2\eta|>1$, и последовательность расходится по модулю, убегая на бесконечность и знакопеременно раскачиваясь.

Проверим численно на конкретном примере с $\eta=0{,}6$ (что больше «безопасного» порога $\eta<1$? нет, $0{,}6<1$, значит для этой функции сойдётся — возьмём более жёсткий пример $L(w)=5w^2$, старт $w_0=1$, $\eta=0{,}3$): производная $L'(w)=10w$, множитель шага $(1-10\eta)=(1-3)=-2$. Последовательность: $w_0=1$, $w_1=1-0{,}3\cdot10\cdot1=1-3=-2$, $w_2=-2-0{,}3\cdot10\cdot(-2)=-2+6=4$, $w_3=4-0{,}3\cdot10\cdot4=4-12=-8$. Последовательность $1,\,-2,\,4,\,-8,\dots$ по модулю растёт вдвое на каждом шаге и меняет знак — расходится.

Ответ: для квадратичной функции $L(w)=aw^2$ градиентный спуск сходится тогда и только тогда, когда $0<\eta<1/a$; при $\eta\ge1/a$ метод либо незатухающе колеблется, либо явно расходится. Это прямое доказательство того, почему на практике выбор скорости обучения — критически важный гиперпараметр: слишком маленький $\eta$ делает обучение медленным, а слишком большой $\eta$ вообще не даёт модели сойтись, и ошибка может начать расти вместо того, чтобы падать.

Почему это важно

Этот раздел — не просто ещё один пример применения градиента, а буквально математическое ядро того, как обучаются практически все современные модели машинного обучения: от простой линейной регрессии до гигантских языковых моделей с миллиардами параметров. Всё, что мы доказали выше — что антиградиент указывает направление наискорейшего убывания, что производная по направлению ограничена модулем градиента, — напрямую конвертируется в одну простую, но чрезвычайно мощную итеративную процедуру. Каждый раз, когда ты видишь падающий график функции потерь при обучении нейросети, за этим графиком стоит ровно тот же самый шаг $w_{new}=w-\eta\nabla L(w)$, который ты только что вывел и явно прогнал руками на параболоиде.

Практика: 30 заданий

Базовые задания (1–10)

Задание 1: Найти градиент функции $f(x,y)=x^3+y^2$ в точке $(2,1)$.


Задание 2: Найти градиент функции $f(x,y,z)=xyz$ в точке $(1,2,3)$.


Задание 3: Вычислить производную функции $f(x,y)=x^2+3y$ в точке $(1,1)$ по направлению единичного вектора $v=(1,0)$.


Задание 4: Нормировать вектор $w=(3,4)$ и найти производную функции $f(x,y)=xy$ в точке $(2,3)$ вдоль этого направления.


Задание 5: Найти модуль градиента (максимальную скорость роста) функции $f(x,y)=x^2+y^2$ в точке $(1,2)$.


Задание 6: Функция потерь $L(w)=w^2$ (одна переменная). Найти градиент (производную) в точке $w=5$.


Задание 7 (машинное обучение): Для функции из задания 6, $L(w)=w^2$, старт $w_0=5$, скорость обучения $\eta=0{,}1$. Найти $w_1$ после одного шага градиентного спуска.


Задание 8: Найти направление наискорейшего убывания функции $f(x,y)=x^2+4y^2$ в точке $(1,1)$ (нормированный вектор).


Задание 9: Функция $f(x,y)=x^2+y^2$ имеет линию уровня, проходящую через точку $(3,4)$. Определить, какая это линия, и объяснить (без подробного вычисления касательной), почему градиент в точке $(3,4)$ ей перпендикулярен.


Задание 10 (машинное обучение): Вычислить градиент функции потерь $L(w_1,w_2)=(w_1-1)^2+(w_2-2)^2$ в точке $(0,0)$.


Средние задания (11–20)

Задание 11: Найти производную функции $f(x,y,z)=x^2+y^2+z^2$ в точке $(1,1,1)$ по направлению вектора $v=(1,1,1)$.


Задание 12: Найти точку, в которой градиент функции $f(x,y)=x^2+y^2-4x-6y$ обращается в нулевой вектор.


Задание 13: Найти производную функции $f(x,y)=e^x\cos y$ в точке $(0,0)$ по направлению вектора, составляющего угол $45°$ с осью $x$.


Задание 14 (машинное обучение): Функция потерь $L(w_1,w_2)=w_1^2+w_2^2$, старт $(4,3)$, скорость обучения $\eta=0{,}25$. Найти точку после одного шага градиентного спуска.


Задание 15: Для функции $f(x,y)=x^2+y^2$ в точке $(3,0)$ сравнить производные по направлению вдоль $v=(1,0)$ (вдоль градиента) и $v=(0,1)$ (перпендикулярно градиенту).


Задание 16: Найти угол между градиентом функции $f(x,y)=xy$ в точке $(1,1)$ и направлением $v=(1,0)$.


Задание 17 (машинное обучение): Функция потерь $L(w)=(w-4)^2$, старт $w_0=0$, скорость обучения $\eta=0{,}5$. Найти $w$ после двух шагов градиентного спуска.


Задание 18: Найти диапазон значений скорости обучения $\eta$, при которых градиентный спуск для функции $L(w)=3w^2$ расходится (не сходится к минимуму при старте из любой ненулевой точки).


Задание 19 (машинное обучение): Для упрощённой функции потерь логистической регрессии $L(w)=\ln(1+e^{-w})$ (одна переменная) найти градиент и его модуль в точке $w=0$.


Задание 20: Найти направление (единичный вектор), вдоль которого функция $f(x,y)=x^2-y^2$ в точке $(2,1)$ не меняется (производная по направлению равна нулю).


Продвинутые задания (21–30)

Задание 21 (машинное обучение): Повторить полный градиентный спуск (3 шага) для $L(w_1,w_2)=(w_1-3)^2+2(w_2+1)^2$, старт $(0,0)$, $\eta=0{,}1$, и указать координаты точки после третьего шага.


Задание 22: Используя линейное приближение Тейлора, доказать, что шаг $w_{new}=w-\eta\nabla L(w)$ при достаточно малом $\eta>0$ и $\nabla L(w)\ne0$ гарантированно уменьшает значение функции потерь.


Задание 23: Найти градиент функции $f(x,y,z)=x^2y+yz^3-3xz$ в точке $(1,-1,2)$ и вычислить его модуль.


Задание 24 (машинное обучение): Функция потерь с перекрёстным членом $L(w_1,w_2)=w_1^2+w_2^2+w_1w_2$, веса $w=(1,-2)$, скорость обучения $\eta=0{,}2$. Найти градиент и точку после одного шага.


Задание 25: Найти максимальную скорость убывания функции $f(x,y)=\ln(x^2+y^2+1)$ в точке $(1,1)$.


Задание 26: Доказать, что для линейной функции $f(x,y)=2x+3y$ градиент постоянен и перпендикулярен линиям уровня (прямым $2x+3y=c$) в каждой точке.


Задание 27 (машинное обучение): Функция потерь $L(w)=5w^2$, старт $w_0=1$, скорость обучения $\eta=0{,}3$. Найти $w_1,w_2,w_3$ и определить, сходится ли метод.


Задание 28: Найти точку минимума функции потерь $L(w_1,w_2)=(w_1-3)^2+2(w_2+1)^2$ напрямую, приравняв градиент к нулю, и сравнить с пределом последовательности градиентного спуска из задания 21.


Задание 29: Используя неравенство Коши-Буняковского, доказать в общем виде, что для любой дифференцируемой функции $f$ и любого единичного вектора $v$ выполняется $|D_v f(x_0)|\le|\nabla f(x_0)|$, с равенством тогда и только тогда, когда $v$ коллинеарен $\nabla f(x_0)$.


Задание 30 (машинное обучение): Функция потерь $L(w_1,w_2)=(w_1-2)^2+(w_2-5)^2$, старт $(0,0)$. Сравнить один шаг обычного градиентного спуска с $\eta=0{,}3$ и один шаг «чистого» метода наискорейшего спуска (нормированный антиградиент) с той же длиной шага $0{,}3$.


Частые ошибки

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

  • Забывают нормировать вектор направления. Формула $D_v f=\nabla f\cdot v$ работает только для единичного вектора $|v|=1$. Если подставить в неё вектор произвольной длины, результат окажется в $|v|$ раз больше правильного значения — это одна из самых распространённых и обидных технических ошибок на этой теме, разобранная явно в примере 2 первого раздела.

  • Путают градиент с направлением убывания функции. Градиент указывает направление наискорейшего роста, а не убывания. Чтобы двигаться в сторону уменьшения функции (например, в градиентном спуске), нужно брать именно антиградиент $-\nabla f$, а не сам градиент. Ошибка в знаке здесь — одна из самых частых причин, по которой у новичков «градиентный спуск» на практике увеличивает, а не уменьшает функцию потерь.

  • Путают тип объекта: считают производную по направлению вектором, а градиент — числом. Это ровно наоборот: производная по направлению $D_v f$ — это всегда одно число (скорость изменения вдоль конкретного направления), а градиент $\nabla f$ — это вектор, у которого есть и направление, и длина.

  • В формуле градиентного спуска путают знак: пишут $w_{new}=w+\eta\nabla L(w)$ вместо $w_{new}=w-\eta\nabla L(w)$. Плюс вместо минуса превращает спуск в подъём — модель будет двигаться в сторону роста ошибки, а не её уменьшения. Полезно каждый раз проговаривать: минус, потому что мы хотим двигаться против градиента, в сторону убывания.

  • Считают, что чем больше скорость обучения, тем быстрее и надёжнее сходится метод. Как показано в примерах про $L(w)=3w^2$ и $L(w)=5w^2$, слишком большая скорость обучения приводит не к ускорению, а к колебаниям или явной расходимости метода. У каждой конкретной функции есть свой порог, выше которого градиентный спуск попросту перестаёт работать.

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

Главное запомнить

  • Производная по направлению $D_v f$ — это скорость изменения функции при движении вдоль произвольного единичного вектора $v$, обобщение частной производной на любое направление, а не только на координатные оси.

  • Для дифференцируемой функции производная по направлению вычисляется как скалярное произведение градиента и направляющего вектора: $D_v f=\nabla f\cdot v$, причём вектор $v$ обязан быть единичным ($|v|=1$).

  • Градиент $\nabla f=\left(\dfrac{\partial f}{\partial x_1},\dots,\dfrac{\partial f}{\partial x_n}\right)$ — это вектор из всех частных производных функции в данной точке.

  • По неравенству Коши-Буняковского $|D_v f|\le|\nabla f|$ с равенством ровно при коллинеарности $v$ и $\nabla f$ — отсюда доказанный факт: градиент указывает направление наискорейшего роста функции, а его модуль равен максимальной скорости этого роста.

  • Антиградиент $-\nabla f$ указывает направление наискорейшего убывания — именно это направление используется в градиентном спуске.

  • Градиент в каждой точке перпендикулярен линии (поверхности) уровня, проходящей через эту точку, — прямое следствие того, что вдоль линии уровня функция не меняется, а перпендикулярно градиенту производная по направлению всегда равна нулю.

  • Формула градиентного спуска $w_{new}=w-\eta\nabla L(w)$ получена из требования максимально уменьшить линейное приближение функции потерь при шаге фиксированной длины — это прямое практическое применение теоремы о направлении наискорейшего убывания.

  • Скорость обучения $\eta$ — критический гиперпараметр: слишком маленькая делает обучение медленным, слишком большая приводит к колебаниям или расходимости метода.

  • Разница между «чистым» методом наискорейшего спуска (нормированный антиградиент, фиксированная длина шага) и практическим градиентным спуском (ненормированный антиградиент) в том, что второй автоматически подстраивает длину шага под крутизну функции потерь, что даёт естественное «торможение» вблизи минимума.

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

Связь с другими темами курса

Этот урок напрямую опирается на частные производные и полный дифференциал из уроков 210 и 211: градиент — это буквально вектор, собранный из частных производных, а связь производной по направлению с полным дифференциалом ($df=\nabla f\cdot dx$) показывает, что градиент — это тот же самый линейный оператор приближения функции, только записанный в компактной, геометрически осмысленной векторной форме. Без уверенного понимания того, как вычисляются частные производные, сегодняшний материал не имеет под собой опоры.

Вперёд этот урок ведёт сразу по двум направлениям. Во-первых, к следующей теме курса — экстремумам функций нескольких переменных: критические точки, где ищутся локальные минимумы и максимумы, определяются именно как точки, в которых градиент обращается в нулевой вектор (условие, которое ты уже видел в примерах этого урока). Во-вторых, к методу множителей Лагранжа для условного экстремума, который целиком построен на той же геометрической идее перпендикулярности градиента линиям уровня — только там дополнительно требуется, чтобы градиент целевой функции был параллелен градиенту функции-ограничения. А ещё градиент, доказанная сегодня теорема о направлении наискорейшего роста и формула градиентного спуска — это фундамент, на котором стоит весь практический курс численной оптимизации в машинном обучении: от простейшей линейной и логистической регрессии до обучения глубоких нейросетей современными оптимизаторами вроде Adam, RMSProp или SGD с моментом — все они лишь модифицируют базовую формулу $w_{new}=w-\eta\nabla L(w)$, выведенную сегодня, добавляя к ней адаптивные скорости обучения или накопление истории градиентов, но никогда не отказываясь от главной идеи: двигаться против градиента.

Интересные факты

  • Метод Коши 1847 года был предложен для решения астрономических задач вычисления орбит — той же самой области, где годом ранее Урбен Леверье математически «нашёл» планету Нептун, ещё до того, как её кто-либо увидел в телескоп. Метод, придуманный для вычислений о движении планет, спустя почти два столетия обучает нейросети распознавать изображения этих же планет.

  • Слово «градиент» происходит от латинского gradiens — «шагающий», от того же корня, что и слово «градус» (единица «шага» угла). Получается, что уже само название вектора буквально намекает на итеративный процесс «шагания» вдоль него — ровно то, чем занимается градиентный спуск.

  • Все современные продвинутые оптимизаторы глубокого обучения — Adam, RMSProp, Adagrad, SGD с моментом — не отказываются от базовой формулы $w_{new}=w-\eta\nabla L(w)$, а лишь модифицируют, как именно выбирается эффективная скорость обучения $\eta$ для каждого веса отдельно (например, Adam накапливает скользящие средние первого и второго моментов градиента, чтобы автоматически подстраивать шаг под каждый параметр индивидуально), но направление шага почти всегда остаётся именно антиградиентом (или его сглаженной версией).

  • Понятие градиента яркости изображения — прямой аналог градиента функции двух переменных, где роль $f(x,y)$ играет яркость пикселя в точке $(x,y)$, — лежит в основе классических алгоритмов компьютерного зрения для детекции границ объектов (например, оператор Собеля) и признаковых дескрипторов вроде HOG (гистограммы ориентированных градиентов), которые ещё до эпохи глубокого обучения были рабочей лошадкой систем распознавания.

Лайфхаки и полезные трюки

  • Прежде чем подставлять направляющий вектор в формулу $D_v f=\nabla f\cdot v$, всегда в первую очередь проверяй его длину: если $|v|\ne1$, сначала раздели вектор на его собственную длину — пропуск этого шага гарантированно даёт результат, отличающийся от правильного в $|v|$ раз.

  • Чтобы найти максимальную скорость роста функции в точке, не нужно перебирать направления или искать угол — просто вычисли модуль градиента $|\nabla f|$, и это готовый ответ.

  • Быстрый способ найти направление вдоль линии уровня (то есть направление, вдоль которого функция не меняется) — поверни вектор градиента на $90°$ по правилу $(a,b)\to(-b,a)$; получившийся вектор автоматически перпендикулярен градиенту.

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

  • Численная проверка градиента (gradient checking) — практический приём для отладки: сравни аналитически вычисленный градиент с приближённым, посчитанным по формуле центральной разности $\dfrac{f(x+h)-f(x-h)}{2h}$ при малом $h$; если значения сильно расходятся, скорее всего в аналитической формуле градиента есть ошибка.

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

Если из всего курса математического анализа тебе придётся выбрать одну-единственную тему, без глубокого понимания которой не получится по-настоящему разобраться в том, как учатся нейросети, — это именно сегодняшняя. Производная по направлению даёт язык, на котором можно говорить о скорости изменения в любую сторону, градиент собирает всю эту информацию в единый вектор, неравенство Коши-Буняковского строго доказывает, что этот вектор указывает направление наискорейшего роста, а антиградиент — направление наискорейшего убывания, и, наконец, формула $w_{new}=w-\eta\nabla L(w)$ превращает всю эту теорию в конкретный, работающий алгоритм, который прямо сейчас, в эту самую секунду, обучает тысячи моделей по всему миру. Освоив этот урок по-настоящему — не заучив формулу, а прочувствовав, откуда она берётся, — ты будешь понимать происходящее внутри optimizer.step() не как магическую строчку кода, а как строгое, доказанное следствие геометрии скалярного произведения.

Понял тему? Закрепи в боте! 🚀

Попрактикуйся на задачах и получи персональные рекомендации от AI

💪 Начать тренировку
💬 Есть вопрос? Спроси бота!