【Optimization in Operations Research 运筹学】牛顿法、高斯牛顿法、拟牛顿法与BFGS与为什么H要正定牛顿法亮点与弊端
牛顿法
\(F(x+\Delta x)=F(x)+F'(x)\Delta x+\frac{1}{2}F''(x)\Delta x^2\)
泰勒展开之后保留二次项
然后对展开式再进行求导 令导数等于0 直接得到前进的步长和方向 即\(Hx = b\)这里的\(x\)就是牛顿法求解的前进步长和方向。
如何理解呢?
加\(\Delta x\)之后得到的解析式再对\(x\)进行求导 得到导数等于0 则必然是一个极值点 因此此次前进的\(\Delta x\)是直接奔着下一次的结果的极值点方向去的
为什么H要至少半正定?
\(F(x+\Delta x)=F(x)+F'(x)\Delta x+\frac{1}{2}F''(x)\Delta x^2\)
展开后一次导数为0(因为至少要是极值点 一阶导数必为0)
即\(F'(x)\Delta x = 0\)
任选一个\(\Delta x\)保证泰勒展开后原函数 + 0 + 二次项,中的二次项必须大于0,这样\(F(x + \Delta x)\)才会大于\(f(x)\)此时就是任意前进\(\Delta x\),都会使得\(F(x)\)变大,我们的目的是变小。
\(F(x+\Delta x)=F(x)+0+\frac{1}{2}F''(x)\Delta x^2 > F(x)\)
高斯牛顿法
牛顿法直接对目标函数进行展开,而高斯牛顿法是先对里面\(f\)展开,然后再展开求导。
\(f\left(x+\Delta x\right)\approx f\left(x\right)+J\left(x\right)\Delta x\)
然后将上式对\(\Delta x\)求导,且导数为0:
随后得到:
拟牛顿法与BFGS
拟牛顿法解决了牛顿法迭代失败,对初始值要求高的问题。其中BFGS方法显著有效。
牛顿法的结果:
\(\nabla^2f(\mathbf{x}^{(t)})\Delta\mathbf{x}=-\nabla f(\mathbf{x}^{(t)})\)
将二次求导结果逆过去:
\(\Delta\mathbf{x}=-\nabla^2f(\mathbf{x}^{(t)})^{-1}\nabla f(\mathbf{x}^{(t)})\)
\(\mathbf{D}_t\)即为优化的方向:
\(\Delta\mathbf{x}^{(t+1)}=-\mathbf{D}_t\nabla f\left(\mathbf{x}^{(t)}\right)\)
然后理解一下二阶导数的性质:
\(\nabla f(\mathbf{x}^{(t+1)})-\nabla f(\mathbf{x}^{(t)})\approx\nabla^2f(\mathbf{x}^{(t)})(\mathbf{x}^{(t+1)}-\mathbf{x}^{(t)})\)
\(\nabla^2f(\mathbf{x}^{(t)})^{-1}(\nabla f(\mathbf{x}^{(t+1)})-\nabla f(\mathbf{x}^{(t)}))\approx\mathbf{x}^{(t+1)}-\mathbf{x}^{(t)}\)
上述两个式子可以重写一下:
\(\mathbf{D}_{t+1}\mathbf{g}=\mathbf{d}\)
\(\mathbf{d}\triangleq\mathbf{x}^{(t+1)}-\mathbf{x}^{(t)}\)
\(\mathbf{g}\triangleq\nabla f(\mathbf{x}^{(t+1)})-\nabla f(\mathbf{x}^{(t)})\)
BFGS公式认为\(\mathbf{D}_t\)初始值为单位阵,最大化问题为负的单位阵。然后随着迭代,\(\mathbf{D}_t\)会随着下面的公式进行更新。
\(\mathbf{D}_{t+1}\leftarrow\mathbf{D}_t+\left(\mathbf{1}+\frac{\mathbf{g}\mathbf{D}_t\mathbf{g}}{\mathbf{d}\cdot\mathbf{g}}\right)\frac{\mathbf{d}\mathbf{d}^\mathrm{T}}{\mathbf{d}\cdot\mathbf{g}}-\frac{\mathbf{D}_t\mathbf{g}\mathbf{d}^\mathrm{T}+\mathbf{d}\mathbf{g}^\mathrm{T}\mathbf{D}_t}{\mathbf{d}\cdot\mathbf{g}}\)
实际迭代过程类似于牛顿法,只是在当前求解最优\(\Delta x\)后,\(x\)更新前进,随后需要更新一下\(\mathbf{D}_t\),然后迭代次数+1,进入下次迭代。