ADMM随堂笔记(3):一致和协同

7.1 全局变量一致性优化(Global Variable Consensus Optimization)

首先,考虑一个全局变量的情况,把目标函数和约束分为N个部分(这里的划分并不是对参数空间进行划分,而是类似于并行思想的那种把参数分成若干份,因此参数维度不变):
在这里插入图片描述
x ∈ R x \in R xR f i : R n → + ∞ f_i:R^n \rightarrow {+ \infty } fi:Rn+是凸的,是第i个子目标函数。当违反约束时(这里我认为就是在解题过程中不断试错的情况),每一个子函数都可以自己处理元素(如线程和处理器)。这个问题在很多情况下都会出现(个人理解就是局部内进行解算,通过协作去关联到整体)。这样可以重写成:
在这里插入图片描述
(个人理解:这里是说,我把目标问题分成了这么多份,但是我最终目标是原问题的解,那么问题来了,子问题的解和原问题的解有什么关系?肯定是一致性了,在数字上表示是不是就是相等了呢?而且这只是一个约束条件,约束条件在计算过程中就是尽力去满足这个约束,找到可以接受的解。应该就是这样理解了。)

问题(7.1)的ADMM可以直接从增广的拉格朗日方程导出:
在这里插入图片描述
或者简单地作为变量 ( x 1 , . . . . , x − n ) ∈ R n N (x_1, ....,x-n) \in R^{nN} (x1,....,xn)RnN和约束集约束优化问题(5.1)的特例
在这里插入图片描述
生成ADMM算法如下:
在这里插入图片描述
此处疑问,z的迭代是怎么的出来的。目前理解是,z和x在式子上是相等的,因此会是x加上一个类似于导数或者步长的东西)

算法进一步简化,可以用平均数来表示:
在这里插入图片描述
在这里插入图片描述
把上面z-迭代代入y-迭代,发现对偶变量$\bar{y}^{k+1} = 0 $,对偶变量在第一次迭代后平均值为0.我们使用 z k = x ˉ k z^k = \bar{x} ^ k zk=xˉk ,ADMM算法可以写成(在平均数的情况下才这样写):
在这里插入图片描述
对偶变量分别更新,并趋于一致(有x的平均数,这点是肯定的)。而二次正则化有助于将变量拉向其平均值(就是防止过拟合的那种嘛),同时仍试图最小化每个局部 f i f_i fi记得似乎二次项有防止图像趋近于平行x轴功效,待考证)

我们可以将一致ADMM解释为一种解决目标和约束分布在多个处理器上的问题的方法。每个处理器只需处理自己的目标和约束项,外加一个二次项,该二次项在每次迭代中都会更新。二次项(或者更准确地说,二次项的线性部分)的更新方式使得变量收敛到一个公共值,这是整个问题的解。 (我觉得就是解决:如何把问题分解,分解了才能并行,还得想办法让子问题的解一致(我觉得功劳还是x的平均数,因为每次参数迭代都和平均值有关,而平均值是整个系统的或者说全局的变量,这样算出来不一致才怪。不过在并行实行的时候,如何计算平均值、分发平均值可能是极其麻烦的)。而且上一次笔记提到了,ADMM扩展性极好,即使不精确的执行也能收敛到一个满意的结果,所以,分解搞很有道理啊)。这里突然想到了小批量随机梯度,不过好像没有随机梯度更方便。

对于一直ADMM,原始残差和对偶残差为 :

在这里插入图片描述
他们的平方范数:
在这里插入图片描述
前项是N倍残差,文章说这是一致性的度量

当一致性原始问题是拟合问题时,x更新步骤具有直观的统计解释.这里其实需要说一下 x ˉ \bar x xˉ的合理性,其实在概率论与数理统计中有这种说法的,就是用前面出现的平均概率代替估计。这里 r k r^k rk残差也用到了。像第三章我们 p ∗ p^* p代表最优,然后得到残差。这里就是用 x ˉ \bar x xˉ估计最优,有道理的。 y i k {y_i}^{k} yik没有一致性(这里难以理解,以后再说)。还要注意,如第3.4节所述,在增广项中使用不同形式的惩罚将导致该先验分布的相应变化;例如,使用矩阵惩罚p而不是标量惩罚 ρ \rho ρ将意味着高斯先验分布具有协方差p而不是 ρ I \rho I ρI(这说的啥,I是什么东西)

7.1.1 带正则化的全局变量一致性

