算法工程師的數學基礎|數學優化類型和優化算法

【算法工程師的數學基礎】系列將會從線性代數、微積分、數值優化、概率論、信息論五個方面進行介紹,感興趣的歡迎關注【搜索與推薦Wiki】公衆號,獲得最新文章。

《算法工程師的數學基礎》已更新:

這裏數學優化部分的內容記錄在一篇文章中,內容比較多,建議先收藏再認真看。

數學優化

數學優化(Mathemattical Optimization)問題,也叫最優化問題,是指在一定約束條件下,求解一個目標函數的最大值(或最小值)問題。

數學優化的類型

離散優化和連續優化

根據輸入變量xx的值域是否爲實數域, 數學優化問題可以分爲離散優化問題和連續優化問題。

離散優化問題

離散優化(Discrete Optimization)問題是目標函數的輸入變量爲離散變量,比如爲整數或有限集合中的元素。離散優化問題主要有兩個分支:

  • 1、組合優化(Combinational Optimization):其目標是從一個有限集合中找出使得目標函數最優的元素。在一般的組合優化問題中,集合中的元素之間存在一定的關聯,可以表示爲圖結構。典型的組合優化問題有旅行商問題、最小生成樹問題、圖着色問題等。很多機器學習問題都是組合優化問題,比如特徵選擇、聚類問題、超參數優化問題以及結構化學習(Structuced Learning)中標籤預測問題等。

  • 2、整數規劃(Integer Programming):輸入變量xZdx \in Z^d爲整數。一般常見的整數規劃問題爲整數線性規劃(Integer Linear Programming, ILP)。整數線性規劃的一種最直接的求解方法是:

    • 1)去掉輸入爲整數的限制,得到一個就稱爲一個一般的線性規劃問題,這個線性規劃問題爲原整數線性規劃問題的鬆弛問題;
    • 2)求得相應鬆弛問題的解;
    • 3)把鬆弛問題的解四捨五入到最接近的整數。但是這種方法得到的解一般都不是最優的,因此原問題的最優解不一定在鬆弛問題最優解的附近

    另外,這種方法得到的解也不一樣定滿足約束條件。

連續優化問題

連續優化(Continuous Optimization)問題是目標函數的輸入變量爲連續變量xRdx \in R^d,即目標函數爲實體函數。

無約束優化和約束優化

在連續優化問題中,根據是否有變量的約束條件,可以將優化問題分爲無約束優化問題和約束優化問題。

無約束優化問題(Unconstrained Optimization)的可行域爲整個實數域D=RdD = R^d,可以寫爲:
minxf(x) \underset{x}{ min } \, f(x)
其中xRdx \in R^d爲輸入變量,f:RdRf: R^d \rightarrow R爲目標函數。

約束優化問題(Constrained Optimization)中變量xx需要滿足一些等式或不等式的約束條件。約束優化問題通常使用拉格朗日乘數法來進行求解。

線性優化和非線性優化

如果在公式minxf(x)\underset{x}{ min } \, f(x)中,目標函數和所有的約束函數都爲線性函數,則該問題爲線性規劃問題(Linear Programming)。相反,如果目標函數或任何一個約束函數爲非線性函數,則該問題爲非線性規劃問題(Nonlinear Programming)。

在非線性優化問題中,有一類比較特殊的問題是凸優化問題(Conver Programming)。在凸優化問題中,變量xx的可行域爲凸集,即對於集合中任意兩點,他們的連線全部位於在集合內部。目標函數ff也必須爲凸函數,即滿足:
f(αx+(1α)y)αf(x)+(1α)f(y),α[0,1] f(\alpha x + (1-\alpha)y) \leq \alpha f(x) + (1-\alpha) f(y), \forall \alpha \in [0,1]

凸優化問題是一種特殊的約束化問題,需滿足目標函數爲凸函數,並且等式約束函數爲線性函數,不等式約束函數爲凹函數。

優化算法

優化問題一般都是通過迭代的方法來求解:通過猜測一個初始的估計x0x_0,然後不斷迭代優化產生新的估計x1,x2,...,xtx_1, x_2, ... ,x_t,希望xtx_t最終收斂的最優解xx^*。一個好的優化算法應該是在一定的時間或者空間複雜度下能夠快速準確地找到最優解。同時,好的優化算法受初始猜測點的影響較小,通過迭代能穩定地找到最優解xx^*的鄰域,然後迅速收斂於xx^*

