- 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! 如
我正在学习使用这个库。尝试微分一个简单的函数 y = x^2,不会产生预期的结果(dy/dx = 2x = 16 当 x = 8). #include #include #include int
题 使用 Tensorflow 时,例如实现自定义神经网络层,实现反向传播的标准做法是什么?我们不需要研究自动微分公式吗? 背景 使用 numpy,在创建图层时,例如matmul ,反向传播梯度首先被
来自 EDIT 的解决方案现在作为答案发布。 老问题 我想将 Eigen::Spline 的样条插值包含到一个更大的公式中,并想在 Eigen::AutoDiff 的帮助下确定该公式的导数。 我尝试了
我有一种情况,我有一批图像,在每个图像中我必须对该图像中的一个小补丁执行一些操作。现在的问题是批处理中每个图像的补丁大小是可变的。所以这意味着我无法对其进行矢量化。我可以通过考虑图像中的整个像素范围来
我是一名优秀的程序员,十分优秀!