拉格朗日法用得不多,但需要深入理解,方便学习另一种使用很广的算法。
前面我们讲到,所有的方法都是在解一个非线性的 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∗。
拉格朗日法的本质是用梯度下降法解鞍点。
其实算法后的思想才是值得深究的,很多问题我们一开始解不出来,我们就可以求等价问题或者迭代去求,这些都是很有价值的想法。