08-ADMM算法

凸优化从入门到放弃完整教程地址:https://www.cnblogs.com/nickchen121/p/14900036.html

ADMM最基本情形的推导还是比较经典的。这里介绍这份著名讲义里的treatment:

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.


一、ADMM 算法动机

这里简单讲个例子,在深度学习中,样本的维度 \(d\) 是非常大的,如果我们直接对这种大维度的样本构建目标函数 \(f(x)\),是不容易求解的。

因此我们可以考虑是否可以把 \(x\) 拆分成 \(x_1,x_2,\cdots,x_N\),也就是把目标函数分割成多个目标函数 \(f_{()x_1)},f_{(x_2)},\cdots,f_{(x_N)}\),然后我们先最小化 \(f_{(x_1)}\),之后在最小化 \(f_{(x_2)}\),甚至可以对这个多个目标函数进行分布式优化。

二、对偶问题

原问题:

\[\begin{align}
\min \quad & f(x) \\
s.t. \quad & Ax=b
\end{align}
\]

拉格朗日函数:\(L(x,y) = f(x) + y^T(Ax-b)\)

对偶函数:\(g(y) = \inf_x L(x,y) \leq f(x)\)

对偶问题:\(\max_y g(y)\)

最优解:

\[\begin{align}
& x^* = \underset{x}{argmin} \quad L(x,y^*) \\
& y^* = \underset{y}{argmax} \quad g(y)
\end{align}
\]

三、对偶上升法

对偶变量 \(y\) 迭代更新:\(y^{k+1} = y^k + \alpha^k \nabla g(y^k)\),其中

\[\begin{align}
\nabla g(y^k) &= \nabla_y(L(\hat x,y^k)) \\
& = \nabla_y(f(\hat x) + (y^k)^T(A \hat x -b)) \\
& = A\hat x -b
\end{align}
\]

上述公式中 \(\hat x = \underset{x}{argmin} L(x,y^k)\)

变量和对偶变量更新的步骤:

  1. $x^{k+1} = \underset{x}{argmin} L(x,y^k)\quad \text{变量 \(x\)的更新}$
  2. $y^{k+1} = y^k + \alpha^k (Ax^{k+1}-b)\quad \text{对偶变量 \(y\) 的更新}$

注:如果 \(f(x)\) 是线性的,可以看到 \(L(x,y)\) 基本无下界,也就是说 \(x\) 的更新不可以求解,这是未来使用增广拉格朗日函数的原因之一

四、对偶分割

对偶分割简单点说,就是假设目标函数可分,则对偶函数同样可分,这里给出简单的证明。

假设 \(f\) 可分,也就是说目标函数 \(f(x) = \sum_{i=1}^N f_i(x_i)\),约束条件 \(Ax = [A_1,A_2,\cdots,A_N]x=A_1x,A_2x,\cdots,A_Nx\)

通过上述的假设,则对偶函数 \(L(x,y)\) 可以通过下式表达:

\[\begin{align}
L(x,y)
& = \sum_{i=1}^N f_i(x_i) + y^T (\sum_{i=1}^N A_ix_i-b) \\
& = \sum_{i=1}^N (f_i(x_i)+y^T A_ix_i) - y^Tb \\
& = \sum_{i=1}^N L_i(x,y) - y^Tb
\end{align}
\]

从上述推导可以看出,对偶函数 \(L(x,y)\) 同样可分。

也就是说,在对 \(x\) 进行 \(argmin\) 的时候,可以分布式处理 \(x\):\(x_i^{k+1} = \underset{x_i}{argmin} \quad L_i(x_i,y^k)\)

五、乘子法(增广拉格朗日函数)

前面讲对偶上升法的时候讲到,\(f(x)\) 线性时更新时可能无法求解,因此把拉格朗日函数变成增广拉格朗日函数,即在拉格朗日函数的基础上加上惩罚因子 \(\frac{\rho}{2} \|Ax-b\|_2^2\),让拉格朗日函数更加光滑、稳定,并且解决 \(f(x)\) 线性无法求解的问题,也就是为了不需要 \(f(x)\) 一定要是严格凸的。

增广拉格朗日函数:\(L(x,y) = f(x) + y^T(Ax-b) + \frac{\rho}{2}\|Ax-b\|_2^2\)

进而上述对偶上升法变量的更新将会变成:

\[x^{k+1} = \underset{x}{argmin}\quad L_\rho(x,y^k) \\
y^{k+1} = y^k + \rho(Ax^{k+1}-b)
\]

