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. PageHelper简单使用

    PageHelper的简单使用 先引入对应的依赖 <dependency> <groupId>com.github.pagehelper</groupId> < ...

  2. Codeforces Round #713 (Div. 3)AB题

    Codeforces Round #713 (Div. 3) Editorial 记录一下自己写的前二题本人比较菜 A. Spy Detected! You are given an array a ...

  3. printf/scanf格式

    (1)打印字符 char c; printf("%c",c); (2)打印整形 int i; printf("%d",i); //有符号十进制数 printf( ...

  4. 目录和文件 按创建时间排序du -h --time --max-depth=1 . |sort -r -t $'\t' -k 2 Linux查看文件夹大小,并按文件夹创建时间排序

    目录和文件 按创建时间排序 # du -h --time --max-depth=1 . |sort -r -t $'\t' -k 230M 2020-04-01 14:54 .28K 2020-04 ...

  5. JavaEE 前后端分离以及优缺点

    前端概念 前端是一切直接与用户交互的页面或软件(用户看得见.摸得着)的统称,比如各种网站网页.andorid 手机各种 App.苹果手机各种 app.微信小程序.网络游戏客户端等.所以,普通人使用计算 ...

  6. 第9章 case条件语句的应用实践

    case语句企业级生产案例 范例9-7:实现通过传参的方式往/etc/openvpn_authfile.conf里添加用户,具体要求如下. 1)命令用法为: USAGE: sh adduser {-a ...

  7. 使用Tomcat插件控制台中文乱码解决方案(IDEA)(Day_51)

    解决方案 1. File -> Settings... 2. 搜索 Runner (运行程序),在 'VM options:' 中添加:-Dfile.encoding=GB2312 注:GB23 ...

  8. ssh远程主机执行命令或脚本

    1.执行单一命令 [root@vps ~]# ssh user@192.168.9.243 "pwd; ls; rm -f Cent* ;echo --------; ls"/ho ...

  9. 有关Git基础操作的学习

    Git简介 Git是一个免费的开源 分布式版本控制系统,旨在快速高效地处理从小型到大型项目的所有内容. Git 易于学习, 占地面积小,具有闪电般的快速性能.它具有诸如Subversion,CVS,P ...

  10. python字典转bytes类型字典

    python字典转bytes类型字典import base64 import json 1. a={"Vod":{"userData":"{}&quo ...