美文网首页
Consensus Optimization

Consensus Optimization

作者: TonnyYan | 来源:发表于2020-07-26 17:35 被阅读0次

    Consensus Optimization

    假设我们有如下具有N项优化目标的凸优化问题:
    \text{minimize}\;\; \sum_{i=1}^{N} f_i(x)

    比如,我们需要用数据去拟合一个模型,那么f_i就是第i个训练数据块所对应的损失函数。

    我们可以把该问题转化为一致性优化的形式
    \begin{align} &\text{minimize} \;\; \sum_{i=1}^{N} f_i(x) \\ & \text{subject to}\;\;\;x_i = z \end{align}

    我们把x_i称为局部变量,因为它们对应于一个给定的f_i。相反,变量z是全局的。约束x_i = z强制了稳定性或一致性。

    我们利用交替方向乘数法(ADMM)解决一致性问题。ADMM的每次迭代简化为以下更新:
    \begin{align} x_i^{k+1}&:=\text{argmin}_{x_i} (f_i(x_i) + \rho/2 \|x_i- \bar{x}^k + u^k_i \|^2_2) \\ u^{k+1}_i&:=u^{k}_i +x^{k+1}_i-\bar{x}^{k+1} \end{align}

    其中, \bar{x}^k = (1/N)\sum_{i=1}^{N} x^k_i.

    下面的代码用于执行一致性ADMM,通过使用CVXPY求解局部子问题。

    我们将变量x_i分解到N个不同的workers工作进程,并行更新x_i。主进程master收集这些x_i后取平均,然后再广播给workers。workers在本地更新u_i

    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

          本文链接:https://www.haomeiwen.com/subject/jafglktx.html