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 structs derived from Gradient, but for consistency (especially with regards to MultivariateObjectives) we recommend using the functions gradient and gradient!.