Что такое производная: наклон, предел, цепное правило — интерактивно
Производная функции в точке — это число
Словами: насколько быстро меняется выход на единицу изменения входа, если мерить так близко к , что значение имеет только локальное поведение .
У того же числа есть второе прочтение, и оно полезнее первого. При малых
Вблизи функция ведёт себя как прямая с наклоном — касательная. Всё на этой странице — одна и та же прямая, прочитанная с разных сторон: касательная — её изображение, конечные разности её оценивают, цепное правило переносит её на композиции функций, обратное распространение ошибки вычисляет её сразу для миллионов входов, а градиентный спуск по ней спускается вниз.
Маршрут повторяет первую лекцию курса Андрея Карпаты Neural Networks: Zero to Hero, где построение нейросети с нуля начинается именно с производной. Каждая панель ниже живая: измените что-нибудь — и числа пересчитаются; ни одно из них не вписано вручную.
В лекции используется парабола . На этой странице вместо неё нарочно неровная кривая: её наклон меняет величину и знак от места к месту, и впадин, в которые можно скатиться, больше одной:
У одной точки нет наклона
Через одну точку кривой проходит бесконечно много прямых. Какая из них «имеет наклон кривой»?
Тащите точку по кривой и поворачивайте прямую за круглую ручку. Издалека подходящими выглядят многие прямые. Врезка показывает маленькое окно вокруг точки под лупой, и там разница видна: неверная прямая при любом увеличении продолжает пересекать кривую под углом, а одна прямая с кривой сливается. Эта прямая и есть касательная, а её наклон равен .
Волнистая кривая с отмеченной точкой и проходящей через неё прямой, наклон которой задаёт читатель; врезка показывает точку под лупой: неверная прямая пересекает кривую под углом, и только касательная с ней сливается.
Легенда измеряет то, что видно в лупе: зазор между кривой и прямой, делённый на расстояние от точки, при , и . При горизонтальная прямая даёт — отношение подбирается к и там остаётся, и любой другой неверный наклон так же застревает на своей ошибке. Поверните прямую до наклона — и те же три числа станут : в десять раз меньше при каждом десятикратном увеличении. Сдвиньте точку: наклон, который только что подходил, больше не подходит. Производная — не одно число на всю кривую, а новое число в каждой точке.
Почему прямая ровно одна? Разложим кривую в окрестности . Зазор между ней и прямой с наклоном в расчёте на единицу расстояния равен
При уменьшении исчезает всё, кроме первого слагаемого. Любая ошибка наклона переживает увеличение; только позволяет отношению уйти в ноль. Именно это, а не «прямая, которая касается кривой в одной точке», и есть касательная: прямая может коснуться кривой один раз и всё равно её пересечь, а касательная может кривую пересекать (в точке перегиба так и происходит).
От секущей к касательной: предел
Одна точка наклона не даёт, поэтому возьмём вторую. Точки и задают прямую — секущую, и её наклон равен отношению катетов оранжевого треугольника:
Это тангенс угла наклона секущей к горизонтали, , — подъём, делённый на смещение.
Теперь тащите вторую точку к первой. Ползунок делает то же самое: его правый край — всегда край графика, левый — один пиксель, при любом масштабе. По мере уменьшения секущая поворачивается, пока не ляжет на касательную.
Кривая с точкой x и второй точкой x + h, соединёнными секущей; при уменьшении h секущая поворачивается к пунктирной касательной, а при увеличении масштаба кривая становится неотличимой от прямой.
При истинный наклон равен . Секущая приближается к нему шаг за шагом:
| шаг | наклон секущей | ошибка |
|---|---|---|
| 1 | 6.6 | |
| 0.1 | 0.86 | |
| 0.01 | 0.084 | |
| 0.001 | 0.0084 |
При у секущей даже неверный знак: она перепрыгивает через гребень сразу за . Каждое следующее уменьшение в десять раз уменьшает ошибку в десять раз.
Теперь приблизьте — ползунком масштаба или щипком на трекпаде. Вторая точка остаётся на своём месте на экране, так что уменьшается вместе с окном, а кривая под ней распрямляется: секущая ложится на касательную, хотя никто не трогал. При тысячной доле исходной ширины кривую уже не отличить от касательной. Именно поэтому предел вообще существует: гладкая функция локально линейна. Производная — наклон этой локальной прямой.
Производная как функция
Раз у каждой точки свой наклон, производная сама является функцией: . Напрямую через предел её вычисляют редко. Достаточно нескольких правил, каждое из которых один раз доказывается из определения:
- производная суммы равна сумме производных: ;
- постоянный множитель выносится: ;
- степени: ;
- произведение: ;
- ;
- — функция, которая сама себе наклон (такие только она и её кратные );
- цепное правило для композиции: .
Вместе они дают — активацию первого нейрона в лекции: по правилам . Этот наклон равен в нуле и затухает к с ростом , поэтому нейрон, загнанный глубоко в насыщение, почти не учится: любой пришедший к нему градиент умножается почти на ноль.
Для нашей кривой цепное правило превращает в , а остальное дифференцируется почленно:
Именно по этой формуле построены пунктирные касательные на этой странице.
Там, где , касательная горизонтальна. На показанном отрезке это происходит 7 раз; где меняет знак с минуса на плюс, у кривой локальный минимум — самый глубокий при , где , — а где с плюса на минус, локальный максимум.
Не у всякой функции производная есть всюду. У наклон слева от и справа; у секущей в нет единого предела, поэтому там не дифференцируема. У функции активации ReLU, , такой же излом, и библиотеки для нейросетей просто договариваются использовать там .
Приблизьте излом и убедитесь сами. Панель проводит из точки две секущие, влево и вправо, и привязано к масштабу. На гладкой кривой приближение распрямляет картинку, и две секущие складываются в одну прямую. В изломе картинка не меняется никогда: при любом увеличении это та же галочка, левая секущая остаётся на , правая — на . Единого числа, которым могла бы быть производная, просто нет.
Излом |x| под лупой: левая и правая секущие из x = 0 сохраняют наклоны −1 и +1 при любом увеличении, а на гладкой x² сливаются в одну прямую; для ReLU показан 0, который библиотеки берут в изломе.
Насколько малым брать h на компьютере?
В точной арифметике чем меньше , тем лучше. На компьютере — нет.
Наклон секущей , прямая разность, вычитает два почти равных числа. 64-битное число с плавающей точкой хранит около 16 значащих цифр, поэтому разность теряет столько из них, сколько их общих у и . Оставшаяся ошибка округления затем делится на крошечное .
Две ошибки тянут в противоположные стороны:
- ошибка усечения — кривая не прямая — примерно равна и убывает вместе с ;
- ошибка округления примерно равна , где — точность числа с плавающей точкой, и растёт по мере уменьшения .
Их сумма минимальна около .
Центральная разность берёт точки с обеих сторон. Слагаемые с сокращаются, её ошибка усечения имеет порядок , а наилучшее сдвигается вверх, примерно к .
Панель вычисляет обе формулы в обычной 64-битной арифметике и строит график их ошибки в зависимости от ; ведите по графику, чтобы менять .
График в логарифмическом масштабе по обеим осям: ошибка прямой и центральной разностей для f при x = 3 в зависимости от h; обе ошибки падают с уменьшением h, пока не начинает преобладать округление и они снова не растут; минимум прямой разности — около h = 1e-8, центральной — около 1e-5.
Читайте график справа налево — так, как уменьшается . Сначала обе линии падают с наклонами 1 и 2: каждое уменьшение в десять раз делит ошибку прямой разности на 10, а центральной — на 100. Затем верх берёт округление, и обе линии поворачивают вверх, в шум.
При прямая разность точнее всего при , с ошибкой . Центральная разность достигает при — примерно в 450 раз точнее, при в 1000 раз больше.
При обе оценки равны ровно : ближайшее к число с плавающей точкой — само , поэтому .Поэтому численные производные используют, чтобы проверять аналитические, — это «проверка градиента» центральной разностью с около , — а не чтобы обучать сети: каждая оценка стоит дополнительных вычислений функции на каждый вход, а ответ верен лишь примерно до десяти знаков.
Цепное правило на вычислительном графе
Настоящие формулы — это композиции простых операций. Разобьём
на шаги: , , . Это вычислительный граф.
Прямой проход вычисляет значения слева направо. При : .
Обратный проход отвечает на другой вопрос: насколько изменится , если чуть сдвинуть данный узел? Это производная , которую называют градиентом узла. Значение узла и его градиент — разные числа.
Каждой операции достаточно знать собственную локальную производную:
- для : и ;
- для : — сложение передаёт градиент без изменений;
- для : и — умножение отдаёт каждому входу значение другого.
Скорости вдоль цепочки перемножаются. Лекция берёт пример Джорджа Симмонса: если машина едет вдвое быстрее велосипеда, а велосипед вчетверо быстрее пешехода, то машина быстрее пешехода в раз. Цепное правило точно так же перемножает локальные производные вдоль пути:
Двигайте ползунок обратного прохода: каждое деление обрабатывает одну операцию, справа налево, и подписывает каждое пройденное ребро его локальной производной. Затем потащите любой вход вбок.
Вычислительный граф L = (a·b + c)·s со значением и градиентом каждого узла; ползунок обратного прохода обрабатывает по одной операции, двигаясь от выхода к входам, и подписывает рёбра локальными производными, а перетаскивание входа сравнивает изменение L с предсказанием градиента.
Всё начинается с : сдвиг выхода на меняет его на . В конце , а перетаскивание проверяет их по старинке. Сдвиньте с до — и изменится на , ровно на . Градиент и есть это предсказание: насколько сдвигается выход на единицу сдвига входа. Здесь оно точное, потому что линейна по каждому входу в отдельности; для кривой функции оно верно только для малых сдвигов — в этом и состоит всё содержание формулы .
Теперь сдвиньте все четыре входа сразу. «Шаг по градиенту» прибавляет к каждому входу его собственного градиента, и растёт с до . Градиент предсказывал рост на ; настоящий — . Разница — это произведения входов, и , которые меняются одновременно и которых предсказание первого порядка не видит: линейна по каждому входу в отдельности, но не по всем сразу. Шаг против градиента, наоборот, уменьшил бы — и в этом всё обучение, как покажет последний раздел.
«—», пока проход не дошёл до узла, означает «ещё не вычислено», а это не то же самое, что ноль. Сдвиньте до — и все градиенты левее станут нулевыми, хотя значение ни одного из этих узлов не равно нулю: когда последний множитель равен нулю, ничто выше по графу не может сдвинуть .
Это и есть обратное распространение ошибки (backpropagation). Один обратный проход даёт градиент единственного выхода по каждому узлу ценой небольшой константы, умноженной на стоимость прямого прохода. У сети одна функция потерь и миллионы параметров, и именно из-за этого соотношения её обучают назад, а не вперёд.
Одна переменная, несколько путей: градиенты складываются
А если значение используется больше одного раза? Возьмём
Переменная входит в граф трижды: дважды как вход и один раз в . Каждое использование — отдельный путь к , и каждый путь возвращает свой вклад: с каждой стороны произведения и от второго слагаемого. Цепное правило для функций многих переменных говорит, что производная равна их сумме:
Поэтому движок обратного распространения ошибки пишет grad += ..., а не grad = .... Вторая кнопка воспроизводит ошибку: каждый вклад затирает предыдущий, выживает только последний, и касательная, построенная по такому градиенту, проходит мимо кривой.
Граф L = x·x + k·x, где x доходит до L по трём путям и возвращает три вклада; рядом — кривая L(x) с касательной, построенной по накопленному градиенту; касательная проходит мимо кривой, если вклады перезаписываются, а не складываются.
Перетащите точку в при . Сумма равна нулю, и касательная горизонтальна, но ни один путь не исчез: . Вклады могут взаимно уничтожаться, и нулевой градиент не значит, что от ничего не зависит.
«Накоплением» градиентов называют две разные вещи, и их полезно не путать. Внутри одного обратного прохода вклады обязаны складываться. Между шагами обучения сохранённые градиенты нужно сначала обнулить — иначе градиент предыдущего шага прибавится к новому. Первое — это цепное правило; забыть второе — ошибка.
Порядок тоже важен. Узел может передать свой градиент дальше только после того, как отчитались все его использования, поэтому обратный проход обходит узлы в обратном топологическом порядке.
Зачем нужна производная: градиентный спуск
Знак говорит, в какую сторону растёт. Чтобы спускаться, нужно шагать в противоположную:
Размер шага называется скоростью обучения. Где склон крутой, шаг длинный; у минимума, где , — короткий, и спуск останавливается сам.
Градиентный спуск по волнистой кривой: точка раз за разом шагает против наклона своей касательной, пока в локальном минимуме наклон не станет нулевым; при большой скорости обучения она скачет.
Из при спуск за 20 шагов доходит до самой глубокой впадины, . Перетащите старт (или сдвиньте его ползунок) в — чуть дальше вершины в — и пунктирное превью покажет, как то же правило уводит точку в другую сторону, в более мелкую впадину в . Производная — локальная информация: она знает, где низ здесь, но не знает, где лучшая впадина.
Теперь увеличьте . У минимума в кривизна равна , и спуск сходится, только если . Выше этого порога каждый шаг перелетает дальше, чем исправляет, и точка скачет между стенками впадины, вместо того чтобы остановиться.
Обучение нейросети — тот же самый цикл. превращается в миллионы весов, — в функцию потерь на обучающих данных, — в вектор градиента, а обратное распространение ошибки вычисляет его за один проход. Остальная часть лекции строит ровно это поверх крошечного движка из панелей выше.
Короткие ответы
Что такое производная одним предложением?
Производная f′(x) — это скорость, с которой f меняется на единицу изменения аргумента вблизи x, то есть наклон прямой, которая лучше всего приближает график в этой точке.
Почему касательная определяется через предел?
Одна точка не задаёт наклон прямой: через неё проходит бесконечно много прямых. Вторая точка на расстоянии h задаёт одну — секущую, а касательная — это то, во что секущая превращается, когда h стремится к нулю.
У любой ли функции есть производная?
Нет. У |x| в нуле излом: слева наклон −1, справа +1, поэтому у секущей нет единого предела. У ReLU, max(0, x), такой же излом; библиотеки для нейросетей просто выбирают там какое-то значение, обычно 0.
Чем производная отличается от градиента?
Производная — это скорость изменения функции одной переменной. Градиент собирает частные производные функции многих переменных, по одной на каждый аргумент, в вектор; он указывает направление наискорейшего роста.
Численное, символьное или автоматическое дифференцирование — что есть что?
Численное дифференцирование оценивает наклон по значениям функции в близких точках и обменивает ошибку усечения на ошибку округления. Символьное дифференцирование преобразует формулы. Автоматическое дифференцирование, частным случаем которого является обратное распространение ошибки, применяет цепное правило к фактической последовательности операций, выполненных программой, и даёт точные производные с точностью до округления в арифметике с плавающей точкой.
Почему обратное распространение ошибки идёт в обратную сторону?
У сети одна функция потерь и миллионы параметров. Если идти назад от функции потерь, один проход по графу даёт производную этого единственного выхода по каждому входу — ценой небольшой константы, умноженной на стоимость прямого прохода. Движение вперёд потребовало бы по одному проходу на каждый параметр.
Почему при обратном распространении ошибки градиенты накапливаются через +=?
Потому что значение, которое используется в нескольких местах, влияет на выход по нескольким путям, и по цепному правилу для функций многих переменных его производная равна сумме вкладов всех этих путей. Присваивание вместо сложения оставляет только последний путь.
Литература
- A. Karpathy, «The spelled-out intro to neural networks and backpropagation: building micrograd», Neural Networks: Zero to Hero, lecture 1, 2022. Лекция, по которой построена эта страница.
- 3Blue1Brown, Essence of Calculus, video series, 2017. Геометрическая интуиция за производными и цепным правилом.
- M. Spivak, Calculus, 4th ed., Publish or Perish, 2008. Главы 9–10: определение производной и правила дифференцирования со строгими доказательствами.
- J. Nocedal, S. J. Wright, Numerical Optimization, 2nd ed., Springer, 2006. Глава 8: конечные разности, их ошибки и автоматическое дифференцирование.
- A. G. Baydin, B. A. Pearlmutter, A. A. Radul, J. M. Siskind, «Automatic differentiation in machine learning: a survey», Journal of Machine Learning Research 18 (2018), 1–43.
- A. Griewank, A. Walther, Evaluating Derivatives: Principles and Techniques of Algorithmic Differentiation, 2nd ed., SIAM, 2008. Основной справочник по дифференцированию в обратном режиме.