淺談MM優化算法以及CCP算法

寫在前面

因爲我最近在做通信方面相關的優化算法,接觸到了mm算法以及ccp算法,自己查閱了一些論文,也讀了一些這個方面的博客和文章,在這裏先列出來,博客寫的都很好,很通俗易懂,這裏先列出來,參考論文在最後。參考博客:
工程中非凸優化利器: Majorization-Minimization
Majorization-Minimization優化框架
MM優化算法

mm算法

mm算法的基本原理

  mm算法的思想,在於原目標函數f(x)f(x)的凹凸性不確定導致難以優化,爲此我們可通過構造一系列與原目標函數f(x)f(x)相關的g(x),這些g(x)g(x)是比較容易優化的,然後我們通過求這些g(x)g(x)最優解,來一步一步逼近原目標函數的最優解f(x)f(x)。構造這些g(x)g(x)的過程中存在迭代的方法。
關於mm算法,個人覺得記住下面的兩張圖,算法流程就很清楚了。參考[1]。
在這裏插入圖片描述
在這裏插入圖片描述

這兩張圖的本質是一樣的,第一個是Minorize-Maximization:求下界的最大值,第二個是Majorize-Minimization:求上界的最小值
以第二張圖爲例:
首先給出構造函數g(x)g(x)滿足的兩個條件
對一個給定的值xt{x_t}

g(x=xtxt)=f(xt)(1)\tag{1} g\left( {x = {x_t}|{x_t}} \right) = f\left( {{x_t}} \right)
g(xxt)f(x)(2)\tag{2}g\left( {x|{x_t}} \right) \ge f\left( x \right)

