格物洞察,自省自洽 | insight, insi|

凌晗

园龄:8年9个月粉丝:12关注:30

2023-08-09 00:13阅读: 1413评论: 1推荐: 1

二次规划问题和常见求解框架

二次规划问题

Quadratic Program,QP

二次规划问题是非线性规划(Non-linear program,NLP)问题的特例,即当目标函数 f 为二次型且约束 hgxRn 为线性约束时的 NLP 问题即为 QP 问题,其一般形式如下:

minf(x)=12xBxxb,xRns.t.A1x=cA2xd

上式中,BRn×n 是对称矩阵, bRn, A1Rm×n, cRn ,A2Rp×n, dRp

相关术语

  • 二次型,正定矩阵

    • 二次型 f(x)=xAx ,其中对称矩阵 ARn×n,xRn; 二次型 f(x) 和对称矩阵 A 具有一一对应关系

    • x0,f(x)0, 则二次型 f(x) 为正定二次型; 正定二次型的充要条件为 其对应的对称矩阵的所有特征值大于 0; 或者其对应的对称矩阵的各阶主子式均为正

  • 海森(Hessian)矩阵

    • 假设有函数 f:RnR,如果在定义域中其二阶偏导数存在且连续,那么 f 的 Hessian 矩阵为一个 n×n 的方阵,定义为 Hij=2fxixj, 根据二阶连续偏导和求导次序无关可知,Hessian 矩阵为对称矩阵。

LASSO 问题

LASSO 回归问题是在线性回归问题的基础上,加上 l1 范数约束,来限制线性拟合的系数,保持一定的稀疏性。相比于岭回归 ( l2norm 范数约束),LASSO 回归对离群极端值具有较好的鲁棒性。LASSO 问题的形式如下:

minx12Axb22+γx1

其中 xRn 为系数向量 , ARm×n 是数据矩阵,λ>0 是惩罚项权重。

LASSO 问题的等价二次规划问题为

 minimize 12yTy+γ1Tt subject to y=Axbtxt

半二次分裂算法

Half quadratic splitting,HQS

变量分裂法(Variable Spliting)

用于解决目标函数是两个函数之和的优化问题,如假设 g 是 n 维向量到 d 维向量的一个映射,优化目标函数为:

minuKnf1(u)+f2(g(u))

可以通过变量分裂将上式变为:

minuKnf1(u)+f2(v)s.t.g(u)=v

变量分裂之后可能比原问题更好解决。

半二次分裂

