08-ADMM算法
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)}\),甚至可以对这个多个目标函数进行分布式优化。
二、对偶问题
原问题:
\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)\)
最优解:
& 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)\),其中
\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)\)
变量和对偶变量更新的步骤:
- $x^{k+1} = \underset{x}{argmin} L(x,y^k)\quad \text{变量 \(x\)的更新}$
- $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)\) 可以通过下式表达:
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\)
进而上述对偶上升法变量的更新将会变成:
y^{k+1} = y^k + \rho(Ax^{k+1}-b)
\]
5.1 步长为 \(\rho\) 的好处
这里通过简单地公式推导证明下使用步长 \(\rho\) 的优点。
对于优化问题:
min & \quad f(x) \\
s.t. & \quad Ax=b
\end{align}
\]
它的 KKT 条件为:
& Ax^*-b = 0\\
& \nabla f(x^*) + A^Ty=0
\end{align}
\]
现在我们更新变量 \(x\),即 \(\underset{argmin}{x} L_\rho (x^{k+1},y^k)\),有如下推导:
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 以上的问题性质会差很多):
\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 算法的变量更新:
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}\)
进而可以得到新的增广拉格朗日函数:
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 算法将被改写成:
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算法的更多相关文章
- python学习08排序算法举例
'''''''''排序算法:前提是所有数按照从小到大的顺序排列.1.冒泡算法将第一数与第二个数比较大小,如果第一个数比第二个数大,则沉底(交换位置,使大数在小数后面,这个过程类似于大泡沉底的过程) ' ...
- ADMM与one-pass multi-view learning
现在终于开始看论文了,机器学习基础部分的更新可能以后会慢一点了,当然还是那句话宁愿慢点,也做自己原创的,自己思考的东西.现在开辟一个新的模块----多视图学习相关论文笔记,就是分享大牛的paper,然 ...
- 关于ADMM的研究(二)
关于ADMM的研究(二) 4. Consensus and Sharing 本节讲述的两个优化问题,是非常常见的优化问题,也非常重要,我认为是ADMM算法通往并行和分布式计算的一个途径:consens ...
- 关于ADMM的研究(一)
关于ADMM的研究(一) 最近在研究正则化框架如何应用在大数据平台上.找到了<Distributed Optimization and Statistical Learning via the ...
- LeetCode算法题-Set Mismatch(Java实现)
这是悦乐书的第279次更新,第295篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第147题(顺位题号是645).集合S最初包含从1到n的数字. 但不幸的是,由于数据错误 ...
- 交替方向乘子法(ADMM)
交替方向乘子法(ADMM) 参考1 参考2 经典的ADMM算法适用于求解如下2-block的凸优化问题( 是最优值,令 表示一组最优解): Block指我们可以将决策域分块,分成两组变量, 这里面 都 ...
- LeetCode算法题-Power of Four(Java实现-六种解法)
这是悦乐书的第205次更新,第216篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第72题(顺位题号是342).给定一个整数(带符号的32位),写一个函数来检查它是否为4 ...
- LeetCode算法题-Contains Duplicate(Java实现)
这是悦乐书的第192次更新,第196篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第52题(顺位题号是217).给定一个整数数组,查找数组是否包含任何重复项.如果数组中至 ...
- 对偶上升法到增广拉格朗日乘子法到ADMM
对偶上升法 增广拉格朗日乘子法 ADMM 交替方向乘子法(Alternating Direction Method of Multipliers,ADMM)是一种解决可分解凸优化问题的简单方法,尤其在 ...
- Alternating Direction Method of Multipliers -- ADMM
前言: Alternating Direction Method of Multipliers(ADMM)算法并不是一个很新的算法,他只是整合许多不少经典优化思路,然后结合现代统计学习所遇到的问题,提 ...
随机推荐
- C#常见的文件路径Api
我们经常有遇到要处理文件路径的需求,那么一般我们常见的有几种: 程序下面的文件 临时目录下的文件 获取程序下面的文件 首先我们创建了实例解决方案: 其中调用链是:Main.Shell->FooA ...
- 03.14 ICPC训练联盟周赛,Preliminaries for Benelux Algorithm Programming Contest 2019
A .Architecture 题意:其实就是想让你找到两行数的最大值,然后比较是否相同,如果相同输出'possible',不同则输出'impossible' 思路:直接遍历寻找最大值,然后比较即可 ...
- stm32开发笔记(二):stm32系列使用V3.5固件库的帮助文件以及GPIO基本功能(一)
前言 stm32系列是最常用的单片机之一,不同的版本对应除了引脚.外设.频率.容量等'不同之外,其开发的方法是一样的. 本章讲解使用库函数使用GPIO引脚功能. 补充 本文章为多年前学习 ...
- 如何理解PaaS平台,与SaaS、IaaS有什么区别?
我们经常会看到SaaS.PaaS.IaaS,但总是会摸不着头脑,有的人甚至会以为是恐怖组织的代号.其实,无论是SaaS.PaaS还是IaaS,都代表的是某一种服务,比如SaaS的含义为"软件 ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(十三)——istio+dapr构建多运行时服务网格之生产环境部署
之前所有的演示都是在docker for windows上进行部署的,没有真正模拟生产环境,今天我们模拟真实环境在公有云上用linux操作如何实现istio+dapr+电商demo的部署. 目录:一. ...
- 如何解决在WordPress安装Redis插件时需要输入FTP问题?
用LAMP或者LNMP搭建Worepress的时候,安装主题或者插件时候,往往提示需要输入FTP服务端信息的问题,其实这是一个坑,可以完全避免的 我们只需在wp-config.php文件最后添加以下代 ...
- Java中JDK,JRE和JVM之间的关系-(转载)
初学JAVA很容易被其中的很多概念弄的傻傻分不清楚,首先从概念上理解一下吧,JDK(Java Development Kit)简单理解就是Java开发工具包,JRE(Java Runtime Envi ...
- IDEA 自定义文件头注释
什么是 IDEA 自定义文件头注释 IDEA 自定义文件头注释指的是创建 Java 类文件时,IDEA 可以自动设置文件头的注释信息,如下: 如何设置 IDEA 自定义文件头注释 打开 File-&g ...
- 8.8-9 fsck、dd
8.8 fsck:检查并修复Linux文件系统 fsck命令用于检查并修复文件系统中的错误,即针对有问题的系统或磁盘进行修复,类似的命令还有e2fsck命令.有关fsck的使用需要特别注意的是: ...
- 『动善时』JMeter基础 — 24、JMeter中使用“用户参数”实现参数化
目录 1.用户参数组件介绍 2.用户参数界面介绍 3.使用"用户参数"组件实现参数化 (1)测试计划内包含的元件 (2)线程组元件内容 (3)HTTP请求组件内容 (4)用户参数组 ...