常用机器学习算法汇总比较(完)
機器學習入門系列(2)–如何構建一個完整的機器學習項目,第九篇!
該系列的前八篇文章:
- 機器學習入門系列(2)–如何構建一個完整的機器學習項目(一)
- 機器學習數據集的獲取和測試集的構建方法
- 特征工程之數據預處理(上)
- 特征工程之數據預處理(下)
- 特征工程之特征縮放&特征編碼
- 特征工程(完)
- 常用機器學習算法匯總比較(上)
- 常用機器學習算法匯總比較(中)
常用機器學習算法匯總比較的最后一篇,介紹提升(Boosting)算法、GBDT、優化算法和卷積神經網絡的基本原理、優缺點。
9. 提升(Boosting)方法
簡述
提升方法(boosting)是一種常用的統計學習方法,在分類問題中,它通過改變訓練樣本的權重,學習多個分類器,并將這些分類器進行線性組合,提供分類的性能。
boosting 和 bagging
boosting 和 bagging 都是集成學習(ensemble learning)領域的基本算法,兩者使用的多個分類器的類型是一致的。
Bagging
bagging也叫自助匯聚法(bootstrap aggregating),比如原數據集中有 N 個樣本,我們每次從原數據集中有放回的抽取,抽取 N 次,就得到了一個新的有 N 個樣本的數據集,然后我們抽取 S 個 N 次,就得到了 S 個有 N 個樣本的新數據集,然后拿這 S 個數據集去訓練 S 個分類器,之后應用這 S 個分類器進行分類,選擇分類器投票最多的類別作為最后的分類結果。一般來說自助樣本的包含有 63% 的原始訓練數據,因為:
假設共抽取 N 個樣本,則 N 次都沒有抽到的概率是 p=(1?1N)Np=(1-\frac{1}{N})^Np=(1?N1?)N
則一個樣本被抽到的概率有 p=1?(1?1N)Np = 1- (1- \frac{1}{N})^Np=1?(1?N1?)N
所以,當 N 很大時有:p=1?1e=0.632p = 1- \frac{1}{e} = 0.632p=1?e1?=0.632。
這樣,在一次 bootstrap 的過程中,會有 36% 的樣本沒有被采樣到,它們被稱為 out-off-bag(oob),這是自助采樣帶給 bagging 的里一個優點,因為我們可以用 oob 進行**“包外估計”(out-of-bag estimate)**。
bagging 通過降低基分類器的方差改善了泛化誤差,bagging 的性能依賴于基分類器的穩定性。如果基分類器是不穩定的,bagging 有助于減少訓練數據的隨機波動導致的誤差,如果基分類器是穩定的,即對訓練數據集中的微小變化是魯棒的,則組合分類器的誤差主要由基分類器偏移所引起的,這種情況下,bagging 可能不會對基分類器有明顯的改進效果,甚至可能降低分類器的性能。
boosting 與 bagging 的區別
- bagging 通過有放回的抽取得到了 S 個數據集,而 boosting 用的始終是原數據集,但是樣本的權重會發生改變。
- boosting 對分類器的訓練是串行的,每個新分類器的訓練都會受到上一個分類器分類結果的影響。
- bagging 里面各個分類器的權重是相等的,但是 boosting 不是,每個分類器的權重代表的是其對應分類器在上一輪分類中的成功度。
AdaBoost 是 boosting 方法中最流行的版本
AdaBoost 算法
AdaBoost(adaptive boosting)是元算法,通過組合多個弱分類器來構建一個強分類器。
我們為訓練數據中的每一個樣本都賦予其一個權重,這些權重構成了向量 D,一開始,這些權重都初始化成相等值,然后每次添加一個弱分類器對樣本進行分類,從第二次分類開始,將上一次分錯的樣本的權重提高,分對的樣本權重降低,持續迭代。
此外,對于每個弱分類器而言,每個分類器也有自己的權重,取決于它分類的加權錯誤率,加權錯誤率越低,則這個分類器的權重值 α 越高,最后綜合多個弱分類器的分類結果和其對應的權重 α 得到預測結果,AdaBoost 是最好的監督學習分類方法之一。
優缺點
優點
缺點
- 對異常值比較敏感
- 訓練時間過長
- 執行效果依賴于弱分類器的選擇
10. GBDT
簡述
GBDT 是一個基于迭代累加的決策樹算法,它通過構造一組弱的學習器(樹),并把多顆決策樹的結果累加起來作為最終的預測輸出。
GBDT中的樹是回歸樹,不是分類樹。
隨機森林(Random Forest,RF) 與 GBDT 對比
優缺點
優點
缺點
調參
xgboost
xgboost 是 boosting Tree 的一個很牛的實現,它在 Kaggle 比賽中大放異彩。它有以下幾個優良的特性:
在項目實測中使用發現,Xgboost 的訓練速度要遠遠快于傳統的 GBDT 實現,10 倍量級。
代碼實現
下面給出簡單使用xgboost這個框架的例子。
# 劃分數據集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.01, random_state=1729) print(X_train.shape, X_test.shape)#模型參數設置 xlf = xgb.XGBRegressor(max_depth=10, learning_rate=0.1, n_estimators=10, silent=True, objective='reg:linear', nthread=-1, gamma=0,min_child_weight=1, max_delta_step=0, subsample=0.85, colsample_bytree=0.7, colsample_bylevel=1, reg_alpha=0, reg_lambda=1, scale_pos_weight=1, seed=1440, missing=None)xlf.fit(X_train, y_train, eval_metric='rmse', verbose = True, eval_set = [(X_test, y_test)],early_stopping_rounds=100)# 計算 auc 分數、預測 preds = xlf.predict(X_test)11. 優化算法
常見的最優化方法有梯度下降法、牛頓法和擬牛頓法、共軛梯度法等等
梯度下降法
梯度下降法是最早最簡單,也是最為常用的最優化方法。
梯度下降法實現簡單,當目標函數是凸函數時,梯度下降法的解是全局解。
一般情況下,其解不保證是全局最優解,梯度下降法的速度也未必是最快的。
梯度下降法的優化思想是用當前位置負梯度方向作為搜索方向,因為該方向為當前位置的最快下降方向,所以也被稱為是”最速下降法“。最速下降法越接近目標值,步長越小,前進越慢。
梯度下降法的搜索迭代示意圖如下圖所示:
其缺點是:
(1)靠近極小值時收斂速度減慢,如下圖所示;
(2)直線搜索時可能會產生一些問題;
(3)可能會“之字形”地下降。
從上圖可以看出,梯度下降法在接近最優解的區域收斂速度明顯變慢,利用梯度下降法求解需要很多次的迭代。
在機器學習中,基于基本的梯度下降法發展了三種梯度下降方法:
其中小批量梯度下降法是前兩種方法的一個折中,也是目前最常用的梯度下降法,它即避免了批量梯度下降法需要計算整個訓練集的缺點,也不會像隨機梯度下降法一樣會出現訓練震蕩,不穩定的缺點。當然,它相比前兩種方法的缺點就是比較容易陷入局部最小值中。
牛頓法
牛頓法是一種在實數域和復數域上近似求解方程的方法。方法使用函數 f(x) 的泰勒級數的前面幾項來尋找方程 f(x) = 0 的根。
它是二階算法,它使用了 Hessian 矩陣求權重的二階偏導數,目標是采用損失函數的二階偏導數尋找更好的訓練方向。
牛頓法最大的特點就在于它的收斂速度很快。
牛頓法是基于當前位置的切線來確定下一次的位置,所以牛頓法又被很形象地稱為是"切線法"。牛頓法的搜索路徑(二維情況)如下圖所示:
牛頓法搜索動態示例圖:
關于牛頓法和梯度下降法的效率對比:
- 從本質上去看,牛頓法是二階收斂,梯度下降是一階收斂,所以牛頓法就更快。如果更通俗地說的話,比如你想找一條最短的路徑走到一個盆地的最底部,梯度下降法每次只從你當前所處位置選一個坡度最大的方向走一步,牛頓法在選擇方向時,不僅會考慮坡度是否夠大,還會考慮你走了一步之后,坡度是否會變得更大。所以,可以說牛頓法比梯度下降法看得更遠一點,能更快地走到最底部。(牛頓法目光更加長遠,所以少走彎路;相對而言,梯度下降法只考慮了局部的最優,沒有全局思想。)
- 根據 wiki上的解釋,從幾何上說,牛頓法就是用一個二次曲面去擬合當前所處位置的局部曲面,而梯度下降法是用一個平面去擬合當前的局部曲面,通常情況下,二次曲面的擬合會比平面更好,所以牛頓法選擇的下降路徑會更符合真實的最優下降路徑。
注:紅色的牛頓法的迭代路徑,綠色的是梯度下降法的迭代路徑。
優缺點
優點
二階收斂,收斂速度快;
缺點
擬牛頓法
擬牛頓法的本質思想是改善牛頓法每次需要求解復雜的 Hessian 矩陣的逆矩陣的缺陷,它使用正定矩陣來近似 Hessian 矩陣的逆,從而簡化了運算的復雜度。
擬牛頓法和最速下降法一樣只要求每一步迭代時知道目標函數的梯度。通過測量梯度的變化,構造一個目標函數的模型使之足以產生超線性收斂性。這類方法大大優于最速下降法,尤其對于困難的問題。
另外,因為擬牛頓法不需要二階導數的信息,而是在每次迭代的時候計算一個矩陣,其逼近海塞矩陣的逆。最重要的是,該逼近值只是使用損失函數的一階偏導來計算,所以有時比牛頓法更為有效。
如今,優化軟件中包含了大量的擬牛頓算法用來解決無約束,約束,和大規模的優化問題。
共軛梯度法(Conjugate Gradient)
共軛梯度法是介于最速下降法與牛頓法之間的一個方法,**它僅需利用一階導數信息,但克服了最速下降法收斂慢的缺點,又避免了牛頓法需要存儲和計算Hesse矩陣并求逆的缺點,**共軛梯度法不僅是解決大型線性方程組最有用的方法之一,也是解大型非線性最優化最有效的算法之一。在各種優化算法中,共軛梯度法是非常重要的一種。其優點是所需存儲量小,具有收斂快,穩定性高,而且不需要任何外來參數。
在共軛梯度訓練算法中,因為是沿著共軛方向(conjugate directions)執行搜索的,所以通常該算法要比沿著梯度下降方向優化收斂得更迅速。共軛梯度法的訓練方向是與海塞矩陣共軛的。
共軛梯度法已經證實其在神經網絡中要比梯度下降法有效得多。并且由于共軛梯度法并沒有要求使用海塞矩陣,所以在大規模神經網絡中其還是可以做到很好的性能。
啟發式優化方法
啟發式方法指人在解決問題時所采取的一種根據經驗規則進行發現的方法。其特點是在解決問題時,利用過去的經驗,選擇已經行之有效的方法,而不是系統地、以確定的步驟去尋求答案。啟發式優化方法種類繁多,包括經典的模擬退火方法、遺傳算法、蟻群算法以及粒子群算法等等。
還有一種特殊的優化算法被稱之多目標優化算法,它主要針對同時優化多個目標(兩個及兩個以上)的優化問題,這方面比較經典的算法有 NSGAII 算法、MOEA/D 算法以及人工免疫算法等。
解決約束優化問題–拉格朗日乘數法
這個方法可以參考文章 拉格朗日乘數法
Levenberg-Marquardt 算法
Levenberg-Marquardt 算法,也稱之為衰減最小二乘法(damped least-squares method),該算法的損失函數采用平方誤差和的形式。該算法的執行也不需要計算具體的海塞矩陣,它僅僅只是使用梯度向量和雅可比矩陣(Jacobian matrix)。
Levenberg-Marquardt 算法是為平方誤差和函數所定制的。這就讓使用這種誤差度量的神經網絡訓練地十分迅速。然而 Levenberg-Marquardt 算法還有一些缺點:
- 不能用于平方根誤差或交叉熵誤差(cross entropy error)等函數,
- 該算法還和正則項不兼容。
- 最后,對于大型數據集或神經網絡,雅可比矩陣會變得十分巨大,因此也需要大量的內存。所以我們在大型數據集或神經網絡中并不推薦采用 Levenberg-Marquardt 算法。
內存與收斂速度的比較
下圖展示了所有上文所討論的算法,及其收斂速度和內存需求。其中收斂速度最慢的是梯度下降算法,但該算法同時也只要求最少的內存。相反,Levenberg-Marquardt 算法可能是收斂速度最快的,但其同時也要求最多的內存。比較折衷方法是擬牛頓法。
總而言之:
- 如果我們的神經網絡有數萬參數,為了節約內存,我們可以使用梯度下降或共軛梯度法。
- 如果我們需要訓練多個神經網絡,并且每個神經網絡都只有數百參數、數千樣本,那么我們可以考慮 Levenberg-Marquardt 算法。
- 而其余的情況,擬牛頓法都能很好地應對。
12. 卷積神經網絡(CNN)
CNN 可以應用在場景分類,圖像分類,現在還可以應用到自然語言處理(NLP)方面的很多問題,比如句子分類等。
LeNet 是最早的CNN結構之一,它是由大神 Yann LeCun 所創造的,主要是用在字符分類問題。
卷積神經網絡主要包含四種不同的網絡層,分別是卷積層,非線性層(也就是使用了ReLU函數),Pooling層,全連接層,下面將一一介紹這幾種網絡層。
12.1 卷積層
卷積簡介
CNN的名字由來就是因為其使用了卷積運算的緣故。卷積的目的主要是為了提取圖片的特征。卷積運算可以保持像素之間的空間關系。
每張圖片可以當做是一個包含每個像素值的矩陣,像素值的范圍是 0~255,0 表示黑色,255 是白色。下面是一個 5 × 5 大小的矩陣例子,它的值是 0 或者 1。
接下來是另一個 3 × 3 矩陣:
上述兩個矩陣通過卷積,可以得到如下圖右側粉色的矩陣結果。
黃色的矩陣在綠色的矩陣上從左到右,從上到下,每次滑動的步進值是1個像素,所以得到一個 3 × 3 的矩陣。
在CNN中,黃色的矩陣被叫做濾波器(filter)或者核(kernel)或者是特征提取器,而通過卷積得到的矩陣則是稱為“特征圖(Feature Map)”或者“Activation Map”。
另外,使用不同的濾波器矩陣是可以得到不同的 Feature Map ,例子如下圖所示:
上圖通過濾波器矩陣,實現了不同的操作,比如邊緣檢測,銳化以及模糊操作等。
在實際應用中,CNN 是可以在其訓練過程中學習到這些濾波器的值,不過我們需要首先指定好濾波器的大小,數量以及網絡的結構。使用越多的濾波器,可以提取到更多的圖像特征,網絡也就能夠有更好的性能。
Feature Map 的尺寸是由以下三個參數來決定的:
- 深度(Depth): 深度等于濾波器的數量。
- 步進(Stride): 步進值是在使用濾波器在輸入矩陣上滑動的時候,每次滑動的距離。步進值越大,得到的 Feature Map 的尺寸越小。
- Zero-padding: 有時候可以在輸入矩陣的邊界填補 0,這樣就可以將濾波器應用到邊緣的像素點上,一個好的 Zero-padding 是能讓我們可以控制好特征圖的尺寸的。使用該方法的卷積稱為 wide convolution,沒有使用的則是 narrow convolution。
卷積公式和參數量
卷積是大自然中最常見的運算,一切信號觀測、采集、傳輸和處理都可以用卷積過程實現,其用公式表達如下:
KaTeX parse error: No such environment: align at position 8: \begin{?a?l?i?g?n?}? Y(m,n) & =X(m,…
上述公式中 H(m,n)H(m,n)H(m,n) 表示卷積核。
在 CNN 中的卷積層的計算步驟與上述公式定義的二維卷積有點差異,首先是維度升至三維、四維卷積,跟二維卷積相比多了一個**“通道”(channel)**,每個通道還是按照二維卷積方式計算,而多個通道與多個卷積核分別進行二維卷積,得到多通道輸出,需要“合并”為一個通道;其次是卷積核在卷積計算時沒有“翻轉”,而是與輸入圖片做滑動窗口“相關”計算。用公式重新表達如下:
Yl(m,n)=Xk(m,n)?Hkl(m,n)=∑k=0K?1∑i=0I?1∑j=0J?1Xk(m+i,n+j)Hkl(i,j)Y^l(m,n) =X^k(m,n)*H^{kl}(m,n) = \sum_{k=0}^{K-1}\sum_{i=0}^{I-1}\sum_{j=0}^{J-1}X^k(m+i,n+j)H^{kl}(i,j) Yl(m,n)=Xk(m,n)?Hkl(m,n)=k=0∑K?1?i=0∑I?1?j=0∑J?1?Xk(m+i,n+j)Hkl(i,j)
這里假定卷積層有 L 個輸出通道和 K 個輸入通道,于是需要有 K×L 個卷積核實現通道數目的轉換。其中 X^k 表示第 k 個輸入通道的二維特征圖,Y^l 表示第 l 個輸出通道的二維特征圖,H^{kl} 表示第 k 行、第 l 列二維卷積核。
假定卷積核大小是 I×J,每個輸出通道的特征圖大小是 M×N,則該層每個樣本做一次前向傳播時卷積層的計算量是
Calculations(MAC)=I×J×M×N×K×L。
卷積層的學習參數,也就是卷積核數目乘以卷積核的尺寸–Params=I×J×K×LParams = I×J×K×LParams=I×J×K×L。
這里定義計算量-參數量之比是CPR=Calculations/Params=M×NCalculations/Params=M×NCalculations/Params=M×N。
因此可以得出結論:卷積層的輸出特征圖尺寸越大,CPR 越大,參數重復利用率越高。若輸入一批大小為 B 的樣本,則 CPR 值可提高 B 倍。
優點
卷積神經網絡通過**『參數減少』與『權值共享』**大大減少了連接的個數,即需要訓練的參數的個數。
假設我們的圖像是 1000×1000 的,則有 10^6 個隱層神經元,那么它們全連接的話,也就是每個隱層神經元都連接圖像的每個像素點,就有 10^12 個連接,也即 10^12 個權值參數需要訓練,這顯然是不值得的。
但是對于一個只識別特定特征的卷積核,需要大到覆蓋整個圖像的所有像素點嗎?
通常是不需要的,一個特定特征,尤其是第一層需要提取的特征,通常都相當基礎,只占圖像很小的一部分。所以我們設置一個較小的局部感受區域,比如10*10,也即每個神經元只需要和這10*10的局部圖像相連接,所以 10^6 個神經元也就有 10^8 個連接。這就叫參數減少。
那什么叫權值共享呢?
在上面的局部連接中,10^6 個神經元,每個神經元都對應 100 個參數,所以是 10^8 個參數,那如果每個神經元所對應的參數都是相同的,那需要訓練的參數就只有 100 個。
這后面隱含的道理在于,這 100 個參數就是一個卷積核,而卷積核是提取特征的方式,與其在圖像上的位置無關,圖像一個局部的統計特征與其他局部的統計特征是一樣的,我們用在這個局部抽取特征的卷積核也可以用在圖像上的其它任何地方。
而且這 100 個參數只是一種卷積核,只能提取一種特征,我們完全可以采用 100 個卷積核,提取 100 種特征,而所需要訓練的參數也不過 10^4,最開始我們訓練 10^12 個參數,還只能提取一種特征。選取 100 個卷積核,我們就能得到 100 張特征圖,每張特征圖可以看做是一張圖像的不同通道。
CNN 主要用來識別位移、縮放及其他形式扭曲不變性的二維圖形。
由于 CNN 特征檢測層通過訓練數據進行學習,在使用 CNN 時,避免了顯式的特征抽取,而隱式地從訓練數據中進行學習;
再者,由于同一個特征圖上的神經元權值相同,所以網絡可以并行學習,這也是卷積網絡相對于神經元彼此相連網絡的一大優勢。
卷積神經網絡以其局部權值共享的特殊結構在語音識別和圖像處理方面有著獨特的優越性,其布局更接近于實際的生物神經網絡,權值共享降低了網絡的復雜性,避免了特征提取和分類過程中數據重建的復雜度。
12.2 非線性層(ReLU)
非線性修正函數**ReLU(Rectified Linear Unit)**如下圖所示:
這是一個對每個像素點實現點乘運算,并用 0 來替換負值像素點。
其目的是在 CNN 中加入非線性,因為使用 CNN 來解決的現實世界的問題都是非線性的,而卷積運算是線性運算,所以必須使用一個如ReLU的非線性函數來加入非線性的性質。
其他非線性函數還包括 tanh 和 Sigmoid,但是 ReLU 函數已經被證明在大部分情況下性能最好。
12.3 Pooling層
**空間合并(Spatial Pooling)**也可以叫做子采樣或者下采樣,可以在保持最重要的信息的同時降低特征圖的維度。它有不同的類型,如最大化,平均,求和等等。
對于Max Pooling操作,首先定義一個空間上的鄰居,比如一個 2×2 的窗口,對該窗口內的經過 ReLU 的特征圖提取最大的元素。除了提取最大的元素,還可以使用窗口內元素的平均值或者是求和的值。
不過,Max Pooling 的性能是最好的。例子可以如下圖所示:
上圖中使用的步進值是 2。
根據相關理論,特征提取的誤差主要來自兩個方面:
一般來說,mean-pooling 能減小第一種誤差,更多的保留圖像的背景信息,max-pooling 能減小第二種誤差,更多的保留紋理信息。
使用Pooling的原因有如下幾點:
- 不變性,更關注是否存在某些特征而不是特征具體的位置。可以看作加了一個很強的先驗,讓學到的特征要能容忍一些的變化。
- 減小下一層輸入大小,減小計算量和參數個數。
- 獲得定長輸出。(文本分類的時候輸入是不定長的,可以通過池化獲得定長輸出)
- 防止過擬合或有可能會帶來欠擬合
12.4 全連接層
全連接層就是一個傳統的多層感知器,它在輸出層使用一個 softmax 激活函數。
其主要作用就是將前面卷積層提取到的特征結合在一起然后進行分類。
Softmax 函數可以將輸入是一個任意實數分數的向量變成一個值的范圍是 0~1 的向量,但所有值的總和是 1。
在 CNN 出現之前,最早的深度學習網絡計算類型都是全連接形式的。
比較卷積層和全連接層,卷積層在輸出特征圖維度實現了權值共享,這是降低參數量的重要舉措,同時,卷積層局部連接特性(相比全連接)也大幅減少了參數量。
因此卷積層參數量占比小,但計算量占比大,而全連接層是參數量占比大,計算量占比小。所以在進行計算加速優化時,重點放在卷積層;在進行參數優化、權值剪裁時,重點放在全連接層。
12.5 反向傳播(Backpropagation)
CNN的整個訓練過程如下所示:
小結
常用的機器學習算法就簡單介紹到這里,下一篇會介紹模型的評估方法。
參考:
- 《統計學習方法》
- Ensemble learning:Bagging,Random Forest,Boosting
- 機器學習(四)— 從gbdt到xgboost
- xgboost入門與實戰(原理篇)
- 機器學習算法中GBDT和XGBOOST的區別有哪些?
- 常見的幾種最優化方法
- An Intuitive Explanation of Convolutional Neural Networks
- 對CNN中pooling的理解
- 《深度學習輕松學:核心算法與視覺實踐》
- ResNet解析
歡迎關注我的微信公眾號–機器學習與計算機視覺,或者掃描下方的二維碼,大家一起交流,學習和進步!
往期精彩推薦
機器學習系列
- 機器學習入門系列(1)–機器學習概覽
- 機器學習入門系列(2)–如何構建一個完整的機器學習項目(一)
- 機器學習數據集的獲取和測試集的構建方法
- 特征工程之數據預處理(上)
- 特征工程之數據預處理(下)
- 特征工程之特征縮放&特征編碼
- 特征工程(完)
- 常用機器學習算法匯總比較(上)
- 常用機器學習算法匯總比較(中)
Github項目 & 資源教程推薦
- [Github 項目推薦] 一個更好閱讀和查找論文的網站
- [資源分享] TensorFlow 官方中文版教程來了
- 必讀的AI和深度學習博客
- [教程]一份簡單易懂的 TensorFlow 教程
- [資源]推薦一些Python書籍和教程,入門和進階的都有!
- [Github項目推薦] 機器學習& Python 知識點速查表
總結
以上是生活随笔為你收集整理的常用机器学习算法汇总比较(完)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据库:后端开发必备的 MySQL日志文
- 下一篇: Jersey MongoDB的使用