[TOC]
優(yōu)化算法是機器學(xué)習(xí)中的“方法論”失乾,優(yōu)化算法會告訴機器應(yīng)該如何優(yōu)化學(xué)習(xí)的進程常熙,讓自己能夠更好地掌握學(xué)習(xí)到的知識,本文將針對機器學(xué)習(xí)領(lǐng)域中常用的幾種優(yōu)化算法進行總結(jié)碱茁。
梯度下降法
梯度下降法與梯度裸卫、導(dǎo)數(shù)的概念
梯度下降法是用來求解無約束優(yōu)化問題的一種數(shù)學(xué)方法,通過梯度下降法可以獲取到函數(shù)的局部極小值纽竣。這里存在一個概念“梯度”墓贿,梯度的本意實際上是一個向量,及具有方向性和數(shù)值性蜓氨,其表示的是一個函數(shù)在改點沿著該方向變化最快(這個方向是往函數(shù)值變大的方向)聋袋,這個變化率實際上就是該梯度的模。因此穴吹,在使用梯度下降法的時候幽勒,實際上是要求我們選擇梯度的反方向進行計算,只有這樣才能保證我們能夠取到極小值港令,這也就是為什么在使用導(dǎo)數(shù)(導(dǎo)數(shù)與梯度實際上是同一個概念啥容,只不過梯度是一種抽象的表述概念,而導(dǎo)數(shù)是實際上用來求解梯度的一種數(shù)學(xué)表示方式缠借,導(dǎo)數(shù)值前面的正負號實際上是決定了梯度的方向)進行參數(shù)迭代的時候是要在導(dǎo)數(shù)的前面加上負號干毅。
如上圖所示,我們對函數(shù)f在A點對自變量x求解右導(dǎo)數(shù)泼返,其值為正數(shù)硝逢,那是因為在A點右側(cè)函數(shù)值是增大的,因此绅喉,如果要想f值變小渠鸽,則需要讓往左移;對B點求解右導(dǎo)數(shù)柴罐,其值為負數(shù)徽缚,那是因為在B點右側(cè)函數(shù)值是變小的,因此革屠,如果想要f值變小凿试,則需要讓x往右移,因此似芝,如果是要使用梯度下降法那婉,則在迭代過程中要在導(dǎo)數(shù)的前面加上負號。
梯度下降法詳解
應(yīng)用前提條件
首先党瓮,我們得需要明確梯度下降法并不是萬能的详炬,因為在機器學(xué)習(xí)領(lǐng)域中,存在一個叫做NFL(No Free Launch)定理寞奸,這個定理說明了不存在一種模型或者算法能夠適應(yīng)于所有的應(yīng)用場景呛谜。那么既然如此在跳,梯度下降法能夠應(yīng)用于哪些場景中呢。其實從梯度下降法的原理來看隐岛,只要我們沿著梯度方向能夠?qū)ふ业胶线m的最小值猫妙,那么就可以使用梯度下降法,那么如何判斷什么樣的函數(shù)是滿足梯度下降法的應(yīng)用的呢聚凹,最簡單的一種方法就是判斷該函數(shù)是否是下凸函數(shù)吐咳,如果一個函數(shù)是下凸函數(shù),那么我們就可以針對該函數(shù)使用梯度下降法來求解最小值元践。當然韭脊,對于下凸函數(shù)可能會存在很多個局部極小值點,那么在這種情況下单旁,使用梯度下降法來求解函數(shù)的最小值可能會存在一些偏差沪羔,那么此時,會通過一些技術(shù)性的措施(比如:采用隨機性象浑,分別從不同起始點多次進行梯度下降求解等)來優(yōu)化我們使用梯度下降法的過程蔫饰。
在梯度下降法中,通常需要優(yōu)先確定以下條件:
1. 步長(學(xué)習(xí)率)
2. 目標函數(shù)(損失函數(shù)愉豺,但是在確定損失函數(shù)過程篓吁,需要優(yōu)先確定模型)
基于上述兩點先決條件,可以獲得梯度下降法中最關(guān)鍵的表達式:
下面將分別基于線性回歸模型來闡述代數(shù)形式和矩陣形式下的梯度下降法蚪拦。
梯度下降法的代數(shù)形式表達
- 假設(shè)有一組數(shù)據(jù)集杖剪,該數(shù)據(jù)集共有m個樣本,每個樣本包含有n個特征量驰贷。
如果我們想通過線性回歸模型來構(gòu)建與之間的關(guān)系盛嘿,可得如下模型:, - 采用線性模型常用的誤差平方和作為損失函數(shù)L:
- 使用梯度下降法求解,需要初始化相關(guān)參數(shù)括袒,主要包含了次兆、、以及迭代停止距離,通常我們可以將設(shè)置為0.9锹锰,設(shè)置為0芥炭。
- 算法流程如下:
Step1:計算當前關(guān)于每個的梯度:;
Step2:用步長乘以Step1中求得的每個關(guān)于的梯度恃慧,得到每個下降的距離园蝠;
Step3:判斷每個的梯度下降距離的值是否都小于終止條件,如果是,則停止學(xué)習(xí)糕伐,將當前的學(xué)習(xí)到的所有的作為最終習(xí)得的參數(shù)砰琢,反之蘸嘶,進入Step4;
Step3:更新所有的,更新公式如下:,然后重復(fù)Step1~Step3.
梯度下降法的矩陣形式表達
梯度下降法的矩陣表達形式實際上上對代數(shù)形式的矩陣話良瞧,為什么需要矩陣化陪汽?因為在實際的計算過程中,矩陣運算的效率與高于循環(huán)計算的效率褥蚯,能夠提升學(xué)習(xí)的效率挚冤。
通常我們會將樣本數(shù)據(jù)集表示為,其中赞庶,表示樣本的個數(shù)训挡,即矩陣的每一行表示一個樣本信息,表示樣本中的特征量的個數(shù)歧强,即矩陣中的每列表示的是一個特征量的取值澜薄。并且通常在機器學(xué)習(xí)領(lǐng)域中將向量表示為列向量,因此摊册,所有的參數(shù)可以表示為向量.
根據(jù)上述定義的矩陣和向量信息肤京,可以重新表達線性模型:,同時,損失函數(shù)可以表示為:茅特,預(yù)先設(shè)置的參數(shù)步驟和代數(shù)形式是一致的忘分,算法過程也是一致的,唯一的區(qū)別是在計算過程中變成了矩陣話運算白修。
梯度下降法的變形
上文所闡述的梯度下降法實際上是在每一輪迭代的過程中針對所有的樣本進行梯度計算與梯度下降判斷的妒峦,也可以成為全批量梯度下降法(Batch Gradient Descent),這樣的方法具有以下缺點:如果樣本量非常大的時候兵睛,計算的效率會降低肯骇,但是也具有準確率高的優(yōu)點;
針對BGD算法效率低的問題祖很,又提出了一種隨機梯度下降法(Stochastic Gradient Descent)累盗,顧名思義,這種做法是每一輪迭代都只隨機選取一個樣本進行計算突琳,這種方式大大提升了計算的效率若债,但是,由于每一次都是隨機選取一個樣本進行迭代計算拆融,那么會導(dǎo)致獲得的參數(shù)值并不是局部最優(yōu)解蠢琳,同時,這樣方式還會導(dǎo)致每次迭代時的方向會不穩(wěn)定镜豹,即整體的收斂速度會下降傲须;
針對上述兩種極端的梯度下降法,又提出了一種小批量梯度下降法(Mini-Batch Gradient Descent)趟脂,這種方法通常是選擇部分樣本參與計算泰讽,通常每輪迭代選擇的樣本量為16,32,64,128,256,512等這類的值。(Notes:在機器學(xué)習(xí)中,如果樣本量過大的時候已卸,我們通常會在沒一輪的學(xué)習(xí)過程中選擇部分樣本來參與學(xué)習(xí)佛玄,同時增加學(xué)習(xí)的輪數(shù),這樣可以通過多次學(xué)習(xí)的方式累澡,來提升每次訓(xùn)練的效率梦抢,并且因增加了學(xué)習(xí)的次數(shù),也能夠從整體上降低泛化誤差)愧哟。
梯度下降法應(yīng)用場景
損失函數(shù)必須是凸函數(shù)奥吩,即存在局部極小值點
基本牛頓法
牛頓-拉夫森法
基本牛頓法在優(yōu)化問題中的應(yīng)用實際上是來源于牛頓-拉夫森法,該方法是用來求解函數(shù)的零點的方法蕊梧,那么這個方法到底是什么方法呢霞赫,實際上,該方法是建立在泰勒展開公式的基礎(chǔ)上肥矢,通過使原方程泰勒展開的一階近似等于零不斷獲得更好的結(jié)果的求解方程零點的方法绩脆。簡單來說,具有以下特點:
1. 牛頓法是求解方程零點的方法
2. 牛頓法利用泰勒展開的一階近似的零點獲得更接近真實零點的點
3. 牛頓法通過迭代的方法不斷的獲得更好的解來求得最好的解
首先橄抹,假設(shè)存在一個函數(shù),那么利用泰勒展開公式靴迫,將其進行一階泰勒展開,我們可以求解出展開式的零點楼誓,即令
f(\vec{x_0})+\frac{\partial f(\vec{x})}{\partial \vec{x}}|_{\vec{x}=\vec{x_{0}}}(\vec{x}-\vec{x_0}))=0
=> \vec{x}_1=\vec{x_0}-\frac{f(\vec{x_0})}{\frac{\partial f(\vec{x})}{\partial \vec{x}}|_{\vec{x}=\vec{x_0}}}
然后再在處進行一階泰勒展開玉锌,如此迭代求解,可以計算得到:
然后判斷疟羹,如果滿足主守,則停止迭代,說明此時的就是函數(shù)的零點榄融。
基本牛頓優(yōu)化法
當我們需要求解一個函數(shù)的極值點點的時候参淫,最重要的判斷條件就是,也就是函數(shù)的一階導(dǎo)數(shù)為0時所對應(yīng)的點愧杯。那么涎才,如果要用牛頓法來解決最優(yōu)化的問題,最根本的問題就是力九,使用牛頓-拉夫森方法來求解的零點耍铜。
首先,我們對函數(shù)進行二階泰勒展開:
f(\vec{x})=f(\vec{x_0})+\frac{\partial f(\vec{x})}{\partial \vec{x}}|_{\vec{x}=\vec{x_{0}}}(\vec{x}-\vec{x_0}))+\frac{1}{2}\frac{\partial ^{2} f(\vec{x})}{\partial ^{2} \vec{x}}|_{\vec{x}=\vec{x_{0}}}(\vec{x}-\vec{x_0})^{2})
對上述公式求導(dǎo):
\frac{\partial f(\vec{x})}{\partial \vec{x}}= \frac{\partial f(\vec{x})}{\partial \vec{x}}|_{\vec{x}=\vec{x_{0}}} + \frac{\partial ^{2} f(\vec{x})}{\partial ^{2} \vec{x}}|_{\vec{x}=\vec{x_{0}}}(\vec{x}-\vec{x_0})
=> \vec{x}_n=\vec{x_{n-1}}-\frac{f(\frac{\partial f(\vec{x})}{\partial \vec{x}}|_{\vec{x}=\vec{x_{n-1}}}}{\frac{\partial^{2} f(\vec{x})}{\partial^{2} \vec{x}}|_{\vec{x}=\vec{x_{n-1}}}}
因此跌前,由上述公式可知棕兼,我們可以通過函數(shù)的一階導(dǎo)數(shù)和二階導(dǎo)數(shù)不斷迭代計算出,
然后判斷,如果滿足抵乓,則停止迭代伴挚,說明此時的就是函數(shù)一階導(dǎo)數(shù)的零點靶衍。
在機器學(xué)習(xí)中,二階導(dǎo)數(shù)就是海森矩陣茎芋。
牛頓法的優(yōu)缺點
實際上牛頓法與梯度下降法在優(yōu)化問題上的本質(zhì)方法是一致的颅眶,唯一的區(qū)別是在于如何求解的問題,在牛頓法中的海森矩陣就相當于梯度下降法中的學(xué)習(xí)率(步長)败徊。牛頓法收斂速度相比梯度下降法很快,而且由于海森矩陣的的逆在迭代中不斷減小掏缎,起到逐漸縮小步長的效果皱蹦。但是,如果樣本量非常大眷蜈,那么會導(dǎo)致計算海森矩陣的效率很慢沪哺,同時還需要大量的計算資源。
擬牛頓法
為了解決牛頓法中求解海森矩陣的問題酌儒,我們可以在滿足擬牛頓條件的基礎(chǔ)上構(gòu)造一個近似的海森矩陣辜妓,用近似值來代替標準的海森矩陣參與計算。常用的近似計算算法有DFP算法忌怎,BFGS算法籍滴,L-BFGS算法以及Broyden類算法等。
//todo
最小二乘法
最小二乘法也是用來估計這樣一種參數(shù)榴啸,該參數(shù)能夠使得觀測值和理論值之差的平方和最小孽惰,通常是用來優(yōu)化線性模型,從最小二乘法的概念上可知鸥印,其應(yīng)用的目標函數(shù)是非常受限的勋功,也就是說,其優(yōu)化的目標函數(shù)必須是服從以下形式的:
.
為什么要用這個平方和來表示損失函數(shù)呢库说?什么是最小二乘法的理論基礎(chǔ)呢狂鞋?實際上,最小二乘法是符合矩陣投影理論和高斯正態(tài)誤差理論的潜的。
在深入理解最小二乘法之前骚揍,我們需要定義誤差,如果從線性空間的角度來看的話啰挪,誤差是什么疏咐?誤差其實就是在空間中尋找兩個向量之間的差值最小。如下圖脐供,我們可以假設(shè)是一個標準的值,那么如果存在一個特定的映射模型政己,將確定為酌壕,那么我們需要在這個向量中尋找出與誤差最小的一個向量點,也就是.
結(jié)合線性模型來理解的話卵牍,通常指的是空間中的一個向量果港,而線性模型中的參數(shù)向量實際上是一種變換,這種變換會將空間中的點映射出,但是糊昙,由于我們通常是無法準確地獲得與之間的映射關(guān)系辛掠,一方面是因為數(shù)據(jù)測量的誤差,另一方面是模型本身存在誤差释牺;因此萝衩,與之間是存在誤差的。實際上没咙,尋找最優(yōu)模型實際上就是尋找最優(yōu)的猩谊。
最小二乘法的矩陣表示形式
假設(shè)損失函數(shù)為,那么祭刚,根據(jù)最小二乘法原理牌捷,對針對求導(dǎo),并將其賦值為0涡驮,從而求解出的值暗甥。
\frac{\partial L}{\partial \theta}= \frac{1}{2}\frac{\partial(\vec{y}^T\vec{y}-\vec{y}^T{X}\vec{\theta}-\vec{\theta}^{T}{X}^T\vec{y}+\vec{\theta}^T{X}^T{X}\vec{\theta})}{\partial \vec\theta}
=\frac{1}{2}(-\vec{y}^T{X}-\frac{\partial{(\vec{\theta}^{T}{X}^T\vec{y}})^T}{\vec{\theta}}+\vec\theta^T{X}^T{X}+\frac{\partial\theta^T }{\partial\vec{\theta}}{X}^T{X}\vec{\theta})
= \frac{1}{2}(-\vec{y}^T{X}-\vec{y}^T{X}+\vec\theta^T{X}^T{X}+\frac{(\partial\vec\theta^{T} \cdot {X}^T{X}\vec{\theta})^T}{\partial\vec\theta})
= \frac{1}{2}(-2\vec{y}^T{X} + 2\vec\theta^T{X}^T{X})=0
基于上式,可以推導(dǎo)出
(Notes:一個函數(shù)的維度和該函數(shù)的微分的維度是保持一致的)
最小二乘法的應(yīng)用場景
- 模型必須是線性模型捉捅,求解的損失函數(shù)是誤差的平方和淋袖,(如果不是線性的,則需要通過非線性函數(shù)映射锯梁,將其映射為線性模型即碗,eg:
g(\vec{y}) = {X}\vec{\theta}
令,則此時可以針對與構(gòu)建線性模型)
- 必須要是可逆陌凳。
最大似然估計
最大似然估計法是統(tǒng)計學(xué)中一個用來求解參數(shù)模型中參數(shù)的方法剥懒,這種方法和前面的優(yōu)化算法類似,也是要求具有明確的模型合敦,然后根據(jù)觀測的數(shù)據(jù)來求解模型中未知的參數(shù)初橘。
最大似然原理
似然函數(shù)表示的是統(tǒng)計模型中關(guān)于參數(shù)的一種函數(shù),這種函數(shù)表達的含義是參數(shù)的似然性(或者說該參數(shù)取某個值的概率性)充岛。
在統(tǒng)計學(xué)中保檐,假定存在一個分布,并且假設(shè)該分布的概率密度函數(shù)(連續(xù)型)或者概率質(zhì)量函數(shù)(離散型)為,并且該函數(shù)是關(guān)于參數(shù)的一個函數(shù)崔梗。那么我們獨立地從該分布中抽取出個數(shù)據(jù),分別為夜只,那么,通過這n個觀測的數(shù)據(jù)蒜魄,我們可以計算出模型中參數(shù)的似然函數(shù)扔亥,如下:
由最大似然原理可知场躯,要使用最大似然估計最重要的一點就是需要知道數(shù)據(jù)分布的概率密度函數(shù)或者概率質(zhì)量函數(shù),同時旅挤,該函數(shù)也是我們的建模函數(shù)踢关,也就是說,我們針對一個特定的業(yè)務(wù)問題粘茄,通過構(gòu)建關(guān)于該問題的概率密度函數(shù)或者概率質(zhì)量函數(shù)模型签舞,然后通過最大似然函數(shù)求解該模型中的參數(shù),得到一個精確的函數(shù)柒瓣。
最大似然估計法原理
基于最大似然原理可知儒搭,我們需要計算模型中的參數(shù)的時候,需要構(gòu)建該參數(shù)的似然函數(shù)嘹朗,那么怎么才能得到這個似然函數(shù)呢师妙,最好的方式就是根據(jù)已知的觀測數(shù)據(jù)诵肛,來計算這個似然函數(shù)屹培,具體來說就是構(gòu)建如下似然函數(shù):
,顯然怔檩,這是一個聯(lián)合概率分布.
- 那么為了簡化這個問題的計算過程褪秀,通常會假設(shè)所有的數(shù)據(jù)樣本之間是獨立的,因此薛训,有如下表達式:
- 同時媒吗,由于連乘計算不方便,因此乙埃,會對上述公式取對數(shù)闸英,從而轉(zhuǎn)變?yōu)榧臃ㄓ嬎悖@樣非常方便求解函數(shù)的極值點介袜。
最大似然估計法最根本的就是求解的最大值甫何。
最大似然估計法的步驟入下:
- 寫出似然函數(shù)
- 對似然函數(shù)取對數(shù),并整理遇伞;
- 求導(dǎo)數(shù) 辙喂;
- 解似然方程
(Notes:最大似然估計只考慮某個模型能產(chǎn)生某個給定觀察序列的概率,而未考慮該模型本身的概率)