目录:
- 计算例题汇总
- 最速下降法
- 牛顿法
- 拟牛顿法
- 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:
- 给定初始点和终止误差。
- 检验终止条件。
- 计算搜索方向,计算新点。
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$$
正在更新...
最速下降法
共轭梯度法