凸差算法(DCA)

凸差算法(DC Algorithm)

一、基本概念

1.1凸差問題

爲了解決非凸規劃問題,1975年引入,一般形式如下:
inf{f(x)=g(x)h(x),xRn} inf\{f(x)=g(x)-h(x),x\in \mathbb R^n\}

其對偶形式爲:
inf{f(y)=h(y)g(y):yRn} inf\{f^*(y)=h^*(y)-g^*(y):y \in \mathbb R^n\}

1.2共軛函數(conjugate function)

這個概念和複數的共軛沒有一點關係,事實上從牛津詞典上conjugate一詞只是表示(動詞)的變化形式,數學維基百科裏也有四種共軛函數的形式,第四種纔是凸分析中的共軛函數。函數f:XRf:X\rightarrow R的共軛函數爲
g(y)=supxX{<x,y>f(x)} g^*(y)=\mathop{sup}\limits_{x\in X}\{<x,y>-f(x)\}
共軛函數的自變量變成了yyxx變成了它的一個參數。它有一個很好的性質:一定是凸函數,甚至是多面凸函數(下面將講到什麼是多面凸函數)。因爲它是一系列關於yy的仿射函數(線性函數)中取的最大值,所以斜率肯定是分段增大的,可以從下面這張圖很清晰地看出這一點。另一方面也可以直接對yy求導。
在這裏插入圖片描述

這個共軛函數通過xx求導並令其等於0可以求出確切解,想進一步瞭解的可以閱讀參考文獻[1] 中的3.3節,或者它的譯著參考文獻[3]

1.3次微分(subdifferntial)和次梯度(subgradient)

函數φ\varphi在點x0x_0處的次梯度定義如下:
φ(x0):={y0Rn:φ(x)φ(x0)+<xx0,y0>,xRn} \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\}
一般來說,次梯度是閉凸集,是導數概念在凸函數上的擴展。次微分中的一個元素y0φ(x0)y_0 \in \partial \varphi(x_0)稱作函數φ\varphi在點x0x_0處的次梯度。當且僅當函數φ\varphix0x_0處可微,那麼閉集φ(x0)\partial \varphi(x_0)變爲導數{φ(x0)}\{\nabla \varphi(x_0)\}

比如,絕對值函數φ(x)=x\varphi(x)=|x|x<0x<0時,φ(x)=1\partial \varphi(x)=-1;x>0x>0時,φ(x)=1\partial \varphi(x)=1;當x=0x=0時,φ=[1,1]\partial \varphi=[-1,1]這個閉區間。

1.4ρconvex\rho -convex函數

如果定義在凸集CC上的函數φ\varphi對於任意x,yC,λ[0,1]x,y \in C,\lambda\in[0,1],對於某個ρ0\rho \geq0滿足以下不等式
φ(λx+(1λ)y)λφ(x)+(1λ)φ(y)ρ2λ(1λ)xy2 \varphi(\lambda x+(1-\lambda)y)\leq\lambda \varphi(x)+(1-\lambda)\varphi(y)-\frac{\rho}{2}\lambda(1-\lambda)||x-y||^2
那麼稱φ\varphi爲凸集CC上的ρconvex\rho -convex函數。

1.5局部最優條件

原DC規劃的充要局部最優條件爲:(對偶DC規劃問題類似,就不提了)
h(x)g(x) \partial h(x^*) \bigcap \partial g(x^*) \neq \empty
這個點就稱作臨界點,或者說上式是原規劃問題的一般KKT條件。並且
h(x)g(x) \empty \neq \partial h(x^*)\subset\partial g(x^*)
在很多重要的DC規劃問題中也是局部最優的充分條件。

1.6多面凸函數(polyhedral function)

如果一個函數是有限個仿射函數集合中的最大值組成的,那麼這個函數一定是多面凸的。也就是說,共軛函數就是多面凸函數。

