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