多维无约束非线性优化

问题描述

对于一个极小化问题 m i n f ( X ) min\quad f(X) minf(X),其中 X X X是多维变量 X = x 1 … x n X = {x_{1}\dots x_{n}} X=x1xn

牛顿法

牛顿法原理

牛顿法的思想是将函数进行二阶展开。对于一个一维函数来说函数在 x 0 x_0 x0附近的二阶泰勒展开可以近似为 f ( x ) ≈ f ( x 0 ) + f ′ ( x 0 ) ( x − x 0 ) + 1 2 f ′ ′ ( x 0 ) ( x − x 0 ) 2 f(x) \approx f(x_0) + f'(x_0)(x - x_0) + \frac{1}{2}f''(x_0)(x - x_0)^2 f(x)f(x0)+f(x0)(xx0)+21f′′(x0)(xx0)2,那么对于多维变量求极小值同样也在 X 0 X_0 X0处泰勒展开为
f ( x ) ≈ f ( x 0 ) + ∇ f ( x 0 ) T ( x − x 0 ) + 1 2 ( x − x 0 ) T H ( x 0 ) ( x − x 0 ) f(\mathbf{x}) \approx f(\mathbf{x}_0) + \nabla f(\mathbf{x}_0)^T (\mathbf{x} - \mathbf{x}_0) + \frac{1}{2}(\mathbf{x} - \mathbf{x}_0)^T \mathbf{H}(\mathbf{x}_0) (\mathbf{x} - \mathbf{x}_0) f(x)f(x0)+f(x0)T(xx0)+21(xx0)TH(x0)(xx0)

  • ∇ f ( x 0 ) \nabla f(\mathbf{x}_0) f(x0) 是目标函数在 x 0 \mathbf{x}_0 x0 处的梯度向量(相当于一阶导)。
  • H ( x 0 ) \mathbf{H}(\mathbf{x}_0) H(x0) 是目标函数在 x 0 \mathbf{x}_0 x0 处的 Hessian 矩阵(相当于二阶导)

牛顿法的思想是找到使泰勒展开的梯度向量等于零的点,即 ∇ f ( x ) = 0 \nabla f(\mathbf{x}) = 0 f(x)=0。这可以通过求解以下方程来实现:

∇ f ( x 0 ) T + H ( x 0 ) ( x − x 0 ) = 0 \nabla f(\mathbf{x}_0)^{T} + \mathbf{H}(\mathbf{x}_{0})(\mathbf{x} - \mathbf{x}_0) = 0 f(x0)T+H(x0)(xx0)=0

解这个方程将给出下一个迭代的 x \mathbf{x} x
我们可以计算出 x \mathbf{x} x,即

x = x 0 − H ( x 0 ) − 1 ∇ f ( x 0 ) \mathbf{x} = \mathbf{x}_0 - \mathbf{H}(\mathbf{x}_0)^{-1} \nabla f(\mathbf{x}_0) x=x0H(x0)1f(x0)

这是迭代的下一个估计值。在每一次迭代中,我们使用当前的 x \mathbf{x} x 作为 x 0 \mathbf{x}_0 x0,然后计算下一个估计值,直到收敛到目标函数的极小值点。

并且这个过程可以迭代进行,以逐渐接近目标函数的极小值。这是多维变量情况下的牛顿法的基本思想。

Levenberg-Marquardt 算法

在牛顿法的解更新过程中用到了 H ( x 0 ) − 1 \mathbf{H}(\mathbf{x}_0)^{-1} H(x0)1,但是在某些时候 H ( x 0 ) − 1 \mathbf{H}(\mathbf{x}_0)^{-1} H(x0)1可能会变得不可逆或者近似不可逆,这样将会对算法的稳定性产生影响。因此针对这一点作出改进,将 H ( x 0 ) − 1 \mathbf{H}(\mathbf{x}_0)^{-1} H(x0)1替换为 ( H ( x 0 ) + λ I ) − 1 (\mathbf{H}(\mathbf{x}_0) + \lambda I)^{-1} (H(x0)+λI)1,替换之后的更新公式如下

  1. 计算梯度向量: ∇ f ( x 0 ) \nabla f(\mathbf{x}_0) f(x0)

  2. 计算黑塞矩阵: H ( x 0 ) \mathbf{H}(\mathbf{x}_0) H(x0)

  3. 计算搜索方向: d = − ( H ( x 0 ) + λ I ) − 1 ∇ f ( x 0 ) \mathbf{d} = -(\mathbf{H}(\mathbf{x}_0) + \lambda I)^{-1} \nabla f(\mathbf{x}_0) d=(H(x0)+λI)1f(x0)

  4. 更新当前解: x 1 = x 0 + α d \mathbf{x}_1 = \mathbf{x}_0 + \alpha \mathbf{d} x1=x0+αd

这里, λ \lambda λ 是一个正的正则化参数, I I I 是单位矩阵, α \alpha α 是一个步长(或学习率)参数,用来控制每次迭代的步进大小。

