zoukankan      html  css  js  c++  java
  • 陆吾生最优化计算听课笔记1

    第一堂课的内容主要是关于无约束最优化问题的。一开始,讲了如何将解方程问题归结为最优化问题。假设我们要解以下方程组,共有$m$个方程:

    egin{align*}&p_1(x)=0\&p_2(x)=0\&...\&p_m(x)=0end{align*}

    其 中$x$是n维欧式空间$mathbb{R}^n$中的一个向量,$p_i(x)$是关于$x$的函数,可以是线性也可以非线性。我们的目标是找到一个 使上式都满足的$x$。这里需要讨论$m$与$n$的关系,如果$n>m$,这个方程组有很多解,如果$n<m$这个方程无解,如 果$n=m$这个方程组有唯一解。

    实际上,直接去解这个方程组是很困难的,因为式子左端的函数可以是非线性的,可以是复杂的多项式,甚至是更复杂的三角函数、对数函数组成的代数方程。所以通常我们不是直接去解这个方程的。我们希望能把这个方程组简化一下。怎么简化呢?

    我们注意到一个$p(x)$的平方很有用的性质,即$p^2(x)geq 0$,且$p(x)=0$等价于$p^2(x)=0$

    因此,原方程组等价于

    egin{align*}&p^2_1(x)=0\&p^2_2(x)=0\&...\&p^2_m(x)=0end{align*}

    我们可以进一步把上述的形式等价地写成

    $$sum_{i=1}^m p_i^2(x)=0$$

    为什么二者等价呢?

    首先如果方程组成立,则$sum_{i=1}^m p_i^2(x)=0$一定成立

    其次,因为$p^2(x)geq 0$,故$sum_{i=1}^m p_i^2(x)geq 0$,假如某个$p^2(x)>0$会导致和式一定大于0,要保证和式为0,只可能是所有$p_i(x)$都等于0。

    令$f(x)=sum_{i=1}^m p_i^2(x)$,则$f(x)$有最小值0,满足$f(x)=0$的点就是方程组的解

    然而一般的方程组不一定有解,即不存在一个点满足所有式子,使得$f(x)$为0(但由于有的方程组无解,所以$f(x)$必定取不到0,但其最小值可能只比0大一点)。 但在许多工程邻域中,我们希望至少能有个近似解,因此我们退而求其次,既然没有解,那我们找近似解不就好了?近似解不要求所有式子都满足,只要左右两端的 误差不超过一定的精度就可以了。显然$f(x)$越接近0越好,因此,求解近似解问题就转化为求$f(x)$的最小值

    $$ min f(x) $$

    如 精度为$f(x)geq 10^{-3}$。这样的解也是很好的近似,假设有100个方程,那么每个方程平均分到的解的精度为$10^{-5}$,或者我们可以说每个方程的解的精 度至多不超过$10^{-3}$。不过有时候其中只有几个式子非常重要(或者说对精度要求非常高),其他的则没有那么重要(精度要求比较低)。在这种情况 下,我们可以为每个式子分配一个权重,用来强调式子的重要性。

    $$ min sum_{i=1}^m w_ip_i^2(x)$$

    这是一个无约束最优化问题,求解无约束最优化问题有两种方法:解析法和数值法。

    解析法的基本思路是对$f(x)$求导,然后令导数为0,再根据二阶导判断驻点是极大值还是极小值,还是拐点。一元的情况下,我们求导数。多元的情况下,我 们求的是梯度。梯度是一元导数的一个推广,是由$f(x)$在各个变量上的偏导数组成的一个列向量,记为$ abla f(x)$。

    另外,我们介绍一个二阶导数的推广:Hessian矩阵。Hessian矩阵是一个$n imes n$的对称方阵,且$H(x)_{ij}=frac{partial f(x)}{partial x_ipartial x_j}$

    Hessian矩阵也可以记为$ abla( abla^T f(x))$,先对$f(x)$求梯度,转置后再求一次梯度。也可以简记为$ abla^2 f(x)$

    回到解析法,我们首先要满足$ abla f(x)=0$的点,即驻点。驻点既可以是极大值,也可以是极小值,或者是鞍点(拐点)。鞍点是指既不是极大也不是极小,但是梯度为0的点。某些方向上函数上升,某些方向上函数值下降。所以梯度为0的点不一定是好点,但是好的点一定梯度等于0.

    那么如何判断驻点的性质呢?回顾一元微积分中,我们是通过二阶导数的符号来判断的,若二阶导大于0,是极小点;若二阶导小于0,是极大点;若二阶导等于0,既不是极大也不是极小,而是拐点。将这个结论推广到多元函数上来,就需要分析Hessian矩阵的特征值。由于Hessian矩阵是个对称矩阵,因此它的特征值一定是实数,于是可以比较大小。

    如果Hessian矩阵的特征值都是正数,即正定(记为$Hsucc 0$),那么驻点是极小值点

    如果Hessian矩阵的特征值都是负数,即负定(记为$Hprec 0$),那么驻点是极大值点

    如果是不定的,那么是鞍点

    然而有一类特殊的矩阵我们没有办法判断,那就是半正定和半负定矩阵,当Hessian矩阵属于这两者之一时,既有可能是极大值/极小值也有可能是鞍点,这时我们需要进一步根据3阶导数来判断(感觉是个张量)

    注意到求驻点的问题也是一个解方程组的问题,这并不是一个好处理的问题。因此我们接下来要介绍数值法。数值法是一种迭代方法,其步骤如下:

    (1)初始化起始点$x_1$,初始化迭代次数T,初始化计数器$k=1$

    (2)根据当前迭代点$x_k$寻找一个最优下降方向$d_k$

    (3)第$k$轮迭代从当前所在点$x_k$出发,寻找一个使得目标函数值下降的最佳方向$d_k$,作一维线性搜索$f(x_k+alpha d_k)$,找到最优步长$alpha_k$,然后移动到最优步长所对应的点$x_{k+1}=x_{k}+alpha_k d_k$,

    (4)如果满足一定的收敛准则,算法结束;如果不满足,跳回第(2)步

    由于每轮一维搜索所选择的方向都应该指向使目标函数值下降的方向,所以步长一定大于0(如果步长小于0,等价于沿着反方向即函数值上升的方向进行搜索,运气不好的话[反方向没有另一个局部极小值]最终有可能不收敛)

    最耗时间的步骤是第2步和第3步,一个优化算法的好坏,取决于可行下降方向选的好不好,如果大方向找对了,那么一定可以得到一个最优解。

    方向找到后,我们需要沿着下降方向进行一维搜索,寻找最优步长,因为迭代点和搜索方向已经给定,实际上只有一个变量,就是步长。记$F(alpha)=f(x_k+alpha d_k)$,$F(alpha)$关于$alpha$求导,并令导数为0,即能求出最优步长。但是由于实际问题中,$F(alpha)$有很多的局部极小值,我们的目的是找到这些局部极小值中的最小值,要精确地找到这个最小值点是个很困难的问题:

    我们得到一个极小值后,是应该停下来?还是应该继续往前走?如果停下来,后面没有更好的极小值点怎么办?如果继续往前走,后面函数值一直上升怎么办?

    不过fletcher在他的书里介绍了一种方法,能够把最优点所在的区间“套”出来,有了这个区间后,我们可以用各种一维搜索方法(如黄金分割,抛物线插值,对分搜索)在这个区间里面搜索那个最优点。

  • 相关阅读:
    JAVA入门到精通-第42讲-坦克大战9
    JAVA入门到精通-第40讲-线程
    JAVA入门到精通-第37讲-事件总结-坦克大战5
    大数据 资源
    在线工具
    idea 添加 阿里代码规范
    idea 控制台中文乱码 解决方法
    idea 构建maven web项目
    oracle SQL 练习
    Oracle分页
  • 原文地址:https://www.cnblogs.com/wacc/p/3777695.html
Copyright © 2011-2022 走看看