交替方向乘子法(ADMM)的原理和流程的白话总结

转载自:https://blog.csdn.net/qauchangqingwei/article/details/82112103

<div id="article_content" class="article_content clearfix" data-report-click="{&quot;mod&quot;:&quot;popu_307&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/qauchangqingwei/article/details/82112103&quot;}">
                                    <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-3019150162.css">
                                        <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-3019150162.css">
                <div class="htmledit_views" id="content_views">
                                            <p>作者:大大大的v<br>
链接:https://www.zhihu.com/question/36566112/answer/118715721<br>
来源:知乎<br>
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。<br>
&nbsp;</p>

<p>多年前第一次接触到ADMM时候我关于优化的基础知识少的可怜(虽然现在也少得可怜),那些公式是什么鬼。当然如果有优化基础的话直接看S.Boyd的那本专著就好啦。我试着写给多年前一穷二白的自己,理一下思路。</p>

<p>&nbsp;</p>

<p>1) 优化问题是什么:</p>

<p>最常见的优化问题长这样(公式1):</p>

<p><img alt="min_x\quad f(x)\\" class="has" src="https://www.zhihu.com/equation?tex=min_x%5Cquad+f%28x%29%5C%5C"></p>

<p>其中 <img alt="x" class="has" src="https://www.zhihu.com/equation?tex=x"> 是优化变量,也就是可以改变的数值,通过调节 <img alt="x" class="has" src="https://www.zhihu.com/equation?tex=x"> 的大小,使得目标函数 <img alt="f(x)" class="has" src="https://www.zhihu.com/equation?tex=f%28x%29"> 的数值达到最小。</p>

<p>像(1)式那样,只有函数,对于变量 <img alt="x" class="has" src="https://www.zhihu.com/equation?tex=x+"> 没有要求的话,其实是最简单的一类优化问题:无约束优化问题(我们只考虑凸问题的情况下,如果你不知道什么是凸问题的话,没关系,那不重要,只要记住越凸越好=凸=)。</p>

<p>实际上我们对于优化变量 <img alt="x" class="has" src="https://www.zhihu.com/equation?tex=x+"> 可能会有很多要求:</p>

<p><img alt="x" class="has" src="https://www.zhihu.com/equation?tex=x+"> 要满足什么集合啦, 什么等式约束,不等式约束啦巴拉巴拉,这就好比我们希望通过学习升级打怪成为高知女性就可以吊金龟婿一样,这里优化变量 <img alt="x" class="has" src="https://www.zhihu.com/equation?tex=x+"> 暗指学历,函数 <img alt="f(x)" class="has" src="https://www.zhihu.com/equation?tex=f%28x%29"> 对应的是一个评分,也就是优质金龟婿不愿意跟你处对象的评分(因为是要最小化),金龟婿肤白貌美大长腿,那我小学学历肯定是不够的,初中文凭貌似也不太够?所以我学啊学,学啊学,以为学历越高越好,结果好不容易读了博,回头一看,好嘞原来男神对另一半学历是有要求的(也就是优化里所说的约束):高中&lt; <img alt="x" class="has" src="https://www.zhihu.com/equation?tex=x+"> &lt;=硕士。博士不做女人啦,这大概就是基于学历的一个优化问题→_→</p>

<p>等式约束: <img alt="subject. to  \quad Ax=b" class="has" src="https://www.zhihu.com/equation?tex=subject.+to++%5Cquad+Ax%3Db"></p>

<p>不等式约束: <img alt="subject. to \quad Ax\leqslant b" class="has" src="https://www.zhihu.com/equation?tex=subject.+to+%5Cquad+Ax%5Cleqslant+b"></p>

<p>所以一个等式约束的优化问题长这样(公式2):</p>

<p><img alt="min_x\quad f(x)\\sub.to \quad Ax=b" class="has" src="https://www.zhihu.com/equation?tex=min_x%5Cquad+f%28x%29%5C%5Csub.to+%5Cquad+Ax%3Db"></p>

<p>&nbsp;</p>

<p>2)ADMM解决什么优化问题:</p>

<p><img alt="min_{x,z}\quad f(x)+g(z)\\sub.to\quad Ax+Bz=c" class="has" src="https://www.zhihu.com/equation?tex=min_%7Bx%2Cz%7D%5Cquad+f%28x%29%2Bg%28z%29%5C%5Csub.to%5Cquad+Ax%2BBz%3Dc"></p>

