资讯详情

资讯详情

原始问题与对偶问题:从拉格朗日乘子到SVM与深度学习优化

原始问题和对偶问题到底在优化什么做深度学习做到一定阶段几乎每个人都会撞上同一堵墙原始问题和对偶问题。我在复现某个图像分类Demo时模型训练Loss收敛得很快但验证集指标就是上不去。后来把优化目标里的正则项换了一个等价形式整个训练过程立刻稳定下来。当时某导师点了一句你换的是原问题的约束形式本质上是对偶空间的调整。这个系列讲到第六篇前面几篇已经铺垫过拉格朗日乘子、凸优化基础、梯度下降与牛顿法的关系。这一篇我想把原问题和对偶问题串起来重点讲清楚三件事对偶问题为什么总能给出原问题的一个下界什么条件下两边能完全相等以及这套理论在SVM和深度学习优化里到底怎么用。要理解现代机器学习算法这部分是绕不开的地基。这篇内容适合正在读论文、复现算法、或者被SVM推导折磨过的读者。如果你只是调参跑模型可能暂时用不到但一旦你想理解优化器背后的逻辑、正则化到底在惩罚什么就会发现对偶视角比任何经验法则都靠谱。1. 从约束优化到拉格朗日函数1.1 标准形式的约束优化问题先统一记法。一般的约束优化问题可以写成$$ \min_{x} ; f(x) $$$$ \text{s.t.} ; g_i(x) \le 0, \quad i1,...,m $$$$ h_j(x) 0, \quad j1,...,p $$这里的不等式约束 $g_i(x) \le 0$ 很关键。深度学习里的权重衰减、模型复杂度控制、SVM的间隔约束全部可以归到这个形式里。等式约束相对少见但在概率图模型的归一化条件、某些矩阵分解问题里会出现。为什么要把约束单独提出来而不是直接塞进目标函数里当惩罚项因为约束代表的是硬性要求不是软性偏好。比如SVM要求所有样本点满足间隔约束这是模型结构决定的不是调节超参就能放宽的。硬约束下的最优解和软惩罚下的最优解在数学性质上有本质差别。如果问题无约束直接求梯度等于零就行。有了约束单纯求梯度等于零就不够了——最优解可能落在约束边界上梯度方向会和约束曲面的切平面垂直。这时候需要拉格朗日乘子法。1.2 拉格朗日函数约束变成“价格”定义一个拉格朗日函数$$ L(x, \lambda, \nu) f(x) \sum_{i1}^m \lambda_i g_i(x) \sum_{j1}^p \nu_j h_j(x) $$同时要求乘子 $\lambda_i \ge 0$$\nu_j$ 没有符号限制。为什么不等式约束的乘子必须非负这里有一个很直观的理解方式。把 $\lambda_i g_i(x)$ 看作“违反约束的罚款”。当 $g_i(x) 0$ 时约束被违反需要施加惩罚乘子非负才能保证罚款方向正确。如果 $\lambda_i 0$违反约束反而会“奖励”目标函数这显然不合理。生活化理解你租房子时房东规定违规改动结构要罚款罚款金额乘上违规程度进入你的总成本——罚款不可能是负数否则等于鼓励你拆墙。拉格朗日函数的精妙之处在于它在形式上把约束问题转化成了无约束问题。但这里有个关键区别——不是直接求 $L$ 的最小值而是先对 $x$ 求最小再对乘子求最大。这个“先后顺序”就是原始问题和对偶问题的分野。1.3 原始问题的等价写法原始问题可以写成$$ p^* \min_x \max_{\lambda \ge 0, \nu} L(x, \lambda, \nu) $$当 $x$ 违反某个不等式约束即 $g_i(x) 0$把 $\lambda_i$ 取到无穷大$L$ 就会变成正无穷这个 $x$ 在 min 的过程中被天然淘汰。当 $x$ 满足所有约束$g_i(x) \le 0$最优策略是取 $\lambda_i 0$此时 $L f(x)$。所以这个“先 max 后 min”的结构自动实现了对不可行解的无限惩罚。这就是原始问题。2. 对偶函数与弱对偶性2.1 对偶函数交换 min 和 max 的顺序如果把 min 和 max 的顺序交换就得到对偶问题$$ d^* \max_{\lambda \ge 0, \nu} \min_x L(x, \lambda, \nu) $$先看内层。定义对偶函数$$ g(\lambda, \nu) \min_x L(x, \lambda, \nu) $$注意这里没有约束就是对一个无约束问题求最小。如果 $L$ 关于 $x$ 是凸函数可以直接用梯度为零求解即便不是凸函数$\min_x$ 在数学上仍然有定义只是可能很难求。对偶函数有一个极其重要的性质它对 $\lambda$ 和 $\nu$ 一定是凹函数。原因不复杂$L$ 是关于 $(\lambda, \nu)$ 的仿射函数而一族仿射函数的逐点下确界一定是凹函数。逐点下确界可以理解为你有很多条直线对每个位置取所有直线中最低的那个点连成的曲线必然是凹的。2.2 弱对偶性对偶问题给出下界因为“先 min 后 max”拿到的值总是小于等于“先 max 后 min”拿到的值所以$$ d^* \le p^* $$这个性质叫弱对偶性。它看起来很简单但意义重大无论原问题多复杂、多非凸、多难解对偶问题总能给出原问题最优值的一个下界。这个下界在工程里非常实用——你可以不停迭代优化原问题但永远不知道距离真正最优还差多远对偶下界告诉你一个理论上的边界两者之差就是对偶间隙$$ p^* - d^* \ge 0 $$对偶间隙衡量的是“原问题最优值”和“对偶问题最优值”之间的差距。这个差距越小说明对偶问题对原问题的刻画越精确。某次我在一个模拟项目X里需要求解一个带复杂业务约束的资源分配问题原问题规模很大而且不是标准凸形式直接暴力求解器跑了半小时都没结果。后来我先求了对偶问题很快就拿到了一个下界然后用这个下界做剪枝把搜索空间压缩了很大一部分。这就是弱对偶性在实际工程里的价值——不需要解出精确解先有个边界就能做很多事情。2.3 对偶间隙的直观理解为什么会有对偶间隙因为“先对 $x$ 求最小再对乘子求最大”这个顺序丢失了 $x$ 和乘子之间的联合信息。打个比方你有一堆食材$x$想做一桌菜满足客人需求约束。原问题是同时决定菜谱和采购量确保所有客人都满意且成本最低。对偶问题则是先把食材固定成某种极端做法针对某个固定的乘子找最便宜的菜谱再去调客人的“整体口味”。两个顺序得出的最优成本当然可能不一样。只有当问题满足某些特殊性质时这个间隙才会消失。这就引出强对偶性。3. 强对偶性与KKT条件3.1 Slater条件什么时候对偶间隙为零强对偶性成立最经典的条件是Slater条件原问题是凸优化问题$f$ 和所有 $g_i$ 都是凸函数$h_j$ 是仿射函数并且存在一个可行点 $x$ 使得所有不等式约束严格成立即 $g_i(x) 0$。这个“严格成立”意味着可行域不能退化成边界本身要存在一个内部点。直观理解就是在满足所有约束的前提下你还留了一点“缓冲空间”没有把所有约束都压到极限。Slater条件在机器学习里通常自动满足。比如SVM的软间隔版本只要正则参数 $C 0$就存在可行解让所有间隔约束严格满足。这也是为什么在实际应用中SVM的对偶问题可以放心使用因为它和原问题完全等价强对偶性稳稳成立。3.2 KKT条件最优解的完整刻画当强对偶成立原问题和对偶问题的最优解 $x^$ 和 $(\lambda^, \nu^*)$ 必须满足以下条件1. 原始可行性$$ g_i(x^) \le 0, \quad h_j(x^) 0 $$2. 对偶可行性$$ \lambda_i^* \ge 0 $$3. 梯度为零平稳性$$ \nabla f(x^) \sum_i \lambda_i^\nabla g_i(x^) \sum_j \nu_j^\nabla h_j(x^*) 0 $$4. 互补松弛$$ \lambda_i^* g_i(x^*) 0 $$前三个条件比较好理解分别是可行、乘子符号、以及无约束最优时梯度为零的自然延伸。真正深刻的是第四个条件。它说的是如果某个不等式约束在最优解处没有被激活即 $g_i(x^) 0$那么对应的乘子必须为零反过来如果乘子大于零这个约束必须被激活$g_i(x^) 0$。3.3 互补松弛的直觉稀疏的根源互补松弛在机器学习里意味着“稀疏”或“选择性”。拿SVM来说训练样本对应的约束是 $y_i(w^T x_i b) \ge 1$。最优解中只有那些恰好落在间隔边界上的样本点即 $y_i(w^T x_i b) 1$对应的 $\lambda_i$ 才可能非零。大多数远离边界的样本点约束是松的$\lambda_i 0$它们对模型没有任何贡献。最后起作用的只有少量“支持向量”。这就是SVM名字的由来也是互补松弛最直观的体现。我见过很多初学者在这里卡住为什么SVM只需要用少量样本就能定义决策边界答案就是互补松弛——不活跃的约束在最优解处自动失效模型结构因此变得稀疏。这个性质不只出现在SVM中在带L1正则的线性回归、稀疏字典学习、甚至一些深度学习剪枝方法里都有类似体现。3.4 非凸问题怎么办对偶间隙充当诊断工具深度学习的目标函数几乎都是非凸的强对偶性不成立。所以深度学习的优化很少直接谈对偶问题。但这不是说对偶视角没有用。当你训练一个带约束的深度模型时可以同时维护一个对偶问题并求解。如果某个阶段对偶间隙突然增大说明原问题与对偶问题之间的缺口在扩大这往往对应着训练不稳定、梯度异常、或者约束正在被破坏。这等于免费获得了一个优化健康度的指示器。在最近处理一个带约束图像生成模型时我就在训练循环里同时记录了原始Loss和对偶Loss每当两者差距超过某个阈值就降低学习率重新调整。效果比单纯盯着原始Loss收敛要稳定得多。4. SVM中的对偶魔法核技巧的来源4.1 二分类SVM的原始问题线性可分SVM的原始问题可以写成$$ \min_{w, b} ; \frac{1}{2} |w|^2 $$$$ \text{s.t.} ; y_i(w^T x_i b) \ge 1, \quad i1,...,n $$目标是最小化间隔倒数约束是所有样本正确分类且间隔至少为1。这是一个带不等式约束的凸二次规划问题。直接求解这个问题的困难点在于特征维度可能很高而且样本数量大时直接处理原问题计算量剧增。4.2 构造对偶问题一步一步推导构造拉格朗日函数$$ L(w, b, \lambda) \frac{1}{2}|w|^2 - \sum_{i1}^n \lambda_i \left[ y_i(w^T x_i b) - 1 \right] $$其中 $\lambda_i \ge 0$。先固定 $\lambda$对 $w$ 和 $b$ 求最小。对 $w$ 求导并设为零$$ w \sum_{i1}^n \lambda_i y_i x_i $$对 $b$ 求导并设为零$$ \sum_{i1}^n \lambda_i y_i 0 $$把这两个结果代回拉格朗日函数经过整理得到对偶函数$$ g(\lambda) \sum_{i1}^n \lambda_i - \frac{1}{2} \sum_{i1}^n \sum_{j1}^n \lambda_i \lambda_j y_i y_j x_i^T x_j $$于是对偶问题就是$$ \max_{\lambda} ; \sum_{i1}^n \lambda_i - \frac{1}{2} \sum_{i,j} \lambda_i \lambda_j y_i y_j x_i^T x_j $$$$ \text{s.t.} ; \lambda_i \ge 0, \quad \sum_i \lambda_i y_i 0 $$注意这里 $b$ 在对偶函数里消失了它由KKT条件在得到 $\lambda$ 之后再求出来。4.3 核技巧为什么能成立重点观察对偶问题中的内积项 $x_i^T x_j$。整个对偶问题里样本数据只以内积的形式出现没有任何单独的 $x_i$ 项。这意味着我们可以把原始特征映射到更高维空间甚至无限维空间而不需要显式计算映射后的坐标只要能计算映射后的内积。定义核函数$$ K(x_i, x_j) \langle \phi(x_i), \phi(x_j) \rangle $$把对偶问题里的 $x_i^T x_j$ 替换成 $K(x_i, x_j)$就得到带核技巧的SVM。高斯核、多项式核、以及各种自定义核本质上都是先隐式地做特征映射再在高维空间计算点积。很多人问为什么不能在原问题上直接用核因为原始问题里的 $w$ 在特征空间里是一个向量如果映射到无限维$w$ 根本无法显式表达。而在对偶问题里$w \sum \lambda_i y_i \phi(x_i)$决策函数只依赖对偶变量和核函数值不需要显式计算 $w$。这是对偶形式带来的最大红利。4.4 支持向量的稀疏性再讨论用KKT条件来分析SVM的最优解。根据互补松弛$$ \lambda_i \left[ y_i(w^T x_i b) - 1 \right] 0 $$训练完成后绝大多数 $\lambda_i 0$只有少数样本支持向量的 $\lambda_i 0$。预测新样本时$$ f(x) \sum_{i \in SV} \lambda_i y_i K(x_i, x) b $$求和只需要在支持向量上进行存储和计算成本大幅降低。这也是为什么SVM在中小规模数据集上是效率之王——训练后模型只保留“关键样本”而不是全部训练数据。我在某个图像分类Demo中做过对比实验4000个训练样本最终只留下不到200个支持向量预测速度比用全部样本的基线模型快很多准确率反而更高。这就是对偶优化带来的“免费稀疏性”。5. 从理论到代码对偶问题的数值求解与工程注意5.1 求解路径选择实际求解对偶问题时有两条主流路线。第一条是使用通用凸优化求解器。比如某些成熟的优化库自带SVM对偶问题的高效实现用户只需要提供核矩阵。对于中小规模数据几千样本这条路简单直接。缺点是核矩阵是 $n \times n$ 的存储和计算复杂度都是 $O(n^2)$样本量上万后就非常吃力。第二条是针对SVM对偶问题的专用算法比如SMO序列最小优化思路。SMO的核心聪明之处在于每次只优化两个乘子因为对偶问题里有等式约束 $\sum \lambda_i y_i 0$至少需要两个变量同时变动才能保持约束成立。两个变量的子问题可以直接解析求解不需要任何数值优化器迭代速度极快。当年我复现SMO算法时对照着论文一行行写最容易被忽略的是 $\lambda$ 的上下界裁剪。因为每次更新完 $\lambda$ 后必须投影到 $[0, C]$ 区间内软间隔情况否则算法直接发散。不少初学者在这里栽跟头代码跑出NaN还以为是数据有问题。5.2 数值稳定性核矩阵的脾气径向基核函数 $K(x_i, x_j) \exp(-\gamma |x_i - x_j|^2)$ 在 $\gamma$ 较大的时候核矩阵会非常接近单位矩阵的某种极限形态——所有样本之间几乎不相关模型变成纯记忆泛化能力很差。反过来 $\gamma$ 太小所有样本都高度相似模型变成线性分类器。实际做实验时我建议先用交叉验证搜索 $\gamma$ 的数量级从 $10^{-3}$ 到 $10^3$ 按对数间隔取值。固定C值之后再细调。这个习惯帮我省了很多莫名其妙的时间。另外核矩阵必须保证半正定否则对偶问题不再是凸问题求解器行为不可预测。如果你自定义核函数一定要先验证核矩阵的特征值是否都非负。某次我用了一个看起来合理但并非正定的相似性度量做核函数结果对偶目标值随着迭代不断上升最后直接溢出——检查后才发现是核函数定义出了问题。5.3 松弛变量C的影响软间隔SVM引入松弛变量后约束变成 $y_i(w^T x_i b) \ge 1 - \xi_i$目标函数多了一项 $C \sum \xi_i$。对偶形式里体现为 $\lambda_i$ 的上界$0 \le \lambda_i \le C$。这个上界非常关键。C越大越不允许样本被误分类支持向量数量越多模型越复杂容易过拟合。C越小允许更多间隔违反模型越简单可能欠拟合。调C时有一个经验规律C的值和特征尺度关系很大。如果特征没有归一化不同维度取值范围差异悬殊同一个C在不同数据上效果可能天差地别。所以无论用什么核先做标准化总是没错的。5.4 实测中的调试记录我记录过一次完整的调参过程方便参考。数据集是一个二分类实验600个样本20维特征。初始设置 $\gamma 0.1$C 1训练后验证集准确率只有83%。对偶目标收敛正常但支持向量数量偏多达到全部样本的70%。这通常意味着边界过于复杂。调低 $\gamma$ 到0.01后支持向量占比降到45%准确率来到89%。接着把C降到0.5准确率到91%支持向量降到30%。继续降C到0.1准确率反而掉到88%说明欠拟合了。整个过程不到20分钟但要根据验证曲线做判断不能只盯着训练Loss。6. 对偶思维在深度学习中的隐蔽应用6.1 正则化与约束形式的等价转换L2权重衰减通常直接写成目标函数里的惩罚项$$ \min_w ; \text{Loss}(w) \lambda |w|^2 $$它等价于带约束的原始问题$$ \min_w ; \text{Loss}(w), \quad \text{s.t.} ; |w|^2 \le r $$这里的 $r$ 和 $\lambda$ 有对应关系但不一定是简单反比。约束形式更直观限制权重向量的长度不超过某个半径模型复杂度就被限制住了。对偶变量在这里的含义是“约束的边际价格”——当约束紧绷时对偶变量较大说明这个约束对结果影响很大当约束松弛时对偶变量接近于零。在深度学习训练中如果你发现正则项对应的对偶变量总在零附近说明模型距离约束边界还很远此时加大正则项可能不会有什么效果。反过来如果约束长期紧绷模型可能有较大的容量压力需要调整网络宽度或深度。这个视角能帮你判断一个超参到底起了多大作用。6.2 优化器行为与隐式正则还有一个更隐蔽的应用SGD的隐式正则化。从对偶角度来理解SGD每次只用一个小批量估计梯度等价于在原始目标函数上做随机扰动。这种扰动在某种意义上是把原始问题“松弛”了。模型在泛化能力和拟合能力之间自动取平衡而这个平衡点经常比对偶最优解更远离过拟合边界。有几次我在实际项目中固定了网络结构和数据但换用不同批量大小训练发现大batch在训练集上收敛得更好小batch在验证集上泛化更好。用对偶思维来看小batch的梯度噪声等于隐式扩大了对偶间隙防止模型卡在过拟合的窄区域里。虽然深度学习没有严谨的对偶等价关系但这个视角比玄学解释有可操作性得多。6.3 近端算法与ADMM对偶分解的实际应用ADMM交替方向乘子法是分布式优化的经典方法它直接把原问题拆成多个子问题通过拉格朗日乘子更新来协调解的一致性。在深度学习领域ADMM被用来做模型压缩、联邦学习参数聚合、以及某些带结构约束的优化任务。ADMM的核心更新公式中乘子 $\rho$ 扮演着“惩罚强度”的角色。如果 $\rho$ 设置过小对偶变量更新太慢子问题可能各自为政达不到一致解$\rho$ 设置过大主问题收敛太快但对偶步长太小最终解离原问题最优值很远。我调试ADMM模块时踩过最大的坑就是忽略了 $\rho$ 需要动态调整固定一个值跑到底效果出不来。正确的做法是监控原始残差和对偶残差。原始残差大而对偶残差小说明 $\rho$ 应该增大反之则减小。这就是利用对偶信息反哺原始优化过程的典型案例。6.4 用对偶间隙做早停和超参选择传统早停策略看验证Loss但验证Loss可能因为噪声而抖动。一个更稳的做法是同时维护原问题和对偶问题的目标值。以约束优化为例如果原始目标值在下降但对偶下界长期不涨说明优化可能遇到障碍如果对偶下界在涨原始目标值也在降说明两边都在朝最优靠近训练状态健康。当两条曲线几乎重合且几乎不动时说明已经到最优可以停止迭代。我把这套机制用在某跨平台系统的在线学习模块里每次更新模型后同时计算原始Loss和对偶Loss两者差值超过预设阈值就触发学习率衰减。效果非常直接模型稳定性提高了且没有牺牲最终精度。最后分享两个小技巧第一看论文时如果遇到“对偶函数”“Lagrange乘子”这类术语先别急着跳到公式细节。花几分钟理解原始问题在几何上长什么样、约束是什么再来理解对偶问题。对偶问题永远是对原始问题的一种“价格化”重构每个乘子都对应一个约束的紧松程度。顺着这个思路走任何推导都不会迷路。第二写代码实现对偶算法时最好先把目标函数的梯度和约束矩阵的维度在纸上写清楚。行和列的对应关系搞错跑出来的结果毫无意义。我在一个复现实验中因为把约束矩阵做了转置对偶目标一路飙升到无穷排查了很久才发现是维度不匹配。原始问题和对偶问题这套体系从运筹学的线性规划一路延伸到机器学习的SVM和深度学习的优化器设计是少数几个“学了绝对不亏”的数学工具。希望这一篇能帮你把这块拼图完整地嵌进自己的知识框架里。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →