张量ADMM算法

article/2025/9/22 10:19:34

ADMM被广泛用在张量中,下篇是找到的一篇文章:

从等式约束的最小化问题说起:                                  
                                                     image 
上面问题的拉格朗日表达式为:
                                             image 
也就是前面的最小化问题可以写为:
                                               minxmaxyL(x,y) minxmaxyL(x,y) 。
它对应的对偶问题为:
                                              maxyminxL(x,y) maxyminxL(x,y) 。
下面是用来求解此对偶问题的对偶上升迭代方法
                                   image 
这个方法在满足一些比较强的假设下可以证明收敛。

 

为了弱化对偶上升方法的强假设性,一些研究者在上世纪60年代提出使用扩展拉格朗日表达式(augmented Lagrangian)代替原来的拉格朗日表达式:
                                 image 
其中 ρ>0 ρ>0。对应上面的对偶上升方法,得到下面的乘子法(method of multipliers)
                                                    image 

 

注意,乘子法里把第二个式子里的 αk αk改成了扩展拉格朗日表达式中引入的 ρ ρ。这不是一个随意行为,而是有理论依据的。利用 L(x,y) L(x,y)可以导出上面最小化问题对应的原始和对偶可行性条件分别为( Ly=0 ∂L∂y=0 Lx=0 ∂L∂x=0):
                                              image 
既然 xk+1 xk+1 最小化  Lρ(x,yk) Lρ(x,yk),有:
                                      image  
上面最后一个等式就是利用了 yk+1=yk+ρ(Axk+1b) yk+1=yk+ρ(Axk+1−b)。从上面可知,这种 yk+1 yk+1的取法使得 (xk+1,yk+1) (xk+1,yk+1)满足对偶可行条件 Lx=0 ∂L∂x=0。而原始可行条件在迭代过程中逐渐成立。

 

乘子法弱化了对偶上升法的收敛条件,但由于在x-minimization步引入了二次项而导致无法把x分开进行求解(详见[1])。而接下来要讲的Alternating Direction Method of Multipliers (ADMM)就是期望结合乘子法的弱条件的收敛性以及对偶上升法的可分解求解性。ADMM求解以下形式的最小化问题:
                                             image 
其对应的扩展拉格朗日表达式为: 
                   image 
ADMM包括以下迭代步骤:
                                       image 
ADMM其实和乘子法很像,只是乘子法里把 x x z z放一块求解,而ADMM是分开求解,类似迭代一步的Gauss-Seidel方法。其中(3.4)中的推导类似于乘子法,只是使用了 zk+1 zk+1最小化 Lρ(xk+1,z,yk) Lρ(xk+1,z,yk)
                                    image   
其中用到了 z z对应的对偶可行性式子:
                                                    Lz=g(z)+BTy=0 ∂L∂z=∇g(z)+BTy=0

 

定义新变量 u=1ρy u=1ρy,那么(3.2-3.4)中的迭代可以变为以下形式:
                          image 
在真正求解时通常会使用所谓的over-relaxation方法,也即在 z z u u中使用下面的表达式代替其中的 Axk+1 Axk+1
                                          αkAxk+1(1αk)(Bzkc) αkAxk+1−(1−αk)(Bzk−c)
其中 αk αk为relaxation因子。有实验表明 αk[1.5,1.8] αk∈[1.5,1.8]可以改进收敛性([2])。

 

下面让我们看看ADMM怎么被用来求解大型的机器学习模型。所谓的大型,要不就是样本数太多,或者样本的维数太高。下面我们只考虑第一种情况,关于第二种情况感兴趣的读者可以参见最后的参考文献[1, 2]。样本数太多无法一次全部导入内存,常见的处理方式是使用分布式系统,把样本分块,使得每块样本能导入到一台机器的内存中。当然,我们要的是一个最终模型,它的训练过程利用了所有的样本数据。常见的机器学习模型如下:
                                     minimize xJj=1fj(x)+g(x) minimize x∑j=1Jfj(x)+g(x)
其中 x x为模型参数, fj(x) fj(x)对应第 j j个样本的损失函数,而 g(x) g(x)为惩罚系数,如 g(x)=||x||1 g(x)=||x||1

 

假设把 J J个样本分成 N N份,每份可以导入内存。此时我们把上面的问题重写为下面的形式: 
                                           image 
除了把目标函数分成 N N块,还额外加了 N N个等式约束,使得利用每块样本计算出来的模型参数 xi xi都相等。那么,ADMM中的求解步骤(3.2)-(3.4)变为: 
                            image 
例如求解L1惩罚的LR模型,其迭代步骤如下( u=1ρy u=1ρy g(z)=λ||z||1 g(z)=λ||z||1): 
                                   image 
其中 x¯1NNixi x¯≐1N∑iNxi y¯ 的定义类似。

 

在分布式情况下,为了计算方便通常会把 u u的更新步骤挪在最前面,这样 u u x x的更新可以放在一块: 
                                     image

 

ADMM的框架确实很牛逼,把一个大问题分成可分布式同时求解的多个小问题。理论上,ADMM的框架可以解决大部分实际中的大尺度问题。我自己全部实现了一遍这个框架,主要用于求解LR问题,下面说说我碰到的一些问题:
1. 收敛不够快,往往需要迭代几十步。整体速度主要依赖于 xi xi更新时所使用的优化方法,个人建议使用liblinear里算法,但是不能直接拿来就用,需要做一些调整。
2. 停止准则和 ρ ρ的选取:停止准则主要考量的是 xi xi z z之间的差异和它们本身的变动情况,但这些值又受 ρ ρ的取值的影响。它们之间如何权衡并无定法。个人建议使用模型在测试集上的效果来确定是否停止迭代。
3. 不适合MapReduce框架实现:需要保证对数据的分割自始至终都一致;用MPI实现的话相对于其他算法又未必有什么优势(如L-BFGS、OwLQN等)。
4. relaxation步骤要谨慎 α α的取值依赖于具体的问题,很多时候的确可以加快收敛速度,但对有些问题甚至可能带来不收敛的后果。用的时候不论是用x -> z -> u的更新步骤,还是用u -> x -> z的更新步骤,在u步使用的x_hat要和在z步使用的相同(使用旧的z),而不是使用z步刚更新的z重算。
5. warm start 和子问题求解逐渐精确的策略可以降低 xi xi更新时的耗时,但也使得算法更加复杂,需要设定的参数也增加了。


[References]
[1] S. Boyd.  Alternating Direction Method of Multipliers  (Slides).
[2] S. Boyd et al.  Distributed Optimization and Statistical Learning via the Alternating Direction Method of Multipliers , 2010.

http://chatgpt.dhexx.cn/article/xJZP1rh7.shtml

相关文章

MATLAB代码:基于分布式ADMM算法的考虑碳排放交易的电力系统优化调度研究

MATLAB代码:基于分布式ADMM算法的考虑碳排放交易的电力系统优化调度研究 关键词:分布式调度 ADMM算法 交替方向乘子法 碳排放 最优潮流 参考文档:《A Distributed Dual Consensus ADMM Based on Partition for DC-DOPF with Carbon Emission …

对偶算法与ADMM算法

学习笔记,仅供参考,有错必纠 转载自:机器学习与运筹优化(六)对偶算法与ADMM算法 文章目录 摘要ADMM算法参考文献 摘要 上文我们介绍了约束优化问题和拉格朗日对偶思想。对偶算法就像是男生女生互相挑选,最…

【配电网优化】基于串行和并行ADMM算法的配电网优化研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

MATLAB代码:全面ADMM算法代码,实现了三种ADMM迭代方式 参考文档:《基于串行和并行ADMM算法的电_气能量流分布式协同优化_瞿小斌》

MATLAB代码:全面ADMM算法代码,实现了三种ADMM迭代方式 关键词:综合能源 分布式协同优化 交替方向乘子法 最优潮流 参考文档:《基于串行和并行ADMM算法的电_气能量流分布式协同优化_瞿小斌》 仿真平台:MATLAB 主要内容&…

ADMM算法在神经网络模型剪枝方面的应用

文章目录 前言1. 交替方向乘子法2. 论文中的表述3. 对论文中的公式进行推导4. 代码流程5. 主要函数实现6. dense vs. prune(finetune)结束语 前言 本篇博客记录一下自己根据对论文 GRIM: A General, Real-Time Deep Learning Inference Framework for Mobile Devices based on …

ADMM算法及其放缩形式,在压缩快照成像重建的图像重建论文中的公式推导

刚接触图像恢复问题,简单记录一下最近看论文刚弄懂的一个小问题 ADMM算法 ADMM(交替方向乘子法)是一种解决变量可分离凸优化问题的简单算法,具有求解速度快,收敛性能好的特点。ADMM可以将原问题转换为几个子问题&…

