到底什么是非线性规划?

本文转自新浪博客《到底什么是非线性优化?》作者:那些年的那些偏执
网址:http://blog.sina.com.cn/s/blog_7445c2940102x3x4.html
作者系在读博士生。文章写的非常浅显易懂。本文除转载之外,做简单修改整理,重新编辑公式,并加入个人注释。

你是否也对非线性规划这个领域望而却步?​​​
你是否也在思索非线性规划求解方法的根源?​​​
你是否也苦恼于非线性规划到底在研究什么?
如果你的回答是肯定的,说明我们是一样的。那么,让我们从这里开始,一起尝试去移走上面的三座大山。​


到底什么是非线性规划?​

其实,在上高中的时候我们就已经对非线性规划的求解方法了然于心了。可见,非线性优化并不是我们想的那么困难,只不过在后来由于学习了大量的新知识,而迷失其中。你可能不相信,那么让我们一同回到高中的数学课上。数学老师给了如下的问题:​​ y=x2+2x+1 y = x 2 + 2 x + 1 的最小值是什么?

如何找到上面这个函数的最小值?相信你很快的就能想起上面这个问题的解法,并且求出上面这个函数的极值。而至此,我们已经解决了一个非线性规划的问题。​为什么这么说呢?请看下面的公式:

minxf(x) min x f ( x )

当这个公式中的 f(x) f ( x ) 是一个非线性函数的时候,上面的问题就是一个非线性规划的问题。​也就是说,非线性优化问题是针对一个非线性函数求最值的问题。那么,再让我们回过头看一看数学老师出的问题,这不就是一个非线性优化问题吗?​而且,求解方法也很简单,就是对函数求导,再令导数为零,我们就找到了极值点。可见,非线性优化并不是一个高不可攀的山峰。​

对于有约束条件的问题,如果约束条件是非线性的,那么这个问题也属于非线性规划问题范畴。

那么,我们是否可以对所有的非线性优化问题,都可以用上面的解法呢?很遗憾,对于很多情况,通过导数为零求解析的求出极值点,是做不到的。如下式:​​

f(x,y)=x3+yex+y2+xy+4 f ( x , y ) = x 3 + y ⋅ e x + y 2 + x y + 4

我们对 x,y x , y 分别求偏导,得到:​​
xf(x,y)=3x2+yex+yyf(x,y)=2y+ex+x ∂ ∂ x f ( x , y ) = 3 x 2 + y ⋅ e x + y ∂ ∂ y f ( x , y ) = 2 y + e x + x

我们很难直接的从上面的式子中,求出导数为 0 0 的点。一方面,是因为该函数已经不是初等函数。另一方面,是因为增加了未知数(变量)的个数。为了解决这个难题,我们重新回到数学老师给的问题,如下:​

y=x2+2x+1

这个函数是一个单变量的非线性函数,而且极值点只有一个。即使,增加 x x 的幂次方,不过是增加了几个极值点。我们还是可以通过之前的办法,只不过将每个极值点的值都带回方程进行比较,找到整个函数上的最小值。无论,这个单变量函数如何复杂,都可以画在一个二维坐标中,如下:

复杂的单变量函数

上图中,点x1和点 x3 x 3 是极小值点,点 x2 x 2 是极大值点,而点 x4 x 4 既不是极大值点,也不是极小值点。通过比较我们知道,点 x3 x 3 是全局最小值点,而点 x1 x 1 是局部最小值点。

但是,如果增加函数的自变量个数(维度)会发生什么呢?比如,只再增加一个变量 y y ,此时函数变为f(x,y),而这个函数在x和y的方向上都有多个极值点。这时,我们还能将这个函数表示在三维坐标系下,如下:
多变量函数

此时,极值点的分布就比一维的情况复杂了许多。当变量个数继续增加的时候,极值点的个数会成几何倍增加,显然也就无法通过求解出所有极值点再比较大小的方法,实现对问题的求解。​

如何求解复杂的非线性优化问题?

上面的方法是一种贪心解法,希望直接找到问题的解。俗话说,饭得一口一口吃,不能一口吃个胖子。这里要注意的一点就是,虽然我们不能直接找到导数值为零的点。但是,非线性函数常常是可微的,也就可以计算出每一点的微分。也就是说,既然不能直接找到极值点,我们就应该一步一步的逐渐逼近函数的极值点。​

