人工智能之数学基础 优化理论:第三章 约束优化

48 阅读3分钟

人工智能之数学基础 优化理论

第三章 约束优化----公式关注公众号


前言

约束优化是优化理论的核心分支,广泛应用于机器学习(如正则化)、经济学(资源分配)、工程设计(结构优化)等领域。本文系统讲解等式约束优化的拉格朗日乘数法不等式约束的 KKT 条件L1/L2 正则化与约束形式的等价性,并提供完整的 Python(SciPy / CVXPY / NumPy / Matplotlib)代码实现与可视化


一、约束优化问题的一般形式

minxRnf(x)s.t.hj(x)=0,j=1,,p(等式约束)gi(x)0,i=1,,m(不等式约束)\begin{aligned} \min_{\mathbf{x} \in \mathbb{R}^n} \quad & f(\mathbf{x}) \\ \text{s.t.} \quad & h_j(\mathbf{x}) = 0, \quad j = 1, \dots, p \quad \text{(等式约束)} \\ & g_i(\mathbf{x}) \leq 0, \quad i = 1, \dots, m \quad \text{(不等式约束)} \end{aligned}
  • 可行域:满足所有约束的点集
  • 目标:在可行域内找到使 f(x)f(\mathbf{x}) 最小的点

✅ 若无约束(p=m=0p = m = 0),退化为无约束优化。


二、1. 拉格朗日乘数法(Lagrange Multipliers)

适用场景

仅含等式约束的优化问题:

minxf(x)s.t. h(x)=0\min_{\mathbf{x}} f(\mathbf{x}) \quad \text{s.t. } h(\mathbf{x}) = 0

核心思想

在最优解处,目标函数的梯度与约束函数的梯度平行

f(x)=λh(x)\nabla f(\mathbf{x}^*) = \lambda \nabla h(\mathbf{x}^*)

拉格朗日函数

引入乘子 λR\lambda \in \mathbb{R},构造:

L(x,λ)=f(x)λh(x)\mathcal{L}(\mathbf{x}, \lambda) = f(\mathbf{x}) - \lambda h(\mathbf{x})

必要条件(一阶)

x\mathbf{x}^* 是局部极值点,且 h(x)0\nabla h(\mathbf{x}^*) \ne \mathbf{0},则存在 λ\lambda^* 使得:

