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)算法并不是一个很新的算法,他只是整合许多不少经典优化思路,然后结合现代统计学习所遇到的问题,提 ...
随机推荐
- Spring Cloud Gateway + Nacos(1)简单配置
当初我学习时候就是参考这位大佬的博客: Nacos集成Spring Cloud Gateway 基础使用 现在学习到spring cloud alibaba 使用nacos做服务中心,dubbo做通信 ...
- 判断标准I/O的缓冲区类型
#include <stdio.h> void pr_stdio(const char *, FILE *); int main() { FILE *fp; fputs("ent ...
- 加载usbserial驱动后,为什么adb不可用了?
某设备提供了USB串口功能,上位机(Host端)可以通过USB串口与之通信.对于Linux上位机,比如Ubuntu,自带usbserial驱动,当安装usbserial驱动后,上位机就会生成ttyU ...
- Nginx——Docker下安装部署
前言 Nginx 是一个高性能的 HTTP 和反向代理 web 服务器,同时也提供了 IMAP/POP3/SMTP 服务 . 一. 环境说明 docker: 18.09.9-ce nginx: 1.1 ...
- 在Windows上使用 Python 安装+ win10启用长路径
https://docs.python.org/zh-cn/3/using/windows.html 成功20200131 https://docs.python.org/zh-cn/3/using/ ...
- Keil编译后的Code,RO,RW,ZI分别表示什么以及和芯片Flash、SRAM的对应关系
在使用keil开发STM32应用程序时,点击Build后在Build Output窗口中经常会有如下信息:<ignore_js_op> 以前一直好奇这几个参数和实际使用的STM32芯片中F ...
- 『动善时』JMeter基础 — 27、通过JMeter函数助手实现参数化
目录 1.测试计划中的元件 2.数据文件内容 3.函数助手配置 (1)函数助手的打开方式 (2)函数助手界面介绍 (3)编辑后的函数助手界面 4.HTTP请求组件内容 5.线程组元件内容 6.脚本运行 ...
- VMware vSphere 7.0 Update 2 发布 - 数据中心虚拟化和 Kubernetes 云原生应用引擎
2021 年 3 月 9 日,VMware 发布了 vSphere 7 Update 2.它可以通过 VMware Customer Connect 和 vSphere Lifecycle Manag ...
- 四:net core(.NET 6)使用Filter过滤器拦截webapi方法
Filter的基本用法 代码在最下方 使用filter过滤器,来实现拦截接口信息.咱们先新建一个项目,在原有的webapi上面,选择添加项目,添加一个类库项目: 我起个名字,就叫 Wsk.Core.F ...
- .Net Redis实战——使用Redis构建Web应用
示例介绍 示例1:借助Redis实现购物车功能 示例2:Redis实现网页缓存和数据缓存 借助Redis实现购物车功能 每个用户的购物车都是一个散列,散列存储了商品ID与商品订购数量之间的映射.订购商 ...