凸优化学习

我们前面说过,拉格朗日法在实际中应用不大。为什么呢?因为增广拉格朗日算法 python 增强拉格朗日算法_Augmented的取值很难取,这就导致拉格朗日法鲁棒性很低,收敛很慢,解很不稳定。于是就有了今天的增广拉格朗日法和ADMM。

学习笔记

一、增广拉格朗日法(Augmented Lagrange Method)

1、定义

一句话总结:在拉格朗日法的基础上,将拉格朗日函数替换为增广拉格朗日函数。

有问题形如:
增广拉格朗日算法 python 增强拉格朗日算法_Augmented_02
定义其增广拉格朗日函数为:
增广拉格朗日算法 python 增强拉格朗日算法_凸优化_03
增广拉格朗日法:
增广拉格朗日算法 python 增强拉格朗日算法_Augmented_04

2、证明增广拉格朗日法的解是原问题的解

有问题形如:
增广拉格朗日算法 python 增强拉格朗日算法_凸优化_05

增广拉格朗日函数对应的问题:
增广拉格朗日算法 python 增强拉格朗日算法_深度学习_06
即证:
增广拉格朗日算法 python 增强拉格朗日算法_Augmented_07
增广拉格朗日算法 python 增强拉格朗日算法_增广拉格朗日算法 python_08,其增广拉格朗日算法 python 增强拉格朗日算法_深度学习_09条件中的稳定性有:
增广拉格朗日算法 python 增强拉格朗日算法_增广拉格朗日算法 python_10
增广拉格朗日算法 python 增强拉格朗日算法_凸优化_11,其增广拉格朗日算法 python 增强拉格朗日算法_深度学习_09条件中的稳定性有:
增广拉格朗日算法 python 增强拉格朗日算法_增广拉格朗日算法 python_13
因为增广拉格朗日算法 python 增强拉格朗日算法_Augmented_14,比较上下两式,得:
增广拉格朗日算法 python 增强拉格朗日算法_Augmented_07
证毕。

3、从拉格朗日法角度理解增广拉格朗日法(联系、对比)

有问题形如:
增广拉格朗日算法 python 增强拉格朗日算法_Augmented_02
拉格朗日法:
增广拉格朗日算法 python 增强拉格朗日算法_取值_17
增广拉格朗日法:
增广拉格朗日算法 python 增强拉格朗日算法_凸优化_18
可以看到,增广拉格朗日法去掉了增广拉格朗日算法 python 增强拉格朗日算法_Augmented_19,之后在性质分析中我们会讲到,在增广拉格朗日算法 python 增强拉格朗日算法_Augmented_20取得不是很精确的时候,收敛性也很好。还有一个变化是将增广拉格朗日算法 python 增强拉格朗日算法_取值_21换为增广拉格朗日算法 python 增强拉格朗日算法_取值_22,这是因为这两步是分开执行的,当算增广拉格朗日算法 python 增强拉格朗日算法_取值_23的时候,增广拉格朗日算法 python 增强拉格朗日算法_凸优化_24已经算出来了,我们当然可以用更好的增广拉格朗日算法 python 增强拉格朗日算法_深度学习_25来替换它。其中增广拉格朗日算法 python 增强拉格朗日算法_Augmented_20一般取1,也可以取成递增序列。

拉格朗日法:我已经有了增广拉格朗日算法 python 增强拉格朗日算法_取值_27时刻的增广拉格朗日算法 python 增强拉格朗日算法_取值_28增广拉格朗日算法 python 增强拉格朗日算法_凸优化_29的优化变量,根据给定规则去优化。本质上是增广拉格朗日算法 python 增强拉格朗日算法_取值_28增广拉格朗日算法 python 增强拉格朗日算法_凸优化_29的方法,从增广拉格朗日算法 python 增强拉格朗日算法_取值_28增广拉格朗日算法 python 增强拉格朗日算法_凸优化_29两个角度同时优化。
增广拉格朗日法:非同步优化,只更新增广拉格朗日算法 python 增强拉格朗日算法_取值_34,只算对偶最优解,可将增广拉格朗日算法 python 增强拉格朗日算法_凸优化_24带入下式,增广拉格朗日算法 python 增强拉格朗日算法_凸优化_24只是副产品。

4、增广拉格朗日法的两条性质以及其收敛性探究
  1. 增广拉格朗日算法 python 增强拉格朗日算法_深度学习_37,则增广拉格朗日算法 python 增强拉格朗日算法_深度学习_38
  2. 增广拉格朗日算法 python 增强拉格朗日算法_Augmented_39,则增广拉格朗日算法 python 增强拉格朗日算法_凸优化_40

第一条性质表明得到增广拉格朗日算法 python 增强拉格朗日算法_Augmented_41后,可以马上算出增广拉格朗日算法 python 增强拉格朗日算法_增广拉格朗日算法 python_42,只要增广拉格朗日算法 python 增强拉格朗日算法_Augmented_43就可以。第二条就更厉害了,如果你老是解不出增广拉格朗日算法 python 增强拉格朗日算法_Augmented_41,那就将增广拉格朗日算法 python 增强拉格朗日算法_取值_45,一样解的出增广拉格朗日算法 python 增强拉格朗日算法_增广拉格朗日算法 python_42,所以这个算法的鲁棒性是很好的。

下面用一个例子来体会一下这两条性质:

例:
增广拉格朗日算法 python 增强拉格朗日算法_Augmented_47
直接用增广拉格朗日算法 python 增强拉格朗日算法_深度学习_09条件得到解:
增广拉格朗日算法 python 增强拉格朗日算法_深度学习_49
我们探究一下两条性质,其增广拉格朗日函数为:
增广拉格朗日算法 python 增强拉格朗日算法_Augmented_50
性质一:当增广拉格朗日算法 python 增强拉格朗日算法_增广拉格朗日算法 python_51,有:
增广拉格朗日算法 python 增强拉格朗日算法_Augmented_52
可以直接解出增广拉格朗日算法 python 增强拉格朗日算法_增广拉格朗日算法 python_42
性质二:当增广拉格朗日算法 python 增强拉格朗日算法_取值_45增广拉格朗日算法 python 增强拉格朗日算法_深度学习_55增广拉格朗日算法 python 增强拉格朗日算法_Augmented_41还很远时:
增广拉格朗日算法 python 增强拉格朗日算法_凸优化_57
分析一下增广拉格朗日算法 python 增强拉格朗日算法_深度学习_58说明什么?即当增广拉格朗日算法 python 增强拉格朗日算法_取值_59,这就是增广拉格朗日法的两条性质,也可以看出它的鲁棒性非常好。

收敛性探究:
在这道题中,我们可以得到:
增广拉格朗日算法 python 增强拉格朗日算法_凸优化_60
是线性收敛的。

二、交替方向乘子法(ADMM)

对于这么一个优化问题:
增广拉格朗日算法 python 增强拉格朗日算法_深度学习_61
假设它的性质是当增广拉格朗日算法 python 增强拉格朗日算法_凸优化_62分开优化很简单,但是合起来优化很难时,我们就可以将它们拆开优化,上面问题等价于:
增广拉格朗日算法 python 增强拉格朗日算法_增广拉格朗日算法 python_63
用增广拉格朗日法进行优化:
增广拉格朗日算法 python 增强拉格朗日算法_增广拉格朗日算法 python_64
在第一步的时候,我们固定增广拉格朗日算法 python 增强拉格朗日算法_深度学习_65中的一个,使用坐标轮换法迭代优化另一个。即将增广拉格朗日算法 python 增强拉格朗日算法_凸优化_66步分为增广拉格朗日算法 python 增强拉格朗日算法_凸优化_67次,迭代中迭代,有点像二维数组的遍历,这样第一步就可以写为:
增广拉格朗日算法 python 增强拉格朗日算法_凸优化_68
但是这个二重循环复杂度实在太高,一旦迭代次数过多收敛会非常慢,更别说这里只是两个函数求和,那我要是多个函数求和怎么办?于是就有了交替方向乘子法(ADMM),它采用分布式的计算来解决了这个问题。

假设我们现在有一个中心计算机和它所通信的一个计算机群,我们考虑这么一个优化问题:
增广拉格朗日算法 python 增强拉格朗日算法_深度学习_69
类似于上面的转换,我们构造一下它的等价问题:
增广拉格朗日算法 python 增强拉格朗日算法_Augmented_70
其增广拉格朗日函数:
增广拉格朗日算法 python 增强拉格朗日算法_Augmented_71
接下来我们按照上面的增广拉格朗日算法 python 增强拉格朗日算法_增广拉格朗日算法 python_72写出增广拉格朗日算法 python 增强拉格朗日算法_增广拉格朗日算法 python_73三步,同时对每一步进行一些等价变换,就得到了ADMM。
增广拉格朗日算法 python 增强拉格朗日算法_凸优化_74
第一步的转换是将求和转换为分布,第二步就是直接解出来了。

梳理一下,我们得到ADMM为:
对于问题:
增广拉格朗日算法 python 增强拉格朗日算法_Augmented_70
可以按照如下方法求解:
增广拉格朗日算法 python 增强拉格朗日算法_凸优化_76
其中增广拉格朗日算法 python 增强拉格朗日算法_凸优化_77是中心计算机要算的东西,计算机群更新增广拉格朗日算法 python 增强拉格朗日算法_凸优化_78。在每一步,中心计算机得到增广拉格朗日算法 python 增强拉格朗日算法_凸优化_78后计算增广拉格朗日算法 python 增强拉格朗日算法_凸优化_77然后将增广拉格朗日算法 python 增强拉格朗日算法_凸优化_77发给计算机群;计算机群得到增广拉格朗日算法 python 增强拉格朗日算法_凸优化_77后计算增广拉格朗日算法 python 增强拉格朗日算法_凸优化_78并提交增广拉格朗日算法 python 增强拉格朗日算法_凸优化_78给中心计算机,如此循环往复,最终得到解。

个人思考

ADMM是集所有精华于一身的算法,无论是凸集凸函数对偶性拉格朗日函数的定义,还是梯度下降法最速下降法(坐标轮换法)的算法,都在其中有所体现。细细缕来,感觉就像搭积木一样,一层一层的搭。之前各种方法有着这样那样的性质,这样那样的缺点,通过取长补短提出一种新的方法,解决新的问题,很有意思。

纸质笔记

增广拉格朗日算法 python 增强拉格朗日算法_Augmented_85


增广拉格朗日算法 python 增强拉格朗日算法_深度学习_86


增广拉格朗日算法 python 增强拉格朗日算法_取值_87


增广拉格朗日算法 python 增强拉格朗日算法_取值_88