{xL(x,λ)=0h(x)=0\begin{cases} \nabla_{\mathbf{x}} \mathcal{L}(\mathbf{x}^*, \lambda^*) = \mathbf{0} \\ h(\mathbf{x}^*) = 0 \end{cases}

🔑 几何解释:等高线 f(x)=cf(\mathbf{x}) = c 与约束曲线 h(x)=0h(\mathbf{x}) = 0 相切


📌 示例:最小化 x2+y2x^2 + y^2 满足 x+y=1x + y = 1

  • 目标:f(x,y)=x2+y2f(x,y) = x^2 + y^2
  • 约束:h(x,y)=x+y1=0h(x,y) = x + y - 1 = 0

拉格朗日函数:

L(x,y,λ)=x2+y2λ(x+y1)\mathcal{L}(x, y, \lambda) = x^2 + y^2 - \lambda (x + y - 1)

求偏导并令为零:

{Lx=2xλ=0Ly=2yλ=0Lλ=(x+y1)=0{x=yx+y=1x=y=0.5\begin{cases} \frac{\partial \mathcal{L}}{\partial x} = 2x - \lambda = 0 \\ \frac{\partial \mathcal{L}}{\partial y} = 2y - \lambda = 0 \\ \frac{\partial \mathcal{L}}{\partial \lambda} = -(x + y - 1) = 0 \end{cases} \Rightarrow \begin{cases} x = y \\ x + y = 1 \end{cases} \Rightarrow x = y = 0.5

最优值:( f(0.5, 0.5) = 0.5 )


三、2. KKT 条件(Karush–Kuhn–Tucker)

适用场景

等式 + 不等式约束的一般非线性规划问题。

拉格朗日函数(广义)

L(x,λ,μ)=f(x)j=1pλjhj(x)i=1mμigi(x)\mathcal{L}(\mathbf{x}, \boldsymbol{\lambda}, \boldsymbol{\mu}) = f(\mathbf{x}) - \sum_{j=1}^p \lambda_j h_j(\mathbf{x}) - \sum_{i=1}^m \mu_i g_i(\mathbf{x})

KKT 条件(必要条件,若满足约束规范)

  1. 稳定条件xL=0\nabla_{\mathbf{x}} \mathcal{L} = \mathbf{0}
  2. 原始可行性hj(x)=0, gi(x)0h_j(\mathbf{x}) = 0,\ g_i(\mathbf{x}) \leq 0
  3. 对偶可行性μi0\mu_i \geq 0
  4. 互补松弛性μigi(x)=0\mu_i g_i(\mathbf{x}) = 0

💡 互补松弛性:若约束不起作用(gi<0g_i < 0),则 μi=0\mu_i = 0;若 μi>0\mu_i > 0,则约束紧(gi=0g_i = 0

特殊情况:凸优化

ff 凸、gig_i 凸、hjh_j线性,则 KKT 条件是全局最优的充要条件


四、3. 正则化与约束优化的等价性

在机器学习中,正则化常以无约束形式出现,但可等价转换为约束优化

L2 正则化(岭回归)

  • 无约束形式

    minwyXw2+λw2\min_{\mathbf{w}} \|\mathbf{y} - \mathbf{X}\mathbf{w}\|^2 + \lambda \|\mathbf{w}\|^2
  • 等价约束形式

    minwyXw2s.t. w2t\min_{\mathbf{w}} \|\mathbf{y} - \mathbf{X}\mathbf{w}\|^2 \quad \text{s.t. } \|\mathbf{w}\|^2 \leq t

    其中 λt\lambda \leftrightarrow t一一对应(通过 KKT 条件)

L1 正则化(Lasso)

  • 无约束形式
    minwyXw2+λw1\min_{\mathbf{w}} \|\mathbf{y} - \mathbf{X}\mathbf{w}\|^2 + \lambda \|\mathbf{w}\|_1
  • 等价约束形式
    minwyXw2s.t. w1t\min_{\mathbf{w}} \|\mathbf{y} - \mathbf{X}\mathbf{w}\|^2 \quad \text{s.t. } \|\mathbf{w}\|_1 \leq t

🔑 关键区别

  • L2 约束:w2t\|\mathbf{w}\|_2 \leq t圆形/球形可行域 → 解稀疏性弱
  • L1 约束:w1t\|\mathbf{w}\|_1 \leq t多面体可行域 → 易在顶点处取解 → 稀疏性

五、Python 代码实现

1. 导入库

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import minimize, NonlinearConstraint
import cvxpy as cp

np.random.seed(42)

2. 拉格朗日乘数法:解析求解 + 数值验证

解析解(上例)

# 手动解:x = y = 0.5
x_star, y_star = 0.5, 0.5
print(f"解析解: x={x_star}, y={y_star}, f={x_star**2 + y_star**2}")

数值求解(SciPy)

def objective(xy):
    return xy[0]**2 + xy[1]**2

def constraint_eq(xy):
    return xy[0] + xy[1] - 1  # =0

# 定义等式约束
eq_cons = {'type': 'eq', 'fun': constraint_eq}

res = minimize(objective, x0=[0, 0], constraints=[eq_cons])
print(f"数值解: x={res.x[0]:.6f}, y={res.x[1]:.6f}, f={res.fun:.6f}")

3. KKT 条件:不等式约束优化

问题:最小化 x2+y2x^2 + y^2 满足 x+y1x + y \geq 1

def constraint_ineq(xy):
    return xy[0] + xy[1] - 1  # 要求 >=0 → SciPy 中定义为 >=0

# SciPy 要求不等式约束为: cons(x) >= 0
ineq_cons = NonlinearConstraint(constraint_ineq, lb=0, ub=np.inf)

res_kkt = minimize(objective, x0=[0, 0], method='SLSQP', constraints=[ineq_cons])
print(f"KKT 数值解: x={res_kkt.x[0]:.6f}, y={res_kkt.x[1]:.6f}, f={res_kkt.fun:.6f}")
print(f"约束值: x+y = {res_kkt.x.sum():.6f} (应 ≥1)")

✅ 输出应与等式约束相同(因为最优解在边界 ( x+y=1 ) 上)


4. 可视化:约束优化的几何意义

# 绘制目标函数等高线 + 约束
x = np.linspace(-0.5, 1.5, 200)
y = np.linspace(-0.5, 1.5, 200)
X, Y = np.meshgrid(x, y)
Z = X**2 + Y**2

plt.figure(figsize=(8, 6))
# 等高线
contour = plt.contour(X, Y, Z, levels=20, cmap='viridis')
plt.clabel(contour, inline=True, fontsize=8)

# 等式约束:x + y = 1
plt.plot(x, 1 - x, 'r-', linewidth=2, label=r'$x + y = 1$')

# 不等式约束区域:x + y >= 1
plt.fill_between(x, 1 - x, 1.5, color='red', alpha=0.1, label=r'$x + y \geq 1$')

# 最优解
plt.plot(0.5, 0.5, 'go', markersize=10, label='最优解 (0.5, 0.5)')

plt.xlim(-0.5, 1.5); plt.ylim(-0.5, 1.5)
plt.xlabel('x'); plt.ylabel('y')
plt.title('约束优化:等高线与可行域')
plt.legend(); plt.grid(True)
plt.show()

5. L1/L2 正则化:约束形式 vs 无约束形式

生成数据

# 线性回归数据
n_samples, n_features = 50, 10
X = np.random.randn(n_samples, n_features)
true_w = np.array([1, 0.5, -0.3] + [0]*(n_features-3))  # 稀疏真实权重
y = X @ true_w + 0.1 * np.random.randn(n_samples)

(a) L2 正则化(Ridge)— 无约束

from sklearn.linear_model import Ridge

ridge = Ridge(alpha=1.0, fit_intercept=False)
ridge.fit(X, y)
w_ridge = ridge.coef_
print("L2 (Ridge) 权重:", np.round(w_ridge, 3))

(b) L1 正则化(Lasso)— 无约束

from sklearn.linear_model import Lasso

lasso = Lasso(alpha=0.1, fit_intercept=False, max_iter=2000)
lasso.fit(X, y)
w_lasso = lasso.coef_
print("L1 (Lasso) 权重:", np.round(w_lasso, 3))
print("Lasso 零系数数量:", np.sum(np.abs(w_lasso) < 1e-4))

(c) 约束形式:使用 CVXPY

L2 约束(二次锥规划)
w = cp.Variable(n_features)
objective = cp.Minimize(cp.sum_squares(X @ w - y))
constraints = [cp.norm(w, 2) <= 1.0]  # ||w||_2 <= t

prob_l2 = cp.Problem(objective, constraints)
prob_l2.solve()

print("L2 约束解范数:", np.linalg.norm(w.value, 2))
L1 约束(线性规划)
w = cp.Variable(n_features)
objective = cp.Minimize(cp.sum_squares(X @ w - y))
constraints = [cp.norm(w, 1) <= 1.0]  # ||w||_1 <= t

prob_l1 = cp.Problem(objective, constraints)
prob_l1.solve()

print("L1 约束解范数:", np.linalg.norm(w.value, 1))
print("L1 约束零系数数量:", np.sum(np.abs(w.value) < 1e-4))

✅ 验证:L1 约束解具有稀疏性,L2 解更平滑。


6. 对偶问题与拉格朗日对偶性(简要)

对于凸问题,原问题(Primal)与对偶问题(Dual)满足:

minxmaxλ0L(x,λ)maxλ0minxL(x,λ)\min_{\mathbf{x}} \max_{\boldsymbol{\lambda} \geq 0} \mathcal{L}(\mathbf{x}, \boldsymbol{\lambda}) \geq \max_{\boldsymbol{\lambda} \geq 0} \min_{\mathbf{x}} \mathcal{L}(\mathbf{x}, \boldsymbol{\lambda})
  • 强对偶性:等号成立(凸问题 + Slater 条件满足时)
  • 对偶变量 λ\lambda 即拉格朗日乘子,表示约束的“影子价格”

📌 在 SVM 中,对偶问题将优化从样本维度转到支持向量维度。


六、常见约束类型与求解器

约束类型数学形式求解方法Python 工具
线性等式Ax=bA\mathbf{x} = \mathbf{b}内点法、单纯形scipy.optimize.linprog
线性不等式GxhG\mathbf{x} \leq \mathbf{h}同上同上
二次约束x2t\|\mathbf{x}\|_2 \leq t二次锥规划(SOCP)CVXPY + ECOS
L1 约束x1t\|\mathbf{x}\|_1 \leq t线性规划CVXPY
非线性约束g(x)0g(\mathbf{x}) \leq 0SLSQP、IPOPTscipy.optimize.minimize

七、总结

方法适用问题关键条件应用
拉格朗日乘数法仅等式约束h0\nabla h \ne 0几何优化、物理
KKT 条件等式+不等式约束规范一般非线性规划
L2 正则化无约束岭回归、防止过拟合
L1 正则化无约束Lasso、特征选择
约束形式显式限制参数可解释性、安全关键系统

💡 核心洞见

  • 拉格朗日乘子衡量约束的“敏感度”;
  • 正则化 = 软约束约束优化 = 硬约束
  • L1 约束的几何形状导致稀疏性
  • 凸问题 + KKT = 全局最优保证

掌握约束优化,你将能处理从带预算限制的投资组合到带安全约束的机器人控制等复杂现实问题。动手运行代码,观察不同约束对解的影响,建立直观理解!

后续

python过渡项目部分代码已经上传至gitee,后续会逐步更新。

资料关注

公众号:咚咚王

《Python编程:从入门到实践》 《利用Python进行数据分析》 《算法导论中文第三版》 《概率论与数理统计(第四版) (盛骤) 》 《程序员的数学》 《线性代数应该这样学第3版》 《微积分和数学分析引论》 《(西瓜书)周志华-机器学习》 《TensorFlow机器学习实战指南》 《Sklearn与TensorFlow机器学习实用指南》 《模式识别(第四版)》 《深度学习 deep learning》伊恩·古德费洛著 花书 《Python深度学习第二版(中文版)【纯文本】 (登封大数据 (Francois Choliet)) (Z-Library)》 《深入浅出神经网络与深度学习+(迈克尔·尼尔森(Michael+Nielsen)》 《自然语言处理综论 第2版》 《Natural-Language-Processing-with-PyTorch》 《计算机视觉-算法与应用(中文版)》 《Learning OpenCV 4》 《AIGC:智能创作时代》杜雨+&+张孜铭 《AIGC原理与实践:零基础学大语言模型、扩散模型和多模态模型》 《从零构建大语言模型(中文版)》 《实战AI大模型》 《AI 3.0》