我们将原问题找 f(x) f ( x ) 的极小值(此处 x x n n 维向量,不是一维的),变为找到fx+Δx)的极小值,再依此迭代多次,逼近 f(x) f ( x ) 的最小值。此时, x x 变为已知,而 Δx Δ x 未知(当然也可以理解为方向,因为 n n 维向量表示了一个方向)。也就是说,我们希望找到一个Δx,使得函数 fx+Δx) f ( x + Δ x ) 在点 f(x) f ( x ) 处取得最小值。那么,一个自然的想法就是将 fx+Δx) f ( x + Δ x ) Δx Δ x 求微分,再令 fx+Δx)=0 f ′ ( x + Δ x ) = 0 就可以找到 Δx Δ x 的值。然而,这其实又回到了上面说的问题,即求 fx+Δx) f ( x + Δ x ) fx) f ( x ) 是一样不可微的。那么怎么办呢?​这就要祭出一个大杀器——泰勒级数展开​(有人称为线性化,其实不太准确。在一阶泰勒的情况下却是是线性的,但是如果加了高阶则不是线性了。)

这一段我认为原作者写的不太好。重写如下:
···
首先我们给定一个起始点 x x (注意,这里的 x x 是一个向量,包含所有自变量)。我们不能直接找到极小值点,那么我们就先观察这个起始点附近一定范围内最小的点。以 x x 为中心,附近的点的函数值可以表示为 fx+Δx) f ( x + Δ x ) 。这样,问题变成了求函数 ψ(Δx)=f(x+Δx) ψ ( Δ x ) = f ( x + Δ x ) 的极小值点。如果我们找到了 ψ(Δx) ψ ( Δ x ) 的极小值点,就可以将这个极小值点设为新的观测点 x x ′ ,再次寻找 x x ′ 附近的极小值点,就这样一步一步靠近真正的函数 f(x) f ( x ) 极值点。
ψ(Δx) ψ ( Δ x ) 仍然不可微,那么如何求函数 ψ(Δx) ψ ( Δ x ) 的极小值点呢?这就要祭出一个大杀器——泰勒级数展开​(有人称为线性化,其实不太准确。在一阶泰勒的情况下却是是线性的,但是如果加了高阶则不是线性了。)

因为,我们求的 fx+Δx) f ( x + Δ x ) 处于 x x 的邻域中,所以就可以用泰勒级数在点 x x 处展开,如下:

ψ(Δx)=f(x+Δx)=f(x)+f(x)Δx+12Δx2f(x)Δx+ ψ ( Δ x ) = f ( x + Δ x ) = f ( x ) + ∇ f ( x ) Δ x + 1 2 Δ x ∇ 2 f ( x ) Δ x + ⋯

是梯度算子符号,可以简单理解为对应一维情况中得求导数。详见维基百科页面。这里原文使用了单变量函数的泰勒展开式,其实用在这里不妥。
在Ceres教程中使用了 ϵ ϵ 而不是 Δx Δ x 表示步进。我认为 ϵ ϵ 更贴切,因为这里的跨度不能太长,即邻域不能太大,否则泰勒展开式的误差过大。

将上式对 Δx Δ x 求导,并令其等于0,得到:​​

ψ(Δx)=f(x+Δx)=f(x)+2f(x)Δx+ ∇ ψ ( Δ x ) = ∇ f ( x + Δ x ) = ∇ f ( x ) + ∇ 2 f ( x ) Δ x + ⋯

因为上式存在 Δx Δ x 的高阶项,所以还是很难得到上式的解。不过,由于是在点 x x 的邻域内,因此我们可以忽略Δx的高阶项。

  1. 当我们只保留一阶项的时候,得到如下式子:​

    ψ(Δx)=f(x+Δx)=f(x)=J(x) ∇ ψ ( Δ x ) = ∇ f ( x + Δ x ) = ∇ f ( x ) = J ( x )

    上式中的 J(x) J ( x ) 在多维情况下,被称为雅可比矩阵,其实就是对 f(x) f ( x ) 各个变量分别求偏导。接着,一般教材就会直接给出(最速下降)增量 Δx Δ x 的大小,如下:

    Δx=JT(x) Δ x = − J T ( x )

    这个过程其实不太好理解。因为,如果从一维的角度理解,那么此处的 f(x) f ′ ( x ) 只是一个斜率,按理说斜率的多少跟 Δx Δ x 的值是无关的,只要 Δx Δ x 值不要太大保证在邻域内就可以。所以,直接得出上面的式子就感觉很诡异。​其实,换一个角度解释上面的式子就很容易理解。这里让 Δx Δ x 等于负梯度,重点并不在于大小,而是规定了 Δx Δ x 的方向。其实,即使在一维问题里,我们也可以这么理解, Δx=k Δ x = − k ,此处的 k k 只用于提供方向,也就是正负号,而不代表走多远。​对于多维情况更是如此,因为我们需要知道增量的方向,而方向是由Δx各维度(相对)大小决定的。其实,一个更清晰的表示应该是将梯度归一化,然后再乘以一个步长系数 λ λ ,如下所示:​

    Δx=λJT(x)|JT(x)| Δ x = − λ J T ( x ) | J T ( x ) |

    ​这个方法也就是我们经常听到的——最速下降法

  2. 如果我们保留到二阶项的时候,得到如下式子:​

    xψ(Δx)=xf(x+Δx)=J+2x2f(x)Δx=J(x)+H(x)Δx=0 ∂ ∂ x ψ ( Δ x ) = ∂ ∂ x f ( x + Δ x ) = J + ∂ 2 ∂ x 2 f ( x ) Δ x = J ( x ) + H ( x ) Δ x = 0

    上式中的 H(x) H ( x ) 被称为Hessian矩阵,而且 J(x) J ( x ) H(x) H ( x ) 在点 x x 的值是已知的,所以上式是一个线性方程组。若上述函数二次可微,即解得:

    这个方法叫作牛顿法

    原文这里应该是笔误了。原文写作H(Δx)=JT,其实括号应该去掉。
    牛顿法需要对目标函数求Hesse矩阵,这会相对复杂一点,但是牛顿法要比最速下降法的收敛速度快。对于无法求得Hesse矩阵的目标函数 f(x) f ( x ) ,可以尝试拟牛顿法。

非线性规划到底研究什么?​

说到这里,你可能会疑惑,既然非线性优化好像通过上面的方法都可以求解,那么为什么还有那么多数学家在研究这个问题。或者说,是不是世间所有非线性规划问题,都可以通过上述方法求解呢?要想回答这个问题,我们需要重新来审视一下上面的求解过程。​

  1. 其实这个过程有个重要的前提,那就是 f(x) f ( x ) 是连续可导。如果 f(x) f ( x ) 这个函数不可导,或者不可微呢?比如说,在SLAM中需要处理姿态估计的问题。而姿态是通过旋转矩阵和平移向量表示的,这显然是不连续的。但是,由于旋转矩阵是一个李群,那么我们可以将其映射到其李代数上。而且,李代数是可以求导的。所以我们就还可以利用非线性优化的方法对姿态进行估计。也就是说对于不连续的函数,我们可以想办法将其变得连续,从而继续用这种方法。​

  2. 上面的解法求得的只是局部最优解,而不能确定是否是全局最优解。因为,这种方法可以说是一种“近视眼”的方法,它只看到下一时刻,在邻域内的最小值,而不能全局的寻找。所以,很容易陷入到局部最优中,或者说最终求出的最优值是跟初始位置极度相关的。即使初始值在同一个位置,也很有可能落入到两个不同的局部最优值中,也就是说这个解是很不稳定的。所以,如何解决这个问题,至今仍然存在很大的挑战。​​

    比如凸优化就可以在一定程度上解决这个问题。凸优化的思想是,如果局部最优就是全局最优,就不存在这个问题了。那么如何将一个非凸的问题转换成凸的呢?或者什么问题就是凸的,什么是非凸的呢?​​

在此,只是粗浅的举了两个例子,其实非线性优化中存在的问题还有很多很多。而且我们在这里只讨论了无约束的情况,而优化问题真实情况往往是存在对变量的约束的。本文只是希望破除我们心中对非线性优化的恐惧,勇敢的迈进非线性优化这道大门。

本人也是半路出家,有很多不严谨的地方,希望大家多包涵,多指正,也欢迎大家在留言中多多交流。


正如原文作者所说,本文旨在抛砖引玉快速入门。对非线性规划问题有个简单快速的认识。但其实真正解决非线性规划问题仍然是非常复杂的。这里推荐一本入门教材《最优化理论与算法(第2版)》(陈宝林,清华大学出版社)。这本教材门槛比较低,从简单的数学概念开始讲起。对各个定理也有详细的证明。而且还有很多的例题帮助理解。也涉及到很多经典算法的讲解,但是根据评论,书中算法比较旧,对新算法新理论的涉及比较少。不过入门有余。网络上有PDF版,下载请自行承担法律风险。

  • 44
    点赞
  • 146
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值