搜索

耀世资讯

公司动态
行业新闻

联系我们

Contact us

电话:400-123-4567
Q Q:1234567890
邮箱:admin@youweb.com
地址:广东省广州市天河区88号

连续优化算法简介【不定时更新】

发布时间:2024-05-26 10:03:55 作者:佚名

从建模的角度说,对一个确定性的问题(如果有随机在里面,就值得另外讲一讲),有两种很常用的建模思路。一种是解方程,包括线性方程、ODE、PDE,另一种是解优化问题,应用非常广泛,比如最优运输、最优控制、图像处理、神经网络。这两个思路息息相关,简单来说,“一阶导数为零”将优化问题转化为等式问题。利用这个思路,PDE的分析有一种方法是构造energy function,通过energy递减来分析存在唯一性。(这种分析方法在ODE领域被称作Lyapunov稳定性分析,最早是用来研究动力系统稳定性的,广泛用于控制论中。知乎有很多从控制的角度理解Lyapunov的文章,比如枕月:(7)基于Lyapunov直接法的非线性系统V(x)构造与分析。后来用于证明优化算法的收敛性和收敛速度。对不同算法如何设计Lyapunov函数依然是我无法理解的玄学(艺术)领域。)应用的层面,用来解方程的一些算法可以自然的用来解对应的优化问题,比如牛顿法。

先来介绍一些常见的优化算法。大多数算法都是迭代法,每一步可由等式定义,或由优化问题定义(proximal point)。之所以有用优化问题定义的迭代方法,是因为有些函数的某种特定类型的优化问题(如proximal point)容易计算,例如 \\|\\cdot\\|_1 的proximal point有analytical solution,其他如 \\sqrt{\\langle x, Ax\\rangle}\\|\\cdot\\|_\\infty\\|\\cdot\\|_1^2 及对应的Legendre transform函数的proximal point都有简单算法计算。

1. 求解单个函数问题 \\min_x f(x) 的一阶gradient descent (gd) 系列算法。(explicit) gradient descent的优点在于容易计算,只需要gradient信息,缺点是stepsize不能太大,\
abla f 是L-Lip时最大步长是 \\frac{2}{L},收敛速度是 O(\\frac{1}{k}) (额外有strongly convexity时,即dual fn也有Lip导数时,有线性收敛速度)。(implicit)proximal point优点在于步长不影响收敛,缺点是难以计算,除非prox map有explicit formula,否则每一步要解一个优化问题。这一系列算法包括以下四种代表算法(一些带projection的算法可把projection看成proximal step)。

  • Gradient descent: x_{k+1}=x_k - \\delta \
abla f(x_k)
  • Proximal point method: x_{k+1}=\	ext{argmin}_{x}f(x) + \\frac{1}{2\\delta}\\|x-x_k\\|^2
  • Mirror descent: \
abla h(x_{k+1})=\
abla h(x_k) -\\delta\
abla f(x_k) (h可自由选择,当取quadratic时变成gd)。
  • Bregman proximal: x_{k+1}=\	ext{argmin}_xf(x)+\\frac{1}{\\delta}D_h(x,x_k) ,where D_h is the Bregman function defined by D_h(x,y)=h(x)-h(y)-\\langle \
abla h(y), x-y\\rangle ,和mirror一样可选择h,当取quadratic时变成proximal point method。

2. Nesterov 加速算法,收敛速度为只用一阶导数信息的最快速度 O(\\frac{1}{k^2}) 。另外还有引入momentum的算法,和NN里常用的Adam。

3. 不可导函数用subgradient代替gradient。

4. 两个(或多个)函数的和。这两个函数可以有不同的性质,比如一个可导一个不可导,这就相当于把不同的算法粘合在一起。例如ADMM、primal-dual、forward-backward等。

5. 利用二阶导数。牛顿法: x_{k+1}=x_k - Hf(x_k)^{-1}\
abla f(x_k)Hf 代表f 的Hessian。收敛速度快(quadratic),缺点在于有时候二阶导数无法得到,或者inverse算起来太慢,因此就有很多模拟方法,比如NN里常用的L-BFGS。另一个缺点是对初值有要求。把 f 的Hessian换成另一个函数 h 的Hessian可得到natural gradient descent。有一些研究将二阶算法和一阶结合来加速收敛。