多面凸差規劃是指凸差問題中的函數gghh至少有一個是多面凸的凸差問題。多面凸規劃問題在非凸優化和全局優化上發揮了核心作用,是凸差規劃和凸差算法的基礎,從理論和算法的角度看在局部最優條件和DCA算法的收斂限度上都有非常讓人感興趣的特性,有如下兩點:

  • hh是多面凸函數的多面凸問題中,如果hh在臨界點xx^*處可導,那麼xx^*實際上就是原DC問題的局部最小值。實際上多面凸函數一般處處可導,所以找到了臨界點一般就等價於找到了原DC問題的局部極小值。
  • 函數ff在臨界點xx^*處是局部凸的,所以就可以用解決凸優化問題的方法來解決原DC問題。這一點的原因是因爲f=ghf=g-hhh可導的地方都是局部凸的。

二、凸差算法(DC Algorithm)

2.1迭代格式

基於凸差規劃中的局部最優條件和對偶性,凸差算法(DCA)由分別構建原問題和對偶問題的嘗試解的兩個序列xk{x_k}yky_k組成,這兩個序列滿足g(xk)h(xk)g(x^k)-h(x^k)h(yk)g(yk)h^*(y^k)-g^*(y^k)是遞減的,並且都收斂至局部最優條件,以及
xg(y),yh(x) x^* \in \partial g^*(y^*),y^* \in \partial h(x^*)
這兩個序列是分別以xk+1x^{k+1}yk+1y^{k+1}是凸規化問題PkP_kDk+1D_{k+1}的解的形式計算的,初始點x0domhx^0 \in dom \partial hy0h(x0)y^0 \in \partial h(x_0)
(Pk)inf{g(x)[h(xk)+<xxk,yk>]:xRn} (P_k) \quad inf\{g(x)-[h(x^k)+<x-x^k,y^k>]:x \in \mathbb{R}^n\}

(Dk+1)inf{h(y)[g(yk)+<yyk,xk+1>]:yRn} (D_{k+1})\quad inf\{h^*(y)-[g^*(y^k)+<y-y^k,x^{k+1}>]:y \in \mathbb{R}^n\}

DCA算法有一個非常簡單的理解:在第k次迭代中,我們把初始凸差問題中的第二個部分hh替換成它的仿射較小值(affine minorization)h(xk)+<xxk,yk>h(x^k)+<x-x^k,y^k>。這個仿射較小值是通過函數h在xkx^k點處的次梯度yky^k來定義的,目的是爲了生成第kk個原始凸規化(Pk)(P_k),這個規劃問題的解恰恰就是g(y)\partial g^*(y^*)。對偶地,(Pk)(P_k)的一個解xk+1x^{k+1}進而就被用來生成凸規化問題(Dk+1)(D_{k+1})——通過把對偶規劃問題(Ddc)(D_{dc})中的第二項gg^*換成其仿射最小值(g)(k)(y):=g(yk)+<yyk,xk+1>(g^*)^{(k)}(y):=g^*(y^k)+<y-y^k,x^{k+1}>。這個對偶規劃問題的解集也恰恰就是hh函數在點xk+1x^{k+1}處的微分h(xk+1)\partial h(x^{k+1})。這個過程一直重複直至收斂。DCA藉助函數hhgg*的次梯度執行了一次雙重線性化,從而生成下一個迭代凸規化問題:
ykh(xk);xk+1g(yk),k0.startingfromx0domh 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

這就是標準的DCA算法迭代格式,中心思想就是把第二項通過線性化替換成局部極小值,然後根據多面凸規化的特性,原問題(對偶問題)就變成了標準的凸優化問題。

2.2收斂特性

DCA是一個不帶線性搜索的下降算法,但是具有全局收斂性,享有下面的特點:

