1. 程式人生 > >從軟件project的角度寫機器學習3——主要監督學習算法的project性分析

從軟件project的角度寫機器學習3——主要監督學習算法的project性分析

求解 大戰 dsm 二次 它的 mar 集成 href .info

主要機器學習算法的project適用性分析

前段時間AlphaGo跟李世石的大戰及相關的深度學習的新聞刷了一遍又一遍的朋友圈。只是這件事情,也僅僅是在機器學習的深度上進一步拓展,而機器學習的廣度(也即project化實踐)上,仍然沒有什麽突破性的理論或實踐,用的領域繼續用,不用的領域依舊不用。

project性分析的作用

project上的瑣事

機器學習的使命是使計算機強大的運算能力和存儲能力轉化為推演能力。能轉化是一方面。轉化的效率則是還有一方面。科研性質的AlphaGo,擁有近乎無限的計算資源。不用太考慮這方面的問題。但在我們實際的project應用中,時時刻刻要考慮到實現難度、內存、效率、能耗、穩定性等瑣碎的問題。

下圖列了機器學習在實際project應用中會碰到的一系列問題。本篇呢,僅僅討論各類算法的時空復雜度及可並行性。
技術分享圖片

評估標準

機器學習算法的應用,通常是離線訓練出模型後。放到線上預測。對於server集群而言。有可能訓練和預測發生在同一種設備上。但很多其它的情況下。尤其是做client開發時,我們訓練出來的模型是在放到一個計算資源比訓練環境少得多的設備上去執行的。


離線訓練在計算資源上沒有太多限制,也不須要非常實時,但假設確實數據量非常大並且訓練時間非常長時,也希望能通過加機器解決這個問題(scale out)。
線上預測則會有實時性的要求,假設是移動設備,還有功耗的要求。

離線(訓練)

離線訓練過程,主要考慮下面因素

算法實現難度

project上使用機器學習,盡管非常多情況下是用現成的代碼庫,但算法的實現難度影響了可用的代碼庫的多少與好壞。並且,隨著計算機硬件和軟件架構的不斷發展。始終是須要算法的實現代碼與時俱進的(分布式、硬件加速等)。這時候算法實現難度也決定了它更新的難易。
另外,對於“有理想、有追求”的公司來說,掌控一個project的所有流程是必需的,真正做深做精,必須自己實現機器學習算法,參考文章http://www.infoq.com/cn/news/2015/12/manual-machine-algorithm-reason。

這時,算法實現難度就是非常現實的問題了。

算法使用難度

這裏的算法使用難度也包含算法本身的健壯性,是project上最須要好好考慮的地方。

一方面是對臟數據是否敏感。需不須要做復雜的數據清洗;還有一方面是須要設定多少參數,參數本身對算法結果影響是否顯著。


算法使用難度高,須要專業人士去使用,project的人力成本會顯著提升。
使用難度高的還有一後果則是結果不可預估,須要重復嘗試。造成額外的時間和人力耗費。

訓練所需資源與並行性

對大公司而言。機器比人廉價,動輒幾百臺的server,計算資源不愁,但對小公司來說。則非常可能是人比機器廉價,訓練算法的時間復雜度和空間復雜度太高。則不一定承受得起。


算法的並行性一方面決定算法能不能scale up(加機器),還有一方面決定它能不能使用GPU加速(使用GPU加速後所須要資源和能耗可大大減少)。

在線(預測)

模型文件大小

監督學習算法訓練數據之後。將得到一個模型文件。以供做興許預測。這個模型文件的大小決定它是否可遷移到其它設備上執行。
模型文件的大小也是評估學習算法是否過擬合的一個指標。

預測速度

預測速度不僅僅是實時性的問題,也是功耗的問題。速度快的通常是因為運算量少。功耗也會低。
在移動設備上,這是非常重要的考量因素。

算法評價

支持向量機SVM

訓練時的時間復雜度為內積計算+核函數映射+梯度下降/SMO,核函數計算相對於內積計算能夠忽略,因此線性SVM和非線性SVM的訓練時間復雜度是幾乎相同的。

