查看全课大纲(第 45 / 82 节)
  1. 1.函数与数据泛化
  2. 2.向量:从几何直觉到高维空间
  3. 3.矩阵与张量
  4. 4.特征值与特征向量:矩阵变换的不动方向
  5. 5.凸函数:从向量求导的矩阵记号到好优化的函数形状
  6. 6.概率与统计:机器学习的数学基础
  7. 7.独立性与随机变量:贝叶斯公式与二项分布
  8. 8.期望、方差与协方差:随机变量的数字画像
  9. 9.联合概率:当一条轴不够用的时候
  10. 10.概率分布(一):从伯努利到伽马函数
  11. 11.概率分布(二):贝塔、泊松、正态与两个贝叶斯故事
  12. 12.机器学习的模型:找输入与输出的关系
  13. 13.机器学习的应用
  14. 14.过拟合
  15. 15.机器学习的分类
  16. 16.有监督学习:从房价预测说起
  17. 17.损失函数
  18. 18.梯度下降(上):更新规则与学习速率
  19. 19.梯度下降(2)
  20. 20.牛顿方法
  21. 21.KNN简介
  22. 22.距离测算
  23. 23.朴素贝叶斯
  24. 24.朴素贝叶斯的实际应用
  25. 25.信息熵:决策树构建的度量基础
  26. 26.信息增益与决策树的构建
  27. 27.ID3算法
  28. 28.决策树节点的划分
  29. 29.CART树
  30. 30.Bagging
  31. 31.Boosting:自适应提升算法
  32. 32.Gradient Boosting
  33. 33.线性模型:回归与分类的同一副骨架
  34. 34.最小二乘:把最优参数直接解出来
  35. 35.最小二乘法的几何与概率视角
  36. 36.极大似然:给最小二乘一个概率出身
  37. 37.逻辑回归(1):把线性模型接到分类上
  38. 38.逻辑回归(2):损失函数与多分类
  39. 39.---- 手造数据: 5 个样本, 2 个特征; x2 几乎 = 2*x1 (偏差手工指定, 无随机) ----
  40. 40.讲师例: 向量 "23014" -- 三把范数尺子量同一个向量
  41. 41.优化方法(1):坐标下降与前向选择
  42. 42.优化方法(2):前向策略与最小角回归
  43. 43.拉格朗日乘子法(1):从无约束到等式约束
  44. 44.拉格朗日乘子法(2):等式约束下的平行条件与拉格朗日函数
  45. 45.拉格朗日乘子法(3):不等式约束与 KKT 条件
  46. 46.最大间隔:把分类问题变成优化问题
  47. 47.拉格朗日对偶问题:把 w 和 b 全部换成 α
  48. 48.支持向量:边界上的少数派
  49. 49.SVM 计算过程:一笔到底算完,再走进核方法
  50. 50.贝叶斯公式:概率即信念
  51. 51.隐含变量和概率模型:给看不见的原因建模
  52. 52.EM 算法:期望与最大化的迭代
  53. 53.琴生不等式:EM 的数学钥匙
  54. 54.三个硬币问题:EM 的复盘与衔接
  55. 55.高斯混合模型:用隐变量解释双峰数据
  56. 56.隐马尔可夫模型
  57. 57.隐马尔可夫模型(2):前向算法与动态混合模型
  58. 58.隐马尔可夫模型在 NLP 中的运用
  59. 59.EM 算法:把「为什么收敛」推到底
  60. 60.HMM 在 NLP 中的运用:从分词到机器翻译
  61. 61.HMM 参数估计:Baum-Welch 的三块拉格朗日
  62. 62.高维下的高斯模型
  63. 63.主题模型:从词袋到隐含主题
  64. 64.Dirichlet 分布(1)
  65. 65.Dirichlet 分布(2)
  66. 66.统计学习内容回顾
  67. 67.K-means 算法
  68. 68.PCA 降维
  69. 69.SVD 降维
  70. 70.从聚类到流形
  71. 71.局部线性嵌入
  72. 72.随机邻域嵌入:SNE 与 t-SNE
  73. 73.无参模型:让数据自己说话
  74. 74.高斯过程:函数空间里的正态分布
  75. 75.高斯过程(2):噪声、正则化与核的线性组合
  76. 76.神经网络简介:从感知器到自编码器
  77. 77.反向传播:把误差一层层传回去
  78. 78.卷积神经网络(CNN):让特征自己学出来
  79. 79.循环神经网络(RNN):给网络装上记忆
  80. 80.深度学习回顾:静态一类,动态一类
  81. 81.增强学习(1):蒙特卡洛、树搜索与 Q-learning
  82. 82.强化学习(2):从乌鸦吃核桃到井字棋的 value 回传