这个修正后的公式中,通过添加 λ I \lambda I λI 到黑塞矩阵的逆矩阵中,可以提高算法的数值稳定性。当 λ \lambda λ 足够小时,这个修正可以避免黑塞矩阵变得不可逆或近似不可逆的情况,从而确保迭代过程能够顺利进行。 λ \lambda λ 的选择通常需要根据具体问题进行调整,以平衡数值稳定性和收敛速度。

拟牛顿法

在牛顿法的迭代过程中,需要不断计算 H ( x 0 ) \mathbf{H}(\mathbf{x}_0) H(x0),计算复杂度比较高,为了降低计算复杂度,针对 H ( x 0 ) \mathbf{H}(\mathbf{x}_0) H(x0)作出了改进。那么该如何去近似 H ( x 0 ) \mathbf{H}(\mathbf{x}_0) H(x0)呢?根据二阶泰勒展开
f ( x ) ≈ f ( x 0 ) + ∇ f ( x 0 ) T ( x − x 0 ) + 1 2 ( x − x 0 ) T H ( x 0 ) ( x − x 0 ) f(\mathbf{x}) \approx f(\mathbf{x}_0) + \nabla f(\mathbf{x}_0)^T (\mathbf{x} - \mathbf{x}_0) + \frac{1}{2}(\mathbf{x} - \mathbf{x}_0)^T \mathbf{H}(\mathbf{x}_0) (\mathbf{x} - \mathbf{x}_0) f(x)f(x0)+f(x0)T(xx0)+21(xx0)TH(x0)(xx0)
有在 x k + 1 x_{k+1} xk+1附近两边同时求导
∇ f ( x ) T = ∇ f ( x k + 1 ) T + H ( x k + 1 ) ( x − x k + 1 ) \nabla f(\mathbf{x})^{T} = \nabla f(\mathbf{x}_{k+1})^{T} + \mathbf{H}(\mathbf{x}_{k+1})(\mathbf{x} - \mathbf{x}_{k+1}) f(x)T=f(xk+1)T+H(xk+1)(xxk+1)
x x x换为 x k x_{k} xk
∇ f ( x k ) T = ∇ f ( x k + 1 ) T + H ( x k + 1 ) ( x k − x k + 1 ) \nabla f(\mathbf{x_k})^{T} = \nabla f(\mathbf{x}_{k+1})^{T} + \mathbf{H}(\mathbf{x}_{k+1})(\mathbf{x_k} - \mathbf{x}_{k+1}) f(xk)T=f(xk+1)T+H(xk+1)(xkxk+1)

拟牛顿法的目标是近似牛顿法的迭代,以减少计算Hessian矩阵 H ( x ) \mathbf{H}(\mathbf{x}) H(x) 的复杂性。通过近似 H ( x ) \mathbf{H}(\mathbf{x}) H(x),我们可以使用以下迭代公式来更新估计的Hessian矩阵:

H k + 1 ( x ) ≈ H ( x k ) + Δ H \mathbf{H}_{k+1}(\mathbf{x}) \approx \mathbf{H}(\mathbf{x}_k) + \Delta H Hk+1(x)H(xk)+ΔH

现在,我们可以继续推导。将 ∇ f ( x k ) T \nabla f(\mathbf{x}_k)^T f(xk)T 代入:

∇ f ( x k ) T = ∇ f ( x k + 1 ) T + H ( x k + 1 ) ( x k − x k + 1 ) \nabla f(\mathbf{x}_k)^T = \nabla f(\mathbf{x}_{k+1})^T + \mathbf{H}(\mathbf{x}_{k+1})(\mathbf{x}_k - \mathbf{x}_{k+1}) f(xk)T=f(xk+1)T+H(xk+1)(xkxk+1)

这个方程的目标是解出 H ( x k + 1 ) \mathbf{H}(\mathbf{x}_{k+1}) H(xk+1),因此我们可以将 ∇ f ( x k ) T \nabla f(\mathbf{x}_k)^T f(xk)T 移到等式的左边,并整理得到:

∇ f ( x k ) T − ∇ f ( x k + 1 ) T = H ( x k + 1 ) ( x k − x k + 1 ) \nabla f(\mathbf{x}_k)^T - \nabla f(\mathbf{x}_{k+1})^T = \mathbf{H}(\mathbf{x}_{k+1})(\mathbf{x}_k - \mathbf{x}_{k+1}) f(xk)Tf(xk+1)T=H(xk+1)(xkxk+1)

现在,我们可以通过逆转等式来估计 H ( x k + 1 ) \mathbf{H}(\mathbf{x}_{k+1}) H(xk+1)

H ( x k + 1 ) ≈ ∇ f ( x k ) T − ∇ f ( x k + 1 ) T x k − x k + 1 \mathbf{H}(\mathbf{x}_{k+1}) \approx \frac{\nabla f(\mathbf{x}_k)^T - \nabla f(\mathbf{x}_{k+1})^T}{\mathbf{x}_k - \mathbf{x}_{k+1}} H(xk+1)xkxk+1f(xk)Tf(xk+1)T

