Consensus Optimization
假设我们有如下具有项优化目标的凸优化问题:
比如,我们需要用数据去拟合一个模型,那么就是第个训练数据块所对应的损失函数。
我们可以把该问题转化为一致性优化的形式
我们把称为局部变量,因为它们对应于一个给定的。相反,变量是全局的。约束强制了稳定性或一致性。
我们利用交替方向乘数法(ADMM)解决一致性问题。ADMM的每次迭代简化为以下更新:
其中,
下面的代码用于执行一致性ADMM,通过使用CVXPY求解局部子问题。
我们将变量分解到个不同的workers工作进程,并行更新。主进程master收集这些后取平均,然后再广播给workers。workers在本地更新。
from cvxpy import *
import numpy as np
from multiprocessing import Process, Pipe
# Number of terms f_i.
N = ...
# A list of all the f_i.
f_list = ...
def run_worker(f, pipe):
xbar = Parameter(n, value=np.zeros(n))
u = Parameter(n, value=np.zeros(n))
f += (rho/2)*sum_squares(x - xbar + u)
prox = Problem(Minimize(f))
# ADMM loop.
while True:
prox.solve()
pipe.send(x.value)
xbar.value = pipe.recv()
u.value += x.value - xbar.value
# Setup the workers.
pipes = []
procs = []
for i in range(N):
local, remote = Pipe()
pipes += [local]
procs += [Process(target=run_process, args=(f_list[i], remote))]
procs[-1].start()
# ADMM loop.
for i in range(MAX_ITER):
# Gather and average xi
xbar = sum(pipe.recv() for pipe in pipes)/N
# Scatter xbar
for pipe in pipes:
pipe.send(xbar)
[p.terminate() for p in procs]
网友评论