拉格朗日乘子法(3):不等式约束与 KKT 条件

约 29 分钟

📺 正在播放小象官方高清录播(支持倍速与清晰度调节)

小象实战讲义 · 机器学习算法精讲

上一节把等式约束 h(x)=0h(x)=0 的优化讲完了:拉格朗日函数 L(x,μ)=f(x)+μh(x)L(x,\mu)=f(x)+\mu h(x)、平行条件、手算全流程。结尾还留了一块拼图——不等式约束的优化,g(x)≤0g(x) \le 0 的情形。讲师当时说,那正是做 SVM 时要遇到的形态:SVM 的求解,最终就是一个不等式的优化。这一节把这块拼图补上:问题框架不变(min⁡f(x)\min f(x)),只是约束从”必须在线上”变成”可以在一片区域里”——而把两种情况统一成一组条件的那件工具,叫 KKT 条件。

💡 核心导读

  • 从一条线到一个区域:等式 h(x)=0h(x)=0 在二维里是一条线,不等式 g(x)≤0g(x)\le 0 是一整片可行区域(feasible region)——约束”松”了一大截。
  • 两种情况:全局最优点恰好落在区域里(情况一:约束等于没有,直接按无约束解);最优点在区域外(情况二:最优解一定贴在区域边缘,不等式退化成等式,上一节的方法整个接上)。
  • 判定流程:先不管限制条件求出全局最优,再看它满不满足约束——满足就完事,不满足走情况二。
  • KKT 四条件:∂L/∂x=0\partial L/\partial x=0、λ∗≥0\lambda^*\ge 0、λ∗g(x∗)=0\lambda^* g(x^*)=0、g(x∗)≤0g(x^*)\le 0——λ=0\lambda=0 那一支回收情况一,g=0g=0 那一支回收情况二。
  • 一维例子全程:min⁡x2\min x^2 约束 x≥bx\ge b,解出 λ∗\lambda^* 要么是 00、要么是 2b2b——两种情况被同一组条件统一。

从一条线到一个区域

还是刚才一样的这个问题:想求 min⁡f(x)\min f(x),但这回限制条件从 h(x)=0h(x)=0 变成了 g(x)≤0g(x) \le 0。给定一个不等式的时候,怎么做这个优化?讲师的路数跟上一节一样:先举一个非常简单的实际例子,把情况看清楚,再引出里边的重要概念。

设目标函数 f(x)=x12+x22f(x) = x_1^2 + x_2^2。它的等高线长什么样,大家应该能画出来:一圈套一圈的同心圆,最小点在原点 (0,0)(0,0)。梯度是 (2x1, 2x2)(2x_1,\ 2x_2),负梯度是 (−2x1, −2x2)(-2x_1,\ -2x_2)——上一节练熟的东西。

现在给定限制条件:

g(x)=x12+x22−1≤0g(x) = x_1^2 + x_2^2 - 1 \le 0

注意这里面的结构:g(x)=0g(x)=0 就是那个单位圆;而”≤0\le 0“把圆内部的整个区域都划了进来。讲师在黑板上用铅笔把这个区域描了一圈(蓝色虚线区域)——这片区域内的每一个点都满足 g(x)≤0g(x)\le 0,都是可以取的点;要做的,就是在这片满足限制条件的区域里求 f(x)f(x) 的最优值。

于是跟等式的第一个区别立刻显形:h(x)=0h(x)=0 在二维空间里是一条线;g(x)≤0g(x)\le 0 是一个区域。在区域里满足这个条件的点都是可以的——可行域从”一条道”拓宽成了”一整片地”。

情况一:最小点就在区域里面

这个 case 非常简单。假设想求的最小点,恰好满足 g(x)≤0g(x)\le 0 这个限制条件——比如本例的全局最小点 (0,0)(0,0),代进去 g(0,0)=−1≤0g(0,0) = -1 \le 0,就在区域里。那这个问题就”完完了”:直接按一个最简单的无约束问题去做——

∇f=[2x12x2]=0⟹x1=x2=0\nabla f = \begin{bmatrix}2x_1 \\ 2x_2\end{bmatrix} = 0 \quad\Longrightarrow\quad x_1 = x_2 = 0

解出来的 x1=x2=0x_1=x_2=0 就是答案,没有什么问题。

这里有一个自然的疑问(讲师替大家问了):怎么知道最优点在不在限制区域之内?做法其实特别容易——先不关心限制条件,把它的全局最优解出来;然后看这个解满不满足限制条件。满足,求解完毕;不满足,再看情况二。