5.1 步长为 \(\rho\) 的好处

这里通过简单地公式推导证明下使用步长 \(\rho\) 的优点。

对于优化问题:

\[\begin{align}
min & \quad f(x) \\
s.t. & \quad Ax=b
\end{align}
\]

它的 KKT 条件为:

\[\begin{align}
& Ax^*-b = 0\\
& \nabla f(x^*) + A^Ty=0
\end{align}
\]

现在我们更新变量 \(x\),即 \(\underset{argmin}{x} L_\rho (x^{k+1},y^k)\),有如下推导:

\[\begin{align}
0
& = \nabla_x L_\rho (x^{k+1},y^k) \\
& = \nabla_x f(x^{k+1}) + A^Ty^k + \rho A^T (Ax^{k+1}-b) \\
& = \nabla_x f(x^{k+1}) + A^T[y^k+\rho (Ax^{k+1}-b)] \\
& = \nabla_x f(x^{k+1}) + A^T y^{k+1}
\end{align}
\]

从上述推导,可以看出步长选择 \(\rho\) ,在找 \(x^{k+1}\) 的时候,也就是 \((x^{k+1},y^{k+1})\) 自然而然的满足了 KKT 条件。

注:使用了增广拉格朗日函数后,虽然求解更加稳定,但是由于惩罚项中有交叉项,如 \(x_1×x_2\),导致拉增广格朗日函数不可以对偶分割,因此无法做到分布式处理。因此有了 ADMM 算法,结合了对偶上升法的变量和对偶变量的交叉迭代更新和增广拉格朗日函数的稳定性

六、ADMM算法

为了整合对偶上升法的可分解性与乘子法优秀的收敛性质,人们就又提出了改进形式的优化 ADMM。目的就是想能分解原函数和扩增函数,以便于在对 \(f\) 更一般的假设条件下并行优化。所以 ADMM 是又想引入新变量,然后又想通过交叉更换方向进而交替优化。

ADMM 算法求解 2-block 的凸优化问题的形式如下(n-block 就是 n 个变量,但是 3-block 以上的问题性质会差很多):

\[\begin{align}
\min ~ & f(x)+g(z)\\
s.t. ~ & Ax+Bz=C
\end{align}
\]

从上面 ADMM 算法的形式可以看出,它的思想就是想把 primal 变量、目标函数拆分,但是不再像对偶上升方法那样,将拆分开的 \(x_i\) 都看做是 \(x\) 的一部分,后面融合的时候还需要融合在一起,而是最先开始就将变量分别看做是不同的变量 \(x\) 和 \(z\),同时约束条件也如此处理,这样的好处就是后面不需要一起融合 \(x\) 和 \(z\) ,保证了前面优化过程的可分解性(每次只优化不同的变量)。

ADMM 算法的增广拉格朗日函数:\(L_{\rho}(x,z,y)=f(x)+g(z)+y^T(Ax+Bz-c)+(\rho/2)\|Ax+Bz-c\|_2^2\)

ADMM 算法的变量更新:

\[\begin{align}
x^{k+1}:=~ & \arg\min_{x} L_{\rho}(x,z^k,y^k)\\
z^{k+1}:=~ & \arg\min_{z} L_{\rho}(x^{k+1},z,y^k)\\
y^{k+1}:= ~ & y^k+\rho(Ax^{k+1}+Bz^{k+1}-c).
\end{align}
\]

6.1 ADMM 的 scaled form 形式

注:ADMM 的 scaled form 形式本质上就是对对偶变量做了处理,并且定义了残差,通过残差可以更易于判别 ADMM 算法的收敛性

假设 \(r = Ax+Bz-C,\quad u=\frac{y}{\rho}\)

进而可以得到新的增广拉格朗日函数:

\[\begin{align}
L_\rho
& = f(x)+g(z)+y^(r)+\frac{\rho}{2}\|r\|_2^2 \\
& = f(x) + g(z) + \frac{\rho}{2}\|r+\frac{y}{\rho}\|_2^2 - \frac{1}{2\rho}\|y\|_2^2 \\
& = f(x) + g(z) + \frac{\rho}{2}\|r+u\|_2^2 - \frac{\rho}{2}\|u\|_2^2 \\

\end{align}
\]

由此 ADMM 算法将被改写成:

\[\begin{align}
x^{k+1}:=~ & \arg\min_{x} \left\{ f(x)+\frac{\rho}{2}\|Ax+Bz^k-c+u^k\|_2^2 \right\}\\
z^{k+1}:=~ & \arg\min_{z} \left\{ g(z)+\frac{\rho}{2}\|Ax^{k+1}+Bz-c+u^k\|_2^2 \right\}\\
u^{k+1}:= ~ & u^k+Ax^{k+1}+Bz^{k+1}-c
\end{align}
\]

上述这个形式就比前面那个更简洁,我们一般叫前一种形式为ADMM的unscaled形式,而这种则是scaled形式了。并且很多ADMM分析都是基于这个scaled形式的。

上述\(u\) 为scaled scaled dual variable, \(r\) 可以理解为对偶变量 \(u\) 的每一步迭代的残差,而 \(u^k = u^0 + \sum_{j=1}^k r^j\) 定义为残差和。


七、ADMM的收敛性证明思路

在两个不太强的假设前提下,本节给出ADMM基本形式的收敛性证明的思路。

假设1: 凸函数\(f,g\) 是closed和proper的。

假设2:(非增广)拉格朗日函数 \(L_0\) 至少有一个鞍点(saddle point)。

假设1等价于epigraph \(\{(x,t)\in \mathbb{R}^n\times\mathbb{R}:f(x)\leq t\}, \{(z,s)\in \mathbb{R}^m\times\mathbb{R}:g(z)\leq s\}\) 都是非空的闭凸集(closed nonempty convex set),也就是说 \(\arg\min_{x} L_{\rho}(x,z^k,y^k)\) , $ \arg\min_{z} L_{\rho}(x{k+1},z,yk)$ 的解一定是存在的。注意,这个假设仍然没有限制 \(f,g\) 一定要是可微(differentiable)的,如果 \(f,g\)不可微,可以考虑使用次梯度。

假设2 可以这样解释鞍点的作用:假设 \((x^*,y^*,z^*)\) 为鞍点,则会有 \(L_0(x^*,z^*,y)\leq L_0(x^*,z^*,y^)* \leq L_0(x,z,y^*)\),毫无疑问,这个不等式是一定成立的,也就是说在 \((x^*,y^*,z^*)\) 这个点有一个方向更大,另一个方向更小,满足鞍点的性质,进而推出 \(L_0\) 必有一个鞍点。从而说明了 ADMM 算法是可解的。

基于这两个假设,我们证明如下结果:

  • 目标函数值收敛。随着 \(k\rightarrow\infty, ~ f(x^k)+g(z^k)\rightarrow p^*.\) 也就是说最终我们的目标函数值是最优的。
  • 对偶变量收敛。随着 \(k\rightarrow\infty, ~ y^k\rightarrow y^*.\) 也就是最终对偶变量的值收敛到某个对偶变量的最优解。
  • 残差收敛。随着 \(k\rightarrow\infty, ~ r^k\rightarrow 0.\) 也就是说最终我们的解是可行(feasible)的。

八、写在最后

事实上,实际当中你如果写代码跑ADMM会发现它不像那些梯度下降,牛顿法,很容易快速收敛到一个较高的误差精度,ADMM实际的收敛速度往往比那些算法慢得多。ADMM的主要应用,主要是在解空间规模非常大的情况下(比如 \(A,B\) 都是存储空间上GB的矩阵),这个时候很多传统的方法不好用,强制需要分块求解,而且对解的绝对精度往往要求也没那么高。当然,然后你还得祈祷在primal space上argmin那个迭代的形式比较简单。

