zoukankan      html  css  js  c++  java
  • 常用非线性优化算法总结

    非线性最小二乘

    定义:简单的非线性最小二乘问题可以定义为

    [min_{x} frac{1}{2}||f(x)||^2_2 ]

    其中自变量(x in R^n),(f(x))是任意的非线性函数,并设它的维度为(m),即(f(x) in R^m).

    对于一些最小二乘问题,我们可以利用目标函数对(x)求导并令导数等于0来求解。但是导数

    [frac{d(frac{1}{2}||f(x)||^2_2)}{dx}=0 ]

    不一定可以直接求解(x),这个导函数可能是一个复杂的非线性方程。这种情况下一般采用迭代来求解,具体步骤可以表示为 :

    • (1) 给定一个初试值(x_0)
    • (2) 对于第(k)次迭代,寻找一个增量(Delta x_ k),使得(||f(x_k+Delta x_k)||)达到极小值
    • (3) 若(Delta x_k)足够小,则停止迭代
    • (4) 否则,令(x_{k+1}=x_k+Delta x_k),返回第(2)步骤

    这个其实是通过迭代让目标函数一步步下降,直到最终达到收敛为止。一般而言,增量(Delta x)可通过一阶梯度或二阶梯度来确定。

    一阶梯度和二阶梯度法

    首先,我们将目标函数在(x)附近进行泰勒展开

    [||f(x+Delta x)||^2_2 approx ||f(x)||^2_2+J(x)Delta x+frac{1}{2}Delta x^T H(x) Delta x ]

    这里的(J(x))(f(x))关于(x)的导数(雅可比矩阵),(H(x))是二阶导数(海森矩阵)。我们可以选择保留泰勒公式的一阶导数和二阶导数,如果保留一阶导数,则增量的解就是

    [Delta x^* = -J^T(x) ]

    它理解起来就是,沿着沿着梯度相反的方向前进,目标函数下降得最快。通常会在这个方向上计算一个步长(lambda),迭代公式表示为

    [x_{k+1} = x_k - lambda J^T(x_k) ]

    该方法称为最速梯度下降法。如果保留二阶梯度信息,增量可以表示为

    [Delta x^* = arg min_{Delta x} ||f(x)||^2_2+J(x)Delta x+frac{1}{2}Delta x^T H(x) Delta x ]

    (Delta x)求导数并令它等于0,则

    [J^T+HDelta x = 0 ]

    于是增量的解为

    [HDelta x = - J^T ]

    这种方法称为牛顿法,它的迭代公式可以表示为

    [x_{k+1}=x_k-H^{-1}J ]

    牛顿法和最速梯度下降法思想比较简单,只需要将函数在迭代点附近展开,然后对增量求最小化即可,然后可以通过线性方程直接求的增量的解。这两种方法的主要缺点为:

    • 最速梯度下降过于贪心,容易走出锯齿状,反而增加了迭代次数
    • 牛顿法则需要计算函数的(H)矩阵,这在问题规模较大时候非常困难,通常做法是避免去计算(H)

    下面介绍了高斯牛顿法和列文伯格-马夸尔特法(LM)法更为实用。

    高斯牛顿法

    高斯牛顿法的思想是对(f(x))进行一阶泰勒展开,注意不是目标函数(||f(x)||^2_2)

    [f(x+Delta x) approx f(x) +J(x)Delta x ]

    其中(J(x))是f(x)关于(x)的导数,称为雅可比矩阵,维度为(m imes n).于是我们需要

    [Delta x^* = arg min _{Delta x}frac{1}{2}||f(x)+J(x) Delta x||_2^2 ]

    我们继续对(Delta x)求导并令导函数等于0

    [ abla_{Delta x} frac{1}{2}||f(x)+J(x) Delta x||_2^2 quadquadquadquadquadquadquadquadquadquadquadquadquadquadquad \ = abla_{Delta x} frac{1}{2}[f^T(x)f(x)+2f^T(x)J(x)Delta x+Delta x^TJ^T(x)J(x)Delta x] \ =J^Tf(x)+J^TJDelta x =0 quadquadquadquadquadquadquadquadquadquadquadquadquadquadquad ]

    从而

    [J^TJDelta x = - J^Tf(x) ]

    (H = J^TJ,g = -J^Tf(x)),则

    [HDelta x = g ]

    上述方程称为高斯牛顿方程或正规方程。对比牛顿法可见,高斯牛顿法采用(J^TJ)牛顿法作为牛顿法(H)矩阵的近似,从而避免了复杂的计算。原则上,它要求近似的矩阵(H)是可逆的(而且是正定的),而实际计算中得到的(J^TJ)却是半正定的。也就是使用高斯牛顿法会出现(J^TJ)为奇异或者病态情况,此时增量的稳定性较差,导致算法不收敛。即使(H)非奇异也非病态,如果求得的(Delta x)非常大,也会导致我们采用的局部近似不够正确,这样以来可能不能保证收敛,哪怕是还有可能让目标函数更大。

    即使高斯牛顿法具有它的缺点,但是很多非线性优化可以看作是高斯牛顿法的一个变种,这些算法结合了高斯牛顿法的优点并修正其缺点。例如LM算法,尽管它的收敛速度可能比高斯牛顿法更慢,但是该方法健壮性更强,也被称为阻尼牛顿法。

    LM算法

    高斯牛顿法采用二阶泰勒展开来近似,只有在展开点附近才会有比较好的近似效果。LM(Levenberg -Marquard)算法中给变化量(Delta x)添加一个信赖区域来限制(Delta x)的大小,并认为在信赖区域里面近似是有效的,否则近似不准确。

    确定信赖区域一个好的办法是通过比较近似模型和实际模型的差异来确定,如果差异小,我们就让范围尽可能增大;如果差异太大,就该缩小这个范围。考虑实际模型和近似模型变化量的比值

    [ ho = frac{f(x + Delta x) - f(x)}{J(x) Delta x} ]

    上面式子可以通过( ho)的值来判断泰勒近似的好坏,其中分子是实际模型的变化量,分母是近似模型的变化量,当

    ( ho)接近1的时候表明近似模型是非常好的,如果( ho)较小,则实际模型的变化量小于近似模型的变化量,则认为近似模型较差,需要缩小近似范围;反之,当( ho)较大时,说明实际模型变化量更大,我们需要放大近似范围。因此(LM)算法可以表示如下

    • (1)给定初始迭代值(x_0)以及初始优化半径(mu).

    • (2)对于第(k)次迭代,求解优化问题

      [min_{Delta x_k} frac{1}{2}||f(x_k)+J(x_k)Delta x||^2 \ s.t. quad ||DDelta x_k||^2 leq mu. quad quad ]

    • (3)计算( ho).

    • (4)若( ho > 3/4),则(mu = 2 mu).

    • (5)若( ho < 1/4),则(mu = 0.5 mu).

    • (6)如果( ho)大于某阈值,则认为近似可行。令(x_{k+1} = x_k + Delta x_k).

    • (7)判断算法是否收敛。如果不收敛,跳回步骤(2),否则结束。

    上面算法中,(mu)是信赖区域的半径,其实是一个球形的区域,该约束认为只有在球内才是有效的,带上矩阵(D)后就是一个椭球。

    采用拉格朗日乘子将上述问题转化为一个无约束问题

    [min_{Delta x_k} frac{1}{2}||f(x_k)+J(x_k)Delta x_k||^2+frac{1}{2}lambda||DDelta x_k||^2 ]

    (Delta x_k)求梯度,得到增量方程

    [(H+lambda D^TD)Delta x=g ]

    可以看到,增量方程在搞死牛顿法上多了一项(lambda D^TD),如果令(D=I),则简化版本表示为

    [(H+lambda I)Delta x = g ]

    (lambda)较小时,说明(H)占主导地位,说明二次近似在该范围类是比较好的,LM方法更接近于高斯牛顿法;另一方面,当(lambda)较大时,(lambda)占主导地位,LM算法更接近一阶梯度下降算法,这说明二次近似不够好。LM算法的求解方式,可以避免线性方程组的矩阵非奇异和病态等问题,提供更稳定、更准确的解法。

    总结

    总而言之,非线性优化问题的框架分为Line Search 和Trust Region两类。Line Search 先固定搜索方向,然后在该方向上寻找步长,以最速下降法和高斯牛顿法为代表。而Trust Region是先固定搜索区域,再考虑该区域里面的最优点,此类方法以LM算法为代表。

  • 相关阅读:
    2.2.7将任意对象作为对象监视器
    2.2.6验证同步代码块时锁定当前对象的
    2.2.5synchronized代码间的同步性
    2.2.4一半异步,一半同步
    2.2.3用同步代码块解决同步方法的弊端
    FL2440 ubifs文件系统烧录遇到的问题——内核分区的重要性
    FL2440 rt3070模块ap模式移植
    FL2440 rt3070模块station模式动态获取IP地址
    FL2440 rt3070模块station模式移植
    fl2440 platform总线button字符设备驱动
  • 原文地址:https://www.cnblogs.com/tandier/p/10087632.html
Copyright © 2011-2022 走看看