数值优化这个名字来源于一本书,名为《Numerical Optimization》。
Numerical Optimization这两个单词传递了两个知识领域的概念:
Optimization指的是数学概念上的优化,即求最优解,也可以理解为求函数的最小值的解;
Numerical指的是数值计算,即在计算机上通过编程实现数学公式计算;
因此数值优化主要研究对象是怎么编写计算机程序求解数学领域的最优化问题,特别是计算工程领域的最优方案。
数值优化首先是个数学优化问题,可以简单理解为下面的数学公式
即求函数 f 取得最小值时 x 的取值,其中 x 是一个 n 维向量,f 函数可能是连续的,也可能是离散的,离散问题要比连续问题复杂得多。
在此基础上,x 可能还需要满足一个或多个约束条件,约束条件可能是等式,也可能是不等式。根据约束条件的不同,最小值求解过程及复杂的也不同。相对而言,无约束最简单,等式约束居中,不等式约束最难。
我们可以通过两个简单的例子来认识数学和工程领域的最优解问题:
例1:现有m个仓库存储了同一种原材料,仓储量分别为,他们位于地图上不同位置,同时地图上不同位置的n个工厂需要使用此种原材料,其需求量分别为,每吨原材料在仓库和工厂之间的运输成本为,即第i个仓库到第j个工厂之间的运输成本。求各仓库到各工厂间的原材料运输量,使得总运输成本最小。
需要注意这个问题包含了三个隐含的约束条件,分别是:
例2:在机器学习的有监督学习中,我们给定一组数据 , 为样本特征向量, 为样本标签值,对于模型 ,求损失函数 值最小时 的取值。
例1是一个有限定条件的求最优解数学问题,例2是一个无限定条件的最优解问题。现时世界中会遇到各种各样的工程或理论难题,从物理到化学,从宏观到微观,从生命到宇宙,我们需要做的就是把这些问题抽象为数学上的求最优解问题,然后借助计算机,通过数值计算的方法来求这个数学上的最优解。
数值计算作为计算机和数学的强交叉领域,以数学理论为基础,在尽可能最大发挥计算机性能的方向上,针对不同的工程问题,构造合适的数学模型,设计相应优化算法,或调用优化算法软件报进行求解。
常见的建模方法
实例 | 目标函数设计 | 约束设计 |
回归分析 | 最小二乘 最大似然估计 正则化 | 等价转换 |
逻辑回归 | 最大似然估计 正则化 | — |
支持向量机 | 损失函数(最小距离) | 等价转换(最小距离) |
概率图模型 | 最大似然估计 正则化 损失函数(逆矩阵) | 问题本身性质(正定性) |
相位恢复 | 最小二乘,松弛 | 松弛(相位提升) |
主成分分析 | 损失函数(投影方差) | 问题本身性质(正交性) |
矩阵分离问题 | 正则化(稀疏,低秩) 松弛(凸松弛) | 问题本身性质(重构) |
字典学习 | 最小二乘 正则化 | 消除解的不唯一性 |
K-均值聚类 | 损失函数(组内距离平方和) | 问题本身性质,等价转换 |
全变差模型 | 损失函数(保真项) 正则化 | — |
小波模型 | 技巧同全变差模型,区别为模型是在小波基下考虑的 | |
强化学习 | 损失函数 | 问题本身性质(MDP) 松弛(神经网络近似) |
常见优化算法
无约束优化算法
梯度下降法
Barzilai-Borwein 方法
次梯度算法
经典牛顿法
修正牛顿法
非精确牛顿法
共轭梯度法
拟牛顿法
信赖域算法
最小二乘法
高斯牛顿法
Levenberg-Marquardt 方法
模式搜索法
Rosenbrock方法
单纯形搜索法
Powell法
有约束优化算法
罚函数法
增广拉格朗日函数法
线性规划内点法
Zoutendijk 可行方向法
Topkis-Veinott 可行方向法
Rosen 梯度投影法
约束优化梯度投影方法
既约梯度法
Frank唱Wolfe 方法
Lagrange 方法
起作用集方法
Lemke 方法
路径跟踪法
复合优化算法
近似点梯度法
Nesterov加速算法
近似点算法
分块坐标下降法
对偶算法
交替方向乘子法
随机梯度下降算法
分支定界法
割平面法
0-1规划的隐数法
动态规划算法
序列二次规划方法
常见软件包
G2O
G2O(General Graph Optimization)是一个开源 C++ 框架,用于优化基于图的非线性误差函数。 g2o 被设计为可以轻松扩展到广泛的问题,并且通常可以在几行代码中指定一个新问题。 当前的实现为 SLAM 和 BA 的多种变体提供了解决方案。
SDPT3
这个开源软件包的基本代码是用 MATLAB 来写的,但是关键 的子程序是用 FORTRAN 和 C 语言通过 MEX 文件来完成的。它可以 求解锥规划问题,其中锥可以是半定矩阵锥、二次锥和非负象限中的 一个或者多个的乘积.这个软件主要实现的算法是一种原始 – 对偶内 点法。
MOSEK
这个商业软件包可以求解线性规划、二次锥规划、半定规划、 二次规划等凸优化问题,以及混合整数线性规划和混合整数二次规划 等。它的重点是求解大规模稀疏问题,尤其在求解线性规划、二次锥规划 和半定规划的内点法设计上做得非常有效。除了内点法之外,MOSEK 还实现了线性规划问题的单纯形算法,特殊网络结构问题的网络单纯 形算法以及针对混合整数规划问题的算法。它提供 C, C#, Java, Python, MATLAB 和 R 等接口。
CPLEX
这个商业软件可以求解整数规划问题,非常大规模的线性规 划问题(使用单纯形方法或者内点法),凸和非凸二次规划问题,二次 锥规划问题。它提供 C++, C#, Java, Microsoft Excel 和 MATLAB 接 口,并且提供一个独立的交互式优化器可执行文件,用于调试和其他 目的。
Gurobi
这个商业软件可以求解线性规划(采用单纯形法和并行的内 点法),二次规划(采用单纯形法和内点法),二次约束规划,混合整 数线性规划,混合整数二次规划,混合整数二次约束规划。它提供 C, C++, Java, .NET, Python, MATLAB 和 R 等接口。
IPOPT
这个开源软件可以求解大规模非线性规划问题,主要实现了原 始 – 对偶内点法,并使用滤波(filter)方法代替线搜索。IPOPT 主要 使用 C++ 语言编写,并提供 C, C++, FORTRAN, Java, MATLAB 和 R 等接口。
Knitro
它是用来求解大规模非线性优化问题的商业软件.这个软件提供了四种不同的优化方法,两种内点型方法和两种积极集(active set) 方法,可以用来求解一般非凸非线性规划问题,非线性方程组,线性 规划,二次(线性)约束二次规划问题,线性(非线性)最小二乘问 题,混合整数规划问题以及无导数优化问题,等等。Knitro 支持的编 程语言有 C, FORTRAN, C++, C#, Java, MATLAB, R, Python 等,以及 模型语言 AMPL,AIMMS,GAMS 和 MPL 等。因其具有大量的用户 友善的选项以及自动调试器,全局优化的并行多重启动策略,导数逼 近和检查以及内部预分解器,在实际中被广泛采用。
SDPNAL,SDPNAL+,SSNSDP
处理半定规划问题
OptM,Manopt,ARNT
处理流形优化
常见的优化模型语言
模型语言的发展开始于 19 世纪 70 年代后期,其主要动因是计算机的 出现。在优化模型语言中,优化模型可以写成和数学表达式很类似的方式, 以此给用户带来更便捷的服务.模型的表达式形式是与求解器无关的,不同 的求解器需要用优化模型语言将给定的模型和数据转为其求解的标准形式, 然后再对其进行求解。这类工具有三个优点:一是将容易出错的转化步骤交 给计算机完成,降低错误率;二是在模型和算法之间建立了一个清晰的界 限;三是对于困难的问题,可以尝试不用的求解器,得到更好的结果。
CVX
CVX 是一个以 MATLAB 为基础的优化模型语言,用来求解凸优化问 题.它允许将优化问题的目标函数以及约束用 MATLAB 语法来写。
AMPL
AMPL(a mathematical programming language)是用来描述高复杂 度的大规模优化问题的模型语言.几十个求解器支持 AMPL,包含开源软件 和商业软件,例如 CBC, CPLEX, FortMP, Gurobi, MINOS, IPOPT, SNOPT, Knitro 和 LGO 等,因此可以支持一大类问题的求解.它的一个优点是其语 法与数学表达式非常类似,因此可对优化问题进行非常简洁并且可读的定 义。
YALMIP
YALMIP是一个matlab下的工具箱,支持调用多个solver,例如 cplex, gurobi等。其最大特色在于集成许多外部的最优化求解器,形成一种统一的建模求解语言,提供了Matlab的调用API,减少学习者学习成本。Yalmip常用来解决 linear programming, integer programming等规划问题。