<p>也就意味着ADMM通常解决的是等式约束的优化问题,而且这个优化问题还有两个优化变量 <img alt="x" class="has" src="https://www.zhihu.com/equation?tex=x+"> 跟 <img alt="z" class="has" src="https://www.zhihu.com/equation?tex=z"> !</p>

<p>回到刚刚找男朋友的问题上来,如果之前我们只考量学历因素 <img alt="x" class="has" src="https://www.zhihu.com/equation?tex=x"> 的话,现在我们还要考量颜值因素 <img alt="z" class="has" src="https://www.zhihu.com/equation?tex=z">!而且这两个变量之间还是有等式关系的!(至于这个关系。。。大概就是那个什么学历越高,颜值就越。。。=凸=,荒谬,荒谬至极!)</p>

<p>事实上分布式中的一致性优化问题(consensus),分享问题(sharing problem)等等都很好写成这样的形式,因为每个节点的变量还要跟周围节点变量产生关联,但真正用ADMM的原因可能还是因为ADMM又快又好用吧。。。</p>

<p>&nbsp;</p>

<p>3)解决优化问题的方法:</p>

<p>方法中与ADMM最为相关的大概就是原对偶方法中的增广拉格朗日法(ALM)。</p>

<p>对偶方法:把公式2中的minimize问题与约束条件sub to通过一个对偶变量 <img alt="\lambda" class="has" src="https://www.zhihu.com/equation?tex=%5Clambda+"> 耦合在一起,形成一个叫做Lagrange函数的东西:</p>

<p><img alt="L(x,\lambda) = f(x)+\lambda^T(Ax-b)\\" class="has" src="https://www.zhihu.com/equation?tex=L%28x%2C%5Clambda%29+%3D+f%28x%29%2B%5Clambda%5ET%28Ax-b%29%5C%5C"></p>

<p>原来带约束求解 <img alt="min_x f(x)" class="has" src="https://www.zhihu.com/equation?tex=min_x+f%28x%29"> ,现在求解对偶问题 <img alt="\max_{\lambda}\min_{x}L(x,\lambda)" class="has" src="https://www.zhihu.com/equation?tex=%5Cmax_%7B%5Clambda%7D%5Cmin_%7Bx%7DL%28x%2C%5Clambda%29"> ,两个问题的最优解等价(原问题凸的情况下。为什么?公式好多,我再想想(查查)有没有什么直观的解释),而且现在没了约束,岂不美哉(❁´◡`❁)*✲゚*</p>

<p>方法是对偶上升法:</p>

<p><img alt="step1:\ \ \ \ \ \ x^{k+1}=\arg\min_x \ L(x,\lambda^k)\\ step2: \ \ \ \lambda^{k+1} = \lambda^k+\rho(Ax^{k+1}-b)" class="has" src="https://www.zhihu.com/equation?tex=step1%3A%5C+%5C+%5C+%5C+%5C+%5C+x%5E%7Bk%2B1%7D%3D%5Carg%5Cmin_x+%5C+L%28x%2C%5Clambda%5Ek%29%5C%5C+step2%3A+%5C+%5C+%5C+%5Clambda%5E%7Bk%2B1%7D+%3D+%5Clambda%5Ek%2B%5Crho%28Ax%5E%7Bk%2B1%7D-b%29"></p>

<p>对偶上升法其实很好理解,它把 <img alt="\max_{\lambda}\min_{x}L(x,\lambda)" class="has" src="https://www.zhihu.com/equation?tex=%5Cmax_%7B%5Clambda%7D%5Cmin_%7Bx%7DL%28x%2C%5Clambda%29"> ,也就是 <img alt="\max_{\lambda}(\min_{x}L(x,\lambda))" class="has" src="https://www.zhihu.com/equation?tex=%5Cmax_%7B%5Clambda%7D%28%5Cmin_%7Bx%7DL%28x%2C%5Clambda%29%29"> 拆成了两步:</p>

<p>第一步是固定对偶变量 <img alt="\lambda" class="has" src="https://www.zhihu.com/equation?tex=%5Clambda+"> ,求解<img alt="\min_xL(x,\lambda)" class="has" src="https://www.zhihu.com/equation?tex=%5Cmin_xL%28x%2C%5Clambda%29"> 。</p>

<p>第二步固定住变量 <img alt="x" class="has" src="https://www.zhihu.com/equation?tex=x"> ,像众所周知的梯度下降法那样操作,只不过这里是arg max 问题所以变成了上升法。</p>

<p>&nbsp;</p>

<p>后来有人嫌弃这个Lagrange函数还不够凸,又对约束增加一个惩罚项,变成增广拉格朗日函数</p>

<p><img alt="L(x,\lambda) = f(x)+\lambda^T(Ax-b)+\frac{\rho}{2}\|Ax-b\|^2\\" class="has" src="https://www.zhihu.com/equation?tex=L%28x%2C%5Clambda%29+%3D+f%28x%29%2B%5Clambda%5ET%28Ax-b%29%2B%5Cfrac%7B%5Crho%7D%7B2%7D%5C%7CAx-b%5C%7C%5E2%5C%5C"></p>

<p>这样就迈向更凸,算法也更强啦~</p>

<p>所以老师那句话什么来着,我凸了,也变强了。。。。</p>

<p>&nbsp;</p>

<p>4)ADMM的流程:</p>

<p>ADMM的想法跟上面的思路就很一致啦,作为一个primal-dual原对偶方法,首先,它要有个对偶函数,也就是增广拉格朗日函数:</p>

<p><img alt="L(x,z,\lambda)=f(x)+g(z)+\lambda^T(Ax+Bz-c)+\frac{\rho}{2}\|Ax+Bz-c\|^2" class="has" src="https://www.zhihu.com/equation?tex=L%28x%2Cz%2C%5Clambda%29%3Df%28x%29%2Bg%28z%29%2B%5Clambda%5ET%28Ax%2BBz-c%29%2B%5Cfrac%7B%5Crho%7D%7B2%7D%5C%7CAx%2BBz-c%5C%7C%5E2"></p>

<p>然后,它像对偶上升法一样分别固定另外两个变量,更新其中一个变量:(也就是其名:交替方向)</p>

<p><img alt="step1:\ \ \ \ \ \ \  \  x^{k+1}=\arg\min_x \ L(x,z^{k},\lambda^k)\\  step2:\ \ \ \ \  z^{k+1}=\arg\min_z \ L(x^{k+1},z,\lambda^k)\\  step3: \lambda^{k+1} = \lambda^k+\rho(Ax^{k+1}+Bz^{k+1}-c)" class="has" src="https://www.zhihu.com/equation?tex=step1%3A%5C+%5C+%5C+%5C+%5C+%5C+%5C++%5C++x%5E%7Bk%2B1%7D%3D%5Carg%5Cmin_x+%5C+L%28x%2Cz%5E%7Bk%7D%2C%5Clambda%5Ek%29%5C%5C++step2%3A%5C+%5C+%5C+%5C+%5C++z%5E%7Bk%2B1%7D%3D%5Carg%5Cmin_z+%5C+L%28x%5E%7Bk%2B1%7D%2Cz%2C%5Clambda%5Ek%29%5C%5C++step3%3A+%5Clambda%5E%7Bk%2B1%7D+%3D+%5Clambda%5Ek%2B%5Crho%28Ax%5E%7Bk%2B1%7D%2BBz%5E%7Bk%2B1%7D-c%29"></p>

<p>重复直到不怎么变化了,也就是收敛了。。。</p>

<p>至于怎么求解 <img alt="\arg\min L" class="has" src="https://www.zhihu.com/equation?tex=%5Carg%5Cmin+L"> ,因为无约束,梯度下降法啊,牛顿法啊等等都可以~其实就是大循环里嵌套的小循环,step1~3是大循环,求解里面的 <img alt="\arg\min L" class="has" src="https://www.zhihu.com/equation?tex=%5Carg%5Cmin+L"> 是小循环。</p>

<p>&nbsp;</p>

<p>5)其他一些杂七杂八的话:</p>

<p>ADMM相当于把一个大的问题分成了两个子问题,缩小了问题的规模,分而治之(?)</p>

<p>实际上有些算法用ADMM的思路,你看从ALM到ADMM相当于增加一个变量z,增加一个step就大大提升了算法性能,如果我再增加一个变量一个step呢~?但有工作指出理论上只有两个block的ADMM能够保证收敛(忘记在哪里看到的,不对的话,我就把这句话删掉!)</p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p>&nbsp;</p>                                    </div>
                    </div>

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