gpt4 book ai didi

arrays - 在 Julia 中使用预分配数组的函数上使用自动微分

转载 作者:行者123 更新时间:2023-12-03 01:29:16 25 4
gpt4 key购买 nike

我的长主题标题几乎涵盖了它。

我已经成功地在下面的以下人为示例中隔离了我更大的问题。我无法弄清楚问题到底出在哪里,尽管我认为它与预分配数组的类型有关?

using ForwardDiff

function test()

A = zeros(1_000_000)

function objective(A, value)
for i=1:1_000_000
A[i] = value[1]
end

return sum(A)
end

helper_objective = v -> objective(A, v)

ForwardDiff.gradient(helper_objective, [1.0])

end

错误如下:

ERROR: MethodError: no method matching Float64(::ForwardDiff.Dual{ForwardDiff.Tag{getfield(Main, Symbol("##69#71")){Array{Float64,1},getfield(Main, Symbol("#objective#70")){Array{Float64,1}}},Float64},Float64,1})

在我自己的问题(此处未描述)中,我有一个需要使用 Optim 进行优化的函数,以及它提供的自动微分功能,并且该函数使用了一个大矩阵,我想预先分配该矩阵以加快速度上我的代码。非常感谢。

最佳答案

如果你看http://www.juliadiff.org/ForwardDiff.jl/latest/user/limitations.html你发现:

The target function must be written generically enough to accept numbers of type T<:Real as input (or arrays of these numbers) (...) This also means that any storage assigned used within the function must be generic as well.

这里的例子 https://github.com/JuliaDiff/ForwardDiff.jl/issues/136#issuecomment-237941790 .

这意味着您可以执行以下操作:

function test()
function objective(value)
for i=1:1_000_000
A[i] = value[1]
end
return sum(A)
end
A = zeros(ForwardDiff.Dual{ForwardDiff.Tag{typeof(objective), Float64},Float64,1}, 1_000_000)
ForwardDiff.gradient(objective, [1.0])
end

但我不认为这会为您节省很多分配,因为它的类型不稳定。

您可以做的是将 objectiveA 包装在如下模块中:

using ForwardDiff

module Obj

using ForwardDiff

function objective(value)
for i=1:1_000_000
A[i] = value[1]
end
return sum(A)
end
const A = zeros(ForwardDiff.Dual{ForwardDiff.Tag{typeof(objective), Float64},Float64,1}, 1_000_000)

end

现在这个:

ForwardDiff.gradient(Obj.objective, [1.0])

应该很快。

编辑

这也有效(虽然它的类型不稳定,但在问题较少的地方):

function test()::Vector{Float64}
function objective(A, value)
for i=1:1_000_000
A[i] = value[1]
end

return sum(A)
end
helper_objective = v -> objective(A, v)
A = Vector{ForwardDiff.Dual{ForwardDiff.Tag{typeof(helper_objective), Float64},Float64,1}}(undef, 1_000_000)
ForwardDiff.gradient(helper_objective, [1.0])
end

关于arrays - 在 Julia 中使用预分配数组的函数上使用自动微分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52156209/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com