最优化-无约束最优化方法总结
目录:
- 计算例题汇总
- 最速下降法
- 牛顿法
- 拟牛顿法
- 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
最速下降法
在附近连续可微,为单位方向,
根据Taylor公式:,
设是和的夹角,则有,当时,取最小值,此时下降最快,,也即负梯度方向是最速下降方向。
牛顿法
设的二阶导数连续,记,
Taylor展开式前三项为:
求的驻点,得,
如果非奇异,那么牛顿迭代法的公式为,
如果奇异,那么由该式确定:。
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]]
拟牛顿法设在开集上二次连续可微,在附近的二次近似为:
两侧求导得:
令,则有,对于二次函数,这个关系精确成立,现要求在拟牛顿法中构造出Hesse矩阵逆近似满足这种关系式:
称为:拟牛顿方程 或 拟牛顿条件。搜索得方向由确定,此外,称为位移,称为梯度差。同时还要求是对称正定矩阵,由经过简单的修正得到:
满足拟牛顿方程和上述性质所确立的方法就称为拟牛顿法,也叫变尺度法。
DFP算法
DFP算法是一个具有代表性的拟牛顿法,用于求解无约束最优化问题。
设Hesse矩阵逆近似公式中为秩二矩阵时有
这里的并不是唯一确定得,可以选取:,因此
,
从而:
正在更新...
最速下降法
共轭梯度法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具