6. 引入随机性。 比如解 \\min_{\\mu}\\mathbb{E}_{\\mu}[f] 代替 \\min_x f(x) ,或像NN一样在gradient上加随机项,或作splitting的时候随机选择需要优化的部分。

=================================================

通过算法与ODE和优化问题的关系,我们可以从有几种不同角度可以理解离散的优化算法。这些角度一方面可以指导设计优化算法,另一方面可以当作工具分析收敛性和收敛速度。

考虑迭代算法,大部分算法是靠等式定义的,比如gradient descent,有小部分是每一步要解优化问题比如ADMM,这种算法可能会很慢因为有内循环。一种理解前一种算法的思路是把每一步的等式写成对应的优化问题。以下给出几个例子。

Gradient descent,每一步相当于解x_{k+1}=\	ext{argmin}_x f(x_k) + \\langle \
abla f(x_k), x-x_k\\rangle  + \\frac{1}{2\\delta}\\|x- x_k\\|^2 。把二次项看成拉格朗日项或者penalty,意义是在上一步的周围对 f 的线性模拟求最小值。另外,如果f 的gradient是L-Lip,常取 \\delta=\\frac{1}{L} ,这时上面那个优化问题是f 的一个上界模拟,从approximation的角度可以看作每次优化一个上界估计。

Proximal method,本身的定义方法就是 x_{k+1}=\	ext{argmin}_{x}f(x) + \\frac{1}{2\\delta}\\|x-x_k\\|^2 。如果把二次项看成拉格朗日项,那么就是在上一步的附近找 f 的最小值。这里有一些变种,比如把norm换成其他norm(当 f(x)=g(x) + \\frac{1}{2}\\|Kx - u\\|^2 时,凑一个特别的norm可以让每一步变成对g 求proximal point,抵消掉K的影响,而且这样得出的算法和forward-backward算法一样,应该是quadratic的特殊性导致)。

Mirror descent可写成 x_{k+1}=\	ext{argmin}_x f(x_k) + \\langle\
abla f(x_k), x-x_k\\rangle +\\frac{1}{\\delta}D_h(x,x_k) ,和gd一样可以看成在上一步的附近找f 的线性模拟的最小值,但是这个“附近”是用Bregman div 定义的,而不是欧氏距离。

Bregman proximal的定义是 x_{k+1}=\	ext{argmin}_xf(x)+\\frac{1}{\\delta}D_h(x,x_k) ,即,在上一步的附近(Bregman意义下)找 f 的最小值。

Newton method可写成 x_{k+1}=\	ext{argmin}_x f(x_k) + \\langle \
abla f(x_k), x-x_k\\rangle  + \\frac{1}{2}\\|x- x_k\\|_{Hf(x_k)}^2 ,也就是把“附近的概念”用Hessian-induced metric来定义。Natural gradient descent类似,是用h的Hessian构造距离。

综上,常用的表示距离的函数是Bregman div和 \\|\\cdot\\|_{Hh(x_k)}^2 。把 f 用二次多项式代替时,Bregman div可近似成 h(x)- h(x_k)-\\langle \
abla h(x_k), x-x_k\\rangle\\simeq \\frac{1}{2}\\|x-x_k\\|_{Hh(x_k)}^2

Forward-backward方法,等式是 (x^{k-1}-\\gamma \
abla f_2(x^{k-1}))-x^k \\in \\partial (\\gamma f_1)(x^k) ,可以写成FB方法原本的形式: x^k=\	ext{argmin}_x\\gamma f_1(x) + \\frac{1}{2}\\|x - (x^{k-1}- \\gamma \
abla f_2(x^{k-1}))\\|^2 ,变形可得 x^k=\	ext{argmin}_x f_1(x) + f_2(x^{k-1}) + \\langle \
abla f_2(x^{k-1}), x-x^{k-1}\\rangle + \\frac{1}{2\\gamma}\\|x - x^{k-1}\\|^2 ,即线性模拟 f_2 并求proximal。也可以变形成Bregman div的形式: x^k=\	ext{argmin}_x f_1(x)+f_2(x) + \\frac{1}{2\\gamma}\\|x-x^{k-1}\\|^2 -D_{f_2}(x,x^{k-1}) ,后面那两项一个加一个减,意义就有点迷了。