这个近似的Hessian矩阵 H ( x k + 1 ) \mathbf{H}(\mathbf{x}_{k+1}) H(xk+1) 可以用于拟牛顿法的下一次迭代。通常,为了稳定性,还可以应用一些修正策略,如DFP(Davidon-Fletcher-Powell)或BFGS(Broyden-Fletcher-Goldfarb-Shanno)算法,以确保矩阵是正定的。这样,拟牛顿法可以在迭代中逐渐逼近牛顿法,但避免了计算完整Hessian矩阵的高计算复杂度。

DFP算法

当引入这些符号定义后,我们可以继续推导DFP(Davidon-Fletcher-Powell)算法。DFP算法是一种经典的拟牛顿法算法之一,它使用一个近似的Hessian矩阵来迭代优化问题。

我们已经定义了:

  • s k = x k − x k + 1 s_k = x_k - x_{k+1} sk=xkxk+1:表示在相邻两次迭代之间的变化量。
  • q k = ∇ f ( x k ) T − ∇ f ( x k + 1 ) T q_k = \nabla f(\mathbf{x}_k)^T - \nabla f(\mathbf{x}_{k+1})^T qk=f(xk)Tf(xk+1)T:表示在相邻两次迭代之间的梯度变化。

现在,我们可以使用这些定义来估计DFP算法中的近似Hessian矩阵:

H k + 1 ≈ H k + s k s k T s k T q k − H k q k q k T H k T q k T H k q k \mathbf{H}_{k+1} \approx \mathbf{H}_k + \frac{s_k s_k^T}{s_k^T q_k} - \frac{\mathbf{H}_k q_k q_k^T \mathbf{H}_{k}^T}{q_k^T \mathbf{H}_k q_k} Hk+1Hk+skTqkskskTqkTHkqkHkqkqkTHkT

这个方程表示DFP算法中如何更新近似的Hessian矩阵 H k + 1 \mathbf{H}_{k+1} Hk+1,以便在下一次迭代中使用。这个更新过程是通过添加两项来完成的:

  1. 第一项 s k s k T s k T q k \frac{s_k s_k^T}{s_k^T q_k} skTqkskskT s k s_k sk为基础构建一个秩-1矩阵,用来近似Hessian的逆。
  2. 第二项 − H k q k q k T H k q k T H k q k -\frac{\mathbf{H}_k q_k q_k^T \mathbf{H}_k}{q_k^T \mathbf{H}_k q_k} qkTHkqkHkqkqkTHk 通过考虑梯度变化来修正Hessian矩阵,以保持正定性。

这个更新规则确保了拟牛顿法在每一步都生成一个正定的近似Hessian矩阵,以便进行可靠的优化。

BFGS算法

BFGS(Broyden-Fletcher-Goldfarb-Shanno)算法是另一种经典的拟牛顿法算法,用于解决无约束的非线性优化问题。与DFP算法类似,BFGS算法也使用一个近似的Hessian矩阵进行迭代。

在BFGS算法中,我们可以使用类似的符号定义,包括:

  • s k = x k + 1 − x k s_k = x_{k+1} - x_k sk=xk+1xk:表示在相邻两次迭代之间的变化量。
  • q k = ∇ f ( x k + 1 ) − ∇ f ( x k ) q_k = \nabla f(\mathbf{x}_{k+1}) - \nabla f(\mathbf{x}_k) qk=f(xk+1)f(xk):表示在相邻两次迭代之间的梯度变化。

然后,BFGS算法的Hessian矩阵更新规则如下:

H k + 1 ≈ H k + q k q k T q k T s k − H k s k s k T H k T s k T H k s k \mathbf{H}_{k+1} \approx \mathbf{H}_k + \frac{q_k q_k^T}{q_k^T s_k} - \frac{\mathbf{H}_k s_k s_k^T \mathbf{H}_{k}^T}{s_k^T \mathbf{H}_k s_k} Hk+1Hk+qkTskqkqkTskTHkskHkskskTHkT

这个方程表示BFGS算法中如何更新近似的Hessian矩阵 H k + 1 \mathbf{H}_{k+1} Hk+1 以便在下一次迭代中使用。这个更新过程类似于DFP算法,也是通过添加两项来完成的:

  1. 第一项 q k q k T q k T s k \frac{q_k q_k^T}{q_k^T s_k} qkTskqkqkT q k q_k qk 为基础构建一个秩-1矩阵,用来近似Hessian的逆。
  2. 第二项 − H k s k s k T H k s k T H k s k -\frac{\mathbf{H}_k s_k s_k^T \mathbf{H}_k}{s_k^T \mathbf{H}_k s_k} skTHkskHkskskTHk 通过考虑梯度变化来修正Hessian矩阵,以保持正定性。

BFGS和DFP不同的地方还在于计算步长时,DFP用 H ∗ ∇ f H* \nabla f Hf算,BFGS用 H − 1 ∗ ∇ f H^{-1}* \nabla f H1f算,相当于BFGS是对黑塞矩阵进行估计,而DFP是对黑塞矩阵的逆进行估计。

DFS与BFGS为什么要这样设置?推导参考

你可能感兴趣的:(机器学习,人工智能,算法)