⚡机器学习⚡交替方向乘数法(Alternating Direction Method of Multipliers,ADMM)
Posted 府学路18号车神
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了⚡机器学习⚡交替方向乘数法(Alternating Direction Method of Multipliers,ADMM)相关的知识,希望对你有一定的参考价值。
最近研究二次判别分析(Quadratic Discriminant Analysis,QDA),发现运用到了交替方向乘数法(ADMM),就很迷。(关键是太菜)
很多博主都是直接翻译或者搬运的,搜罗且了解了很多相关知识,那就来个大总结及其一些自己的想法吧!
(内力有限,仅供学习交流)
确实很难,理论性很强,没有虚的,阅读完内容需要有“勇气”!
ADMM
背景
咱们先来了解了解,ADMM到底是个什么东西?
交替方向乘数法(Alternating Direction Method of Multipliers),从字面意思上理解,交替方向?是不是很迷?交替计算?交替求解?。。。难道是对偶问题?对偶求解?
先不管了,再看后半句,乘数法?咦~是不是感觉有点熟悉。
la.la.la…Lagrange乘数法???
(没错,就是Lagrange,直接干起来,等等,这里只说对了一半,具体咱们下面慢慢道来~)
ADMM是一个不算是太新的算法,其实就是一种求解优化问题的计算框架, 适用于求解分布式凸优化问题,特别是统计学习问题。 ADMM 通过分解协调(Decomposition-Coordination)过程,将大的全局问题分解为多个较小、较容易求解的局部子问题,并通过协调子问题的解而得到大的全局问题的解。
简单的理解就是,整个算法只是整合许多不少经典优化思路,然后结合现代统计学习所遇到的问题,提出了一个比较一般的比较好实施的分布式计算框架。
而他的历史可以追溯到看下面:
ADMM 最早分别由 Glowinski & Marrocco 及 Gabay & Mercier 于 1975 年和 1976年提出,并被 Boyd 等人于 2011 年重新综述并证明其适用于大规模分布式优化问题。由于 ADMM的提出早于大规模分布式计算系统和大规模优化问题的出现,所以在 2011 年以前,这种方法并不广为人知。
作为搞自动化、控制、优化、诊断…的本菜来说,当然是奔着优化求解去学习的。
先来看看一个大佬对目前大数据及其优化的见解,简直是一针见血,说出来我的心声:
业界一直在谈论大数据,对于统计而言,大数据其实意味着要不是样本量增加 n → ∞ n\\rightarrow \\infty n→∞,要不就是维度的增加 p → ∞ p \\rightarrow \\infty p→∞,亦或者两者同时增加,并且维度与样本量的增长速度呈线性或者指数型增长。在稀疏性的假设条件下,再加上一些正则性方法,统计学家可以证明各种加penalty的模型所给出的参数估计具有良好的统计性质,收敛速度也有保证,同时还会给出一些比较好的迭代算法,但是,他们并没有考虑真实环境下的所消耗的计算时间。虽然统计学家也希望尽量寻求迭代数目比较少的算法(比如one-step估计),但是面对真实的Gb级别以上的数据,很多时候我们还是无法直接用这些算法,原因是一般的硬件都无法支撑直接对所有数据进行运算的要求。如果想减少抽样误差,不想抽样,又想提高估计的精度,那么还是需要寻求其他思路,结合已有的模型思想来解决这些问题。在目前条件下,并行化、分布式计算是一种比较好的解决思路,利用多核和多机器的优势,这些好算法便可以大规模应用,处理大数据优势便体现出来了。对于统计而言,数据量越大当然信息越可能充分(假设冗余成分不是特别多),因为大样本性质本身就希望样本越多越好嘛。—源自此处
还需要知道的一点,我们都知道搞优化会遇到很多问题,无非是数据量上和维度的变化,关键词大都为:降维,收敛,迭代等等,而这里的ADMM算法不同于那些梯度下降法或其他改进的SGDM、RMSProp、Adam等等更多高级算法,应用的大多为以GB级别的数据量的数据集,如果与SGDM、Adam这些算法在同样的低维数据(这里指的是较GB级别低的)进行比较,收敛速度绝壁没它们好,很慢,实际的收敛速度往往比那些算法慢得多。ADMM的主要应用,主要是在解空间规模非常大的情况下(比如X、Y 都是存储空间上GB的超大规模矩阵),这个时候很多传统的方法不好用,强制需要分块求解,而且对解的绝对精度往往要求也没那么高。所以我觉得这是,需要提前知道的一点。
确实,这个算法很难理解,公式也很难,不敢保证,我能将其解释清楚,抱着互相学习的态度写这篇Blog!(望各位大佬批评指正)
具体结构,从ADMM需要用到的背景知识、ADMM原理、具体应用这几块进行解释。
下面咱们从基本框架结构入手吧~
背景知识
《Distributed Optimization and Statistical Learning via the Alternating Direction Method of Multipliers》文章中提到了一些预备知识,学过最优化或最优估计等优化课程的童鞋应该能够很快能够理解,对偶问题若很陌生的小伙伴,可以补充补充相关的知识。
先来了解一些基本算法思想吧~
对偶上升
对于凸函数的优化问题,对偶上升法核心思想就是引入一个对偶变量,然后利用交替优化的思路,使得两者同时达到optimal。
读到这里,让我们想起咱们的主题,“交替方向”,是不是有点感觉了。
对于凸函数,我们只需要知道,凸优化问题有一个良好的性质即:局部最优解便是全局最优解
对凸函数有不解的地方,可看这位大佬的博客。
一个凸函数的对偶函数其实就是原凸函数的一个下界,因此可以证明一个较好的性质:在强对偶性假设下,即最小化原凸函数(primal)等价于最大化对偶函数(dual),两者会同时达到optimal。这种转化可以将原来很多的参数约束条件变得少了很多,以利于做优化。具体表述如下:
min
f
(
x
)
s
.
t
.
A
x
=
b
\\begin{array}{l} \\min \\quad f(x) \\\\s.t.\\quad A x=b \\end{array}
minf(x)s.t.Ax=b
其中的s.t.约束项,有些地方可能写成“ A x + B z = C Ax+Bz=C Ax+Bz=C”的形式,原理都是一样的,只是多了一个变量而已,不用过于担心,理解到整个算法的思路就好。(先不透露为什么会出现这个公式,哈哈哈哈)
对于对偶问题有所不解的,可以简单理解成为原函数是Y关于X的函数,那么对偶的函数则为X关于Y的函数,这样理解是不是更容易一点呢。
其中
f
(
x
)
f(x)
f(x)为目标函数也即是凸函数,然后拉格朗日干起来,则为:
L
(
x
,
y
)
=
f
(
x
)
+
y
T
(
A
x
−
b
)
L(x, y)=f(x)+y^{T}(A x-b)
L(x,y)=f(x)+yT(Ax−b)
其中
y
T
y^{T}
yT为拉格朗日乘子,对偶的
L
(
x
,
y
)
L(x,y)
L(x,y)函数为:
g
(
y
)
=
inf
x
L
(
x
,
y
)
=
−
f
∗
(
−
A
T
y
)
−
b
T
y
g(y)=\\inf _{x} L(x, y)=-f^{*}(-A^{T}y)-b^{T}y
g(y)=xinfL(x,y)=−f∗(−ATy)−bTy
对于上式,
inf
\\inf
inf 代表的是一个下界,之所以用下确界而不是用min,可能是因为有些函数没有极值(定义域取不到),但有一个下确界。
而 y y y 相对于原 L ( x , y ) L(x,y) L(x,y)函数来说,是拉格朗日乘子的对偶变量(这里表现为矩阵的转置)
现在我们来看我们的原问题(Primal)的对偶(Dual)函数:
max
y
g
(
y
)
\\max_y \\quad g(y)
ymaxg(y)
在强对偶的假设下,原问题和对偶问题的解都是一样的,同时达到最优。
什么是强对偶性?就是指原问题的解与对偶问题的解是相同的,也即是: x ∗ = y ∗ x^{*}=y^{*} x∗=y∗
知道了原问题和对偶的解都是最优解,那么我们是不是可以从对偶问题入手,找到对偶问题的最优解
y
∗
y^{*}
y∗,这样就能对应的求得原问题的解
x
∗
x^{*}
x∗,
x
∗
=
arg
min
x
L
(
x
,
y
∗
)
x^{*}=\\arg \\min_{x} L(x, y^{*})
x∗=argxminL(x,y∗)
arg 是变元(即自变量argument)的英文缩写。
arg min 就是使后面这个式子达到最小值时的变量的取值>
arg max 就是使后面这个式子达到最大值时的变量的取值
假如
g
(
y
)
g(y)
g(y)可求其导数,那么利用梯度上升法,交替更新参数,使得同时收敛到最优。迭代如下:
x
k
+
1
:
=
arg
min
x
L
(
x
,
y
k
)
(
x
−
最
小
化
步
)
y
k
+
1
:
=
y
k
+
α
k
∇
g
(
y
)
=
y
k
+
α
k
(
A
x
k
+
1
−
b
)
(
对
偶
变
量
更
新
,
α
k
是
步
长
)
x^{k+1}:=\\arg \\min _{x} L\\left(x, y^{k}\\right) \\quad(x -最小化步 ) \\\\ y^{k+1}:=y^{k}+\\alpha^{k} \\nabla g(y)=y^{k}+\\alpha^{k}\\left(A x^{k+1}-b\\right) \\quad (对偶变量更新, \\alpha^{k} 是步长 )
xk+1:=argxminL(x,yk)(x−最小化步)yk+1:=yk+αk∇g(y)=yk+αk(Axk+1−b)(对偶变量更新,αk是步长)
由于以上需要的 f ( x ) 、 α f(x)、\\alpha f(x)、α条件都非常的苛刻,难以满足其要求,一般应用中都不会用到对偶上升法。
对偶分解
虽然对偶上升的方法有所缺陷,导致我们在实际操作中会遇到重重困难。
但是世界万物都是存在着两面,有其弊也有其利,就如下面的太极双鱼图
那么,我们可以利用其优秀的一面,当目标函数 f f f 是可分的(separable)时候(参数亦或feature可分),整个问题可以拆解成多个子参数问题,分块优化后汇集起来整体更新。
这也就是快接近咱们的主题了,分布式凸优化问题。
我们可以分块,然后并行化处理。
由此,我们可分离的目标函数为: 以上是关于⚡机器学习⚡交替方向乘数法(Alternating Direction Method of Multipliers,ADMM)的主要内容,如果未能解决你的问题,请参考以下文章
min
f
(
x
)
=
∑
i
=
1
N
f
i
(
x
i
)
s
.
t
.
A
x
=
∑
i
=
1
N
A
i
x
i
=
b
\\min \\quad f(x)=\\sum_{i=1}^{N} f_{i}\\left(x_{i}\\right) \\\\ s.t. \\quad Ax=\\sum_{i=1}^{N}A_ix_i=b
minf(x)=i=1∑Nfi(xi)s.t.Ax=i=1∑NAixi=b
其中,对
A
A
A矩阵按照列分开。
x
=
(
x
1
,
x
2
,
.
.
.
,
x
N
)
,
A
x=(x_1,x_2,...,x_N),A
x=(x1,x2,...,xN),A 可分解为
A
=
(
A
1
,
A
2
,
.
.
.
,
A
N
)
A=(A_1,A_2,...,A_N)
A=(A<