Nesterov算法的这种理解也有人做[1],只不过感觉还是没有触及本质,依然是代数计算。

在抽象空间上,这种思路可以方便地定义算法(只需要有“距离”的定义)。比如Wasserstein-2空间,下降算法的定义 x_{k+1}=\	ext{argmin}_{x}f(x) + \\frac{1}{2}W(x,x_k)^2 ,是类比proximal point method(不需要导数的定义,虽然W-space有“导数”的定义)。【取其他“距离”会如何?比如KL。KL可以看成一个Bregman div。Fisher metric呢?】

同一种格式可以对应不同的优化问题(等式对优化问题是一对多的)。比如Mirror descent也对应 x_{k+1}=\	ext{argmin}_x f(x_k) + \\sum_{i=0}^k\\langle\
abla f(x_i), x-x_i\\rangle +\\frac{1}{\\delta}D_h(x,x_0) (或者把 D_h(x,x_0) 换成 h(x) ),这个问题直观理解起来没有上面的那种interpretation容易,但加一些参数可以推广成Dual averaging method。

这种理解角度可以用来设计算法或作算法分析。做分析就是用每一步的优化问题给出不等式,再利用不等式分析误差变化。设计算法的思路是,每一步在neighbor上“尽量”优化原始问题,加上penalty term为了控制每一步不要走得太远。Penalty term的选择有时为了更好的收敛速度(quadratic 提升convexity),有时为了简化计算,当然如果设计的penalty同时结合这两种优点是最好的。其实设计优化算法有很多思路都和control的思路很接近,比如这种每一步解一个优化问题的思路就很像这种控制的设计思路(Picnicraft:CLF-CBF Controller)。

上节提到,优化算法的每一步有时以等式定义,有时以优化问题定义。靠等式定义的算法可以看成是某个ODE的离散,用优化问题定义的算法可以通过optimality condition转换成等式,从而也看成是ODE的离散。通过ODE理解/分析优化算法是近些年兴起的思路。同样的给出一些例子。

Gradient descent是gradient flow \\partial_t X_t=-\
abla f(X_t) 的forward Euler离散。

Proximal method是 f 的gradient flow的backward Euler离散,同时也是 f \\square \\frac{1}{2\\delta}\\|\\cdot\\|_2^2 的gradient flow 的 forward Euler离散,这里 \\square 表示inf-convolution。因此,不同的ODE在不同的离散格式下可以导出同一种算法。

相应的,Mirror descent和Bregman proximal 分别是 \\partial_t \
abla h(X_t)=-\
abla f(X_t) 的forward Euler和backward Euler离散。【todo】

Natural gradient descent对应的ODE是 \\partial_t X_t=-\
abla^2 h(X_t)^{-1}\
abla f(X_t) ,和上一句里Mirror descent对应的ODE是一样的,只不过换了一个考虑的变量,这里是直接考虑 X_t 的,上面是考虑 \
abla h(X_t) (相当于做了个换元)。因此,同一个ODE对不同变量的离散可以导出不同的优化算法。

ADMM的ODE形式见此文章 初级优化师:机器学习与控制:ADMM的ODE模型与基于Lyapunov的收敛分析

Nesterov加速算法有几篇很火的文章也是用ODE去理解,但我认为依然没有理解透彻,因为没有解释“为什么是这种ODE/ Bregman Lagrangian”。

抽象空间中也有这种思路,比如JKO(KL div在Wasserstein-2空间的梯度下降是gradient flow的离散,它的gradient flow是Fokker Planck equation),类似的还有其他PDE在W-2空间中的gradient flow理解,这就是相反的思路:用energy函数帮助理解PDE。

