最优化-无约束最优化方法总结

 目录:

  1. 计算例题汇总
  2. 最速下降法
  3. 牛顿法
  4. 拟牛顿法
  5. DFP算法

最速下降法(Steepest Descent Method)梯度下降法(Gradient Descent Method)是不同的两个方法,最速下降法要找到泰勒一阶展开式令目标函数下降最多的方向,最速下降法的收到范数的限制。

当取欧式范数,就变成了梯度下降法,梯度下降法是最速下降法的特殊形式。

当选取了矩阵2范数,就得到牛顿法(Newton Method),梯度下降法和牛顿法在迭代公式上的区别只有一处,梯度下降法和牛顿法都以梯度作为更新方向,牛顿法计算Hessian矩阵逆矩阵G^{-1},与梯度的乘积作为更新方向。

牛顿法虽然比梯度下降法计算复杂,但是收敛效率要比梯度下降法高。但同时牛顿法的要求非常苛刻,不仅要求Hessian矩阵在迭代过程中至少要半正定,其次Hessian矩阵在高维的情况下的空间代价和计算时间代价都很高。因此就出现了拟牛顿法(quasi-newton method),拟牛顿法不直接Hessian矩阵及其逆矩阵,而是直接用一个矩阵H_k代替Hessian逆矩阵,所有满足该形式的都是quasi-newton法。

SR1方法DFP方法(Davidon-Fletcher-Powell)BFGS方法(Broyden-Fletcher-Goldfarb-Shanno)是常见的三个拟牛顿法。其中DFP和BFGS的公式高度对称,交换s_k和y_k,就得到了对方的H_k和B_k,两算法互为对偶。有时也会取两个公式的加权组合,即Broyden族。

共轭梯度法(CG)是动量法的理论最优。共轭方向法和梯度下降法的区别在于,梯度下降法一次更新多个维度,而共轭方向发一次只更新一个维度,之多n次就能找到最优解。而且这多个方向之间互相共轭,所谓共轭就是经过线性变换的正交(不正的正交),例如斜着的椭圆解空间,如果是梯度下降法可能要更新很多次,共轭方向只需要两次。共轭方向法旨在找到一组共轭向量组。

参考:

  • 梯度下降法和最速下降法:笔记 || 梯度法与最速下降法的本质区别 - 一土木蒙的文章 - 知乎 https://zhuanlan.zhihu.com/p/67564794笔记 || 梯度法与最速下降法的本质区别 - 一土木蒙的文章 - 知乎 https://zhuanlan.zhihu.com/p/67564794https://zhuanlan.zhihu.com/p/67564794

计算例题汇总

  • 最速下降法:https://blog.csdn.net/yu_moumou/article/details/104060401
  • 牛顿法:https://blog.csdn.net/yu_moumou/article/details/104076675
  • 拟牛顿法-BFGS:https://blog.csdn.net/yu_moumou/article/details/104513444
  • 共轭梯度法理论推导:https://blog.csdn.net/weixin_37895339/article/details/84640137
  • 共轭梯度法Fletcher-Reeves程序:https://blog.csdn.net/HelloWorldTM/article/details/123647243

最速下降法

$f(x)$在$x_k$附近连续可微,$d$为单位方向,$g_k=\nabla f\left( x_k \right) \ne 0$

根据Taylor公式:$$f\left( x_k+\alpha d \right) =f\left( x_k \right) +\alpha g_{k}^{T}d+o\left( \alpha \right) ,\alpha >0$$,

设$\theta$是$d$和$g_k^T$的夹角,则有$g_{k}^{T}d=\lVert g_k \rVert cos\theta $,当$\theta=0$时,$g_k^Td$取最小值,此时$f$下降最快,$d=-g_k^T$,也即负梯度方向是最速下降方向。

牛顿法

设$f\left( x \right)$的二阶导数$\nabla ^2f\left( x \right)$连续,记$g_k=\nabla f\left( x_k \right) ,\,\,g_k=\nabla ^2f\left( x_k \right) $,

Taylor展开式前三项为:$$q_k\left( x \right) =f\left( x_k \right) +g_{k}^{T}\left( x-x_k \right) +\frac{1}{2}\left( x-x_k^T \right) G_k\left( x-x_k \right)$$

求$q_k(x)$的驻点,得$0=\nabla q_k\left( x \right) =g_k+G_k\left( x-x_k \right)$,

如果$G_k$非奇异,那么牛顿迭代法的公式为$x_{k+1}=x_k-G_{k}^{-1}g_k$,

