最近看论文里面有好多凸优化、对偶函数、KKT什么的,太顶了,看不下去,就先补一补这方面的知识。
凸优化其实是一个比较大的问题,看了半天也是一知半解,只能理解大概的原理和意义,这里就先记录一下,后面有更深的理解再补充。
我们知道所谓优化就是要去找全局最优解,凸优化是什么,凸优化中的全局最优解怎么找,我们首先从一般的优化问题开始理解。
优化问题的基本形式
minimize f 0 f_0 f0(w),(w∈ R n R^n Rn)
subject to f i f_i fi(w)≤0,(i=1,…,m); h j h_j hj(w)=0,(j=1,…,p)
以上式子为普通的优化问题的基本形式,其中优化变量为w∈
R
n
R^n
Rn,不等式约束为
f
i
f_i
fi(w)≤0,等式约束为
h
j
h_j
hj(w)=0。特殊情况:当m=p=0时,就变成了无约束优化问题。
相关概念:
定义域:优化问题
f
0
f_0
f0(w)的定义域D就是
f
i
f_i
fi(w)和
h
j
h_j
hj(x)定义域的交集: D = dom
f
i
f_i
fi∩dom
h
j
h_j
hj
可行点(解):若w∈D,且满足约束条件,那么x就是可行点
可行域:所有可行点的集合
最优化值:
p
∗
p^*
p∗=inf{
f
0
f_0
f0(w)|
f
i
f_i
fi(w)≤0, i=1,…,m,
h
j
h_j
hj(w)=0, j=1,…,p}
最优化值就是优化问题
f
0
f_0
f0(x)在满足约束条件时,所有函数值的下确界。
最优化解:
p
∗
p^*
p∗=
f
0
f_0
f0(
w
∗
w^*
w∗)
最优化解就是函数值为
p
∗
p^*
p∗时x的取值
w
∗
w^*
w∗。
凸优化问题的基本形式
说完了优化问题的基本形式,那凸优化问题又是怎么样的呢?首先,表达式上是一样的,都是
minimize f 0 f_0 f0(w),(w∈ R n R^n Rn)
subject to f i f_i fi(w)≤0,(i=1,…,m); h j h_j hj(w)=0,(j=1,…,p)
不同之处在于,只有当
f
i
f_i
fi(w)是凸函数,
h
j
h_j
hj(w)是仿射函数时,普通的优化问题才变为凸优化问题。
这种定义有什么好处呢?当然有,只要在于
一、可行域是凸集
二、局部最优解即为全局最优解
诶,全局最优解不就是我们优化问题的目标吗?所以说,凸优化问题不用担心陷入局部最优解的情况。
问题的转化
在凸优化中,当目标函数本身比较复杂时,常将目标函数通过拉格朗日函数转换为其对偶问题进行求解,这样能够更高效地得到最优化值。这个转换的过程是怎样的呢?我们接着看下面的例子。
下面是一个一般的优化问题
P
0
P_0
P0(
f
i
f_i
fi(w)不用是凸函数,
h
j
h_j
hj(w)也不用是仿射函数)
minimize f f f(w), (w∈ R n R^n Rn)
subject to g i g_i gi(w)≤0, (i=1,…,m); h j h_j hj(w)=0, (j=1,…,p)
假设
P
0
P_0
P0的最优解为
p
∗
p^*
p∗
通过拉格朗日乘子法将问题
P
0
P_0
P0转换为
其中λ=[
λ
1
λ_1
λ1,…,
λ
m
λ_m
λm] ,且∀i,
λ
i
λ_i
λi≥0。v=[
v
1
v_1
v1,…,
v
p
v_p
vp]。
根据定义我们知道
h
j
h_j
hj(w)=0,
g
i
g_i
gi(w)≤0,所以实际上,L(w,λ,v)是关于λ的仿射函数。
再加上现在
λ
i
λ_i
λi≥0,则对于w的任意可行解都有L(w,λ,v) ≤ f(w)
回到问题
P
0
P_0
P0本身,这个优化问题的目的是找全局最优解,也就是f(w)最小值,而我们此时其实可以把问题转换成求L(w,λ,v) 的下确界(因为L(w,λ,v) ≤ f(w),所以min f(w) ≥ inf L(w,λ,v),也就可以通过L(w,λ,v) 的下确界来逼近求解f(w)的最小值)
对偶函数
而拉格朗日函数L(w,λ,v)的下确界就是拉格朗日对偶函数,简称为“对偶函数”,表示为:
g(λ,v) = inf L(w,λ,v) ≤ min f(w) =
p
∗
p^*
p∗
由L(w,λ,v)的表达式可知 g(λ,v) 关于拉格朗日乘子λ,v是线性的(因此是凹的),而inf函数是保凹的。所以即使原问题
P
0
P_0
P0不是凸的(我们这里讨论的例子只是一般的优化问题),其对偶函数g(λ,v)也是凹的。
注意了,g(λ,v)是凹的,那么只要加个负号,也就是-g(λ,v),就可以变成一个凸函数!这样我们就可以把一个一般的优化问题转化为一个凸函数求极值问题!
对偶问题
求解下确界可以定义为求解以下问题,记为
D
0
D_0
D0
实际上
D
0
D_0
D0就是原始问题
P
0
P_0
P0的对偶问题,其最优解记为
d
∗
d^*
d∗。由之前的推导可知,
d
∗
d^*
d∗ ≤
p
∗
p^*
p∗,此时称
D
0
D_0
D0为
P
0
P_0
P0的弱对偶问题(只能通过
D
0
D_0
D0的最优化解去逼近
P
0
P_0
P0的最优化解),而当
d
∗
d^*
d∗ =
p
∗
p^*
p∗时,就称
D
0
D_0
D0为
P
0
P_0
P0的强对偶问题(此时
D
0
D_0
D0的最优化解就是
P
0
P_0
P0的最优化解)。什么时候
d
∗
d^*
d∗ =
p
∗
p^*
p∗呢?继续看下面的推导
上面的推导其实就是我们上面论述的过程,我们发现,如果要使强对偶条件成立,那么后面两行的“≤”必须变成“=”。
先考虑最后一个式子要取等号,那么
λ
i
∗
λ_i^*
λi∗
f
i
f_i
fi
(
x
∗
)
(x^*)
(x∗)就必须为0
而倒数第二个式子要取等号,就需要
x
∗
x^*
x∗是第二行式子的驻点(
x
∗
x^*
x∗代入该式子导数为0)
把这些式子罗列到一起就是著名的KKT条件。
总结
在实际处理中,当原始问题
P
0
P_0
P0难以求解时,可以把问题转换为对其对偶问题
D
0
D_0
D0进行求解。求解的过程分为三步:
Step1: 写出拉格朗日函数L(w,λ,v);
Step2: 求解拉格朗日函数关于变量w的最小值 g(λ,v) = inf L(w,λ,v);
Step3: 求解g(λ,v)关于变量λ,v的最大值。
问题转化带来的好处
通过对偶转化将优化变量的维度由样本点的采样维度d转为样本个数m(由于为满足KKT条件使得有效样本数进一步减小,最终模型中只保留支持向量)。这样做可以使得对问题的求解直接面向样本/向量,带来的好处有:
1、即使原问题不是凸函数,其拉格朗日对偶函数也一定是凹函数,保障局部最优等于全局最优(在无约束的情况下),从而能够运用梯度型算法迅速得到全局最优解;
2、可以有效避免"维度灾难"(但当样本数较大时,对算力要求也较高);
3、可以通过引入核函数,使得样本线性可分;
4、可以更好地与分布式并行算法结合:因为数据的分布式更加直观且常见,数据并行模型是分布式机器学习中最常用的模型(相比于模型并行模式、计算并行模式)[2],一种直观的想法可以将样本存储在不同的计算机中,计算机 k优化与其样本 {
X
p
X_p
Xp,
X
p
+
1
X_{p+1}
Xp+1,…,
X
q
X_q
Xq} 对应的参数 {
a
p
a_p
ap,
a
p
+
1
a_{p+1}
ap+1,…,
a
q
a_q
aq} ,最后以某种方式将各个计算机得到的优化参数聚合在一起。
参考
凸优化中的对偶问题与共轭函数
七月在线–半小时梳理凸优化
对偶函数求解(一)
凸优化——详解原函数的对偶函数、对偶问题和共轭函数之间的关系(我尽力了)