zoukankan      html  css  js  c++  java
  • 非线性优化

    优化问题一直贯穿整个学习与生活,而且在数学上一直有很重要的地位。优化问题根据不同应用场景有不同的分类:如线性优化与非线性优化,无约束优化与有约束优化等等。值得一提的是,现如今我们所接触的都属于最优化问题。

    一、概述

    所谓优化,就是指在给定的目标函数中,寻找最优的一组数值映射,即 x --- min f(x)。根据导数理论,我们可以借助导数方程Δf(x)=0的求解获取有效的x的取值。然而,在实际的应用场景中,f(x)的严格数学解析式常常会非常复杂甚至没有具体形式,亦或者存在大量的自变量,这就直接导致根本无法获得导数方程,此时,就必须借助其他的方法来求解最优值了。

    当f(x)是非线性函数时,我们称为该优化为非线性优化,其本质依旧是最优化问题,在本次分享中我们聚焦于无约束的非线性优化。(有约束优化的解决方法请自行参考学习凸优化理论以及拉格朗日乘子法)

    二、参考资料

    1、高翔————《视觉SLAM十四讲》第六章 非线性优化

    2、《多视图几何》

    3、https://blog.csdn.net/xiaocong1990/article/details/82814906

    4、https://blog.csdn.net/yu132563/article/details/81239276

    三、一阶梯度法和二阶梯度法

    这里,我们称f(x)为目标函数,其代表一个高度非线性,自变量为x(维度至少为1)的函数映射。由于无法直接根据导数计算极值点(但是一般情况下导数是存在的,只是形式过于复杂或是无法通过公式表达),最有效的方法就是通过迭代的方法一步一步逼近目标函数的极值点。

    我们设计一个问题:找f(x)的最小值(此处x为n维向量,不是一维的)。根据上述说明,可以变为寻找f(x+Δx)的最小值,再依此迭代多次,逼近f(x)的最小值。此时,x变为已知(可以简单理解为初始值),而未知是Δx的大小(当然也可以理解为方向,因为n维向量表示了一个方向)。也就是说,我们希望找到一个Δx,使得函数f(x+Δx)在点x处取得最小值。那么,一个自然的想法就是将f(x+Δx)Δx求导,再另f'(x+Δx)=0就可以找到Δx的值。然而,这其实又回到了上面说的问题,即求f'(x+Δx)=0f'(x)=0是一样不可求的。怎么办?

    数学大杀器:泰勒级数展开!

    f(x+Δx)处于f(x)的邻域中,根据泰勒级数的性质和要求,在点x如下展开:​

    将上式对Δx求导,并令导函数为0,此时对应的Δx就是所求的解然而由于存在Δx的高阶项,仍然很困难获得具体数值,不过考虑到此时在x的领域内,我们可以忽略Δx的高阶项。

    1、一阶梯度法

    当仅保留一阶项时,得:(注意求导的

    上式中的J(x)在多维情况下,被称为雅可比矩阵,其实就是对f(x)求偏导。此时增量Δx的大小为:

     

    这是因为J(x)本身和Δx无关,仅仅提供一个方向(从一维度理解就是一个斜率而已),所以这里的重点是这个方向,而不是数值,而在实际使用的时候,往往会增加一个步长(也有增加归一化):

     

    这就是一阶梯度下降算法,也叫做最速下降法

    2、二阶梯度法

     和上面的问题很近似,当保留的项增加到二阶时,方程为:

    上式中的H(x)被称为Hessian矩阵,而且J(x)和H(x)在点x的值是已知的,所以上式是一个线性方程组。

    此时, Δx可求解,这个方法被称之为牛顿法

    至此,可以看到,一阶和二阶梯度法都非常直观,核心做法就是对目标函数在迭代点附近进行泰勒展开,针对更新量做最小化即可。由于展开后的方程都是线性的,因此增量的求解只需要解线性方程即可。

    但是都存在一定的问题:

    最速下降法过于贪心,容易走出锯齿路线,反而增加了迭代次数,同时在靠近极小值时收敛速度下降;

    牛顿法需要计算目标函数的Hessian矩阵,当问题规模较大时,计算困难。

    四、改进

    一阶梯度下降算法的改进大多是针对其缺点进行地改动,这些改动大多集中使用在深度学习中,如批量梯度下降算法(Batch Gradient Descent, BGD),随机梯度下降(Stochastic Gradient Descent, SGD)等等,具体的分析在后续分享会中在进行。

    我们主要来看二阶梯度下降算法的改进。总结来讲主要是针对Hessian矩阵的处理方式的不同导致出现了不同的二阶优化算法(提高效率)。

    1、拟牛顿法

           拟牛顿法是求解非线性优化问题最有效的方法之一,其本质思想是改善牛顿法每次需要求解复杂的Hessian矩阵的逆矩阵的缺陷,它使用正定矩阵来近似Hessian矩阵的逆,从而简化了运算的复杂度。拟牛顿法和最速下降法一样只要求每一步迭代时知道目标函数的梯度。通过测量梯度的变化,构造一个目标函数的模型使之足以产生超线性收敛性。这类方法大大优于最速下降法,尤其对于困难的问题。另外,因为拟牛顿法不需要二阶导数的信息,所以有时比牛顿法更为有效。如今,优化软件中包含了大量的拟牛顿算法用来解决无约束,约束,和大规模的优化问题。

    可以看出,该优化算法的关键在于近似Hessian矩阵的正定矩阵的求解,著名的方法有DFP,BFGS,LBFGS。(详细的证明推导不在此进行)

    2、Gauss-Newton

    Gauss Newton 是最优化算法里面最简单的方法之一。它的思想是将 f(x) 进行一阶的泰勒展开(请注意不是目标函数 f(x) 2 ):

    这里 J(x) 为 f(x) 关于 x 的导数,实际上是一个 m × n 的矩阵,也是一个雅可比矩阵。根据前面的框架,当前的目标是为了寻找下降矢量 ∆x,使得||f(x + ∆x)||2达到最小。为了求 ∆x,我们需要解一个线性的最小二乘问题:

    这个方程与之前有什么不一样呢?根据极值条件,将上述目标函数对 ∆x 求导,并令导数为零。由于这里考虑的是 ∆x 的导数(而不是 x),我们最后将得到一个线性的方程
    为此,先展开目标函数的平方项:

    求上式关于 ∆x 的导数,并令其为零:

    可以得到如下方程组:

    注意,我们要求解的变量是 ∆x,这是增量方程,也可以称为高斯牛顿方程 (Gauss Newton equations) 或者正规方程 (Normal equations)。我们把左边的系数定义为 H,右边定义为 g,那么上式变为:

    对比牛顿法可见,Gauss-Newton 用 JT J作为牛顿法中二阶 Hessian 矩阵的近似,从而省略了计算 H 的过程。

    然而,不同于拟牛顿法,这里JT J在实际数据中是半正定的,这也就意味着存在奇异矩阵或者病态的情况,此时算法很可能不收敛。

    3、Levenberg-Marquadt

    由于 Gauss-Newton 方法中采用的近似二阶泰勒展开只能在展开点附近有较好的近似效果,所以我们很自然地想到应该给 ∆x 添加一个信赖区域(Trust Region),不能让它太大而使得近似不准确。非线性优化种有一系列这类方法,这类方法也被称之为信赖区域方法 (Trust Region Method)。在信赖区域里边,我们认为近似是有效的;出了这个区域,近似可能会出问题。

    那么如何确定这个信赖区域的范围呢?一个比较好的方法是根据我们的近似模型跟实际函数之间的差异来确定这个范围:如果差异小,我们就让范围尽可能大;如果差异大,我们就缩小这个近似范围。因此,考虑使用:

    来判断泰勒近似是否够好。ρ 的分子是实际函数下降的值,分母是近似模型下降的值。如果 ρ 接近于 1,则近似是好的。如果 ρ 太小,说明实际减小的值远少于近似减小的值,则认为近似比较差,需要缩小近似范围。反之,如果 ρ 比较大,则说明实际下降的比预计的更大,我们可以放大近似范围。

     

    这里近似范围扩大的倍数和阈值都是经验值,可以替换成别的数值。在式(6.24)中,我们把增量限定于一个半径为 µ 的球中,认为只在这个球内才是有效的。带上 D 之后,这个球可以看成一个椭球。在 Levenberg 提出的优化方法中,把 D 取成单位阵 I,相当于直接把 ∆x 约束在一个球中。随后,Marqaurdt 提出将 D 取成非负数对角阵——实际中通常用JT J的对角元素平方根,使得在梯度小的维度上约束范围更大一些。

    不论如何,在 L-M 优化中,我们都需要解式(6.24)那样一个子问题来获得梯度。这个子问题是带不等式约束的优化问题,我们用 Lagrange 乘子将它转化为一个无约束优化问题:

    这里 λ 为 Lagrange 乘子。类似于 Gauss-Newton 中的做法,把它展开后,计算增量的线性方程:

    可以看到,增量方程相比于 Gauss-Newton,多了一项 λDT D

    当参数 λ 比较小时,H 占主要地位,这说明二次近似模型在该范围内是比较好的,L-M 方法更接近于 G-N 法。另一方面,当 λ 比较大时,λI 占据主要地位,L-M更接近于一阶梯度下降法(即最速下降),这说明附近的二次近似不够好。L-M 的求解方式,可在一定程度上避免线性方程组的系数矩阵的非奇异和病态问题,提供更稳定更准确的增量 ∆x。 

    五、总结与讨论

    1、重要的前提,那就是f(x)是连续可导,同时算法是基于迭代的,因此要有良好的初始值;

    2、上面的解法求得的只是局部最优解,而不能确定是否是全局最优解;

    3、这里只讨论了无约束的情况,而优化问题真实情况往往是存在对变量的约束的。(此时需要借助拉格朗日乘子法)

  • 相关阅读:
    swift init继承问题
    CocoaPods 使用本地代码
    关于Xcode6 Segue 的疑问,没有解决!
    Cocos2d 学习资料推荐
    iOS8中 UILocalNotification 和 UIRemoteNotification 使用注意
    Cocos2d 初学基本知识
    iOS 和 Android 触摸事件传递
    iOS NSOperation的使用
    Android 相机对焦模式
    AES 推荐文章
  • 原文地址:https://www.cnblogs.com/bupt213/p/11008526.html
Copyright © 2011-2022 走看看