優化算法中常用的迭代方法有:線性搜索置信域方法等。線性搜索的策略是尋找方向和步長,具體算法有梯度下降法牛頓法共軛梯度法等。

全局最優和局部最優

對於很多非線性優化問題,會存在若干個局部的極小值。局部最小值,或局部最優解xx^*定義爲:存在一個δ>0\delta > 0,對於所有的滿足xxδ||x-x^*|| \leq \deltaxx,公式f(x)f(x)f(x^*) \leq f(x)成立。也就是說,在xx^*的附近區域內,所有的函數值都大於或者等於f(x)f(x^*)

對於所有的xAx \in A,都有f(x)f(x)f(x^*) \leq f(x)成立,則xx^*爲全局最小值,或全局最優解。

一般的,求局部最優解是容易的,但很難保證其爲全局最優解。對於線性規劃或凸優化問題,局部最優解就是全局最優解。

要確認一個點xx^*是否爲局部最優解,通過比較它的鄰域內有沒有更小數值是不現實的。如果函數f(x)f(x)是二次連續可微的,我們可以通過檢查目標函數在點xx^*的梯度f(x)\bigtriangledown f(x^*)和Hessian矩陣2f(x)\bigtriangledown^2 f(x^*)來判斷。

定理:局部最小值的一階必要條件:如果xx^*爲局部最優解並且函數ffxx^*的鄰域內一階可微,則在f(x)=0\bigtriangledown f(x^*) = 0

證明:如果函數f(x)f(x)是連續可微的,根據泰勒公式(Taylor’s Formula),函數f(x)f(x)的一階展開可以近似爲:
f(x+Δx)=f(x)+ΔxTf(x) f(x^* + \Delta x) = f(x^*) + \Delta x^T \bigtriangledown f(x^*)

梯度下降法

梯度下降法(Gradient Descent Method)也叫最速下降法,經常用來求解無約束優化的極小值問題。

對於函數f(x)f(x),如果f(x)f(x)在點xtx_t附近是連續可微的,那麼f(x)f(x)下降最快的方向是f(x)f(x)xtx_t點的梯度方向的反方向。

根據泰勒一階展開公式:
f(xt+1)=f(xt+Δx)f(xt)+ΔxTf(xt) f(x_{t+1}) = f(x_t + \Delta x) \approx f(x_t) + \Delta x^T \bigtriangledown f(x_t)
要使得f(xt+1)<f(xt)f(x_{t+1}) < f(x_t),就得使ΔxTf(xt)<0\Delta x^T \bigtriangledown f(x_t) <0。取Δx=αf(xt)\Delta x = - \alpha f(x_t),如果α>0\alpha >0爲一個夠小數值時,那麼f(xt+1)<f(xt)f(x_{t+1}) < f(x_t)成立。

這樣我們就可以從一個初始值x0x_0出發,通過迭代公式:
xt+1=xtαtf(xt),t0 x_{t+1} = x_t - \alpha_t \bigtriangledown f(x_t), t \geq 0
生成序列x0,x1,x2,...x_0, x_1,x_2, ...使得:
f(x0)f(x1)f(x2)... f(x_0) \geq f(x_1) \geq f(x_2) \geq ...

如果順利的話,序列(xn)(x_n)收斂到局部最優解xx^*。注意每次迭代步長α\alpha可以改變,但其取值必須合適,如果過大就不會收斂,如果過小則收斂速度太慢。

梯度下降法的過程如下圖所示。曲線是等高線(水平集),即函數ff爲不同常數的集合構成的曲線。紅色的箭頭指向該點梯度的反方向(梯度方向與通過該點的等高線垂直)。沿着梯度下降方向,將最終到達函數ff值的局部最優解。

梯度下降法

梯度下降法爲一階收斂算法,當靠近極小值時梯度變小,收斂速度會變慢,並且可能以“之字形”的方式下降。如果目標函數爲二階連續可微,我們可以採用牛頓法。牛頓法爲二階收斂算法,收斂速度更快,但是每次迭代需要計算Hessian矩陣的逆矩陣,複雜度較高。

相反,如果要求解一個最大值問題,就需要向梯度正方形迭代進行搜索,逐漸接近函數的局部極大值點,這個過程則被稱爲梯度上升法(Gradient ascent)。

拉格朗日乘數法與KKT條件

在求解最優化問題的時候,拉格朗日乘數法 (Lagrange Multiplier) 和 KKT條件是兩種最常見的方法。

最優化一般分爲三種情況:

1、無約束條件

解決辦法通常是對原函數求導,令導函數等於0的點可能是極值點,例如上邊說的梯度下降法

  1. 等式約束條件

設目標函數是f(x)f(x),等式約束函數是g(x)g(x),即在g(x)g(x)滿足的情況下求解f(x)f(x)的極值。常用的解決辦法就是拉格朗日乘數法

  1. 不等式約束條件

設目標函數是f(x)f(x),不等式約束函數是g(x)g(x),即在g(x)g(x)滿足的情況下求解f(x)f(x)的極值。常用的解決辦法就是KKT(Karush Kuhn Tucker)條件

約束優化問題可以表示爲:
minxf(x)s.thi(x)=0,i=1,..,mgj(x)0,j=1,...,n \begin{matrix} \underset{x}{min} & f(x) \\ s.t & \begin{matrix} h_i(x) = 0, i=1,..,m\\ g_j(x) \leq 0, j = 1,...,n \end{matrix} \end{matrix}
其中hi(x)h_i(x)爲等式約束條件,gj(x)g_j(x)爲不等式約束條件。

等式約束優化問題

如果上述公式中只有等式約束hi(x)=0h_i(x)=0,可以構造一個拉格朗日函數L(x,λ)L(x, \lambda)
L(x,λ)=f(x)+i=1mλihi(x) L(x, \lambda) = f(x) + \sum_{i=1}^{m} \lambda_ih_i(x)
其中λ\lambda爲拉格朗日乘數,可以是正數或者負數。如果f(x)f(x^*)是原始約束優化問題的局部最優解,那麼存在一個λ\lambda^*使得(x,λ)(x^*, \lambda^*)爲拉格朗日函數L(x,λ)L(x,\lambda)的駐點。因此只需要令L(x,λ)x=0\frac{\partial L(x, \lambda)}{ \partial x} = 0L(x,λ)λ=0\frac{\partial L(x, \lambda)}{ \partial \lambda} = 0,得到:
f(x)+i=1mλihi(x)=0hi(x)=0,i=0,....,m \begin{matrix} \bigtriangledown f(x) +\sum_{i=1}^{m} \lambda_i \bigtriangledown h_i(x) = 0 \\ h_i (x) = 0, i=0,....,m \end{matrix}
上述方程式的解即爲原始問題的可能解,在實際應用中,需根據問題來驗證是否爲極值點。

駐點:函數的一階導數爲0地點(駐點也稱爲穩定點,臨界點)。對於多元函數,駐點是所有一階偏導數都爲零的點。駐點不一定是極值點,但極值點一定是駐點。

拉格朗日乘數法是將一個有dd個變量和mm個等式約束條件的最優化問題轉換爲一個有d+md+m個變量的函數求平穩點的問題。拉格朗日乘數法所得的平穩點會包含原問題的所有極值點,但並不保證每個平穩點都是原問題的極值點。

不等式約束優化問題

如果上述公式定義的是一般約束化的問題,其拉格朗日乘數爲:
L(x,a,b)=f(x)+i=1maihi(x)+i=1mbjgj(x) L(x, a,b)=f(x) + \sum_{i=1}^{m} a_ih_i(x) + \sum_{i=1}^{m} b_jg_j(x)
其中:

  • a=[ai,...,am]Ta = [a_i, ..., a_m]^T爲等式約束的拉格朗日乘數
  • b=[bi,...,bn]Tb = [b_i, ..., b_n]^T爲不等式約束的拉格朗日乘數

