Alternating gradient descent
Manopt.alternating_gradient_descent
— Functionalternating_gradient_descent(M::ProductManifold, f, grad_f, p=rand(M))
alternating_gradient_descent(M::ProductManifold, ago::ManifoldAlternatingGradientObjective, p)
alternating_gradient_descent!(M::ProductManifold, f, grad_f, p)
alternating_gradient_descent!(M::ProductManifold, ago::ManifoldAlternatingGradientObjective, p)
perform an alternating gradient descent. This can be done in-place of the start point p
Input
M::
AbstractManifold
: a Riemannian manifold $\mathcal M$
f
: a cost function $f: \mathcal M→ ℝ$ implemented as(M, p) -> v
grad_f
: a gradient, that can be of two cases- is a single function returning an
ArrayPartition
fromRecursiveArrayTools.jl
or - is a vector functions each returning a component part of the whole gradient
- is a single function returning an
p
: a point on the manifold $\mathcal M$
Keyword arguments
evaluation=
AllocatingEvaluation
()
: specify whether the functions that return an array, for example a point or a tangent vector, work by allocating its result (AllocatingEvaluation
) or whether they modify their input argument to return the result therein (InplaceEvaluation
). Since usually the first argument is the manifold, the modified argument is the second.evaluation_order=:Linear
: whether to use a randomly permuted sequence (:FixedRandom
), a per cycle permuted sequence (:Random
) or the default:Linear
one.inner_iterations=5
: how many gradient steps to take in a component before alternating to the nextstopping_criterion=
StopAfterIteration
(1000)
): a functor indicating that the stopping criterion is fulfilledstepsize=
ArmijoLinesearch
()
: a functor inheriting fromStepsize
to determine a step sizeorder=[1:n]
: the initial permutation, wheren
is the number of gradients ingradF
.retraction_method=
default_retraction_method
(M, typeof(p))
: a retraction $\operatorname{retr}$ to use, see the section on retractions
Output
usually the obtained (approximate) minimizer, see get_solver_return
for details
The input of each of the (component) gradients is still the whole vector X
, just that all other then the i
th input component are assumed to be fixed and just the i
th components gradient is computed / returned.
Manopt.alternating_gradient_descent!
— Functionalternating_gradient_descent(M::ProductManifold, f, grad_f, p=rand(M))
alternating_gradient_descent(M::ProductManifold, ago::ManifoldAlternatingGradientObjective, p)
alternating_gradient_descent!(M::ProductManifold, f, grad_f, p)
alternating_gradient_descent!(M::ProductManifold, ago::ManifoldAlternatingGradientObjective, p)
perform an alternating gradient descent. This can be done in-place of the start point p
Input
M::
AbstractManifold
: a Riemannian manifold $\mathcal M$
f
: a cost function $f: \mathcal M→ ℝ$ implemented as(M, p) -> v
grad_f
: a gradient, that can be of two cases- is a single function returning an
ArrayPartition
fromRecursiveArrayTools.jl
or - is a vector functions each returning a component part of the whole gradient
- is a single function returning an
p
: a point on the manifold $\mathcal M$
Keyword arguments
evaluation=
AllocatingEvaluation
()
: specify whether the functions that return an array, for example a point or a tangent vector, work by allocating its result (AllocatingEvaluation
) or whether they modify their input argument to return the result therein (InplaceEvaluation
). Since usually the first argument is the manifold, the modified argument is the second.evaluation_order=:Linear
: whether to use a randomly permuted sequence (:FixedRandom
), a per cycle permuted sequence (:Random
) or the default:Linear
one.inner_iterations=5
: how many gradient steps to take in a component before alternating to the nextstopping_criterion=
StopAfterIteration
(1000)
): a functor indicating that the stopping criterion is fulfilledstepsize=
ArmijoLinesearch
()
: a functor inheriting fromStepsize
to determine a step sizeorder=[1:n]
: the initial permutation, wheren
is the number of gradients ingradF
.retraction_method=
default_retraction_method
(M, typeof(p))
: a retraction $\operatorname{retr}$ to use, see the section on retractions
Output
usually the obtained (approximate) minimizer, see get_solver_return
for details
The input of each of the (component) gradients is still the whole vector X
, just that all other then the i
th input component are assumed to be fixed and just the i
th components gradient is computed / returned.
State
Manopt.AlternatingGradientDescentState
— TypeAlternatingGradientDescentState <: AbstractGradientDescentSolverState
Store the fields for an alternating gradient descent algorithm, see also alternating_gradient_descent
.
Fields
direction::
DirectionUpdateRule
evaluation_order::Symbol
: whether to use a randomly permuted sequence (:FixedRandom
), a per cycle newly permuted sequence (:Random
) or the default:Linear
evaluation order.inner_iterations
: how many gradient steps to take in a component before alternating to the nextorder
: the current permutationretraction_method::AbstractRetractionMethod
: a retraction $\operatorname{retr}$ to use, see the section on retractionsstepsize::Stepsize
: a functor inheriting fromStepsize
to determine a step sizestop::StoppingCriterion
: a functor indicating that the stopping criterion is fulfilledp::P
: a point on the manifold $\mathcal M$storing the current iterateX::T
: a tangent vector at the point $p$ on the manifold $\mathcal M$storing the gradient at the current iteratek
, ì`: internal counters for the outer and inner iterations, respectively.
Constructors
AlternatingGradientDescentState(M::AbstractManifold; kwargs...)
Keyword arguments
inner_iterations=5
p=
rand
(M)
: a point on the manifold $\mathcal M$order_type::Symbol=:Linear
order::Vector{<:Int}=Int[]
stopping_criterion=
StopAfterIteration
(1000)
: a functor indicating that the stopping criterion is fulfilledstepsize=
default_stepsize
(M, AlternatingGradientDescentState)
: a functor inheriting fromStepsize
to determine a step sizeX=
zero_vector
(M, p)
: a tangent vector at the point $p$ on the manifold $\mathcal M$
Generate the options for point p
and where inner_iterations
, order_type
, order
, retraction_method
, stopping_criterion
, and stepsize
` are keyword arguments
Additionally, the options share a DirectionUpdateRule
, which chooses the current component, so they can be decorated further; The most inner one should always be the following one though.
Manopt.AlternatingGradient
— FunctionAlternatingGradient(; kwargs...)
AlternatingGradient(M::AbstractManifold; kwargs...)
Specify that a gradient based method should only update parts of the gradient in order to do a alternating gradient descent.
Keyword arguments
initial_gradient=
zero_vector
(M, p)
: a tangent vector at the point $p$ on the manifold $\mathcal M$p=
rand
(M)
: a point on the manifold $\mathcal M$to specify the initial value
This function generates a ManifoldDefaultsFactory
for AlternatingGradientRule
. For default values, that depend on the manifold, this factory postpones the construction until the manifold from for example a corresponding AbstractManoptSolverState
is available.
Manopt.AlternatingGradientRule
— TypeAlternatingGradientRule <: AbstractGradientGroupDirectionRule
Create a functor (problem, state k) -> (s,X)
to evaluate the alternating gradient, that is alternating between the components of the gradient and has an field for partial evaluation of the gradient in-place.
Fields
X::T
: a tangent vector at the point $p$ on the manifold $\mathcal M$
Constructor
AlternatingGradientRule(M::AbstractManifold; p=rand(M), X=zero_vector(M, p))
Initialize the alternating gradient processor with tangent vector type of X
, where both M
and p
are just help variables.
See also
alternating_gradient_descent
, [AlternatingGradient
])@ref)
which internally uses
Technical details
The alternating_gradient_descent
solver requires the following functions of a manifold to be available
- The problem has to be phrased on a
ProductManifold
, to be able to
alternate between parts of the input.
- A
retract!
(M, q, p, X)
; it is recommended to set thedefault_retraction_method
to a favourite retraction. If this default is set, aretraction_method=
does not have to be specified. - By default alternating gradient descent uses
ArmijoLinesearch
which requiresmax_stepsize
(M)
to be set and an implementation ofinner
(M, p, X)
. - By default the tangent vector storing the gradient is initialized calling
zero_vector
(M,p)
.