zoukankan      html  css  js  c++  java
  • 交替方向乘子法(ADMM)的原理和流程的白话总结

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

    作者:大大大的v
    链接:https://www.zhihu.com/question/36566112/answer/118715721
    来源:知乎
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
     

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

    1) 优化问题是什么:

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

    min_xquad f(x)\

    其中 x 是优化变量,也就是可以改变的数值,通过调节 x 的大小,使得目标函数 f(x) 的数值达到最小。

    像(1)式那样,只有函数,对于变量 x 没有要求的话,其实是最简单的一类优化问题:无约束优化问题(我们只考虑凸问题的情况下,如果你不知道什么是凸问题的话,没关系,那不重要,只要记住越凸越好=凸=)。

    实际上我们对于优化变量 x 可能会有很多要求:

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

    等式约束: subject. to  quad Ax=b

    不等式约束: subject. to quad Axleqslant b

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

    min_xquad f(x)\sub.to quad Ax=b

    2)ADMM解决什么优化问题:

    min_{x,z}quad f(x)+g(z)\sub.toquad Ax+Bz=c

    也就意味着ADMM通常解决的是等式约束的优化问题,而且这个优化问题还有两个优化变量 x 跟 z !

    回到刚刚找男朋友的问题上来,如果之前我们只考量学历因素 x 的话,现在我们还要考量颜值因素 z!而且这两个变量之间还是有等式关系的!(至于这个关系。。。大概就是那个什么学历越高,颜值就越。。。=凸=,荒谬,荒谬至极!)

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

    3)解决优化问题的方法:

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

    对偶方法:把公式2中的minimize问题与约束条件sub to通过一个对偶变量 lambda 耦合在一起,形成一个叫做Lagrange函数的东西:

    L(x,lambda) = f(x)+lambda^T(Ax-b)\

    原来带约束求解 min_x f(x) ,现在求解对偶问题 max_{lambda}min_{x}L(x,lambda) ,两个问题的最优解等价(原问题凸的情况下。为什么?公式好多,我再想想(查查)有没有什么直观的解释),而且现在没了约束,岂不美哉(❁´◡`❁)*✲゚*

    方法是对偶上升法:

    step1:      x^{k+1}=argmin_x  L(x,lambda^k)\ step2:    lambda^{k+1} = lambda^k+
ho(Ax^{k+1}-b)

    对偶上升法其实很好理解,它把 max_{lambda}min_{x}L(x,lambda) ,也就是 max_{lambda}(min_{x}L(x,lambda)) 拆成了两步:

    第一步是固定对偶变量 lambda ,求解min_xL(x,lambda) 。

    第二步固定住变量 x ,像众所周知的梯度下降法那样操作,只不过这里是arg max 问题所以变成了上升法。

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

    L(x,lambda) = f(x)+lambda^T(Ax-b)+frac{
ho}{2}|Ax-b|^2\

    这样就迈向更凸,算法也更强啦~

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

    4)ADMM的流程:

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

    L(x,z,lambda)=f(x)+g(z)+lambda^T(Ax+Bz-c)+frac{
ho}{2}|Ax+Bz-c|^2

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

    step1:          x^{k+1}=argmin_x  L(x,z^{k},lambda^k)\  step2:      z^{k+1}=argmin_z  L(x^{k+1},z,lambda^k)\  step3: lambda^{k+1} = lambda^k+
ho(Ax^{k+1}+Bz^{k+1}-c)

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

    至于怎么求解 argmin L ,因为无约束,梯度下降法啊,牛顿法啊等等都可以~其实就是大循环里嵌套的小循环,step1~3是大循环,求解里面的 argmin L 是小循环。

    5)其他一些杂七杂八的话:

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

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

  • 相关阅读:
    JAVA中的流-简介(二)
    JAVA中的流-简介(一)
    Java中内部类简介
    应用小练习-自定义栈
    集合知识点(二)
    集合知识点(一)
    JAVA中的正则表达式简介
    从头文件中学习sfr和sbit
    PCB中实现元器件旋转一个角度放置
    DXP中插入LOGO字体方法(2)
  • 原文地址:https://www.cnblogs.com/think90/p/11492368.html
Copyright © 2011-2022 走看看