迭代求解最优化问题——Levenberg-Marquardt算法

高斯牛顿法使用的条件

上一篇中提到了线性最小二乘问题 minx||Axb|| 的的标准方程为 ATAxATb=0 。其中x为n维向量,b为m维向量,A为 m×n 的矩阵。

从标准方程我们可以求出x的解析解,然而这其实隐含了一个条件,就是rank(A)=n。当A秩亏的时候, rank(ATA)rank(A)<n ATA 不可逆。

事实上,这种情况下x的解有无穷多个,此时问题是欠约束的。

我们使用高斯牛顿法的时候,也有同样的限制,当 rank(J)<n 时,理论上 JTJ 没有逆。但是由于浮点数误差等原因,我们有可能得到一个 JTJ 的逆,显然此时 det(JTJ) 非常接近于零,由于 ||Δ||=||(JTJ)1JTb||=||JTb||||det(JTJ)|| ,我们会得到一个非常大的 Δ 。这显然会导致求解失败。

正则化

为保证每次的迭代步长不过大,我们可以在优化的损失函数里面加入一个阻尼项,于是优化问题变成了 minx||Axb||2+λ||x||2

它的标准方程变成了 (ATA+λI)x=ATb ,因为 ATA ,当 λ>0 时, ATA+λI 一定可逆。

λ 的选取需要特别注意, λ 过小时起不到阻尼的作用, λ 过大时会使得最终求解的问题偏离原问题。

Levenberg算法

将上述策略应用到高斯牛顿法中,我们就得到了Levenberg算法。对标准方程 (JTJ+λI)Δ=JTb 。当 λ 接近于零时,方程退化成高斯牛顿法,当 λ 很大时, Δ=1λJTb ,接近于梯度下降法。

实际进行迭代时,我们可以动态的调整 λ 的大小,当损失函数下降较快时减少 λ ,当损失函数下降较慢时增加 λ ,从而使得迭代同时具备高斯牛顿法(收敛快但不一定能找到最值点)和梯度下降法(稳定但是速度慢)的优点。

Levenberg-Marquardt算法

上述策略中,当 λ 很大时 (JTJ+λI) 的求解对于最终迭代步长并没有什么贡献。Marquardt在此基础上提出我们可以通过Jacobian矩阵来缩放梯度的不同维度,从而在梯度较小的方向也能走得更远,由此将阻尼项改写为 λdiag(JTJ) 。这就是Levenberg-Marquardt算法。

Marquardt也提出了 λ 的选择策略。他提出在算法开始时假设两个参数 λ0 和ν >1。分别使用 λ=λ0 λ=λ/ν 迭代两次并计算损失函数。如果两次结果都比初始点差,则不断增加阻尼系数,用ν去乘 λ ,直到损失函数下降为止。

迭代时如果阻尼系数λ/ν使得损失函数下降更快,则用它来代替之前的λ,并使用当前点代替之前的点,再次执行该过程。否则不改变 λ ,并使用当前点代替之前的点。

事实上,如果对数值优化有一定了解的话,我们可以发现LM算法是一种信赖域算法。它使用二次模型来近似真实模型。

你可能感兴趣的:(算法,数值优化)