基本的信任区域算法是这样的:
Given an initial point x and a trust region radius μ .
Solve
argminΔx21∥J(x)Δx+F(x)∥2 such that ∥D(x)Δx∥2≤μL≤x+Δx≤U. ho=∣J(x)Δx+F(x)∣2−∣F(x)∣2∣F(x+Δx)∣2−∣F(x)∣2
if ho>ϵ then x=x+Δx .
if ho>η1 then μ=2μ
else if ho<η2 then μ=0.5∗μ
这里,μ 是信任区域半径,D(x) 是某个矩阵,用于定义 F(x) 域上的度量,ho 衡量 Δx 的质量,即线性模型预测非线性目标值下降的程度。我们的想法是根据线性化对非线性目标行为的近似预测程度来增大或减小信任区域的半径,这反映在 ho 的值上。
信任区域算法的关键计算步骤是解决约束优化问题
argΔxmin such that 21∥J(x)Δx+F(x)∥2∥D(x)Δx∥2≤μL≤x+Δx≤U 解决这个问题有多种不同的方法,每种方法都会产生不同的具体信任区域算法。目前,Ceres 实现了两种信任区域算法 Levenberg-Marquardt 算法和 Dogleg 算法,如果存在边界限制,每种算法都会使用线性搜索进行增强 。用户可以通过设置 Solver::Options::trust_region_strategy_type
来进行指定。
Levenberg-Marquardt
将上面的约束优化问题转换为无约束优化问题如下:
argΔxmin21∥J(x)Δx+F(x)∥2+λ∥D(x)Δx∥2 其中,λ 是与 μ 成反比关系的拉格朗日乘数。在 Ceres 中,我们求解
argΔxmin21∥J(x)Δx+F(x)∥2+μ1∥D(x)Δx∥2 矩阵 D(x) 是一个非负对角矩阵,通常是矩阵 J(x)⊤J(x) 对角线的平方根。
在进一步讨论之前,我们先做一些符号上的简化。
我们将假设矩阵 μ1D 已被连接到矩阵 J(x) 的底部,而相应的零向量已被添加到 F(x) 的底部,即
J(x)=[J(x)μ1D],F(x)=[F(x)0]. 然后重写优化问题如下:
Δxmin21∥J(x)Δx+F(x)∥2. 后面只讨论 J(x) 和 F(x)。在 Levenberg-Marquardt 算法的每次迭代中求解上述问题都是主要的计算成本。Ceres 提供了多种不同的方法来求解。主要有两类方法,因式分解法和迭代法。
∥H(x)Δx+g(x)∥≤ηk∥g(x)∥ Ceres 同时支持精确和非精确的分步求解策略。当用户选择基于因式分解的线性求解器时,将使用精确步长的 LevenbergMarquardt 算法。当用户选择迭代线性求解器时,则使用非精确步长的 Levenberg-Marquardt 算法。
我们将在 "线性求解器 "中详细介绍各种线性求解器。
Dogleg
Non-monotonic Steps