我們先找一個初始點x0x_0,在x0x_0處構造一個凸函數g(xx0)g(x|x_0),這個函數滿足條件(1)和(2)。接着,我們去求g(xx0)g(x|x_0)的極小值點記x1x_{1}。然後把這個x1x_{1}映射到f(x)f(x)上,在x1x_{1}處構造一個凸函數g(xx1)g(x|x_1),求解這個g(xx0)g(x|x_0)的極小值記爲x2x_{2}。依次類推,就可以通過迭代,不斷求這些g(x)g(x)的極小值來逼近原目標函數f(x)f(x)的極小值。也就是說,這個過程在不斷優化g(x)g(x)的同時,也在不斷的優化f(x)f(x)
算法如下:
在這裏插入圖片描述
從這裏可以看出來,之所以要滿足條件(1)和(2),即g(x)g(x)f(x)f(x)的上面,目的是爲了保證每次迭代後,所得的目標函數值是逐漸下降的。即:
f(xt+1)g(xt+1;xt)g(xtxt)=f(xt)(3)\tag{3}f\left( {{x_{t + 1}}} \right) \le g\left( {{x_{t + 1}};{x_t}} \right) \le g\left( {{x_t}|{x_t}} \right) = f\left( {{x_t}} \right)
(3)式保證了該算法的收斂性。(注:*一般來說,這裏只是局部收斂

產生構造函數的方法

從上面的介紹可以看出,構造方法產生是整個過程中至關重要的一步。[1]中給了很多的方法,感興趣的可以具體看看這篇論文。這裏我就寫了一階泰勒展開和凸性不等式的方法。

泰勒展開

剛看論文[1]的時候我還是有點迷茫的——“前面不是說構造的g(x)是一個簡單的凸的或凹的形式嗎?但這裏對其一階泰勒展開是變成了線性的形式,到底該怎麼去求這個線性的最大or最小呢?”。後來我看了ccp(第二部分的內容)算法所針對的DC(凸差)問題,我才明白了原因:這裏泰勒展開是展開目標函數中的部分不容易優化的項,保留了容易優化的項,具體先可看第二部分。個人覺得ccp是mm在泰勒展開時的一個特例。以及通信優化裏面常用的sca(連續凸近似),也是mm算法思想的一個體現。具體誰先誰後,我就不清楚了,有錯誤煩請指正!不勝感激!
對於一個凸函數,是大於等於自身的一階泰勒展開式的。
而對於一個凹函數,則是小於等於自身的一階泰勒展開。
例如:
log(x)log(xt)+1xt(xxt)(4)\tag{4}\log \left( x \right) \le \log \left( {{x_t}} \right) + \frac{1}{{{x_t}}}\left( {x - {x_t}} \right)
當且僅當x=xt的時候取等號。
對於二階泰勒,我們可以推導處熟悉的梯度下降法,可參考這篇博客。工程中非凸優化利器: Majorization-Minimization

凸性不等式

這裏常用的不等式有詹森不等式,可推出機器學習的EM算法。限於時間具體過程這裏就不敲了,上面那篇博客裏都有了。
其他方法可仔細研讀論文[1],寫的很好。

ccp算法

ccp算法基本原理

  瞭解凸優化的應該都知道,凸差問題(Difference of convex)問題是不太好求解的,這裏參考Lipp和boyd(凸優化書籍的作者)的文章,提出了一種ccp(convex-concave procedure)算法來解決這個問題,另外對基礎的ccp算法進行了幾種擴展,具體可以看參考文獻[2]。這裏淺談一下basic ccp algorithm
  首先,對DC優化問題,可以描述爲:
minf0(x)g0(x)s.t.fi(x)gi(x)0,i1,2...m;(5)\tag{5}\begin{array}{l} \min {\rm{ }}{f_0}(x) - {g_0}(x)\\ {\rm{s}}{\rm{.t}}{\rm{. }}{f_i}(x) - {g_i}(x) \le 0,i \in 1,2...m ; \end{array}
這裏f(x)和g(x)都是凸函數
  注意到:f(x)g(x)concave{\rm{ }}f(x)\underbrace { - g(x)}_{{\bf{concave}}},對裏面凹的這一項,用一階泰勒展開把它線性化,也就是:
g^i(x)=g(x0)+gi(x0)T(xx0),i=0,1...m(6)\tag{6}{{\hat g}_i}\left( x \right) = g\left( {{x_0}} \right) + \nabla {g_i}{\left( {{x_0}} \right)^T}\left( {x - {x_0}} \right),i = 0,1...m
  上式時關於x的一個線性函數,x0是一個已知點。類似mm算法要求的,每一次要求新構造的可被優化的問題在初始點的值等於原問題在初始點的值,這裏一階泰勒展開是滿足的,當x=x0x={x_0}時二者相等。
  那麼,對每一個給定的x,原優化問題可通過該線性化方法變爲一個凸問題。換句話說,原問題可以被分解爲多個凸的子問題,通過求解這些凸的子問題的最小值,來逼近或得到原問題的駐點。通過前一部分對mm算法的說明,理解ccp的迭代過程應該比較容易了。
  至於迭代的終止條件就有很多了,(例如對於自變量x和函數值y的)。可以有:
xkxk+1<=σ(7) \tag{7}|x_{k}-x_{k+1}|<=\sigma

{f0(xk)g0(xk)}{f0(xk+1)g0(xk+1)}σ(8)\tag{8}|\left\{ {{f_0}({x_k}) - {g_0}({x_k})} \right\} - \left\{ {{f_0}({x_{k + 1}}) - {g_0}({x_{k + 1}})} \right\}| \le \sigma

ccp算法流程

在這裏插入圖片描述

ccp算法收斂性證明

  首先說明一下,ccp是一個下降方法。梯度下降方法也可以通過mm算法推導出來,(二階泰勒展開,有興趣的可以試一下)。也就是說:
f0(xk+1)g0(xk+1)f0(xk)g0(xk)(9)\tag{9}{f_0}({x_{k + 1}}) - {g_0}({x_{k + 1}}) \le {f_0}({x_k}) - {g_0}({x_k})

  假設xkx_k是原問題的一個可行解,那麼我們可以在xkx_k處對原問題進行泰勒展開,記gi(x;xk)g_i(x;x_k)的一階泰勒爲g^i(x){{\hat g}_i}\left( x \right)。因爲g(x)g(x)是一個凸函數,有g(x)g^(x)g\left( x \right) \ge \hat g\left( x \right),再加上負號。先看約束部分:
首先因爲在可行解處進行泰勒展開,有
fi(xk)g^i(xk;xk)=fi(xk)gi(xk)0(10)\tag{10}{f_i}({x_k}) - {{\hat g}_i}({x_k};{x_k}) = {f_i}({x_k}) - {g_i}({x_k}) \le 0

              fi(xk)gi(xk)0{f_i}(x_k) - {g_i}(x_k) \le 0 即,fi(xk)gi(xk){f_i}(x_k) \le {g_i}(x_k)
泰勒展開後,有:
fi(xk)g^i(x;xk)gi(xk)(11)\tag{11}{f_i}(x_k) \le {{\hat g}_i}(x;x_k) \le {g_i}(x_k)
此時求子問題得最最小值,產生xk+1x_{k+1}:
所以有:
fi(xk+1)g^0(xk+1;xk)gi(xk+1)(12)\tag{12}{f_i}\left( {{x_{k + 1}}} \right) \le {{\hat g}_0}\left( {{x_{k + 1}};{x_k}} \right) \le {g_i}\left( {{x_{k + 1}}} \right)
上式說明了xk1x{k_1}也是原問題的可行解。
用數軸來理解比較好:
在這裏插入圖片描述
  也就是說,子問題的可行解一定是原問題的可行解。滿足子問題的約束一定滿足原問題的約束。

再看目標函數,由於每次取得是子問題得最小值,令vk=f0(xk)g0(xk){v_k} = {f_0}\left( {{x_k}} \right) - {g_0}\left( {{x_k}} \right),所以有,
由於
vk=f0(xk)g0(xk)=f0(xk)g^0(xk;xk)f0(xk+1)g^0(xk+1;xk)(13)\tag{13}{v_k} = {f_0}\left( {{x_k}} \right) - {g_0}\left( {{x_k}} \right) = {f_0}\left( {{x_k}} \right) - {\hat g_0}\left( {{x_k};{x_k}} \right) \ge {f_0}\left( {{x_{k + 1}}} \right) - {\hat g_0}\left( {{x_{k + 1}};{x_k}} \right)
也就是說:
vkf0(xk+1)g^0(xk+1;xk)f0(xk+1)g0(xk+1;xk+1)=vk+1(14)\tag{14}{v_k} \ge {f_0}\left( {{x_{k + 1}}} \right) - {{\hat g}_0}\left( {{x_{k + 1}};{x_k}} \right) \ge {f_0}\left( {{x_{k + 1}}} \right) - {g_0}\left( {{x_{k + 1}};{x_{k + 1}}} \right) = {v_{k + 1}}

上式就說明了ccp方法是一個下降方法。
對於ccp的思想,個人總結爲保留了目標函數的部分凸性,對非凸的部分進行線性化處理,進而通過迭代求解目標函數的一系列凸的子問題,進而得到原目標函數的駐點

ccp算法的例子

%%最小化函數 x^4-x^2
%%該函數的最小值爲-0.25,對應的x爲正負1/根號(2)
% x=-5:0.1:5;
% y=x.^4-x.^2;
% plot(x,y)
%%主函數部分
x0=-10;%%初始點
j=0
while(1)
[x,g] = cvx_example_cvx(x0)
f1=x^4-x^2;
x0=x;
[x,g] = cvx_example_cvx(x0)
f2=x^4-x^2;
j=j+1;
if(abs(f1-f2)<=0.01)
    break
end
end
j,x,f2
%%%終止條件不同
% j=0;
% [x,g] = cvx_example_cvx(x0)
% while(abs(x0-x)>=0.1)
%       x0=x;
%       j=j+1;
%       [x,g] = cvx_example_cvx(x0)
% end
%f=x^4-x^2;
% j,x,f

%%%調用的cvx工具函數
function [x,g] = cvx_example_cvx(x0)
cvx_begin
variable x
g = x^4-(x0^2+2*x0*(x-x0))
minimize g
cvx_end

在這裏插入圖片描述
可以改變初始點的位置,也可以看到經過很快的迭代該算法就會收斂到駐點。
覺得有幫助的請點個贊把!謝謝
參考文獻:
[1]:Majorization-Minimization Algorithms in Signal Processing, Communications, and Machine Learning
[2]:Variations and Extensions of the Convex-Concave Procedure這個鏈接也是boyd的主頁,裏面有很好的凸優化學習資料。

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