最优化问题的KKT条件

大家好,我是小新,今天给大家带来一期KKT条件的讲解


前言

hello!大家好,提到最优化问题大家都会感觉到非常头疼,最优化问题广泛存在于各个领域,如运筹学、经济学、工程学、计算机科学等领域中,最优化问题(Optimization Problem)是数学和计算机科学中常见的一类问题,其目标是在给定的约束条件下,找到某个函数的最大值或最小值。这个函数通常被称为目标函数(Objective Function),而约束条件则限制了可能的解空间,说的简单点就是给定约束条件通过一定的算法,求解对应的最优化问题的过程。(比如优化校园垃圾桶的配置问题),那么最优化问题一共有哪几种呢?
请添加图片描述


一、最优化问题分类

我大致把最优化问题整理为以下几类:

  • 线性最优化问题:目标函数和约束条件都是线性的。这类问题可以使用线性规划(Linear Programming, LP)等方法求解。
  • 非线性最优化问题:目标函数或约束条件中至少有一个是非线性的。这类问题通常更难求解,可能需要使用迭代方法、启发式算法等。
  • 整数最优化问题:解必须是整数。这类问题通常被称为整数规划(Integer Programming, IP),包括纯整数规划、混合整数规划等。这类规划问题通常需要引入约束条件或者用到剪枝才能得到最优解。
  • 动态最优化问题:问题涉及到时间序列或随时间变化的状态。这类问题可以使用动态规划(Dynamic Programming, DP)等思想求解。
  • 组合最优化问题:解是离散的,通常涉及到数据结构中的集合、图等结构。这类问题包括旅行商问题(Traveling Salesman Problem, TSP)、图着色问题(Graph Coloring Problem)等。
  • 随机最优化问题:问题中涉及到随机性,如随机变量、概率分布等。这类问题可以使用随机规划(Stochastic Programming)、随机优化算法等求解。

二、常见求解步骤

既然有这么多种最优化问题,那么一定有每一种问题的求解方案,不可能每个问题都是NP完全问题,就如我上面提到的解决方法一样,但是最常见的方法无非就是四类:

  • 梯度下降法:梯度下降法是一种用于求解无约束最优化问题的迭代优化算法,它通过不断迭代更新参数以最小化目标函数。这种方法特别适用于机器学习和深度学习中模型参数的优化,以最小化损失函数或成本函数。(注意是无约束!!!)

梯度下降法的扩展:

1.批量梯度下降法(Batch Gradient Descent, BGD):

就如它的名字一样,每次批量就是全部样本用于梯度下降中,这种方式虽然说比较全面但是挺浪费时间的。

 2.随机梯度下降法(Stochastic Gradient Descent, SGD)

每次固定抽取一个样本进行梯度下降训练,很明显每次可能抽到相同的样本,可能很不具有代表性。

 3.小批量梯度下降法(Mini-batch Gradient Descent, MBGD)

每次抽取一小部分进行梯度下降训练,这种方法用的最多,虽然有震荡,但是仍会趋于全局最小值。

  • 拉格朗日乘子法:拉格朗日乘子法用来求解问题时与梯度下降法有所不同,它能够有效处理带约束最优化类问题,但是如果是不等式约束条件的话不太适用。

  • KKT条件:KKT条件(Karush-Kuhn-Tucker conditions)是在数学优化问题中用来寻找非线性规划问题最优解的一组必要条件。这些条件适用于带有不等式约束和等式约束的优化问题。当问题满足某些假设(如约束的可行性、目标函数和约束函数的可微性以及某些正则性条件)时,KKT条件可以提供局部最优解的必要条件。

  • 序列二次规划:序列二次规划(Sequential Quadratic Programming, SQP)是一种用于求解非线性约束优化问题的有效方法。它通过将原问题转化为一系列二次规划(Quadratic Programming, QP)子问题来迭代求解。在每一步迭代中,SQP算法解决一个或多个QP子问题,以逐步逼近原问题的最优解。序列二次规划的核心思想是利用问题中的函数和约束的某种近似迭代法,尤其是利用约束函数的线性近似。这种方法特别适用于利用Newton法求解Lagrange函数的稳定点,因此也被称为Lagrange-Newton法。


三、KKT条件解析

今天就来给大家介绍一下上面适用于不等式约束条件线性最优化问题的KKT条件,它们可以看作是拉格朗日乘数法的一种扩展。

首先KKT条件的一般形式为:
m i n i m i z e a f ( x ) minimize\phantom{a} f(x) minimizeaf(x)

s u b j e c t a t o a a a g i ( x ) ≤ 0 , i = 1 , … , m subject \phantom{a} to \phantom{aaa} g_i(x)≤0,i=1,…,m subjectatoaaagi(x)0,i=1,,m

h j ( x ) = 0 , j = 1 , … , p h_j(x)=0,j=1,…,p hj(x)=0,j=1,,p

这里 f ( x ) 是目标函数, g i ( x ) 是不等式约束, h j ( x ) 是等式约束。 这里 f(x)是目标函数,gi(x) 是不等式约束,hj(x)是等式约束。 这里f(x)是目标函数,gi(x)是不等式约束,hj(x)是等式约束。
对于上述问题,KKT条件包含以下几个部分:

1.原问题的梯度:对于目标函数的梯度应与所有活动约束的梯度形成线性组合。

2.拉格朗日乘子:存在一组拉格朗日乘子 λ i ≥ 0 和 μ j λi≥0 和 μ_j λi0μj使得
∇ f ( x ∗ ) + ∑ i = 1 m λ i ∇ g i ( x ∗ ) + ∑ j = 1 p μ j ∇ h j ( x ∗ ) = 0 \nabla f(x^*) + \sum_{i=1}^{m} \lambda_i \nabla g_i(x^*) + \sum_{j=1}^{p} \mu_j \nabla h_j(x^*) = 0 f(x)+i=1mλigi(x)+j=1pμjhj(x)=0
3.约束满足性:所有约束必须在候选解 x ∗ x^∗ x处满足
g i ( x ∗ ) ≤ 0 , i = 1 , … , m and h j ( x ∗ ) = 0 , j = 1 , … , p g_i(x^*) \leq 0, \quad i = 1, \ldots, m \quad \text{and} \quad h_j(x^*) = 0, \quad j = 1, \ldots, p gi(x)0,i=1,,mandhj(x)=0,j=1,,p

4.互补松弛性:对于每个不等式约束,如果约束活跃 ( 即 g i ( x ∗ ) = 0 ) (即gi(x^∗)=0) (gi(x)=0),那么对应的拉格朗日乘子 λ i λ_i λi必须非负;如果约束非活跃,则拉格朗日乘子为0。
λ i ≥ 0 , i = 1 , … , m \lambda_i \geq 0, \quad i = 1, \ldots, m λi0,i=1,,m

λ i g i ( x ) = 0 , i = 1 , … , m \lambda_i g_i(x) = 0, \quad i = 1, \ldots, m λigi(x)=0,i=1,,m

5.对偶可行性:拉格朗日乘子 μ j μ_j μj
对应于不等式约束必须是非负的:
μ j > = 0 μ_j>=0 μj>=0


四、解析优化类问题

说到这里可能大家还是不是太理解,给大家举个例子:
对于我们自己定义的一个最优化问题:
m i n i m i z e a x 1 2 + x 2 2 minimize\phantom{a} x_{1}^{2}+x_{2}^{2} minimizeax12+x22

s u b j e c t a t o a a a x 1 + x 2 < = 1 subject \phantom{a} to \phantom{aaa} x_{1}+x_{2}<=1 subjectatoaaax1+x2<=1

x 1 , x 2 > = 0 x_{1},x_{2}>=0 x1,x2>=0

