system: [SYSTEM]

user: 4. 拟牛顿法 牛顿法，它的突出优点是收敛很快，但是运用牛顿法需要计算二阶偏导数，而目标函数的Hessian矩阵可能非正定。由于实际问题的目标函数往往相当复杂，计算二阶导数矩阵及其逆矩阵相当困难或根本不可能，因此，确定牛顿方向存在很大的障碍。为避免计算二阶导数矩阵 ∇ 2 f ( X ( k ) ) 及其逆矩阵 [ ∇ 2 f ( X ( k ) ) ] − 1 ，提出了拟牛顿法。 拟牛顿法的基本思想：使用不含二阶导数的矩阵 H k 近似替代牛顿法中的Hessian阵的逆矩阵 [ ∇ 2 f ( X ( k ) ) ] − 1 ，构造 H k 应遵循如下三条原则： (1) 每一步迭代均能按已有的信息确定下一个搜索方向； (2) 每一步迭代均能使目标函数有所改进； (3) 近似矩阵 H k 最终应收敛于极值点处的Hessian矩阵的逆矩阵 。 由于构造近似矩阵的方法不同，因而出现不同的拟牛顿法。拟牛顿法不是一种算法，而是一族公认的比较有效的算法。 前面已经给出了牛顿法的迭代方向，即牛顿方向为： d ( k ) = − [ ∇ 2 f ( X ( k ) ) ] − 1 ∇ f ( X ( k ) ) 构造 [ ∇ 2 f ( X ( k ) ) ] − 1 的近似矩阵 H k ，得 d ( k ) = − H k ∇ f ( X ( k ) ) ，称之为点 X ( k ) 处的拟牛顿方向。 设在第k次迭代后，得到点 X ( k + 1 ) ，将目标函数 f ( X ) 在 X ( k + 1 ) 点处展开成Taylor级数，并取二阶近似，记 p ( k ) = X ( k + 1 ) − X ( k ) ， q ( k ) = ∇ f ( X ( k + 1 ) ) − ∇ f ( X ( k ) ) 。 为了用不包含二阶导数的矩阵 H k + 1 取代牛顿法中的Hessian矩阵的逆矩阵 [ ∇ 2 f ( X ( k ) ) ] − 1 ，有理由令 H k + 1 满足： p ( k ) = H k + 1 ⋅ q ( k ) 这个条件称为拟牛顿条件。 显然，若想使拟牛顿方向 d ( k ) = − H k ∇ f ( X ( k ) ) 较好的近似于牛顿方向，下面基本条件应当得到满足： (1) d ( k ) = − H k ∇ f ( X ( k ) ) 是目标函数 f ( X ) 在点 X ( k ) 的下降方向； (2) H k + 1 满足 p ( k ) = H k + 1 ⋅ q ( k ) ； (3) H k + 1 与之间应具有某种简单的迭代关系 H k + 1 = H k + E k 其中 E k 是一个容易计算的矩阵，称之为校正矩阵。即 p ( k ) = ( H k + E k ) ⋅ q ( k ) 。 (4) 若有 ∇ f ( X ( k ) ) T [ − H k ∇ f ( X ( k ) ) ] > 0 ，即 ∇ f ( X ( k ) ) T H k ∇ f ( X ( k ) ) < 0 成立，则拟牛顿方向 d ( k ) = − H k ∇ f ( X ( k ) ) 必是下降方向。 构造校正矩阵 E k 的方法有很多，每一种特殊的构造方法对应一种具体的算法，因而拟牛顿法是一族算法，本文选择有代表性的变尺度算法，其主要的优点是：既避免了计算二阶导数矩阵及其求逆过程，又比梯度法收敛的速度快，特别是对高维问题具有显著的优越性。变尺度法最早由Davidon于1959年提出，后经Fletcher和Powell二人改进，因此变尺度法也被称为DFP法 [ 2 ]。 变尺度法中，校正矩阵 E k 的构造方式为： E k = α k u ( k ) u ( k ) T + β k v ( k ) v ( k ) T 其中 α k ， β k 是待定的数， 是待定的向量。 将上式代入拟牛顿条件 p ( k ) = ( H k + E k ) ⋅ q ( k ) 中，可以得到： α k = 1 u ( k ) T q ( k ) = 1 p ( k ) T q ( k ) β k = − 1 v ( k ) T q ( k ) = − 1 q ( k ) T H k q ( k ) 于是 E k = p ( k ) p ( k ) T p ( k ) T q ( k ) − H k q ( k ) q ( k ) T H k q ( k ) T H k q ( k ) 下面通过例3来展示变尺度法的计算过程。 例3用变尺度法(DFP)求例1 min f ( X ) = − 2 x 1 x 2 − 2 x 2 + x 1 2 + 2 x 2 2 初始点 X ( 1 ) = ( 0 ， 0 ) T ，初始矩阵 H 1 = ( 1 0 0 1 ) 解：由题可知 f ( X ) = − 2 x 1 x 2 − 2 x 2 + x 1 2 + 2 x 2 2 ∇ f ( X ) = ( 2 x 1 − 2 x 2 − 2 x 1 − 2 + 4 x 2 ) 在点 X ( 1 ) = ( 0 ， 0 ) T 处的梯度 g 1 = ( 0 − 2 ) ， ‖ g 1 ‖ = 2 ≠ 0 。 第一次迭代： 令搜索方向 d ( 1 ) = − H 1 g 1 = − ( 1 0 0 1 ) ( 0 − 2 ) = ( 0 2 ) 从 X ( 1 ) = ( 0 ， 0 ) T 出发，沿方向 d ( 1 ) 进行一维搜索： min t ≥ 0 f ( X ( 1 ) + t d ( 1 ) ) 求得 t 1 = 1 4 ，令 X ( 2 ) = X ( 1 ) + t 1 d ( 1 ) = ( 0 0 ) + 1 4 ( 0 2 ) = ( 0 1 2 ) 此时 g 2 = ∇ f ( X ( 2 ) ) = ( − 1 0 ) ， ‖ g 2 ‖ = 1 ≠ 0 第二次迭代： 令 p ( 1 ) = X ( 2 ) − X ( 1 ) = t 1 d ( 1 ) = ( 0 1 2 ) q ( 1 ) = g 2 − g 1 = ( − 1 0 ) − ( 0 − 2 ) = ( − 1 2 ) 于是 H 2 = H 1 + E 1 = H 1 + p ( 1 ) p ( 1 ) T p ( 1 ) T q ( 1 ) − H 1 q ( 1 ) q ( 1 ) T H 1 q ( 1 ) T H 1 q ( 1 ) = 1 20 ( 16 8 8 9 ) 令 d ( 2 ) = − H 2 g 2 = − 1 20 ( 16 8 8 9 ) ( − 1 0 ) = 1 5 ( 4 2 ) 从 X ( 2 ) = ( 0 ， 1 2 ) T 出发，沿方向 d ( 2 ) 进行一维搜索： min t ≥ 0 f ( X ( 2 ) + t d ( 2 ) ) 求得 t 2 = 5 4 ，令 X ( 3 ) = X ( 2 ) + t 2 d ( 2 ) = ( 1 1 ) 此时 g 3 = ∇ f ( X ( 3 ) ) = ( 0 0 ) 。 所以 X * = ( 1 1 ) 为此问题的最优解。 在例3的讨论中，第一个尺度矩阵 H 1 为单位矩阵(对称正定阵)，以后的尺度矩阵 H k 按算法步骤逐步形成。可以证明，如此构造的尺度矩阵均为对称正定阵，进而确保搜索方向为下降方向。 DFP方法由于不需要在迭代点处计算Hessin矩阵的逆，所以在极值点附近的收敛速度比牛顿法更快，效率更高。可由表4列出的数值实验可以看出，当初始点距离极值点很远时，受迭代误差的影响，DFP方法很难收敛到极值点。因此，为了提升收敛速度和求解的准确性我们同样可以在迭代点距离极值点很近时再使用拟牛顿方法求解问题。本文将此种改进方法称作GNN算法。 Table 4 Initial value points and iteration table of the test function were solved by the DFP method 算法 初始值 最优解 最优值 迭代次数 DFP拟牛顿算法 (0， 0) (0.9459， 0.8946) 0.0029 13 (4， 4) (0.9756， 0.9543) 0.0012 2000 (10， 10) (1.0388， 1.0791) 0.0015 30，195 (40， 40) 1.0e+14 * (−0.0000， 5.9352) 5.9352e+14 50，000~500，000 表4. DFP算法求解测试函数的初值点及迭代次数表 由表4和表5，明显可以看出GNN算法的精确度和收敛速度对比DFP方法均有提升，是一种行之有效的优化算法。 Table 5 Initial value points and iteration table of the test function were solved by the GNN method 算法 初始值 最优解 最优值 迭代次数 精度 GNN算法 (0， 0) (1.0000， 1.0000) 2.4159e−30 50 ε 1 = 0.1 ， ε 2 = 0.5 (4， 4) (1.9602， 3.8455) 0.9230 1000 ε 1 = 0.1 ， ε 2 = 0.5 (1， 1) 0 2000 ε 1 = 0.1 ， ε 2 = 0.5 (10， 10) (1.8947， 3.5927) 0.8013 14，000 ε 1 = 0.1 ， ε 2 = 0.5 (1， 1) 0 14，500 ε 1 = 0.1 ， ε 2 = 0.5 (20， 20) (2.4586， 6.0482) 2.1287 50，000 ε 1 = 0.1 ， ε 2 = 0.5 (1， 1) 0 57，000 ε 1 = 0.1 ， ε 2 = 0.5 表5. GNN算法求解测试函数的初值点及迭代次数表