浅谈MM优化算法以及CCP算法

写在前面

因为我最近在做通信方面相关的优化算法,接触到了mm算法以及ccp算法,自己查阅了一些论文,也读了一些这个方面的博客和文章,在这里先列出来,博客写的都很好,很通俗易懂,这里先列出来,参考论文在最后。参考博客:
工程中非凸优化利器: Majorization-Minimization
Majorization-Minimization优化框架
MM优化算法

mm算法

mm算法的基本原理

  mm算法的思想,在于原目标函数 f ( x ) f(x) f(x)的凹凸性不确定导致难以优化,为此我们可通过构造一系列与原目标函数 f ( x ) f(x) f(x)相关的g(x),这些 g ( x ) g(x) g(x)是比较容易优化的,然后我们通过求这些 g ( x ) g(x) g(x)最优解,来一步一步逼近原目标函数的最优解 f ( x ) f(x) f(x)。构造这些 g ( x ) g(x) g(x)的过程中存在迭代的方法。
关于mm算法,个人觉得记住下面的两张图,算法流程就很清楚了。参考[1]。
在这里插入图片描述
在这里插入图片描述

这两张图的本质是一样的,第一个是Minorize-Maximization:求下界的最大值,第二个是Majorize-Minimization:求上界的最小值
以第二张图为例:
首先给出构造函数 g ( x ) g(x) g(x)满足的两个条件
对一个给定的值 x t {x_t} xt

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

我们先找一个初始点 x 0 x_0 x0,在 x 0 x_0 x0处构造一个凸函数 g ( x ∣ x 0 ) g(x|x_0) g(xx0),这个函数满足条件(1)和(2)。接着,我们去求 g ( x ∣ x 0 ) g(x|x_0) g(xx0)的极小值点记 x 1 x_{1} x1。然后把这个 x 1 x_{1} x1映射到 f ( x ) f(x) f(x)上,在 x 1 x_{1} x1处构造一个凸函数 g ( x ∣ x 1 ) g(x|x_1) g(xx1),求解这个 g ( x ∣ x 0 ) g(x|x_0) g(xx0)的极小值记为 x 2 x_{2} x2。依次类推,就可以通过迭代,不断求这些 g ( x ) g(x) g(x)的极小值来逼近原目标函数 f ( x ) f(x) f(x)的极小值。也就是说,这个过程在不断优化 g ( x ) g(x) g(x)的同时,也在不断的优化 f ( x ) f(x) f(x)
算法如下:
在这里插入图片描述
从这里可以看出来,之所以要满足条件(1)和(2),即 g ( x ) g(x) g(x) f ( x ) f(x) f(x)的上面,目的是为了保证每次迭代后,所得的目标函数值是逐渐下降的。即:
f ( x t + 1 ) ≤ g ( x t + 1 ; x t ) ≤ g ( x t ∣ x t ) = f ( x t ) (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) f(xt+1)g(xt+1;xt)g(xtxt)=f(xt)(3)
(3)式保证了该算法的收敛性。(注:*一般来说,这里只是局部收敛

产生构造函数的方法

从上面的介绍可以看出,构造方法产生是整个过程中至关重要的一步。[1]中给了很多的方法,感兴趣的可以具体看看这篇论文。这里我就写了一阶泰勒展开和凸性不等式的方法。

泰勒展开

刚看论文[1]的时候我还是有点迷茫的——“前面不是说构造的g(x)是一个简单的凸的或凹的形式吗?但这里对其一阶泰勒展开是变成了线性的形式,到底该怎么去求这个线性的最大or最小呢?”。后来我看了ccp(第二部分的内容)算法所针对的DC(凸差)问题,我才明白了原因:这里泰勒展开是展开目标函数中的部分不容易优化的项,保留了容易优化的项,具体先可看第二部分。个人觉得ccp是mm在泰勒展开时的一个特例。以及通信优化里面常用的sca(连续凸近似),也是mm算法思想的一个体现。具体谁先谁后,我就不清楚了,有错误烦请指正!不胜感激!
对于一个凸函数,是大于等于自身的一阶泰勒展开式的。
而对于一个凹函数,则是小于等于自身的一阶泰勒展开。
例如:
log ⁡ ( x ) ≤ log ⁡ ( x t ) + 1 x t ( x − x t ) (4) \tag{4}\log \left( x \right) \le \log \left( {{x_t}} \right) + \frac{1}{{{x_t}}}\left( {x - {x_t}} \right) log(x)log(xt)+xt1(xxt)(4)
当且仅当x=xt的时候取等号。
对于二阶泰勒,我们可以推导处熟悉的梯度下降法,可参考这篇博客。工程中非凸优化利器: Majorization-Minimization

凸性不等式

这里常用的不等式有詹森不等式,可推出机器学习的EM算法。限于时间具体过程这里就不敲了,上面那篇博客里都有了。
其他方法可仔细研读论文[1],写的很好。

ccp算法

ccp算法基本原理

  了解凸优化的应该都知道,凸差问题(Difference of convex)问题是不太好求解的,这里参考Lipp和boyd(凸优化书籍的作者)的文章,提出了一种ccp(convex-concave procedure)算法来解决这个问题,另外对基础的ccp算法进行了几种扩展,具体可以看参考文献[2]。这里浅谈一下basic ccp algorithm
  首先,对DC优化问题,可以描述为:
min ⁡ f 0 ( x ) − g 0 ( x ) s . t . f i ( x ) − g i ( x ) ≤ 0 , i ∈ 1 , 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} minf0(x)g0(x)s.t.fi(x)gi(x)0,i1,2...m;(5)
这里f(x)和g(x)都是凸函数
  注意到: f ( x ) − g ( x ) ⏟ c o n c a v e {\rm{ }}f(x)\underbrace { - g(x)}_{{\bf{concave}}} f(x)concave g(x),对里面凹的这一项,用一阶泰勒展开把它线性化,也就是:
g ^ i ( x ) = g ( x 0 ) + ∇ g i ( x 0 ) T ( x − x 0 ) , 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 g^i(x)=g(x0)+gi(x0)T(xx0),i=0,1...m(6)
  上式时关于x的一个线性函数,x0是一个已知点。类似mm算法要求的,每一次要求新构造的可被优化的问题在初始点的值等于原问题在初始点的值,这里一阶泰勒展开是满足的,当 x = x 0 x={x_0} x=x0时二者相等。
  那么,对每一个给定的x,原优化问题可通过该线性化方法变为一个凸问题。换句话说,原问题可以被分解为多个凸的子问题,通过求解这些凸的子问题的最小值,来逼近或得到原问题的驻点。通过前一部分对mm算法的说明,理解ccp的迭代过程应该比较容易了。
  至于迭代的终止条件就有很多了,(例如对于自变量x和函数值y的)。可以有:
∣ x k − x k + 1 ∣ < = σ (7) \tag{7}|x_{k}-x_{k+1}|<=\sigma xkxk+1<=σ(7)

∣ { f 0 ( x k ) − g 0 ( x k ) } − { f 0 ( x k + 1 ) − g 0 ( x k + 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 {f0(xk)g0(xk)}{f0(xk+1)g0(xk+1)}σ(8)

ccp算法流程

在这里插入图片描述

ccp算法收敛性证明

  首先说明一下,ccp是一个下降方法。梯度下降方法也可以通过mm算法推导出来,(二阶泰勒展开,有兴趣的可以试一下)。也就是说:
f 0 ( x k + 1 ) − g 0 ( x k + 1 ) ≤ f 0 ( x k ) − g 0 ( x k ) (9) \tag{9}{f_0}({x_{k + 1}}) - {g_0}({x_{k + 1}}) \le {f_0}({x_k}) - {g_0}({x_k}) f0(xk+1)g0(xk+1)f0(xk)g0(xk)(9)

  假设 x k x_k xk是原问题的一个可行解,那么我们可以在 x k x_k xk处对原问题进行泰勒展开,记 g i ( x ; x k ) g_i(x;x_k) gi(x;xk)的一阶泰勒为 g ^ i ( x ) {{\hat g}_i}\left( x \right) g^i(x)。因为 g ( x ) g(x) g(x)是一个凸函数,有 g ( x ) ≥ g ^ ( x ) g\left( x \right) \ge \hat g\left( x \right) g(x)g^(x),再加上负号。先看约束部分:
首先因为在可行解处进行泰勒展开,有
f i ( x k ) − g ^ i ( x k ; x k ) = f i ( x k ) − g i ( x k ) ≤ 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)g^i(xk;xk)=fi(xk)gi(xk)0(10)

               f i ( x k ) − g i ( x k ) ≤ 0 {f_i}(x_k) - {g_i}(x_k) \le 0 fi(xk)gi(xk)0 即, f i ( x k ) ≤ g i ( x k ) {f_i}(x_k) \le {g_i}(x_k) fi(xk)gi(xk)
泰勒展开后,有:
f i ( x k ) ≤ g ^ i ( x ; x k ) ≤ g i ( x k ) (11) \tag{11}{f_i}(x_k) \le {{\hat g}_i}(x;x_k) \le {g_i}(x_k) fi(xk)g^i(x;xk)gi(xk)(11)
此时求子问题得最最小值,产生 x k + 1 x_{k+1} xk+1:
所以有:
f i ( x k + 1 ) ≤ g ^ 0 ( x k + 1 ; x k ) ≤ g i ( x k + 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) fi(xk+1)g^0(xk+1;xk)gi(xk+1)(12)
上式说明了 x k + 1 x_{k+1} xk+1也是原问题的可行解。
用数轴来理解比较好:
在这里插入图片描述
  也就是说,子问题的可行解一定是原问题的可行解。满足子问题的约束一定满足原问题的约束。

再看目标函数,由于每次取得是子问题得最小值,令 v k = f 0 ( x k ) − g 0 ( x k ) {v_k} = {f_0}\left( {{x_k}} \right) - {g_0}\left( {{x_k}} \right) vk=f0(xk)g0(xk),所以有,
由于
v k = f 0 ( x k ) − g 0 ( x k ) = f 0 ( x k ) − g ^ 0 ( x k ; x k ) ≥ f 0 ( x k + 1 ) − g ^ 0 ( x k + 1 ; x k ) (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) vk=f0(xk)g0(xk)=f0(xk)g^0(xk;xk)f0(xk+1)g^0(xk+1;xk)(13)
也就是说:
v k ≥ f 0 ( x k + 1 ) − g ^ 0 ( x k + 1 ; x k ) ≥ f 0 ( x k + 1 ) − g 0 ( x k + 1 ; x k + 1 ) = v k + 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}} vkf0(xk+1)g^0(xk+1;xk)f0(xk+1)g0(xk+1;xk+1)=vk+1(14)