在全局变量一致性问题的简单变化中,简单约束或正则化的目标项g由中心处理器处理:
在这里插入图片描述
ADMM算法为:在这里插入图片描述
(这里(7.4)的迭代按理来说少了一个 y i k T x i {y_i}^{kT}x_i yikTxi,从某种说法讲,因为缺少项与z迭代是线性想加,求最优解的时候不考虑也不影响,但是话说回来,(7.3)为什么有z的迭代项,匪夷所思。倘若我大胆推测一下,这里作者漏写了,没毛病,下文有证据)

用上 x ˉ \bar x xˉ。于是:
在这里插入图片描述
(这里出现了问题,与(7.4)式比较这里很明显会出现 y ˉ k + 1 y ˉ k + 1 \bar y^{k+1 }\bar y^{k+1 } yˉk+1yˉk+1,而(7.4)很明显没有这项,凑也凑不出来。补充:情况应该是这样,作者漏写了一个 y i k T , 这 样 除 了 缺 少 一 项 {y_i}^{kT},这样除了缺少一项 yikT, y ˉ k + 1 y ˉ k + 1 \bar y^{k+1 }\bar y^{k+1 } yˉk+1yˉk+1,其他都没问题了,在随堂笔记(2)中,缩放形式(3.5)式前一个式子那里,所抛弃的项是一样的,理由我觉得也一样,所以化形成立)
这里解释了一下,说在g非零的情况下, y ˉ k \bar y^k yˉk通常不会等于0.因此无法不能在z-迭代中把 y i y_i yi去掉。(为什么呢? 给跪了)。举个例子,对于 g ( z ) = λ ∣ z ∣ 1 g(z) = \lambda |z|_1 g(z)=λz1,当 λ > 0 \lambda>0 λ>0的时候z-迭代是是一个软阀值(软阀值介绍:https://blog.csdn.net/sq1378392676/article/details/78731035):
在这里插入图片描述
(不懂,这里太科幻了)
又举了一个例子(这个与上面同理):在这里插入图片描述
针对这个问题的ADMM的缩放形式也有一个吸引人的形式,为了方便我们在这里记录:
在这里插入图片描述
这里推了一下,没有问题,就是有一个线性项丢弃了,也是缩放的意义所在。
很多情况下,缩放形式比未缩放形式用起来更简单、也更容易。

7.2 一致优化的通用形式

我们现在考虑一个更一般形式的一致极小化问题,在这个问题中,我们有局部变量 x ∈ R n i , i = 1.2.... , N x \in R^{n_i}, i = 1.2.... ,N xRn

  • 4
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一致ADMM的MATLAB代码示例: ```matlab function [x_global] = consensus_ADMM(x_local, z, rho, neighbors, max_iter, tol) for i = 1:max_iter x_local_new = local_update(x_local, z, rho); received_info = exchange_info(x_local_new, neighbors); x_global = sync_variables(x_local_new, received_info); z = z + rho * (x_global - x_local_new); % 判断收敛条件 if norm(x_local_new - x_local) < tol break; end x_local = x_local_new; end end function [x_local_new] = local_update(x_local, z, rho) % 执行局部变量更新 x_local_new = (z + rho * x_local) / (1 + rho); end function [received_info] = exchange_info(x_local, neighbors) % 与邻居节点交换信息 received_info = {}; for i = 1:numel(neighbors) received_info{i} = send_info(neighbors{i}, x_local); end end function [received_info] = send_info(neighbor, x_local) % 模拟发送信息给邻居节点,并返回接收到的信息 received_info = x_local; end function [x_global] = sync_variables(x_local, received_info) % 同步变量 received_info = [x_local; received_info]; x_global = mean(cell2mat(received_info), 1); end % 示例使用,定义一个节点类 classdef Node < handle properties id neighbors end methods function self = Node(id) self.id = id; self.neighbors = {}; end function add_neighbor(self, neighbor) self.neighbors{end+1} = neighbor; end function received_info = send_info(self, x_local) % 模拟发送信息给邻居节点,并返回接收到的信息 received_info = x_local; end end end % 创建节点 node1 = Node(1); node2 = Node(2); node3 = Node(3); % 设置节点之间的邻居关系 node1.add_neighbor(node2); node1.add_neighbor(node3); node2.add_neighbor(node1); node2.add_neighbor(node3); node3.add_neighbor(node1); node3.add_neighbor(node2); % 初始化参数 x_local = [1, 2, 3]; z = [0, 0, 0]; rho = 0.1; max_iter = 100; tol = 1e-4; % 运行一致ADMM算法 x_global = consensus_ADMM(x_local, z, rho, {node2, node3}, max_iter, tol); disp('全局变量:'); disp(x_global); ``` 请注意,上述代码仅提供了一种简单的MATLAB实现示例,实际应用中可能需要根据具体问题进行适当的修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值