ML-对偶(Duality)问题 KKT 条件

Primal => Dual

现实中我们遇到的原优化问题, 写为标准型的话是这样的.

minwf(w)s.t.gi(w)<=0hi(w)=0

即要求的是在w满足约束条件下, 且使得f(w)取得最小值的 w 的值.

那我们通常的做法是通过引入拉格朗日函数:

L(w,α,β)=f(w)+i=1kαigi(w)+i=1tβihi(w)

其中α,β 都大于等于0, 称为拉格朗日算子. 至于为什么能这样做, 参考"对偶问题初识"的笔记里我有推导, 更详尽的可以翻翻高数, 关于带约束条件下求函数极值的部分, 分别从几何和分析的两个角度有推导(核心就是偏导数,梯度向量(法向量)平行), 这里就过了,不想牵扯太多.

现在来考虑一个max 的函数:

θp(w)=maxα,βL(w,α,β)针对 α,β要对L(w) 取最大.

对于给定的w, 如果对于原问题 f(w)中没有对w进行约束, 则可得出θp(w)的是无穷大的.

θp(w)=[f(w)+i=1kαigi(w)+i=1tβihi(w)]=

如过 w 满足primal 的约束, 则θp(w)=f(w), 这里的"=",应该表示"最优化问题等价"不是数值上等于,感觉. 这里有一点绕, 其实想表达的是这样的思想:

欲对关于w,α,β的函数L(w,α,β)min时的优化问题, 转为先对 α,β 优化取max, 再优化 w

用数学的形式来表达这样的思想即:

minw [θp(w)]=minw [maxα,β L(w,α,β)]

再定义: θD(α,β)=minw L(w,α,β)

  • θp(w) 是针对 α,βmax 最优化
  • θD(α,β) 是针对 w 的min 最优化

也就是将dual 的问题可定义为:

maxα,β [θD(α,β)]=maxα,β minw [L(w,α,β)]

对于原始及其对偶问题, 我们假设

  • p* 为primal 问题 minw θp(w) 的最优解

  • d* 为其 dual 问题 maxα,β θD(α,β) 的最优解

必然有:

p=minw[maxα,β L(w,α,β)]>=maxα,β [minw L(w,α,β)]=d

关于 p* >= d* 在"对偶问题初识"的笔记中有过证明, 根据约束条件及定义证明的

有一种这样的感觉: 对一个多元函数有: "min max" >= "max min", 多个参数哈.

KKT

关于primal 和 dual 的一个最为重要的结论, 莫过于p* >= d* (用约束定义证明)

minmize f0(x)s.t.fi(x)<=0,i=1,2,..mhj(x)=0,j=1,2...p

在凸优化及对偶的初识中, 我们知道, 如果 p = d*, 则称为强对偶, 当函数为convex, 一般会成立. 同样, 如果已经函数是convex. 如果满足:  x,fi(x)<0,hj(x)=0 (称为slater's condition) 则可判定该convex是强对偶*的哦.

我们进一步还推导了 complementary slackness 条件

即如果 p*=d * 必然要有 λfi(x)=0

这里先引入结论, p*=d * ** 只有在KKT条件下才会满足**

KKT

  • 是以3个科学家名字命名的: Karush-Kuhn-Tucke
  • 广义化的拉格朗日数数乘的扩展

SVM算是KKT的一个最典型的应用了. 假设 f, g 都是convex函数f(w)=wTw的约束条件, 满足hi(w),gi(w) 都是 aiTw+b 的线性形式, 同时假设存在w使得gi(w)<=0. 则一定存在ai,β,w 满足Karush-Kuhn-Tucker(KKT)条件,而 [ ai,β,w] 也正好是 **p*=d ***的解, KKT条件即:

wiL(w,ai,β)=0

βiL(w,ai,β)=0

αigi(w)=0 (很关键的 complementary 条件哦, 已通过定义证明)

gi(w)<=0

a>=0

why KKT?

不难发现在很多问题求解, 我们大多能转为dual的问题, 然而如果不能满足KKT条件, dual的问题可能不能简化primal问题的求解, KKT我自己平时也基本不会用到, 不过在SVM中却被巧妙地用到了, 就是有一条关键性质:

αigi(w)=0

使得SVM在求解参数的时候, 简化了大量的运算量, 从而找到那些支持向量就搞定了, 其他地方, 欧文感觉也没太用到, 不过运筹学方面,应该会有涉及一点, 我也不管, 就像理解一波KKT和推导SMV, 装逼一波, 然后应用上做一个自信的调参侠,仅此而已, 下一波就推导SVM.

posted @   致于数据科学家的小陈  阅读(540)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示

目录导航