最優化的背景
古希臘的歐幾里得時期就存在最優化的思想,當時提出了一個很著名的問題:在周長相同的一切矩形中,以正方形的面積為最大。接下來幾個世紀,微積分的建立使得最優化理論可以用來解決無約束的極值問題,隨后為了解決有約束條件的最優化問題,發展了變分法。上世紀40年代,由於軍事上的需要產生了運籌學,並使優化技術首先應用於解決戰爭中的實際問題。第二次世界大戰期間,一個新的數學分支數學規划方法發展起來,線性規划與非線性規划是其主要內容。
最優化問題按形式來划分主要分為:
- 無約束優化問題:最優化的目標函數為求\(f(x)\)的最值,其中\(f(x)\)在定義域\(S\)內連續。
- 約束優化問題:最優化的目標函數為求\(f(x)\)的最值,其中\(f(x)\)的定義域\(S\)滿足一系列的約束條件。
- 組合優化問題:經典的組合優化問題有:旅行商問題(TSP)、加工調度問題、背包問題、裝箱問題、圖着色問題、聚類問題等。
- 智能優化問題:利用智能算法如遺傳算法、禁忌搜索算法、模擬退火算法和蟻群優化算法、粒子群優化算法等來求解的問題。
如果按照問題所屬的范疇來划分主要分為:線性規划、凸規划、非凸規划(略)等。
線性規划
線性規划的標准形式如下:
線性規划的一般形式如下:
解決方法:一般形式化成標准形:通過引入新變量將不等式約束變為等式約束,對於變量小於零的情況通過乘以-1變成大於0。
例如:
解決方法:引入3個變量\(x_3\geq0, x_4\geq0, x_5\geq0\),可以將原規划問題化成如下標准形式:
若某個約束變量\(x_i\leq0\),不妨用\(x_i=-y\)來替換\(x_i\)帶入到原問題中,此時約束條件中\(y\geq0\)
線性規划的性質:線性規划問題若存在最優解,則最優解必在可行域邊界的某個極點上。
線性規划問題的求解方法:單純形法,單純形法的時間復雜度:\(O(n^{1.5})\sim O(n^{2})\)。常用來求解線性規划的工具有很多,比如Lingo、Malab、Glpk等,其中Matlab求解線性規划問題的函數為linprog,調用格式如下:
x= linprog(f,A,b,Aeq,beq)
x=linprog(f,A,b,Aeq,beq,lb,ub)
x=linprog(f,A,b,Aeq,beq,lb,ub,x0)
x=linprog(f,A,b,Aeq,beq,lb,ub,x0,options)
[x,fval]=linprog(...)
[x,fval,exitflag]=linprog(...)
[x,fval,exitflag,output]=linprog(...)
[x,fval,exitflag,output,lambda]=linprog(...)
凸規划
凸集的定義:設集合\(D\in R^n\),若對於任意兩點\(x,y\in D\),以及實數\(\alpha(0\leq\alpha\leq1)\),都有:
則稱集合\(D\)為凸集
常見的凸集:
- \(\big\{x\big|Ax\leq b\big\}\), \(A\) 是矩陣, \(b\)是列向量;
- 橢球:\(\big\{x|(x-x_c)^TP^{-1}(x-x_c)\leq1\big\}\),這里\(P\)是正定矩陣,\(x_c\)為橢球心坐標。橢球也可以用\(\big\{x_c+Au\big|\parallel u\parallel_2\leq1\big\}\)表示,其中\(A\)可逆;
- 半正定錐:\(A\)半正定,則\(x^TAx\)是凸集;
- 有限個凸集的非負加權求和:\(\sum_{i=1}^n\omega_iA_i\),其中\(\omega_i\geq0\),\(A_i\)為凸集;
- 仿射變換:形如\(f(x)=Ax+b\)的變換稱為仿射變換。仿射變換具有保凸性,也即只要\(f(x)\)是仿射變換,\(g(x)\)是凸集,那么\(g(f(x))\)和\(f(g(x))\)都是凸集;
- 任意多個凸集的交集仍是凸集(任意多個凸集的並集不一定是凸集)。
凸函數定義:設\(f(x)\)為定義在凸集合\(D\)上的函數,對於\(D\)上任意兩點\(x_1,x_2\in D\)和任意實數\(\lambda\in(0,1)\),總有:
梯度的定義:若\(n\)元函數\(f(x)\)對自變量\(x=(x_1,x_2,\cdots,x_n)^T\)的各分量\(x_i\)的偏導數\(\frac{\partial f(x)}{\partial x_i}\)都存在,則稱\(f(x)\)在\(x\)處一階可導,並稱向量\(\nabla f(x)=\Big(\frac{\partial f(x)}{\partial x_1},\frac{\partial f(x)}{\partial x_2},\cdots,\frac{\partial f(x)}{\partial x_n}\Big)\)為函數\(f(x)\)的梯度或者一階導數。
Hesse矩陣:若\(n\)元函數\(f(x)\)具有二階偏導數,也即\(\frac{\partial^2 f(x)}{\partial x_i\partial x_j}\)都存在,則稱矩陣
為\(f(x)\)在\(x\)處的Hesse矩陣
一階泰勒展式:設\(f(x)\)在點\(\overline{x}\)處具有一階連續偏導數,則\(f(x)\)在\(\overline{x}\)處的泰勒展式為
其中\(o(\parallel x-\overline{x}\parallel)\)為\(\parallel x-\overline{x}\parallel\)的高階無窮小。
二階泰勒展式:設\(f(x)\)在點\(\overline{x}\)處具有二階連續偏導數,則\(f(x)\)在\(\overline{x}\)處的二階泰勒展式為
其中\(o(\parallel x-\overline{x}\parallel)\)為\(\parallel x-\overline{x}\parallel\)的高階無窮小。
利用前面的一階泰勒展式和二階泰勒展式,可以得到判定一個函數是否為凸函數的方法
判定方法1(定義):驗證:\(f(y)\geq f(x)+\nabla f(x)^T(y-x)\)
判定方法2:驗證:\(f^{''}(x)\geq0\)}
多元凸函數判斷方法:驗證Hesse矩陣半正定。
常見的凸函數:
- 指數函數.
- 冪函數,當\(a\geq1\)或者\(a\leq0\)時,\(x^a\)在凸集\(D\)是凸函數,當\(0\leq a\leq1\)時,\(x^a\)在凸集\(D\)是凹函數
- 絕對值冪函數,當\(p\geq1\)時,函數\(|x|^p\)在\(R\)上是凸函數
- 有限個凸函數的非負加權求和:\(\sum_{i=1}^n\omega_if_i(x)\),其中\(\omega_i\geq0\),\(f_i(x)\)為凸函數
- 仿射變換:仿射變換(\(f(x)=Ax+b\))具有保凸性,也即只要\(f(x)\)是仿射變換,\(g(x)\)是凸函數,那么\(g(f(x))\)和\(f(g(x))\)都是凸函數
- 負對數函數(\(-\log{x}\))在凸集\(D\)上是凸函數
- 負熵,函數\(x\log{x}\)在凸集\(D\)上是凸函數
- 范數,\(R^n\)上任意范數都是凸函數
- 最大值函數和上確界函數
- 指數和的對數,函數\(f(x)=\log(e^{x_1}+\dots+e^{x_n})\)在\(R^n\)上是凸函數
- 幾何平均函數,函數\(f(x)=(\prod_{i=1}^nx_i)^{1/n}\)
- 對稱矩陣的最大特征值,函數\(f(X)=\lambda_{\rm max}(X)\),因為:\(\lambda_{\rm max}(X)=\sup\Big\{y^TXy\Big|\parallel y\parallel_2=1\Big\}\)
保凸運算:
- 有限個凸函數的非負加權求和運算:\(\sum_{i=1}^n\omega_if_i(x)\),其中\(\omega_i\geq0\),\(f_i(x)\)為凸函數
- 如果固定\(y\in A\),函數\(f(x,y)\)關於\(x\)是凸函數,且滿足\(\omega(y)\geq0\),則函數\(g(x)=\int_A\omega(y)f(x,y)\)是凸函數
- 符合仿射變換:\(f(x)\)是仿射變換(\(f(x)=Ax+b\)),\(g(x)\)是凸函數,那么\(g(f(x))\)和\(f(g(x))\)都是凸函數
- 復合函數:\(f(x)=h(g(x))\),
如果 \(h\) 是凸函數且非減, \(g\) 是凸函數,則 \(f\) 是凸函數;
如果 \(h\) 是凸函數且非增, \(g\) 是凹函數,則 \(f\) 是凸函數;
如果 \(h\) 是凹函數且非減, \(g\) 是凹函數,則 \(f\) 是凹函數;
如果 \(h\) 是凹函數且非增, \(g\) 是凸函數,則 \(f\) 是凹函數。 - Schur 補函數:設二次函數\(f(x,y)=x^TAx+2x^TBy+y^TCy\),其中\(A\)和\(C\)為對稱矩陣,則\(f(x,y)\)關於\((x,y)\)為凸函數
凸規划的標准形式:設\(f(x)\)及\(g_i(x),i=1,\dots,m\)均為\(R^n\)上的凸函數,滿足以下條件的規划問題稱為凸規划:
或者\(f(x)\)為凹函數,\(g_i(x),i=1,\dots,m\)為\(R^n\)上的凸函數:
一個規划問題如果不能等價於以上兩種形式的規划問題,那么這個規划問題是非凸規划問題。
求解凸規划問題的理論方法:
- 無約束凸規划問題:最速梯度下降、牛頓法、隨機梯度法、批量梯度法、共軛梯度法。
- 等式約束凸規划問題:利用拉格朗日乘子,將有約束優化問題轉化為無約束優化問題來求解。
- 不等式約束凸規划問題(需要驗證KKT條件):如果直接求解比較困難,可考慮轉化為拉格朗日對偶問題或者轉化為等價更易求解的優化問題,之后再用無約束優化方法求解。
有關拉格朗日乘子法和KKT條件,推薦閱讀\(\color{red}{\rm PPT}\)。
求解標准凸規划問題常用到的軟件工具:Matlab求解凸優化的cvx工具箱,Python的cvxpy、cvxopt包。
凸規划問題的特點:
- 局部最優解=全局最優解
- 是目前科技比較確定的可以求解的非線性規划方式
- 許多非凸問題通過一定的手段,要么等價地化歸為凸問題,要么用凸問題去近似、逼近。典型的如幾何規划、整數規划,它們本身是非凸的,但是可以借助凸優化手段去解,這就極大地擴張了凸優化的應用范圍
推薦書籍:
1、Boyd S, Vandenberghe L. Convex Optimization[M]. 世界圖書出版公司, 2013.
2、Claus H. Convex Analysis and Nonlinear Optimization[M]. Springer New York, 2006.
3、David G. Luenberger, Yinyu Ye. Linear and Nonlinear Programming: [M]. Springer New York, 2008.