如同第一种理解方法,这种ODE和优化算法的联系可以帮助设计和分析优化算法。设计方面暂时比较少见,比如Nesterov加速虽然对应一些ODE,但对这些ODE的直接离散是无法反过来得到Nesterov算法的,必须引入另一个变量,这种奇怪变量的引入令我对于Nesterov是否能从这些ODE出发来设计存疑。

但ODE的思路对分析收敛性和速度很有用。具体方式是Lyapunov分析法。Lyapunov分析直观理解是构造一个非负函数V使得在需要的那条轨迹上递减,如此可证那条轨迹会被控制在V的level set里。优化上用它证明收敛速度的方法是,构造函数 V(x)=f(t)g(x-x^*, f(x)-f(x^*), \
abla f(x)-\
abla f(x^*))x^* 是minimizer),函数 g 是我们希望估计的量的函数,比如可以取 \\|x-x^*\\|^2, f(x)-f(x^*),\\|\
abla f(x)\\|^2,Breg div等,这里的norm也不一定是Euclidean norm,所以构造g是个很“艺术”的事。证明V是Lyapunov函数后,得到V的有界性,因此得到我们需要的量( \\|x-x^*\\|^2, f(x)-f(x^*),\\|\
abla f(x)\\|^2 )的误差估计:g(x-x^*, f(x)-f(x^*), \
abla f(x)-\
abla f(x^*))\\leq \\frac{C}{f(t)} 。Lyapunov在我看来和前一节的每一步的优化问题有一定的相似性,这种相似性的原因还未知。它一般是按照导数里希望有的量凑出来的,如果希望有 \
abla f 就加入 f(X_t)-f(x^*) 项,希望有 \\frac{d}{dt}\
abla h(X_t) 就加入 D_h(x^*,X_t) 项,希望有 f(X_t) 就加入 \\int_0^t (f(X_s)-f(x^*))ds 项。对于我这种对误差分析手生的人来说,构造Lyapunov函数完全是magic。。。

对偶空间是用 \
abla \\varphi 做change of variable之后的空间,这里 \\varphi 的选择给了一定的自由度,需要是凸函数加一些性质,选择一个合适的 \\varphi 可以令到算法在新的空间里变得容易理解。从information geometry的角度看,原空间和新空间都是更根本的manifold的两个坐标系。这也给出了设计新算法的一个思路:在某个空间上设计算法,然后再做坐标变换(但是注意这样得出的算法需要容易计算才有实用性)。下面给出几个例子。

Newton method,用 \
abla f 作变量代换( Y_t=\
abla f(X_t) ),对应的ODE \\partial_t X_t=-\
abla^2 f(X_t)^{-1}\
abla f(X_t) 变成 \\partial_t Y_t=-Y_t ,即在对偶空间里直线朝着0点运动(在原空间做优化相当于在 \
abla f 给出的对偶空间到达0点)。

Interior point method求解 \\min_{x\\in \\Omega}\\langle c,x\\rangle ,转换成一个关于以 t 为参数的系列问题 \\min_x t\\langle c,x\\rangle  + \\varphi(x) ,这里 \\varphi 是barrier function。对每个 t 求 minimizer x^*(t) ,然后让t 趋向于正无穷,得到原问题的解。这里用 \
abla \\varphi 做change of variable,得到 y=\
abla \\varphi(x^*(t)) 满足的ODE是 y(t)=-tc ,是一条直线,是 \\langle c, y\\rangle 的gradient descent。

更复杂的结构 \\min_x f(x) + g(Ax) ,写成鞍点问题 \\min_x \\max_y f(x) + \\langle Ax, y\\rangle - g^*(y) ,对偶问题 \\max_y -f^*(-A^Ty) - g^*(y) 。满足一定条件时这三个问题等价。这是优化里面常用的对偶思想,设计算法时在这三个问题里面找一个最简单的问题解。有时对偶问题的性质比原问题好(强凸之类的),或者对偶问题有explicit formula,那么应当求解对偶问题。有些算法是在鞍点问题上设计的,比如primal-dual,ADMM等。

