Zygote — это пакет в Julia, который реализует автоматическую дифференциацию и автоматическую деривацию.@adjointМакросы являются важной частью интерфейса Zygote. использовать@adjointОбратное распространение функций можно настроить.
Pullbacks
понять@adjointВо-первых, разберитесь с функциями нижнего уровняpullback.gradientфактическиpullbackсинтаксический сахар для .
julia> y, back = Zygote.pullback(sin, 0.5)
(0.479425538604203, Zygote.var"#41#42"{Zygote.ZBack{ChainRules.var"#sin_pullback#1430"{Float64}}}(Zygote.ZBack{ChainRules.var"#sin_pullback#1430"{Float64}}(ChainRules.var"#sin_pullback#1430"{Float64}(0.8775825618903728))))
julia> y
0.479425538604203
даватьpullbackВведите два параметраsinи0.5Представьте функцию, которую нужно вывести, и значение, которое нужно вывести, соответственно, и будут получены два выхода: результат данной функцииsin(0.5)иpullback, который является кодом вышеbackПеременная.backпарная функцияsinДля вычисления градиента ~~ принимает вывод и создает новую переменную. ~~ С математической точки зрения это реализация векторно-якобианского произведения. ви градиентнаписано как, откатРассчитайте следующим образом:
В частности, на примере приведенного выше кода функция. , так что откат есть,в. другими словами,pullback(sin, x)иdsin(x) = (sin(x), ȳ -> (ȳ * cos(x),))эквивалентность.
gradientсредняя функцияи предположим, и подайте его в откат. существуетsinВ примере
julia> dsin(x) = (sin, ȳ -> (ȳ * cos(x),))
dsin (generic function with 1 method)
julia> function gradsin(x)
_, back = dsin(x)
back(1)
end
gradsin (generic function with 1 method)
julia> gradsin(0.5)
(0.8775825618903728,)
julia> cos(0.5)
0.8775825618903728
julia> back(1)
(0.8775825618903728,)
Личное понимание, зачем добавлять элемент перед ним, который должен реализовать цепное правило. Например, предположим, что окончательный убыток равен, функция, чтобы получить функцию потерьпарный параметрДифференциация, согласно цепному правилу, функция потерь есть функцияПроизводная от умноженной на функцию по параметрудифференциал. функцияизpullbackпарная функция функции потерьДифференциация (созначает), умноженное на пару функцийдифференциал.
Для приведенного выше примераpullbackПервый результат, возвращаемый функцией: Предположим, что функцияфункция потерьчас,результат, когда, и возвращаетсяbackоколофункцию, ее можно рассматривать как.
если, мы можем получить,Так.
Ссылаться на: