機器學習的問題最終都會歸結為對一個優化問題進行求解,而優化問題可以分為無限制優化問題和有限制優化問題。有限制的優化問題是指對于目标函數中的變量有顯式限制條件的,比如0<=x<=100。無限制優化問題是指對于目标函數的變量沒有顯式限制的,或者說可以将限制轉化成目标函數的懲罰項的,比如說正則化項。
大多數機器學習問題最終都要解一個無限制的優化問題,是以本文主要對無限制優化問題及其優化算法做一個概述。下文提到的優化問題都指無限制優化問題。
提到優化問題,自然就要知道優化算法。需要注意的是,沒有一種通用的優化算法可以解決所有的優化問題,不同的算法适用于不同的問題。
一般來講,優化算法采用的是疊代求解的方式。算法會設定一個初始值,然後不斷疊代,直到找到一個最優解。關于如何疊代,不同的算法采取了不同的政策,有的算法利用了目标函數的值,有的算法利用了目标函數的一階導數和二階導數的資訊,有的算法利用了前幾輪疊代的資訊,有的算法則利用了目前點的局部資訊。
對于一個優化問題,如果我們能夠求出它的全局最優,那麼問題就一步到位了。而實際上,求解目标函數的全局最優解是很難的,原因在于我們對于目标函數的了解隻能是它的局部資訊,機器學習所使用的優化算法大都隻能求出局部最優值。可能有人會有疑問,既然這些算法隻能求出局部最優,那在機器學習中使用這些算法豈不是總也得不到全局最優?幸運的是,機器學習最後所要求解的目标函數大都是凸函數,我們知道,對于凸函數來講,其局部最優就是全局最優,那麼這樣一來,那些求解局部最優解的算法就可以用了。
對于這些凸函數來講,有的是可微的,有的則不是。對于後者的求解是相對困難的,但是如果函數隻在個别點處不可微,比如f(x) = ||x||1。這樣的函數求解還是相對容易的。
下面總體介紹一下求解無限制優化問題的算法。
所有求解無限制優化問題的算法都需要設定一個初始值x0,算法從x0開始進行疊代,直到取得最優值或者滿足收斂條件為止。關于算法如何從xk疊代到xk+1,基本上有兩種做法,這裡主要講講直線搜尋(line search)。
搜尋方向
在直線搜尋的方式中,算法首先選擇一個搜尋方向(不同的算法選擇的搜尋方向不同)pk,然後沿着這個方向從xk開始去搜尋xk+1,使得目标函數在xk+1處的值要更優于在xk處的值。現在的問題是要沿着pk走多長,才能找到最優的xk+1,是以在直線搜尋中,一旦搜尋方向确定了之後,搜尋的是這個步長t的值。這可以通過下面的公式獲得:

