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


     目录:

    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$$

     正在更新...

    最速下降法

    共轭梯度法

  • 相关阅读:
    外星人(alien)
    6. 第 6 章 函数
    5. 第 5 章 循环
    4. 第 4 章 条件选择
    3. 第 3 章 表达式和交互
    2. 第 2 章 C++简介
    1. 第 1 章 计算机和编程简介
    24. 蛇形填数
    23. 开灯问题
    12. aabb
  • 原文地址:https://www.cnblogs.com/zhaoke271828/p/16741583.html
Copyright © 2020-2023  润新知