上式就说明了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的主页,里面有很好的凸优化学习资料。
Smola, A. J., Vishwanathan, S. V. N., and Hofmann, T. (2005).
Kernel methods for missing variables.
In Proc. of the Tenth International Workshop on Artificial Intelligence and Statistics.

这篇论文关于cccp的收敛性也有很好的描述。

  • 47
    点赞
  • 166
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 21
    评论
SCA正余弦优化算法(Sine Cosine Algorithm,SCA)是一种基于正弦和余弦函数优化的算法。它是由Seyedali Mirjalili于2016年提出的,用于求解全局优化问题。 SCA算法的主要思想是通过模拟正弦和余弦函数的运动规律来搜索最优解。正弦函数在区间[0,π]上递增,而余弦函数在区间[0,π/2]上递减。利用这种特性,SCA算法引入了两个变量:正弦变量sin(t)和余弦变量cos(t),t为迭代次数。 算法的优化过程包括两个主要步骤:位置更新和解搜索。在位置更新步骤中,根据正弦和余弦函数的运动规律,更新每个解的位置。同时,引入一个随机数项来增加算法的搜索范围。在解搜索步骤中,通过计算适应度函数来评估每个解的质量,并根据适应度函数的值进行解的选择和更新。 SCA算法的优点包括以下几个方面: 1. 算法简单易实现,没有复杂的参数设置过程; 2. 具有较强的全局搜索能力,能够有效地搜索到最优解; 3. 算法具有较好的收敛性能,收敛速度较快。 然而,SCA算法也存在一些不足之处: 1. 对于复杂的优化问题,算法可能会陷入局部最优解; 2. 算法的搜索范围受到正弦和余弦函数的限制,可能导致搜索空间不足。 总之,SCA正余弦优化算法是一种基于正弦和余弦函数优化的算法,通过模拟正弦和余弦函数的运动规律来搜索最优解。它具有简单易实现、全局搜索能力强和较快的收敛速度等优点,但也需要考虑到局部最优解和搜索范围受限的问题。
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

通信仿真爱好者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值