3.4 Частные производные и градиент

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

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

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

В этом параграфе мы разберём:

  1. Частные производные. Как математически измерить чувствительность функции к изменению одной переменной, когда все остальные заморожены, и почему это похоже на исследование среза многомерного ландшафта.
  2. Градиент. Что это за вектор, объединяющий все частные производные? Разберём его геометрический смысл, узнаем, почему он всегда указывает «в гору» и как это используется в оптимизации.
  3. Правило цепочки в многомерном пространстве. Как эффективно вычислять производные сложных вложенных функций. Это и есть ключ к пониманию работы нейронных сетей.
  4. Вычисление градиентов на практике. От простых моделей линейной регрессии до алгоритма обратного распространения ошибки в нейронных сетях. Увидим, как градиент течёт назад по слоям сети, настраивая миллионы параметров.

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

Частные производные

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

У вас есть параметры:

  • цена товара ;
  • бюджет на рекламу ;
  • сезонный коэффициент .

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

Ответ даёт частная производная. Это инструмент, который «замораживает» все переменные, кроме одной, и измеряет скорость изменения функции только по выбранному направлению. Дадим её математическое определение.

Формальное определение через предел

Частная производная по функции в точке :

Частная производная по :

Ключевая идея здесь в следующем: в числителе меняется только одна переменная ( или ), остальные заморожены на уровне или . Это прямое обобщение обычной производной на многомерный случай.

Геометрический смысл

Представьте поверхность как горный ландшафт — ну или посмотрите на картинку.

Сечение поверхности

Сечение поверхности плоскостью и . Наклоны касательных к кривым сечения равны и .

  1. Сначала мы делаем некий срез нашего ландшафта вертикальной плоскостью . Эта плоскость параллельна оси .
  2. На срезе у нас образуется кривая . Это траектория, некая «тропа», по которой мы движемся, меняя координату , но не трогая .
  3. Частная производная — это угловой коэффициент (наклон) касательной к этой кривой в точке . Она показывает крутизну подъёма/спуска при движении строго вдоль оси .

Аналогичный процесс происходит, если мы делаем срез плоскостью , чтобы найти частную производную по .

Когда мы замораживаем остальные переменные, то фактически фиксируем сечение многомерного пространства, а анализ частной производной превращается в изучение рельефа вдоль одной тропы — оси или .

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

Многообразие обозначений

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

Для скалярной функции один и тот же объект можно записать несколькими равноправными способами:

Лейбниц: — самая прозрачная запись: видно и функцию, и переменную.

Это наиболее универсальное и распространённое обозначение частной производной в математической литературе. Явно указывает функцию и переменную дифференцирования . Идеально подходит для записи вычислений.

Лагранж: — компактно; индекс прямо указывает переменную.

Удобная запись — особенно когда переменных немного. Часто обозначает саму функцию частной производной (например, ).

Операторная форма: — подчёркивает действие оператора на .

Популярно в теоретической физике и современном математическом анализе.

Оператор : или — удобно, когда аргументы без имён, только позиции.

Акцентирует оператор дифференцирования . Индекс указывает переменную или порядковый номер аргумента ( — первый аргумент).

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

Краткая запись, где индекс обозначает номер аргумента, по которому берётся производная (= производная по первому аргументу). Удобно при работе с функциями вида .

Все эти записи взаимозаменяемы:

Одно из естественных применений частных производных — это линейное приближение дифференцируемой функции в любой небольшой окрестности. Такой подход называется локальной линейной аппроксимацией функции.

Локальная линейная аппроксимация. В окрестности поверхность хорошо приближается касательной плоскостью:

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

Старшие производные

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

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

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

Практика вычисления

К счастью, на практике нам не нужно каждый раз возиться с пределами. Все правила дифференцирования, которые мы изучили для функций одной переменной, остаются в силе.

Основное правило звучит просто:

Дифференцируйте по нужной переменной, а остальные считайте константами!

Для вычисления частной производной по выбранной переменной дифференцируем функцию по этой переменной, рассматривая все остальные переменные как константы. Эта логика напрямую следует из определения через предел, где изменяется только один аргумент.

