对于一个极小化问题 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=x1…xn
牛顿法的思想是将函数进行二阶展开。对于一个一维函数来说函数在 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)(x−x0)+21f′′(x0)(x−x0)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(x−x0)+21(x−x0)TH(x0)(x−x0)
牛顿法的思想是找到使泰勒展开的梯度向量等于零的点,即 ∇ 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)(x−x0)=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=x0−H(x0)−1∇f(x0)
这是迭代的下一个估计值。在每一次迭代中,我们使用当前的 x \mathbf{x} x 作为 x 0 \mathbf{x}_0 x0,然后计算下一个估计值,直到收敛到目标函数的极小值点。
并且这个过程可以迭代进行,以逐渐接近目标函数的极小值。这是多维变量情况下的牛顿法的基本思想。
在牛顿法的解更新过程中用到了 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,替换之后的更新公式如下
计算梯度向量: ∇ f ( x 0 ) \nabla f(\mathbf{x}_0) ∇f(x0)
计算黑塞矩阵: H ( x 0 ) \mathbf{H}(\mathbf{x}_0) H(x0)
计算搜索方向: 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)−1∇f(x0)
更新当前解: 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(x−x0)+21(x−x0)TH(x0)(x−x0)
有在 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)(x−xk+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)(xk−xk+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)(xk−xk+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)T−∇f(xk+1)T=H(xk+1)(xk−xk+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)≈xk−xk+1∇f(xk)T−∇f(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(Davidon-Fletcher-Powell)算法。DFP算法是一种经典的拟牛顿法算法之一,它使用一个近似的Hessian矩阵来迭代优化问题。
我们已经定义了:
现在,我们可以使用这些定义来估计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+1≈Hk+skTqkskskT−qkTHkqkHkqkqkTHkT
这个方程表示DFP算法中如何更新近似的Hessian矩阵 H k + 1 \mathbf{H}_{k+1} Hk+1,以便在下一次迭代中使用。这个更新过程是通过添加两项来完成的:
这个更新规则确保了拟牛顿法在每一步都生成一个正定的近似Hessian矩阵,以便进行可靠的优化。
BFGS(Broyden-Fletcher-Goldfarb-Shanno)算法是另一种经典的拟牛顿法算法,用于解决无约束的非线性优化问题。与DFP算法类似,BFGS算法也使用一个近似的Hessian矩阵进行迭代。
在BFGS算法中,我们可以使用类似的符号定义,包括:
然后,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+1≈Hk+qkTskqkqkT−skTHkskHkskskTHkT
这个方程表示BFGS算法中如何更新近似的Hessian矩阵 H k + 1 \mathbf{H}_{k+1} Hk+1 以便在下一次迭代中使用。这个更新过程类似于DFP算法,也是通过添加两项来完成的:
BFGS和DFP不同的地方还在于计算步长时,DFP用 H ∗ ∇ f H* \nabla f H∗∇f算,BFGS用 H − 1 ∗ ∇ f H^{-1}* \nabla f H−1∗∇f算,相当于BFGS是对黑塞矩阵进行估计,而DFP是对黑塞矩阵的逆进行估计。
DFS与BFGS为什么要这样设置?推导参考