开漏输出和推挽输出的区别?

《《《《正文》》》》》 《理解三极管的原理》 如下图,以NPN三极管为例: 它是一种电流控制型元器件,即基极B的输出输出电流可以实现对元器件的控制。所以可以进一步理解为基极B为控制端,集电极C为输入端,发射极E为输出…

推挽输出和开漏输出

推挽输出(push-pull): 推挽输出(push-pull): 推挽输出,正如字面上的意思,有“推”,也有“挽”,推挽输出电路运用两个MOS管构成,上面为P-MOS&…

推挽输出和开漏输出详解

序言: 平时,写程序的时候总遇IO口模式的端口配置。但是从来没有仔细研究过具体到底是什么含义。作为一名嵌入式工程师应该是不合格的,现在把端口定义重新梳理一下。 一、NPN和PNP区别 NPN 是用 B→E 的电流(IB&#xff0…

STM32的推挽输出和开漏输出

文章目录 前言一、推挽输出二、开漏输出三、区别和适应场景总结前言 本篇文章将带大家了解STM32的推挽输出和开漏输出,并且学习这两个的区别,学习分别在什么时候使用这两个不同的输出方式。 在 STM32 微控制器中,GPIO(General Purpose Input/Output)模块是一个通用的输入…

什么是GPIO的推挽输出和开漏输出

数字芯片GPIO一般分为推挽输出和开漏输出 数字芯片GPIO一般是推挽输出(PUSH-PULL),其内部结构如下: 当上面的MOS管导通时,GPIO输出高电平1,称为“推” 当下面MOS管导通时,GPIO输出低电平0&…

浅谈开漏输出和推挽输出的理解

理解电路元件特性 在理解这两种输出之前我们需要对三极管这种电路元器件进行理解,三极管都包括三个部分,基极(base)、集电极(Collector)以及发射极(Emitter)。他们负责不同的功能, 1.基极主要负责控制电流导通与否 2.…

开漏输出和推挽输出的差别

GPIO内部仅有以上三种组合形式 而当上面任意两种形式组合时则 一、推挽输出 高低电平两两组合则形成了推挽输出的模式。 优点:能输出高低电平、且高低电平都有驱动能力 缺点:不能实现线与的功能&#xff…

终于搞清楚开漏输出和推挽输出这个鬼东西

先说下推挽输出,简单的说,就是想输出高电平,就输出高电平,想输出低电平就输出低电平。 推挽电路上面是NPN三极管,下面是PNP三极管,请注意输入端和输出端的波形。 下面是输入波形 当输入为正时,上…

推挽输出和开漏输出有什么不同?

推挽输出和开漏输出有什么不同? 推挽输出(Push-Pull Output)开漏输出(Open Drain Output)两者比较 首先介绍一下什么是推挽输出和开漏输出。 推挽输出(Push-Pull Output) 推挽输出结构是由两个…

区分推挽输出和开漏输出

推挽输出:可以输出高,低电平,连接数字器件。 输出 0 时,N-MOS 导通,P-MOS 高阻,输出0。 输出 1 时,N-MOS 高阻,P-MOS 导通,输出1(不需要外部上拉电路)。 开漏输出:输出端相当于三…

GPIO之推挽输出和开漏输出

疑问 GPIO配置为输出时会有两种模式,一种叫推挽输出,一种叫开漏模式。那什么是推挽输出,什么又是开漏输出呢? 三种输出状态 如下图所示为将GPIO配置为输出时的内部示意图: 由上图可以看出,GPIO的输出状…

推挽输出和开漏输出区别

目录 1.推挽输出 2.开漏输出 1.推挽输出 当想输出高电平时,P-MOS导通,N-MOS截止,输出为电源电压VDD 当想输出低电平时,N-MOS导通,P-MOS截止,相当于引脚直接接地,输出低电平 2.开漏输出 开…

从硬件方面理解GPIO的开漏输出和推挽输出

最近在学STM32,看正点原子视频中对开漏输出和推挽输出的讲解视频时,发现原子哥对电路的讲解有一些错误,主要说关于MOS管的开关问题,查了一晚上资料,终于想明白了,特意发个文章分享一下。 这是STM32F4XX中文…

推挽输出与开漏输出

推挽输出 要理解推挽输出,首先要理解好三极管(晶体管)的原理。下面这种三极管有三个端口,分别是基极(Base)、集电极(Collector)和发射极(Emitter)。下图是NP…