如果$G_k$奇异,那么$d_k$由该式确定:$G_kd=-g_k$。

Algorithm:

  1. 给定初始点和终止误差。
  2. 检验终止条件。
  3. 计算搜索方向,计算新点。

Python程序示例如下:

# -*- coding: utf-8 -*-
# @Author : ZhaoKe
# @Time : 2022-10-05 21:31
import numpy as np
from typing import List


class NewtonMethod():
    def fun1(self, x):
        # print(x)
        return (x[0] - 3) ** 4 + (x[0] - 3*x[1]) ** 2

    def fun1_grad(self, x):
        res = np.zeros((2, 1))
        res[0, 0] = 4*(x[0]-3)**3+2*(x[0]-3*x[1])
        res[1, 0] = -6*(x[0]-3*x[1])
        return res

    def fun1_hessian(self, x):
        return np.mat([[float(12*(x[0]-3)**2)+2, -6], [-6, 18]])

    def newtonMethod(self, x0):
        cur_x = x0
        min_fun = self.fun1(cur_x)
        MAX_ITER = 40
        EPS = 0.01
        for it in range(MAX_ITER):
            print(f'=========={it}=============')
            print('------grad------')
            gk = self.fun1_grad(cur_x)
            print(gk)
            if np.linalg.norm(gk) < EPS:
                break
            print('------hessian-----')
            print(self.fun1_hessian(cur_x))
            print(np.linalg.inv(self.fun1_hessian(cur_x)))
            # print(np.linalg.inv(self.fun1_hessian(cur_x)) * self.fun1_grad(cur_x))
            dk = - np.linalg.inv(self.fun1_hessian(cur_x)) * gk
            print(f"d{it}: {dk}")
            cur_x = cur_x + dk
            cur_fun = self.fun1(cur_x)
            print(f"x{it}: {cur_x}, f_{it}: {cur_fun}")
            if min_fun > cur_fun:
                min_fun = cur_fun
        print(f"min_x: {cur_x}")
        print(f"min_f: {min_fun}")
        return cur_x


if __name__ == '__main__':
    so = NewtonMethod()
    so.newtonMethod(np.mat([[0], [0]]))

输出结果:

min_x: [[2.88294467]
 [0.96098156]]
min_f: [[0.00018774]]

 拟牛顿法设$f(x):R^n\rightarrow R$在开集$D \subset R^n$上二次连续可微,$f$在$x_{k+1}$附近的二次近似为:

$$f\left( x \right) \approx f\left( x_{k+1} \right) +g_{k+1}^{T}\left( x-x_{k+1} \right) +\frac{1}{2}\left( x-x_{k+1} \right) ^TG_{k+1}\left( x-x_{k+1} \right) $$
两侧求导得:$g\left( x \right) \approx g_{k+1}+G_{k+1}\left( x-x_{k+1} \right) $

令$x=x_k,s_k=x_{k+1}-x_k,y_k=g_{k+1}-g_k$,则有$G_{k+1}^Ty_k \approx s_k$,对于二次函数,这个关系精确成立,现要求在拟牛顿法中构造出Hesse矩阵逆近似$H_{k+1}$满足这种关系式:

$$H_{k+1}y_k=s_k$$

称为:拟牛顿方程 或 拟牛顿条件。搜索得方向由$d_k=-H_kg_k$确定,此外,$s_k$称为位移,$y_k$称为梯度差。同时还要求$H_k$是对称正定矩阵,$H_{k+1}$由$H_k$经过简单的修正得到:

$$H_{k+1}=H_k+E_k$$

满足拟牛顿方程和上述性质所确立的方法就称为拟牛顿法,也叫变尺度法。

DFP算法

DFP算法是一个具有代表性的拟牛顿法,用于求解无约束最优化问题。

设Hesse矩阵逆近似公式中$E_k$为秩二矩阵时有$E_k=auu^T+bvv^T$

这里的$u,v$并不是唯一确定得,可以选取:$u=s_k, v=H_ky_k$,因此

$$a=1/{s_k^T y_k}, b=-1/{y_k^T H_k y_k}$$,

从而:$$H_{k+1}=H_k - \frac{H_ky_k y_k^T H_k}{y_k^T H_k y_k}+\frac{s_ks_k^T}{s_k^T y_k}$$

$$s_k = H_k y_k + auu^Ty_k + bvv^Ty_k$$

 正在更新...

最速下降法

共轭梯度法

posted @ 2022-09-29 15:16  倦鸟已归时  阅读(427)  评论(0编辑  收藏  举报