凸差算法(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

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