08-ADMM算法的更多相关文章

  1. python学习08排序算法举例

    '''''''''排序算法:前提是所有数按照从小到大的顺序排列.1.冒泡算法将第一数与第二个数比较大小,如果第一个数比第二个数大,则沉底(交换位置,使大数在小数后面,这个过程类似于大泡沉底的过程) ' ...

  2. ADMM与one-pass multi-view learning

    现在终于开始看论文了,机器学习基础部分的更新可能以后会慢一点了,当然还是那句话宁愿慢点,也做自己原创的,自己思考的东西.现在开辟一个新的模块----多视图学习相关论文笔记,就是分享大牛的paper,然 ...

  3. 关于ADMM的研究(二)

    关于ADMM的研究(二) 4. Consensus and Sharing 本节讲述的两个优化问题,是非常常见的优化问题,也非常重要,我认为是ADMM算法通往并行和分布式计算的一个途径:consens ...

  4. 关于ADMM的研究(一)

    关于ADMM的研究(一) 最近在研究正则化框架如何应用在大数据平台上.找到了<Distributed Optimization and Statistical Learning via the ...

  5. LeetCode算法题-Set Mismatch(Java实现)

    这是悦乐书的第279次更新,第295篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第147题(顺位题号是645).集合S最初包含从1到n的数字. 但不幸的是,由于数据错误 ...

  6. 交替方向乘子法(ADMM)

    交替方向乘子法(ADMM) 参考1 参考2 经典的ADMM算法适用于求解如下2-block的凸优化问题( 是最优值,令 表示一组最优解): Block指我们可以将决策域分块,分成两组变量, 这里面 都 ...

  7. LeetCode算法题-Power of Four(Java实现-六种解法)

    这是悦乐书的第205次更新,第216篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第72题(顺位题号是342).给定一个整数(带符号的32位),写一个函数来检查它是否为4 ...

  8. LeetCode算法题-Contains Duplicate(Java实现)

    这是悦乐书的第192次更新,第196篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第52题(顺位题号是217).给定一个整数数组,查找数组是否包含任何重复项.如果数组中至 ...

  9. 对偶上升法到增广拉格朗日乘子法到ADMM

    对偶上升法 增广拉格朗日乘子法 ADMM 交替方向乘子法(Alternating Direction Method of Multipliers,ADMM)是一种解决可分解凸优化问题的简单方法,尤其在 ...

  10. Alternating Direction Method of Multipliers -- ADMM

    前言: Alternating Direction Method of Multipliers(ADMM)算法并不是一个很新的算法,他只是整合许多不少经典优化思路,然后结合现代统计学习所遇到的问题,提 ...

随机推荐

  1. BUAA OS实验调试指南:从看懂到看开

    一般的调试流程其实很简单:发现问题,稳定复现,确定临界条件,定位问题,修复问题,核查结果.迭代这个过程,形成一个闭环 老实说,OS的实验代码,开箱体验极差,程序跳来跳去,进了Lab4后还要考虑内核态切 ...

  2. Swift系列七 - 汇编分析值类型

    通过汇编分下值类型的本质. 一.值类型 值类型赋值给var,let或者给参数传参,是直接将所有内容拷贝一份.类似于对文件进行复制粘贴操作,产生了全新的文件副本,属于深拷贝(deep copy). 示例 ...

  3. 用JIRA管理你的项目——(三)基于LDAP用户管理

    JIRA提供了基于LDAP方式的用户管理,也就是用户密码的管理交给LDAP,而JIRA只管理用户在系统中的角色. 要打开JIRA的LDAP设置,首先需要验证下你的LDAP服务是否正常! 几乎有所有的L ...

  4. 【转载】让KVM虚机能使用音箱与麦克风(vnc及ac97)

    让KVM虚机能使用音箱与麦克风(vnc及ac97) 原 tantexian 发布于 2016/02/29 16:32 字数 462 阅读 164 收藏 0 点赞 1 评论 0 为什么80%的码农都做不 ...

  5. gitbook安装使用教程

    以下是gitbook的简略安装使用过程,可以参考一下.后续有时间我再回头修改完善实验目的:安装gitbook后,将相关的文件发布到gitlab上安装node.js在cmd下执行安装npm instal ...

  6. linux 进程信号集合 sigset_t -(转自linengeir的专栏)

    sigset_t 号集及信号集操作函数:信号集被定义为一种数据类型: typedef struct { unsigned long sig[_NSIG_WORDS]: } sigset_t 信号集用来 ...

  7. shell 正则匹配IP地址

    比如255.255.255.255 ,共4段,我们将255分为四个部分,0-99,100-199,200-249,250-255 0-99:[1-9]?[0-9]               #    ...

  8. Day_04_xml解析

    xml解析:操作xml文档,将文档中的数据读取到内存中 操作xml文档的方式有两种: 1.解析(读取):将文档中的数据读取到内存中 2.写入:将内存中的数据保存到xml文档中(后期用的并不多) 解析x ...

  9. 创建一个本地Yum 仓库,提升速度,减少带宽

    1 mkdir /YUM 2 mount -t iso9660 -o loop /home/dan/Centos-7-x86_x64-DVD.iso /mnt/iso/ 3 rpm -ivh delt ...

  10. Splunk 8.2.0 发布 (macOS, Linux, Windows)

    强烈鄙视 CSDN 用户 CIAS(账号:hanzheng260561728),盗用本站资源,删除原文链接,并且用于收费下载!!! 请访问原文链接:https://sysin.org/article/ ...