这节课主要介绍凸优化的入门知识,程博士推荐阅读Boyd的《凸优化》,最经典的凸优化的书,这本书有600多页,细致讲解了凸优化相关的理论知识,可以作为一门学科来学习。因为硕士阶段学过《工程优化》,在这次学习过程中能容易的get到思想。 一般的优化问题包括 有约束和无约束两种,在这里我们将要弄清楚两件事情:为什么要优化?为什么要凸优化?
首先,为什么要优化?大致组织了以下两点:
1)方程式组本身没有解,但是在工程应用中会有求近似解的需求,怎么办呢?可以转化为求f(x)的最小值,即最小二乘问题。通过求导、求梯度来解。
2)如果方程式组变量特别多,且都是高阶的,可以想象是相当难解的。仍然可以转为最优化问题。
泰勒展开特别有用,可以很方便的把一个函数展开成幂级数,即从函数的线性近似来估计函数。
1)输入为标量的泰勒级数展开:如果是极值点,一阶导数一定为0;如果一阶导数f’(xk)为0,可以是极大点、极小点或者拐点。然后再求二阶导数,f’’(xk)>0,xk为严格局部最小点,反之局部最大点,f’’(xk)=0则可能是一个鞍点。
下面举例说明如何判断极值点。例如有函数 f(x) = (x12+ x22 -1)2 + (x22-1)2
1)计算一阶偏导和二阶偏导得到
2)另一阶偏导 ∇f=0 得到稳定点[0,0],[1,0],[-1,0],[0,1],[0,-1]
。
3)继续判断每一个稳定点对应的二阶偏导,如果某点得到的矩阵的特征值都小于0,函数在这个点就是严格
局部最大;如果特征值有正有负,就是不定矩阵,可以作为鞍点的候选点。
1)函数可能不可导;
2)函数求出了导数,但是对于复杂函数,不一定能求出来f’(x)=0的x;
3)求出的解可能是一个集合。
由于直接分析存在上述局限性,一般复杂的问题都不是通过求导解决的,需要“迭代法”。
迭代法的基本运算步骤如下:
1)选择一个初始点,设置收敛系数ε,计数k=0;
2)决定一个搜索方向dk,使函数下降;(核心)
3)决定步长αk使得f(xk+αdk)对于α≥0最小化,构建xk+1=xk+αkdk;
4)如果‖α kd k‖< ε,则停止迭代,输出解x k+1;否则继续迭代。
下面看一下如何选择dk。
1)深度下降法中dk选作负梯度-∇f(x),该算法通常速度比较慢。
2)牛顿法做近似时考虑了一阶导数和二阶导数,优势是下降的更快,如果选好了步长,可能一步到位。
约束性优化问题是指除了给出方程外,方程的解还需要满足f(x)定义域约束等若干条约束条件,这种问题在实际生产中更有意义,在《工程优化》中学习过这类问题的解决方法。
衡量一般约束性优化问题极值点的一阶必要条件叫做KKT条件。KKT条件
(https://www.zhihu.com/question/23311674)说明了
1)最优点x∗必须满足所有等式及不等式限制条件, 也就是说最优点必须是一个可行解;
2)在最优点x∗,∇f必须是∇gi和∇hj的线性組合,μi和λj都叫作拉格朗日乘子。
那么什么条件下,KKT条件可以成为充要条件,什么条件下局部最小解可以成为全局最小解呢?这就是研究凸集和凸函数的意义啦。
可以证明,凸函数局部最优解就是全局最优解。这也是研究凸函数的意义所在。
凸函数和凸集的关系:一元函数f的α水平集为 Sα = {x|x≤α},则有“f是凸函可推导出Sα对于每个α是凸集。简单的可以用KKT法解决,复杂的可以用牛顿法、内点法等。
那么想一下,实际问题中凸优化适用范围大吗?对于非凸问题,有没有什么研究意义呢?办法就是“取近似“,把非凸优化问题近似为凸优化问题,再来求解。另外,有的问题在n维上看是非凸的,在n+1维上看可能就是凸问题。