Производная сложной функции: правило цепочки ⛓️
Открой исходники любого фреймворка для нейросетей — PyTorch, JAX, TensorFlow — и попробуй найти там самую главную функцию. Ту, ради которой всё написано. Это будет не свёртка, не attention и не оптимизатор. Это будет backward() — обратный проход, который берёт ошибку на выходе сети и раздаёт её всем миллиардам параметров: «ты виноват вот настолько, а ты — вот настолько». Без неё нейросеть — просто набор чисел, который никогда ничему не научится.
А теперь самое интересное. Внутри backward() нет никакой отдельной «магии глубокого обучения». Там работает одна-единственная школьная формула, которую ты выучишь в этом уроке за сорок минут:
Это цепное правило (chain rule). Правило дифференцирования композиции — функции от функции. В прошлом уроке мы разобрали, как дифференцировать сумму, произведение и частное: там функции складывались и перемножались. Но самая распространённая конструкция в математике и в коде — не сумма и не произведение, а вложение: результат одной функции подаётся на вход другой. sqrt(x*x + 1), loss(model(x), y), normalize(activate(linear(input))) — всё это композиции, и ни одно правило из урока 136 к ним не применимо.
Проблема, которую решает цепное правило, звучит так: если внутренняя функция меняется в 3 раза быстрее аргумента, а внешняя — в 5 раз быстрее своего аргумента, то во сколько раз быстрее меняется вся конструкция? Ответ — в 15 раз, скорости перемножаются. Из этого простого факта вырастает и техника дифференцирования любых выражений, и весь backpropagation, и — что менее приятно — проблема затухающих градиентов, которая на двадцать лет затормозила развитие глубоких сетей.
🎯 Ты узнаешь:
- Что такое композиция функций и как быстро раскладывать выражение на «слои» — внешний, внутренний и все промежуточные
- Откуда берётся формула $(f(g(x)))' = f'(g(x)) \cdot g'(x)$ и почему её «очевидный» школьный вывод содержит дыру, которую честно закрывают хитрым приёмом
- Как записать то же правило в форме Лейбница $\dfrac{dy}{dx} = \dfrac{dy}{du}\cdot\dfrac{du}{dx}$, почему эта запись так удобна и где она обманывает
- Как работать с композицией трёх, четырёх и большего числа функций, не теряя множителей
- Почему цепное правило и backpropagation — буквально одно и то же, и как из перемножения производных вдоль сети получаются затухающие и взрывающиеся градиенты
- Почему ReLU с производной $0$ или $1$ спасает глубокую цепочку, а сигмоида с максимумом производной $0{,}25$ её убивает
История: откуда это взялось?
Цепное правило появилось у Лейбница практически одновременно с самим дифференциальным исчислением. В рукописи от 21 ноября 1675 года он впервые пишет знак интеграла, а в записях 1676 года уже разбирает производную выражения вида $\sqrt{a + bz + cz^2}$ — то есть ровно композицию корня и многочлена. И тут же вводит ту самую форму записи, которой мы пользуемся до сих пор: если ввести промежуточную величину $u = a + bz + cz^2$, то
$$\frac{dy}{dz} = \frac{dy}{du}\cdot\frac{du}{dz}.$$Лейбниц вообще был гением обозначений — куда большим, чем Ньютон. Его дифференциалы $dy$ и $du$ выглядели как настоящие маленькие числа, которые можно сокращать в дроби, и цепное правило в его записи становилось почти тавтологией: «сократи $du$ — и получишь $dy/dz$». Строгости в этом не было ни капли (что и стало мишенью знаменитой критики епископа Беркли, о которой шла речь в уроке 133), зато была невероятная вычислительная сила. Именно поэтому континентальная Европа, писавшая по Лейбницу, к XVIII веку далеко обогнала Англию, упрямо державшуюся ньютоновских точек над буквами.
В печатном виде правило впервые появилось в 1696 году — в «Анализе бесконечно малых для исследования кривых линий» маркиза Лопиталя, первом в истории учебнике по математическому анализу. История там почти детективная: Лопиталь заключил с Иоганном Бернулли контракт, по которому платил ему жалованье за право публиковать его открытия под своим именем. Так что цепное правило в этом учебнике — скорее всего, изложение Бернулли. Термин «Kettenregel» («цепное правило») закрепился в немецких учебниках только в XIX веке, а привычный нам строгий вывод, аккуратно обходящий деление на ноль, предложил Константин Каратеодори уже в XX веке.
Мостик в сегодня получился неожиданно длинным. В 1970 году финский студент Сеппо Линнайнмаа в магистерской диссертации описал алгоритм эффективного вычисления производных сложной функции — то, что сейчас называется обратным режимом автоматического дифференцирования. В 1974 году Пол Вербос предложил применить это к обучению нейросетей, а в 1986 году Румельхарт, Хинтон и Уильямс опубликовали статью «Learning representations by back-propagating errors», после которой метод стал стандартом. Все трое делали одно и то же: применяли цепное правило Лейбница к очень длинной композиции. Разница только в том, что у Лейбница было два звена, а у GPT-класса моделей — сотни.
Композиция функций: вспоминаем и раскладываем
Интуиция: конвейер из двух станков
Композицию мы подробно разбирали в уроке 83, и сейчас нужно вспомнить из неё одну вещь — механику «конвейера». Представь производственную линию: сначала работает станок $g$, потом его деталь передаётся станку $f$. Число $x$ заходит в первый станок, превращается в $g(x)$, это значение заходит во второй станок и превращается в $f(g(x))$.
Порядок здесь критичен. Возведи в квадрат, потом прибавь единицу — получишь $x^2 + 1$. Прибавь единицу, потом возведи в квадрат — получишь $(x+1)^2$. Разные функции, разные графики, разные производные. Композиция некоммутативна, и это первое, что нужно держать в голове.
Функцию $f$ (та, что работает последней) называют внешней, функцию $g$ (та, что работает первой, ближе к $x$) — внутренней. Способ найти внешнюю функцию простой: спроси себя, какое действие ты выполнишь последним, если будешь считать значение на калькуляторе.
Возьми $y = \sqrt{x^2 + 1}$ и посчитай её при $x = 2$. Что ты делаешь? Сначала $2^2 = 4$, потом $4 + 1 = 5$, потом $\sqrt{5}$. Последнее действие — извлечение корня, значит корень и есть внешняя функция, а $x^2+1$ — внутренняя.
Определение: Пусть функция $u = g(x)$ определена на множестве $X$, а функция $y = f(u)$ определена на множестве значений $g$. Тогда функция, которая каждому $x \in X$ ставит в соответствие число $f(g(x))$, называется композицией (или сложной функцией) и обозначается $f \circ g$. Функция $f$ — внешняя, функция $g$ — внутренняя, $u = g(x)$ — промежуточный аргумент.
Слово «сложная» здесь не значит «трудная» — это калька со слова «составная», от «сложена из частей». Функция $\sqrt{x+1}$ ничуть не труднее корня, она просто составная.
Примеры разложения
Пример 1 (простой): $y = (3x+1)^5$.
Считаем при каком-нибудь $x$: сначала $3x+1$, потом пятая степень. Последнее действие — возведение в степень.
- Внутренняя: $u = g(x) = 3x + 1$
- Внешняя: $y = f(u) = u^5$
Пример 2 (средний): $y = \dfrac{1}{(x^2+4)^3}$.
Порядок вычислений: $x^2$, потом $+4$, потом куб, потом «единица делить на». Формально тут три-четыре слоя, но удобнее сразу переписать дробь как степень: $y = (x^2+4)^{-3}$. Тогда слоёв два:
- Внутренняя: $u = x^2 + 4$
- Внешняя: $y = u^{-3}$
Это общий приём: корень и дробь переводи в степень, тогда внешняя функция всегда одна и та же — степенная, а правило её дифференцирования ты уже знаешь из урока 136.
Пример 3 (сложный): $y = \sqrt{1 + \sqrt{x}}$.
Порядок действий: $\sqrt{x}$, потом $+1$, потом ещё один корень. Три слоя:
- Самый внутренний: $v = \sqrt{x}$
- Промежуточный: $u = 1 + v$
- Внешний: $y = \sqrt{u}$
Обрати внимание: слои — это не «скобки в выражении», а именно последовательность действий калькулятора. Иногда полезно буквально расписать её в столбик — так делают, когда строят вычислительный граф в автодифференцировании, и там это называется «SSA-форма» или «форма с промежуточными переменными».
Почему это важно
Умение разложить выражение на слои — это 80% успеха в дифференцировании сложных функций. Ошибка почти всегда происходит не в применении формулы, а раньше: человек неправильно определил, что внутри, а что снаружи. $\sqrt{x} + 1$ и $\sqrt{x+1}$ отличаются одним движением скобки, но первая — это сумма (правило из урока 136), а вторая — композиция (правило из этого урока), и производные у них совершенно разные: $\frac{1}{2\sqrt{x}}$ против $\frac{1}{2\sqrt{x+1}}$.
В программировании тот же навык называется «чтением дерева выражения». Когда PyTorch строит вычислительный граф, он делает ровно то, что ты сейчас делал глазами: разбирает выражение на элементарные операции и запоминает, кто чей вход.
Интуиция цепного правила: во сколько раз быстрее
Три шестерёнки и курс валют
Представь, что три шестерёнки сцеплены в ряд. Первая связана со второй так, что вторая крутится в $3$ раза быстрее. Вторая связана с третьей так, что третья крутится в $5$ раз быстрее второй. Вопрос: во сколько раз третья крутится быстрее первой?
Не в $8$. В $15$. Отношения скоростей перемножаются, а не складываются — это самый обычный здравый смысл, никакой математики.
Второй пример, ещё ближе к производной. Ты меняешь рубли на доллары, доллары — на евро. Курс: за $1$ доллар дают $90$ рублей, за $1$ евро — $1{,}1$ доллара. Сколько рублей в евро? $90 \cdot 1{,}1 = 99$. Коэффициенты пересчёта перемножились. И заметь: «рубли на доллар» умножилось на «доллары на евро», доллары как бы сократились, остались «рубли на евро». Эта сократимость — не случайность, к ней мы вернёмся в форме Лейбница.
Теперь переведём это на язык производных. Производная — это в точности коэффициент пересчёта скоростей: $g'(x_0)$ говорит, во сколько раз быстрее меняется $u = g(x)$ по сравнению с $x$ вблизи точки $x_0$. А $f'(u_0)$ говорит, во сколько раз быстрее меняется $y = f(u)$ по сравнению с $u$ вблизи точки $u_0$.
Если $x$ дёрнулся на маленькое $\Delta x$, то $u$ дёрнется примерно на $g'(x_0)\cdot \Delta x$. А раз $u$ дёрнулся на столько, то $y$ дёрнется примерно на $f'(u_0)\cdot\big(g'(x_0)\cdot\Delta x\big)$. Делим на $\Delta x$ — получаем скорость изменения $y$ по $x$:
$$\frac{\Delta y}{\Delta x} \approx f'(u_0)\cdot g'(x_0).$$Ключевой момент, который стоит осознать: в $f'$ подставляется не $x_0$, а $u_0 = g(x_0)$. Внешняя функция «не знает» ни про какой $x$ — она живёт в мире переменной $u$ и меряет скорость там, куда её привела внутренняя функция. Это источник половины всех ошибок в теме.
Теорема (цепное правило). Пусть функция $g$ дифференцируема в точке $x_0$, а функция $f$ дифференцируема в точке $u_0 = g(x_0)$. Тогда композиция $y = f(g(x))$ дифференцируема в точке $x_0$ и
$$\big(f(g(x))\big)'\Big|_{x=x_0} = f'\big(g(x_0)\big)\cdot g'(x_0).$$Словами: производная сложной функции равна производной внешней функции, вычисленной в точке внутренней, умноженной на производную внутренней функции.
Три примера сразу, чтобы почувствовать
Пример 1 (простой): $y = (3x+1)^5$.
Внешняя $f(u) = u^5$, внутренняя $g(x) = 3x+1$.
Шаг 1. Производная внешней: $f'(u) = 5u^4$. Шаг 2. Подставляем внутреннюю вместо $u$: $f'(g(x)) = 5(3x+1)^4$. Шаг 3. Производная внутренней: $g'(x) = 3$. Шаг 4. Перемножаем: $y' = 5(3x+1)^4\cdot 3 = 15(3x+1)^4$.
Проверка на здравый смысл: раскрывать пятую степень бинома вручную и потом дифференцировать шесть слагаемых — минут десять работы. Цепное правило заняло четыре строчки.
Пример 2 (средний): $y = \sqrt{x^2+9}$.
Переписываем корень как степень: $y = (x^2+9)^{1/2}$.
Шаг 1. $f(u) = u^{1/2}$, $f'(u) = \dfrac{1}{2}u^{-1/2} = \dfrac{1}{2\sqrt{u}}$. Шаг 2. $f'(g(x)) = \dfrac{1}{2\sqrt{x^2+9}}$. Шаг 3. $g'(x) = 2x$. Шаг 4. $y' = \dfrac{1}{2\sqrt{x^2+9}}\cdot 2x = \dfrac{x}{\sqrt{x^2+9}}$.
Посчитаем значение в точке $x = 4$: $y'(4) = \dfrac{4}{\sqrt{25}} = \dfrac{4}{5} = 0{,}8$.
Пример 3 (сложный): $y = \dfrac{1}{(x^2+4)^3}$.
Переписываем: $y = (x^2+4)^{-3}$.
Шаг 1. $f(u) = u^{-3}$, $f'(u) = -3u^{-4}$. Шаг 2. $f'(g(x)) = -3(x^2+4)^{-4}$. Шаг 3. $g'(x) = 2x$. Шаг 4. $y' = -3(x^2+4)^{-4}\cdot 2x = -\dfrac{6x}{(x^2+4)^4}$.
Обрати внимание на знак: при $x > 0$ производная отрицательна — функция убывает, что логично, ведь знаменатель растёт. Такая проверка знаком занимает секунду и ловит половину арифметических промахов.
Почему это важно
Цепное правило — единственное правило дифференцирования, которое не сводится ни к чему другому. Сумму, разность, произведение и частное можно в принципе обойти алгебраическими преобразованиями; композицию — нельзя. Любая сколько-нибудь интересная функция (модель машинного обучения, физическая формула, экономическая модель) — это композиция, и без цепного правила производную от неё не взять в принципе.
И ещё: именно из-за структуры «скорости перемножаются» глубокие нейросети ведут себя так, как ведут. Мы вернёмся к этому в ML-разделе, но запомни формулировку заранее: вдоль цепочки производные умножаются, а умножение множества чисел — операция взрывоопасная.
Строгий вывод: где в нём тонкое место
Наивный вывод и его дыра
Самый напрашивающийся вывод выглядит так. Обозначим $\Delta x$ — приращение аргумента, $\Delta u = g(x_0+\Delta x) - g(x_0)$ — приращение промежуточной переменной, $\Delta y$ — приращение результата. Тогда
$$\frac{\Delta y}{\Delta x} = \frac{\Delta y}{\Delta u}\cdot\frac{\Delta u}{\Delta x},$$и, переходя к пределу при $\Delta x \to 0$, получаем $f'(u_0)\cdot g'(x_0)$. Красиво, коротко и — увы — некорректно.
Дыра ровно в одном месте: $\Delta u$ может равняться нулю. А на ноль делить нельзя, и дробь $\frac{\Delta y}{\Delta u}$ в этот момент просто не существует. Причём это не экзотика.
Возьми $g(x) \equiv 5$ — постоянную функцию. Тогда $\Delta u = 0$ при любом $\Delta x$, дробь $\frac{\Delta y}{\Delta u}$ не имеет смысла ни разу, и весь вывод рассыпается — хотя ответ ($y' = 0$) верен.
Возьми пример потоньше: $g(x) = x^2\sin\frac{1}{x}$ при $x \neq 0$ и $g(0) = 0$. Эта функция дифференцируема в нуле ($g'(0) = 0$), но обращается в ноль бесконечно много раз в любой окрестности нуля. Значит, какое бы маленькое $\Delta x$ мы ни взяли, найдутся ещё меньшие, при которых $\Delta u = 0$. Такие точки нельзя «просто исключить» — они лезут сколь угодно близко.
Это классическая ловушка: рассуждение выглядит железным, а работает не всегда. Давай починим его аккуратно.
Приём Каратеодори: убрать деление
Идея простая до наглости: раз проблема в делении на $\Delta u$, надо построить вывод так, чтобы деления на $\Delta u$ вообще не было.
Введём вспомогательную функцию $\varphi$ переменной $t$, где $t$ — приращение аргумента внешней функции:
$$\varphi(t) = \begin{cases}\dfrac{f(u_0 + t) - f(u_0)}{t}, & t \neq 0,\\[2mm] f'(u_0), & t = 0.\end{cases}$$Что мы сделали? Взяли разностное отношение внешней функции и доопределили его в нуле тем самым числом, к которому оно стремится. По определению производной $\lim\limits_{t\to 0}\varphi(t) = f'(u_0) = \varphi(0)$, а это в точности означает (урок 132), что $\varphi$ непрерывна в точке $t = 0$.
Теперь ключевое тождество. Умножим определение $\varphi$ на $t$:
$$f(u_0+t) - f(u_0) = \varphi(t)\cdot t.$$При $t \neq 0$ это просто перенос знаменателя. А при $t = 0$ левая часть равна нулю и правая равна нулю — тождество верно и здесь. Вот в этом весь фокус: равенство без дроби работает при всех $t$, включая ноль.
Теперь подставим $t = \Delta u = g(x_0+\Delta x) - g(x_0)$:
$$\Delta y = f\big(g(x_0+\Delta x)\big) - f\big(g(x_0)\big) = \varphi(\Delta u)\cdot \Delta u.$$Делим на $\Delta x$ (вот на него делить можно — оно по условию не ноль):
$$\frac{\Delta y}{\Delta x} = \varphi(\Delta u)\cdot\frac{\Delta u}{\Delta x}.$$Осталось перейти к пределу при $\Delta x \to 0$, разбирая два множителя по отдельности.
Второй множитель. $\dfrac{\Delta u}{\Delta x} \to g'(x_0)$ — это прямо определение производной $g$ в точке $x_0$.
Первый множитель. Функция $g$ дифференцируема в $x_0$, значит (теорема из урока 133) она в этой точке непрерывна, значит $\Delta u \to 0$ при $\Delta x \to 0$. А $\varphi$ непрерывна в нуле — мы это специально обеспечили. Композиция даёт $\varphi(\Delta u) \to \varphi(0) = f'(u_0)$.
По теореме о пределе произведения (урок 131):
$$\lim_{\Delta x\to 0}\frac{\Delta y}{\Delta x} = f'(u_0)\cdot g'(x_0) = f'\big(g(x_0)\big)\cdot g'(x_0). \qquad \blacksquare$$Ни одного деления на $\Delta u$ мы не сделали — и случай $\Delta u = 0$ прошёл без единого возражения. Заодно доказана и сама дифференцируемость композиции, а не только формула.
Почему это важно
Три причины держать этот вывод в голове, а не только формулу.
Во-первых, он показывает условия применимости. Цепное правило требует дифференцируемости $g$ в точке $x_0$ и дифференцируемости $f$ в точке $g(x_0)$ — именно в этой, а не в $x_0$. Если внутренняя функция приводит нас в точку, где внешняя не дифференцируема, правило молчит. Например, у $y = \sqrt{x^2}$ внутренняя функция в нуле аккуратна, а внешний корень в нуле производной не имеет — и действительно, $\sqrt{x^2} = |x|$ в нуле не дифференцируема.
Во-вторых, приём «доопределить разностное отношение по непрерывности» — это рабочая техника, а не разовый трюк. В университетском курсе на ней строят и определение дифференцируемости по Каратеодори, и вывод правила дифференцирования обратной функции.
В-третьих, это хорошая прививка от доверия к «очевидным» выкладкам. Наивный вывод выглядит убедительнее строгого — и при этом неверен. В машинном обучении аналогичные «сокращения» встречаются постоянно (например, когда градиент считают через величину, которая обнуляется), и цена ошибки там — не двойка, а полдня отладки.
Форма Лейбница: почему она так удобна
Запись, которая подсказывает ответ
Введём промежуточную переменную $u = g(x)$ и обозначим $y = f(u)$. Тогда цепное правило записывается так:
$$\boxed{\ \frac{dy}{dx} = \frac{dy}{du}\cdot\frac{du}{dx}\ }$$Это та же самая формула, но выглядит она гипнотически: справа $du$ «сокращается», и остаётся ровно левая часть. Мнемоника настолько хороша, что формулу невозможно забыть или перепутать порядок множителей.
И она честно отражает смысл. Вспомни курс валют: $\frac{\text{руб}}{\text{евро}} = \frac{\text{руб}}{\text{долл}}\cdot\frac{\text{долл}}{\text{евро}}$. Производная $\frac{dy}{du}$ имеет размерность «единицы $y$ на единицу $u$», производная $\frac{du}{dx}$ — «единицы $u$ на единицу $x$». Перемножили — единицы $u$ сократились, получились «единицы $y$ на единицу $x$». Проверка размерности здесь работает точно так же, как в физике, и ловит ошибки не хуже.
Пример применения. Найдём производную $y = (x^2+3x)^4$ через форму Лейбница.
Положим $u = x^2+3x$, тогда $y = u^4$.
$$\frac{dy}{du} = 4u^3, \qquad \frac{du}{dx} = 2x+3.$$$$\frac{dy}{dx} = 4u^3(2x+3) = 4(x^2+3x)^3(2x+3).$$
Обязательный последний шаг: вернуться от $u$ к $x$. Ответ, в котором осталась буква $u$, — не ответ, а полуфабрикат.
Где эта запись обманывает
Соблазн велик, поэтому сразу поставим ограничитель: $\frac{dy}{dx}$ — это не дробь. Это единый символ, обозначающий предел отношения приращений. То, что «сокращение $du$» даёт верный результат, — не доказательство, а совпадение формы записи с содержанием теоремы (которую мы честно доказали выше, и там никакого сокращения не было).
Почему это важно практически? Потому что для функций нескольких переменных аналогичное «сокращение» ломается. Многомерное цепное правило выглядит так:
$$\frac{\partial L}{\partial x} = \sum_k \frac{\partial L}{\partial u_k}\cdot\frac{\partial u_k}{\partial x},$$и здесь появляется сумма по всем путям, по которым $x$ влияет на $L$. Если бы $\partial u_k$ действительно сокращались, суммы бы не было. Именно эта сумма — причина, по которой в backpropagation градиенты по разветвлениям складываются, а не просто перемножаются, и с ней ты встретишься в уроках 210–212.
В университетском курсе (урок 187) для $dy$ и $dx$ вводят строгий смысл — дифференциалы, и тогда $\frac{dy}{dx}$ действительно становится отношением двух конкретных величин. Но это отдельная конструкция, а не право сокращать что угодно.
Почему это важно
Форма Лейбница — рабочий язык физики, инженерии и машинного обучения. Когда физик пишет $\frac{dE}{dt} = \frac{dE}{dv}\cdot\frac{dv}{dt}$, он мгновенно видит, через какую промежуточную величину идёт влияние. Когда в статье по ML пишут $\frac{\partial L}{\partial W_1} = \frac{\partial L}{\partial a_3}\frac{\partial a_3}{\partial a_2}\frac{\partial a_2}{\partial a_1}\frac{\partial a_1}{\partial W_1}$ — это просто цепное правило, растянутое на четыре звена, и читать такую строку нужно уметь с листа.
Обобщённое степенное правило: рабочая лошадка
Отдельно выпишем самый частый в жизни случай — когда внешняя функция степенная. Из цепного правила и правила $(u^n)' = nu^{n-1}$ (урок 136) сразу получаем:
Обобщённое степенное правило: для любой дифференцируемой функции $u = u(x)$ и любого показателя $n$
$$\big(u^n\big)' = n\,u^{\,n-1}\cdot u'.$$
Три частных случая, которые стоит выучить как отдельные формулы, потому что они встречаются каждый день:
- Корень: $\big(\sqrt{u}\big)' = \dfrac{u'}{2\sqrt{u}}$
- Обратная величина: $\left(\dfrac{1}{u}\right)' = -\dfrac{u'}{u^2}$
- Линейная подстановка: $\big(f(ax+b)\big)' = a\cdot f'(ax+b)$
Последняя — не столько формула, сколько экономия времени: если внутри линейная функция, весь эффект цепного правила сводится к домножению на её угловой коэффициент. $\big((5x-2)^{10}\big)' = 50(5x-2)^9$ пишется сразу, без промежуточных выкладок.
И приятный бонус: правило частного из урока 136 теперь можно не запоминать. Действительно, $\dfrac{f}{g} = f\cdot g^{-1}$, и по правилу произведения плюс цепному правилу:
$$\left(\frac{f}{g}\right)' = f'g^{-1} + f\cdot(-1)g^{-2}g' = \frac{f'}{g} - \frac{fg'}{g^2} = \frac{f'g - fg'}{g^2}.$$Ровно то самое правило частного. Цепное правило оказалось более фундаментальным.
Почему это важно
В подавляющем большинстве прикладных выражений внешняя функция — степенная. Норма вектора — это корень из суммы квадратов. Функция потерь MSE — это квадрат разности. Регуляризатор — сумма квадратов или модулей. Знаменатель в softmax, коэффициент в физической формуле, дисконт в финансовой модели — везде степени. Обобщённое степенное правило покрывает процентов семьдесят всех производных, которые тебе реально понадобятся.
Композиция трёх и более функций
Матрёшка длиннее двух слоёв
Что делать, если функция вложена трижды? Ровно то же самое, только множителей будет три. Формально: если $y = f(g(h(x)))$, то, применив цепное правило дважды (сначала к внешней паре, потом к внутренней), получаем
$$y' = f'\big(g(h(x))\big)\cdot g'\big(h(x)\big)\cdot h'(x),$$а в форме Лейбница, введя $v = h(x)$ и $u = g(v)$:
$$\frac{dy}{dx} = \frac{dy}{du}\cdot\frac{du}{dv}\cdot\frac{dv}{dx}.$$Правило легко обобщается на любое число звеньев: производная композиции — произведение производных всех звеньев, каждая вычислена в своей точке. Это и есть та самая «цепь», от которой название.
Алгоритм «снаружи внутрь»:
- Выпиши слои от внешнего к внутреннему, пронумеруй.
- Продифференцируй внешний слой, аргумент оставь как есть (не разворачивая).
- Допиши множителем производную следующего слоя, снова оставляя его аргумент как есть.
- Повторяй, пока не дойдёшь до чистого $x$, производная которого равна $1$ и на этом всё заканчивается.
- Упрости.
Главное дисциплинарное правило: не упрощай, пока не дошёл до конца. Соблазн «свернуть» промежуточный результат приводит к потерянным множителям — это ошибка номер один во всей теме.
Три примера
Пример 1 (простой): $y = \sqrt{1+\sqrt{x}}$.
Слои: внешний $\sqrt{\ \cdot\ }$, средний $1 + \cdot$, внутренний $\sqrt{x}$.
$$y' = \underbrace{\frac{1}{2\sqrt{1+\sqrt{x}}}}_{\text{внешний}}\cdot\underbrace{1}_{\text{средний}}\cdot\underbrace{\frac{1}{2\sqrt{x}}}_{\text{внутренний}} = \frac{1}{4\sqrt{x}\cdot\sqrt{1+\sqrt{x}}}.$$Проверим в точке $x = 4$: $\sqrt{x} = 2$, $1+\sqrt{x} = 3$, значит $y'(4) = \dfrac{1}{4\cdot 2\cdot\sqrt{3}} = \dfrac{1}{8\sqrt3} = \dfrac{\sqrt3}{24} \approx 0{,}0722$.
Пример 2 (средний): $y = \big((3x-1)^2+4\big)^5$.
Слои: внешний $u^5$, средний $v^2 + 4$, внутренний $3x-1$.
$$y' = 5\big((3x-1)^2+4\big)^4\cdot 2(3x-1)\cdot 3 = 30(3x-1)\big((3x-1)^2+4\big)^4.$$Значение в $x = 1$: внутри $(3-1)^2+4 = 8$, значит $y'(1) = 30\cdot 2\cdot 8^4 = 60\cdot 4096 = 245\,760$.
Пример 3 (сложный): $y = \big(\sqrt{x^2+1}+1\big)^4$.
Слои: внешний $u^4$, средний $\sqrt{v}+1$, внутренний $x^2+1$.
$$y' = 4\big(\sqrt{x^2+1}+1\big)^3\cdot\frac{1}{2\sqrt{x^2+1}}\cdot 2x = \frac{4x\big(\sqrt{x^2+1}+1\big)^3}{\sqrt{x^2+1}}.$$Заметь, как двойки сократились: $\frac{1}{2}\cdot 2x = x$. Полезно доводить до конца именно так — сначала выписать всю цепочку целиком, потом причёсывать.
Почему это важно
Нейросеть из $L$ слоёв — это композиция из $L$ (а с учётом активаций из $2L$) функций. Производная функции потерь по весам первого слоя — произведение примерно $2L$ множителей. Когда $L = 50$, произведение из сотни чисел ведёт себя очень недружелюбно, и это не абстрактная неприятность, а главная инженерная проблема глубокого обучения. Сейчас разберём её подробно.
ML-контекст: цепное правило — это и есть backpropagation
Сеть как одна длинная композиция
Возьмём простейшую сеть без смещений: вход $x$, три слоя с весами $w_1, w_2, w_3$ и активацией $\sigma$ после каждого линейного преобразования. Прямой проход:
$$z_1 = w_1 x,\quad a_1 = \sigma(z_1),\quad z_2 = w_2 a_1,\quad a_2 = \sigma(z_2),\quad z_3 = w_3 a_2,\quad \hat y = z_3,$$а на конце — функция потерь, например $L = (\hat y - y)^2$.
Разверни это в одну формулу — получишь
$$L = \Big(w_3\,\sigma\big(w_2\,\sigma(w_1 x)\big) - y\Big)^2.$$Одна композиция из семи слоёв. Больше в сети ничего нет. Обучение — это подбор $w_1, w_2, w_3$ так, чтобы $L$ стало маленьким, а градиентный спуск требует знать $\frac{\partial L}{\partial w_k}$. И берутся эти производные ровно цепным правилом:
$$\frac{\partial L}{\partial w_1} = \underbrace{\frac{\partial L}{\partial \hat y}}_{2(\hat y - y)}\cdot\underbrace{\frac{\partial \hat y}{\partial a_2}}_{w_3}\cdot\underbrace{\frac{\partial a_2}{\partial z_2}}_{\sigma'(z_2)}\cdot\underbrace{\frac{\partial z_2}{\partial a_1}}_{w_2}\cdot\underbrace{\frac{\partial a_1}{\partial z_1}}_{\sigma'(z_1)}\cdot\underbrace{\frac{\partial z_1}{\partial w_1}}_{x}.$$Вот и весь backpropagation. Шесть множителей, каждый — производная одного звена, вычисленная в своей точке. Никакой отдельной теории «обратного распространения ошибки» не существует: есть цепное правило и есть умный порядок вычислений.
Умный порядок — это вторая половина идеи. Множители перемножают справа налево, то есть от выхода к входу. Почему? Потому что при таком порядке накопленное произведение $\frac{\partial L}{\partial z_k}$ (его называют «дельтой» слоя) можно один раз посчитать и переиспользовать для всех весов этого слоя. Если бы шли слева направо, каждый вес требовал бы собственного прохода. Отсюда знаменитое свойство: стоимость вычисления градиента по миллиарду параметров — примерно два прямых прохода, а не миллиард. Именно это в 1970 году описал Линнайнмаа, и именно это делает обучение больших моделей возможным вообще.
Численный разбор: считаем градиент руками
Пусть $x = 1$, $w_1 = 2$, $w_2 = 1$, $w_3 = 3$, а вместо сигмоиды возьмём ReLU: $\sigma(z) = \max(0, z)$, производная равна $1$ при $z > 0$ и $0$ при $z < 0$.
Прямой проход.
- $z_1 = 2\cdot 1 = 2$, $a_1 = \max(0,2) = 2$
- $z_2 = 1\cdot 2 = 2$, $a_2 = \max(0,2) = 2$
- $\hat y = 3\cdot 2 = 6$
Обратный проход (считаем $\frac{\partial \hat y}{\partial x}$, то есть чувствительность выхода ко входу):
$$\frac{\partial \hat y}{\partial x} = w_3\cdot\sigma'(z_2)\cdot w_2\cdot\sigma'(z_1)\cdot w_1 = 3\cdot 1\cdot 1\cdot 1\cdot 2 = 6.$$Теперь поменяй $w_2$ на $-1$. Тогда $z_2 = -2$, $a_2 = 0$, $\hat y = 0$, а $\sigma'(z_2) = 0$, и
$$\frac{\partial \hat y}{\partial x} = 3\cdot 0\cdot(-1)\cdot 1\cdot 2 = 0.$$Один ноль в цепочке обнулил всё. Это буквальный механизм «мёртвого нейрона» (dead ReLU): нейрон ушёл в отрицательную зону, его производная стала нулём, и градиент перестал доходить до всего, что стоит перед ним. Никакой мистики — просто умножение на ноль.
Затухающие градиенты: геометрическая прогрессия убивает
Теперь главное. Градиент по весам первого слоя — произведение примерно $2L$ множителей, где $L$ — число слоёв. Что происходит с произведением, когда множителей много?
Вспомни урок 128: если каждый множитель примерно равен $q$, то произведение $L$ множителей — это $q^{L}$, геометрическая прогрессия. А из уроков 130–131 мы знаем: при $|q| < 1$ величина $q^L$ стремится к нулю, причём стремительно.
Классическая активация — сигмоида $\sigma(z) = \dfrac{1}{1+e^{-z}}$. Её производная равна $\sigma'(z) = \sigma(z)\big(1-\sigma(z)\big)$ — производную $e^x$ мы аккуратно выведем в следующем уроке, здесь берём этот факт готовым. Обозначим $s = \sigma(z)$; тогда $\sigma' = s(1-s)$ — это парабола ветвями вниз с корнями $0$ и $1$, её максимум достигается при $s = 0{,}5$ и равен
$$0{,}5\cdot(1-0{,}5) = 0{,}25.$$Производная сигмоиды никогда не превышает $0{,}25$. И это в самой лучшей точке; при $|z| > 3$ она уже меньше $0{,}05$.
Посчитаем. Пусть веса аккуратно нормированы, $|w_k|\approx 1$, а активации работают в лучшем режиме, $\sigma' = 0{,}25$. Тогда градиент до первого слоя доходит с коэффициентом
- $10$ слоёв: $0{,}25^{10} = \dfrac{1}{4^{10}} = \dfrac{1}{1\,048\,576}\approx 9{,}54\cdot 10^{-7}$
- $20$ слоёв: $0{,}25^{20}\approx 9{,}1\cdot 10^{-13}$
- $50$ слоёв: $0{,}25^{50}\approx 7{,}9\cdot 10^{-31}$
В формате float32 наименьшее нормальное положительное число — около $1{,}2\cdot 10^{-38}$. То есть уже на нескольких десятках сигмоидных слоёв градиент физически проваливается в машинный ноль. И это в самом благоприятном сценарии: реальные $\sigma'$ обычно куда меньше $0{,}25$.
Что это значит на практике: первые слои сети не обучаются. Они получают градиент, который в миллион раз меньше, чем последние слои, и при любом разумном learning rate их веса просто не двигаются. Ровно поэтому до середины 2000-х никто не мог обучить сеть глубже нескольких слоёв — не хватало не мощностей, а понимания, что виновато перемножение производных.
Взрывающиеся градиенты: та же прогрессия, но $q > 1$
Обратная ситуация. Если типичный множитель $|w_k\cdot\sigma'(z_k)|$ оказался равен $1{,}5$, то за $50$ слоёв произведение вырастет до
$$1{,}5^{50}\approx 6{,}4\cdot 10^{8},$$а за $100$ слоёв — до $4\cdot 10^{17}$. Градиент огромен, шаг градиентного спуска выкидывает веса в бесконечность, и в логах появляется nan. Это особенно любят рекуррентные сети (урок 339), где один и тот же вес применяется на каждом шаге последовательности: там цепочка длиной в сотни звеньев с одинаковым множителем — идеальная геометрическая прогрессия.
Стандартное лечение — gradient clipping: если норма градиента превысила порог, её принудительно масштабируют вниз. Костыль, но работающий.
Итого: $q < 1$ — градиент затухает, $q > 1$ — взрывается, и попасть ровно в $q = 1$ на сотне слоёв случайно невозможно. Это и есть фундаментальная проблема глубины, и она целиком следует из того, что цепное правило перемножает, а не складывает.
Почему ReLU спасает
Теперь понятно, почему замена сигмоиды на $\text{ReLU}(z) = \max(0,z)$ произвела революцию. Её производная равна ровно $1$ при $z > 0$ и ровно $0$ при $z < 0$ (в самом нуле производной нет — об этом был урок 133, а фреймворки по соглашению возвращают $0$).
Единица — нейтральный элемент умножения. Множитель $1$ в цепочке ничего не портит: сколько бы слоёв ни было, $1^{100} = 1$. Градиент проходит через активную часть сети без затухания, и остаётся только влияние весов, которое можно контролировать инициализацией (урок 331) и нормализацией (урок 332).
Плата — те самые мёртвые нейроны: там, где $z < 0$, множитель равен нулю и градиент обрывается насмерть. Отсюда семейство заплаток: Leaky ReLU (производная $0{,}01$ вместо $0$), ELU, GELU, Swish — все они придуманы ровно для того, чтобы держать множитель в цепочке подальше и от нуля, и от чисел, сильно отличных от единицы.
И тот же мотив в архитектурах. Skip-connection из ResNet (урок 337) — это блок $y = x + F(x)$. Его производная равна
$$\frac{dy}{dx} = 1 + F'(x),$$и единица здесь появляется не случайно, а специально: она создаёт «магистраль», вдоль которой градиент идёт с множителем $1$, минуя все затухающие ветки. Одна школьная формула — и сети стали глубиной в сотни слоёв.
Почему это важно
Если ты понял механику «производные вдоль цепочки перемножаются», у тебя появляется рабочая диагностика. Обучение стоит на месте, а градиенты первых слоёв на порядки меньше последних — это затухание, лечится активацией, нормализацией, skip-connection. В логах nan после нескольких шагов — это взрыв, лечится клиппингом и уменьшением learning rate. Нейроны выдают строго ноль на всех примерах — мёртвый ReLU, лечится инициализацией и Leaky-вариантом.
Все три диагноза читаются прямо из формулы $(f(g(x)))' = f'(g(x))\cdot g'(x)$, растянутой на сто звеньев.
Практика: 30 заданий
Базовые (задания 1-10)
Задание 1: Найди производную функции $y = (3x+1)^5$.
Задание 2: Найди производную функции $y = (2-7x)^4$.
Задание 3: Найди производную функции $y = (x^2+1)^3$.
Задание 4: Найди производную функции $y = \sqrt{x^2+9}$ и вычисли $y'(4)$.
Задание 5: Найди производную функции $y = \dfrac{1}{(x+5)^2}$.
Задание 6: Найди $y'(1)$ для функции $y = (5x-2)^{10}$.
Задание 7: Найди производную $y = \sqrt{4x-3}$ и вычисли $y'(3)$.
Задание 8: Найди производную функции $y = (x^3-2x)^4$.
Задание 9: Найди производную функции $y = \dfrac{1}{(x^2+4)^3}$.
Задание 10: Функция потерь на одном объекте равна $L(w) = (w-3)^2$. Найди $L'(w)$ и значение $L'(5)$. Куда сдвинет вес градиентный спуск из точки $w=5$?
Средние (задания 11-20)
Задание 11: Известно, что $y$ зависит от $u$, а $u$ — от $x$. В точке $x_0 = 2$ выполнено $u(2) = 5$, $\dfrac{du}{dx}\Big|_{x=2} = -4$, а $\dfrac{dy}{du}\Big|_{u=5} = 3$. Найди $\dfrac{dy}{dx}$ в точке $x_0 = 2$ и объясни результат словами.
Задание 12: Найди $y'(2)$ для функции $y = (x^2-4x+7)^6$.
Задание 13: Найди производную $y = \sqrt{1-x^2}$ и вычисли $y'(0{,}6)$.
Задание 14: Найди производную функции $y = x\sqrt{x+1}$.
Задание 15: Найди производную функции $y = \left(\dfrac{x+1}{x-1}\right)^3$.
Задание 16: Найди производную функции $y = \dfrac{1}{\sqrt{2x+5}}$ и вычисли $y'(2)$.
Задание 17: Найди производную функции $y = \sqrt{1+\sqrt{x}}$ и вычисли $y'(4)$.
Задание 18: Найди все точки, в которых производная функции $y = (x^2+3x)^5$ обращается в ноль.
Задание 19: Напиши уравнение касательной к графику функции $y = \sqrt{3x+4}$ в точке с абсциссой $x_0 = 4$.
Задание 20: Расстояние от дрона до базовой станции меняется по закону $s(t) = \sqrt{t^2+16}$ (километры, $t$ — часы). Найди скорость удаления в момент $t=3$.
Продвинутые (задания 21-30)
Задание 21: Найди производную функции $y = (2x+1)^3(x^2+1)^4$ и представь ответ в виде произведения.
Задание 22: Найди производную функции $y = \big(\sqrt{x^2+1}+1\big)^4$.
Задание 23: Найди производную функции $y = \big((3x-1)^2+4\big)^5$ и вычисли $y'(1)$.
Задание 24: Пусть $g(x) = x^2+1$ и $f(u) = u^3-2u$. Найди $(f\circ g)'(1)$ и $(g\circ f)'(1)$. Сравни результаты.
Задание 25: В сети из $10$ слоёв каждый слой вносит в цепочку производных множитель $q$. Найди коэффициент, с которым градиент доходит до первого слоя, при $q = 0{,}25$ (сигмоида в лучшей точке) и при $q = 1{,}5$. Во сколько раз результаты отличаются?
Задание 26: Сеть устроена так: $\hat y = w_3\,\text{ReLU}\big(w_2\,\text{ReLU}(w_1 x)\big)$, где $x = 1$, $w_1 = 2$, $w_3 = 3$. Найди $\dfrac{\partial \hat y}{\partial x}$ при (а) $w_2 = 1$ и (б) $w_2 = -1$.
Задание 27: Найди производную функции $y = \sqrt{x^2+1} - x$ и докажи, что она отрицательна при всех $x$.
Задание 28: Докажи с помощью цепного правила, что $\left(\dfrac{1}{g(x)}\right)' = -\dfrac{g'(x)}{g^2(x)}$ для любой дифференцируемой $g$ с $g(x)\neq 0$.
Задание 29: Ошибка модели на валидации приближённо описывается формулой $E(n) = \dfrac{50}{\sqrt{n+1}}$, где $n$ — число размеченных примеров. Найди $E'(n)$ и вычисли $E'(99)$. Что означает полученное число?
Задание 30: Известно, что $y = f(g(h(x)))$, причём $h(1) = 2$, $h'(1) = 3$, $g(2) = 5$, $g'(2) = -1$, $f'(5) = 4$. Найди $y'(1)$. Затем определи, как изменится ответ, если $g'(2)$ станет равно $0$.
Частые ошибки
❌ Ошибка 1: забыли множитель — производную внутренней функции
Неправильно: $\big((2x+1)^3\big)' = 3(2x+1)^2$.
Правильно: $\big((2x+1)^3\big)' = 3(2x+1)^2\cdot 2 = 6(2x+1)^2$.
💡 Почему важно: это ошибка номер один во всей теме, и она особенно коварна тем, что ответ выглядит правдоподобно. Проверка занимает секунду: раскрой скобки в простом случае. $(2x+1)^2 = 4x^2+4x+1$, производная $8x+4 = 4(2x+1)$. А «забывчивая» формула дала бы $2(2x+1) = 4x+2$ — вдвое меньше. Именно этот пропущенный множитель в коде выглядит как градиент, отличающийся от численного ровно в $a$ раз, и gradient check его немедленно ловит.
❌ Ошибка 2: подставили $x$ вместо $g(x)$ в производную внешней функции
Неправильно: для $y = \sqrt{x^2+9}$ написать $y' = \dfrac{1}{2\sqrt{x}}\cdot 2x$.
Правильно: $y' = \dfrac{1}{2\sqrt{x^2+9}}\cdot 2x = \dfrac{x}{\sqrt{x^2+9}}$.
💡 Почему важно: внешняя функция живёт в мире переменной $u$, и её производная измеряется в точке $u_0 = g(x_0)$, а не в $x_0$. В формуле это записано явно: $f'(g(x))$, а не $f'(x)$. В backpropagation это соответствует тому, что производная активации считается по значению предактивации $z_k$, полученному на прямом проходе, — именно поэтому фреймворки хранят промежуточные значения между forward и backward.
❌ Ошибка 3: перепутали, что внутри, а что снаружи
Неправильно: считать, что $\sqrt{x}+1$ и $\sqrt{x+1}$ дифференцируются одинаково.
Правильно: $\big(\sqrt{x}+1\big)' = \dfrac{1}{2\sqrt{x}}$ (это сумма, правило из урока 136), а $\big(\sqrt{x+1}\big)' = \dfrac{1}{2\sqrt{x+1}}$ (это композиция).
💡 Почему важно: структура выражения определяет, какое правило применять, и определять её нужно до дифференцирования. Надёжный способ — спросить себя: «какое действие я выполню последним, считая на калькуляторе?». Последнее действие и задаёт внешнюю функцию, а значит и правило.
❌ Ошибка 4: применили цепное правило там, где произведение (или наоборот)
Неправильно: для $y = x\sqrt{x+1}$ написать $y' = \dfrac{1}{2\sqrt{x+1}}\cdot 1$.
Правильно: здесь два множителя, работает правило произведения: $y' = \sqrt{x+1} + \dfrac{x}{2\sqrt{x+1}} = \dfrac{3x+2}{2\sqrt{x+1}}$.
💡 Почему важно: $x\cdot\sqrt{x+1}$ — это произведение двух функций, а не композиция: $x$ не «заходит внутрь» корня. Разбирай выражение сверху вниз: сначала определи главную операцию (сумма? произведение? частное? композиция?), и только потом применяй соответствующее правило. Порядок разбора — обратный порядку вычисления.
❌ Ошибка 5: оборвали цепочку на втором звене
Неправильно: для $y = \big((3x-1)^2+4\big)^5$ написать $y' = 5\big((3x-1)^2+4\big)^4\cdot 2(3x-1)$.
Правильно: есть ещё третье звено: $\cdot\,3$. Итого $y' = 30(3x-1)\big((3x-1)^2+4\big)^4$.
💡 Почему важно: цепочка заканчивается только тогда, когда ты дошёл до чистого $x$ и его производной, равной $1$. Полезная дисциплина: выписывай слои списком перед дифференцированием и вычёркивай каждый по мере использования. Пропуск звена — это ровно тот баг в самописном слое, из-за которого сеть учится, но медленнее, чем должна.
❌ Ошибка 6: считают $\frac{dy}{dx}$ настоящей дробью и сокращают что попало
Неправильно: «раз $du$ сокращается, то и в формуле для функции нескольких переменных можно просто сократить».
Правильно: $\frac{dy}{dx}$ — единый символ. Совпадение с сокращением дробей — удачная мнемоника, следствие доказанной теоремы, а не её причина. В многомерном случае появляется сумма по всем путям: $\frac{\partial L}{\partial x} = \sum_k \frac{\partial L}{\partial u_k}\frac{\partial u_k}{\partial x}$.
💡 Почему важно: именно эта сумма объясняет, почему в вычислительном графе градиенты по ветвлениям складываются. Если тензор используется в двух местах, в него приходят два градиента, и autograd их аккумулирует. Человек, который верит в буквальное сокращение, эту аккумуляцию не ожидает и потом долго ищет «лишний множитель два».
❌ Ошибка 7: считают, что порядок композиции не важен
Неправильно: «$f(g(x))$ и $g(f(x))$ — примерно одно и то же, производная получится та же».
Правильно: для $g(x)=x^2+1$, $f(u)=u^3-2u$ в точке $x=1$ получается $(f\circ g)'(1) = 20$, а $(g\circ f)'(1) = -2$.
💡 Почему важно: композиция некоммутативна, и разница не косметическая — может измениться даже знак. В нейросетях этот же принцип означает, что порядок «линейный слой → активация → нормализация» и «линейный слой → нормализация → активация» дают разные модели с разными градиентами. Споры про pre-norm и post-norm в трансформерах (урок 343) — ровно об этом.
❌ Ошибка 8: применили цепное правило в точке, где внешняя функция не дифференцируема
Неправильно: для $y = \sqrt{x^2}$ написать $y'(0) = \dfrac{2x}{2\sqrt{x^2}}\Big|_{x=0} = \dfrac{0}{0}$ и объявить, что производная равна нулю.
Правильно: $\sqrt{x^2} = |x|$, и в нуле производной не существует (урок 133). Теорема требует дифференцируемости внешней функции в точке $g(x_0)$, а корень в нуле не дифференцируем — правило просто неприменимо.
💡 Почему важно: цепное правило — теорема с условиями, а не универсальный штамп. Проверять условия нужно ровно там, где внутренняя функция приводит в «плохую» точку внешней: под корнем ноль, в знаменателе ноль, у модуля излом. Практическое следствие — MAE-лосс и ReLU в нуле требуют отдельного разговора (субградиент), и фреймворк там возвращает соглашение, а не производную.
Главное запомнить
📝 Ключевые понятия
✅ Композиция: $y = f(g(x))$ — внутренняя $g$ работает первой, внешняя $f$ последней. Определить внешнюю просто: это последнее действие при вычислении на калькуляторе. Композиция некоммутативна: $f\circ g \neq g\circ f$.
✅ Цепное правило: $\big(f(g(x))\big)' = f'\big(g(x)\big)\cdot g'(x)$ — производная внешней функции, вычисленная в точке внутренней, умноженная на производную внутренней. Подстановка $g(x)$ в $f'$ обязательна, это не описка.
✅ Условия теоремы: $g$ дифференцируема в $x_0$, $f$ дифференцируема в $g(x_0)$. Если внутренняя приводит в точку излома или вертикальной касательной внешней — правило неприменимо ($\sqrt{x^2}$ в нуле).
✅ Тонкое место вывода: наивное $\frac{\Delta y}{\Delta x} = \frac{\Delta y}{\Delta u}\cdot\frac{\Delta u}{\Delta x}$ ломается при $\Delta u = 0$. Лечится приёмом Каратеодори: доопределить $\varphi(t) = \frac{f(u_0+t)-f(u_0)}{t}$ значением $f'(u_0)$ в нуле, получить тождество $\Delta y = \varphi(\Delta u)\cdot\Delta u$ без деления и перейти к пределу.
✅ Форма Лейбница: $\dfrac{dy}{dx} = \dfrac{dy}{du}\cdot\dfrac{du}{dx}$. Мнемонически «сокращаем $du$», но $\frac{dy}{dx}$ — не дробь; в многомерном случае появляется сумма по путям.
✅ Обобщённое степенное правило: $\big(u^n\big)' = n u^{n-1}u'$. Частные случаи: $\big(\sqrt u\big)' = \dfrac{u'}{2\sqrt u}$, $\left(\dfrac1u\right)' = -\dfrac{u'}{u^2}$, $\big(f(ax+b)\big)' = a f'(ax+b)$.
✅ Корни и дроби переводи в степени. $\sqrt{u} = u^{1/2}$, $\dfrac{1}{u^n} = u^{-n}$ — тогда внешняя функция всегда степенная и формула одна на все случаи.
✅ Много слоёв — много множителей: $\big(f(g(h(x)))\big)' = f'(g(h(x)))\cdot g'(h(x))\cdot h'(x)$. Разбирай снаружи внутрь, не упрощай до конца цепочки, останавливайся только на чистом $x$.
✅ Ноль в цепочке обнуляет всё. Если производная любого звена равна нулю в данной точке, производная всей композиции там равна нулю — считать остальные множители не нужно.
✅ Backpropagation = цепное правило. Градиент по весу первого слоя — произведение производных всех звеньев от выхода до входа. Обратный порядок вычислений позволяет получить градиент по миллиарду параметров за стоимость примерно двух прямых проходов.
✅ Затухающие градиенты: производная сигмоиды $\sigma' = \sigma(1-\sigma)\leq 0{,}25$, и произведение $0{,}25^L$ — геометрическая прогрессия с $q<1$: при $L=10$ это $\approx 9{,}5\cdot10^{-7}$, при $L=50$ — машинный ноль в float32. Первые слои не обучаются.
✅ Взрывающиеся градиенты: множитель $q>1$ даёт $1{,}5^{50}\approx 6{,}4\cdot 10^{8}$ и nan в логах. Лечение — gradient clipping.
✅ Почему ReLU спасает: её производная равна ровно $1$ или ровно $0$; единица — нейтральный элемент умножения и не портит цепочку любой длины. Плата — мёртвые нейроны (множитель $0$ обрывает градиент). Skip-connection $y = x+F(x)$ даёт $\frac{dy}{dx} = 1+F'(x)$ — «магистраль» с множителем $1$.
Связь с другими темами курса
Что нужно было знать до этого урока:
- Урок 83, композиция функций — прямой фундамент. Оттуда взято понятие внешней и внутренней функции, некоммутативность и техника разложения выражения на слои. Цепное правило — это ровно правило дифференцирования той конструкции, которую там строили.
- Урок 131, предел функции — вывод опирается на теорему о пределе произведения и на понятие предела как такового.
- Урок 132, непрерывность функции — приём Каратеодори строится на непрерывности вспомогательной функции $\varphi$ в нуле, а сходимость $\Delta u \to 0$ следует из непрерывности $g$.
- Урок 133, определение производной — оттуда и определение через предел разностного отношения, и теорема «дифференцируемость влечёт непрерывность» (использована в выводе), и производные $\frac1x$ и $\sqrt x$, и разговор про точки, где производной нет.
- Урок 136, правила дифференцирования — сумма, произведение, частное и степень. В большинстве задач цепное правило работает не в одиночку, а в связке с ними.
Что изучить дальше:
- Урок 138, производные элементарных функций — таблица для $\sin$, $\cos$, $e^x$, $\ln x$ и прочих. В связке с цепным правилом она даёт возможность продифференцировать практически любое выражение: $\big(\sin(x^2)\big)' = 2x\cos(x^2)$, $\big(e^{2x+3}\big)' = 2e^{2x+3}$, $\big(\ln(x^2+1)\big)' = \frac{2x}{x^2+1}$.
- Уроки 139–144, исследование функций — монотонность, экстремумы, наибольшие и наименьшие значения. Почти все функции там сложные, и без цепного правила их не продифференцировать.
- Уроки 145–150, первообразная и интеграл — метод замены переменной в интеграле есть в точности цепное правило, прочитанное справа налево.
- Университетский блок — производная обратной функции и неявное дифференцирование, формула Фаа-ди-Бруно для $n$-й производной композиции (188), частные производные (210), полный дифференциал (211) и многомерное цепное правило с суммой по путям (212), метод Лагранжа (214).
- ML-блок — функции активации (329), backpropagation в явном виде (330), инициализация весов (331) и batch normalization (332) — обе техники придуманы ради удержания множителей цепочки около единицы, ResNet и skip-connections (337), рекуррентные сети и LSTM (339–340), где проблема длинной цепочки стоит острее всего.
Где это нужно в жизни:
💻 В программировании: автоматическое дифференцирование (autograd, jax.grad), построение и обход вычислительных графов, символьные вычисления в SymPy, физические движки, где ускорение выражается через составные зависимости.
🤖 В ML/AI: backpropagation целиком, диагностика затухающих и взрывающихся градиентов, выбор активации, gradient clipping, инициализация весов, архитектурные решения вроде skip-connections и gate-механизмов в LSTM, обучение через несколько моделей подряд (например, дифференцирование сквозь энкодер и декодер).
📊 В Data Science: чувствительность метрики к параметру, который влияет на неё опосредованно; пересчёт эластичностей по цепочке «цена → спрос → выручка»; анализ вложенных преобразований признаков.
🔬 В науке и инженерии: скорость изменения величины, зависящей от времени через промежуточную переменную (энергия через скорость, давление через температуру), теплопередача, кинетика реакций, задачи на связанные скорости — от «лестница скользит по стене» до «радиус пятна нефти растёт со временем».
💰 В финансах: «греки» второго порядка, чувствительность стоимости портфеля к базовой ставке через промежуточные факторы, дисконтирование составных денежных потоков.
Интересные факты
💡 Первый учебник по анализу был куплен за деньги. «Анализ бесконечно малых» маркиза Лопиталя (1696), где цепное правило впервые появилось в печати, был написан на основе лекций Иоганна Бернулли, с которым Лопиталь заключил контракт: ежегодное жалованье в обмен на право публиковать открытия Бернулли под своим именем. Бернулли всю жизнь возмущался, но контракт был законным. Так что и знаменитое «правило Лопиталя» (урок 192), и цепное правило в первом изложении — скорее всего работа Бернулли.
💡 Строгий вывод цепного правила появился на 250 лет позже самого правила. Наивное рассуждение с сокращением $\Delta u$ кочевало по учебникам два с половиной века, пока не стало ясно, что оно ломается на функциях типа $x^2\sin\frac1x$. Аккуратную конструкцию, которой мы пользовались в уроке, предложил Константин Каратеодори — тот самый, чьим именем названа аксиоматика термодинамики. Это довольно типичная история: сначала формула работает, потом кто-то замечает дыру, и только потом появляется корректное доказательство.
💡 Существует формула для $n$-й производной композиции — и она чудовищна. Франческо Фаа-ди-Бруно в 1855 году вывел выражение для $\frac{d^n}{dx^n}f(g(x))$: оно представляет собой сумму по всем разбиениям числа $n$ на слагаемые, а количество членов растёт как число разбиений. Для $n=5$ там уже семь слагаемых, для $n=10$ — сорок два. Коэффициенты в ней — это полиномы Белла, и та же комбинаторика всплывает в теории вероятностей при работе с моментами.
💡 Backpropagation изобретали как минимум четыре раза. Обратный режим автоматического дифференцирования описал Сеппо Линнайнмаа в 1970 году (в магистерской диссертации на финском), к нейросетям его применил Пол Вербос в 1974-м, независимо — Дэвид Паркер и Ян Лекун в начале 1980-х, и лишь публикация Румельхарта, Хинтона и Уильямса 1986 года сделала метод известным. Все они переоткрывали одно и то же цепное правило Лейбница, применённое к длинной композиции.
💡 Асимметрия прямого и обратного режима — деньги на счету. Цепное правило можно перемножать слева направо (прямой режим) или справа налево (обратный). Для функции из $n$ входов в $1$ выход — а функция потерь именно такая — обратный режим требует одного прохода вместо $n$. При $n = 10^{11}$ параметров это разница между «обучить модель за неделю» и «не обучить никогда». Обучение больших моделей возможно ровно потому, что кто-то догадался перемножать цепочку с правильного конца.
Лайфхаки и полезные трюки
1. «Луковица»: выписывай слои столбиком до того, как начнёшь считать
Перед дифференцированием потрать пятнадцать секунд и запиши слои в порядке вычисления. Для $y = \big(\sqrt{x^2+1}+1\big)^4$: $v = x^2+1$, $w = \sqrt v$, $u = w+1$, $y = u^4$. Теперь идёшь снизу вверх и просто выписываешь множители подряд. Пропустить звено при такой записи практически невозможно.
Пример: $y' = 4u^3\cdot 1\cdot\frac{1}{2\sqrt v}\cdot 2x$, где потом подставляешь $u$ и $v$ обратно через $x$.
2. Внутри линейная функция — весь эффект сводится к множителю-константе
$\big(f(ax+b)\big)' = a\,f'(ax+b)$. Никаких промежуточных переменных вводить не надо: продифференцировал внешнюю, приписал коэффициент при $x$ — готово.
Пример: $\big((5x-2)^{10}\big)' = 50(5x-2)^9$ пишется сразу, в одну строку. То же и с $\big(\sqrt{4x-3}\big)' = \frac{4}{2\sqrt{4x-3}} = \frac{2}{\sqrt{4x-3}}$.
3. Не раскрывай скобки — цепное правило почти всегда быстрее
Соблазн раскрыть $(x^2+1)^3$ и продифференцировать четыре слагаемых велик, но при показателе выше третьего это уже дольше и опаснее. А при показателе $10$ — безнадёжно.
Пример: $\big((x^2+1)^{10}\big)' = 20x(x^2+1)^9$ — одна строка против бинома Ньютона с одиннадцатью слагаемыми.
4. Корень и дробь сразу переводи в степень
Три отдельные формулы (для корня, для $\frac1u$, для $\frac{1}{u^n}$) можно не помнить, если помнить одну: $\big(u^n\big)' = nu^{n-1}u'$ работает при любом $n$ — целом, дробном, отрицательном.
Пример: $\dfrac{1}{\sqrt{2x+5}} = (2x+5)^{-1/2}$, производная $-\frac12(2x+5)^{-3/2}\cdot 2 = -(2x+5)^{-3/2}$ — без единой мысли о том, «как дифференцировать дробь с корнем в знаменателе».
5. Сначала смотри на внутреннюю производную — иногда она обнуляет всё
Если в задаче просят значение производной в конкретной точке, начни с самого простого множителя. Часто он оказывается нулём, и остальное считать не нужно.
Пример: для $y = (x^2-4x+7)^6$ в точке $x=2$ внутренняя производная $2x-4 = 0$, значит $y'(2)=0$ — и возводить $(4-8+7)$ в пятую степень не потребовалось.
6. Проверяй ответ численно центральной разностью
Ту же проверку, что делают в gradient check при отладке нейросетей, можно сделать на бумаге или в две строки кода: $f'(x_0)\approx\frac{f(x_0+h)-f(x_0-h)}{2h}$ при $h\approx 10^{-6}$ (урок 133).
Пример: для $y=\sqrt{x^2+9}$ в точке $x=4$ формула дала $0{,}8$. Численно: $\frac{\sqrt{(4{,}001)^2+9}-\sqrt{(3{,}999)^2+9}}{0{,}002} \approx 0{,}8000$ ✅ Если бы множитель $2x$ был потерян, вышло бы $0{,}1$ — расхождение в восемь раз заметно мгновенно.
7. Проверяй размерность в форме Лейбница
$\frac{dy}{du}\cdot\frac{du}{dx}$ — единицы $u$ обязаны сократиться. Если в прикладной задаче они не сокращаются, где-то перепутана промежуточная переменная.
Пример: расход топлива на километр × километров в час = расход в час. Если получилось «расход на километр × часов на километр», множители подобраны неверно.
8. Для нейросети рисуй прямой проход, потом обратный
Сначала выпиши все $z_k$ и $a_k$ с числами (прямой проход), и только потом иди назад, домножая на производные. Пытаться считать градиент «в уме сразу» — верный способ подставить производную активации не в ту точку.
Пример: в задании 26 весь ответ определился на прямом проходе: как только выяснилось, что $z_2 = -2 < 0$, стало ясно, что $\text{ReLU}'(z_2)=0$ и градиент нулевой — обратный проход занял одну строку.
💡 Совет: цепное правило — та формула, которую нужно довести до автоматизма, как таблицу умножения. Не «понимать в принципе», а писать не задумываясь. Проверить себя легко: возьми любые пять заданий из продвинутого блока и реши их с чистого листа за десять минут. Если получилось — ты готов к тому, что дальше композиции будут встречаться в каждой второй задаче курса и в каждой первой строке кода нейросети.
И держи в голове главную мысль урока, она стоит всех выкладок: вдоль цепочки производные перемножаются. Из этого одного факта следует и удобство дифференцирования (четыре строчки вместо бинома Ньютона), и главная беда глубокого обучения (произведение сотни чисел либо схлопывается в ноль, либо улетает в бесконечность), и способ её лечить (держать множители около единицы — активацией, нормализацией, skip-connection). Инженер, который это видит, читает архитектуру сети как формулу; тот, кто не видит, подбирает learning rate наугад.
В следующем уроке — 138, производные элементарных функций — мы наконец добудем таблицу: производные $\sin$, $\cos$, $\tan$, $e^x$, $\ln x$, $a^x$ и $\log_a x$. Каждую выведем, а не просто объявим. И вот тогда цепное правило, которое ты только что освоил, раскроется полностью: в связке с таблицей оно позволит продифференцировать буквально любое выражение, которое ты сумеешь записать. Переходи, самое интересное начинается.
Понял тему? Закрепи в боте! 🚀
Попрактикуйся на задачах и получи персональные рекомендации от AI
💪 Начать тренировку