ADMM优化算法
原文链接: http://www.cnblogs.com/breezedeus/p/3496819.html
从等式约束的最小化问题说起:
minf(x)s.t.Ax=b
上面问题的拉格朗日表达式为:
L(x,λ)=f(x)+λT(Ax−b)
也就是前面的最小化问题可以写为:
minxmaxλL(x,λ)
它对应的对偶问题为:
maxλminxL(x,λ)
下面是用来求解此对偶问题的对偶上升迭代方法:
xk+1:=argminxL(x,λk)λk+1:=λk+αk(Axk+1−b)//x−minimization//dual update
这个方法在满足一些比较强的假设下可以证明收敛。
为了弱化对偶上升方法的强假设性,一些研究者在上世纪60年代提出使用增强拉格朗日表达式(augmented Lagrangian)代替原来的拉格朗日表达式:
Lρ(x,λ)=f(x)+λT(Ax−b)+(ρ/2)||Ax−b||22
其中 ρ>0 。对应上面的对偶上升方法,得到下面的乘子法(method of multipliers):
xk+1:=argminxLρ(x,λk)λk+1:=λk+ρ(Axk+1−b)
注意,乘子法里把第二个式子里的
αk 改成了增强拉格朗日表达式中引入的
ρ 。这不是一个随意行为,而是有理论依据的。利用
L(x,λ) 可以导出上面最小化问题对应的原始问题和对偶问题可行性条件,分别为(
∂L∂λ=0,∂L∂x=0 ):
Ax∗−b=0,∇f(x∗)+ATλ∗=0
既然 xk+1 最小化 Lρ(x,λk) ,有:
0=∇xLρ(xk+1,λk)=∇xf(xk+1)+AT(λk+ρ(Axk+1−b))=∇xf(xk+1)+ATλk+1
上面最后一个等式就是利用
λk+1=λk+ρ(Axk+1−b) 。从上面可知,这种
λk+1 的取法使得
(xk+1,λk+1) 满足对偶问题可行条件
∂L∂x=0 。而原始可行条件在迭代过程中逐渐成立。
乘子法弱化了对偶上升法的收敛条件,但由于在 x−minimization 步引入了二次项而导致无法把 x 分开进行求解(详见这儿)。而接下来要讲的Alternating Direction Method of Multipliers (ADMM)就是期望结合乘子法的弱条件的收敛性以及对偶上升法的可分解求解性。ADMM求解以下形式的最小化问题:
minf(x)+g(z)s.t.Ax+Bz=c(1)
其对应的增强拉格朗日表达式为:
Lρ(x,z,λ)=f(x)+g(z)+λT(Ax+Bz−c)+(ρ/2)||Ax+Bz−c||22(2)
ADMM包括以下迭代步骤:
xk+1:=argminxLρ(x,zk,λk)zk+1:=argminzLρ(xk+1,z,λk)λk+1:=λk+ρ(Axk+1+Bzk+1−c)(3)(4)(5)
ADMM其实和乘子法很像,只是乘子法里把
x 和
z 放一块求解,而ADMM是分开求解,类似迭代一步的Gauss-Seidel方法。其中(5)中的推导类似于乘子法,只是使用了
zk+1 最小化
Lρ(xk+1,z,λk) :
0=∇zg(zk+1)+BTλk+ρBT(Axk+1+Bzk+1−c)=∇zg(zk+1)+BTλk+1
其中用到了
z 对应的对偶可行性式子:
∂L∂z=∇g(z∗)+BTλ∗=0 。
定义新变量
u=λρ ,,那么(3-5)中的迭代可以变为以下形式:
xk+1:=argminx(f(x)+(ρ/2)||Ax+Bzk−c+uk||22zk+1:=argminz(g(z)+(ρ/2)||Axk+1+Bz−c+uk||22uk+1:=uk+Axk+1+Bzk+1−c(6)(7)(8)
在真正求解时通常会使用所谓的over-relaxation方法,也即在求解
z 和
u 中使用下面的表达式代替其中的
Axk+1 :
αkAxk+1−(1−αk)(Bzk−c)
其中
αk 为relaxation因子。有实验表明
αk∈[1.5,1.8] 可以 改进收敛性。
ADMM的框架确实很牛逼,把一个大问题分成多个小问题。理论上,ADMM的框架可以解决大部分实际中的大尺度问题。我自己全部实现了一遍这个框架,主要用于求解LR(逻辑回归)问题,下面说说我碰到的一些问题:
- 收敛不够快,往往需要迭代几十步。整体速度主要依赖于 xi 更新时所使用的优化方法,个人建议使用liblinear里算法,但是不能直接拿来就用,需要做一些调整。
- 停止准则和ρ的选取:停止准则主要考量的是 xi 和 z 之间的差异和它们本身的变动情况,但这些值又受ρ的取值的影响。它们之间如何权衡并无定法。个人建议使用模型在测试集上的效果来确定是否停止迭代。
- relaxation步骤要谨慎:α的取值依赖于具体的问题,很多时候的确可以加快收敛速度,但对有些问题甚至可能带来不收敛的后果。用的时候不论是用 x−>z−>u 的更新步骤,还是用 u−>x−>z 的更新步骤,在 u 步使用的 x^ 要和在 z 步使用的相同(使用旧的 z ),而不是使用 z 步刚更新的 z 重算。
- warm start 和子问题求解逐渐精确的策略可以降低xi更新时的耗时,但也使得算法更加复杂,需要设定的参数也增加了。
stanford的比较好的一个源码和实例链接
http://www.stanford.edu/~boyd/papers/admm/