一、高斯牛顿法发展历程
1、从上倒下为高斯牛顿法的前世今生已经未来的演化:
最速下降法(一阶梯度法)
牛顿法(二阶梯度法)
高斯牛顿法
列文伯格法
马夸尔特法
二、问题的引出
1、考虑如下优化目标函数:
min
x
F
(
x
)
\mathop {\min }\limits_x F(x)
xminF(x)
其中,
x
=
[
x
1
,
.
.
.
,
x
n
]
T
∈
R
n
x = {[{x_1},...,{x_n}]^T}\in {\R^n}
x=[x1,...,xn]T∈Rn是
n
n
n维待优化变量,
F
(
x
)
:
R
n
→
R
F(x):{\R^n} \to \R
F(x):Rn→R是一个将
n
n
n维变量映射成标量的非线性函数。
2、我们的目标:
对变量
x
x
x进行优化,即寻找一组合适的
x
x
x使得优化目标函数
F
(
x
)
F(x)
F(x)最小。
3、最直观的方法:
F
(
x
)
F(x)
F(x)关于
x
=
[
x
1
,
.
.
.
,
x
n
]
T
∈
R
n
x = {[{x_1},...,{x_n}]^T}\in {\R^n}
x=[x1,...,xn]T∈Rn的多元函数,我们只要利用
F
(
x
)
F(x)
F(x)一阶导数等于零这一公式求出
F
(
x
)
F(x)
F(x)达到极值时对应的若干组
x
x
x:
d
F
d
x
=
0
\frac{{dF}}{{dx}} = 0
dxdF=0然后基于这些这些组
x
x
x求出
F
(
x
)
F(x)
F(x)的全部极值,然后通过比较极值的大小就可以找到
F
(
x
)
F(x)
F(x)的最小值和其所对应的
x
x
x取值。
4、直观方法的问题:
根据上述方法,我们可以找到
F
(
x
)
F(x)
F(x)全局最小值,但这里面有一个严重的问题。当
F
(
x
)
F(x)
F(x)为复杂的非线性函数时,其关于
x
x
x的一阶导数是十分复杂的,导致
d
F
d
x
=
0
\frac{{dF}}{{dx}} = 0
dxdF=0难以求解,或者说求得其全部解是十分困难的,即我们难以获得
F
(
x
)
F(x)
F(x)全局性质,自然后续的求极值比大小就无法进行,这个方法就走进了死胡同。
5、解决直观方法问题的思路
虽然我们难以求解
d
F
d
x
=
0
\frac{{dF}}{{dx}} = 0
dxdF=0,但我们给定一组
x
x
x,求
d
F
d
x
\frac{{dF}}{{dx}}
dxdF的值是很容易的,就是把给定的
x
x
x代入
d
F
d
x
\frac{{dF}}{{dx}}
dxdF算,批量处理这一过程是计算机最擅长的事情,即我们可以很容易获得
F
(
x
)
F(x)
F(x)局部性质。那么我们为了解决这样的一个优化问题,我们可以给定一个初值,然后利用
F
(
x
)
F(x)
F(x)在初值附近的局部性质(即在初值附近
x
x
x如何变化可以使得
F
(
x
)
F(x)
F(x)更小)得到初值的变化增量
Δ
x
=
[
Δ
x
1
,
.
.
.
,
Δ
x
n
]
T
\Delta x = {[\Delta {x_1},...,\Delta {x_n}]^T}
Δx=[Δx1,...,Δxn]T,通过迭代,当
Δ
x
\Delta x
Δx足够小时,我们就找到了
F
(
x
)
F(x)
F(x)比较小的一个值和其对应的
x
x
x取值。与
x
x
x相对应,这里
Δ
x
\Delta x
Δx也是
n
n
n维列向量。对应算法流程为:
这里有两点值得注意:
- 基于局部性质找到的 F ( x ) F(x) F(x)较小值并不一定是 F ( x ) F(x) F(x)的最小值,因为我们只考察了 F ( x ) F(x) F(x)在初值附近的局部情况,没有对 F ( x ) F(x) F(x)全局性质进行考察。
- 当 Δ x \Delta x Δx足够小时,算法结束。这个可以这样理解:此时 x x x只有在变化一点点的情况下才会使 F ( x ) F(x) F(x)变小,这说明 F ( x ) F(x) F(x)的函数值已经到了一个谷底附近, x x x稍微变大一点都会使得 F ( x ) F(x) F(x)从谷底向上走从而变大。之所以我们不把算法结束条件设置成 Δ x = 0 \Delta x = 0 Δx=0这是因为我们恰好让 F ( x ) F(x) F(x)函数值在谷底点几乎不可能,会导致算法一直在谷底点附近小范围内震荡。
- 局部方法的核心在于如何获得增量 Δ x \Delta x Δx,下面的几种方法都是围绕这一问题进行讨论的。
以下讨论的前提均是第 k k k次迭代,假设此时 x x x在 x k x_k xk处,我们要寻找增量 Δ x k \Delta x_k Δxk
二、高斯牛顿法的前世
由于原理的相似性,最速下降法和牛顿法可以统称为一阶,二阶梯度法。这两种方法的原理分别是在局部用一次函数,二次函数对非线性函数 F ( x ) F(x) F(x)进行近似,然后利用近似函数的最小值推测非线性函数 F ( x ) F(x) F(x)的极小值。
1、一阶,二阶梯度法共有原理
将
F
(
x
)
F(x)
F(x)在
x
k
x_k
xk附近进行泰勒展开:
F
(
x
k
+
Δ
x
k
)
≈
F
(
x
k
)
+
J
(
x
k
)
T
Δ
x
k
+
1
2
Δ
x
k
T
H
(
x
k
)
Δ
x
k
F({x_k} + \Delta {x_k}) \approx F({x_k}) + J{({x_k})^T}\Delta {x_k} + \frac{1}{2}\Delta x_k^TH({x_k})\Delta {x_k}
F(xk+Δxk)≈F(xk)+J(xk)TΔxk+21ΔxkTH(xk)Δxk其中:
- J ( x k ) = [ ∂ F ( x ) ∂ x 1 , . . . , ∂ F ( x ) ∂ x n ] T J({x_k}) = {[\frac{{\partial F(x)}}{{\partial {x_1}}},...,\frac{{\partial F(x)}}{{\partial {x_n}}}]^T} J(xk)=[∂x1∂F(x),...,∂xn∂F(x)]T是 F ( x ) F(x) F(x)关于 x x x的一阶导数在 x k x_k xk处取值, J J J称为梯度或雅克比矩阵,需要注意的是 J ( x k ) J({x_k}) J(xk)是一个 n n n维列向量, Δ x k \Delta x_k Δxk也是一个 n n n维列向量,因此泰勒展开中是 J ( x k ) J({x_k}) J(xk)的转置乘以 Δ x k \Delta x_k Δxk,从而得到一个标量。
- H ( x k ) H({x_k}) H(xk)是 F ( x ) F(x) F(x)关于 x x x的二阶导数在 x k x_k xk处取值, H H H称为海塞矩阵,是一个 n × n n\times n n×n的方阵。
2、最速下降法(一阶梯度法)
1)最速下降法原理
最速下降法(一阶梯度法)就是保留泰勒展开的一阶项用来近似非线性函数
F
(
x
)
F(x)
F(x),即:
F
(
x
k
+
Δ
x
k
)
≈
F
(
x
k
)
+
J
(
x
k
)
T
Δ
x
k
F({x_k} + \Delta {x_k}) \approx F({x_k}) + J{({x_k})^T}\Delta {x_k}
F(xk+Δxk)≈F(xk)+J(xk)TΔxk该式中,只有
Δ
x
k
\Delta x_k
Δxk是变量,而
x
k
x_k
xk是一个确定的数值,
F
(
x
k
)
,
J
(
x
k
)
T
F({x_k}),J{({x_k})^T}
F(xk),J(xk)T均是一个确定的数值,即这是一个以
Δ
x
k
\Delta x_k
Δxk为变量的一次函数。取
Δ
x
k
\Delta x_k
Δxk为一阶梯度的反向就一定可以保证函数值下降,因此:
Δ
x
k
=
−
J
(
x
k
)
\Delta {x_k} = - J({x_k})
Δxk=−J(xk)通常我们还会在此基础上加一个步长
λ
\lambda
λ(步长可以根据一定条件计算,这里不展开讨论)使得
Δ
x
k
=
−
λ
J
(
x
k
)
\Delta {x_k} = - \lambda J({x_k})
Δxk=−λJ(xk)
2)最速下降法缺点
该方法过于贪心,容易走出锯齿线,反而增加迭代次数。
3、牛顿法和阻尼牛顿法(二阶梯度法)
1)牛顿法的原理
牛顿法(二阶梯度法)就是保留泰勒展开的一阶项和二阶项用来近似非线性函数
F
(
x
)
F(x)
F(x),即:
F
(
x
k
+
Δ
x
k
)
≈
F
(
x
k
)
+
J
(
x
k
)
T
Δ
x
k
+
1
2
Δ
x
k
T
H
(
x
k
)
Δ
x
k
F({x_k} + \Delta {x_k}) \approx F({x_k}) + J{({x_k})^T}\Delta {x_k} + \frac{1}{2}\Delta x_k^TH({x_k})\Delta {x_k}
F(xk+Δxk)≈F(xk)+J(xk)TΔxk+21ΔxkTH(xk)Δxk该式中,只有
Δ
x
k
\Delta x_k
Δxk是变量,而
x
k
x_k
xk是一个确定的数值,
F
(
x
k
)
,
J
(
x
k
)
T
F({x_k}),J{({x_k})^T}
F(xk),J(xk)T均是一个确定的数值,即这是一个以
Δ
x
k
\Delta x_k
Δxk为变量的二次函数。且二次项的系数为正,因此该函数拥有最小值。其取最小值的条件就是该式对
Δ
x
k
\Delta x_k
Δxk的导数等于零,即:
∂
(
F
(
x
k
)
+
J
(
x
k
)
T
Δ
x
k
+
1
2
Δ
x
k
T
H
(
x
k
)
Δ
x
k
)
∂
Δ
x
k
=
0
\frac{{\partial (F({x_k}) + J{{({x_k})}^T}\Delta {x_k} + \frac{1}{2}\Delta x_k^TH({x_k})\Delta {x_k})}}{{\partial \Delta {x_k}}} = 0
∂Δxk∂(F(xk)+J(xk)TΔxk+21ΔxkTH(xk)Δxk)=0解得:
H
(
x
k
)
Δ
x
k
=
−
J
(
x
k
)
H({x_k})\Delta {x_k} = - J({x_k})
H(xk)Δxk=−J(xk)该式即为牛顿法的增量方程。
2)牛顿法的缺点
海塞矩阵
H
(
x
k
)
H(x_k)
H(xk)计算量太大了
3)阻尼牛顿法
阻尼牛顿法就是在使用牛顿法获得增量方向后,进一步对最优步长进行搜索:
- 通过牛顿法获取增量 H ( x k ) Δ x k = − J ( x k ) H({x_k})\Delta {x_k} = - J({x_k}) H(xk)Δxk=−J(xk),则增量方向为 Δ x k = − H ( x k ) − 1 J ( x k ) \Delta {x_k} = - H({x_k})^{-1}J({x_k}) Δxk=−H(xk)−1J(xk)
- 沿着该增量方向一维搜索最优补偿 λ \lambda λ,使得 F ( x k + λ Δ x k ) F(x_k + \lambda \Delta x_k ) F(xk+λΔxk)最小
三、高斯牛顿法
1、高斯牛顿法的思想
高斯牛顿法针对最小二乘问题,采用一定的方法对牛顿法中的海塞矩阵
H
(
x
k
)
H(x_k)
H(xk)进行近似,从而简化了计算量。
注意:只有最小二乘问题才能使用高斯牛顿法
2、最小二乘问题
最小二乘法(又称最小平方法)是一种数学优化技术。它通过最小化误差的平方和寻找数据的最佳函数匹配。最小二乘问题可以表述为:
min
x
F
(
x
)
=
∣
∣
f
(
x
)
∣
∣
2
\mathop {\min }\limits_x F(x) = ||f(x)|{|^2}
xminF(x)=∣∣f(x)∣∣2
3、高斯牛顿法原理
当
x
x
x在
x
k
x_k
xk处,具有增量
Δ
x
k
\Delta x_k
Δxk,优化目标函数取值为:
min
x
F
(
x
k
+
Δ
x
k
)
=
∣
∣
f
(
x
k
+
Δ
x
k
)
∣
∣
2
\mathop {\min }\limits_x F({x_k} + \Delta {x_k}) = ||f({x_k} + \Delta {x_k})|{|^2}
xminF(xk+Δxk)=∣∣f(xk+Δxk)∣∣2不同于牛顿法,我们不对优化目标函数进行泰勒展开,我们对优化目标函数中的一部分,即
f
(
x
)
f(x)
f(x)进行一阶泰勒展开。 展开后优化目标函数为:
F
(
x
k
+
Δ
x
k
)
≈
∣
∣
f
(
x
k
)
+
J
(
x
k
)
T
Δ
x
k
∣
∣
2
F({x_k} + \Delta {x_k}) \approx ||f({x_k}) + J{({x_k})^T}\Delta {x_k}|{|^2}
F(xk+Δxk)≈∣∣f(xk)+J(xk)TΔxk∣∣2其中:
- J ( x k ) = [ ∂ f ( x ) ∂ x 1 , . . . , ∂ f ( x ) ∂ x n ] T J({x_k}) = {[\frac{{\partial f(x)}}{{\partial {x_1}}},...,\frac{{\partial f(x)}}{{\partial {x_n}}}]^T} J(xk)=[∂x1∂f(x),...,∂xn∂f(x)]T是 f ( x ) f(x) f(x)关于 x x x的一阶导数在 x k x_k xk处取值, J J J称为梯度或雅克比矩阵,需要注意的是 J ( x k ) J({x_k}) J(xk)是一个 n n n维列向量, Δ x k \Delta x_k Δxk也是一个 n n n维列向量,因此泰勒展开中是 J ( x k ) J({x_k}) J(xk)的转置乘以 Δ x k \Delta x_k Δxk,从而得到一个标量。
- 高斯牛顿法中的 J ( x k ) J({x_k}) J(xk)是 f ( x ) f(x) f(x)关于 x x x的一阶导数在 x k x_k xk处取值,而牛顿法中的 J ( x k ) J({x_k}) J(xk)是 F ( x ) F(x) F(x)关于 x x x的一阶导数在 x k x_k xk处取值
该式中,只有
Δ
x
k
\Delta x_k
Δxk是变量,而
x
k
x_k
xk是一个确定的数值,
f
(
x
k
)
,
J
(
x
k
)
T
f({x_k}),J{({x_k})^T}
f(xk),J(xk)T均是一个确定的数值,即这是一个以
Δ
x
k
\Delta x_k
Δxk为变量的二次函数。且二次项的系数为正,因此该函数拥有最小值。其取最小值的条件就是该式对
Δ
x
k
\Delta x_k
Δxk的导数等于零,即:
∂
∣
∣
f
(
x
k
)
+
J
(
x
k
)
T
Δ
x
k
∣
∣
2
∂
Δ
x
k
=
0
\frac{{\partial ||f({x_k}) + J{{({x_k})}^T}\Delta {x_k}|{|^2}}}{{\partial \Delta {x_k}}} = 0
∂Δxk∂∣∣f(xk)+J(xk)TΔxk∣∣2=0解得:
J
(
x
k
)
J
(
x
k
)
T
Δ
x
k
=
−
J
(
x
k
)
f
(
x
k
)
J({x_k})J{({x_k})^T}\Delta {x_k} = - J({x_k})f({x_k})
J(xk)J(xk)TΔxk=−J(xk)f(xk)记:
H
(
x
k
)
=
J
(
x
k
)
J
(
x
k
)
T
,
g
(
x
k
)
=
−
J
(
x
k
)
f
(
x
k
)
H({x_k}) = J({x_k})J{({x_k})^T},g({x_k}) = - J({x_k})f({x_k})
H(xk)=J(xk)J(xk)T,g(xk)=−J(xk)f(xk)则高斯牛顿法的增量方程为:
H
(
x
k
)
Δ
x
k
=
g
(
x
k
)
H({x_k})\Delta {x_k} = g({x_k})
H(xk)Δxk=g(xk)这里将
J
(
x
k
)
J
(
x
k
)
T
J({x_k})J{({x_k})^T}
J(xk)J(xk)T记作
H
(
x
k
)
H({x_k})
H(xk)是有意义的,高斯牛顿法相当于在最小二乘这类问题上,用
f
(
x
)
f(x)
f(x)一阶泰勒展对
F
(
x
)
F(x)
F(x)的二阶泰勒展开进行了近似,从而用
f
(
x
)
f(x)
f(x)的雅克比矩阵
J
J
J对
F
(
x
)
F(x)
F(x)的海塞矩阵
H
H
H进行了近似,减少了计算量。
4、高斯牛顿法算法流程
5、高斯牛顿法缺点
-
在求解增量 Δ x k \Delta x_k Δxk时候,我们需要计算 ( J ( x k ) J ( x k ) T ) − 1 {(J({x_k})J{({x_k})^T})^{ - 1}} (J(xk)J(xk)T)−1,但是 J ( x k ) J ( x k ) T {J({x_k})J{({x_k})^T}} J(xk)J(xk)T只有半正定性质,在实际计算中可能会遇见 J ( x k ) J ( x k ) T {J({x_k})J{({x_k})^T}} J(xk)J(xk)T为奇异矩阵或者病态矩阵,从而导致增量不稳定,算法不收敛。出现这种现象的深层原因是 F ( x ) F(x) F(x)在 x k x_k xk处的近似不像一个二次函数。这也应该是牛顿法的缺点?
奇异矩阵:不满秩的方阵
病态矩阵:求解方程组时如果对数据进行较小的扰动,则得出的结果具有很大波动,这样的矩阵称为病态矩阵。 -
当我们求得的增量 Δ x k \Delta {x_k} Δxk过大时,我们使用泰勒展开进行局部近似就会不准确。从而导致算法不收敛。
四、列文伯格-马夸尔特方法(L-M方法,阻尼牛顿法)
1、列文伯格-马夸尔特方法的思想
针对高斯牛顿法的不足,L-M方法做了两点改进:
- 在求解增量 Δ x k \Delta {x_k} Δxk时,对其设置了信赖区域
- 在求得增量 Δ x k \Delta {x_k} Δxk对其近似效果进行了量化,并根据量化结果对信赖区域进行调整,再从新计算增量 Δ x k \Delta {x_k} Δxk,直到近似效果量化结果达到阈值。
2、信赖区域
μ
\mu
μ的设置及对增量方程的影响
1)信赖区域的引入
增加信赖区域
μ
\mu
μ的后,优化问题从无约束的最小二乘问题变成了有约束的最小二乘问题。即从
min
x
F
(
x
k
+
Δ
x
k
)
=
∣
∣
f
(
x
k
+
Δ
x
k
)
∣
∣
2
\mathop {\min }\limits_x F({x_k} + \Delta {x_k}) = ||f({x_k} + \Delta {x_k})|{|^2}
xminF(xk+Δxk)=∣∣f(xk+Δxk)∣∣2变成了:
min
x
F
(
x
k
+
Δ
x
k
)
=
∣
∣
f
(
x
k
+
Δ
x
k
)
∣
∣
2
,
s
.
t
.
∣
∣
D
Δ
x
k
∣
∣
2
≤
μ
\mathop {\min }\limits_x F({x_k} + \Delta {x_k}) = ||f({x_k} + \Delta {x_k})|{|^2},s.t.||D\Delta {x_k}|{|^2} \le \mu
xminF(xk+Δxk)=∣∣f(xk+Δxk)∣∣2,s.t.∣∣DΔxk∣∣2≤μ其中,
∣
∣
D
Δ
x
k
∣
∣
2
≤
μ
||D\Delta {x_k}|{|^2} \le \mu
∣∣DΔxk∣∣2≤μ是信赖区间对应的条件,
D
D
D是系数矩阵,为
n
n
n维行向量,
μ
\mu
μ是信赖半径。列文伯格方法和马夸尔特方法的主要区别就是系数矩阵D不同。
在求解该带有约束的优化函数过程中,可以通过构建拉格朗日函数将约束引入:
L
(
Δ
x
k
,
λ
)
=
∣
∣
f
(
x
k
+
Δ
x
k
)
∣
∣
2
+
λ
(
∣
∣
D
Δ
x
k
∣
∣
2
−
μ
)
L(\Delta {x_k},\lambda ) = ||f({x_k} + \Delta {x_k})|{|^2} + \lambda (||D\Delta {x_k}|{|^2} - \mu )
L(Δxk,λ)=∣∣f(xk+Δxk)∣∣2+λ(∣∣DΔxk∣∣2−μ)同样,当该拉格朗日函数关于
Δ
x
k
\Delta {x_k}
Δxk的导数等于零时,可以求得对应的增量
Δ
x
k
\Delta {x_k}
Δxk。也可以这么理解,当
∣
∣
D
Δ
x
k
∣
∣
2
>
μ
||D\Delta {x_k}|{|^2} > \mu
∣∣DΔxk∣∣2>μ时候,就是在优化目标函数中引入了系数为
λ
\lambda
λ的惩罚项。
2)增量方程
列文伯格-马夸尔特方法的增量方程如下:
(
H
+
λ
D
T
D
)
Δ
x
k
=
g
(
x
k
)
(H + \lambda {D^T}D)\Delta {x_k} = g({x_k})
(H+λDTD)Δxk=g(xk) 其中,
H
(
x
k
)
,
g
(
x
k
)
H({x_k}),g({x_k})
H(xk),g(xk)与高斯牛顿法相同。
3、近似程度的量化
定义量化指标
ρ
\rho
ρ衡量近似程度:
ρ
=
f
(
x
k
+
Δ
x
k
)
−
f
(
x
k
)
J
(
x
k
)
T
Δ
x
k
\rho = \frac{{f({x_k} + \Delta {x_k}) - f({x_k})}}{{J{{({x_k})}^T}\Delta {x_k}}}
ρ=J(xk)TΔxkf(xk+Δxk)−f(xk)
- 当 ρ \rho ρ接近1时,近似效果好;
- 当 ρ \rho ρ太小时,实际减小的值远小于近似函数减小的值,近似效果差,需要缩小近似范围 μ \mu μ
- 当 ρ \rho ρ较大时,实际减小的值大于近似函数减小的值,近似效果差,需要增大近似范围 μ \mu μ
4、列文伯格-马夸尔特算法流程
5、列文伯格方法
在列文伯格方法中,系数矩阵
D
=
I
D=I
D=I,信赖区域时一个球形状
6、马夸尔特方法
在马夸尔特方法中,系数矩阵
D
D
D是
J
(
x
k
)
J
(
x
k
)
T
J({x_k})J{({x_k})^T}
J(xk)J(xk)T对角元素的平方根。
7、列文伯格-马夸尔特与高斯牛顿相比
列文伯格-马夸尔特在一定程度上解决了线性方程组系数矩阵的非奇异和病态问题,但算法收敛速度相较于高斯牛顿更慢。因此,当问题性质较好时,选择高斯牛顿方法,问题接近病态时,选择列文伯格-马夸尔特方法。
五、拟牛顿法
为了解决牛顿法中海森矩阵H计算复杂的问题,拟牛顿法提供了另外一种解决思路:通过使用不含有二阶导数的矩阵 U U U代替牛顿法中的 H H H,根据矩阵 U U U构造的不同,具有不同的拟牛顿法。
1、拟牛顿法的基本原理
牛顿法的搜索方向为:
d
(
t
)
=
−
H
t
−
1
g
t
d^{(t)}=-H_t^{-1}g_t
d(t)=−Ht−1gt
现在我们要构造一个矩阵
U
U
U来近似矩阵
H
H
H,当
f
(
x
)
f(x)
f(x)为二次函数的时候,
H
H
H矩阵为常数矩阵,且任意两点
x
t
x^{t}
xt与
x
t
+
1
x^{t+1}
xt+1之间的梯度差为:
▽
f
(
x
(
t
+
1
)
)
−
▽
f
(
x
(
t
)
)
=
H
⋅
(
x
(
t
+
1
)
−
x
(
t
)
)
\bigtriangledown f(x^{(t+1)}) - \bigtriangledown f(x^{(t)}) = H\cdot (x^{(t+1)}-x^{(t)})
▽f(x(t+1))−▽f(x(t))=H⋅(x(t+1)−x(t))
因此有:
x
(
t
+
1
)
−
x
(
t
)
=
H
−
1
⋅
[
▽
f
(
x
(
t
+
1
)
)
−
▽
f
(
x
(
t
)
)
]
x^{(t+1)}-x^{(t)} = H^{-1}\cdot [\bigtriangledown f(x^{(t+1)}) - \bigtriangledown f(x^{(t)})]
x(t+1)−x(t)=H−1⋅[▽f(x(t+1))−▽f(x(t))]
因此,当
f
(
x
)
f(x)
f(x)不是二次函数的时候,仿照上式,我们可以构建H矩阵的近似矩阵
U
U
U,要求矩阵
U
U
U满足如下关系:
x
(
t
+
1
)
−
x
(
t
)
=
U
t
+
1
⋅
[
▽
f
(
x
(
t
+
1
)
)
−
▽
f
(
x
(
t
)
)
]
x^{(t+1)}-x^{(t)}=U_{t+1}\cdot [\bigtriangledown f(x^{(t+1)})-\bigtriangledown f(x^{(t)})]
x(t+1)−x(t)=Ut+1⋅[▽f(x(t+1))−▽f(x(t))]
此时,我们可以按照下式来计算增量(也称为拟牛顿条件):
Δ
x
t
=
U
t
+
1
⋅
Δ
g
t
\Delta x_t=U_{t+1}\cdot \Delta g_t
Δxt=Ut+1⋅Δgt
2、DFP
为了方便区分,下面把 U U U称作 D D D(表示DFP)
1)DFP结果
我们在已知
D
t
D_t
Dt的情况下,想要使用增量形式求取
D
t
+
1
=
Δ
D
t
+
D
t
D_{t+1} = \Delta D_t + D_t
Dt+1=ΔDt+Dt,构造
Δ
D
\Delta D
ΔD如下:
Δ
D
t
=
Δ
x
t
Δ
x
t
T
Δ
g
t
T
Δ
x
t
−
D
t
Δ
g
t
Δ
g
t
T
D
t
Δ
g
t
T
D
t
Δ
g
t
\Delta D_t = \frac{\Delta x_t\Delta x_t^T}{\Delta g_t^T\Delta x_t}-\frac{D_t\Delta g_t\Delta g_t^TD_t}{\Delta g_t^TD_t\Delta g_t}
ΔDt=ΔgtTΔxtΔxtΔxtT−ΔgtTDtΔgtDtΔgtΔgtTDt
2)DFP算法步骤
DFP算法的问题在于在求取增量的时候D矩阵仍要求逆
3、BFGS
为了方便区分,下面把 U U U称作 B B B(表示BFGS)
1)BFGS结果
Δ
B
t
=
Δ
g
t
Δ
g
t
T
Δ
x
t
T
Δ
g
t
−
B
t
Δ
x
t
Δ
x
t
T
B
t
Δ
x
t
T
B
t
Δ
x
t
\Delta B_t = \frac{\Delta g_t\Delta g_t^T}{\Delta x_t^T\Delta g_t}-\frac{B_t\Delta x_t\Delta x_t^TB_t}{\Delta x_t^TB_t\Delta x_t}
ΔBt=ΔxtTΔgtΔgtΔgtT−ΔxtTBtΔxtBtΔxtΔxtTBt
与DFS相比就是
Δ
x
\Delta x
Δx和
Δ
g
\Delta g
Δg调换了一下位置,但会为求取B矩阵的逆带来好处。
谢尔曼莫里森公式:描述当矩阵变化后,如何使用变化前矩阵的逆求变化后矩阵的逆
对于任意的非奇异方阵
A
A
A,
u
,
v
u,v
u,v是
n
n
n维向量,若
1
+
v
T
A
−
1
u
≠
0
1+v^TA^{-1}u\neq 0
1+vTA−1u=0,则:
(
A
+
u
v
T
)
−
1
=
A
−
1
−
(
A
−
1
u
)
(
v
T
A
−
1
)
1
+
v
T
A
−
1
u
(A+uv^T)^{-1} = A^{-1}-\frac{(A^{-1}u)(v^TA^{-1})}{1+v^TA^{-1}u}
(A+uvT)−1=A−1−1+vTA−1u(A−1u)(vTA−1)
通过引入两次谢尔曼莫里森公式,我们可以迭代求取得到
B
B
B的逆:
B
t
+
1
−
1
=
(
I
n
−
Δ
x
t
Δ
g
t
T
Δ
x
t
T
Δ
g
t
)
B
t
−
1
(
I
n
−
Δ
g
t
Δ
x
t
T
Δ
x
t
T
Δ
g
t
)
+
Δ
x
t
Δ
x
t
T
Δ
x
t
T
Δ
g
t
B^{-1}_{t+1}=\left (I_n-\frac{\Delta x_t \Delta g_t^T}{\Delta x_t^T \Delta g_t}\right )B_{t}^{-1}\left (I_n-\frac{\Delta g_t \Delta x_t^T}{\Delta x_t^T \Delta g_t}\right )+\frac{\Delta x_t \Delta x_t^T}{\Delta x_t^T \Delta g_t}
Bt+1−1=(In−ΔxtTΔgtΔxtΔgtT)Bt−1(In−ΔxtTΔgtΔgtΔxtT)+ΔxtTΔgtΔxtΔxtT
而一开始的B矩阵是一个单位矩阵,其逆就是自己
2)BFGS算步骤
4、L-BFGS
1)L-BFGS原理
在BFGS中,我们要保存
B
−
1
B^{-1}
B−1矩阵,实际上,我们仅保存每轮的
Δ
x
\Delta x
Δx和
Δ
g
\Delta g
Δg即可递归的计算当前的
B
B
B矩阵,从而减小内存占用:
B
t
+
1
−
1
=
(
∏
i
=
t
0
V
i
T
)
B
0
−
1
(
∏
i
=
0
t
V
i
)
+
∑
j
=
0
t
(
∏
i
=
t
j
+
1
V
i
T
)
(
ρ
j
Δ
x
j
Δ
x
j
T
)
(
∏
i
=
j
+
1
t
V
i
)
B^{-1}_{t+1} = \left (\prod_{i=t}^0 V_i^T \right )B_0^{-1} \left (\prod_{i=0}^t V_i\right )+\sum_{j=0}^{t} \left (\prod_{i=t}^{j+1} V_i^T \right ) \left ( \rho_j\Delta x_j \Delta x_j^T\right ) \left (\prod_{i=j+1}^t V_i \right )
Bt+1−1=(i=t∏0ViT)B0−1(i=0∏tVi)+j=0∑t(i=t∏j+1ViT)(ρjΔxjΔxjT)(i=j+1∏tVi)
其中:
ρ
t
=
1
Δ
x
t
T
Δ
g
t
V
t
=
I
n
−
ρ
t
Δ
g
t
Δ
x
t
T
\rho_t = \frac{1}{\Delta x_t^T \Delta g_t}\\ V_t = I_n-\rho_t \Delta g_t \Delta x_t^T
ρt=ΔxtTΔgt1Vt=In−ρtΔgtΔxtT
实际应用中,我们也可以仅适用最近的m个
Δ
x
\Delta x
Δx和
Δ
g
\Delta g
Δg来计算
B
−
1
B^{-1}
B−1
B
t
−
1
=
(
∏
i
=
t
−
1
t
−
m
V
i
T
)
B
0
−
1
(
∏
i
=
t
−
m
t
−
1
V
i
)
+
∑
j
=
t
−
1
t
−
m
(
∏
i
=
t
j
+
1
V
i
T
)
(
ρ
j
Δ
x
j
Δ
x
j
T
)
(
∏
i
=
j
+
1
t
V
i
)
B^{-1}_{t} = \left (\prod_{i=t-1}^{t-m} V_i^T \right )B_0^{-1} \left (\prod_{i=t-m}^{t-1} V_i\right )+\sum_{j=t-1}^{t-m} \left (\prod_{i=t}^{j+1} V_i^T \right ) \left ( \rho_j\Delta x_j \Delta x_j^T\right ) \left (\prod_{i=j+1}^t V_i \right )
Bt−1=(i=t−1∏t−mViT)B0−1(i=t−m∏t−1Vi)+j=t−1∑t−m(i=t∏j+1ViT)(ρjΔxjΔxjT)(i=j+1∏tVi)
2)L-BFGS应用
上述公式的代码实现如下,其中
s
i
=
Δ
x
i
s_i=\Delta x_i
si=Δxi,
y
i
=
Δ
g
i
y_i=\Delta g_i
yi=Δgi,
H
k
=
B
k
−
1
H_k=B_k^{-1}
Hk=Bk−1
因此,L-BFGS的算法流程如下: