zoukankan      html  css  js  c++  java
  • 优化二三事

    最优化问题,无非就是求最值。一般地,设变量为X(向量),要求 f(X) 的最大值或者最小值,变量X的可能的取值空间由一组约束给定。这组约束可能是不等式(相当于将原空间切开取一部分),也可能是等式(相当于取原空间的低维子空间)。若没有约束,则 X 可以取使得 f(X) 有定义的任意值。

    求这类优化问题,f(X)的形式已经给定了 f 的取值关于 X 变化的完整情况,而约束仅仅是限定了X的取值范围。我脑中常常用二元的优化问题来想象这个问题,这时候 f(X) 给定了三维空间的一个曲面,对应每一个 X 的值都有一个对应的 f 高度值,f(X) 的形式就已经完全地描述了这张曲面的起伏与延展的情况,而约束则划定了我们将关注这个曲面上的那一块,这就好比把整个地球只划出了一部分做成沙盘,让你在沙盘上找到最高的和最低的点。

    不过与看沙盘不一样,优化问题的困难之处就是这个要看的沙盘会是无限大的,如果不知道全貌,你永远不能保证这个山峰就是最高的,或者这个山谷就是最低的。用这一个想法可以类比地联系起后面很多会提到的优化方法。

    其实这种最值问题我们很早就接触到了。我想最基本的方法是利用那些已经研究透了的函数性质,例如二次函数这样的初中就已经背熟的公式。但这些函数所能解决的问题实在是很有限。利用不等式也可以解决很多问题,用得最多的或许就是均值不等式、Cauchy-Schwarz不等式还有Jensen不等式。不过这些不等式也只能解决一些形式非常好的情况,而且一旦最优解不在 X 的取值范围内,则这些不等式将束手无策。

    更通用的方法是使用高等的工具,在一元微积分里,对于函数的最值我们有通用的求法,即最值只可能出现在:1)取值范围的边界(如果没有边界,则为正负无穷);2)导数为0的点(驻点);3)不连续点;4)不可导点。边界值及不连续点和不可导点通常易于考察,所剩下的工作无非是对函数求导,然后令 f'(X)=0,解方程得到所有驻点,再依次排查即可。

    然而有时这样的工作仍显繁琐,利用一些函数和取值空间的性质,可以得到更简化的结果。一类应用广泛的例子是针对凸集和凸函数的优化。一个典型的凸函数是二次函数 y=x^2,这类凸函数只有唯一一个全局极值点,因而也就是唯一一个最值点。对于加约束的优化问题,只需要看这个最值点是否在约束限定的范围内,若在,则可直接取该点;若不在,则一定可以在区域的边界发现最值。这样一来,优化问题的解就大大简化了。

    正式一点的对凸集的定义是若对于 A 中的任何 X 和 Y,任何0<=a<=1,aX+(1-a)Y 都仍属于A,则 A 即为凸集。其实该定义规定的是一种线性约束,但是是有条件的线性约束,凸集不能张成整个空间,因为对 a 有限制。但总的来说,凸集是保留了线性空间很多性质的一个线性空间的子集。所以很容易就可以证明 AX<=b 这样的约束所限定的集合是凸集。看起来任何线性约束的综合,都会限定一个凸集。这也就是为什么线性规划里面,当我们用一条条直线框定可行解空间的时候,得到的总是一个凸图形。

    凸函数的定义来源于凸集所定义的形状,这种形状可以用Jensen不等式很好的描述出来。但若需要了解其分析性质,还需要使用二阶导数。

    优化问题可以推广到多维的情况,我们所需要关注的是以下几点:
    1)求出其梯度为零的点
    2)考虑约束边界的取值情况(这一步通常使用Lagrange Multiplier的方法,这里不详述)

    然而不同于一元的情况,第1)步的求解通常很复杂,或者根本难以求出。对于一元变量很简单的二次方程,到高维的情况就变为二次型 X'AX=b 这类的方程,看起来是非常难解的(目前我尚不知道有没有有效的解法)。这或许也是维度灾难所带来的困惑之一吧。凸优化带来的好处是1)步只会有一个解,但解这个解也并非容易。所以往往在复杂的曲面上求最值得时候,往往利用局部的凸性提供一个解得方向。

    正因为这样的问题,使得精确求解变得不现实或者不可能,我们不得不求助于一些近似解的工具,这就好比给了我们整个地球,我们却无法看清它的全貌,也没有办法描述它的最高点和最低点在何处。于是一些很直观的办法被提出,比如牛顿法、梯度下降、最速梯度下降、模拟退火、遗传算法等等。其实如果想象我们只能用双脚行走,要通过这种方式找到最大值或者最小值,我们就只能用眼睛看,要找最小值就一直沿着地势向下的方向行走。如果先走一步,然后抬头看一下哪里下的最快,就再往那个方向走一步,这样一直走,总可以找到一个较好的较小的值,这就是梯度下降。最速梯度下降让人可以看得更远,每一次迈步的时候,确认了方向就往那个方向跨一大步,直到那个方向走不动了为止,这时再抬头看,找到下降的方向,再跨一大步。牛顿法则看得更多一些,使用牛顿法的旅行者可以环视四周,看清周围的地貌,用一个凸函数对附近的地貌进行建模,算出它的最低值,然后精确地走到那里去。不过这显然需要更多的计算量,对于不平坦的崎岖的曲面,这个方法也不一定可以很好的适用。模拟退火算法我没有真正研究过,但在翻书和与别人的交流过程中模糊的印象是使用这个方法的旅行者似乎不看周围的地貌,而且不能步行,只能跳,只能感受到跳过之后是更高了还是更低了(根据跳的是否轻松),但身上带着绳子,可以随时沿绳子调回原来的地方,由于看不到周围,每一跳都带有随机性,如果跳得更低,则认可该跳,将绳子栓到这里,并从那个地方开始下一跳,而若跳得更高,则可以沿绳子方向跳回,再跳一次。另一方面,旅行者体力有限,每跳一次都会损失一些体力,我们可以设想在这种情况下,当旅行者体力用尽的时候,他应该停在一个地势较低的地方。遗传算法则需要考虑一个在“寻找最低点”的种群,每一个山谷都有水和食物,地势越低的地方水和食物越多,因此最擅长于找到地势低的点的个体可以最好的存活,通过遗传、变异,其下一代可以期望产生更擅长于找到低地势的点的个体,由此一代代繁衍,最优秀的个体总可以找到很好的解。

    在Machine Learning中,梯度下降方法或许是最常用的寻找数值最优解的方法,在神经网络里面这种方法有广泛的应用,原因应该就是它的简单性。对于其他的方法,牛顿法需要求Hesse矩阵的逆,最速梯度下降步长的计算也涉及到Hesse矩阵的二次型,至于模拟退火、遗传算法等由随机化带来的复杂性会产生很大的计算量。其实这样想起来Machine Learning这个里面也有很多考量的出发点也会如此实际。

    而高维世界的这一切与众不同的地方,或许都是由那场维度灾难引起的。
  • 相关阅读:
    SSM环境搭建
    spring 开发 Tars
    Tars --- Hello World
    Java IO流
    Java集合
    常用类
    Pwn With longjmp
    格式化字符串漏洞利用实战之 njctf-decoder
    一步一步 Pwn RouterOS之ctf题练手
    srop实战
  • 原文地址:https://www.cnblogs.com/alexdeblog/p/3119743.html
Copyright © 2011-2022 走看看