(1)
通過求解式(1),我們可以得到最優的t值,但是在實踐中,這樣做的代價是十分大的,也沒有必要,是以實踐中隻需要找到一個最小值的近似就可以了,也就是說f(xk+1)的值相對于f(xk)的值有足夠的減小即可。在得到xk+1後,算法會重新計算新的疊代方向和步長。如此往複,直到最終問題求解。
對于直線搜尋,我們已經提到了不同的算法會選擇不同的搜尋方向。這裡我們介紹兩個方向,一個是最速下降方向(steepest descent direction),另一個是牛頓方向(newtown direction)。前者對應的是目标函數的一階導數,而後者對應的是目标函數的二階導數。
最速下降方向
在直線搜尋中,對于從xk出發的所有搜尋方向,直覺上來講,沿着梯度負方向是使得目标函數減小最多的方向,也就是我們的最速下降方向。表達式如下:
(2)
由(2)式可知:
(3)
基于最速下降法的優化算法在每一步疊代都沿着梯度的負方向進行直線搜尋。它的優點是隻需要計算目标函數的一階導數;缺點就是算法呈線性收斂,在處理一些複雜問題時速度很慢,甚而至于慢到沒有實用價值。
需要注意的是,最速下降方向僅僅是算法的局部性質。
牛頓方向
牛頓方向對應的優化算法稱為牛頓法。牛頓方向的确定用到了目标函數的二階導數,下式為在第k步疊代時确定的搜尋方向。
(4)
這樣一來,xk+1 = xk + pk。這裡需要注意的是,我們假設步長t始終等于1。實踐中是以1為初始值對步長進行直線搜尋。
将目标函數在xk處作二階泰勒展開,可得:
(5)
式(5)的右邊為v的二次函數,要使得式子最小,那麼對v求導并令結果式等于0可得:
(6)
求解式(6)可得:
(7)
由此可知,當搜尋方向為牛頓方向時,目标函數減少最多。
對于多元函數,其二階導數是一個矩陣,名叫海森矩陣(Hessian Matrix)。
牛頓法在接近局部最小值時為二次收斂,僅需5到6次就可以達到很高的精度,特别是在計算大規模問題時,無論是從收斂速度還是精度來講,都有着最速下降法無法比拟的優勢。牛頓法的缺點在于算法在執行過程中需要計算和存儲海森矩陣以及海森矩陣的逆,當矩陣太大時,計算負荷太重。更為緻命的是,目标函數的海森矩陣無法在算法執行期間保持正定,進而使得牛頓法失效。
拟牛頓方向
基于拟牛頓方向的優化算法稱為拟牛頓法。拟牛頓法的思路實際上就是在疊代的每一步用一個矩陣Bk來替代海森矩陣,進而不必計算海森矩陣。Bk在疊代的每一步都會更新,隻要B0為正定,那麼任何一步疊代更新的Bk一定保證正定。通過Bk我們可以得到每一步向下一步疊代時的搜尋方向。
需要注意的是,拟牛頓法的每一次疊代不能保證一定是最優的下降方向,但是一定是下降的,這樣就保證了每一次疊代後,目标函數的值總會降低。
拟牛頓法的收斂速度沒有牛頓法收斂得快,但是要好于最速下降法的線性收斂。
歸一化
有時候優化算法的性能取決于問題的形式。這其中一個重要的方面就是模型參數(目标函數系數)的歸一化。當目标函數的某一個變量發生變化時,它使得目标函數的值發生很大的變化,而在另外的變量上做相同的改變時,目标函數值的變化遠遠不及上述變化,那麼這個問題被認為是沒有歸一化的。比如目标函數為:f(x) = 1010x1+ 0.1x2,那麼很小的變化發生在x1上時,f的值會有很大的變化,但x2卻不然。這個目标函數就沒有做歸一化。
基于一階導數(梯度)的優化算法對于沒有歸一化的目标函數十分敏感,收斂很慢并且效果不好。但是基于二階導數的牛頓法就不受此影響。
下圖是兩個凸二次函數的等值線,其中第一個表示沒有歸一化的目标函數,第二個表示歸一化後的目标函數。對于第一個等值線,我們可以看出它的一邊被拉得特别長,另一邊又特别扁平,這種問題在工程上屬于病态問題,基于梯度的方法無法快速的收斂到最優值。但是在兩種情況下,基于二階導數的牛頓法(或是拟牛頓法)都能很快收斂到很好的結果。由于實際工程中很多問題無法歸一化,是以這些問題往往是病态的,是以我們在工程上一般都會選用基于二階導數的拟牛頓法來求解無限制的最優化問題。
以上的讨論從大體上介紹了求解無限制優化問題的算法。在實際工程的應用中,還是會有些變化。比如說,解決超大規模的優化問題時,即便是拟牛頓法,比如BFGS,也無法很好地解決,原因在于拟牛頓法雖然不用計算和存儲海森矩陣,但要計算和存儲海森矩陣的近似矩陣B,當近似矩陣B很稠密時,算法的計算量和存儲量也是巨大的。是以實踐中一定會用到的方法是L-BFGS算法。該方法十分的重要,掌握了它不僅僅是掌握了一個算法,更重要的是掌握了求解大規模優化問題的一種思想。這個算法将會單獨介紹。