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
околофункцию, ее можно рассматривать как.
если, мы можем получить,Так.
Ссылаться на: