【算法工程師的數學基礎】系列將會從線性代數、微積分、數值優化、概率論、信息論五個方面進行介紹,感興趣的歡迎關注【搜索與推薦Wiki】公衆號,獲得最新文章。
《算法工程師的數學基礎》已更新:
- 1、算法工程師的數學基礎|線性代數中的向量和向量空間
- 2、算法工程師的數學基礎|線性代數中的矩陣
- 3、算法工程師的數學基礎|微積分之導數相關介紹
- 4、算法工程師的數學基礎|微積分之微分相關介紹
- 5、算法工程師的數學基礎|微積分之積分相關介紹
- 6、算法工程師的數學基礎|數學優化類型和優化算法
這裏數學優化部分的內容記錄在一篇文章中,內容比較多,建議先收藏再認真看。
數學優化
數學優化(Mathemattical Optimization)問題,也叫最優化問題,是指在一定約束條件下,求解一個目標函數的最大值(或最小值)問題。
數學優化的類型
離散優化和連續優化
根據輸入變量的值域是否爲實數域, 數學優化問題可以分爲離散優化問題和連續優化問題。
離散優化問題
離散優化(Discrete Optimization)問題是目標函數的輸入變量爲離散變量,比如爲整數或有限集合中的元素。離散優化問題主要有兩個分支:
-
1、組合優化(Combinational Optimization):其目標是從一個有限集合中找出使得目標函數最優的元素。在一般的組合優化問題中,集合中的元素之間存在一定的關聯,可以表示爲圖結構。典型的組合優化問題有旅行商問題、最小生成樹問題、圖着色問題等。很多機器學習問題都是組合優化問題,比如特徵選擇、聚類問題、超參數優化問題以及結構化學習(Structuced Learning)中標籤預測問題等。
-
2、整數規劃(Integer Programming):輸入變量爲整數。一般常見的整數規劃問題爲整數線性規劃(Integer Linear Programming, ILP)。整數線性規劃的一種最直接的求解方法是:
- 1)去掉輸入爲整數的限制,得到一個就稱爲一個一般的線性規劃問題,這個線性規劃問題爲原整數線性規劃問題的鬆弛問題;
- 2)求得相應鬆弛問題的解;
- 3)把鬆弛問題的解四捨五入到最接近的整數。但是這種方法得到的解一般都不是最優的,因此原問題的最優解不一定在鬆弛問題最優解的附近
另外,這種方法得到的解也不一樣定滿足約束條件。
連續優化問題
連續優化(Continuous Optimization)問題是目標函數的輸入變量爲連續變量,即目標函數爲實體函數。
無約束優化和約束優化
在連續優化問題中,根據是否有變量的約束條件,可以將優化問題分爲無約束優化問題和約束優化問題。
無約束優化問題(Unconstrained Optimization)的可行域爲整個實數域,可以寫爲:
其中爲輸入變量,爲目標函數。
約束優化問題(Constrained Optimization)中變量需要滿足一些等式或不等式的約束條件。約束優化問題通常使用拉格朗日乘數法來進行求解。
線性優化和非線性優化
如果在公式中,目標函數和所有的約束函數都爲線性函數,則該問題爲線性規劃問題(Linear Programming)。相反,如果目標函數或任何一個約束函數爲非線性函數,則該問題爲非線性規劃問題(Nonlinear Programming)。
在非線性優化問題中,有一類比較特殊的問題是凸優化問題(Conver Programming)。在凸優化問題中,變量的可行域爲凸集,即對於集合中任意兩點,他們的連線全部位於在集合內部。目標函數也必須爲凸函數,即滿足:
凸優化問題是一種特殊的約束化問題,需滿足目標函數爲凸函數,並且等式約束函數爲線性函數,不等式約束函數爲凹函數。
優化算法
優化問題一般都是通過迭代的方法來求解:通過猜測一個初始的估計,然後不斷迭代優化產生新的估計,希望最終收斂的最優解。一個好的優化算法應該是在一定的時間或者空間複雜度下能夠快速準確地找到最優解。同時,好的優化算法受初始猜測點的影響較小,通過迭代能穩定地找到最優解的鄰域,然後迅速收斂於。
優化算法中常用的迭代方法有:線性搜索和置信域方法等。線性搜索的策略是尋找方向和步長,具體算法有梯度下降法、牛頓法、共軛梯度法等。
全局最優和局部最優
對於很多非線性優化問題,會存在若干個局部的極小值。局部最小值,或局部最優解定義爲:存在一個,對於所有的滿足的,公式成立。也就是說,在的附近區域內,所有的函數值都大於或者等於。
對於所有的,都有成立,則爲全局最小值,或全局最優解。
一般的,求局部最優解是容易的,但很難保證其爲全局最優解。對於線性規劃或凸優化問題,局部最優解就是全局最優解。
要確認一個點是否爲局部最優解,通過比較它的鄰域內有沒有更小數值是不現實的。如果函數是二次連續可微的,我們可以通過檢查目標函數在點的梯度和Hessian矩陣來判斷。
定理:局部最小值的一階必要條件:如果爲局部最優解並且函數在的鄰域內一階可微,則在
證明:如果函數是連續可微的,根據泰勒公式(Taylor’s Formula),函數的一階展開可以近似爲:
梯度下降法
梯度下降法(Gradient Descent Method)也叫最速下降法,經常用來求解無約束優化的極小值問題。
對於函數,如果在點附近是連續可微的,那麼下降最快的方向是在點的梯度方向的反方向。
根據泰勒一階展開公式:
要使得,就得使。取,如果爲一個夠小數值時,那麼成立。
這樣我們就可以從一個初始值出發,通過迭代公式:
生成序列使得:
如果順利的話,序列收斂到局部最優解。注意每次迭代步長可以改變,但其取值必須合適,如果過大就不會收斂,如果過小則收斂速度太慢。
梯度下降法的過程如下圖所示。曲線是等高線(水平集),即函數爲不同常數的集合構成的曲線。紅色的箭頭指向該點梯度的反方向(梯度方向與通過該點的等高線垂直)。沿着梯度下降方向,將最終到達函數值的局部最優解。
梯度下降法爲一階收斂算法,當靠近極小值時梯度變小,收斂速度會變慢,並且可能以“之字形”的方式下降。如果目標函數爲二階連續可微,我們可以採用牛頓法。牛頓法爲二階收斂算法,收斂速度更快,但是每次迭代需要計算Hessian矩陣的逆矩陣,複雜度較高。
相反,如果要求解一個最大值問題,就需要向梯度正方形迭代進行搜索,逐漸接近函數的局部極大值點,這個過程則被稱爲梯度上升法(Gradient ascent)。
拉格朗日乘數法與KKT條件
在求解最優化問題的時候,拉格朗日乘數法 (Lagrange Multiplier) 和 KKT條件是兩種最常見的方法。
最優化一般分爲三種情況:
1、無約束條件
解決辦法通常是對原函數求導,令導函數等於0的點可能是極值點,例如上邊說的梯度下降法
- 等式約束條件
設目標函數是,等式約束函數是,即在滿足的情況下求解的極值。常用的解決辦法就是拉格朗日乘數法
- 不等式約束條件
設目標函數是,不等式約束函數是,即在滿足的情況下求解的極值。常用的解決辦法就是KKT(Karush Kuhn Tucker)條件
約束優化問題可以表示爲:
其中爲等式約束條件,爲不等式約束條件。
等式約束優化問題
如果上述公式中只有等式約束,可以構造一個拉格朗日函數
其中爲拉格朗日乘數,可以是正數或者負數。如果是原始約束優化問題的局部最優解,那麼存在一個使得爲拉格朗日函數的駐點。因此只需要令,,得到:
上述方程式的解即爲原始問題的可能解,在實際應用中,需根據問題來驗證是否爲極值點。
駐點:函數的一階導數爲0地點(駐點也稱爲穩定點,臨界點)。對於多元函數,駐點是所有一階偏導數都爲零的點。駐點不一定是極值點,但極值點一定是駐點。
拉格朗日乘數法是將一個有個變量和個等式約束條件的最優化問題轉換爲一個有個變量的函數求平穩點的問題。拉格朗日乘數法所得的平穩點會包含原問題的所有極值點,但並不保證每個平穩點都是原問題的極值點。
不等式約束優化問題
如果上述公式定義的是一般約束化的問題,其拉格朗日乘數爲:
其中:
- 爲等式約束的拉格朗日乘數
- 爲不等式約束的拉格朗日乘數
當約束條件不滿足時,有;當約束條件滿足時並且時,。因此原始約束優化問題等價於:
這是一個min-max優化問題稱爲主問題(primal problem)。
對偶問題 主問題的優化一般比較困難,我們可以通過交換,min-max的順序來簡化。定義拉格朗日對偶函數爲:
是一個凹函數,即使是非凸的。
當時,對於任意的,有
令是原問題的最優解,則有
即拉格朗日對偶函數爲原問題最優解的下界。
優化拉格朗日對偶函數並得到原問題的最優下界,稱爲拉格朗日對偶函數問題(Lagrange dual problem)
拉格朗日對偶函數爲凹函數,因此拉格朗日對偶問題爲凸優化問題。
令是拉格朗日對偶問題的最優解,則有,這個性質稱爲弱對偶性,如果,這個性質稱爲強對偶性質。
當強對偶性質成立時,令和分別是原問題和對偶問題的最優解,那麼他們滿足以下條件:
稱爲不定式約束優化問題的KKT條件(Karush-Kuhn-Tucher conditions)。KKT條件是拉格朗日乘數法在不等式約束優化問題上的泛化。當原問題是凸優化問題時,滿足KKT條件的解也是原問題和對偶問題的最優解。
KKT條件中需要關注的是,稱爲互補鬆弛條件。如果最優解出現在不等式約束的邊界上,則;如果出現在不等式約束的內部,則。互補鬆弛條件說明當最優解出現在不等式約束的內部,則約束失效。
更多關於拉格朗日和KKT的文章可以參考:
- https://zhuanlan.zhihu.com/p/55532322
- https://www.cnblogs.com/mo-wang/p/4775548.html
- https://www.matongxue.com/madocs/939.html
數學優化類型和優化算法介紹完了,如果覺得不錯,動動小手分享給更多人看吧!
掃一掃 關注微信公衆號!號主 專注於搜索和推薦系統,嘗試使用算法去更好的服務於用戶,包括但不侷限於機器學習,深度學習,強化學習,自然語言理解,知識圖譜,還不定時分享技術,資料,思考等文章!