當約束條件不滿足時,有maxa,bL(x,a,b)=max_{a,b} L(x,a,b) = \infty;當約束條件滿足時並且b0b \geq 0時,maxa,bL(x,a,b)=f(x)max_{a,b} L(x,a,b) = f(x)。因此原始約束優化問題等價於:
minxmaxa,bL(x,a,b)s.tb0 \begin{matrix} \underset{x}{min} \, \underset{a,b}{max} \, L(x,a,b) \\ s.t \,b \geq 0 \end{matrix}
這是一個min-max優化問題稱爲主問題(primal problem)。

對偶問題 主問題的優化一般比較困難,我們可以通過交換,min-max的順序來簡化。定義拉格朗日對偶函數爲:
Γ(a,b)=infxDL(x,a,b) \Gamma (a,b) = \underset{x \in D}{ inf } L(x,a,b)
Γ(a,b)\Gamma(a,b)是一個凹函數,即使f(x)f(x)是非凸的。

b0b \geq 0時,對於任意的x~D\tilde{x} \in D,有
Γ(a,b)=infxDL(x,a,b)L(x~,a,b)f(x~) \Gamma (a,b) = \underset{ x \in D }{inf} L(x,a,b) \leq L(\tilde{x} ,a,b) \leq f( \tilde{x})
pp^*是原問題的最優解,則有
L(a,b)p L(a,b) \leq p^*
即拉格朗日對偶函數Γ(a,b)\Gamma(a,b)爲原問題最優解的下界。

優化拉格朗日對偶函數Γ(a,b)\Gamma(a,b)並得到原問題的最優下界,稱爲拉格朗日對偶函數問題(Lagrange dual problem)
maxa,bΓ(a,b)s.t.b0 \begin{matrix} \underset{a,b}{max} & \Gamma(a,b) \\ s.t. & b \geq 0 \end{matrix}
拉格朗日對偶函數爲凹函數,因此拉格朗日對偶問題爲凸優化問題。

dd^*是拉格朗日對偶問題的最優解,則有dpd^* \leq p^*,這個性質稱爲弱對偶性,如果d=pd^* = p^*,這個性質稱爲強對偶性質。

當強對偶性質成立時,令xx^*a,ba^*, b^*分別是原問題和對偶問題的最優解,那麼他們滿足以下條件:
f(x)+i=1maihi(x)+j=1nbjgj(x) \bigtriangledown f(x^*) + \sum_{i=1}^{m} a^*_i \bigtriangledown h_i(x^*) + \sum_{j=1}^{n} b^*_j \bigtriangledown g_j(x^*)
hi(x)=0,i=0,1,2....,m h_i (x^*) =0, i=0,1,2....,m
gj(x)0,j=0,1,2,....,n g_j(x^*) \leq 0, j =0,1,2,....,n
bjgj(x)=0,j=0,1,2,....,n b^*_j g_j (x^*) =0, j =0,1,2,....,n
bj0,j=0,1,2,....,n b^*_j \geq 0, j =0,1,2,....,n

稱爲不定式約束優化問題的KKT條件(Karush-Kuhn-Tucher conditions)。KKT條件是拉格朗日乘數法在不等式約束優化問題上的泛化。當原問題是凸優化問題時,滿足KKT條件的解也是原問題和對偶問題的最優解。

KKT條件中需要關注的是bjgj(x)=0b^*_j g_j (x^*) =0,稱爲互補鬆弛條件。如果最優解xx^*出現在不等式約束的邊界上gj(x)=0g_j(x) = 0,則bj>0b^*_j>0;如果xx^*出現在不等式約束的內部gj(x)<0g_j(x) < 0,則bj=0b^*_j=0。互補鬆弛條件說明當最優解出現在不等式約束的內部,則約束失效。

更多關於拉格朗日和KKT的文章可以參考:

  • https://zhuanlan.zhihu.com/p/55532322
  • https://www.cnblogs.com/mo-wang/p/4775548.html
  • https://www.matongxue.com/madocs/939.html

數學優化類型和優化算法介紹完了,如果覺得不錯,動動小手分享給更多人看吧!


【技術服務】,詳情點擊查看: https://mp.weixin.qq.com/s/PtX9ukKRBmazAWARprGIAg

掃一掃 關注微信公衆號!號主 專注於搜索和推薦系統,嘗試使用算法去更好的服務於用戶,包括但不侷限於機器學習,深度學習,強化學習,自然語言理解,知識圖譜,還不定時分享技術,資料,思考等文章!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章