Давайте посмотрим на примере. Пусть у нас есть функция:

Шаг №1. Найдём частную производную по

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

Шаг №2. Найдём частную производную по

Теперь не трогаем . Здесь — это постоянный коэффициент при , а член не содержит .


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

Ответ (не открывайте сразу; сперва подумайте сами!)
  1. Производная по :

Разложим на сумму двух слагаемых и продифференцируем каждое, считая постоянной величиной:

Первое слагаемое. Константа по здесь — . Остаётся продифференцировать :

Второе слагаемое. Константа по здесь . Дифференцируем :

Соберём результаты вместе, получаем:

  1. Производная по :

Теперь считаем постоянной переменную :

Первое слагаемое. Константа по здесь . Дифференцируем :

Второе слагаемое. Константа по здесь . Дифференцируем :

Итоговая формула:

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

Ответ (не открывайте сразу; сперва подумайте сами!)

Производная по : . Считаем и константами:

Дифференцируем по :

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

  • По ( — константы):

  • По ( — константы):

Все три частные производные получены по тем же принципам: дифференцируем по выбранной переменной, а остальные множители переносим в ответ как константы.


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

При взятии другие переменные не двигаются.

Быстрая проверка на примере :

Неправильно: . Здесь появилось , будто . В частной производной так делать нельзя: зафиксирован. Попробуйте так: мысленно замените чужие переменные константами: . Тогда даёт c  — ровно после возврата .

Наличие частных производных в точке само по себе не гарантирует дифференцируемость — важна согласованность изменения функции по всем направлениям.

Рассмотрим пример практического применения частных производных.

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

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

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

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

3.4

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

Эта величина отвечает на вопрос «на сколько процентов изменится , если сдвинуть на в рассматриваемой точке ». Эластичности удобны для приоритизации факторов и общения с бизнес-заказчиком: проценты ведь понятнее, чем «умножить на 0.003».

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

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

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

  • Большие по модулю производные сигналят о «горячих» направлениях: там шаг стоит уменьшать, полезны нормализация и градиентное клиппирование.
  • Маленькие — о плоских долинах, где движение может быть медленным.

Именно различная скорость по осям мотивирует адаптивные методы, вроде AdaGrad/Adam, которые накапливают квадраты частных и выбирают шаги по-разному для разных координат.

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

Эта идея, например, используется в методе локальных линейных суррогатов (LIME): мы анализируем модель локально — а локально любую функцию можно считать почти линейной. С оговоркой: локальная картина не обязана совпадать с глобальной, особенно в присутствии нелинейностей и взаимодействий.

Метод LIME, в частности, позволяет интерпретировать прогнозы моделей компьютерного зрения — он показывает, на какие части картинки модель ориентировалась, чтобы сделать прогноз:

3.4

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

Градиент и его геометрический смысл

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

Определение. Градиент функции в точке — это вектор

который собирает все частные производные в одну стрелку наклона поверхности.

Теперь можно прочесть прежнюю формулу коротко:

Из неё почти без усилий следуют два ключевых факта.

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

  • Взглянем на линии (или поверхности) уровня (изолинии). Двигаясь по такому уровню, мы не меняем значение функции, значит, направленная производная вдоль касательной равна нулю:

Иначе говоря, градиент перпендикулярен уровням. На контурной карте он всегда протыкает изолинии под прямым углом и направлен в сторону возрастания значений функции.

3.4

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

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

А пока один шаг к алгоритмике. Если градиент — это стрелка в гору, то для минимизации мы идём против неё:

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

Такой взгляд замыкает дугу: частные производные — касательная плоскость — направленные производные — градиент как компас.

Неравенство Коши — Буняковского, или почему градиент даёт наибольший прирост

Мы стоим в точке и выбираем крошечный шаг фиксированной длины . Линейная аппроксимация уже сказала главное:

Вся магия направления спрятана в одном скалярном произведении. Какое направление даст максимальный прирост? Здесь на сцену и выходит неравенство Коши — Буняковского.

Формулировка. Для любых

равенство достигается тогда и только тогда, когда векторы коллинеарны (или один из них нулевой).

Доказательство. Рассмотрим

