Gradients
The supertype Gradient
comprises different ways of taking gradients:
We first start by showing GradientAutodiff
:
f(x::AbstractArray) = sum(x .^ 2)
x = rand(3)
grad = GradientAutodiff(f, x)
GradientAutodiff{Float64, typeof(Main.f), ForwardDiff.GradientConfig{ForwardDiff.Tag{typeof(Main.f), Float64}, Float64, 3, Vector{ForwardDiff.Dual{ForwardDiff.Tag{typeof(Main.f), Float64}, Float64, 3}}}}(Main.f, ForwardDiff.GradientConfig{ForwardDiff.Tag{typeof(Main.f), Float64}, Float64, 3, Vector{ForwardDiff.Dual{ForwardDiff.Tag{typeof(Main.f), Float64}, Float64, 3}}}((Partials(1.0, 0.0, 0.0), Partials(0.0, 1.0, 0.0), Partials(0.0, 0.0, 1.0)), ForwardDiff.Dual{ForwardDiff.Tag{typeof(Main.f), Float64}, Float64, 3}[Dual{ForwardDiff.Tag{typeof(Main.f), Float64}}(1.02534836643315e-310,1.01855797990206e-310,1.0253483662276e-310,1.0253483662276e-310), Dual{ForwardDiff.Tag{typeof(Main.f), Float64}}(1.425981173916e-311,1.425981173916e-311,1.4259811718607e-311,1.4259811718923e-311), Dual{ForwardDiff.Tag{typeof(Main.f), Float64}}(9.9818682010327e-311,1.4259811718607e-311,3.32e-321,6.95165821120223e-310)]))
Instead of calling GradientAutodiff(f, x)
we can equivalently do:
grad = Gradient(f, x; mode = :autodiff)
GradientAutodiff{Float64, typeof(Main.f), ForwardDiff.GradientConfig{ForwardDiff.Tag{typeof(Main.f), Float64}, Float64, 3, Vector{ForwardDiff.Dual{ForwardDiff.Tag{typeof(Main.f), Float64}, Float64, 3}}}}(Main.f, ForwardDiff.GradientConfig{ForwardDiff.Tag{typeof(Main.f), Float64}, Float64, 3, Vector{ForwardDiff.Dual{ForwardDiff.Tag{typeof(Main.f), Float64}, Float64, 3}}}((Partials(1.0, 0.0, 0.0), Partials(0.0, 1.0, 0.0), Partials(0.0, 0.0, 1.0)), ForwardDiff.Dual{ForwardDiff.Tag{typeof(Main.f), Float64}, Float64, 3}[Dual{ForwardDiff.Tag{typeof(Main.f), Float64}}(5.0e-324,5.0e-324,5.0e-324,5.0e-324), Dual{ForwardDiff.Tag{typeof(Main.f), Float64}}(5.0e-324,5.0e-324,5.0e-324,5.0e-324), Dual{ForwardDiff.Tag{typeof(Main.f), Float64}}(2.5e-323,2.0e-323,5.0e-324,5.0e-324)]))
When calling an instance of Gradient
we can use the functions gradient
and gradient!
[1]:
gradient(x, grad)
3-element Vector{Float64}:
1.042427591070766
1.1736135149066969
1.7817573961855622
- 1Internally these functions call functors that are implemented for the individual
struct
s derived fromGradient
, but for consistency (especially with regards toMultivariateObjective
s) we recommend using the functionsgradient
andgradient!
.