但假設要考慮到非線性SVM的參數調優,其復雜度就須要乘尋優叠代數(網格尋優RBF核函數。粒度為100時就是10000倍。
內積計算是能夠做數據並行的,在海量數據下,二次規劃的解法用SMO或梯度下降,盡管SMO的算法復雜度低,可是不easy並行實現,因此在大數據量下,還是用梯度下降。

SVM的數據並行原理上不難,實施起來因為SVM本身算法就復雜,還是比較麻煩的。

預測時線性SVM和非線性SVM有非常大區別:
SVM完畢訓練之後。終於權值不為0的樣本留下,作為支持向量。
非線性SVM必須保留所有支持向量。在預測時讓所有支持向量與目標向量作一次內積計算。因此。支持向量數決定了模型的大小和預測的時間復雜度。(在海量數據之下,這個支持向量數非常可能也是海量的)
線性SVM能夠對所有支持向量作合並,成為一個超平面方程,這樣僅僅就是維度量級的一組參數。

另外,支持向量機因為天然僅僅支持二分類,在處理多分類問題時必須用一套組合邏輯把二分類器擴展為多分類器。
參考:
http://blog.sina.com.cn/s/blog_5eef0840010147pa.html
這也會將減少預測的速度。

除了那些有名的機器學習工具包之外,svm有一個專門的工具libsvm去實現,能夠適用於數據量不太大的情形。這個工具包基本上能夠無腦訓練模型,僅僅是做預測時要集成一下代碼。

邏輯回歸(Logistic回歸)

邏輯回歸是改變了損失函數計算方式的線性回歸。使用梯度下降算法去求解系數。系數個數就是特征個數。


鑒於使用梯度下降算法去求解系數。不斷計算導數和偏移會有一些運算量。但運算量明顯地比SVM少。且十分easy拓展到大數量的應用。
邏輯回歸訓練出來的結果大部分情況下都是欠擬合。少數情況下。特征實在取得太多,也會有過擬合出現。

樸素貝葉斯

樸素貝葉斯的訓練過程就是一個統計數據頻率的過程,非常迅速,得出的是一系列概率值,在預測時計算所有類別的概率取最高者就可。


作為一個簡單暴力的算法,project上應用非常廣。

決策樹

C4,5決策樹

決策樹的訓練是一個不斷尋找最優分劃點的過程。選取分劃點時,每一個可能選擇都要過一次。但不斷分劃過程中,數據量也不斷減少,整體訓練速度還是非常快的。
決策樹出來的模型是比較簡單的,也能夠配參數控制。這使得它非常easy集成。


因為它在訓練過程中會做特征的選擇,因此有少量無效特征對它影響不大。但當樹深比較大時,會過擬合。


普通情況它的訓練速度快於邏輯回歸。也比較準確,但在大數據量下。因為決策樹的分劃點計算過程須要遍歷所有數據。效率不一定比使用了隨機梯度下降的邏輯回歸高。

隨機森林

隨機森林對數據進行若幹次隨機採樣。生成若幹個決策樹,使用
訓練時。盡量每次數據是採樣一部分,但因為要生成多個子樹,其復雜度整體而言比決策樹高。


預測時,則因為原先的一個決策樹變成了多個(通常是幾十個),預測的復雜度明顯變高。

近期鄰算法KNN

KNN屬於惰性學習,訓練過程不做不論什麽處理,僅僅是在預測時查詢近期的n個數據作推斷。


它因為保存了所有訓練數據,其模型文件無疑是非常巨大的,因此這樣的算法僅限於server上使用。

用一張表概括一下:

訓練用的矩陣輸入為 n X m ,n為數據量,m為維度(特征數)。一般來說m 遠小n。
此外記幾個預計系數:
t:10量級
p:100量級
k:1000量級
q:10000量級
f:0~1之間的實數
預測準確率是依據曾經做數據的經驗預計的,隨便看看就好。

算法 訓練時間 訓練內存占用 模型文件大小 預測時間 算法實現難度 算法使用難度 預測準確率
非線性SVM 長O(p*m*n*n)+O(p*k*n*n) 多 O(n*n) O(m*n^f) 較慢 中等
線性SVM 較長O(m*n*n)+O(k*n*n) 同非線性SVM O(m) 一般 一般
邏輯回歸 一般O(k*n*m) 少 O(m) O(m) 一般
樸素貝葉斯 少O(n*m) 少 O(m) O(m*t)
C4,5決策樹 較少O(t*n*m) 少 O(m) O(m*m) 一般 一般
隨機森林 一般 O(t*t*n*m) 少 O(m) O(m*m*t) 較快 較低
BP神經網絡 一般 O(p*q*n*m) 一般 O(m*p) O(m*p) 中等 一般 中等 一般
KNN 無 O(m*n) 低 低 一般

深度學習

上一篇已經說明。深度學習是由一系列無監督+監督學習算法組合而成的。因此也不能簡單地判定其時空復雜度。
深度學習的模型參數一般而言是與數據量級無關的,但一方面因為它相對於淺層學習而言對輸入沒那麽挑,輸入向量的維度較大,還有一方面能夠盡情疊加模型。因此其參數量級非常大。
因為深度學習的幾個基本算法(卷積神經網絡CNN、深信度網絡DBN等)都是天然數據並行的算法,作硬件加速也比較easy,加以能夠橫行於海量數據之上的隨機梯度下降算法SGD。使其能夠在海量數據之下進行不是太慢的訓練。
神經網絡類算法的模型參數較多。預測時所須要的內存和時間都比較長,因此在非server環境下還是非常難使用。

從軟件project的角度寫機器學習3——主要監督學習算法的project性分析