(C和D是兩個分別包含序列{xk}\{x^k\}{yk}\{y^k\}{Rn}\{\mathbb R^n\}的凸集)

  1. 序列{g(xk)h(xk)}\{g(x^k)-h(x^k)\}{h(yk)g(yk)}\{h^*(y^k)-g^*(y^k)\}是遞減的並且

    • g(xk+1)h(xk+1)=g(xk)h(xk)g(x^{k+1})-h(x^{k+1})=g(x^k)-h(x^k)當且僅當ykg(xk)h(xk)y^k \in \partial g(x^k)\bigcap \partial h(x^k),ykg(xk+1)h(xk+1)y^k \in \partial g(x^{k+1})\bigcap \partial h(x^{k+1}),並且[ρ(g,C)+ρ(h,C)]xk+1xk=0[\rho(g,C)+\rho(h,C)]||x^{k+1}-x^k||=0.而且如果gghhCC上是嚴格凸的,那麼xk=xk+1x^k=x^{k+1}.

      此時DCA算法就在第kk次迭代終止了(DCA算法的有限收斂)

    • 對偶地有,h(yk+1)g(yk+1)=h(yk)g(yk)h^*(y^{k+1})-g^*(y^{k+1})=h^*(y^k)-g^*(y^k)當且僅當xk+1g(xk)h(yk)x^{k+1} \in \partial g^*(x^k)\bigcap \partial h^*(y^k),xk+1g(yk+1)h(yk+1)x^{k+1} \in \partial g^*(y^{k+1})\bigcap \partial h^*(y^{k+1}),並且[ρ(g,D)+ρ(h,D)]yk+1yk=0[\rho(g^*,D)+\rho(h^*,D)]||y^{k+1}-y^k||=0.而且如果gg^*hh^*DD上是嚴格凸的,那麼yk+1=yky^{k+1}=y^k

      此時DCA算法就在第kk次迭代終止了(DCA算法的有限收斂)

  2. 如果ρ(g,C)+ρ(h,C)>0\rho(g,C)+\rho(h,C)>0(對應地,ρ(g,D)+ρ(h,D)>0\rho(g^*,D)+\rho(h^*,D)>0)),那麼序列xk+1xk2{||x^{k+1}-x^k||^2}(對應地,yk+1yk||y^{k+1}-y^k||)收斂。

  3. 如果原DC問題的最優值是有限個的並且無窮序列xkx^kyky^k是有界的,那麼每個無窮序列xkx^kyky^k的極限點x~\tilde x(對應地,y~\tilde y)都是ghg-h的臨界點(對應地,hgh^*-g^*)。

  4. 對於一般地凸差規劃,DCA線性收斂。

  5. 對於多面凸差問題,DCA有限收斂。

2.3相關問題

凸差分解,DCA中凸規化的求解,DCA初始點的選取,DCA多啓動,凸差問題的最近分解技術等都是與凸差規劃相關的問題,想進一步研究的可以去閱讀參考文獻[2].

2.4算法流程

算法:DCA

輸入:
T:最大迭代次數
ϵ\epsilon:收斂誤差
算法流程:
1.令t=0,初始化xtx_t
2.while (t<T) do
3. 計算yth(xt)y_t \in \partial h(x_t);
4. 求解凸優化問題
argmin{g(x)[h(xt)+<xxt,yt>]}argmin \{ g(x)-[h(x_t)+<x-x_t,y_t>]\}
得到xt+1x_{t+1}
5. if xt+1xtϵ|x_{t+1}-x_t|\leq\epsilon then
6. 算法收斂,跳出循環
7. end if
8. 令t=t+1
9.end while
10.return xtx_t

有一個小細節值得一提的是,步驟4中的凸優化問題中的一項h(xt)h(x_t)一項是一個常數,實際算的時候可以省去。

三、小案例

考慮以下非凸問題:
inf{f(x)=x43x2x,xR} inf\{f(x)=x^4-3x^2-x,x\in \mathbb R\}
將其DC分解爲兩個凸函數:
f(x)=g(x)h(x)whereg(x)=x4,h(x)=3x2+x f(x)=g(x)-h(x)\\ where\quad g(x)=x^4,h(x)=3x^2+x
DC分解

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=0x=0時,序列xkx_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.3008x^*=1.3008這個臨界點有h(x)=6x+1=g(x)=4x3=8.8048\partial h(x*)=6x^*+1=\partial g(x^*)=4x^{*3}=8.8048,也就是滿足了凸差規劃問題的局部最優條件。

參考文獻

[1]Convex Analysis[2004],Stephen Boyd,et al

[2]Recent Advances in DC Programming and DCA [2014],Tao Pham Dinh

[3]凸優化[2013],王書寧等譯

[4]走進中神通Fenchel

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章