通常是将正则项中的原始变量进行变量替换,而后通过增广拉格朗日法(Augmented Lagrange Method,ALM)重写目标函数(包含原数据保真项,拉格朗日乘子项和二次惩罚项,这么做的目的是解耦的同时,简化计算。 图像复原中,目标函数为:

x^=argminx12yHx2+λΦ(x)

前一项为数据保真项(fidelity),后一项为惩罚项,通常只与去噪有关。通过 HQS 算法,引入辅助变量 z,把惩罚项的 x 替换为 z,并添加相应的等式约束条件:

x^=argminx12yHx2+λΦ(z) s.t. z=x

由增广拉格朗日法(Augmented Lagrange Method,ALM)得到增广拉格朗日函数:

Lμ(x,z)=12yHx2+λΦ(z)+μ2zx2

迭代求解:

xk+1=argminxyHx2+μxzk2zk+1=argminzμ2zxk+12+λΦ(z)

两个子问题将原问题的保真项和先验项解耦分别求解。

(加速)迭代收缩阈值算法

(Fast) iterative shrinkage-thresholding algorithm, (F)ISTA

近端梯度下降

Proximal Gradient Algorithm, PGD

对于包含不可微部分的优化目标如 lasso 回归的求解,梯度下降等算法已不再适用。近端梯度下降即被用来解决包含不可导项的优化问题。研究如下问题:

minxg(x)+h(x)

其中,g(x) 是连续可导凸函数;h(x) 是连续的凸函数,可以是不光滑的(不可导,not necessarily differentiable)。对于函数 f(x) ,将其在 x0 处做二阶泰勒展开,将其用来近似原函数得:

f(x)f(x0)+f(x0)T(xx0)+12(xx0)T2f(x)(xx0)

二阶导相对一阶导要难求很多,并且从时间复杂度的角度上来讲,求二阶导信息即 Hessian 矩阵要花去许多时间。根据Lipschitz continuous gradient,我们将二阶导用 1tIn代替,其中 t>0In 为 n 阶单位矩阵,则

f(x)f(x0)+f(x0)T(xx0)+12t(xx022

设原问题最优解为 x+,则带入上式到原问题,并抛掉常数 f(x0),凑平方得

x+=argminx{f(x0)+f(x0)T(xx0)+12txx022+h(x)}=argminx{12tx(x0tf(x0)22+h(x)}

定义临近点算子/近端算子 (proximal operator) 如下:

proxt,h()(z)=argminx{12txz22+h(x)}

等价定义如下:

proxt,h()(z)=argminx{12xz22+th(x)}

利用近端算子可以将原问题的最优解写为:

x+=proxt,h(())(x0tf(x0))

写为迭代求解形式(近端梯度下降的核心公式)为:

xk=proxt,h(())(xk1tf(xk1))

针对不同的 h(),如 l0 范数、l1 范数、l2 范数、二次函数等,近端算子都有着对应的闭式解 (closed-form)(或者说显式解),下面列出了几个简单的情况:

h()=0 时, proxt,h()(z)=z h()=||0 时,proxt,h()(zi)={zi|zi|t0 otherwise ,Elementwise hard-thresholding (硬阈值函数)

h()=||1 时,proxt,h()(zi)=sign(zi)max(|zi|t,0),Elementwise soft-thresholding (软阈值函数)

h()=||2 时,proxt,h()(z)=z[1t|z|2]+,Elementwise soft-thresholding (软阈值函数)

有时候在不同论文里面会看到 (a)+ 这种数学表达式,它其实就等价于 max(a,0)

迭代收缩阈值算法

iterative shrinkage-thresholding algorithm,ISTA

一般的,我们将解决上述含不可导项的优化问题的近端梯度下降算法成为 ISTA 算法。具体应用中,ISTA 算法狭义上一般指不可导项为 l1 范数的 LASSO 问题。

LASSO 问题中使用了 l1 范数,故对应 h()=λ||1 的情况,此时的近端梯度下降迭代表达式可以写成:

xk=proxt,λ1(xk1tf(xk1))=Sλt(xk1tf(xk1))

其中 Sλt() 称为软阈值算子(soft-thresholding operator),也常写作 softλt(),可以看到该算子即为近端算子中 h()=||1 的情况。

z 为标量,则有:

proxt,λ1(z)=Sλt(z)=sign(z)max(|z|λt,0)={zλtz>λt0λtzλtz+λtz<λt

z=[z1,,zn]Rn 为向量,则 Sλt(z)=[Sλt(z1),,Sλt(zn)] ,即为每个分量均做软阈值操作。进一步可以推导出如下表达式:

Sλt(zi)=sign(zi)max(|zi|t,0)=sign(zi)|zi|max(|zi|t|zi|,0)=zimax(|zi|t|zi|,0)=zimax(1t|zi|,0)Sλt(z)=z[1t|z|]+

其中,|z| 为对向量 z 的每个分量取绝对值后组成的向量; []+ 表示取正,即 max(,0); AB 表示两个矩阵的 Hadamard 乘积(element-wise product)。

软阈值迭代算法 (ISTA, iterative soft-thresholding algorithm),即为用软阈值作为包含 l1 范数的目标函数的“梯度”,使用”梯度下降“来得到最优值的算法。回顾 LASSO 优化问题,可以得到:

f(x)=12Axb2=A(Axb)h(x)=γx1

所以 ISTA 算法的迭代公式为:

xk=Sγt(xk1tf(xk1))=Sγt(xk1tA(Axk1b))

算法流程如下(该算法流程为一般形式的 ISTA 算法流程,即近端算子 pL() 为不可导项 h() 对应的近端算子,特殊的,当不可导项 h()l1 范数时,pL()=Srt(),下同):

ISTA 算法还有一种推广形式的迭代公式:

xk=(1β)xk1+βSγt(xk1A(Axk1b))

其中 β>0。原始 ISTA 算法的迭代形式可以看做 β=1 的特例。当 β>1 或者 β<1 时可以将推广形式看做原始形式的 over/under related 版本。

文献中已经证明,当迭代步长取 f 的 Lipschitz 常数的倒数(即 1L(f) )时,由 ISTA 算法生成的序列 xk 的收敛速度为 O(1k) 显然为次线性收敛速度。然而固定步长的 ISTA 的缺点是:Lipschitz 常数 L(f) 不一定可知或者可计算。例如,L1 范数约束的优化问题,其 Lipschitz 常数依赖于 AA 的最大特征值。而对于大规模的问题,非常难计算。因此出现了 ISTA 算法的 Backtracking 版本,通过不断收缩迭代步长的策略使其收敛,算法流程如下:

加速迭代收缩阈值算法

fast iterative shrinkage-thresholding algorithm, FISTA

为了加速 ISTA 算法的收敛,文献中作者采用了著名的梯度加速策略Nesterov加速技术,使得 ISTA 算法的收敛速度从 O(1k) 变成 O(1k2) ,加速的 ISTA 算法称为 FISTA。FISTA 与 ISTA 算法相比,仅仅多了个 Nesterov 加速步骤,以极少的额外计算量大幅提高了算法的收敛速度。而且不仅在 FISTA 算法中,在几乎所有与梯度有关的算法中,Nesterov 加速技术都可以使用。FISTA 的算法流程如下:

当然,考虑到与 ISTA 同样的问题:问题规模大的时候,决定步长的 Lipschitz 常数计算复杂。FISTA 与 ISTA 一样,亦有其回溯算法。在这个问题上,FISTA 与 ISTA 并没有区别,上面也说了,FISTA 与 ISTA 的区别仅仅在于每一步迭代时近似函数起始点的选择。更加简明的说:FISTA 用一种更为聪明的办法选择序列 xk,使得其基于梯度下降思想的迭代过程更加快速地趋近问题函数 f(x) 的最小值。

带回溯的 FISTA 算法基本迭代步骤如下:

值得注意的是,在每一步迭代中,计算近似函数的起止点时,FISTA 使用前两次迭代过程的结果 xk,xk1,对其进行简单的线性组合生成下一次迭代的近似函数起始点 yk。方法很简单,但效果却非常好。当然,这也是有理论支持的。关于 ISTA 和 FISTA 的具体理论推导可以看 原论文

两步迭代收缩阈值算法

Two-step iterative shrinkage/thresholding, TwIST

TwIST 算法是 ISTA 算法的改进算法,其 two-step 是指该算法的每次迭代都依赖于前两次迭代的结果,而不仅是前一次迭代的结果。(F)ISTA 算法的收敛速度对线性观测矩阵具有很强的依赖性,当观测矩阵十分病态(ill-posed)时,该算法的收敛速度会很慢。TwIST 通过引入两步(或者说二阶, second order)非线性迭代策略克服了 ISTA 收敛速度的问题,在病态问题的求解中具有更快的收敛速度。 定义优化目标函数:

minx12yKx2+λΦ(x)

该目标函数是线性逆问题求解中的常规形式。其中,y 是观察数据,K 是一个线性操作符,Φ(x) 是一个正则项。该目标函数的第一项为数据保真项,第二项为先验项,二者通过正则化参数 λ 控制权重。

TwIST 算法的迭代公式为:

x1=Γλ(x0)xt+1=(1α)xt1+(αβ)xt+βΓλ(xt)

对于 t1Γλ:RmRm 定义为

Γλ(x)=Ψλ(x+K(yKx))

其中 Ψλ (去噪函数,Moreau proximal mapping)定义为

Ψλ(y)=argminx{12xy2+λΦ(x)}

Φ(x)=|x|1 时,Ψλ(y)=Sλ(y)=sign(z)max(|z|λ,0) 即为软阈值函数。更一般的,当 Φ(x) 时为全变分(total variation, TV)、加权 lp 范数以及加权 lp 范数的 pth 次方时对应的 Ψλ 的推导见 原论文

广义交替投影算法

Generalized alternating projection, GAP

考虑优化问题:

minw,CCs.t.w2,1GβCandΦw=y

该优化问题的本质为寻找一个和给定的线性流形(优化函数第二项)有非空交集的最小加权 2,1 范数球(优化函数第一项)。可以通过一系列交替投影求解该问题,引入辅助变量 θ 将该问题先进行转化:

(w(t),θ(t))=argminw,θ12wθ22+λ(t)θ2,1Gβ subject to Φw=y

其中,λ(t)0 是与 C(t) 有关的 Lagrangian 乘子。通过对 w,θ 进行交替更新可以求解上述优化问题。具体来说,给定 θ 时,w 的更新是 θ 在线性流形上的一个 Euclidean projection; 给定 wθ 的更新可以通过对 w 进行 groupwise 的 shrinkage(软阈值操作)来获得,两种情况下的更新都有解析(closed-form)解。具体迭代公式如下(假设 ΦΦ 可逆):

(update of λ)λ(t)=wGjm+1(t)2βjm+11(t)Defλ(w(t),m),m<m(Euclidean projection)w(t)=θ(t1)+ΦT(ΦΦT)1(yΦθ(t1))(groupwise shrinkage)θGk(t)=wGk(t)max{1λ(w(t),m)wGk(t)21βk,0}kNm

其中关于 λ 的更新较为复杂,详细推导见 原论文。(关于第二步中 Euclidean projection 解析解的推导:当给定 θ 时,更新 w 的时候,求解的问题变为 argminw12|wθ|22,s.t.Φw=y,通过变量替换 w=wθ,该问题变为矩阵分析中典型的最小范数解的问题,有相应的解析解,带入并反求 w 即得)

交替方向乘子法

Alternating direction method of multipilers, ADMM

考虑优化问题:

minx,zf(x)+g(z)s.t.Ax+Bzc=0

ADMM 的算法流程为:

xk+1=argminxf(x)+ρ2Ax+Bzkc+μk22zk+1=argminzg(z)+ρ2Axk+1+Bzc+μk22,(μk:=λkρ)μk+1=μk+(Axk+1+Bzk+1c)

关于 ADMM 的推导过程建议参考 ADMM算法的详细推导过程是什么? - 覃含章的回答

关于在实际场景中如果将问题转换为 ADMM 形式来求解,推荐参考 交替方向乘子法(ADMM)算法的流程和原理是怎样的? - 门泊东吴的回答,下面摘录其中一例,求解含有 l1 范数的优化问题:

minx,zl(x)+λx1

s 首先引入辅助变量 z 将上述问题转换为 ADMM 可以求解的形式:

minx,zl(x)+λz1s.t.xz=0

使用 ADMM 的求解流程为:

xk+1=argminxl(x)+ρ2xzk+μk22zk+1=Sλ/ρ(xk+1+μk)μk+1=μk+(xk+1zk1)Sκ(a):={aκ,a>κ0,|a|κa+κ,a<κ

其中 Sκ(a) 是软阈值函数。对于 LASSO 问题,上述 l(x)=12|Axb||22,则 xk+1 的解析解可以写成:xk+1=(AA+ρI)1(Ab+ρ(zkμk))

算子分裂二次规划求解算法

Operator splitting solver for quadratic programs, OSQP

考虑一般的(凸)二次规划(quadratic program,QP)问题:

minx12xPx+qxs.t.AxC

其中 xRn,PS+n,qRn;ARm×n,CRm

如果集合 C=[l,u]=zRm|liziui,i=1,,m ,其中 liR,uiR+,则上述问题转化为:

minx12xPx+qxs.t.lAxu

li=ui 对所有元素​均成立,或者对部分元素成立时,相应约束即变为等式约束。

将上述问题转换为可以利用 ADMM 算法求解的形式:

minimize(1/2)x~TPx~+qTx~+IAx=z(x~,z~)+IC(z) subject to (x~,z~)=(x,z)

其中:

IAx=z(x,z)={0Ax=z+ otherwise ,IC(z)={0zC+ otherwise 

利用 ADMM 算法可以将上述优化问题分为三步迭代求解:

其中 σ>0,ρ>0 为步长参数,α(0,2) 是松弛参数,Π 表示向 C 集合上的欧几里得投影(Euclidean projection)。根据 (16) 和 (18) 可以推出来 wk+1=0,k>0,所以表示 w 的迭代更新的 (18) 式可以去掉。上述迭代的关键步骤在于 (15) 式,通过 KKT 条件可以推出其解析解为:

[P+σIATAρ1I][x~k+1νk+1]=[σxkqzkρ1yk]

z~k+1=zk+ρ1(vk+1yk)

具体推导见 原论文。OSQP 算法的迭代步骤具体如下:

上述迭代步骤中,除了步骤 3 之外都很简单,因为它们仅包含向量加减,数乘以及投影操作,而且都是 component-wise separable 的操作,能够很容易的进行并行。下面以 LASSO 问题为例,将其转换为可以用 OSQP 求解的二次规划问题形式:

LASSO 问题的一般形式为:

minxAxb2+λx1

其中,xRn 是参数向量,ARm×n 是数据矩阵,λ 是权重参数。将该问题转换为二次规划问题:

minyy+λ1ts.t.y=Axbtxt

其中 yRm,tRn 是两个新引入的变量。转化为二次规划形式后的 LASSO 问题即可以用上述 OSQP 算法求解。

附录 Appendix

软阈值算子和硬阈值算子

soft-thresholding operator, hard-thresholding operator

软阈值算子的表达式 softT(x)=sign(x)max(|x|T,0)={x+Tx<T0|x|TxTx>T
硬阈值算子的表达式 hardT(x)=sign(x)max(|x|T,0)={x|x|>T0|x|T
二者的图像如下:

Lipschitz 常数和 Lipschitz 连续

利普希茨连续的定义是:如果函数 f 在区间 Q 上以常数 L 利普希茨连续,那么对于 x,yQ,有:

f(x)f(y)Lxy

其中常数 L 称为 f 在区间 Q 上的 Lipschitz 常数。除了 Lipschitz continuous 之外,Lipschitz continuous gradient 和 Lipschitz continuous Hessian 也是常用到的概念,它们都是由 Lipschitz continuous 概念延伸出来的。值得一提的是,很多论文中,尤其是关于凸优化的问题,Lipschitz continuous gradient的应用更为常见。

其中,如果函数 f 满足 Lipschitz continuous gradient,就意味着它的导数 f 满足 Lipschitz continuous,即如果函数 f 满足 Lipschitz continuous gradient,则:

f(x)f(y)Lxy

其中,如果函数 f 满足 Lipschitz continuous Hessian,就意味着它的二阶导数 f 满足 Lipschitz continuous,即如果函数 f 满足 Lipschitz continuous Hessian,则:

f(x)f(y)Lxy

从上面的定义中可以看出,利普希茨连续限制了函数 f 的局部变动幅度不能超过某常量。同样的道理,Lipschitz continuous gradient 和 Lipschitz continuous Hessian 则限制了函数的导函数和二阶导函数的局部变化幅度。

根据上述第二种 Lipschitz continuous gradient 条件可以有以下定理:

如果函数 fRn 上满足 Lipschitz continuous gradient,则对于任意 x,yRn 有:

|f(y)f(x)<f(x),yx>|L2yx2

根据上面的公式,去掉绝对值可以得到等价表达:

{f(y)f(x)+<f(x),yx>+L2yx2f(y)f(x)+<f(x),yx>L2yx2

其余两种 Lipschitz continuous 条件也有相应的定理,具体定理与证明见 论文

Nesterov 加速技术

Nesterov 加速技术由大神 Yurii Nesterov (内斯特罗夫) 于 1983 年提出来的,它与目前深度学习中用到的经典的动量方法(Momentum method)很相似,和动量方法的区别在于二者用到了不同点的梯度,动量方法采用的是上一步迭代点的梯度,而 Nesterov 方法则采用从上一步迭代点处朝前走一步处的梯度。在几乎所有与梯度有关的算法中,Nesterov 加速技术都可以使用。具体对比如下。

动量方法:

vt+1=utvtαtg(θt)θt+1=θt+vt+1

Nesterov 方法:

vt+1=ut+1vtαtg(θt+utvt)θt+1=θt+vt+1

详见 Nesterov加速和Momentum动量方法

Reference

本文作者:凌晗

本文链接:https://www.cnblogs.com/dawnlh/p/17615770.html

版权声明:本作品采用 CC BY-NC-SA 4.0 许可协议进行许可。

posted @   凌晗  阅读(1413)  评论(1编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起
  1. 1 404 not found REOL
404 not found - REOL
00:00 / 00:00
An audio error has occurred.