到目前为止,算法的提出靠的是对之前已有算法的理解,而不是在某个大的框架下的构造。每提出一个算法,依然要重新证明收敛性、不同条件下的收敛速度,而不是由一个大的框架直接导出收敛速度(即使是Lyapunov分析也要构造Lyapunov函数,而且离散的情况要做误差估计,这些分析需要对于不等式的“熟悉”)。比如Nesterov加速之所以加速是因为某些代数计算的结果,因此为什么想出这种算法、如何迁移到其他的优化setup(如非凸、随机)依然是具体问题具体分析的。不同的算法虽然有最低要求、不同假设下的收敛速度分析,但任给一个函数,如何选择“最好的”算法、当这个函数不满足假设时如何调整或“粘合”算法设计出适合此函数的算法,依然是让人费解的问题。因此,我认为优化算法需要一个大框架,我也很好奇这个大框架是什么,可惜没有思路,感觉自己手头上的是trick而不是framework / theory。

=================================================

除了以上的三种理解思路,优化里面还有一些tricks。

一些n维最小值问题可以变成更高维的min-min问题。比如 \\min_x f(x)+g(x) 可以变成 \\min_{x=y}f(x)+g(y) 用ADMM求解。【todo】

【todo】

有一些tricks可以加速算法,或者提升实际应用中的效果,比如用over-relaxation steps和restarting。Restarting顾名思义,进行到某一步之后重启算法。Over-relaxation是指每一步算法之后,顺着它的方向再走一点,有点加个momentum的感觉,只不过要小心设计往前走多少(步长)。proximal step可以用这种方法,因为proximal相当于对 f\\square \\frac{1}{2}\\|\\cdot\\|^2 走了 \\frac{1}{L} 步长的gradient descent,理论上gd可以走 \\frac{2}{L} 步长,因此proximal step可以再顺着相同的方向往前走一段。著名的FISTA就是在forward-backward后加了这一步。另外,Nesterov算法也有这一步。只是这些算法的步长都是从误差分析里计算得出,像Nesterov的神秘步长 \\frac{k}{k+3} 完全无法理解。。

有时候也怀疑优化这个领域到底需不需要 / 存不存在一个大的框架。不同的函数不同的性质需要不同的算法是很自然的事情。以上各个角度也是well-known的事情,“每一步解一个优化问题”算是加了一个penalty项,常常被用来构造不等式分析每一步的下降,从而从离散的角度证明收敛及速度;ODE角度用来从连续的角度证明收敛及速度;对偶关系用来选择一个简单的等价问题。很多优化方法是“粘合”这些角度做成的,比如primal-dual是用对偶思路转换到鞍点问题,然后加penalty term设计出来的;ADMM也是差不多的思路(对偶+penalty+splitting)。根据不同的函数性质,人们构造出不同的“距离函数”以简化计算、提高速度。因此构造这些函数 / metric是problem-dependent的,也许试图构造框架才是走偏了。谁知道呢。


本文只总结了连续优化问题比较出名的简单算法,这些算法在上波图像处理的热潮当中逐渐发展起来,每个算法都有很多变种,literature实在太多,难以总结。其他领域也有很多著名的优化算法,比如linear programming的simplex method、图问题里的max-flow和min-cut、近期神经网络热潮火起来的带随机的各种算法、处理约束条件的barrier method和interior point method等等,这些特定的算法是为了特定的问题设计的优秀算法,很难放在一个大框架下整理,因此本文没有涉及,之后有机会再开新文吧。给出一些参考资料[2][3]。最近优化有点看腻了,被细节缠住,可能要抽离一段时间再随缘更新。

热线电话:400-123-4567
电子邮箱:admin@youweb.com
Q Q:1234567890
地址:广东省广州市天河区88号
备案号:
耀世娱乐-耀世平台-耀世加盟站

关注我们

Copyright © 2002-2017 耀世-耀世平台-耀世加盟站 版权所有

平台注册入口