Consensus Optimization

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]

你可能感兴趣的:(Consensus Optimization)