ADMM简介

转载:http://www.cnblogs.com/breezedeus/p/3496819.html

从等式约束的最小化问题说起:                                  

                                                     image 
上面问题的拉格朗日表达式为:
                                             image 
也就是前面的最小化问题可以写为:
                                               minxmaxyL(x,y) xyLxy 。
它对应的对偶问题为:
                                              maxyminxL(x,y) yxLxy 。
下面是用来求解此对偶问题的对偶上升迭代方法
                                   image 
这个方法在满足一些比较强的假设下可以证明收敛。 

 

为了弱化对偶上升方法的强假设性,一些研究者在上世纪60年代提出使用扩展拉格朗日表达式(augmented Lagrangian)代替原来的拉格朗日表达式:
                                 image 
其中 ρ>0 ρ0。对应上面的对偶上升方法,得到下面的乘子法(method of multipliers)
                                                    image 

 

注意,乘子法里把第二个式子里的 αk αk改成了扩展拉格朗日表达式中引入的 ρ ρ。这不是一个随意行为,而是有理论依据的。利用 L(x,y) Lxy可以导出上面最小化问题对应的原始和对偶可行性条件分别为( Ly=0 ∂L∂y0 Lx=0 ∂L∂x0):
                                              image 
既然 xk+1 xk1 最小化  Lρ(x,yk) Lρxyk,有:
                                      image  
上面最后一个等式就是利用了 yk+1=yk+ρ(Axk+1b) yk1ykρAxk1b。从上面可知,这种 yk+1 yk1的取法使得 (xk+1,yk+1) xk1yk1满足对偶可行条件 Lx=0 ∂L∂x0。而原始可行条件在迭代过程中逐渐成立。 

 

乘子法弱化了对偶上升法的收敛条件,但由于在x-minimization步引入了二次项而导致无法把x分开进行求解(详见[1])。而接下来要讲的Alternating Direction Method of Multipliers (ADMM)就是期望结合乘子法的弱条件的收敛性以及对偶上升法的可分解求解性。ADMM求解以下形式的最小化问题:
                                             image 
其对应的扩展拉格朗日表达式为: 
                   image 
ADMM包括以下迭代步骤:
                                       image 
ADMM其实和乘子法很像,只是乘子法里把 x x z z放一块求解,而ADMM是分开求解,类似迭代一步的Gauss-Seidel方法。其中(3.4)中的推导类似于乘子法,只是使用了 zk+1 zk1最小化 Lρ(xk+1,z,yk) Lρxk1zyk
                                    image   
其中用到了 z z对应的对偶可行性式子:
                                                    Lz=g(z)+BTy=0 ∂L∂z∇gzBTy0

 

定义新变量 u=1ρy u1ρy,那么(3.2-3.4)中的迭代可以变为以下形式:
                          image 
在真正求解时通常会使用所谓的over-relaxation方法,也即在 z z u u中使用下面的表达式代替其中的 Axk+1 Axk1
                                          αkAxk+1(1αk)(Bzkc) αkAxk11αkBzkc
其中 αk αk为relaxation因子。有实验表明 αk[1.5,1.8] αk1.51.8可以改进收敛性([2])。 

 

下面让我们看看ADMM怎么被用来求解大型的机器学习模型。所谓的大型,要不就是样本数太多,或者样本的维数太高。下面我们只考虑第一种情况,关于第二种情况感兴趣的读者可以参见最后的参考文献[1, 2]。样本数太多无法一次全部导入内存,常见的处理方式是使用分布式系统,把样本分块,使得每块样本能导入到一台机器的内存中。当然,我们要的是一个最终模型,它的训练过程利用了所有的样本数据。常见的机器学习模型如下:
                                     minimize xJj=1fj(x)+g(x) minimize xj1Jfjxgx
其中 x x为模型参数, fj(x) fjx对应第 j j个样本的损失函数,而 g(x) gx为惩罚系数,如 g(x)=||x||1 gxx1

 

假设把 J J个样本分成 N N份,每份可以导入内存。此时我们把上面的问题重写为下面的形式: 
                                           image 
除了把目标函数分成 N N块,还额外加了 N N个等式约束,使得利用每块样本计算出来的模型参数 xi xi都相等。那么,ADMM中的求解步骤(3.2)-(3.4)变为: 
                            image 
例如求解L1惩罚的LR模型,其迭代步骤如下( u=1ρy u1ρy g(z)=λ||z||1 gzλz1): 
                                   image 
其中 x¯1NNixi x1NiNxi y¯ y的定义类似。 

  

在分布式情况下,为了计算方便通常会把 u u的更新步骤挪在最前面,这样 u u x x的更新可以放在一块: 
                                     image

 

ADMM的框架确实很牛逼,把一个大问题分成可分布式同时求解的多个小问题。理论上,ADMM的框架可以解决大部分实际中的大尺度问题。我自己全部实现了一遍这个框架,主要用于求解LR问题,下面说说我碰到的一些问题:
1. 收敛不够快,往往需要迭代几十步。整体速度主要依赖于 xi xi更新时所使用的优化方法,个人建议使用liblinear里算法,但是不能直接拿来就用,需要做一些调整。
2. 停止准则和 ρ ρ的选取:停止准则主要考量的是 xi xi z z之间的差异和它们本身的变动情况,但这些值又受 ρ ρ的取值的影响。它们之间如何权衡并无定法。个人建议使用模型在测试集上的效果来确定是否停止迭代。
3. 不适合MapReduce框架实现:需要保证对数据的分割自始至终都一致;用MPI实现的话相对于其他算法又未必有什么优势(如L-BFGS、OwLQN等)。
4. relaxation步骤要谨慎 α α的取值依赖于具体的问题,很多时候的确可以加快收敛速度,但对有些问题甚至可能带来不收敛的后果。用的时候不论是用x -> z -> u的更新步骤,还是用u -> x -> z的更新步骤,在u步使用的x_hat要和在z步使用的相同(使用旧的z),而不是使用z步刚更新的z重算。
5. warm start 和子问题求解逐渐精确的策略可以降低 xi xi更新时的耗时,但也使得算法更加复杂,需要设定的参数也增加了。


[References]
[1] S. Boyd.  Alternating Direction Method of Multipliers (Slides).
[2] S. Boyd et al.  Distributed Optimization and Statistical Learning via the Alternating Direction Method of Multipliers, 2010. 

  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ADMM是交替方向乘子法(Alternating Direction Method of Multipliers)的缩写。它是一种优化算法,常用于求解凸优化问题,特别是具有结构化约束的问题。在Matlab中,ADMM算法常用于信号处理、图像处理、路径规划等多个领域。 在引用中提到了一篇关于ADMM算法在大规模MIMO系统中的无穷范数检测的文章。该算法是基于ADMM的,并且提出了相应的VLSI架构,用于实现无穷范数检测。这篇文章对ADMM在无线通信系统中的应用进行了深入研究。 另外,在引用中提到了在Matlab代码中使用ADMM算法进行无穷范数检测的情况。具体来说,这是一种基于ADMM的无穷范数检测方法。 综上所述,ADMM是交替方向乘子法的缩写,它是一种常用于解决凸优化问题的优化算法。在Matlab中,ADMM算法被广泛应用于多个领域,如信号处理、图像处理、路径规划等。其中,引用提到了在大规模MIMO系统中应用ADMM算法进行无穷范数检测的研究,而引用则提到了在Matlab代码中使用ADMM算法进行无穷范数检测的情况。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [【通信】基于 ADMM 的大规模 MIMO 无穷范数检测附matlab代码](https://blog.csdn.net/matlab_dingdang/article/details/126969692)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值