【优化】共轭函数(Conjugate Function)超简说明

共轭函数是最优化问题中非常重要的概念,常用来在原问题和对偶问题之间进行转换。
本文从便于理解的角度对其进行介绍,并推导常见例子。
本文主要参考S. Boyd and L. Vandenberghe, Convex Optimization中3.3节。

定义

对于原函数 f ( x ) , x ∈ D f(x),x\in D f(x),xD,其共轭函数为:
f ∗ ( y ) = sup ⁡ x ∈ D ( < y , x > − f ( x ) ) f^*(y)=\sup_{x\in D} (<y,x>-f(x)) f(y)=xDsup(<y,x>f(x))

其中, < y , x > <y,x> <y,x>表示两个变量的内积

  • 对于标量: < y , x > = y ⋅ x <y,x>=y\cdot x <y,x>=yx
  • 对于向量: < y , x > = y T x <y,x>=y^Tx <y,x>=yTx
  • 对于 n × n n\times n n×n对称矩阵: < y , x > = tr ( y x ) <y,x>=\textbf{tr} (yx) <y,x>=tr(yx)

特别注意,共轭函数的定义域要求对 x ∈ D x\in D xD < y , x > − f ( x ) <y,x>-f(x) <y,x>f(x)有上界。即, f ∗ ( y ) f^*(y) f(y)不能为无穷大。

物理意义

对于共轭函数的每一个自变量 y = y ˉ y=\bar{y} y=yˉ,其取值相当于一条直线与原函数之差的最大值:
f ∗ ( y ˉ ) = sup ⁡ x ∈ D ( l ( x ) − f ( x ) ) f^*(\bar y)=\sup_{x\in D}(l(x)-f(x)) f(yˉ)=xDsup(l(x)f(x))
这条直线 l ( x ) = < y ˉ , x > l(x)=<\bar y,x> l(x)=<yˉ,x>,其斜率由 y ˉ \bar y yˉ决定。
这里写图片描述

两条曲线之差随着 x x x变化,其最大值可以对 x x x求导得到:
∂ ( < y , x > − f ( x ) ) ∂ x = 0 ⇒ f ′ ( x ) = y \frac{\partial(<y,x>-f(x))}{\partial x}=0 \Rightarrow f'(x)=y x(<y,x>f(x))=0f(x)=y
即:曲线斜率与直线斜率相同处的 x x x,能够得到最大值。
f ∗ ( y ˉ ) = < y ˉ , x ˉ > − f ( x ˉ ) , s u b j e c t   t o   f ( x ˉ ) = y ˉ f^*(\bar y)=<\bar y, \bar x>-f(\bar x), subject\ to\ f(\bar x)=\bar y f(yˉ)=<yˉ,xˉ>f(xˉ),subject to f(xˉ)=yˉ
这里写图片描述

举例

Negative entropy

原函数: f ( x ) = x log ⁡ x , x > 0 f(x)=x\log x, x>0 f(x)=xlogx,x>0

原函数为增函数。
对于 y < 0 y<0 y<0 l ( x ) l(x) l(x)为减函数。则 l ( x ) − f ( x ) l(x)-f(x) l(x)f(x)为减函数,不超过其在零点取值。
对于 y ≥ 0 y\geq 0 y0 l ( x ) l(x) l(x)也是增函数
lim ⁡ x → ∞ l ( x ) / f ( x ) = lim ⁡ x → ∞ l ′ ( x ) / f ′ ( x ) = lim ⁡ x → ∞ y / ( log ⁡ x + x ) = 0 \lim_{x\to \infty} l(x)/f(x)=\lim_{x \to \infty} l'(x)/f'(x)=\lim_{x\to \infty} y/(\log x + x)=0 xliml(x)/f(x)=xliml(x)/f(x)=xlimy/(logx+x)=0

l ( x ) l(x) l(x)增速小于 f ( x ) f(x) f(x)增速,故其差有界。

故, f ∗ ( y ) f^*(y) f(y)的定义域为 y ∈ R y\in R yR