情况二:最小点在区域外面

我们没有每次都那么幸运——不是每次全局最优点都正好落在限制区域里边。这时候该怎么办?

把所优化的函数换一下(限制条件不动)。讲师在黑板上现场调数字:先写了带偏移的 (x1−1)2+(x2−2)2(x_1-1)^2+(x_2-2)^2,改成对称一点儿的 (x1−1)2+(x2−1)2(x_1-1)^2+(x_2-1)^2,再”稍微大一点点”,最终落在:

f(x)=(x1−1.1)2+(x2−1.1)2f(x) = (x_1 - 1.1)^2 + (x_2 - 1.1)^2

这么做的目的只有一个:让无约束最优点 (1.1,1.1)(1.1, 1.1) 明确地落在限制条件之外(它到原点的距离 1.12+1.12≈1.56>1\sqrt{1.1^2+1.1^2}\approx 1.56 > 1,在单位圆盘外面)。限制条件没变,变的是优化的函数——等高线还是一族同心圆,只是圆心挪到了 (1.1,1.1)(1.1, 1.1)。

这时直觉很清楚:沿着让 ff 下降的方向走,会一头撞到区域的边缘(g(x)=0g(x)=0 那个圆)上,再也前进不得。最优解一定落在区域的边缘——问题退化成一个等式约束的优化:

min⁡f(x)s.t.g(x)=0\min f(x) \quad \text{s.t.} \quad g(x) = 0

上一节的东西整个接上来,而且会出现刚才说的 Δx\Delta x 和 gg 的那种关系——最优处负梯度与法线方向共线:

−∇f=λ∇g-\nabla f = \lambda \nabla g

(记号说明:等式约束 hh 的乘子用 μ\mu,不等式约束 gg 的乘子用 λ\lambda——讲师特意换了字母,“为了稍微区分一下”。)

所以情况二要满足三个条件:其一,负梯度和 gg 的梯度(法线方向)共线(λ>0\lambda>0 时两者同向);其二,λ\lambda 一定要大于零(讲师还补了一句”刚才忘说那个 μ\mu 是大于零”——上一节算过,求最小值的那个解 μ=+1/2>0\mu=+1/2>0,两头在这里接上了);其三,g(x)=0g(x)=0。这样,不等式优化就直接变成了一个等式约束的优化。

KKT 条件:把两种情况写在一起

情况一按无约束解,情况二按等式约束解——两条路各自都通了。关键是两者怎么统一:能不能把 case one 和 case two 全部写在一起?能。这就是 KKT 条件的来历。

对 min⁡f(x)\min f(x) s.t. g(x)≤0g(x)\le 0,仍然构造一样形式的拉格朗日函数(针对不等式约束的版本):

L(x,λ)=f(x)+λg(x)L(x, \lambda) = f(x) + \lambda g(x)

满足下面四个条件的 x∗x^*(连同乘子 λ∗\lambda^*),就是最优解:

条件一:∂L∂x=0\dfrac{\partial L}{\partial x} = 0。对 xx 求导就是 ∇f+λ∇g=0\nabla f + \lambda\nabla g = 0,倒过来正是 −∇f=λ∇g-\nabla f = \lambda\nabla g——跟上一节等式约束推出来的条件一模一样。

条件二:λ∗≥0\lambda^* \ge 0。刚才情况二里不是说 λ\lambda 一定要大于零吗,为什么这里写成”大于等于”?因为还存在 λ=0\lambda = 0 的情形——那样就把 case one 也收进来了。这一改,两种情况统一。

条件三:λ∗⋅g(x∗)=0\lambda^* \cdot g(x^*) = 0。这是区分 case one 和 case two 的机关。两个因子相乘等于零,无非两支:

  • λ∗=0\lambda^* = 0:整个拉格朗日函数退化成 L=f(x)L = f(x)——因为 λ\lambda 乘 g(x)g(x) 那一项压根就不算了。对 LL 求导置零就等于对 ff 求导置零,直接做全局优化。这正是情况一:最优点在区域里面,此时 g(x∗)<0g(x^*) < 0。
  • g(x∗)=0g(x^*) = 0:最优解贴在边界上,λ∗>0\lambda^* > 0——正是情况二:不等式退化成等式的优化问题。

条件四:g(x∗)≤0g(x^*) \le 0。原始限制条件本身。g(x∗)<0g(x^*)<0 的时候,对应的就是 λ=0\lambda=0 那一支。

