凸优化学习
拉格朗日法用得不多,但需要深入理解,方便学习另一种使用很广的算法。
学习笔记
一、拉格朗日法( lagrangian method \text{lagrangian method} lagrangian method)
前面我们讲到,所有的方法都是在解一个非线性的
KKT
\text{KKT}
KKT条件,一般问题形如:
min
f
(
x
)
s.t.
A
x
−
b
=
0
\begin{aligned} \min&& f(x)&\\ \text{s.t.} &&\textbf Ax-b&=0 \end{aligned}
mins.t.f(x)Ax−b=0
KKT
\text{KKT}
KKT条件为:
{
A
x
∗
−
b
=
0
∇
f
(
x
∗
)
+
A
T
∑
i
=
1
p
v
i
∗
=
∇
f
(
x
∗
)
+
A
T
v
∗
=
0
\begin{cases} \textbf Ax^*-b=0\\ \nabla f(x^*)+\textbf A^T \sum\limits_{i=1}^pv^*_i=\nabla f(x^*)+\textbf A^T v^*=0 \end{cases}
⎩⎨⎧Ax∗−b=0∇f(x∗)+ATi=1∑pvi∗=∇f(x∗)+ATv∗=0
前面说过,解这么个非线性方程组实在是太难了,牛顿法用二阶泰勒展开构造了一个等价问题,那拉格朗日法其实也是一样的,我们用迭代的方式把
x
∗
,
v
∗
x^*,v^*
x∗,v∗即原问题和对偶问题的最优解解出来:
x
k
+
1
=
x
k
−
α
k
(
∇
f
(
x
k
)
+
A
T
v
k
)
v
k
+
1
=
v
k
+
α
k
(
A
x
k
−
b
)
\begin{aligned} x^{k+1}&=x^k-\alpha^k\big(\nabla f(x^k)+\textbf A^T v^k\big)\\ v^{k+1}&=v^k+\alpha^k(\textbf A x^k-b) \end{aligned}
xk+1vk+1=xk−αk(∇f(xk)+ATvk)=vk+αk(Axk−b)
其中,
α
\alpha
α一般为一个递增序列。
这什么意思?你可以看看当 x k , v k x^k,v^k xk,vk不更新时,即 x k + 1 = x k , v k + 1 = v k x^{k+1}=x^k,v^{k+1}=v^k xk+1=xk,vk+1=vk在什么条件下成立?不就是 KKT \text{KKT} KKT条件吗?这样我们就得到了当 KKT \text{KKT} KKT条件成立时的 x ∗ , v ∗ x^*,v^* x∗,v∗。
二、拉格朗日法的推导
对于问题:
min
f
(
x
)
s.t.
A
x
−
b
=
0
\begin{aligned} \min&& f(x)&\\ \text{s.t.} &&\textbf Ax-b&=0 \end{aligned}
mins.t.f(x)Ax−b=0
其拉格朗日函数为:
l
(
x
,
v
)
=
f
(
x
)
+
v
T
(
A
x
−
b
)
l(x,v)=f(x)+v^T(\textbf Ax-b)
l(x,v)=f(x)+vT(Ax−b)
在之前我们讲鞍点的时候提到过:
d
∗
=
g
(
v
∗
)
=
sup
v
inf
x
∈
D
l
(
x
,
v
)
p
∗
=
f
(
x
∗
)
=
inf
x
∈
D
sup
v
l
(
x
,
v
)
d^*=g(v^*)=\sup_v\inf_{x\in D}l(x,v)\\ p^*=f(x^*)=\inf_{x\in D}\sup_v l(x,v)
d∗=g(v∗)=vsupx∈Dinfl(x,v)p∗=f(x∗)=x∈Dinfvsupl(x,v)
分析一下上面两个式子,不难得到:
v
∗
=
arg
sup
v
l
(
x
∗
,
v
)
x
∗
=
arg
inf
x
∈
D
l
(
x
,
v
∗
)
v^*=\arg\sup_{v}l(x^*,v)\\ x^*=\arg\inf_{x\in D}l(x,v^*)
v∗=argvsupl(x∗,v)x∗=argx∈Dinfl(x,v∗)
这是一个很好的性质,这说明了当
x
∗
,
v
∗
x^*,v^*
x∗,v∗我们知道一个就可以解出来另外一个,但是一开始我们哪个都不知道啊,这不是死锁了么。。。
其实一开始得不到最优解是很正常的,我们可以分步求解,最妙的是这里有两条性质,我们可以稍作改动把它改成迭代的(有种左脚右脚轮着踩飞上天的感觉)。
首先我们分析一下,要求
x
∗
x^*
x∗,怎么求?一步到位又不行,那就梯度下降法,拉格朗日函数对
x
x
x的一阶偏导为:
∇
f
(
x
)
+
A
T
v
∗
\nabla f(x)+\textbf A^Tv^*
∇f(x)+ATv∗
这样我们就求出了方向,那么可以得到:
x
k
+
1
=
x
k
−
α
k
(
∇
f
(
x
k
)
+
A
T
v
∗
)
x^{k+1}=x^k-\alpha^k\big(\nabla f(x^k)+\textbf A^T v^*\big)
xk+1=xk−αk(∇f(xk)+ATv∗)
但是这里有个问题,
v
∗
v^*
v∗我们不知道啊!那么巧妙的就来了,我们解
v
∗
v^*
v∗也是分步迭代求的,同理可得:
v
k
+
1
=
v
k
+
α
k
(
A
x
∗
−
b
)
v^{k+1}=v^k+\alpha^k(\textbf A x^*-b)
vk+1=vk+αk(Ax∗−b)
这么一看
x
∗
x^*
x∗不是也不知道吗?这里就是拉格朗日法的核心思想了,即将
x
∗
,
v
∗
x^*,v^*
x∗,v∗换成
x
k
,
v
k
x^k,v^k
xk,vk:
x
k
+
1
=
x
k
−
α
k
(
∇
f
(
x
k
)
+
A
T
v
k
)
v
k
+
1
=
v
k
+
α
k
(
A
x
k
−
b
)
\begin{aligned} x^{k+1}&=x^k-\alpha^k\big(\nabla f(x^k)+\textbf A^T v^k\big)\\ v^{k+1}&=v^k+\alpha^k(\textbf A x^k-b) \end{aligned}
xk+1vk+1=xk−αk(∇f(xk)+ATvk)=vk+αk(Axk−b)
意思就是由于我们并不能一下解出
x
∗
,
v
∗
x^*,v^*
x∗,v∗,那么我们就采用迭代的方法(梯度下降法),在每一步的时候我们都要得到一个
x
k
+
1
,
v
k
+
1
x^{k+1},v^{k+1}
xk+1,vk+1,为了得到
x
k
+
1
,
v
k
+
1
x^{k+1},v^{k+1}
xk+1,vk+1,我们用
x
k
,
v
k
x^{k},v^{k}
xk,vk替换
x
∗
,
v
∗
x^{*},v^{*}
x∗,v∗,这样当然是不准确的,是有损失的。但是随着迭代的进行,
x
k
,
v
k
x^{k},v^{k}
xk,vk终将逼近
x
∗
,
v
∗
x^{*},v^{*}
x∗,v∗,那么我们得到的
x
k
+
1
,
v
k
+
1
x^{k+1},v^{k+1}
xk+1,vk+1也将逼近
x
∗
,
v
∗
x^{*},v^{*}
x∗,v∗。
拉格朗日法的本质是用梯度下降法解鞍点。
个人思考
其实算法后的思想才是值得深究的,很多问题我们一开始解不出来,我们就可以求等价问题或者迭代去求,这些都是很有价值的想法。
纸质笔记