找到最大值处 x x x的表达式:
x y − x log ⁡ x ∂ x = 0 ⇒ x = e y − 1 \frac{xy - x\log x}{\partial x}=0 \Rightarrow x=e^{y-1} xxyxlogx=0x=ey1
代入共轭函数:
f ∗ ( y ) = y ⋅ e y − 1 − e y − 1 ( y − 1 ) = e y − 1 f^*(y)=y\cdot e^{y-1}-e^{y-1}(y-1)=e^{y-1} f(y)=yey1ey1(y1)=ey1

以下是两种MATLAB编写的最优化共轭梯度法的代码: 1. 使用黄金分割法精确一维搜索的最优化共轭梯度法代码: ```matlab function [x, fval] = conjugate_gradient_golden(x0, epsilon) % 初始化 x = x0; fval = objective_function(x); grad = gradient(x); d = -grad; % 迭代 while norm(grad) > epsilon alpha = golden_section_search(x, d); x = x + alpha * d; grad_new = gradient(x); beta = norm(grad_new)^2 / norm(grad)^2; d = -grad_new + beta * d; grad = grad_new; fval = objective_function(x); end end function fval = objective_function(x) % 目标函数 fval = x(1)^2 + 2 * x(2)^2; end function grad = gradient(x) % 数值微分法计算梯度 h = 1e-6; grad = zeros(size(x)); for i = 1:length(x) x_plus_h = x; x_plus_h(i) = x_plus_h(i) + h; grad(i) = (objective_function(x_plus_h) - objective_function(x)) / h; end end function alpha = golden_section_search(x, d) % 黄金分割法精确一维搜索 a = 0; b = 1; rho = 0.618; epsilon = 1e-6; while abs(b - a) > epsilon x1 = a + (1 - rho) * (b - a); x2 = a + rho * (b - a); f1 = objective_function(x + x1 * d); f2 = objective_function(x + x2 * d); if f1 < f2 b = x2; else a = x1; end end alpha = (a + b) / 2; end ``` 2. 使用Wolfe-Powell非精确一维搜索的最优化共轭梯度法代码: ```matlab function [x, fval] = conjugate_gradient_wolfe_powell(x0, epsilon) % 初始化 x = x0; fval = objective_function(x); grad = gradient(x); d = -grad; % 迭代 while norm(grad) > epsilon alpha = wolfe_powell_search(x, d); x = x + alpha * d; grad_new = gradient(x); beta = norm(grad_new)^2 / norm(grad)^2; d = -grad_new + beta * d; grad = grad_new; fval = objective_function(x); end end function fval = objective_function(x) % 目标函数 fval = x(1)^2 + 2 * x(2)^2; end function grad = gradient(x) % 数值微分法计算梯度 h = 1e-6; grad = zeros(size(x)); for i = 1:length(x) x_plus_h = x; x_plus_h(i) = x_plus_h(i) + h; grad(i) = (objective_function(x_plus_h) - objective_function(x)) / h; end end function alpha = wolfe_powell_search(x, d) % Wolfe-Powell非精确一维搜索 alpha = 1; c1 = 0.1; c2 = 0.9; rho = 0.618; epsilon = 1e-6; while true f0 = objective_function(x); g0 = gradient(x); f1 = objective_function(x + alpha * d); if f1 > f0 + c1 * alpha * g0' * d || (f1 >= objective_function(x + alpha * d) && alpha < epsilon) alpha = zoom(x, d, alpha); break; end g1 = gradient(x + alpha * d); if abs(g1' * d) <= -c2 * g0' * d break; end if g1' * d >= 0 alpha = zoom(x, d, alpha); break; end alpha = rho * alpha; end end function alpha = zoom(x, d, alpha_lo) % Wolfe-Powell非精确一维搜索中的zoom函数 alpha_hi = alpha_lo * 2; c1 = 0.1; c2 = 0.9; epsilon = 1e-6; while true alpha = (alpha_lo + alpha_hi) / 2; f0 = objective_function(x); g0 = gradient(x); f1 = objective_function(x + alpha * d); if f1 > f0 + c1 * alpha * g0' * d || f1 >= objective_function(x + alpha * d) alpha_hi = alpha; else g1 = gradient(x + alpha * d); if abs(g1' * d) <= -c2 * g0' * d break; end if g1' * d * (alpha_hi - alpha_lo) >= 0 alpha_hi = alpha_lo; end alpha_lo = alpha; end if abs(alpha_hi - alpha_lo) < epsilon break; end end end ```
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值