这四个条件,把 case one 和 case two 所有的可能性都包含了:λ\lambda 等于零,代表可以直接求全局最优、全局最优就在限制区域里边;gg 等于零,代表最优在限制区域之外、把不等式问题变成等式问题。构造出 L(x,λ)=f(x)+λg(x)L(x,\lambda) = f(x)+\lambda g(x) 之后,最优解必须满足这四个条件——满足这四个条件,才是一个最优解。

这组条件是有三个人一起发现的,写了一篇文章,讲约束的这套条件就叫 Karush-Kuhn-Tucker condition,取三个人名字的首字母简称 KKT 条件(讲师口播里的”KTT 条件""KK 提条件”都是 ASR 错词,正确读法是 K-K-T)。它就是用来解决不等式约束下优化问题的工具。回头看会发现:不等式优化只有两个方向——要么变成普通的全局优化(情况一),要么变成等式的优化(情况二)——而两条路都通过构造拉格朗日函数来走。

术语对照(标准补全):教科书里这四条常被冠名为平稳性(stationarity)、原始可行性(primal feasibility)、对偶可行性(dual feasibility)、互补松弛性(complementary slackness)。本讲义按讲师的推导顺序叫它们条件一~条件四。

把开篇那个二维例子的两种情况各检一遍四条件——同一个圆盘约束,两种命运:

# ---- 二维例子: 同一个圆盘约束, 两种命运 ----
# 可行域: g(x) = x1^2 + x2^2 - 1 <= 0 (单位圆盘, 含内部与边界)
import math

def g(x1, x2):
    return x1 * x1 + x2 * x2 - 1.0

print("约束区域 g(x) = x1^2 + x2^2 - 1 <= 0: 二维里不是一条线, 而是整个单位圆盘")
print()
print("=== 情况一: f(x) = x1^2 + x2^2, 全局最优点 (0,0) 就在圆盘里 ===")
print(f"  无约束解 x* = (0, 0): g(0, 0) = {g(0.0, 0.0):+.1f} <= 0 -> 满足限制条件, 约束没激活")
print("  取 lambda* = 0, 四条件逐项检查:")
print("    条件一: grad f(0,0) + 0*grad g = (0.0, 0.0)  (grad f 在原点本身就是零向量)")
print("    条件二: lambda* = 0 >= 0")
print(f"    条件三: lambda* * g(x*) = 0 * ({g(0.0, 0.0):.1f}) = 0.0")
print(f"    条件四: g(x*) = {g(0.0, 0.0):+.1f} < 0")
print("  -> 直接按无约束解: 2*x1 = 0, 2*x2 = 0, x1 = x2 = 0, 完事")
print()

print("=== 情况二: f(x) = (x1-1.1)^2 + (x2-1.1)^2, 最优点 (1.1,1.1) 在圆盘外 ===")
unc = (1.1, 1.1)
print(f"  无约束解 (1.1, 1.1): g = {g(*unc):+.4f} > 0 -> 不可行, 最优解只能贴在圆盘边缘")
s = 1.0 / math.sqrt(2.0)
x1s, x2s = s, s
lam = 1.1 * math.sqrt(2.0) - 1.0
gf = (2.0 * (x1s - 1.1), 2.0 * (x2s - 1.1))
gg = (2.0 * x1s, 2.0 * x2s)
stat = (gf[0] + lam * gg[0], gf[1] + lam * gg[1])
print(f"  贴边解 x* = (1/sqrt(2), 1/sqrt(2)) = ({x1s:.4f}, {x2s:.4f})")
print(f"  由条件一解出: lambda* = 1.1*sqrt(2) - 1 = {lam:.4f}")
print(f"    条件一: grad f + lambda* grad g = ({stat[0]:+.2e}, {stat[1]:+.2e})  (机器零)")
print(f"    条件二: lambda* = {lam:.4f} > 0")
print(f"    条件三: lambda* * g(x*) = {lam * g(x1s, x2s):+.2e}  (g 本身是机器零)")
print(f"    条件四: g(x*) = {g(x1s, x2s):+.2e}  (正好在边界上)")
print(f"  方向检查: -grad f = ({-gf[0]:.4f}, {-gf[1]:.4f}), lambda* * grad g = ({lam * gg[0]:.4f}, {lam * gg[1]:.4f})")
print("  -> 负梯度与 grad g 同向 (lambda* > 0), 不等式优化退化成 g = 0 的等式优化")
约束区域 g(x) = x1^2 + x2^2 - 1 <= 0: 二维里不是一条线, 而是整个单位圆盘

=== 情况一: f(x) = x1^2 + x2^2, 全局最优点 (0,0) 就在圆盘里 ===
  无约束解 x* = (0, 0): g(0, 0) = -1.0 <= 0 -> 满足限制条件, 约束没激活
  取 lambda* = 0, 四条件逐项检查:
    条件一: grad f(0,0) + 0*grad g = (0.0, 0.0)  (grad f 在原点本身就是零向量)
    条件二: lambda* = 0 >= 0
    条件三: lambda* * g(x*) = 0 * (-1.0) = 0.0
    条件四: g(x*) = -1.0 < 0
  -> 直接按无约束解: 2*x1 = 0, 2*x2 = 0, x1 = x2 = 0, 完事

=== 情况二: f(x) = (x1-1.1)^2 + (x2-1.1)^2, 最优点 (1.1,1.1) 在圆盘外 ===
  无约束解 (1.1, 1.1): g = +1.4200 > 0 -> 不可行, 最优解只能贴在圆盘边缘
  贴边解 x* = (1/sqrt(2), 1/sqrt(2)) = (0.7071, 0.7071)
  由条件一解出: lambda* = 1.1*sqrt(2) - 1 = 0.5556
    条件一: grad f + lambda* grad g = (+0.00e+00, +0.00e+00)  (机器零)
    条件二: lambda* = 0.5556 > 0
    条件三: lambda* * g(x*) = -1.23e-16  (g 本身是机器零)
    条件四: g(x*) = -2.22e-16  (正好在边界上)
  方向检查: -grad f = (0.7858, 0.7858), lambda* * grad g = (0.7858, 0.7858)
  -> 负梯度与 grad g 同向 (lambda* > 0), 不等式优化退化成 g = 0 的等式优化

两个细节值得看一眼:情况二里 g(x∗)=−2.22×10−16g(x^*) = -2.22\times 10^{-16}——数学上贴在边界上就该是 00,机器上带了符号毛边(1/21/\sqrt{2} 的平方凑整差了一丁点),条件三的 λ∗g(x∗)\lambda^* g(x^*) 也因此是个 10−1610^{-16} 量级的”机器零”;条件一倒是精确的 (+0.00, +0.00)(+0.00,\ +0.00)。数学上为零、机器上有毛边,这是老朋友了。方向检查那行则把三个条件里的第一条落到了实数上:−∇f=(0.7858,0.7858)-\nabla f = (0.7858, 0.7858) 与 λ∗∇g=(0.7858,0.7858)\lambda^*\nabla g = (0.7858, 0.7858) 逐位相同——负梯度与法线同向,λ∗>0\lambda^* > 0。

更一般的形式:等式与不等式一起上

等式和不等式两个方向都描述完了,可以做一个更 general 的优化问题。给定 f(x)f(x),限制条件可能是两个系列:

hi(x)=0(i=1,…,l)gj(x)≤0(j=1,…,m)h_i(x) = 0 \quad (i = 1, \dots, l) \qquad\qquad g_j(x) \le 0 \quad (j = 1, \dots, m)

第一个系列是 ll 个等式限制条件,第二个系列是 mm 个不等式约束。构造拉格朗日函数时,把所有项都加在一起:

L(x,μ,λ)=f(x)+∑i=1lμihi(x)+∑j=1mλjgj(x)L(x, \mu, \lambda) = f(x) + \sum_{i=1}^{l}\mu_i h_i(x) + \sum_{j=1}^{m}\lambda_j g_j(x)

每一个等式限制条件对应一个乘子 μi\mu_i,每一个不等式限制条件对应一个乘子 λj\lambda_j(μ\mu 和 λ\lambda 在这里都是向量,xx 也是向量——在不同维度上都要求导为零)。条件清单跟着扩容:

  • 对 xx 的导数等于零(每个分量都是);
  • 对 μi\mu_i 求导置零——恰好回收 hi(x)=0h_i(x)=0,等式约束的老办法;
  • λj≥0\lambda_j \ge 0(全部 jj);
  • λj⋅gj(x∗)=0\lambda_j \cdot g_j(x^*) = 0(全部 jj);
  • gj(x∗)≤0g_j(x^*) \le 0(全部 jj)。

两处需要把关的地方。其一,讲师板书时顺口把 μ\mu 也念成了”大于等于零”——等式约束的 μi\mu_i 没有符号限制:上一节亲手算过 μ=±0.5\mu = \pm 0.5 两个解都成立(求最小值 μ>0\mu>0、求最大值 μ<0\mu<0),这里按正确口径采信上一节的结论。其二,讲师在黑板上还把”对 λj\lambda_j 求导置零”也列进了条件清单——对 μi\mu_i 那条完全正确;而对 λj\lambda_j 求导置零得到 gj(x)=0g_j(x)=0,只在”约束被激活”的那一支成立(下面的一维例子里,∂L/∂λ=0\partial L/\partial\lambda=0 解出来的正是 x=bx=b 那一支)。完整的不等式条件,由 λj≥0\lambda_j\ge 0、λjgj=0\lambda_j g_j=0、gj≤0g_j\le 0 三件套来表达。

