非线性方程指方程的因变量与自变量之间的关系不是线性关系的方程,比如平方关系、对数关系、指数关系、三角函数关系等。对于此类方程,求解n元实函数f在整个n维向量空间Rn上的最优值点往往很难得到精确解,经常需要求近似解问题。
求解该类方程的最优化问题的方法大多是逐次一维搜索的迭代算法,基本思想是在一个近似点处选定一个有利于搜索方向,沿这个方向进行一维搜索,得到新的近似点。如此反复迭代,直到满足预定的精度要求为止。
常用的迭代算法有:
梯度法与牛顿法的比较:
梯度下降法每次选择当前位置梯度最大的方向,然后更新;牛顿法在当前位置选择方向时,不仅考虑是否是当前位置梯度最大的方向,还考虑该方向上继续更新时梯度是否会变得更大。因此牛顿法比梯度下降法看得更远一点,能更快地走到最底部。但是因为牛顿法需要计算二阶导数,计算量更大,实际使用时不如梯度下降法计算速度快。
牛顿法的基本思想是:在当前位置x0对f(x)做二阶泰勒展开,进而找到下一个位置x的估计值。
f ( x ) = f ( x 0 ) + f ′ ( x 0 ) ( x − x 0 ) + 1 2 f ′ ′ ( x 0 ) ( x − x 0 ) 2 f(x)=f\left(x_{0}\right)+f^{\prime}\left(x_{0}\right)\left(x-x_{0}\right)+\frac{1}{2} f^{\prime \prime}\left(x_{0}\right)\left(x-x_{0}\right)^{2} f(x)=f(x0)+f′(x0)(x−x0)+21f′′(x0)(x−x0)2
对首式左右两边求导,得
f ′ ( x ) = f ′ ( x 0 ) + f ′ ′ ( x 0 ) ( x − x 0 ) f^{\prime}(x)=f^{\prime}\left(x_{0}\right)+f^{\prime \prime}\left(x_{0}\right)\left(x-x_{0}\right) f′(x)=f′(x0)+f′′(x0)(x−x0)
由于我们要求极值,此时有
f ′ ( x ) = 0 f^{\prime}(x)=0 f′(x)=0
于是上式变为
f ′ ( x 0 ) + f ′ ′ ( x 0 ) ( x − x 0 ) = 0 f^{\prime}\left(x_{0}\right)+f^{\prime \prime}\left(x_{0}\right)\left(x-x_{0}\right)=0 f′(x0)+f′′(x0)(x−x0)=0
于是可得求下一步位置x的公式
x = x 0 − f ′ ( x 0 ) f ′ ′ ( x 0 ) x=x_{0}-\frac{f^{\prime}\left(x_{0}\right)}{f^{\prime \prime}\left(x_{0}\right)} x=x0−f′′(x0)f′(x0)
写成迭代公式形式为
x k + 1 = x k − f ′ ( x k ) f ′ ′ ( x k ) , k = 0 , 1 , ⋯ x_{k+1}=x_{k}-\frac{f^{\prime}\left(x_{k}\right)}{f^{\prime \prime}\left(x_{k}\right)}, \quad k=0,1, \cdots xk+1=xk−f′′(xk)f′(xk),k=0,1,⋯
上面是对单变量函数的牛顿法,对于多变量函数,二阶泰勒展开公式如下:
f ( x ) = f ( x 0 ) + ∇ f ( x 0 ) ⋅ ( x − x 0 ) + 1 2 ⋅ ( x − x 0 ) T ⋅ ∇ 2 f ( x 0 ) ⋅ ( x − x 0 ) f(x)=f(x_{0})+\nabla f(x_{0}) \cdot(x-x_{0})+\frac{1}{2} \cdot(x-x_{0})^{T} \cdot \nabla^{2} f(x_{0}) \cdot(x-x_{0}) f(x)=f(x0)+∇f(x0)⋅(x−x0)+21⋅(x−x0)T⋅∇2f(x0)⋅(x−x0)
其中▽f是f的梯度向量,▽2f是f的海森矩阵。即:
∇ f = [ ∂ f ∂ x 1 ∂ f ∂ x 2 ⋮ ∂ f ∂ x N ] \nabla f=\left[ \begin{array}{c}{\frac{\partial f}{\partial x_{1}}} \\\\ {\frac{\partial f}{\partial x_{2}}} \\\\ {\vdots} \\\\ {\frac{\partial f}{\partial x_{N}}}\end{array}\right] ∇f=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡∂x1∂f∂x2∂f⋮∂xN∂f⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤
∇ 2 f = [ ∂ 2 f ∂ x 1 2 ∂ 2 f ∂ x 1 ∂ x 2 … ∂ 2 f ∂ x 1 ∂ x N ∂ 2 f ∂ x 2 ∂ x 1 ∂ 2 f ∂ x 2 2 … ∂ 2 f ∂ x 2 ∂ x N ∂ 2 f ∂ x N ∂ x 1 ∂ 2 f ∂ x N ∂ x 2 ⋯ ∂ 2 f ∂ x N 2 ] \nabla^{2} f=\left[ \begin{array}{cccc}{\frac{\partial^{2} f}{\partial x_{1}^{2}}} & {\frac{\partial^{2} f}{\partial x_{1} \partial x_{2}}} & {\dots} & {\frac{\partial^{2} f}{\partial x_{1} \partial x_{N}}} \\\\ {\frac{\partial^{2} f}{\partial x_{2} \partial x_{1}}} & {\frac{\partial^{2} f}{\partial x_{2}^{2}}} & {\dots} & {\frac{\partial^{2} f}{\partial x_{2} \partial x_{N}}} \\\\ {\frac{\partial^{2} f}{\partial x_{N} \partial x_{1}}} & {\frac{\partial^{2} f}{\partial x_{N} \partial x_{2}}} & {\cdots} & {\frac{\partial^{2} f}{\partial x_{N}^{2}}}\end{array}\right] ∇2f=⎣⎢⎢⎢⎢⎢⎢⎡∂x12∂2f∂x2∂x1∂2f∂xN∂x1∂2f∂x1∂x2∂2f∂x22∂2f∂xN∂x2∂2f……⋯∂x1∂xN∂2f∂x2∂xN∂2f∂xN2∂2f⎦⎥⎥⎥⎥⎥⎥⎤
海森矩阵其实就是多变量函数的所有二阶导数组成的NXN矩阵(假设有N个变量)。若f的混合偏导数可以交换次序(这个混合偏导数满足在(x0,y0)点连续即可),则海森矩阵是一个对称矩阵。
下面将▽f记为g,▽2f记为H。
同样对上面的二阶泰勒展开式两边求导,得:
∇ f ( x ) = g 0 + H 0 ⋅ ( x − x 0 ) \nabla f(x)=g_{0}+H_{0} \cdot(x-x_{0}) ∇f(x)=g0+H0⋅(x−x0)
又极值点处有
∇ f ( x ) = 0 \nabla f(x)=0 ∇f(x)=0
于是可得
x = x 0 − H 0 − 1 ⋅ g 0 x=x_{0}-H_{0}^{-1} \cdot g_{0} x=x0−H0−1⋅g0
写成迭代公式形式为
x k + 1 = x k − H k − 1 ⋅ g k , k = 0 , 1 , ⋯ x_{k+1}=x_{k}-H_{k}^{-1} \cdot g_{k}, \quad k=0,1, \cdots xk+1=xk−Hk−1⋅gk,k=0,1,⋯
这就是牛顿迭代法,其搜索方向为
d k = − H k − 1 ⋅ g k d_{k}=-H_{k}^{-1} \cdot g_{k} dk=−Hk−1⋅gk
又称为牛顿方向。
牛顿法需要计算二阶偏导数,计算量较大。而且有时目标函数的海森矩阵无法保持正定,此时牛顿法会失效。拟牛顿法的思想就是不使用海森矩阵,而是构造一个近似海森矩阵(或其逆矩阵)的正定对称阵来代替,在“拟牛顿”的条件下优化目标函数。
先将函数f(x)在xk+1处二阶泰勒展开:
f ( x ) ≈ f ( x k + 1 ) + ∇ f ( x k + 1 ) ⋅ ( x − x k + 1 ) + 1 2 ⋅ ( x − x k + 1 ) T ⋅ ∇ 2 f ( x k + 1 ) ⋅ ( x − x k + 1 ) f(x) \approx f(x_{k+1})+\nabla f(x_{k+1}) \cdot(x-x_{k+1})+\frac{1}{2} \cdot(x-x_{k+1})^{T} \cdot \nabla^{2} f(x_{k+1}) \cdot(x-x_{k+1}) f(x)≈f(xk+1)+∇f(xk+1)⋅(x−xk+1)+21⋅(x−xk+1)T⋅∇2f(xk+1)⋅(x−xk+1)
两边求一阶偏导数(这里是一个一阶偏导数矩阵),得:
∇ f ( x ) ≈ ∇ f ( x k + 1 ) + H k + 1 ⋅ ( x − x k + 1 ) \nabla f(x) \approx \nabla f(x_{k+1})+H_{k+1} \cdot(x-x_{k+1}) ∇f(x)≈∇f(xk+1)+Hk+1⋅(x−xk+1)
取x=xk,得
g k + 1 − g k ≈ H k + 1 ⋅ ( x k + 1 − x k ) g_{k+1}-g_{k} \approx H_{k+1} \cdot(x_{k+1}-x_{k}) gk+1−gk≈Hk+1⋅(xk+1−xk)
令
s k = x k + 1 − x k , y k = g k + 1 − g k s_{k}=x_{k+1}-x_{k}, y_{k}=g_{k+1}-g_{k} sk=xk+1−xk,yk=gk+1−gk
则上式可写成
y k ≈ H k + 1 ⋅ s k 或 s k ≈ H k + 1 − 1 ⋅ y k y_{k} \approx H_{k+1} \cdot s_{k} 或 s_{k} \approx H_{k+1}^{-1} \cdot y_{k} yk≈Hk+1⋅sk或sk≈Hk+1−1⋅yk
这就是拟牛顿条件。
也可以写成
y k = B k + 1 ⋅ s k 或 s k = D k + 1 ⋅ y k y_{k}=B_{k+1} \cdot s_{k} 或 s_{k}=D_{k+1} \cdot y_{k} yk=Bk+1⋅sk或sk=Dk+1⋅yk
Bk+1和Dk+1分别代表海森矩阵和海森矩阵的逆矩阵。
在满足此条件的基础上如何构造近似海塞矩阵呢?主要有两种方法:DFP算法和BFGS算法。
该算法的思想是通过迭代方法,逐步近似拟合海森矩阵的逆矩阵。迭代公式如下:
D k + 1 = D k + Δ D k , k = 0 , 1 , 2 , ⋯ D_{k+1}=D_{k}+\Delta D_{k}, \quad k=0,1,2, \cdots Dk+1=Dk+ΔDk,k=0,1,2,⋯
其中D0通常取单位矩阵I。
这个迭代公式的关键是每一步的校正矩阵ΔDK的构造。我们采用待定法,先将ΔDK待定为下面的形式:
Δ D k = α u u T + β v v T \Delta D_{k}=\alpha u u^{T}+\beta v v^{T} ΔDk=αuuT+βvvT
α和β为待定系数,u和v为待定向量。uuT和vvT均为对称矩阵,因此可以保证ΔDK也是对称矩阵。
将待定公式代入迭代公式,并结合上面拟牛顿条件最后的sk和yk的表达式,可得:
s k = D k y k + α u u T y k + β v v T y k s_{k}=D_{k} y_{k}+\alpha u u^{T} y_{k}+\beta v v^{T} y_{k} sk=Dkyk+αuuTyk+βvvTyk
继续将上式化为
s k = D k y k + u ( α u T y k ) + v ( β v T y k ) = D k y k + ( α u T y k ) u + ( β v T y k ) v \begin{aligned} s_{k} &=D_{k} y_{k}+u(\alpha u^{T} y_{k})+v(\beta v^{T} y_{k}) \\\\ &=D_{k} y_{k}+(\alpha u^{T} y_{k})u+(\beta v^{T} y_{k})v \end{aligned} sk=Dkyk+u(αuTyk)+v(βvTyk)=Dkyk+(αuTyk)u+(βvTyk)v
上面之所以可以这样交换,是因为
α u T y k , β v T y k \alpha u^{T} y_{k} ,\beta v^{T} y_{k} αuTyk,βvTyk
是两个数,我们不妨将其设为
α u T y k = 1 , β v T y k = − 1 \alpha u^{T} y_{k}=1, \beta v^{T} y_{k}=-1 αuTyk=1,βvTyk=−1
即
α = 1 u T y k , β = − 1 v T y k \alpha=\frac{1}{u^{T} y_{k}}, \beta=-\frac{1}{v^{T} y_{k}} α=uTyk1,β=−vTyk1
将上式代入sk转化后的公式,得
u − v = s k − D k y k u-v=s_{k}-D_{k} y_{k} u−v=sk−Dkyk
我们不妨直接取
u = s k , v = D k y k u=s_{k}, v=D_{k} y_{k} u=sk,v=Dkyk
代回上面α和β的表达式,得:
α = 1 s k T y k , β = − 1 ( D k y k ) T y k = − 1 y k T D k y k \alpha=\frac{1}{s_{k}^{T} y_{k}}, \beta=-\frac{1}{(D_{k} y_{k})^{T} y_{k}}=-\frac{1}{y_{k}^{T} D_{k} y_{k}} α=skTyk1,β=−(Dkyk)Tyk1=−ykTDkyk1
将上两式代回ΔDK的表达式,得
Δ D k = s k s k T s k T y k − D k y k y k T D k y k T D k y k \Delta D_{k}=\frac{s_{k} s_{k}^{T}}{s_{k}^{T} y_{k}}-\frac{D_{k} y_{k} y_{k}^{T} D_{k}}{y_{k}^{T} D_{k} y_{k}} ΔDk=skTykskskT−ykTDkykDkykykTDk
这样我们就可以使用迭代公式来进行拟牛顿法的计算了。
DFP算法步骤:
BFGS算法是构造近似海森矩阵(而不是构造海森矩阵的逆矩阵),同样,我们使用迭代的方式来逐步逼近。我们使用B来表示海森矩阵的近似矩阵,而在DFP算法中我们是直接使用D来构造近似海森矩阵的逆矩阵。
BFGS算法的迭代公式:
B k + 1 = B k + Δ B k , k = 0 , 1 , 2 , ⋯ B_{k+1}=B_{k}+\Delta B_{k}, \quad k=0,1,2, \cdots Bk+1=Bk+ΔBk,k=0,1,2,⋯
与DFP一样,我们设
Δ B k = α u u T + β v v T \Delta B_{k}=\alpha u u^{T}+\beta v v^{T} ΔBk=αuuT+βvvT
于是有
y k = B k s k + ( α u T s k ) u + ( β v T s k ) v y_{k}=B_{k} s_{k}+(\alpha u^{T} s_{k})u+(\beta v^{T} s_{k})v yk=Bksk+(αuTsk)u+(βvTsk)v
也令
α u T s k = 1 , β v T s k = − 1 \alpha u^{T} s_{k}=1, \beta v^{T} s_{k}=-1 αuTsk=1,βvTsk=−1
u = y k , v = B k s k u=y_{k}, v=B_{k} s_{k} u=yk,v=Bksk
可得
α = 1 y k T s k , β = − 1 s k T B k s k \alpha=\frac{1}{y_{k}^{T} s_{k}}, \beta=-\frac{1}{s_{k}^{T} B_{k} s_{k}} α=ykTsk1,β=−skTBksk1
于是ΔBk为
Δ B k = y k y k T y k T s k − B k s k s k T B k s k T B k s k \Delta B_{k}=\frac{y_{k} y_{k}^{T}}{y_{k}^{T} s_{k}}-\frac{B_{k} s_{k} s_{k}^{T} B_{k}}{s_{k}^{T} B_{k} s_{k}} ΔBk=ykTskykykT−skTBkskBkskskTBk
该算法的流程和DFP算法完全一样,只是将迭代公式换为BFGS算法的迭代公式,搜索方向换为:
d k = − B k − 1 ⋅ g k d_{k}=-B_{k}^{-1} \cdot g_{k} dk=−Bk−1⋅gk
计算Bk+1公式为:
B k + 1 = B k + y k y k T y k T s k − B k s k s k T B k s k T B k s k B_{k+1}=B_{k}+\frac{y_{k} y_{k}^{T}}{y_{k}^{T} s_{k}}-\frac{B_{k} s_{k} s_{k}^{T} B_{k}}{s_{k}^{T} B_{k} s_{k}} Bk+1=Bk+ykTskykykT−skTBkskBkskskTBk
其他步骤与DFP算法完全一样,具体过程可以参考上面的DFP算法。