ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Fenchel共轭函数详解:从几何直觉到对偶理论与近端算子

Fenchel共轭函数详解:从几何直觉到对偶理论与近端算子 如果你在机器学习或者凸优化的文献里泡过一阵子大概率见过这个式子$$f^*(y) \sup_{x \in \operatorname{dom} f} \left( y^T x - f(x) \right)$$很多教材写到这儿就一句“这是 Fenchel 共轭是理解对偶问题的关键。”然后直接跳走。我第一次看到时是懵的这个 sup 到底在干什么为什么后面所有的对偶推导都会冒出来它实际上共轭函数是一个极其朴素的视角转换。给定函数 f我不直接看它每个点的高度而是换一个角度对每个斜率 y一条斜率为 y 的直线比 f 最高能高出多少把这些问题对所有可能的 y 收集起来就得到一个新的函数 f*。看似多绕了一道弯但函数的凸性、可微性、约束边界在这个新视角里反而会变得非常清楚。这篇文章我会从定义和几何直觉入手再拆解几个绕不开的性质然后手把手推导一批高频函数的共轭最后落到拉格朗日对偶、SVM 对偶变量、近端算子这些你真正会用到它的地方。适合被各种对偶推导绕晕、想系统补上这块拼图的读者——不管是在看优化教材还是在啃机器学习论文这篇应该都能帮上忙。1. 共轭函数到底在做什么定义拆解与几何直觉1.1 定义逐项拆解先把定义摆出来。设 $f: \mathbb{R}^n \to \mathbb{R} \cup {\infty}$ 是一个正常函数proper即至少在一个点取有限值它的共轭函数定义为$$f^*(y) \sup_{x \in \operatorname{dom} f} \left( y^T x - f(x) \right)$$我第一次看这个式子的时候最困惑的是两个地方为什么是 sup 而不是 max为什么结果可以取到正无穷先说第二个问题。很多常见函数算出来的共轭就是一个正常数值但有的不是。比如 $f(x) e^x$对任意固定的 y右边那个表达式都有可能随着 x 增大而无界增长这种情况下 $f^*(y) \infty$ 是完全正常的。共轭函数的取值域是扩展实数集这点一定要接受。再说 sup 和 max 的区别。sup 是上确界不要求这个值真的被某个 x 取到。比如 $f(x) 1 - e^{-x}$当 x 趋向正无穷时函数值趋向 1但它永远取不到 1。共轭里的 sup 也是同理很多“最大值”是在无穷远处逼近的我们关心的是那个极限上界本身。逐项看定义里各个部分的作用y 是一个固定的向量你可以把它理解为一条直线或者一个超平面的斜率方向。$y^T x - f(x)$ 表示“斜率为 y 的直线在点 x 处比函数 f 高多少”而 sup 就是在整个定义域上找这个差值最大能到多少。所以一句话概括f*(y) 回答的问题是用斜率为 y 的直线去“盖”函数 f最多能比 f 高出多少。拿最简单的 $f(x) x^2$ 举例。取 y 1那么 $f^*(1) \sup_x (x - x^2)$。这是一个开口向下的抛物线最大值在 $x 1/2$ 处取得算出来是 $1/4$。意思是斜率为 1 的直线 $y x$ 最多比 $x^2$ 高出 0.25。这个数字本身就是共轭函数在 y 1 处的值。1.2 一个帮助很大的几何视角如果你在学优化光看代数定义是不够的我建议建立这样一个几何图像把 f 想成一座山斜率为 y 的直线好比一块无限大的、不能弯曲的木板。$f^(y)$ 就是这块木板在保持斜率不变的情况下最多能比山高出多少。如果这座山在某处太陡任何这个斜率的木板都盖不住它那 $f^(y)$ 就是正无穷。这个图像最漂亮的地方在于凸函数完全由它的支撑平面族决定。什么意思一个凸函数看起来是一堆切平面“包”出来的山上每一个点都有对应的切平面。如果你把所有可能的斜率 y 都试一遍并且记录下每个斜率对应的最低支撑位置你就能把整座山的形状完全重建出来。共轭函数 f* 记录的正是这份“斜率到截距”的映射关系。再进一步双共轭公式$$f(x) \sup_y \left( y^T x - f^*(y) \right)$$这说的是原函数 f 等于一族直线 $y^T x - f^*(y)$ 的上包络。每条直线都是 f 的一条支撑线把它们求上确界山的形状就回来了。这就是“对偶”这个词最直观的数学来源一个凸函数和它的共轭函数包含的信息量完全等价只是编码方式不同——一个用“点坐标”一个用“斜率加截距”。2. 必须吃透的四组核心性质2.1 Fenchel 不等式对偶间隙从哪来从定义出发几乎不用动脑就能得到一个不等式对任意 x 和 y$$f(x) f^*(y) \geq y^T x$$原因很简单$f^*(y)$ 是 $y^T x - f(x)$ 的上确界那它当然不小于任何一个具体的 x 代入的值。这个 Fenchel 不等式就是整个对偶理论里“弱对偶”的化身。什么时候取等答案是当且仅当 y 是 f 在 x 处的一个次梯度记作 $y \in \partial f(x)$。举一个具体例子$f(x) |x|$它在 x 0 处的次梯度是区间 $[-1, 1]$。取 x 0、y 0.5那么 $f(0) f^*(0.5) 0 0 0$而 $y^T x 0$刚好取等同时 0.5 确实属于 $[-1, 1]$。但如果你取 x 2、y 0.5左边 $2 0 2$右边 $1$不等号就是严格的。这个取等条件在做最优性分析时极其有用。KKT 条件、原对偶间隙为零的问题本质上都在说存在一对 (x, y) 让 Fenchel 不等式取等。所以强对偶不是天上掉下来的它对应的是原函数和共轭函数在某处“贴合”在了一起。2.2 凸性、双共轭与非凸松弛第二个重要性质是不管 f 是不是凸函数f* 一定是凸函数。原因是共轭是“一族仿射函数的上确界”而任何一族仿射函数的上确界必然是凸函数。哪怕 f 本身凹凸不平、到处都是局部极小它的共轭也一定是光滑的凸函数。这是共轭一个非常反直觉但很有用的特性。如果 f 本身是 proper、闭、凸函数那双共轭 $f^{}$ 就等于 f。这就是前面说的“信息等价”的严格版本凸函数和它的共轭互相对偶$f \to f^* \to f^{}$ 绕一圈又回到自己。但如果 f 不是凸函数呢这时候 $f^{**}$ 仍然有意义它是 f 的凸闭包——也就是所有不大于 f 的凸函数里最大的那个。这个性质在非凸优化里非常有用很多松弛算法的本质就是把一个非凸问题替换成它的凸闭包来求解。虽然松弛后的问题和原问题不完全等价但在很多场景下凸闭包给出的下界信息已经足够指导搜索方向。2.3 梯度互逆与次梯度对应关系第三个性质是个硬核操作技巧。如果 f 是光滑且严格凸的那么 f* 也光滑并且两者的梯度互为反函数$$y \nabla f(x) \iff x \nabla f^*(y)$$不信你可以拿 $f(x) \frac{1}{2} x^2$ 验证$\nabla f(x) x$而 $f^(y) \frac{1}{2} y^2$$\nabla f^(y) y$确实是互逆。高维版本是 $f(x) \frac{1}{2} x^T Q x$它的共轭是 $\frac{1}{2} y^T Q^{-1} y$梯度关系从 Q 变成了 $Q^{-1}$依然是互逆。这条性质是镜像梯度法Mirror Descent的核心。Mirror Descent 里你会在原空间和对偶空间之间来回切换mirror map 的梯度本质上就是在利用“$\nabla f$ 和 $\nabla f^*$ 互逆”这个事实把梯度信息从一个空间翻译到另一个空间。次梯度版本更一般闭凸函数 f 满足$$y \in \partial f(x) \iff x \in \partial f^*(y)$$这个关系在变分不等式、算子的单调性分析里反复出现。你不用死记只要记住“次梯度和共轭的方向可以互相倒过来”就行推导时从 Fenchel 不等式取等条件两步就能推出来。2.4 常用变换公式速查表实战里经常需要对共轭做各种变换下面几条我建议你直接收藏原函数共轭$g(x) f(x) b$$g^(y) f^(y) - b$$g(x) f(x - a)$$g^(y) f^(y) a^T y$$g(x) a f(x),\ a0$$g^(y) a f^(y/a)$$g(x) f(Ax)$A 可逆$g^(y) f^(A^{-T} y)$这些公式不需要背真忘了就从 sup 定义硬推最多一分钟。比如第二条$g^(y) \sup_x [y^T x - f(x-a)]$令 $u x - a$得到 $\sup_u [y^T(ua) - f(u)] a^T y f^(y)$一步就出来。3. 手把手推导七个高频函数的共轭性质背得再熟不如亲手算几个函数。下面这些例子基本覆盖了机器学习和优化里你能遇到的大部分情况建议拿笔跟推一遍。3.1 线性函数和二次函数最基础的两个先看最简单的线性函数 $f(x) ax b$这里用一维写高维类似。代入定义$$f^*(y) \sup_x \left( x(y - a) - b \right)$$如果 $y \neq a$x 的系数不为零那随着 x 趋向正无穷或负无穷表达式无界共轭取 $\infty$。只有当 $y a$ 时表达式恒等于 $-b$。所以$$f^*(y) \begin{cases} -b y a \ \infty y \neq a \end{cases}$$这个结果有点反直觉一条完整的直线其共轭竟然只在一个点上“活着”。这也说明共轭对“斜率”极其敏感——直线的信息就两个斜率和截距共轭只是换个方式把它们存起来。再看二次型 $f(x) \frac{1}{2} x^T Q x$其中 Q 对称正定。对定义式里的 x 求导并令导数为零$$Qx y \Rightarrow x Q^{-1} y$$代回原式$$f^*(y) y^T Q^{-1} y - \frac{1}{2} y^T Q^{-1} Q Q^{-1} y \frac{1}{2} y^T Q^{-1} y$$一维情况下 Q 1得到 $f^*(y) \frac{1}{2} y^2$和原函数长得一模一样。这就是 L2 正则项对偶形式依然是二次函数的根本原因——二次函数和它的共轭结构相同矩阵从 Q 翻成 $Q^{-1}$ 而已。3.2 绝对值与范数为什么 L1 对偶总能带出盒约束$f(x) |x|$ 是理解 L1 正则对偶的钥匙。代入定义$$f^*(y) \sup_x \left( yx - |x| \right)$$分情况讨论。当 $|y| 1$ 时比如 y 2取 x 为正且趋向无穷$2x - x x$ 趋向正无穷所以共轭为 $\infty$。当 $|y| \le 1$ 时对 x 的正半轴$yx - |x| (y-1)x \le 0$对 x 的负半轴$yx - |x| (y1)x \le 0$。最大值都在 x 0 处取到值为 0。因此$$f^*(y) \begin{cases} 0 |y| \le 1 \ \infty |y| 1 \end{cases}$$这个结果正是指示函数 $I_{[-1,1]}(y)$。直观含义是绝对值函数的斜率只有 ±1 两种如果对偶变量 y 的绝对值超过了 1就相当于要求一条比原函数更陡的支撑线这在凸分析里意味着对偶无界。推广到一般范数 $f(x) |x|$结果是对偶范数单位球的指示函数$$f^(y) \begin{cases} 0 |y|_\le 1 \ \infty |y|_* 1 \end{cases}$$其中 $|y|* \sup{|x| \le 1} y^T x$ 是对偶范数。L1 的对偶范数是 L∞所以 $|x|1$ 的共轭是指示 ${|y|\infty \le 1}$反过来$|x|_\infty$ 的共轭是指示 ${|y|_1 \le 1}$。这就是为什么很多带 L1 正则的问题对偶变量总落在一个盒状约束里不是巧合而是共轭函数定义域直接决定的。3.3 负对数、负熵与 Hinge Loss负对数 $f(x) -\log x$定义域 $x 0$。代入定义$$f^*(y) \sup_{x 0} \left( yx \log x \right)$$先看 y 的取值范围。如果 $y \ge 0$当 x 趋向正无穷时$yx \log x$ 趋向正无穷所以无界共轭为 $\infty$。只有 $y 0$ 时可能有有限值。对 x 求导$$y \frac{1}{x} 0 \Rightarrow x -\frac{1}{y}$$代回$y \cdot (-\frac{1}{y}) \log(-\frac{1}{y}) -1 - \log(-y)$。所以$$f^*(y) -1 - \log(-y), \quad y 0$$这个共轭在 barrier 方法里很常见它的定义域和原函数定义域一样被严格限制在一侧结构非常对称。再看负熵 $f(x) x \log x$定义域 $x \ge 0$约定 $0 \log 0 0$。代入定义$$f^*(y) \sup_{x 0} \left( xy - x \log x \right)$$对 x 求导$y - \log x - 1 0 \Rightarrow x e^{y-1}$。代回$$y e^{y-1} - e^{y-1}(y-1) e^{y-1}$$所以 $f^*(y) e^{y-1}$而且对任意 y 都是有限的。这是上面几个例子里少有的“共轭定义域覆盖全空间”的情况。Sinkhorn 算法和熵正则化里指数函数满天飞根源就在这里——负熵的共轭就是指数函数。最后看机器学习里的老朋友 Hinge Loss$H(z) \max(0, 1-z)$。分三段讨论后结论是$$H^*(u) \begin{cases} u u \in [-1, 0] \ \infty \text{其它} \end{cases}$$直观原因Hinge Loss 在 z 1 一侧斜率是 -1在 z 1 一侧斜率是 0所以它的次梯度只可能落在 $[-1, 0]$ 这个区间里共轭的定义域正是这个区间。分段线性函数的共轭几乎都是“线性函数加指示函数”这个规律非常通用。4. 从对偶到近端算子共轭函数的实战价值如果共轭函数只是为了证明几个不等式它不会这么重要。真正让它大放异彩的地方是对偶理论和近端算法。4.1 拉格朗日对偶的本质就是把约束吸收进共轭考虑一个带等式约束的问题$$\min_x f(x) \quad \text{s.t.} \quad Ax b$$拉格朗日函数是 $L(x, \lambda) f(x) \lambda^T(Ax - b)$。对偶函数是$$g(\lambda) \inf_x L(x, \lambda) \inf_x \left[ f(x) (A^T \lambda)^T x - b^T \lambda \right]$$把与 x 无关的项提出来剩下的是一个 sup$$g(\lambda) -b^T \lambda - \sup_x \left[ (-A^T \lambda)^T x - f(x) \right] -b^T \lambda - f^*(-A^T \lambda)$$你看约束条件消失了。原来需要处理“在一个仿射子空间上最小化 f”现在变成“查一下 f* 在某个点的值”。对偶问题 $\max_\lambda g(\lambda)$ 是一个凹函数最大化而且没有等式约束。Fenchel 不等式在这里直接给出了弱对偶把 $x$ 和 $-A^T\lambda$ 代入不等式$f(x) f^*(-A^T\lambda) \ge -A^T\lambda \cdot x$整理一下就是 $g(\lambda) \le f(x)$。强对偶成立的那些条件Slater 等本质就是在说存在一对 $(x, \lambda)$ 让 Fenchel 不等式取等。所以共轭函数不是对偶理论的一个注脚它就是地基。4.2 SVM 中为什么对偶变量会有盒约束很多人背过软间隔 SVM 的对偶形式知道对偶变量 $\alpha_i$ 落在 $[0, C]$ 里但没想过这个盒约束是哪来的。其实就是共轭函数定义域的直接结果。软间隔 SVM 的目标函数由两部分组成正则项 $\frac{1}{2}|w|^2$ 和损失项 $C \sum_i \max(0, 1 - y_i(w^T x_i b))$。二次项的共轭还是二次这个我们前面算过而 Hinge Loss 的共轭定义域在 $[-1, 0]$这直接限制了对偶变量只能在这个区间里取非零值乘上损失项的系数 C 之后就变成了熟悉的 $0 \le \alpha_i \le C$。对偶形式中权重 w 会被写成样本的线性组合特征只以内积 $x_i^T x_j$ 的形式出现。一旦只有内积你就能把它替换成核函数 $k(x_i, x_j)$完成从线性到非线性的跳跃。很多教材直接把核技巧丢出来其实它只是对偶推导的自然副产品——如果你自己去推一遍会发现根本没有“要不要用核”这个选项内积结构会自动蹦出来。这里给你一个经验法则如果一个对偶问题里出现了盒约束、球约束、锥约束不用死记去算目标函数里非线性函数的共轭定义域答案往往就在那里。4.3 Moreau 分解软阈值算子的另一半近端算子定义是$$\operatorname{prox}_g(x) \arg\min_z \left[ g(z) \frac{1}{2}|z - x|^2 \right]$$Moreau 分解是一个非常漂亮的恒等式对闭凸函数 g$$x \operatorname{prox}g(x) \operatorname{prox}{g^*}(x)$$意思是在“原始正则项”下做一次近端和在“共轭正则项”下做一次近端两者结果加起来刚好等于输入 x。拿 $g(x) |x|$ 验证一下。它的共轭是 $I_{[-1,1]}(y)$也就是闭区间 $[-1,1]$ 的指示函数。$|x|$ 的近端算子是软阈值$\operatorname{soft}(x, 1) \operatorname{sign}(x)\max(|x|-1, 0)$指示函数的近端算子则是投影到区间$\operatorname{clip}(x, -1, 1)$。于是 Moreau 分解变成$$x \operatorname{soft}(x, 1) \operatorname{clip}(x, -1, 1)$$拿数字验证x 2 时右边是 $1 1 2$x 0.5 时右边是 $0 0.5 0.5$。完全正确。一个连续的收缩算子和一个截断投影算子看起来毫无关系却被共轭函数绑在了一起。这个视角对理解 Lasso 的求解很关键。为什么软阈值会出现因为 L1 正则的共轭是一个盒子的指示函数而盒子上做近端就是投影软阈值和投影互为 Moreau 分解的两半。下次你遇到一个新正则项如果它的近端算子不好算试试先算它的共轭再去看共轭的近端——这往往是突破口。4.4 共轭函数在更多方向上的身影共轭函数不是只活在优化教材里它在很多热门方向中出现只是很多人没意识到。Wasserstein 距离的对偶形式里约束条件是一个 Lipschitz 球本质上又是对偶范数球的指示函数在起作用。你看到的 $W_1$ 对偶形式 $\sup_{|f|_L \le 1} (\int f d\mu - \int f d\nu)$那个 Lipschitz 约束和共轭函数对偶范数的关系非常紧密。Sinkhorn 算法里对偶变量的更新会出现指数函数这是因为熵正则项的共轭是指数函数。行归一化、列归一化这些交替更新其实就是在利用“负熵的共轭 指数函数”这个解析性质把约束投影变得可以逐元素计算。Mirror Descent 里mirror map 的梯度在原空间和对偶空间之间切换靠的也是 2.3 节说的“原函数梯度与共轭梯度互逆”的性质。同一个工具在优化、最优传输、在线学习里换着马甲出现值得你花功夫把它真正吃透。5. 常见误区与排错经验5.1 我踩过的六个概念坑第一个坑是以为共轭函数要求可微。完全不是。Fenchel 共轭只需要函数是 proper 的分段线性函数、指示函数这些完全不光滑的函数都能定义共轭而且算起来往往更简单。光滑性是共轭的结果不是前提。第二个坑是忽略定义域。$f^*$ 完全可以取 $\infty$而且定义域本身就是关键信息。比如绝对值函数的共轭定义域是 $[-1,1]$Hinge Loss 的共轭定义域是 $[-1,0]$这些边界直接决定了对偶变量的活动范围。每次算完共轭先标出定义域别只看函数表达式。第三个坑是混淆 Fenchel 共轭和 Legendre 变换。Legendre 变换要求函数严格凸且可微而 Fenchel 共轭是它的推广用 sup 代替了求导避开了光滑性限制。你仔细看定义会发现光滑场景下两者算出来的结果一致但适用范围完全不同。第四个坑是仿射变换公式记错。2.4 节那几条公式建议你现场从 sup 定义推一遍而不是硬背。我见过不少人把 $f(Ax)$ 的共轭写成 $f^*(A y)$这差了不止一点。现场推导最多一分钟但能避免一整类错误。第五个坑是以为光滑性会被共轭保留。$|x|$ 的共轭是指示函数 $I_{[-1,1]}(y)$在区间内部恒为 0但边界处直接跳到 $\infty$根本不光滑。反过来分段线性函数的共轭也大多不光滑。第六个坑是混淆 sup 和 max。共轭定义里必须用 sup因为很多情况下最大值取不到可能是在边界逼近也可能是无界。如果你在推导中写成 max 并且默认最大值存在很容易忽略定义域边界的情况。5.2 用数值验证代替死记硬背我自己学习时有一个习惯每算一个共轭就写几行代码数值验证一下确认理论推导没错。这个方法对一维问题特别有效比如验证 $f(x) x \log x$ 的共轭是 $e^{y-1}$可以直接在网格上暴力计算 supimport numpy as np x np.linspace(0.001, 20, 200000) f lambda t: t * np.log(t) y 2.0 numeric np.max(y * x - f(x)) exact np.exp(y - 1) print(fnumeric {numeric:.6f}) print(fexact {exact:.6f})我跑出来的结果两个值在小数点后好几位都一致。这个方法虽然不是严格证明但作为自查手段特别有效能快速帮你发现公式里正负号、定义域这些低级错误。高维情况下不能直接画网格但你可以用随机点采样去判断 sup 是否无界或者用一个小规模的优化问题去反推对偶函数的形状。原则是一样的用数值结果给你建立直觉再用理论推导去确认。5.3 算不出来时的排查思路如果遇到一个陌生函数的共轭一时算不出来我一般按这个顺序排查第一步先写清楚定义域。限制定义域的函数比如 $\log$、$\sqrt{}$、倒数定义域直接给共轭划定了边界很多问题在写定义域这一步就已经暴露了。第二步假设函数可微直接解 $y \nabla f(x)$找到候选的驻点 $x^*$然后代回去算值。绝大多数教科书里的共轭都是这么算出来的。第三步如果驻点解不出来或者不在定义域内就去检查边界和无穷远处的行为看看是不是无界。如果无界那这个 y 就是共轭定义域外面的点$f^*(y) \infty$。第四步如果 f 是几项函数的和别硬算先去查有没有现成公式。两个函数的下卷积对应的共轭等于各自共轭的和这个关系能化简很多复杂表达式。说点我自己的体会。我真正建立对共轭函数的感觉是在把一堆常见函数的共轭亲手算完之后。算到第三四个你自然会发现盒约束、指示函数、定义域这些概念全都能从共轭里读出来。建议你在读任何对偶推导时先把目标函数拆成单个函数的共轭再拼回去整个过程会比倒着看书轻松很多。希望这篇能帮你少走一点弯路。
返回列表