所以,如果构造一个特别复杂的优化函数——里面既有等式限制条件、又有不等式限制条件——就把它们都加在一起,按 KKT 条件求解,就可以得到最后的值。

一维例子:从头到尾解一遍

概念都齐了,来一个非常简单的例子走全程。优化的函数就是 f(x)=x2f(x) = x^2,画出来一条抛物线;限制条件是 x≥bx \ge b。先把约束统一成标准形式:

g(x)=b−x≤0g(x) = b - x \le 0

(任何”大于等于”的约束,最后总会化成 g(x)≤0g(x)\le 0 的形式。)图分两种画法:bb 在左边(负半轴)的时候,x≥bx\ge b 这个可满足的区域很大、把抛物线的全局最优点 00 也包了进去,全局最优点就是整个函数的最优点;bb 在右边(正半轴)的时候,可被允许的区域是 [b,+∞)[b, +\infty),最优点就不再是 00,而是抛物线与边界的交点 x=bx=b。

用刚学的构造来解。拉格朗日函数:

L(x,λ)=x2+λ(b−x)L(x, \lambda) = x^2 + \lambda(b - x)

(别忘了 λ≥0\lambda \ge 0。)对 xx 求导置零:

∂L∂x=2x−λ=0⟹x∗=λ2\frac{\partial L}{\partial x} = 2x - \lambda = 0 \quad\Longrightarrow\quad x^* = \frac{\lambda}{2}

(讲师先说成了”xx 等于二倍的 λ\lambda“,马上自我纠正为”二分之”——2x−λ=02x-\lambda=0 移项,xx 是 λ\lambda 的一半。)对 λ\lambda 求导置零:

∂L∂λ=b−x=0⟹x=b\frac{\partial L}{\partial \lambda} = b - x = 0 \quad\Longrightarrow\quad x = b

两式一联立:λ/2=b\lambda/2 = b,解出

λ∗=2b\lambda^* = 2b

到这里要停一下——别忘了有两种情况。最优值有可能在 bb 允许的区域内,也有可能在允许区域外。如果在区域内(b≤0b \le 0,无约束最优 x=0x=0 可行),相当于 λ\lambda 直接取 00:x2x^2 的最优值在 00 处直接得出来,四条件里走的是 λ∗=0\lambda^*=0 那一支。如果在区域外(b>0b > 0),λ\lambda 就是一个大于零的数,走刚才联立出来的这支,λ∗=2b\lambda^* = 2b。

所以 λ\lambda 的最优值要么是 00、要么是 2b2b;而 xx 的最优值等于 λ\lambda 除以二——要么是 00、要么恰好就是 bb。(讲师收尾时先把 max⁡(0, 2b)\max(0,\ 2b) 说到了 xx 头上,话到一半自我纠正:那是 λ\lambda 的最优值——写成干净的形式就是 x∗=max⁡(0, b)x^* = \max(0,\ b)、λ∗=max⁡(0, 2b)\lambda^* = \max(0,\ 2b)。)验证一下:b>0b>0 时,确实是 xx 取到 bb、ff 的值才最小——两种优化到这里就都求完了。

把两个分支跑一遍,四条件逐项验:

# ---- 一维例子全程: min x^2, s.t. x >= b, 即 g(x) = b - x <= 0 ----
# L(x, lam) = x^2 + lam*(b - x)
# dL/dx = 2x - lam = 0  ->  x* = lam/2
# 对 lam 求导置零 (激活支): b - x = 0 -> x = b, 联立得 lam* = 2b

def solve_1d(b):
    # 先走情况一: 不管约束, 无约束最优 x = 0, 检查 g(0) = b <= 0 是否满足
    if b <= 0:
        return 0.0, 0.0
    # 不满足 -> 情况二: 约束激活, x* 贴边界 x = b, lam* = 2b
    return float(b), 2.0 * b

print("min x^2  s.t.  x >= b   (统一写成 g(x) = b - x <= 0)")
print("L(x, lam) = x^2 + lam*(b - x);  dL/dx = 2x - lam = 0  ->  x* = lam/2")
print()
print(f"{'b':>5} | {'x*':>5} | {'lam*':>5} | {'f(x*)':>6} |  四条件: 2x-lam, lam>=0, lam*g, g")
for b in (-1.0, 0.0, 0.5, 2.0):
    x, lam = solve_1d(b)
    dL_dx = 2.0 * x - lam
    gx = b - x
    print(f"{b:5.1f} | {x:5.1f} | {lam:5.1f} | {x * x:6.2f} |  "
          f"{dL_dx:+.1f}, {lam:.1f}, {lam * gx:+.1f}, {gx:+.1f}")
print()
print("规律: b <= 0 时无约束最优 x=0 可行, 取 0 支 (lam* = 0);")
print("      b >  0 时 x=0 不可行, 最优解贴到 x = b, 取 2b 支 (lam* = 2b)")
print("即 x* = max(0, b), lam* = max(0, 2b) —— 两种情况被一组条件统一")
min x^2  s.t.  x >= b   (统一写成 g(x) = b - x <= 0)
L(x, lam) = x^2 + lam*(b - x);  dL/dx = 2x - lam = 0  ->  x* = lam/2

    b |    x* |  lam* |  f(x*) |  四条件: 2x-lam, lam>=0, lam*g, g
 -1.0 |   0.0 |   0.0 |   0.00 |  +0.0, 0.0, -0.0, -1.0
  0.0 |   0.0 |   0.0 |   0.00 |  +0.0, 0.0, +0.0, +0.0
  0.5 |   0.5 |   1.0 |   0.25 |  +0.0, 1.0, +0.0, +0.0
  2.0 |   2.0 |   4.0 |   4.00 |  +0.0, 4.0, +0.0, +0.0

规律: b <= 0 时无约束最优 x=0 可行, 取 0 支 (lam* = 0);
      b >  0 时 x=0 不可行, 最优解贴到 x = b, 取 2b 支 (lam* = 2b)
即 x* = max(0, b), lam* = max(0, 2b) —— 两种情况被一组条件统一

四行就是两支的全部形态:b=−1b=-1 和 b=0b=0 走 λ∗=0\lambda^*=0 支(x∗=0x^*=0),b=0.5b=0.5 和 b=2b=2 走 λ∗=2b\lambda^*=2b 支(x∗=bx^*=b),每一行的四条件全部打勾。表里那个 −0.0-0.0 又是机器毛边:00 乘上负数(g=−1g=-1),数学上是零、机器上带出了负号——老朋友第二次登场。

到这里,拉格朗日乘子法三节连走:等式约束(前两节)、不等式约束(本节)。讲师的收尾就一句:“拉格朗日乘子到现在为止,大家有没有什么问题?“——下一节就是真正的目的地:最大间隔。SVM 的求解就是一个不等式的优化,这一节的 KKT 条件正是为它准备的(对偶问题会在第 11 章展开)。

📝 动手练一练

  1. λ=0\lambda=0 的那一支:条件三 λ∗g(x∗)=0\lambda^* g(x^*) = 0 为什么被称为”区分两种情况的条件”?当 λ∗=0\lambda^* = 0 时,拉格朗日函数 L(x,λ)L(x,\lambda) 变成了什么、优化问题变成了什么?当 g(x∗)=0g(x^*) = 0 时呢?
👉 点击查看参考答案

两个因子相乘为零,必居其一:

  • λ∗=0\lambda^* = 0(且 g(x∗)<0g(x^*) < 0):L=f(x)+λg(x)L = f(x) + \lambda g(x) 里 λg(x)\lambda g(x) 那一项压根就不算了,LL 退化成 ff 本身——对 LL 求导置零等于对 ff 求导置零,问题变成无约束的全局优化。对应情况一:最优解在可行域内部,约束没起作用。
  • g(x∗)=0g(x^*) = 0(且 λ∗>0\lambda^* > 0):最优解贴在可行域边界上,不等式约束退化成等式约束,按上一节等式优化的方法解。对应情况二。

四两拨千斤的一条乘积等于零,就是”把 case one 和 case two 统一到一起”的机关。

  1. 换一个目标函数:min⁡f(x)=(x−1)2\min f(x) = (x-1)^2,约束仍是 x≥bx \ge b(即 g(x)=b−x≤0g(x) = b - x \le 0)。(1) 写出拉格朗日函数与条件一的方程;(2) 讨论 bb 在什么范围时约束不激活、什么范围时激活,分别给出 x∗x^* 与 λ∗\lambda^*;(3) 用 b=0b=0 和 b=3b=3 两组数逐条验证四条件。
👉 点击查看参考答案

(1) L(x,λ)=(x−1)2+λ(b−x)L(x,\lambda) = (x-1)^2 + \lambda(b-x);条件一:∂L∂x=2(x−1)−λ=0\dfrac{\partial L}{\partial x} = 2(x-1) - \lambda = 0,即 λ=2(x−1)\lambda = 2(x-1)。

