给定一个函数
f
f
f,寻找一个变量
x
0
∈
D
x_0 \in D
x0∈D,使得对于
D
D
D中所有的
x
x
x,
f
(
x
0
)
≤
f
(
x
)
f(x_0) \leq f(x)
f(x0)≤f(x)(最小化)或者
f
(
x
0
)
≥
f
(
x
)
f(x_0) \geq f(x)
f(x0)≥f(x)(最大化)。函数
f
f
f被称为目标函数或代价函数,通常集合
D
D
D需要满足一定的约束,
D
D
D中的元素被称为可行解,一个最小化(或者最大化)目标函数的可行解被称为最优解。
组合优化(Combinatorial Optimization):其目标是从一个有限集合中找出使得目标函数最优的元素。在一般的组合优化问题中,集合中的元素之间存在一定的关联,可以表示为图结构。典型的组合优化问题有旅行商问题(TSP,又称最短路径问题)、背包问题(Knapsack Problem,KP)、最小费用最大流(Minimum Cost Maximum Flow,MCMF)等。很多机器学习问题都是组合优化问题,比如特征选择、聚类问题、超参数优化问题以及结构化学习(Structured Learning)中标签预测问题等。通常小规模的组合优化问题可以采用精确求解算法进行最优解的计算,而大规模的组合优化问题一般采用启发式算法进行求解。
整数规划(Integer Programming):输入变量为整数。一般常见的整数规划问题为整数线性规划(Integer Linear Programming,ILP)。整数线性规划的一种最直接的求解方法是:(1)去掉输入必须为整数的限制,将原问题转换为一般的线性规划问题,这个线性规划问题为原问题的松弛问题;(2)求得相应松弛问题的解;(3)把松弛问题的解四舍五入到最接近的整数。但是这种方法得到的解一般都不是最优的,因此原问题的最优解不一定在松弛问题最优解的附近,但可能可以为问题求解提供一个较好的可行解,因为这种方法得到的解也不一定满足约束条件。所以常用小规模整数规划问题的求解方法是采用精确求解算法;而对于大规模的整数规划问题一般采用启发式算法求解,虽然启发式算法不能求得整数规划的最优解,但是却能在短时间(通常多项式时间)内给出一个较好的可行解。
无约束优化问题(Unconstrained Optimization)中变量 x 无任何约束,其可行域为整个实数域。针对连续优化中的无约束问题,通常的求解方法时梯度下降法,例如随机梯度下降算法、带动量的随机梯度下降算法和Adam算法等等。
约束优化问题(Constrained Optimization)中变量 x 需要满足一些等式或不等式的约束。约束优化问题最经典的算法是使用拉格朗日乘数法来进行求解。这种方法将一个有 n 个变量与 k 个约束条件的最优化问题转换为一个有 ( n + k ) 个变量的方程组的极值问题,其变量不受任何约束。