解决步骤

  1. 构造拉格朗日函数(引入拉格朗日乘子):
    L ( x 1 , x 2 , λ ) = x 1 2 + x 2 2 + λ ( 1 − x 1 − x 2 ) L(x_{1},x_{2},\lambda) = x_{1}^{2}+x_{2}^{2}+\lambda(1-x_{1}-x_{2}) L(x1,x2,λ)=x12+x22+λ(1x1x2)
    2.很明显这个问题需要用KKT条件求解,因为属于不等式最优化问题,所以我们引入KKT条件:
    求偏导数并设为0:
    ∂ L ∂ x 1 = 2 x 1 − λ \frac{\partial L}{\partial x_{1}} = 2x_{1} - \lambda x1L=2x1λ

∂ L ∂ x 2 = 2 x 2 − λ \frac{\partial L}{\partial x_{2}} = 2x_{2} - \lambda x2L=2x2λ
3.约束条件:
x 1 + x 2 < = 1 x_{1}+x_{2}<=1 x1+x2<=1
x 1 > = 0 x_{1}>=0 x1>=0
x 2 > = 0 x_{2}>=0 x2>=0
4.补充松弛性条件:
λ > = 0 \lambda >=0 λ>=0
λ ( 1 − x 1 − x 2 ) \lambda(1-x_{1}-x_{2}) λ(1x1x2)

方程和约束条件确定完毕后,就需要我们来求解了,从梯度条件解出
x 1 = x 2 = λ / 2 x_{1} = x_{2} = \lambda/2 x1=x2=λ/2
,求解之后需要做到以下两点:

  1. 检查约束条件:根据约束条件,确定哪些变量可能处于边界上。

  2. 验证补充松弛性:确定哪些约束是活跃的,哪些是非活跃的。

五、实现过程

用python代码实现:

import numpy as np
from scipy.optimize import minimize, NonlinearConstraint
from sympy import symbols, diff, solve, Eq

# 定义符号变量(自行定义)
x = symbols('x')
lambda_ = symbols('lambda')

# 定义目标函数(自行定义)
def objective(x):
    return x[0]**2

# 定义不等式约束(自行定义)
def constraint(x):
    return x[0] - 1

# 构造拉格朗日函数(根据题意构造)
L = x**2 - lambda_ * (x - 1)

# 计算L关于x的梯度
grad_L_x = diff(L, x)

# 计算L关于lambda的梯度(即对偶可行性条件)
grad_L_lambda = diff(L, lambda_)

# 求解梯度条件和原始/对偶可行性条件
solution = solve((Eq(grad_L_x, 0), Eq(constraint(x), 0)), (x, lambda_))

print("Symbolic solution:", solution)

# 使用Scipy求解
# 定义不等式约束
constraint = NonlinearConstraint(constraint, -np.inf, 0)

# 初始猜测值
x0 = np.array([0])

# 进行优化
res = minimize(objective, x0, constraints=constraint)

print("O最优化结果为:", res)

用matlab代码实现:

% 清除变量
clear all

% 定义符号变量
syms x lambda

% 定义目标函数
f = x^2;

% 定义等式和不等式约束
g = x - 1;

% 构造拉格朗日函数
L = f - lambda*g;

% 计算L关于x的梯度
grad_L_x = diff(L, x);

% 计算L关于lambda的梯度(即对偶可行性条件)
grad_L_lambda = diff(L, lambda);

% 求解梯度条件和原始/对偶可行性条件
solution = solve([grad_L_x == 0, g <= 0, lambda >= 0], [x, lambda]);

% 显示解
disp(solution)

总结

看到这里了想必大家已经会用KKT条件求解带有不等式的最优化问题了,以上内容就是今天要讲的内容了,主要介绍了KKT条件和最优化理论,之后我会继续更新这方面的内容,大家如果感兴趣的话,如果有想看的内容,请在评论区告诉我!,别忘了给UP主一个关注,你的关注是我更新的动力!!!

请添加图片描述

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