(2) 无约束最优是 x=1x=1,它可行当且仅当 1≥b1 \ge b:

  • b≤1b \le 1:约束不激活,x∗=1x^* = 1,λ∗=0\lambda^* = 0(g(1)=b−1≤0g(1) = b-1 \le 0);
  • b>1b > 1:约束激活,x∗x^* 贴边界 x=bx = b,λ∗=2(b−1)>0\lambda^* = 2(b-1) > 0。

汇总:x∗=min⁡(1, b)x^* = \min(1,\ b),λ∗=max⁡(0, 2(b−1))\lambda^* = \max(0,\ 2(b-1))——与正文 min⁡x2\min x^2 那题的 x∗=max⁡(0, b)x^* = \max(0,\ b) 正好是一对镜像:一个把解往右拦、一个把解往左拦。

(3) b=0b=0:x∗=1x^*=1,λ∗=0\lambda^*=0。条件一 2(1−1)−0=02(1-1)-0 = 0;条件二 0≥00 \ge 0;条件三 0×(−1)=00 \times (-1) = 0;条件四 g(1)=−1≤0g(1) = -1 \le 0。全过。 b=3b=3:x∗=3x^*=3,λ∗=4\lambda^*=4。条件一 2(3−1)−4=02(3-1)-4 = 0;条件二 4>04 > 0;条件三 4×0=04 \times 0 = 0;条件四 g(3)=0≤0g(3) = 0 \le 0。全过(此时 f(x∗)=4f(x^*) = 4)。

本章小结

  • 可行域:等式 h(x)=0h(x)=0 在二维里是一条线,不等式 g(x)≤0g(x)\le 0 是一整片区域;区域内所有点都满足约束。
  • 情况一:全局最优满足约束(g(x∗)<0g(x^*)<0)→ 直接按无约束解(∇f=0\nabla f = 0);判定流程:先解无约束、再验可行性。
  • 情况二:全局最优在区域外 → 最优解贴边界 g(x)=0g(x)=0,退化成等式优化;三个条件:负梯度与 ∇g\nabla g 共线(λ>0\lambda>0 时同向)、λ>0\lambda>0、g=0g=0。记号约定:等式乘子 μ\mu、不等式乘子 λ\lambda。
  • KKT 四条件:∂L/∂x=0\partial L/\partial x = 0、λ∗≥0\lambda^* \ge 0、λ∗g(x∗)=0\lambda^* g(x^*) = 0、g(x∗)≤0g(x^*) \le 0;λ=0\lambda=0 支回收情况一(LL 退化为 ff),g=0g=0 支回收情况二——两种情况统一。得名于 Karush、Kuhn、Tucker 三人。
  • 一般形式:ll 个等式 + mm 个不等式,L=f+∑μihi+∑λjgjL = f + \sum\mu_i h_i + \sum\lambda_j g_j;μi\mu_i 无符号限制(±\pm 双解先例)、λj≥0\lambda_j \ge 0、λjgj=0\lambda_j g_j = 0、gj≤0g_j \le 0。
  • 一维例子:min⁡x2\min x^2 s.t. x≥bx\ge b → x∗=λ/2x^* = \lambda/2、激活支 λ∗=2b\lambda^* = 2b;干净写法 x∗=max⁡(0, b)x^* = \max(0,\ b)、λ∗=max⁡(0, 2b)\lambda^* = \max(0,\ 2b)。

📋 行动清单

  • 把一维例子的两支各手推一遍(x∗=λ/2x^*=\lambda/2、λ∗=2b\lambda^*=2b),再取 b=5b=5 验证:x∗=5x^*=5、λ∗=10\lambda^*=10
  • 跑代码块二,盯着 bb 从 −1-1 走到 22:解从 00 支跳到 2b2b 支的瞬间,就是约束从”没激活”到”贴边界”的瞬间
  • 在纸上画单位圆盘,再画圆心在原点、圆心在 (1.1, 1.1)(1.1,\ 1.1) 的两族同心圆,标出各自最优解的位置(一个在圆心、一个贴边)
  • 用自己的话讲一遍:条件三那条乘积为零,凭什么把两种情况统一
  • 预习下一节《最大间隔》——SVM 的求解就是一个不等式优化,KKT 条件在那里正式上场

—— 小象教研组

配套资料 · 直接下载

课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。

  • 第10章课件:核方法(最大间隔与拉格朗日乘子法)
    下载
  • 第10章笔记:拉格朗日乘子法(一)
    下载
  • 第10章笔记:拉格朗日乘子法(二)
    下载
  • 第10章笔记:最大间隔的几何直觉
    下载