凸差算法(DC Algorithm)
一、基本概念
1.1凸差問題
爲了解決非凸規劃問題,1975年引入,一般形式如下:
i n f { f ( x ) = g ( x ) − h ( x ) , x ∈ R n }
inf\{f(x)=g(x)-h(x),x\in \mathbb R^n\}
i n f { f ( x ) = g ( x ) − h ( x ) , x ∈ R n }
其對偶形式爲:
i n f { f ∗ ( y ) = h ∗ ( y ) − g ∗ ( y ) : y ∈ R n }
inf\{f^*(y)=h^*(y)-g^*(y):y \in \mathbb R^n\}
i n f { f ∗ ( y ) = h ∗ ( y ) − g ∗ ( y ) : y ∈ R n }
1.2共軛函數(conjugate function)
這個概念和複數的共軛沒有一點關係,事實上從牛津詞典上conjugate一詞只是表示(動詞)的變化形式,數學維基百科 裏也有四種共軛函數的形式,第四種纔是凸分析中的共軛函數。函數f : X → R f:X\rightarrow R f : X → R 的共軛函數爲
g ∗ ( y ) = s u p x ∈ X { < x , y > − f ( x ) }
g^*(y)=\mathop{sup}\limits_{x\in X}\{<x,y>-f(x)\}
g ∗ ( y ) = x ∈ X s u p { < x , y > − f ( x ) }
共軛函數的自變量變成了y y y ,x x x 變成了它的一個參數。它有一個很好的性質:一定是凸函數,甚至是多面凸函數(下面將講到什麼是多面凸函數 )。因爲它是一系列關於y y y 的仿射函數(線性函數)中取的最大值,所以斜率肯定是分段增大的,可以從下面這張圖很清晰地看出這一點。另一方面也可以直接對y y y 求導。
這個共軛函數通過對x x x 求導 並令其等於0可以求出確切解,想進一步瞭解的可以閱讀參考文獻[1] 中的3.3節,或者它的譯著參考文獻[3] 。
1.3次微分(subdifferntial)和次梯度(subgradient)
函數φ \varphi φ 在點x 0 x_0 x 0 處的次梯度定義如下:
∂ φ ( x 0 ) : = { y 0 ∈ R n : φ ( x ) ≥ φ ( x 0 ) + < x − x 0 , y 0 > , ∀ x ∈ R n }
\partial \varphi(x_0):=\{y_0 \in \mathbb{R}^n:\varphi(x)\geq \varphi(x_0)+<x-x_0,y_0>,\forall x \in \mathbb{R}^n\}
∂ φ ( x 0 ) : = { y 0 ∈ R n : φ ( x ) ≥ φ ( x 0 ) + < x − x 0 , y 0 > , ∀ x ∈ R n }
一般來說,次梯度是閉凸集,是導數概念在凸函數上的擴展。次微分中的一個元素y 0 ∈ ∂ φ ( x 0 ) y_0 \in \partial \varphi(x_0) y 0 ∈ ∂ φ ( x 0 ) 稱作函數φ \varphi φ 在點x 0 x_0 x 0 處的次梯度。當且僅當函數φ \varphi φ 在x 0 x_0 x 0 處可微,那麼閉集∂ φ ( x 0 ) \partial \varphi(x_0) ∂ φ ( x 0 ) 變爲導數{ ∇ φ ( x 0 ) } \{\nabla \varphi(x_0)\} { ∇ φ ( x 0 ) } 。
比如,絕對值函數φ ( x ) = ∣ x ∣ \varphi(x)=|x| φ ( x ) = ∣ x ∣ :x < 0 x<0 x < 0 時,∂ φ ( x ) = − 1 \partial \varphi(x)=-1 ∂ φ ( x ) = − 1 ;x > 0 x>0 x > 0 時,∂ φ ( x ) = 1 \partial \varphi(x)=1 ∂ φ ( x ) = 1 ;當x = 0 x=0 x = 0 時,∂ φ = [ − 1 , 1 ] \partial \varphi=[-1,1] ∂ φ = [ − 1 , 1 ] 這個閉區間。
1.4ρ − c o n v e x \rho -convex ρ − c o n v e x 函數
如果定義在凸集C C C 上的函數φ \varphi φ 對於任意x , y ∈ C , λ ∈ [ 0 , 1 ] x,y \in C,\lambda\in[0,1] x , y ∈ C , λ ∈ [ 0 , 1 ] ,對於某個ρ ≥ 0 \rho \geq0 ρ ≥ 0 滿足以下不等式
φ ( λ x + ( 1 − λ ) y ) ≤ λ φ ( x ) + ( 1 − λ ) φ ( y ) − ρ 2 λ ( 1 − λ ) ∣ ∣ x − y ∣ ∣ 2
\varphi(\lambda x+(1-\lambda)y)\leq\lambda \varphi(x)+(1-\lambda)\varphi(y)-\frac{\rho}{2}\lambda(1-\lambda)||x-y||^2
φ ( λ x + ( 1 − λ ) y ) ≤ λ φ ( x ) + ( 1 − λ ) φ ( y ) − 2 ρ λ ( 1 − λ ) ∣ ∣ x − y ∣ ∣ 2
那麼稱φ \varphi φ 爲凸集C C C 上的ρ − c o n v e x \rho -convex ρ − c o n v e x 函數。
1.5局部最優條件
原DC規劃的充要局部最優條件爲:(對偶DC規劃問題類似,就不提了)
∂ h ( x ∗ ) ⋂ ∂ g ( x ∗ ) ≠ ∅
\partial h(x^*) \bigcap \partial g(x^*) \neq \empty
∂ h ( x ∗ ) ⋂ ∂ g ( x ∗ ) = ∅
這個點就稱作臨界點,或者說上式是原規劃問題的一般KKT條件。並且
∅ ≠ ∂ h ( x ∗ ) ⊂ ∂ g ( x ∗ )
\empty \neq \partial h(x^*)\subset\partial g(x^*)
∅ = ∂ h ( x ∗ ) ⊂ ∂ g ( x ∗ )
在很多重要的DC規劃問題中也是局部最優的充分條件。
1.6多面凸函數(polyhedral function)
如果一個函數是有限個仿射函數集合中的最大值組成的,那麼這個函數一定是多面凸的。也就是說,共軛函數就是多面凸函數。
多面凸差規劃是指凸差問題中的函數g g g 或h h h 至少有一個是多面凸的凸差問題。多面凸規劃問題在非凸優化和全局優化上發揮了核心作用,是凸差規劃和凸差算法的基礎,從理論和算法的角度看在局部最優條件和DCA算法的收斂限度上都有非常讓人感興趣的特性,有如下兩點:
在h h h 是多面凸函數的多面凸問題中,如果h h h 在臨界點x ∗ x^* x ∗ 處可導,那麼x ∗ x^* x ∗ 實際上就是原DC問題的局部最小值。實際上多面凸函數一般處處可導,所以找到了臨界點一般就等價於找到了原DC問題的局部極小值。
函數f f f 在臨界點x ∗ x^* x ∗ 處是局部凸的,所以就可以用解決凸優化問題的方法來解決原DC問題。這一點的原因是因爲f = g − h f=g-h f = g − h 在h h h 可導的地方都是局部凸的。
二、凸差算法(DC Algorithm)
2.1迭代格式
基於凸差規劃中的局部最優條件和對偶性,凸差算法(DCA)由分別構建原問題和對偶問題的嘗試解的兩個序列x k {x_k} x k 和y k y_k y k 組成,這兩個序列滿足g ( x k ) − h ( x k ) g(x^k)-h(x^k) g ( x k ) − h ( x k ) 和h ∗ ( y k ) − g ∗ ( y k ) h^*(y^k)-g^*(y^k) h ∗ ( y k ) − g ∗ ( y k ) 是遞減的,並且都收斂至局部最優條件,以及
x ∗ ∈ ∂ g ∗ ( y ∗ ) , y ∗ ∈ ∂ h ( x ∗ )
x^* \in \partial g^*(y^*),y^* \in \partial h(x^*)
x ∗ ∈ ∂ g ∗ ( y ∗ ) , y ∗ ∈ ∂ h ( x ∗ )
這兩個序列是分別以x k + 1 x^{k+1} x k + 1 、y k + 1 y^{k+1} y k + 1 是凸規化問題P k P_k P k 和D k + 1 D_{k+1} D k + 1 的解的形式計算的,初始點x 0 ∈ d o m ∂ h x^0 \in dom \partial h x 0 ∈ d o m ∂ h ,y 0 ∈ ∂ h ( x 0 ) y^0 \in \partial h(x_0) y 0 ∈ ∂ h ( x 0 ) 。
( P k ) i n f { g ( x ) − [ h ( x k ) + < x − x k , y k > ] : x ∈ R n }
(P_k) \quad inf\{g(x)-[h(x^k)+<x-x^k,y^k>]:x \in \mathbb{R}^n\}
( P k ) i n f { g ( x ) − [ h ( x k ) + < x − x k , y k > ] : x ∈ R n }
( D k + 1 ) i n f { h ∗ ( y ) − [ g ∗ ( y k ) + < y − y k , x k + 1 > ] : y ∈ R n }
(D_{k+1})\quad inf\{h^*(y)-[g^*(y^k)+<y-y^k,x^{k+1}>]:y \in \mathbb{R}^n\}
( D k + 1 ) i n f { h ∗ ( y ) − [ g ∗ ( y k ) + < y − y k , x k + 1 > ] : y ∈ R n }
DCA算法有一個非常簡單的理解:在第k次迭代中,我們把初始凸差問題中的第二個部分h h h 替換成它的仿射較小值(affine minorization)h ( x k ) + < x − x k , y k > h(x^k)+<x-x^k,y^k> h ( x k ) + < x − x k , y k > 。這個仿射較小值是通過函數h在x k x^k x k 點處的次梯度y k y^k y k 來定義的,目的是爲了生成第k k k 個原始凸規化( P k ) (P_k) ( P k ) ,這個規劃問題的解恰恰就是∂ g ∗ ( y ∗ ) \partial g^*(y^*) ∂ g ∗ ( y ∗ ) 。對偶地,( P k ) (P_k) ( P k ) 的一個解x k + 1 x^{k+1} x k + 1 進而就被用來生成凸規化問題( D k + 1 ) (D_{k+1}) ( D k + 1 ) ——通過把對偶規劃問題( D d c ) (D_{dc}) ( D d c ) 中的第二項g ∗ g^* g ∗ 換成其仿射最小值( g ∗ ) ( k ) ( y ) : = g ∗ ( y k ) + < y − y k , x k + 1 > (g^*)^{(k)}(y):=g^*(y^k)+<y-y^k,x^{k+1}> ( g ∗ ) ( k ) ( y ) : = g ∗ ( y k ) + < y − y k , x k + 1 > 。這個對偶規劃問題的解集也恰恰就是h h h 函數在點x k + 1 x^{k+1} x k + 1 處的微分∂ h ( x k + 1 ) \partial h(x^{k+1}) ∂ h ( x k + 1 ) 。這個過程一直重複直至收斂。DCA藉助函數h h h 和g ∗ g* g ∗ 的次梯度執行了一次雙重線性化,從而生成下一個迭代凸規化問題:
y k ∈ ∂ h ( x k ) ; x k + 1 ∈ ∂ g ∗ ( y k ) , ∀ k ≥ 0. s t a r t i n g f r o m x 0 ∈ d o m ∂ h
y^k \in \partial h(x^k);\quad x^{k+1} \in \partial g^*(y^k),\forall k\geq0.\\
starting \quad from\quad x^0\in dom \partial h
y k ∈ ∂ h ( x k ) ; x k + 1 ∈ ∂ g ∗ ( y k ) , ∀ k ≥ 0 . s t a r t i n g f r o m x 0 ∈ d o m ∂ h
這就是標準的DCA算法迭代格式,中心思想就是把第二項通過線性化替換成局部極小值,然後根據多面凸規化的特性,原問題(對偶問題)就變成了標準的凸優化問題。
2.2收斂特性
DCA是一個不帶線性搜索的下降算法,但是具有全局收斂性,享有下面的特點:
(C和D是兩個分別包含序列{ x k } \{x^k\} { x k } { y k } \{y^k\} { y k } 在{ R n } \{\mathbb R^n\} { R n } 的凸集)
序列{ g ( x k ) − h ( x k ) } \{g(x^k)-h(x^k)\} { g ( x k ) − h ( x k ) } 和{ h ∗ ( y k ) − g ∗ ( y k ) } \{h^*(y^k)-g^*(y^k)\} { h ∗ ( y k ) − g ∗ ( y k ) } 是遞減的並且
g ( x k + 1 ) − h ( x k + 1 ) = g ( x k ) − h ( x k ) g(x^{k+1})-h(x^{k+1})=g(x^k)-h(x^k) g ( x k + 1 ) − h ( x k + 1 ) = g ( x k ) − h ( x k ) 當且僅當y k ∈ ∂ g ( x k ) ⋂ ∂ h ( x k ) y^k \in \partial g(x^k)\bigcap \partial h(x^k) y k ∈ ∂ g ( x k ) ⋂ ∂ h ( x k ) ,y k ∈ ∂ g ( x k + 1 ) ⋂ ∂ h ( x k + 1 ) y^k \in \partial g(x^{k+1})\bigcap \partial h(x^{k+1}) y k ∈ ∂ g ( x k + 1 ) ⋂ ∂ h ( x k + 1 ) ,並且[ ρ ( g , C ) + ρ ( h , C ) ] ∣ ∣ x k + 1 − x k ∣ ∣ = 0 [\rho(g,C)+\rho(h,C)]||x^{k+1}-x^k||=0 [ ρ ( g , C ) + ρ ( h , C ) ] ∣ ∣ x k + 1 − x k ∣ ∣ = 0 .而且如果g g g 和h h h 在C C C 上是嚴格凸的,那麼x k = x k + 1 x^k=x^{k+1} x k = x k + 1 .
此時DCA算法就在第k k k 次迭代終止了(DCA算法的有限收斂)
對偶地有,h ∗ ( y k + 1 ) − g ∗ ( y k + 1 ) = h ∗ ( y k ) − g ∗ ( y k ) h^*(y^{k+1})-g^*(y^{k+1})=h^*(y^k)-g^*(y^k) h ∗ ( y k + 1 ) − g ∗ ( y k + 1 ) = h ∗ ( y k ) − g ∗ ( y k ) 當且僅當x k + 1 ∈ ∂ g ∗ ( x k ) ⋂ ∂ h ∗ ( y k ) x^{k+1} \in \partial g^*(x^k)\bigcap \partial h^*(y^k) x k + 1 ∈ ∂ g ∗ ( x k ) ⋂ ∂ h ∗ ( y k ) ,x k + 1 ∈ ∂ g ∗ ( y k + 1 ) ⋂ ∂ h ∗ ( y k + 1 ) x^{k+1} \in \partial g^*(y^{k+1})\bigcap \partial h^*(y^{k+1}) x k + 1 ∈ ∂ g ∗ ( y k + 1 ) ⋂ ∂ h ∗ ( y k + 1 ) ,並且[ ρ ( g ∗ , D ) + ρ ( h ∗ , D ) ] ∣ ∣ y k + 1 − y k ∣ ∣ = 0 [\rho(g^*,D)+\rho(h^*,D)]||y^{k+1}-y^k||=0 [ ρ ( g ∗ , D ) + ρ ( h ∗ , D ) ] ∣ ∣ y k + 1 − y k ∣ ∣ = 0 .而且如果g ∗ g^* g ∗ 和h ∗ h^* h ∗ 在D D D 上是嚴格凸的,那麼y k + 1 = y k y^{k+1}=y^k y k + 1 = y k 。
此時DCA算法就在第k k k 次迭代終止了(DCA算法的有限收斂)
如果ρ ( g , C ) + ρ ( h , C ) > 0 \rho(g,C)+\rho(h,C)>0 ρ ( g , C ) + ρ ( h , C ) > 0 (對應地,ρ ( g ∗ , D ) + ρ ( h ∗ , D ) > 0 \rho(g^*,D)+\rho(h^*,D)>0 ρ ( g ∗ , D ) + ρ ( h ∗ , D ) > 0 )),那麼序列∣ ∣ x k + 1 − x k ∣ ∣ 2 {||x^{k+1}-x^k||^2} ∣ ∣ x k + 1 − x k ∣ ∣ 2 (對應地,∣ ∣ y k + 1 − y k ∣ ∣ ||y^{k+1}-y^k|| ∣ ∣ y k + 1 − y k ∣ ∣ )收斂。
如果原DC問題的最優值是有限個的並且無窮序列x k x^k x k 和y k y^k y k 是有界的,那麼每個無窮序列x k x^k x k 和y k y^k y k 的極限點x ~ \tilde x x ~ (對應地,y ~ \tilde y y ~ )都是g − h g-h g − h 的臨界點(對應地,h ∗ − g ∗ h^*-g^* h ∗ − g ∗ )。
對於一般地凸差規劃,DCA線性收斂。
對於多面凸差問題,DCA有限收斂。
2.3相關問題
凸差分解,DCA中凸規化的求解,DCA初始點的選取,DCA多啓動,凸差問題的最近分解技術等都是與凸差規劃相關的問題,想進一步研究的可以去閱讀參考文獻[2] .
2.4算法流程
算法:DCA
輸入:
T:最大迭代次數
ϵ \epsilon ϵ :收斂誤差
算法流程:
1.令t=0,初始化x t x_t x t
2.while (t<T) do
3. 計算y t ∈ ∂ h ( x t ) y_t \in \partial h(x_t) y t ∈ ∂ h ( x t ) ;
4. 求解凸優化問題
a r g m i n { g ( x ) − [ h ( x t ) + < x − x t , y t > ] } argmin \{ g(x)-[h(x_t)+<x-x_t,y_t>]\} a r g m i n { g ( x ) − [ h ( x t ) + < x − x t , y t > ] }
得到x t + 1 x_{t+1} x t + 1
5. if ∣ x t + 1 − x t ∣ ≤ ϵ |x_{t+1}-x_t|\leq\epsilon ∣ x t + 1 − x t ∣ ≤ ϵ then
6. 算法收斂,跳出循環
7. end if
8. 令t=t+1
9.end while
10.return x t x_t x t
有一個小細節值得一提的是,步驟4中的凸優化問題中的一項h ( x t ) h(x_t) h ( x t ) 一項是一個常數,實際算的時候可以省去。
三、小案例
考慮以下非凸問題:
i n f { f ( x ) = x 4 − 3 x 2 − x , x ∈ R }
inf\{f(x)=x^4-3x^2-x,x\in \mathbb R\}
i n f { f ( x ) = x 4 − 3 x 2 − x , x ∈ R }
將其DC分解爲兩個凸函數:
f ( x ) = g ( x ) − h ( x ) w h e r e g ( x ) = x 4 , h ( x ) = 3 x 2 + x
f(x)=g(x)-h(x)\\
where\quad g(x)=x^4,h(x)=3x^2+x
f ( x ) = g ( x ) − h ( x ) w h e r e g ( x ) = x 4 , h ( x ) = 3 x 2 + x
x0=input('請輸入初始點位置\n');
ah0=6*x0+1; %h的導數*
Iter=10;it=1;
x=zeros(Iter,1);
y=zeros(Iter,1);
x(1)=x0;y(1)=ah0;
while it<=Iter
%求取g的導數
[x(it+1),~]=fminunc(@(a)a^4-(a-x(it))*y(it),0);*
y(it+1)=6*x(it+1)+1;
it=it+1;
end
disp([x,y])
當選取初始點x = 0 x=0 x = 0 時,序列x k x_k x k 經過9次迭代收斂至1.3008:x=[ 0 0.6300 1.0612 1.2258 1.2783 1.2941 1.2989 1.3003 1.3007 1.3008 1.3008]。在x ∗ = 1.3008 x^*=1.3008 x ∗ = 1 . 3 0 0 8 這個臨界點有∂ h ( x ∗ ) = 6 x ∗ + 1 = ∂ g ( x ∗ ) = 4 x ∗ 3 = 8.8048 \partial h(x*)=6x^*+1=\partial g(x^*)=4x^{*3}=8.8048 ∂ h ( x ∗ ) = 6 x ∗ + 1 = ∂ g ( x ∗ ) = 4 x ∗ 3 = 8 . 8 0 4 8 ,也就是滿足了凸差規劃問題的局部最優條件。
參考文獻
[1] Convex Analysis[2004],Stephen Boyd,et al
[2] Recent Advances in DC Programming and DCA [2014],Tao Pham Dinh
[3] 凸優化[2013],王書寧等譯
[4]走進中神通Fenchel