Дискриминант квадратичного трёхчлена не может быть положительным, откуда .

Геометрия. Если — угол между и , то

Равенство в неравенстве Коши — Буняковского — это случай и он имеет место тогда и только тогда, когда векторы коллинеарны: . Эквивалентно, (если , векторы сонаправлены) или (если , векторы противоположно направлены). Если один из векторов нулевой, равенство тоже выполняется.

Вернёмся к самому градиенту. Положим и , где — это единичное направление шага. Тогда

Максимум достигается, когда сонаправлен , то есть при

Отсюда и следует наш тезис: градиент указывает направление наискорейшего роста, а его норма — величину максимальной направленной производной.
Если , все направления равноправны на первом порядке — линейный член исчезает. Дальше вступают вторые производные (Гессиан): именно они решают, минимум это, максимум или седло.

В комплексном случае берут с сопряжением.

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

Правило цепочки

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

Встаёт естественный вопрос: как протолкнуть локальное изменение на самом верху вниз по этой цепочке? Ответ — правило цепочки.

Если , то

Изменение на выходе — это наклон последнего звена как последнее зависит от предыдущего.

Для интересующихся покажем, как выглядит векторная форма правила цепочки.

Векторная форма

Пусть и . Для композиции правило цепочки удобно писать так:

Здесь — Якобиан .

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

Вычисление градиентов в моделях с несколькими параметрами

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

Это верно не только для нейросетей, но и для привычных моделей. Скажем, линейная или логистическая регрессия: сначала считаем линейную комбинацию , затем прикладываем потерю . Нейросеть — то же самое, только таких шагов (блоков) больше.

3.4

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

Прямой проход (англ. — forward pass) — мы подаём вход , последовательно считаем промежуточные значения и получаем предсказание , затем считаем потерю , где — правильный ответ. Обучение — это минимизация по параметрам.

Ключевой вопрос: как быстро и правильно найти все частные производные для каждого параметра ? Здесь вступает правило цепочки: если выход — композиция нескольких преобразований, то производная раскладывается в произведение локальных наклонов этих звеньев.

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

3.4

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

а затем по правилу цепочки посчитаем и , двигаясь сверху вниз по графу .

3.4

Начнём сверху. Потеря квадратичная,

поэтому её мгновенная чувствительность к выходу модели равна

Весь процесс бэкпропа стартует с разницы предсказания и правды.

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

Дальше вспоминаем, как был получен выход: . Здесь два влияния — через переменные и через . Локальные производные просты:

Умножаем верхнюю чувствительность на эти локальные наклоны и получаем сразу два результата:

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

Ещё один шаг вниз. Узел получен как . Поэтому локальные наклоны

и, следовательно,

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

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

Эта вклейка производной активации — единственное, что отличает нелинейный узел от линейного.

Теперь обобщим сразу на обычный слой (много входов и нейронов). Пусть

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

Градиенты параметров и передача вниз:

Эти формулы — кирпичик слоя. Глубокая сеть — просто цепочка таких кирпичей: умножили на , применили , сделали внешнее произведение для матриц весов, пошли ниже.

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

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

Каков итог? Правило цепочки превратилось в рабочую процедуру — чувствительность сверху умножаем на локальные наклоны и передаём вниз. Именно так градиент «течёт» по модели, позволяя корректировать миллионы параметров простым шагом градиентного спуска.


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

Мы рассмотрели:

  • Локальную чувствительность. Частные производные и касательная плоскость как линейная аппроксимация малых сдвигов.
  • Направленные производные и эластичности. Способность смотреть в любом направлении и сравнивать факторы в процентах.
  • Градиент как компас. Он собирает наклоны, указывает наискорейший рост, его норма — максимальная скорость изменения, а сам градиент перпендикулярен уровням .
  • Поток влияния. Правило цепочки переносит чувствительность через слои. Практическая форма — алгоритм бэкпропа.

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

Об этом мы поговорим в следующем параграфе.



Чтобы добавить в заметки выделенный текст, нажмите Ctrl + E
Предыдущий параграф3.3. Дифференцирование функций одной переменной
Следующий параграф3.5. Градиентные методы