Это отличный вопрос!
Как правило, идея автоматического дифференцирования (AutoDiff
) основана на правиле многовариантной цепочки, т.е.
,
Это означает, что вы можете выразить производную x по z через «прокси» переменную y; на самом деле это позволяет разбить практически любую операцию на несколько более простых (или атомарных) операций, которые затем могут быть «объединены» в цепочку.
Теперь то, что делают AutoDiff
пакеты, такие как Autograd
, - это просто хранить производную такого атомарного операционного блока, например, деление, умножение и т. Д.
Затем во время выполнения полученную формулу прямого прохода (состоящую из нескольких из этих блоков) можно легко превратить в точную производную. Кроме того, вы также можете предоставить производные для ваших собственных операций, если вы думаете, что AutoDiff не совсем делает то, что вы хотите.
Преимущество AutoDiff над приближенными производными, такими как конечные разности , заключается просто в том, что это точное решение.
Если вас больше интересует, как он работает внутри, я настоятельно рекомендую проект AutoDidact *1013*, который призван упростить внутреннюю часть автоматического дифференциатора, поскольку обычно также требуется много оптимизации кода.
Кроме того, этот набор слайдов из лекции, которую я взял, был действительно полезным для понимания.