- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
给定下面的函数 f!
:
function f!(s::Vector, a::Vector, b::Vector)
s .= a .+ b
return nothing
end # f!
如何根据
为 Zygote定义伴随物Enzyme.autodiff(f!, Const, Duplicated(s, dz_ds)。Duplicated(a, zero(a)), Duplicated(b, zero(b)))
?
Zygote.@adjoint f!(s, a, b) = f!(s, a, b), # What would come here ?
最佳答案
想出了一个办法,在这里分享。
对于给定函数 foo
,Zygote.pullback(foo, args...)
返回 foo(args...)
并且向后传递(允许梯度计算)。
我的目标是告诉 Zygote
使用 Enzyme
进行反向传递。
这可以通过 Zygote.@adjoint
完成(参见更多 here )。
在数组值函数的情况下,Enzyme
需要一个返回nothing
并且其结果在args
中的变异版本(查看更多here ).
问题帖中的函数 f!
是两个数组之和的 Enzyme
兼容版本。
因为 f!
返回 nothing
,Zygote
只会返回 nothing
当对传递给我们的某些梯度调用反向传递时。
一个解决方案是将 f!
放在返回数组 s
的包装器(比如 f
)中
并为 f
定义 Zygote.@adjoint
,而不是 f!
。
因此,
function f(a::Vector, b::Vector)
s = zero(a)
f!(s, a, b)
return s
end
function enzyme_back(dzds, a, b)
s = zero(a)
dzda = zero(dzds)
dzdb = zero(dzds)
Enzyme.autodiff(
f!,
Const,
Duplicated(s, dzds),
Duplicated(a, dzda),
Duplicated(b, dzdb)
)
return (dzda, dzdb)
end
和
Zygote.@adjoint f(a, b) = f(a, b), dzds -> enzyme_back(dzds, a, b)
通知 Zygote
在反向传递中使用 Enzyme
。
最后,您可以检查调用 Zygote.gradient
或者在
g1(a::Vector, b::Vector) = sum(abs2, a + b)
或
g2(a::Vector, b::Vector) = sum(abs2, f(a, b))
产生相同的结果。
关于 Julia :Zygote.@adjoint 来自 Enzyme.autodiff,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71114131/
给定下面的函数 f!: function f!(s::Vector, a::Vector, b::Vector) s .= a .+ b return nothing end # f! 如
我是一名优秀的程序员,十分优秀!