zoukankan      html  css  js  c++  java
  • [Algorithm]ADMM简明理解

    问题来源

    在读论文的时候,遇到了ADMM(交替方向乘子法)算法,不明所以,于是查了一下,大概是一个凸优化算法,下面大概讲一下其原理和过程。

    简介

    交替方向乘子法(ADMM)是一种求解具有可分离的凸优化问题的重要方法,由于处理速度快,收敛性能好,ADMM算法在统计学习、机器学习等领域有着广泛应用。

    文献来源

    Boyd S, Parikh N, Chu E, et al. Distributed optimization and statistical learning via the alternating direction method of multipliers[J]. Foundations and Trends® in Machine learning, 2011, 3(1): 1-122.

    凸优化问题

    首先正常的优化问题为:

    [min_x f(x) ]

    这是最简单的优化问题,其中 x 是优化变量,也就是可以改变的数值,通过调节 x 的大小,使得目标函数 f(x) 的数值达到最小。值得注意的是,x的值并一定是数值,也可能是向量或者矩阵。

    像上式那样,只有函数,对于变量 x没有要求,其实是最简单的一类优化问题:无约束优化问题。那么什么是凸优化问题呢,对应凸函数下的带约束的问题便是凸优化问题,凸函数的一个显著特征是该函数上的任意两点的连线都在该函数之上,在二维上最简单的凸函数即为: $$ y=x^2 $$ 在三维图像上可以理解为形状为山谷的函数。

    实际上x不可能完全没有约束条件,否则那样的话我们直接通过求解函数的导数便可以找到最优解。实际问题往往会对x做一些约束,一共有两种约束:

    1. 等式约束: (subject to Ax=b)
    2. 不等式约束:(subject to Ax <= b)

    其中等式约束时要求x满足一定的等式,实际上任何复杂的等式约束都可以化简为上述的形式,进行求解。不等式约束也很容易理解,往往是某些约束的最低值或者最高值。如果同时有最低和最高,可拆成两个不等式。

    基于以上的理解,一个包含等式约束的凸优化问题应该是这样的:

    [min_x f(x) ]

    [sub.to Ax = b ]

    ADMM算法

    解决的问题

    ADMM算法解决的是两个变量下的优化问题,从原来问题的一个变量,变为两个变量,实际上任意个变量的问题都可以拆解为2变量问题?那么上面的优化公式就变为了:

    [min_{x,z} f(x)+g(z) ]

    [sub.to Ax+Bz=b ]

    这也就意味着ADMM算法解决的是一个等式约束的问题,且该问题两个函数f(x)和g(x)是成线性加法的关系。这意味着两者实际上是整体优化的两个part,两者的资源占用符合一定等式,对整体优化贡献不同,但是是简单加在一起的。

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

    使用的方法

    与ADMM最为相关的大概就是原始对偶方法中的增广拉格朗日法(ALM)。拉格朗日函数实际上是解决多个约束条件下的优化问题的,这种方法可以将一个有n个变量与k个约束条件的最优化问题转换为一个解有n + k个变量的方程组的解的问题。构造拉格朗日函数的方法在一般的高等数学教材里也可以找到。而增广拉格朗日法是加了惩罚项的拉格朗日法,目的是使得算法收敛的速度更快。

    那么对上述的简单的凸优化问题构造拉格朗日函数,便可以得到:

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

    原来带约束求解 (min_x f(x)) ,现在求解对偶问题 (max_{lambda}min_{x}L(x,lambda)),两个问题的最优解等价,并且没有了约束条件。
    然后使用对偶上升法,得到:

    [ step1: x ^{k+1} = arg min_x L(x;lambda^{k}) \ step2: lambda ^{k+1} = lambda^{k} + ho (Ax^{k+1} - b) ]

    对偶上升法实际上是将:

    [max_{lambda}min_{x}L(x,lambda) ]

    拆成了两步,第一步,先固定(lambda)然后求解

    [min_x L(x;lambda) ]

    将求解后的x代入到拉格朗日函数当中,用类似于梯度下降的方法,得到(lambda)的更新公式。

    有时候为了加快算法收敛速度,会再增加一些惩罚项来加快收敛,于是就有了增广拉格朗日:

    [L(x;lambda)= f(x) + lambda ^T(Ax - b) + ho/2 * ||Ax -b ||^2 ]

    ADMM

    ADMM其实也是一直增广拉格朗日函数,只不过由一个变量变为了两个变量,那么对应的ADMM就成为了

    [L(x,z;lambda)= f(x) + g(z) + lambda ^T(Ax + Bz - c) + ho/2 * ||Ax + Bz -c ||^2 ]

    那么,使用和增广拉格朗日类似的方法,固定其中两个变量,去更新第三个变量的值,于是便有:

    [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 + ho (Ax + Bz - c) \ ]

    于是问题就变化为了如何求解(arg min_x L),那么就可以很开心地使用梯度下降法了。

  • 相关阅读:
    memcached与redis的一些区别小结
    ubuntu下定时任务
    hdu4135 容斥定理
    hdu1251 统计难题 字典树
    hdu1710 Binary Tree Traversals(二叉树的遍历)
    Codeforces Round #364 (Div. 2) B. Cells Not Under Attack
    KMP算法 hdu4686 Oulipo
    判断字符串是否在字典里
    floyd算法 poj2253
    最短路径dijkstra算法
  • 原文地址:https://www.cnblogs.com/wildkid1024/p/11041756.html
Copyright © 2011-2022 走看看