Производная функции: определение ⚡
В коде обучения нейросети есть строчка, которая делает всю работу: loss.backward(). После неё у каждого из миллионов параметров модели появляется атрибут .grad — число. Оптимизатор берёт это число, умножает на скорость обучения и вычитает из параметра. Всё. Именно так учится любая современная модель — от крошечной регрессии на табличке в тысячу строк до языковой модели на сотни миллиардов параметров.
Вопрос, с которого начинается этот урок: что это за число? Не «градиент, ну ты понял», а строго — какая математическая операция его порождает, откуда она берётся и почему из неё следует, что вычитание этого числа улучшает модель. Ответ целиком помещается в одно понятие — производная. И начинается оно с до смешного простой мысли: чтобы понять, как быстро меняется величина прямо сейчас, надо посмотреть, насколько она изменилась за очень маленький промежуток, поделить одно на другое — и устремить промежуток к нулю.
Именно на слове «устремить» вся конструкция и держится. Если промежуток просто взять маленьким, получится приблизительный ответ — та самая численная производная, которой пользовались инженеры до появления автодифференцирования и которая на слишком маленьком шаге начинает врать катастрофически. Если промежуток положить равным нулю, получится $\frac{0}{0}$ — бессмыслица. А вот предел при стремлении промежутка к нулю — ровно то, что нужно: точное число, а не приближение. Аппарат для этого у тебя уже есть: предел функции из урока 131 и непрерывность из урока 132.
Этот урок — фундамент всего дальнейшего анализа. Здесь производная вводится впервые, с нуля, и здесь мы честно считаем её только по определению, через предел разностного отношения, без единой готовой формулы. Быстрые правила («производная суммы», «производная произведения», таблица производных) появятся позже, в уроках 136–138, и они будут выводиться ровно из того, что мы построим сегодня. Пока — руками.
🎯 Ты узнаешь:
- Что такое приращение аргумента $\Delta x$ и приращение функции $\Delta y$ и почему производная — это отношение вторых к первым
- Как разностное отношение $\frac{\Delta y}{\Delta x}$ выражает среднюю скорость изменения и что происходит, когда $\Delta x$ стремится к нулю
- Строгое определение производной, обозначения $f'(x)$, $\frac{dy}{dx}$ и алгоритм вычисления «по определению» из четырёх шагов
- Как посчитать производную констант, $x$, $x^2$, $x^3$, $\frac{1}{x}$ и $\sqrt{x}$ вручную через предел
- Что такое односторонние производные и почему из дифференцируемости следует непрерывность, а обратно — нет (привет, $|x|$)
- Почему ReLU не дифференцируема в нуле, что фреймворки подставляют вместо производной и что такое субградиент
- Чем численная производная отличается от автодифференцирования и почему второе считает точно, а первое — нет
История: откуда это взялось?
Первым к производной подобрался юрист. Пьер Ферма, советник тулузского парламента, занимавшийся математикой по вечерам, около 1636 года описал «метод максимумов и минимумов»: чтобы найти экстремум величины, он брал $f(x+e)$ и $f(x)$, вычитал одно из другого, делил на $e$ — и после этого объявлял $e$ равным нулю. Приём назывался адекватность (adaequalitas), и работал он безупречно, хотя объяснить, почему можно сначала делить на $e$, а потом считать его нулём, Ферма не мог. Лаплас позже назвал его «истинным изобретателем дифференциального исчисления». Идея деления приращений на приращения родилась именно там.
Дальше — знаменитая пара. В «чумные годы» 1665–1666, отсиживаясь в деревне Вулсторп, двадцатитрёхлетний Исаак Ньютон построил метод флюксий: величины у него «текут» во времени (флюенты), а скорость их течения — флюксия, обозначаемая точкой сверху, $\dot{x}$. Ему это было нужно для механики: закон движения — про мгновенную скорость и мгновенное ускорение, а никакого аппарата для слова «мгновенная» до этого не существовало. Независимо и с другой стороны — от задачи о касательной к кривой — к тому же пришёл Готфрид Лейбниц: 11 ноября 1675 года он впервые записывает символы $d$ и $\int$, а в 1684 году публикует статью с обозначением $\frac{dy}{dx}$, которым мы пользуемся до сих пор. Дальше был безобразный двадцатилетний спор о приоритете, из-за которого английские математики целый век принципиально писали точки Ньютона вместо удобных дробей Лейбница — и отстали от континента.
Строгость пришла много позже. В 1734 году епископ Джордж Беркли выпустил язвительный памфлет «Аналитик», где спросил ровно то, что должно смущать и тебя: если $e$ не ноль, на него можно делить, но тогда результат приблизительный; если ноль — деление незаконно. Свои бесконечно малые он назвал «призраками почивших величин». Ответить внятно смогли только через сто лет: в 1821 году Огюстен Луи Коши в «Курсе анализа» определил производную как предел разностного отношения, а Карл Вейерштрасс довёл предел до современного $\varepsilon$–$\delta$-языка. Именно это определение — с пределом, а не с «бесконечно малым, которое потом ноль» — ты и увидишь ниже. А мостик в сегодня короткий: в 1970 году финский студент Сеппо Линнайнмаа описал в магистерской диссертации способ автоматически применять правила дифференцирования к любой цепочке вычислений в обратном порядке. Через шестнадцать лет это переоткрыли под именем «обратное распространение ошибки», и теперь оно крутится в каждом loss.backward().
Приращение аргумента и приращение функции
Интуиция: «сдвинулись и посмотрели, что стало»
Представь датчик, который показывает температуру в серверной. В 14:00 он показывал $22{,}0$ °C, в 14:05 — $22{,}6$ °C. Чтобы описать эту ситуацию, тебе нужны ровно две величины: на сколько сдвинулось время (5 минут) и на сколько изменилась температура ($+0{,}6$ градуса). Обе — разности, обе могут быть отрицательными (если бы температура падала), обе бессмысленны по отдельности: «изменилось на $0{,}6$» ничего не говорит, пока не сказано, за какой промежуток.
Ровно эту пару и формализует математика. Сдвиг по входу называют приращением аргумента, отклик функции на этот сдвиг — приращением функции. Обозначаются они греческой буквой $\Delta$ («дельта», от греческого diaphorá — разность).
Определение: Пусть функция $f$ определена в некоторой окрестности точки $x_0$, и пусть $x$ — другая точка этой окрестности. Разность
$$\Delta x = x - x_0$$называется приращением аргумента в точке $x_0$, а разность
$$\Delta y = \Delta f = f(x) - f(x_0) = f(x_0 + \Delta x) - f(x_0)$$называется приращением функции, соответствующим приращению аргумента $\Delta x$.
Обозначения и тонкости:
- $\Delta x$ — это единый символ, а не «$\Delta$, умноженное на $x$». Сократить $\Delta$ в дроби $\frac{\Delta y}{\Delta x}$ нельзя.
- Приращение может быть любого знака: $\Delta x > 0$ — сдвинулись вправо, $\Delta x < 0$ — влево. Случай $\Delta x = 0$ мы всегда исключаем: это «никуда не сдвинулись», и делить на такое нельзя.
- Вместо $\Delta x$ очень часто пишут просто $h$ — короче и удобнее в выкладках. Это ровно то же самое.
- $\Delta y$ зависит от двух вещей: от точки $x_0$ и от величины сдвига $\Delta x$. Одно и то же $\Delta x = 0{,}1$ у одной функции в разных точках даёт совершенно разные $\Delta y$ — в этом вся суть будущей производной.
Примеры с разбором
Пример 1 (простой). Дана $f(x) = 3x + 1$. Найди $\Delta y$ в точке $x_0 = 2$ при $\Delta x = 0{,}5$.
Решение.
Шаг 1. Считаем значение в исходной точке: $f(2) = 3 \cdot 2 + 1 = 7$.
Шаг 2. Считаем значение в сдвинутой точке: $x = x_0 + \Delta x = 2{,}5$, откуда $f(2{,}5) = 3 \cdot 2{,}5 + 1 = 8{,}5$.
Шаг 3. Вычитаем: $\Delta y = 8{,}5 - 7 = 1{,}5$.
Обрати внимание на симпатичную деталь: $\frac{\Delta y}{\Delta x} = \frac{1{,}5}{0{,}5} = 3$ — ровно коэффициент при $x$. Для линейной функции это будет так при любых $x_0$ и $\Delta x$, и мы это скоро докажем в общем виде.
Ответ: $\Delta y = 1{,}5$.
Пример 2 (средний). Дана $f(x) = x^2$, точка $x_0 = 2$. Найди $\Delta y$ и отношение $\frac{\Delta y}{\Delta x}$ при $\Delta x = 0{,}1$, $\Delta x = 0{,}01$ и $\Delta x = 0{,}001$.
Решение.
Шаг 1. $f(2) = 4$ — это общее для всех трёх случаев.
Шаг 2. $\Delta x = 0{,}1$: $f(2{,}1) = 4{,}41$, значит $\Delta y = 0{,}41$ и $\frac{\Delta y}{\Delta x} = \frac{0{,}41}{0{,}1} = 4{,}1$.
Шаг 3. $\Delta x = 0{,}01$: $f(2{,}01) = 4{,}0401$, значит $\Delta y = 0{,}0401$ и $\frac{\Delta y}{\Delta x} = 4{,}01$.
Шаг 4. $\Delta x = 0{,}001$: $f(2{,}001) = 4{,}004001$, значит $\Delta y = 0{,}004001$ и $\frac{\Delta y}{\Delta x} = 4{,}001$.
Само $\Delta y$ стремится к нулю — это просто непрерывность из урока 132. А вот отношение к нулю не стремится: оно уверенно ползёт к числу $4$. Это и есть та величина, ради которой затевается весь урок.
Ответ: $0{,}41$ и $4{,}1$; $0{,}0401$ и $4{,}01$; $0{,}004001$ и $4{,}001$.
Пример 3 (сложный). Дана $f(x) = \frac{1}{x}$, точка $x_0 = 4$. Вырази $\Delta y$ через произвольное приращение $h \neq 0$ (при $h \neq -4$) и упрости отношение $\frac{\Delta y}{h}$.
Решение.
Шаг 1. Записываем приращение по определению:
$$\Delta y = f(4+h) - f(4) = \frac{1}{4+h} - \frac{1}{4}.$$Шаг 2. Приводим к общему знаменателю $4(4+h)$:
$$\Delta y = \frac{4 - (4+h)}{4(4+h)} = \frac{-h}{4(4+h)}.$$Шаг 3. Делим на $h$. Именно здесь происходит главное событие всех вычислений этого урока: множитель $h$ в числителе сокращается с $h$ в знаменателе.
$$\frac{\Delta y}{h} = \frac{-h}{4(4+h) \cdot h} = \frac{-1}{4(4+h)}.$$Шаг 4. Проверим числами. При $h = 0{,}1$: $\frac{-1}{4 \cdot 4{,}1} = \frac{-1}{16{,}4} \approx -0{,}060976$. При $h = -0{,}1$: $\frac{-1}{4 \cdot 3{,}9} = \frac{-1}{15{,}6} \approx -0{,}064103$. С обеих сторон отношение подбирается к $\frac{-1}{16} = -0{,}0625$.
Ответ: $\Delta y = \dfrac{-h}{4(4+h)}$, отношение равно $\dfrac{-1}{4(4+h)}$.
Почему это важно
Приращение — это язык, на котором вообще говорят об изменениях, и он выходит далеко за рамки этого урока. Разность соседних значений временного ряда, diff() в pandas, дельта метрики неделя к неделе, разница логитов до и после шага обучения — всё это $\Delta y$. Ключевая мысль, которую стоит унести: абсолютное изменение само по себе бессодержательно. «Loss упал на $0{,}03$» — это хорошо или плохо? Зависит от того, за сколько шагов. «Выручка выросла на 200 тысяч» — зависит от того, за какой период и с какой базы. Значение появляется только когда изменение отнесено к тому, что его вызвало, — то есть когда мы поделим $\Delta y$ на $\Delta x$. Этим и займёмся.
Разностное отношение: средняя скорость изменения
Интуиция: спидометр против одометра
Ты проехал 150 км за 2 часа. Средняя скорость — 75 км/ч. Но означает ли это, что ты хоть в какой-то момент двигался со скоростью ровно 75? Совсем нет: стоял в пробке (0 км/ч), разгонялся, шёл 110 по трассе, тормозил у поста. Число 75 — это честная характеристика всего интервала целиком, и оно ничего не сообщает о том, что происходило внутри.
Та же самая история с любой функцией. Поделив приращение функции на приращение аргумента, ты получаешь среднюю скорость изменения на отрезке от $x_0$ до $x_0 + \Delta x$: «сколько единиц выхода приходится на единицу входа в среднем по этому куску».
Определение: Отношение приращения функции к вызвавшему его приращению аргумента
$$\frac{\Delta y}{\Delta x} = \frac{f(x_0 + \Delta x) - f(x_0)}{\Delta x}, \qquad \Delta x \neq 0,$$называется разностным отношением функции $f$ в точке $x_0$, или средней скоростью изменения функции на отрезке между $x_0$ и $x_0 + \Delta x$.
Три вещи про эту дробь стоит зафиксировать сразу.
Первое: она определена при любом $\Delta x \neq 0$ и никаких пределов пока не требует — это обычная арифметика. Разностное отношение можно посчитать всегда, когда функция определена в обеих точках.
Второе: у неё есть размерность. Если $y$ — рубли, а $x$ — дни, то $\frac{\Delta y}{\Delta x}$ измеряется в рублях в день. Если $y$ — значение функции потерь, а $x$ — вес нейросети, то отношение показывает, на сколько единиц лосса меняется модель на единицу изменения веса. Производная унаследует эту размерность целиком.
Третье: знак говорит о направлении. Положительное отношение — на этом куске функция в среднем выросла, отрицательное — в среднем упала, нулевое — вернулась туда же, откуда стартовала (что не значит, что она никуда не ходила).
Есть и геометрическая картинка: разностное отношение — это угловой коэффициент прямой, проходящей через две точки графика, то есть секущей. Эту линию мы разберём в уроке 134, где производная получит полноценный геометрический смысл. Сейчас нам хватит алгебры.
Примеры с разбором
Пример 1 (простой). Число активных пользователей приложения: в понедельник $12\,400$, в пятницу $13\,200$. Найди среднюю скорость роста.
Решение.
Шаг 1. $\Delta x = 4$ дня (с понедельника по пятницу), $\Delta y = 13\,200 - 12\,400 = 800$ пользователей.
Шаг 2. $\frac{\Delta y}{\Delta x} = \frac{800}{4} = 200$.
Это не значит, что каждый день приходило по 200 человек: могло быть $+500, -100, +300, +100$. Среднее по интервалу — только среднее.
Ответ: $200$ пользователей в день в среднем.
Пример 2 (средний). Для $f(x) = x^2 - 4x$ найди разностное отношение в точке $x_0$ при произвольном приращении $h$ и упрости его.
Решение.
Шаг 1. Пишем числитель:
$$f(x_0+h) - f(x_0) = \big[(x_0+h)^2 - 4(x_0+h)\big] - \big[x_0^2 - 4x_0\big].$$Шаг 2. Раскрываем квадрат: $(x_0+h)^2 = x_0^2 + 2x_0h + h^2$. Подставляем:
$$= x_0^2 + 2x_0h + h^2 - 4x_0 - 4h - x_0^2 + 4x_0 = 2x_0h + h^2 - 4h.$$Слагаемые без $h$ — $x_0^2$ и $-4x_0$ — сократились. Так будет всегда: в приращении функции обязано сократиться всё, что не зависит от $h$, иначе где-то арифметическая ошибка.
Шаг 3. Выносим $h$ и делим:
$$\frac{\Delta y}{h} = \frac{h(2x_0 + h - 4)}{h} = 2x_0 + h - 4.$$Ответ: $\dfrac{\Delta y}{h} = 2x_0 + h - 4$.
Пример 3 (сложный). Функция потерь линейной модели с одним весом на одном объекте: $L(w) = (w \cdot 2 - 5)^2$, то есть признак равен $2$, целевое значение — $5$. Найди среднюю скорость изменения лосса при переходе веса от $w_0 = 3$ к $w = 3{,}2$ и объясни знак.
Решение.
Шаг 1. $L(3) = (6-5)^2 = 1$.
Шаг 2. $L(3{,}2) = (6{,}4 - 5)^2 = 1{,}4^2 = 1{,}96$.
Шаг 3. $\Delta L = 1{,}96 - 1 = 0{,}96$, $\Delta w = 0{,}2$, отсюда
$$\frac{\Delta L}{\Delta w} = \frac{0{,}96}{0{,}2} = 4{,}8.$$Шаг 4. Знак положительный: увеличение веса на этом участке увеличивает ошибку. Значит, чтобы ошибку уменьшить, вес надо двигать в другую сторону — вычитать, а не прибавлять. Именно это и делает градиентный спуск: w -= lr * grad. Минус в формуле обновления берётся ровно отсюда.
Ответ: $4{,}8$ единиц лосса на единицу веса; знак положительный, поэтому вес нужно уменьшать.
Почему это важно
Разностное отношение — не учебная промежуточная сущность, а рабочая величина, с которой ты сталкиваешься постоянно, просто под другими именами. В анализе данных это темп роста (MoM, YoY, «прирост в неделю»). В численных методах это конечная разность — приближение производной, которым считают всё, у чего нет аналитической формулы. В инженерии это наклон характеристики. А главное — это единственная величина, которую в реальности вообще можно измерить: любой датчик, любой лог, любая метрика даёт тебе значения в дискретных точках, и всё, что ты можешь честно посчитать, — это отношение конечных разностей.
Проблема ровно одна, и она принципиальная: разностное отношение зависит от того, какой кусок ты взял. Возьмёшь $\Delta x = 1$ — получишь один ответ, возьмёшь $\Delta x = 0{,}1$ — другой. Число «скорость изменения в точке» из этих ответов пока не извлекается. Чтобы его извлечь, нужен предел.
Предельный переход: от средней скорости к мгновенной
Интуиция: зажимаем интервал
Вернёмся к примеру 2 из первого раздела: $f(x) = x^2$, точка $x_0 = 2$. Разностное отношение давало $4{,}1$, затем $4{,}01$, затем $4{,}001$. Возьмём приращение с другой стороны: при $\Delta x = -0{,}001$ получим $f(1{,}999) = 3{,}996001$, откуда $\frac{\Delta y}{\Delta x} = \frac{-0{,}003999}{-0{,}001} = 3{,}999$. С обеих сторон отношение прижимается к четвёрке.
Соблазн простой: положить $\Delta x = 0$ и «получить точный ответ». Но при $\Delta x = 0$ числитель тоже равен нулю, и дробь превращается в $\frac{0}{0}$ — выражение, не имеющее значения. Ровно на это и указывал Беркли в 1734 году. Выход из тупика даёт аппарат урока 131: предел функции интересуется тем, к чему выражение стремится при приближении аргумента к точке, и его совершенно не волнует, что в самой точке выражение не определено. Разностное отношение — это функция от $\Delta x$, не определённая в нуле, но имеющая в нуле предел. Этот предел и объявляют производной.
Определение: Пусть функция $f$ определена в некоторой окрестности точки $x_0$. Производной функции $f$ в точке $x_0$ называется предел разностного отношения при стремлении приращения аргумента к нулю:
$$f'(x_0) = \lim_{\Delta x \to 0} \frac{f(x_0 + \Delta x) - f(x_0)}{\Delta x} = \lim_{h \to 0} \frac{f(x_0 + h) - f(x_0)}{h},$$если этот предел существует и конечен. В этом случае функцию $f$ называют дифференцируемой в точке $x_0$, а саму операцию нахождения производной — дифференцированием.
Эквивалентная запись получается заменой $x = x_0 + h$ (тогда $h \to 0$ равносильно $x \to x_0$):
$$f'(x_0) = \lim_{x \to x_0} \frac{f(x) - f(x_0)}{x - x_0}.$$Обе формы полностью равноправны. Первая удобнее, когда надо раскрывать скобки и сокращать $h$; вторая — когда числитель раскладывается на множители, из которых один равен $x - x_0$.
Три слова в определении, которые нельзя пропускать:
- «Предел» — не «подставим ноль». Подстановка даёт $\frac{0}{0}$; предел даёт число. Разница между ними — весь математический анализ.
- «Существует» — предел может и не существовать, и тогда производной в точке просто нет. Мы разберём несколько таких функций ниже.
- «Конечен» — если разностное отношение уходит в $+\infty$, производной тоже нет. Бесконечность — не число, и написать $f'(0) = +\infty$ означает выйти за рамки определения.
Обозначения: четыре школы
За триста лет накопилось несколько систем записи, и ты встретишь все.
- Лагранж (штрих): $f'(x)$, $y'$, $f'(x_0)$. Самая компактная запись, стандарт в школьном и вузовском курсе. Вторая производная — $f''$, дальше $f^{(4)}$.
- Лейбниц (дробь): $\dfrac{dy}{dx}$, $\dfrac{df}{dx}$, $\dfrac{d}{dx}f(x)$. Значение в точке пишут как $\left.\dfrac{dy}{dx}\right|_{x=x_0}$. Главное преимущество — видно, по какой переменной дифференцируем; это критично, когда переменных много. Именно эта запись естественно переходит в частные производные $\dfrac{\partial L}{\partial w}$, на которых стоит всё машинное обучение.
- Ньютон (точка): $\dot{x}$, $\ddot{x}$. Живёт в физике и механике, применяется почти исключительно к производной по времени.
- Эйлер (оператор): $Df$, $D_x f$. Встречается в функциональном анализе, теории дифференциальных уравнений и в документации автодифф-библиотек.
⚠️ Важная оговорка про запись Лейбница: $\frac{dy}{dx}$ на этом этапе — единый символ, а не дробь. Ни $dy$, ни $dx$ по отдельности пока не определены, и «сокращать» их нельзя. То, что с этой записью действительно можно обращаться почти как с дробью, — не случайность и не совпадение, но обосновывается это через понятие дифференциала, которое появится сильно позже (университетский курс, урок 187).
Почему это важно
Определение через предел — это не бюрократия ради строгости, а рабочий инструмент, который решает конкретную проблему. Средняя скорость всегда относится к интервалу, а интервал приходится выбирать произвольно. Производная выбор снимает: она даёт единственное число, привязанное к одной точке, ни от каких настроек не зависящее. Именно поэтому её можно осмысленно сравнивать между точками, подставлять в уравнения и оптимизировать.
Практическое следствие для ML прямое. Когда оптимизатор спрашивает «в какую сторону двигать этот вес», ему нужен ответ про текущее состояние модели, а не про то, что было бы при сдвиге веса на $0{,}1$. Вопрос «на сколько изменится лосс при бесконечно малом изменении веса» — это буквально вопрос о пределе разностного отношения. Поэтому в основании градиентного спуска лежит не приближённая разность, а точная производная.
Вычисляем производную по определению
Никаких формул у нас пока нет — есть только определение. Из него вырастает жёсткий алгоритм, который работает всегда.
Алгоритм из четырёх шагов:
- Записать приращение функции $\Delta y = f(x + h) - f(x)$ и раскрыть все скобки.
- Упростить: всё, что не содержит $h$, обязано сократиться.
- Разделить на $h$ — то есть избавиться от $h$ в знаменателе. Это ключевой шаг; способ зависит от функции (вынесение множителя, приведение к общему знаменателю, домножение на сопряжённое).
- Перейти к пределу при $h \to 0$: в полученном выражении подставить $h = 0$ (после шага 3 это уже законно, неопределённости нет).
Прогоним алгоритм шесть раз.
Пример 1 (простой): производная константы
Пусть $f(x) = C$, где $C$ — фиксированное число.
Шаг 1. $\Delta y = f(x+h) - f(x) = C - C = 0$.
Шаг 2. Упрощать нечего.
Шаг 3. $\dfrac{\Delta y}{h} = \dfrac{0}{h} = 0$ — при любом $h \neq 0$.
Шаг 4. Предел постоянной величины $0$ равен $0$.
$$\boxed{(C)' = 0}$$Смысл предельно конкретный: константа не меняется, скорость её изменения — ноль. В ML это, например, замороженный слой: параметр не участвует в обучении, его производная тождественно нулевая, requires_grad=False.
Пример 2 (простой): производная $x$
Пусть $f(x) = x$.
Шаг 1. $\Delta y = (x + h) - x = h$.
Шаг 2–3. $\dfrac{\Delta y}{h} = \dfrac{h}{h} = 1$ при $h \neq 0$.
Шаг 4. $\lim_{h\to 0} 1 = 1$.
$$\boxed{(x)' = 1}$$То же самое для общего линейного случая $f(x) = ax + b$: $\Delta y = a(x+h) + b - ax - b = ah$, отношение равно $a$, предел равен $a$. Скорость изменения линейной функции постоянна и равна коэффициенту наклона — совпадает со здравым смыслом.
Пример 3 (средний): производная $x^2$
Пусть $f(x) = x^2$.
Шаг 1. $\Delta y = (x+h)^2 - x^2 = x^2 + 2xh + h^2 - x^2$.
Шаг 2. $\Delta y = 2xh + h^2 = h(2x + h)$.
Шаг 3. $\dfrac{\Delta y}{h} = \dfrac{h(2x+h)}{h} = 2x + h$.
Шаг 4. $\lim_{h \to 0}(2x + h) = 2x$.
$$\boxed{(x^2)' = 2x}$$Проверка по нашему же численному эксперименту: при $x = 2$ формула даёт $4$, а разностные отношения давали $4{,}1$, $4{,}01$, $4{,}001$. Сходится.
Заодно виден смысл: чем дальше от нуля, тем быстрее растёт квадрат. При $x = 1$ скорость $2$, при $x = 10$ уже $20$. И при $x = 0$ скорость нулевая — парабола в вершине на мгновение «останавливается».
Пример 4 (средний): производная $x^3$
Пусть $f(x) = x^3$. Понадобится формула куба суммы: $(x+h)^3 = x^3 + 3x^2h + 3xh^2 + h^3$.
Шаг 1. $\Delta y = x^3 + 3x^2 h + 3x h^2 + h^3 - x^3$.
Шаг 2. $\Delta y = 3x^2 h + 3x h^2 + h^3 = h(3x^2 + 3xh + h^2)$.
Шаг 3. $\dfrac{\Delta y}{h} = 3x^2 + 3xh + h^2$.
Шаг 4. При $h \to 0$ второе и третье слагаемые обращаются в ноль:
$$\boxed{(x^3)' = 3x^2}$$Заметь структуру: слагаемые с $h^2$ и выше умирают при предельном переходе, выживает только член, линейный по $h$. Это общее правило — производная «видит» лишь линейную часть приращения.
Пример 5 (сложный): производная $\frac{1}{x}$
Пусть $f(x) = \dfrac{1}{x}$, $x \neq 0$. Здесь вынести $h$ за скобку не выйдет — нужен общий знаменатель.
Шаг 1. $\Delta y = \dfrac{1}{x+h} - \dfrac{1}{x}$.
Шаг 2. Общий знаменатель $x(x+h)$:
$$\Delta y = \frac{x - (x+h)}{x(x+h)} = \frac{-h}{x(x+h)}.$$Шаг 3. Делим на $h$ — множитель $h$ уходит:
$$\frac{\Delta y}{h} = \frac{-h}{x(x+h)h} = \frac{-1}{x(x+h)}.$$Шаг 4. Теперь подстановка $h = 0$ безопасна (знаменатель $x \cdot x \neq 0$):
$$\boxed{\left(\frac{1}{x}\right)' = -\frac{1}{x^2}}$$Минус закономерен: гипербола на каждом из своих кусков убывает, скорость изменения отрицательна везде, где функция определена. И величина скорости зависит от $x$ очень резко: при $x = 0{,}1$ производная равна $-100$, при $x = 10$ — всего $-0{,}01$.
Пример 6 (сложный): производная $\sqrt{x}$
Пусть $f(x) = \sqrt{x}$, $x > 0$. Здесь работает третий приём — домножение на сопряжённое выражение.
Шаг 1. $\Delta y = \sqrt{x+h} - \sqrt{x}$.
Шаг 2. Домножаем и делим на сопряжённое $\big(\sqrt{x+h} + \sqrt{x}\big)$, используя $(a-b)(a+b) = a^2 - b^2$:
$$\Delta y = \frac{(\sqrt{x+h} - \sqrt{x})(\sqrt{x+h} + \sqrt{x})}{\sqrt{x+h} + \sqrt{x}} = \frac{(x+h) - x}{\sqrt{x+h} + \sqrt{x}} = \frac{h}{\sqrt{x+h} + \sqrt{x}}.$$Корни из числителя исчезли, зато появился нужный множитель $h$.
Шаг 3. $\dfrac{\Delta y}{h} = \dfrac{1}{\sqrt{x+h} + \sqrt{x}}$.
Шаг 4. При $h \to 0$ подкоренное выражение $x + h$ стремится к $x$ (корень непрерывен — урок 132), поэтому
$$\boxed{(\sqrt{x})' = \frac{1}{2\sqrt{x}}}$$Проверка: при $x = 9$ получаем $\frac{1}{6} \approx 0{,}1667$. Прямой счёт: $\sqrt{9{,}001} \approx 3{,}000166$, разностное отношение $\approx \frac{0{,}000166}{0{,}001} = 0{,}166$. Совпадает.
Сводка: шесть производных, добытых вручную
| Функция | Производная | Приём на шаге 3 |
|---|---|---|
| $C$ | $0$ | ничего, числитель нулевой |
| $x$ | $1$ | сокращение |
| $x^2$ | $2x$ | вынесение $h$ за скобку |
| $x^3$ | $3x^2$ | вынесение $h$ за скобку |
| $\dfrac{1}{x}$ | $-\dfrac{1}{x^2}$ | общий знаменатель |
| $\sqrt{x}$ | $\dfrac{1}{2\sqrt{x}}$ | домножение на сопряжённое |
Если записать степени единообразно — $x = x^1$, $\frac{1}{x} = x^{-1}$, $\sqrt{x} = x^{1/2}$ — проступает закономерность: $1 \cdot x^0$, $2x^1$, $3x^2$, $-1 \cdot x^{-2}$, $\frac{1}{2}x^{-1/2}$. Во всех шести случаях получается $n \cdot x^{n-1}$. Это не совпадение, и в уроке 138 это будет доказано в общем виде вместе с производными синуса, экспоненты и логарифма. Пока просто отметь: закономерность есть, но пользоваться ей как готовой формулой мы ещё не имеем права — сегодня всё считается по определению.
Почему это важно
Умение считать по определению — навык, который окупается дважды. Во-первых, все правила и таблицы из уроков 136–138 доказываются именно так, и без понимания механики они превращаются в набор заклинаний, который забывается за месяц. Во-вторых, определение — единственный инструмент, работающий там, где таблица бессильна: в точках склейки кусочных функций, в подозрительных точках вроде нуля у $|x|$, для функций, заданных не формулой, а описанием. Практически все интересные случаи в машинном обучении — ReLU, Huber, hinge loss, квантование — это как раз кусочные конструкции, где вопрос решается только через определение.
Производная в точке и производная как функция
Тут прячется различие, на котором спотыкаются постоянно.
$f'(x_0)$ — это число. Одно конкретное число, привязанное к одной конкретной точке: $f'(2) = 4$ для $f(x)=x^2$.
Но если производная существует в каждой точке некоторого множества, то каждой точке этого множества сопоставлено своё число — а это и есть функция.
Определение: Если функция $f$ дифференцируема в каждой точке множества $D$, то функция, ставящая каждому $x \in D$ в соответствие число $f'(x)$, называется производной функцией (или просто производной) функции $f$ на множестве $D$.
Отсюда две практические заметки.
Область определения производной может быть уже, чем у самой функции. Классика — $f(x) = \sqrt{x}$: сама функция определена при $x \geq 0$, а производная $\frac{1}{2\sqrt{x}}$ — только при $x > 0$. В нуле производной нет, хотя функция там прекрасно определена.
Порядок «подставить» и «продифференцировать» менять нельзя. Запись $f'(2)$ означает: сначала найти производную функцию $f'$, потом подставить в неё двойку. Если сделать наоборот — сначала подставить, получить $f(2) = 4$, а потом «дифференцировать», — выйдет производная константы, то есть ноль. Именно поэтому запись $(f(2))'$ бессмысленна и всегда равна нулю: дифференцировать можно функцию, а не число.
Односторонние производные
Интуиция: подойти слева и подойти справа
Предел разностного отношения — двусторонний: $h$ обязан стремиться к нулю и по положительным, и по отрицательным значениям, и результат обязан быть один и тот же. Но никто не мешает рассмотреть каждую сторону отдельно — и иногда это единственный способ разобраться в ситуации.
Определение: Правой производной функции $f$ в точке $x_0$ называется односторонний предел
$$f'_+(x_0) = \lim_{h \to 0^+} \frac{f(x_0+h) - f(x_0)}{h},$$левой производной — предел
$$f'_-(x_0) = \lim_{h \to 0^-} \frac{f(x_0+h) - f(x_0)}{h},$$если соответствующие пределы существуют и конечны.
Критерий: Производная $f'(x_0)$ существует тогда и только тогда, когда существуют обе односторонние производные и они равны. В этом случае $f'(x_0) = f'_+(x_0) = f'_-(x_0)$.
Это прямое следствие критерия существования предела из урока 131: двусторонний предел есть ровно тогда, когда есть оба односторонних и они совпадают.
Пример 1 (простой): модуль в нуле
$f(x) = |x|$, точка $x_0 = 0$. Заметим $f(0) = 0$, поэтому разностное отношение равно $\frac{|h|}{h}$.
Справа ($h > 0$): $|h| = h$, отношение равно $\frac{h}{h} = 1$, значит $f'_+(0) = 1$.
Слева ($h < 0$): $|h| = -h$, отношение равно $\frac{-h}{h} = -1$, значит $f'_-(0) = -1$.
Обе односторонние производные существуют, но $1 \neq -1$. Двустороннего предела нет, производной в нуле не существует. При этом во всех остальных точках всё в порядке: при $x > 0$ модуль совпадает с $x$ и производная равна $1$, при $x < 0$ совпадает с $-x$ и производная равна $-1$.
Пример 2 (средний): гладкая склейка
$$f(x) = \begin{cases} x^2, & x \leq 1,\\ 2x - 1, & x > 1.\end{cases}$$Проверим точку склейки $x_0 = 1$.
Шаг 1 (непрерывность). Слева $f(1) = 1$, справа предел равен $2 \cdot 1 - 1 = 1$. Значения совпали — функция непрерывна. Этот шаг обязателен: без непрерывности дальше можно не смотреть, производной не будет заведомо.
Шаг 2 (слева). Для $h < 0$ работает верхняя ветка:
$$\frac{(1+h)^2 - 1}{h} = \frac{2h + h^2}{h} = 2 + h \xrightarrow{h \to 0^-} 2.$$Шаг 3 (справа). Для $h > 0$ работает нижняя ветка:
$$\frac{2(1+h) - 1 - 1}{h} = \frac{2h}{h} = 2 \xrightarrow{h \to 0^+} 2.$$Вывод. Обе односторонние производные равны $2$, следовательно $f'(1) = 2$. Функция склеена гладко — в точке стыка нет излома.
Пример 3 (сложный): $x|x|$ в нуле
$f(x) = x \cdot |x|$. Функция выглядит подозрительно (модуль!), проверим нуль по определению. Так как $f(0) = 0$:
$$\frac{f(h) - f(0)}{h} = \frac{h|h|}{h} = |h|.$$При $h \to 0$ величина $|h|$ стремится к нулю с обеих сторон. Значит $f'(0) = 0$ — производная существует, несмотря на модуль в записи. Модуль сам по себе не приговор: важно, как ведёт себя именно разностное отношение.
Почему это важно
Односторонние производные — рабочий инструмент ровно для тех функций, которые чаще всего встречаются в машинном обучении. Все кусочно-заданные конструкции проверяются только так: ReLU и её родня, Huber loss, hinge loss в SVM, клиппинг градиентов, квантование весов. Плюс есть содержательная разница между «производной нет, но односторонние существуют» (излом — с ним можно работать через субградиент) и «производной нет вообще» (разрыв или дикое колебание — тут не спасёт ничего). Первый случай для оптимизации почти безобиден, второй — фатален.
Дифференцируемость влечёт непрерывность
Между двумя понятиями из уроков 132 и 133 есть строгая односторонняя связь, и знать её направление обязательно.
Теорема. Если функция $f$ дифференцируема в точке $x_0$, то она непрерывна в этой точке.
Доказательство. Непрерывность в точке $x_0$ означает $\lim_{h \to 0} \big(f(x_0+h) - f(x_0)\big) = 0$, то есть что приращение функции стремится к нулю вместе с приращением аргумента. Это и докажем.
Шаг 1. При $h \neq 0$ приращение можно записать тождественно:
$$f(x_0 + h) - f(x_0) = \frac{f(x_0+h) - f(x_0)}{h} \cdot h.$$Мы просто умножили и разделили на $h$ — это законно, поскольку $h \neq 0$.
Шаг 2. Первый множитель по условию имеет предел, равный $f'(x_0)$ (функция дифференцируема). Второй множитель стремится к нулю.
Шаг 3. По теореме о пределе произведения (урок 131) предел произведения равен произведению пределов:
$$\lim_{h \to 0}\big(f(x_0+h) - f(x_0)\big) = f'(x_0) \cdot 0 = 0.$$Шаг 4. Приращение функции стремится к нулю, а это в точности определение непрерывности в точке. ∎
Внимание на шаг 3: здесь критически важна конечность $f'(x_0)$. Если бы производная была «бесконечной», произведение $\infty \cdot 0$ оказалось бы неопределённостью, и вывод бы не прошёл. Именно поэтому в определении производной стоит слово «конечен».
Практически полезная форма: контрапозиция
Логически равносильное утверждение звучит так:
Следствие. Если функция разрывна в точке $x_0$, то она в этой точке не дифференцируема.
Это готовый рабочий тест. Увидел разрыв — производной нет, дальше можно не считать. Скачок в кусочной функции, дырка, вертикальная асимптота — всё это автоматически означает отсутствие производной.
Обратное неверно: контрпример $|x|$
А вот в другую сторону утверждение ложно, и это принципиально.
Функция $f(x) = |x|$ непрерывна в нуле: $\lim_{x\to 0}|x| = 0 = |0|$, никаких скачков. Но производной в нуле у неё нет — мы это только что показали через односторонние производные $1$ и $-1$.
Содержательно разница вот в чём. Непрерывность требует, чтобы график не рвался. Дифференцируемость требует большего — чтобы график был гладким, без углов. У модуля в нуле угол: слева функция падает с наклоном $-1$, справа растёт с наклоном $+1$, и единой «скорости изменения» в этой точке просто нет.
Значит, дифференцируемость — свойство строго более сильное, чем непрерывность. Класс дифференцируемых функций строго вложен в класс непрерывных.
И насколько строго — выяснилось только в 1872 году, когда Карл Вейерштрасс предъявил функцию, непрерывную во всех точках прямой и не имеющую производной ни в одной из них. Современники были в шоке: Шарль Эрмит писал, что «с ужасом и отвращением отворачивается от этой прискорбной язвы функций, не имеющих производных». Сегодня такие функции — рабочий инструмент: их графики фрактальны, и на похожих моделях считают броуновское движение и волатильность финансовых рядов.
Почему это важно
Направление импликации — это готовый алгоритм проверки в любой подозрительной точке:
- Сначала проверь непрерывность. Если её нет — производной нет, вопрос закрыт.
- Если непрерывность есть — считай односторонние производные.
- Если обе есть и совпали — производная существует и равна их общему значению. Если различаются — излом, производной нет.
Порядок менять нельзя: считать односторонние производные, не проверив непрерывность, — верный способ получить бессмысленный ответ.
Где производной не существует: каталог случаев
Полезно держать в голове полный набор способов, которыми функция может «сломаться» в точке.
1. Излом (угловая точка). Односторонние производные существуют, но не равны. Эталон — $|x|$ в нуле, где они равны $-1$ и $1$. Сюда же попадают все кусочные функции с негладкой склейкой и, что важно для практики, ReLU и абсолютная ошибка $|y - \hat{y}|$.
2. Вертикальная касательная. Односторонние пределы разностного отношения существуют, но равны $+\infty$ (или оба $-\infty$) — то есть бесконечны, а значит производной по определению нет. Пример: $f(x) = \sqrt[3]{x}$ в нуле. Здесь
$$\frac{f(h) - f(0)}{h} = \frac{\sqrt[3]{h}}{h} = \frac{1}{h^{2/3}} \xrightarrow{h \to 0} +\infty.$$Функция при этом непрерывна и даже строго возрастает. Геометрически касательная в такой точке существует, но она вертикальна и углового коэффициента не имеет — подробности в уроке 134.
3. Точка возврата (клюв). Односторонние пределы бесконечны, но разных знаков. Пример — $f(x) = \sqrt{|x|}$ в нуле: справа отношение $\frac{\sqrt{h}}{h} = \frac{1}{\sqrt h} \to +\infty$, слева $\frac{\sqrt{-h}}{h} \to -\infty$.
4. Разрыв. Любого типа: скачок, устранимый разрыв, бесконечный. По доказанной теореме дифференцируемости здесь быть не может. Пример: функция «округление вниз» $\lfloor x \rfloor$ во всех целых точках.
5. Бесконечное колебание. Самый экзотический случай: односторонних пределов нет вообще, потому что разностное отношение болтается, не приближаясь ни к чему. Эталон:
$$f(x) = \begin{cases} x \sin\frac{1}{x}, & x \neq 0,\\ 0, & x = 0.\end{cases}$$Функция непрерывна в нуле (модуль не превосходит $|x|$), но разностное отношение равно $\frac{h\sin(1/h)}{h} = \sin\frac{1}{h}$, и при $h \to 0$ это выражение бесконечно много раз пробегает весь отрезок от $-1$ до $1$. Никакого предела.
Любопытный контраст: у функции $g(x) = x^2 \sin\frac{1}{x}$ (с $g(0)=0$) разностное отношение равно $h \sin\frac{1}{h}$, и оно уже зажато между $-|h|$ и $|h|$, поэтому стремится к нулю. Значит $g'(0) = 0$ — производная есть. Одна лишняя степень $x$ полностью меняет дело.
ML-контекст: ReLU, излом в нуле и субградиент
Самая популярная функция активации в глубоком обучении — ReLU (rectified linear unit):
$$\mathrm{ReLU}(x) = \max(0, x) = \begin{cases} 0, & x \leq 0,\\ x, & x > 0.\end{cases}$$Она стоит между слоями миллионов нейросетей, и именно она — живой пример недифференцируемой функции в проде.
Считаем производную по определению.
При $x > 0$ в малой окрестности функция совпадает с $x$, поэтому разностное отношение равно $1$, и $\mathrm{ReLU}'(x) = 1$.
При $x < 0$ функция совпадает с нулём, отношение равно $0$, и $\mathrm{ReLU}'(x) = 0$.
В точке $x = 0$ (где $\mathrm{ReLU}(0)=0$) смотрим односторонние:
$$f'_+(0) = \lim_{h \to 0^+} \frac{h - 0}{h} = 1, \qquad f'_-(0) = \lim_{h \to 0^-} \frac{0 - 0}{h} = 0.$$Единица не равна нулю — производной в нуле не существует. Это классический излом: функция непрерывна (обе ветки дают ноль), но не гладкая.
Что делают фреймворки. Формально loss.backward() в этой точке должен был бы падать с ошибкой. Он не падает, потому что реализация просто договаривается о значении: PyTorch и TensorFlow возвращают для производной ReLU в нуле число $0$. Это соглашение, а не математический факт — в документации PyTorch так прямо и написано. Выбор именно нуля прагматичен: он согласуется с формулой $\mathrm{ReLU}'(x) = \mathbb{1}[x > 0]$ и не «оживляет» мёртвые нейроны.
Почему это законно: субградиент. ReLU выпукла, а для выпуклых функций есть замена производной, работающая и в изломах.
Определение (анонс): Число $g$ называется субградиентом выпуклой функции $f$ в точке $x_0$, если для всех $y$ выполнено
$$f(y) \geq f(x_0) + g\,(y - x_0).$$Множество всех таких $g$ называется субдифференциалом $\partial f(x_0)$.
Проверим, какие $g$ годятся для ReLU в нуле. Условие превращается в $\max(0,y) \geq g y$ для всех $y$. При $y > 0$ это $y \geq gy$, то есть $g \leq 1$. При $y < 0$ это $0 \geq gy$, то есть $g \geq 0$. Итого
$$\partial\,\mathrm{ReLU}(0) = [0;\,1].$$Любое число от нуля до единицы — законный «заменитель производной». Фреймворк берёт $0$, но $1$ или $0{,}5$ были бы не менее обоснованны, и на обучении это практически не сказывается. Строгая теория субградиентных методов — урок 290 в ML-курсе.
А насколько это вообще важно на практике? Для ReLU — почти неважно: попасть предактивацией ровно в $0{,}0$ в арифметике с плавающей точкой почти невозможно, это событие нулевой вероятности. А вот там, где излом попадает в точку минимума, всё серьёзнее. Возьми MAE-лосс $L(\hat y) = |y - \hat y|$: его минимум находится ровно в изломе, при $\hat y = y$. Производная там не существует, а односторонние равны $-1$ и $+1$ — то есть градиентный спуск возле оптимума не затухает, а начинает скакать через минимум с постоянной амплитудой $\text{lr}$. Лечится это либо убыванием скорости обучения, либо сглаживанием функции потерь: Huber loss склеивает параболу вблизи нуля с модулем вдали, причём склеивает гладко — и излом исчезает (задание 29 — ровно об этом).
Та же логика — за популярностью GELU, SiLU/Swish и softplus: это сглаженные родственники ReLU, у которых производная существует всюду, включая нуль.
Численная производная: конечные разности
Если у функции нет формулы (она задана кодом, симуляцией или таблицей замеров), производную приходится приближать — прямо по определению, только вместо предела берут конкретное маленькое $h$.
Правая (односторонняя) разность: $\quad f'(x) \approx \dfrac{f(x+h) - f(x)}{h}$
Центральная (симметричная) разность: $\quad f'(x) \approx \dfrac{f(x+h) - f(x-h)}{2h}$
Вторая заметно точнее, и это видно на числах. Возьмём $f(x) = x^3$ в точке $x = 1$, где точное значение производной равно $3$.
| $h$ | правая разность | ошибка | центральная разность | ошибка |
|---|---|---|---|---|
| $0{,}1$ | $3{,}31$ | $0{,}31$ | $3{,}01$ | $0{,}01$ |
| $0{,}01$ | $3{,}0301$ | $0{,}0301$ | $3{,}0001$ | $0{,}0001$ |
| $0{,}001$ | $3{,}003001$ | $0{,}003001$ | $3{,}000001$ | $0{,}000001$ |
Закономерность читается сразу: у правой разности ошибка падает пропорционально $h$, у центральной — пропорционально $h^2$. Уменьшил шаг в 10 раз — правая стала точнее в 10 раз, центральная в 100.
Ловушка: меньше $h$ не всегда точнее. Из таблицы напрашивается «возьмём $h = 10^{-15}$ и получим 15 знаков». В реальности выйдет мусор, и вот почему. Числа float64 хранят примерно 16 значащих цифр (машинное эпсилон $\varepsilon \approx 2{,}2 \cdot 10^{-16}$). При крошечном $h$ значения $f(x+h)$ и $f(x)$ совпадают в первых пятнадцати цифрах, и при вычитании эти цифры взаимно уничтожаются — остаётся разность, состоящая в основном из ошибки округления. Это называется катастрофическим сокращением.
Итоговая ошибка складывается из двух конкурирующих частей:
$$\text{полная ошибка} \;\approx\; \underbrace{C \cdot h}_{\text{ошибка метода}} \;+\; \underbrace{\frac{2\varepsilon |f(x)|}{h}}_{\text{ошибка округления}}.$$Первое слагаемое растёт с $h$, второе — падает. Сумма минимальна где-то посередине, и по неравенству о среднем арифметическом и среднем геометрическом минимум достигается при $h \sim \sqrt{\varepsilon} \approx 1{,}5 \cdot 10^{-8}$ для правой разности и при $h \sim \sqrt[3]{\varepsilon} \approx 6 \cdot 10^{-6}$ для центральной. Отсюда практическое правило: не уменьшай шаг ниже $10^{-8}$, лучше всего работает $h$ порядка $10^{-5}\!-\!10^{-6}$ с центральной разностью.
Где это реально применяется в ML. Численная производная — стандартный инструмент проверки, gradient check: пишешь свой слой, считаешь градиент аналитически, потом считаешь центральной разностью и сравниваешь. Совпало с относительной погрешностью $10^{-7}$ — реализация верна. Если бы численный расчёт был удобен сам по себе, никакого автодиффа бы не понадобилось — но он неудобен катастрофически: чтобы получить градиент по $n$ параметрам, нужно $2n$ вычислений функции. Для модели со ста миллионами параметров это двести миллионов прогонов сети вместо одного. Именно поэтому численный градиент — только для отладки на игрушечных размерах.
⚠️ Отдельная ловушка: центральная разность врёт в изломах. Для $f(x) = |x|$ в нуле она даёт $\frac{|h| - |-h|}{2h} = \frac{h - h}{2h} = 0$ при любом $h$ — красивый уверенный ноль там, где производной вообще не существует. Численный метод не умеет отличать «производная равна нулю» от «производной нет».
Почему автодифференцирование считает точно
Способов получить производную ровно три, и они принципиально разные.
1. Символьное дифференцирование (SymPy, Wolfram Mathematica). Преобразует формулу в формулу по правилам алгебры. Точно, но формулы разрастаются взрывообразно: производная умеренного выражения после нескольких применений правил превращается в километровую конструкцию. Для нейросети с сотней слоёв это неприменимо в принципе.
2. Численное дифференцирование (конечные разности). Не требует формулы вообще, но даёт приближение с ошибкой, страдает от катастрофического сокращения и требует $O(n)$ вычислений на $n$ параметров.
3. Автоматическое дифференцирование (PyTorch, JAX, TensorFlow). И это не компромисс между первыми двумя, а третий, отдельный подход.
Идея такая. Любое вычисление в компьютере — это цепочка элементарных операций: сложение, умножение, возведение в степень, экспонента, максимум. Для каждой из них производная известна точно — она либо посчитана по определению (как мы делали выше), либо взята из таблицы уроков 136–138. Автодифф не выводит общую формулу для всей функции и не подставляет никакое $h$. Он идёт по графу вычислений, на каждом узле применяет точное правило к конкретным числам и передаёт результат дальше по цепочке.
Результат — то же самое число, которое дала бы точная формула, вычисленное с обычной для float64 точностью в 15–16 знаков. Никакого $h$, никакого приближения, никакого катастрофического сокращения. Отсюда и ответ на вопрос из заголовка: автодифф точен потому, что он применяет правила дифференцирования, а не аппроксимирует определение.
Второе его свойство ещё важнее для практики. В обратном режиме (reverse mode) один проход по графу в обратном направлении даёт производные сразу по всем входам, а стоит он примерно столько же, сколько прямое вычисление функции — независимо от числа параметров. Сравни с $2n$ прогонами у численного метода: для модели с $10^8$ параметрами разница между «полсекунды» и «неделя». Именно этот обратный режим в 1970 году описал Сеппо Линнайнмаа, а в 1986-м его переоткрыли как «обратное распространение ошибки». Каждый loss.backward() — это он.
Есть, конечно, и тонкость, о которой ты уже знаешь: там, где производная не существует (ReLU в нуле, abs, max, clip), автодифф возвращает не производную, а согласованное значение из субдифференциала. Точно — но по договорённости.
Куда это ведёт: касательная, скорость и градиент
Три больших смысла производной ждут в ближайших уроках, и каждый заслуживает отдельного разговора.
Геометрический смысл (урок 134). Разностное отношение — угловой коэффициент секущей через точки $(x_0; f(x_0))$ и $(x_0+h; f(x_0+h))$. Когда $h$ стремится к нулю, вторая точка наезжает на первую, и секущая поворачивается к предельному положению — касательной. Так что $f'(x_0)$ — это тангенс угла наклона касательной, а уравнение самой касательной получается в одну строчку. Оттуда же станет понятно, почему излом у $|x|$ — это ровно «две разные касательные слева и справа», а вертикальная касательная означает отсутствие углового коэффициента.
Физический смысл (урок 135). Если $s(t)$ — координата тела в момент $t$, то разностное отношение — средняя скорость на промежутке, а её предел — мгновенная скорость, та самая, что на спидометре. Дальше по цепочке: производная скорости — ускорение, производная заряда — сила тока, производная массы прореагировавшего вещества — скорость реакции. Ровно ради этого Ньютон всё и затевал.
Градиент (анонс). Функция потерь нейросети зависит не от одной переменной, а от миллионов весов сразу: $L(w_1, w_2, \dots, w_n)$. Для каждого веса можно взять частную производную $\frac{\partial L}{\partial w_i}$ — это в точности наше определение, только все остальные веса при этом заморожены как константы. Собрав все частные производные в один вектор, получаем градиент:
$$\nabla L = \left(\frac{\partial L}{\partial w_1},\ \frac{\partial L}{\partial w_2},\ \dots,\ \frac{\partial L}{\partial w_n}\right).$$Каждая компонента отвечает на вопрос «на сколько изменится ошибка, если чуть-чуть подвинуть именно этот вес», а шаг обучения w -= lr * grad двигает все веса против градиента. Многомерная теория — университетские уроки 210 и 212, сам градиентный спуск — урок 285. Но математическое ядро у всего этого одно и то же: предел разностного отношения, который ты разобрал сегодня.
Практика: 30 заданий
Базовые (задания 1-10)
Задание 1: Найди по определению производную функции $f(x) = 7$.
Задание 2: Найди по определению $f'(2)$ для $f(x) = 5x - 3$.
Задание 3: Найди по определению $f'(3)$ для $f(x) = x^2$.
Задание 4: Для $f(x) = x^3$ найди приращение функции $\Delta y$ и разностное отношение в точке $x_0 = 1$ при $\Delta x = 0{,}01$. Сравни с точным значением производной.
Задание 5: Найди по определению производную функции $f(x) = x^2 - 4x + 1$ и вычисли $f'(1)$.
Задание 6: Скорость обучения меняется по закону $\eta(t) = \dfrac{1}{t}$, где $t$ — номер эпохи. Найди по определению, с какой скоростью убывает $\eta$ на эпохе $t = 2$.
Задание 7: Найди по определению $f'(9)$ для $f(x) = \sqrt{x}$.
Задание 8: Найди по определению $f'(-1)$ для $f(x) = x^3$.
Задание 9: Функция потерь одного параметра: $L(w) = (w - 3)^2$. Найди по определению $L'(w)$, вычисли $L'(5)$ и укажи, в какую сторону градиентный спуск сдвинет вес.
Задание 10: Докажи, что функция $f(x) = |x|$ не имеет производной в точке $x_0 = 0$.
Средние (задания 11-20)
Задание 11: Докажи по определению, что для любой линейной функции $f(x) = ax + b$ производная равна $a$ в каждой точке.
Задание 12: Найди по определению производную функции $f(x) = \dfrac{1}{x^2}$ при $x \neq 0$ и вычисли $f'(1)$.
Задание 13: Найди по определению $f'(3)$ для $f(x) = \sqrt{x+1}$.
Задание 14: Исследуй на дифференцируемость в точке $x_0 = 1$ функцию
$$f(x) = \begin{cases} x^2, & x \leq 1,\\ 2x - 1, & x > 1.\end{cases}$$Задание 15: Докажи, что функция $f(x) = x|x|$ дифференцируема в нуле, и найди $f'(0)$.
Задание 16: Найди односторонние производные функции $f(x) = |x - 2|$ в точке $x_0 = 2$ и сделай вывод о дифференцируемости.
Задание 17: Для $f(x) = x^2$ в точке $x = 1$ посчитай правую и центральную конечные разности с шагом $h = 0{,}001$. Сравни с точным значением производной и объясни результат.
Задание 18: Найди производную $\mathrm{ReLU}(x) = \max(0,x)$ во всех точках, где она существует, и разберись с точкой $x = 0$.
Задание 19: Найди по определению производную функции $f(x) = x^3 - 3x$ и определи, при каких $x$ она обращается в ноль.
Задание 20: Докажи, что функция
$$f(x) = \begin{cases} x, & x < 0,\\ x + 1, & x \geq 0\end{cases}$$не дифференцируема в нуле — двумя способами: ссылкой на теорему и прямым расчётом.
Продвинутые (задания 21-30)
Задание 21: Покажи, что функция $f(x) = \sqrt{x}$ не имеет производной в точке $x_0 = 0$, хотя определена и непрерывна там справа.
Задание 22: Исследуй на дифференцируемость в нуле функцию $f(x) = \sqrt[3]{x}$.
Задание 23: Докажи, что функция
$$f(x) = \begin{cases} x \sin\frac{1}{x}, & x \neq 0,\\ 0, & x = 0\end{cases}$$непрерывна в нуле, но не дифференцируема там.
Задание 24: Для функции
$$g(x) = \begin{cases} x^2 \sin\frac{1}{x}, & x \neq 0,\\ 0, & x = 0\end{cases}$$докажи, что $g'(0)$ существует, и найди её.
Задание 25: Найди по определению производную функции $f(x) = x^4$.
Задание 26: Найди по определению производную функции $f(x) = \dfrac{1}{\sqrt{x}}$ при $x > 0$ и вычисли $f'(4)$.
Задание 27: При каких $a$ и $b$ функция
$$f(x) = \begin{cases} x^2, & x \leq 1,\\ ax + b, & x > 1\end{cases}$$дифференцируема в точке $x_0 = 1$?
Задание 28: В арифметике float64 машинное эпсилон равно $\varepsilon \approx 2{,}2\cdot 10^{-16}$. Полная ошибка правой разности для $f(x)=x^2$ в точке $x=1$ оценивается как $E(h) \approx h + \dfrac{2\varepsilon}{h}$. Найди шаг $h$, при котором ошибка минимальна, и саму минимальную ошибку. Объясни, почему $h = 10^{-15}$ — плохая идея.
Задание 29: Huber loss с параметром $\delta = 1$ задаётся формулой
$$L(x) = \begin{cases} \dfrac{x^2}{2}, & |x| \leq 1,\\[4pt] |x| - \dfrac12, & |x| > 1.\end{cases}$$Проверь по определению, дифференцируема ли она в точке $x = 1$, и сравни поведение в нуле с MAE-лоссом $|x|$.
Задание 30: Докажи по определению, что для натурального $n$ производная функции $f(x) = x^n$ равна $n x^{n-1}$.
Частые ошибки
❌ Ошибка 1: подставляют $h = 0$ сразу, не упростив дробь
Неправильно: записать $f'(2) = \frac{f(2+0) - f(2)}{0} = \frac{0}{0}$ и объявить это «нулём» или «единицей».
Правильно: сначала выполнить шаги 1–3 алгоритма — раскрыть приращение и сократить $h$ в знаменателе. Только после того как знаменатель исчез, подстановка $h=0$ становится законной.
💡 Почему важно: $\frac{0}{0}$ — не число, а неопределённость: в зависимости от функции предел может оказаться нулём, четвёркой, минус бесконечностью или не существовать вовсе. Вся техника вычисления производной по определению — это ровно техника раскрытия этой неопределённости.
❌ Ошибка 2: считают, что непрерывность гарантирует производную
Неправильно: «график сплошной, без разрывов — значит функция дифференцируема».
Правильно: импликация работает только в одну сторону. Дифференцируемость $\Rightarrow$ непрерывность; обратное неверно, и контрпример живёт в каждой второй нейросети — это $|x|$ и ReLU.
💡 Почему важно: непрерывность запрещает разрывы, дифференцируемость запрещает ещё и изломы. Не заметив разницы, легко «продифференцировать» MAE-лосс в его минимуме и потом полдня искать, почему обучение не сходится, а болтается вокруг ответа.
❌ Ошибка 3: путают среднюю скорость и производную
Неправильно: «за 4 дня прибавилось 800 пользователей, значит производная равна 200».
Правильно: $200$ — это разностное отношение на конкретном отрезке, средняя скорость. Производная — это предел таких отношений при стягивании отрезка в точку, и она может отличаться от средней сколь угодно сильно.
💡 Почему важно: на нелинейной функции средняя скорость по большому интервалу — грубое приближение мгновенной. Для $f(x)=x^2$ на отрезке $[0;10]$ средняя скорость равна $10$, а мгновенная меняется от $0$ до $20$. Прогноз, построенный на средней скорости, промахивается ровно там, где интереснее всего.
❌ Ошибка 4: проверяют предел только с одной стороны
Неправильно: посчитать разностное отношение при $h > 0$, получить конечное число и объявить его производной.
Правильно: предел в определении — двусторонний. Обязательно нужно, чтобы левый и правый пределы существовали и совпадали.
💡 Почему важно: ровно эта ошибка делает $|x|$ «дифференцируемой в нуле с производной $1$». Для любой кусочно-заданной функции, и вообще для любой точки, где формула меняется, односторонние производные надо считать раздельно — это не перестраховка, а единственный корректный способ.
❌ Ошибка 5: путают $f'(x_0)$ и $\big(f(x_0)\big)'$
Неправильно: для $f(x)=x^2$ написать «$f'(2) = (f(2))' = (4)' = 0$».
Правильно: сначала находим производную функцию $f'(x) = 2x$, и только потом подставляем точку: $f'(2) = 4$. Подстановка идёт после дифференцирования, никогда не до.
💡 Почему важно: $f(2)$ — это число, а у числа производная действительно нулевая. Смешав порядок операций, получаешь ноль в любой задаче — и, что хуже, ноль выглядит правдоподобно. В коде эта же ошибка выглядит как дифференцирование по переменной, значение которой уже подставлено и оторвано от графа вычислений (.detach() не там, где надо).
❌ Ошибка 6: считают, что «производная бесконечна» — это ответ
Неправильно: для $f(x)=\sqrt[3]{x}$ написать $f'(0) = +\infty$.
Правильно: определение требует конечного предела. Если разностное отношение уходит в бесконечность, правильная формулировка — «производной в этой точке не существует», а бесконечность лишь описывает характер поведения (вертикальная касательная).
💡 Почему важно: конечность производной — то, на чём держится доказательство теоремы о непрерывности (там произведение $f'(x_0)\cdot 0$ обязано быть нулём). Разреши бесконечные производные — и половина теорем анализа перестанет работать.
❌ Ошибка 7: думают, что чем меньше $h$, тем точнее численная производная
Неправильно: взять $h = 10^{-14}$ в float64, «чтобы поточнее».
Правильно: оптимум для правой разности — около $\sqrt{\varepsilon} \approx 10^{-8}$, для центральной — около $\sqrt[3]{\varepsilon} \approx 10^{-6}$. Дальнейшее уменьшение шага ухудшает результат.
💡 Почему важно: математическая ошибка метода падает с $h$, а вычислительная ошибка округления растёт как $1/h$. Игнорируя вторую, получаешь численный градиент, который в gradient check «не сходится» с аналитическим, — и начинаешь искать несуществующий баг в правильно написанном слое.
❌ Ошибка 8: считают, что раз односторонние производные существуют, то производная есть
Неправильно: «$f'_-(0) = 0$ и $f'_+(0) = 1$ — обе существуют, значит функция дифференцируема».
Правильно: нужно и существование, и равенство. У ReLU обе односторонние конечны, но различаются — производной нет.
💡 Почему важно: это точка, где математика и практика расходятся сознательно. Фреймворк вернёт для ReLU в нуле число $0$ — но это выбранный из субдифференциала $[0;1]$ элемент, а не производная. Знать разницу нужно, чтобы не удивляться, когда разные библиотеки в такой точке дают разные ответы.
Главное запомнить
📝 Ключевые понятия
✅ Приращения: $\Delta x = x - x_0$ — приращение аргумента, $\Delta y = f(x_0 + \Delta x) - f(x_0)$ — приращение функции. Символ $\Delta x$ неделим, сокращать «дельты» в дроби нельзя.
✅ Разностное отношение $\dfrac{\Delta y}{\Delta x}$ — средняя скорость изменения функции на отрезке. Определено при любом $\Delta x \neq 0$, зависит от выбора отрезка, имеет размерность «единицы выхода на единицу входа».
✅ Определение производной: $f'(x_0) = \lim\limits_{h \to 0} \dfrac{f(x_0+h) - f(x_0)}{h}$, эквивалентно $\lim\limits_{x \to x_0} \dfrac{f(x) - f(x_0)}{x - x_0}$. Предел обязан существовать и быть конечным.
✅ Алгоритм «по определению» из 4 шагов: записать приращение → упростить (всё без $h$ сокращается) → избавиться от $h$ в знаменателе (вынесение, общий знаменатель, сопряжённое) → перейти к пределу.
✅ Шесть производных, добытых вручную: $(C)' = 0$, $(x)' = 1$, $(x^2)' = 2x$, $(x^3)' = 3x^2$, $\left(\frac1x\right)' = -\frac{1}{x^2}$, $(\sqrt x)' = \frac{1}{2\sqrt x}$. Все укладываются в схему $n x^{n-1}$ — общее доказательство и таблица будут в уроке 138.
✅ Обозначения: $f'(x)$ и $y'$ (Лагранж), $\frac{dy}{dx}$ и $\frac{\partial L}{\partial w}$ (Лейбниц), $\dot x$ (Ньютон, по времени), $Df$ (Эйлер). На этом этапе $\frac{dy}{dx}$ — единый символ, а не дробь.
✅ $f'(x_0)$ — число, $f'$ — функция. Область определения производной может быть уже области определения функции ($\sqrt x$ определён при $x \geq 0$, а её производная — только при $x > 0$).
✅ Односторонние производные: $f'_\pm(x_0)$ — пределы разностного отношения при $h \to 0^\pm$. Производная существует ⟺ обе односторонние существуют и равны.
✅ Теорема: дифференцируемость в точке влечёт непрерывность в ней. Доказательство — тождество $\Delta y = \frac{\Delta y}{h}\cdot h \to f'(x_0)\cdot 0 = 0$. Контрапозиция: разрыв ⟹ производной нет.
✅ Обратное неверно: $|x|$ непрерывна в нуле, но не дифференцируема ($f'_- = -1$, $f'_+ = 1$). Непрерывность запрещает разрывы, дифференцируемость — ещё и изломы.
✅ Производной нет в пяти ситуациях: излом ($|x|$), вертикальная касательная ($\sqrt[3]{x}$), точка возврата ($\sqrt{|x|}$), разрыв ($\lfloor x\rfloor$), бесконечное колебание ($x\sin\frac1x$).
✅ ReLU в нуле: $f'_-(0) = 0$, $f'_+(0) = 1$, производной нет; субдифференциал равен $[0;1]$, фреймворки по соглашению берут $0$.
✅ Численная производная: правая разность — ошибка $\sim h$, центральная — $\sim h^2$; уменьшать $h$ ниже $10^{-8}$ вредно из-за катастрофического сокращения. Автодифф не приближает, а применяет точные правила к конкретным числам — отсюда его точность и стоимость $O(1)$ прогонов на любое число параметров.
Связь с другими темами курса
Что нужно было знать до этого урока:
- Урок 131, предел функции — фундамент всего. Производная определена как предел, и без понимания того, что предел не требует определённости функции в самой точке, определение производной выглядит как жульничество. Оттуда же взяты теорема о пределе произведения (использована в доказательстве теоремы о непрерывности), критерий через односторонние пределы и теорема о зажатой функции (задание 24).
- Урок 132, непрерывность функции — второй опорный камень. Он даёт язык «приращение функции стремится к нулю вместе с приращением аргумента» и позволяет в шаге 4 алгоритма спокойно подставлять $h=0$ в непрерывные выражения. Плюс именно с непрерывностью производная связана теоремой, которую мы доказали.
- Уроки 76–90 про функции — область определения, кусочное задание, модуль, преобразования графиков. Без них не разобрать точки склейки.
- Алгебра 7–9 класса — формулы сокращённого умножения, куб суммы, домножение на сопряжённое, разложение $x^n - x_0^n$. Вся техника вычисления по определению держится на них.
Что изучить дальше:
- Урок 134, геометрический смысл — разностное отношение как угловой коэффициент секущей, предельный переход к касательной, уравнение касательной. Там же станет наглядно видно, почему излом и вертикальная касательная убивают производную.
- Урок 135, физический смысл — мгновенная скорость, ускорение, сила тока, скорость реакции. Историческая мотивация Ньютона в чистом виде.
- Уроки 136–138 — правила дифференцирования (сумма, произведение, частное), производная сложной функции и таблица производных элементарных функций. Всё это выводится из сегодняшнего определения, и после этих уроков считать через предел уже не придётся.
- Уроки 139–144 — исследование функций производной: монотонность, экстремумы, наибольшие и наименьшие значения, выпуклость, построение графиков.
- Университетский блок — дифференциал (187), производные высших порядков (188), теоремы Ролля, Лагранжа и Коши (189–191), правило Лопиталя (192), ряд Тейлора (194), частные производные (210) и градиент (212).
Где это нужно в жизни:
💻 В программировании: автодифференцирование (autograd в PyTorch, jax.grad), численные методы решения уравнений, физические движки в играх (интегрирование движения), контроллеры и ПИД-регуляторы, чувствительность метрик к параметрам.
🤖 В ML/AI: градиентный спуск и все его вариации, обратное распространение ошибки, выбор функций активации по критерию дифференцируемости (ReLU против GELU), сглаженные функции потерь (Huber вместо MAE), субградиентные методы для негладких задач, gradient check при отладке слоёв, анализ затухающих и взрывающихся градиентов.
📊 В Data Science: скорость изменения метрик, эластичность спроса (производная спроса по цене), сглаживание и дифференцирование временных рядов, детекция точек перелома тренда, оценка чувствительности модели к признакам.
🔬 В науке и инженерии: мгновенная скорость и ускорение, сила тока как производная заряда, скорость химической реакции, теплопередача, скорость распада, любые дифференциальные уравнения — то есть практически вся количественная физика.
💰 В финансах: «греки» опционов (дельта — это в точности производная цены опциона по цене базового актива), мгновенная доходность, дюрация облигаций, предельные издержки и предельная выручка в экономике.
Интересные факты
💡 Беркли назвал производные «призраками почивших величин». В 1734 году епископ Джордж Беркли выпустил памфлет «Аналитик, или Рассуждение, адресованное неверующему математику», где разнёс логику Ньютона и Лейбница в пух и прах: если приращение не ноль — на него можно делить, но ответ приблизительный; если ноль — деление незаконно. Возразить по существу математики смогли лишь через 87 лет, когда Коши в 1821 году определил производную через предел. Критика оказалась настолько полезной, что фактически создала современный математический анализ.
💡 Существует функция, непрерывная всюду и не дифференцируемая нигде. Вейерштрасс предъявил её в 1872 году, и математическое сообщество было в ужасе: до этого считалось, что непрерывная функция обязана быть гладкой «почти везде». Шарль Эрмит писал Стилтьесу, что «с ужасом и отвращением отворачивается от этой прискорбной язвы функций, не имеющих производных». Сегодня выяснилось, что таких функций подавляющее большинство: в пространстве всех непрерывных функций дифференцируемые образуют исчезающе малое множество. А их графики — фракталы, и на подобных моделях считают броуновское движение и волатильность рынков.
💡 Спор о приоритете стоил английской математике целого века. Ньютон и Лейбниц пришли к производной независимо, но Королевское общество в 1712 году (под председательством самого Ньютона) объявило Лейбница плагиатором. Из принципа англичане столетие писали флюксии точками $\dot x$ вместо удобных дробей $\frac{dy}{dx}$ — и безнадёжно отстали от континентальной школы Эйлера и Бернулли. Обозначение, из-за которого разгорелся конфликт, победило: сегодня все пишут по Лейбницу.
💡 Обратное распространение ошибки описали в магистерской диссертации в 1970 году. Финский студент Сеппо Линнайнмаа изложил обратный режим автоматического дифференцирования — тот самый алгоритм, что стоит за loss.backward(), — за шестнадцать лет до знаменитой статьи Румельхарта, Хинтона и Уильямса 1986 года, популяризовавшей backprop для нейросетей. О работе Линнайнмаа сообщество вспомнило только в 2010-х, когда историю алгоритма стали копать всерьёз.
💡 Производная ReLU в нуле — это соглашение разработчиков, а не математика. С точки зрения определения её там нет. PyTorch и TensorFlow возвращают $0$, но любое число из отрезка $[0;1]$ было бы столь же законным субградиентом. Аналогично для torch.abs: в нуле возвращается $0$, хотя производной не существует. Практически это ни на что не влияет — попасть в точный ноль в арифметике с плавающей точкой почти невозможно.
Лайфхаки и полезные трюки
1. Не «вспоминай формулу», а запускай алгоритм из четырёх шагов
Когда в задании написано «по определению», не пытайся угадать ответ по таблице. Механически: приращение → упрощение → деление на $h$ → предел. Шаг 3 — единственный творческий, и способов там ровно три (см. следующий лайфхак).
Пример: для $f(x)=x^2+5x$ сразу пишешь $\Delta y = 2xh + h^2 + 5h = h(2x + h + 5)$ и получаешь $f'(x)=2x+5$ за две строчки.
2. Все задачи «по определению» сводятся к одному: убить $h$ в знаменателе
Приёмов ровно три, и они привязаны к типу функции:
- Многочлен — раскрой скобки и вынеси $h$ за скобку.
- Дробь — приведи числитель к общему знаменателю, $h$ вылезет сам.
- Корень — домножь на сопряжённое.
Пример: увидел $\sqrt{x+7}$ — сразу пишешь $\big(\sqrt{x+h+7}-\sqrt{x+7}\big)\cdot\frac{\sqrt{x+h+7}+\sqrt{x+7}}{\sqrt{x+h+7}+\sqrt{x+7}}$ и получаешь в числителе чистое $h$.
3. Всё, что не содержит $h$, обязано сократиться — это встроенная проверка
В приращении $\Delta y = f(x+h)-f(x)$ слагаемые, не содержащие $h$, всегда взаимно уничтожаются. Если после раскрытия скобок у тебя остался член без $h$ — ищи арифметическую ошибку, дальше считать бессмысленно.
Пример: в $\big[(x+h)^2-4(x+h)+1\big]-\big[x^2-4x+1\big]$ обязаны исчезнуть $x^2$, $-4x$ и $+1$. Остаётся $2xh+h^2-4h$ — всё в порядке.
4. Проверяй ответ центральной разностью с $h = 10^{-5}$
Посчитал производную аналитически — подставь конкретное число и сравни с $\frac{f(x+h)-f(x-h)}{2h}$. Три-четыре совпавших знака означают, что формула верна. Это же ровно то, что делает gradient check при отладке нейросетевых слоёв.
Пример: $f(x)=\frac{1}{x}$, $f'(2)=-0{,}25$. Численно: $\frac{1/2{,}00001 - 1/1{,}99999}{0{,}00002} \approx -0{,}25000$ ✅
5. В любой точке склейки сначала непрерывность, потом производные
Для кусочно-заданной функции порядок жёсткий: приравнял значения веток в точке стыка → если не сошлись, ответ «производной нет», конец; если сошлись — считаешь односторонние производные и сравниваешь.
Пример: в задании 27 условие $a+b=1$ (непрерывность) появилось раньше условия $a=2$ (гладкость), и без первого второе бессмысленно.
6. Осторожно: центральная разность врёт в изломах
Для $f(x)=|x|$ в нуле симметричная разность даёт $\frac{|h|-|-h|}{2h}=0$ при любом $h$ — уверенный красивый ноль там, где производной вообще не существует. Численный метод не отличает «производная равна нулю» от «производной нет».
Пример: если gradient check на функции с abs, max или clip выдаёт подозрительно гладкие нули — проверь точку на излом аналитически, а не численно.
7. Форма $x \to x_0$ удобнее, когда числитель раскладывается на множители
Определение через $h$ хорошо для раскрытия скобок, но если в числителе стоит разность одинаковых конструкций ($x^n - x_0^n$, $x^3 - 8$, $\sqrt x - \sqrt{x_0}$), вторая форма короче: раскладываешь на множители, сокращаешь $(x-x_0)$ и подставляешь.
Пример: задание 30 в форме с $h$ потребовало бы бинома Ньютона, а через $x \to x_0$ решается разложением разности степеней в четыре строки.
8. Помни про размерность — она ловит ошибки в прикладных задачах
Производная пути по времени — метры в секунду. Производная лосса по весу — «единиц ошибки на единицу веса». Если в задаче ответ получился в странных единицах, где-то перепутаны числитель и знаменатель разностного отношения.
Пример: «скорость роста аудитории» — это пользователи делить на дни; если получилось «дни на пользователя», дробь перевёрнута.
💡 Совет: возьми любые пять функций — хоть $3x-7$, хоть $x^2+\frac1x$, хоть $\sqrt{2x+1}$ — и посчитай их производные по определению, честно, с приращением и пределом, не заглядывая в таблицы. Это займёт полчаса и окупится многократно. Через три урока у тебя будут правила дифференцирования, и производная $x^{17}\sqrt{x}\ln x$ станет вопросом двадцати секунд — но люди, которые пришли к правилам через определение, и люди, которые выучили таблицу, ведут себя по-разному в первой же нестандартной ситуации. Когда в модели встретится кусочная функция потерь, негладкая активация или странная точка, где градиент почему-то не считается, — тебе понадобится не таблица, а именно определение: приращение, разностное отношение, односторонние пределы.
Ты только что построил центральное понятие всего математического анализа — и построил его руками, из предела и алгебры, без единой готовой формулы. Дальше начинается самое интересное: в уроке 134 производная обретёт геометрию (касательная и её угловой коэффициент), в уроке 135 — физику (мгновенная скорость), а в уроках 136–138 превратится в быстрый инструмент, которым можно пользоваться не задумываясь. Но фундамент под всем этим — тот самый предел разностного отношения, который ты сегодня разобрал по косточкам.
Переходи к уроку 134 «Геометрический смысл производной» — там абстрактный предел наконец станет картинкой. 🚀
Понял тему? Закрепи в боте! 🚀
Попрактикуйся на задачах и получи персональные рекомендации от AI
💪 Начать тренировку