張皓 AI科技大本營
如今,機器學習變得十分誘人,它已在網頁搜尋、商品推薦、垃圾郵件檢測、語音識別、影象識別以及自然語言處理等諸多領域發揮重要作用。和以往我們顯式地通過程式設計告訴計算機如何進行計算不同,機器學習是一種資料驅動方法(data-driven approach)。然而,有時候機器學習像是一種"魔術",即使是給定相同的資料,一位機器學習領域專家和一位新手訓練得到的結果可能相去甚遠。
本文簡要討論了實際應用機器學習時九個需要注意的重要方面。
作者 | 張皓
整理 | AI科技大本營(微信ID:rgznai100)
我該選什麼學習演算法?
這可能是你面對一個具體應用場景想到的第一個問題。
你可能會想"機器學習裡面這麼多演算法,究竟哪個演算法最好"。很"不幸"的是,沒有免費午餐定理(No Free LunchTheorem)告訴我們對於任意兩個學習演算法,如果其中一個在某些問題上比另一個好,那麼一定存在一些問題另一個學習演算法(表現會)更好。因此如果考慮所有可能問題,所有演算法都一樣好。
"好吧",你可能會接著想, "沒有免費午餐定理假定所有問題都有相同機會發生,但我只關心對我現在面對的問題,哪個演算法更好"。又很"不幸"的是,有可能你把機器學習裡面所謂"十大演算法"都試了一遍,然後感覺機器學習"這東西根本沒用,這些演算法我都試了,沒一個效果好的"。前一段時間"約戰比武"的話題很熱,其實機器學習和練武術有點像,把太極二十四式朝對方打一遍結果對方應聲倒下這是不可能的。
機器學習演算法是有限的,而現實應用問題是無限的,以有限的套路應對無限的變化,一定是會存在有的問題你無法用現有的演算法解決的,豈有不敗之理?
因此,該選什麼學習演算法要和你要解決的具體問題相結合。不同的學習演算法有不同的歸納偏好(inductive bias),你使用的演算法的歸納偏好是否適應要解決的具體問題直接決定了學得模型的效能,有時你可能需要改造現有演算法以應對你要解決的現實問題。
我該選什麼目標函式?
目標函式用於刻畫什麼樣的模型是好的,和選擇學習演算法一樣,選什麼目標函式也要和具體問題相結合。大部分的教材和文獻重點在呈現演算法,對目標函式和優化方法的選擇通常使用預設值。以分類問題為例,我們預設地優化分類均等代價(cost)下的錯誤率。但是在你所要解決的問題中,問問自己這些問題:
l 你真正關心的是錯誤率嗎(比如還有查準率(precision),查全率(recall)等其他指標)?
l 資料中有沒有類別不平衡(class-imbalance)的現象(比如信用卡欺詐檢測中,欺詐使用者數遠小於正常使用者數)?
l 不同型別錯誤所造成的損失是一樣的嗎(比如醫療診斷中,錯誤地把患者診斷為健康人與錯誤地把健康人診斷為患者的代價截然不同)?
l 還有沒有其他型別的代價(除了誤分類代價外,還有測試代價,標記代價,特徵(feature)代價等)?
除此之外還有其他的一些問題。這些問題存不存在,要不要考慮,該怎麼考慮都是和你要處理的實際問題有關,最終體現在你的目標函式之中。
我該選什麼優化方法?
“我是誰?我從哪裡來?我往哪裡去?”是哲學裡避不開的三個問題,而“選什麼演算法?選什麼目標函式? 選什麼優化方法?”是機器學習裡經常遇到的三個問題,這三者的組合就構成了一個機器學習解決方案基本框架。通常,我們使用現有的數值優化方法對目標函式進行優化,比如梯度下降(gradient descent),牛頓法等。
但是當目標函式非凸(non-convex),有多個區域性極小(local minima)時,選什麼優化方法會對結果產生直接影響。比如深度學習中通常目標函式有多個區域性極小,使用不同的引數初始化方法(如高斯(Gaussian)隨機初始化,Xavier 初始化, MSRA 初始化等),不同的優化方法(如SGD,帶動量(momentum)的SGD, RMSProp, ADAM 等),或不同的學習率(learning rate)策略等,都會對結果有很大影響。
另一方面,即使目標函式是凸函式,設計合適的優化方法可能會使你的訓練過程有質的飛躍。比如SVM 的優化是一個二次規劃(quadratic programming)問題,可以通過呼叫現成的QP 軟體包進行優化。然而,這個二次規劃問題的大小和訓練樣本數成線性關係,當資料量很大時將導致巨大的開銷。為了避開這個障礙,人們根據SVM 的特點設計出了SMO (sequential minimaloptimization)這樣的高效優化方法。
不要偷看測試資料
我們希望學習器能從訓練資料中儘可能學出適用於所有潛在樣本(sample)的普遍規律,從而能很好的泛化(generalize)到新樣本。為了評估模型的泛化能力,我們通常收集一部分資料作為測試集(testing set)計算測試誤差用以作為泛化誤差的近似。為了能得到較準的近似,我們不能在訓練階段以任何方式偷看測試資料。
一個常見錯誤做法是用測試資料調模型的引數。這相當於老師在考試前向學生透露考試原題,這雖然可能會使學生在這次考試中拿到高分,但這不能有效反應學生是否對這門課學的很好,獲得了對所學知識舉一反三的能力,得到的將是過於樂觀的估計結果。調參的正確做法是從訓練資料中再劃分出一部分作為驗證集(validation set),用訓練集(training set)剩下的資料做訓練,用驗證集調參。
另一個常見錯誤是用測試資料參加訓練資料預處理(data pre-processing)。通常,資料在輸入給模型之前會經過一些預處理,比如減去各維的均值,除以各維的方差等。如果這個均值和方差是由訓練集和測試集資料一起計算得到的,這相當於間接偷看了測試資料。
這相當於老師在考前向學生劃重點,雖然比直接透露原題好一些,由於學生知道了考試範圍(即測試資料分佈),也會使我們得到過於樂觀的估計。正確做法是隻從訓練資料中計算預處理所用的統計量,將這個量應用於測試集。
欠擬合/過擬合: 認準你的敵人
欠擬合(underfitting)通常是由於學習器的學習能力不足,過擬合(overfitting)通常是由於學習能力過於強大。兩者都會影響模型的泛化能力,但是解決這兩個問題的方法迥然不同。解決欠擬合可以通過使用更復雜的模型,增加訓練輪數等。緩解過擬合可以通過使用簡單模型,正則化(regularization),訓練早停(early-stopping)等。欠擬合比較容易解決,而過擬合是無法徹底避免的,我們只能緩和,減小其風險。因此,問題的關鍵在於認準你當前的敵人是欠擬合還是過擬合。
判斷欠擬合或過擬合最簡單直接的方法是畫出學習曲線(learning curve)。過擬合的表現是: 訓練誤差很低(甚至為0),而測試誤差很高,兩者有很大的差距。而欠擬合的表現是: 訓練誤差和測試誤差很接近,但都很高,下圖是兩個例子,你能看出來哪個處於過擬合,哪個處於欠擬合嗎?
機器智慧+人類智慧
經過前面這幾部分你可能已經意識到了,機器學習不是把資料扔給機器然後自己可以撒手不管。機器學習不是"空手套白狼",如果我們對問題/資料認識的越深刻,我們越容易找到歸納假設與之匹配的學習演算法,學習演算法也越容易學到資料背後的潛在規律。
資料中特徵的好壞直接影響學習演算法的效能。如果資料之間相互獨立並且與資料的標記有很好的相關性,學習過程將相對容易。但很多情況下,你手中資料的原始特徵並沒有這麼好的性質,特徵和標記之間是一個非常複雜的對映關係。這時候機器智慧需要人類智慧的配合,我們需要從原始資料中構造合適的特徵。這個過程叫做特徵工程(featureengineering),這通常需要領域知識和你對這個問題的認識。
你可能會想"既然機器學習可以學到從資料的表示到標記的對映,那麼我們能不能讓機器自動地從資料的原始特徵中學習到合適的表示呢",表示學習(representation learning)就專門研究這方面的內容。
深度學習的最大優點就在於其表示學習能力,通過很多層的堆疊,深度神經網路可以對輸入資料進行逐層加工,從而把初始的,與輸出目標關係不密切的表示轉化為與輸出目標關係密切的表示。這樣將低層表示轉化為高層表示後,用"簡單模型"即可完成複雜的學習任務。因此,深度學習才能在計算機視覺,自然語言處理,語音識別這樣資料的原始表示和資料的合適表示相差很大的任務上大放異彩。
高維"災難"
經過上一節你可能會想“既然特徵工程這麼重要,那我就把想到的所有的特徵組合都作為資料的特徵不就好了嗎”。這麼做的結果會使特徵維數增加,一方面會增加儲存和計算開銷,更重要的是,它會招來機器學習擔憂的另一頭猛獸: 維數災難(curse ofdimensionality)。
由於你能拿到手中的訓練資料是有限的,當維數增加時,輸入空間(input space)的大小隨維數指數級增加,訓練資料佔整個資料空間的比例將急劇下降,這將導致模型的泛化變得更困難。在高維空間中,樣本資料將變得十分稀疏,許多的相似性度量在高維都會失效。
比如下圖中,最左邊的是原圖,右邊三張圖看上去差別很大,但和原圖都有著相同的歐氏距離。
解決維數災難的一個重要途徑是降維(dimension reduction),即通過一些手段將原始高維空間資料轉變為一個低維子空間,在這個子空間中樣本密度大幅提高,距離計算也更容易。特徵選擇(feature selection)和低維投影(如PCA)是用來處理高維資料的兩大主流技術。
資料!資料!
看了前面各部分的討論可能你已經有點受不了了:“機器學習沒有通式通法,要根據任務具體情況具體分析;要小心翼翼,不能偷看測試資料,要設法避免過擬合和欠擬合;特徵工程很重要,但是特徵又不能太多...哦天吶!這太麻煩了! 有沒有什麼能提升效能直截了當的方法啊!”。有!那就是收集更多的資料。通常情況下,你有很多的資料,但是學習演算法一般和你設計出了很好的學習演算法但手中資料不足相比,前者效果會更好。這是因為收集更多的資料是緩解過擬合最直接有效的方法。
收集更多的資料通常有下面兩種辦法:一種方法是收集更多的真實資料,這是最直接有效的方法。但有時收集資料很昂貴,或者我們拿到的是第二手資料,資料就這麼多。這就需要另一個方法:從現有資料中生成更多資料,用生成的"偽造"資料當作更多的真實資料進行訓練。這個過程叫做資料擴充(data augmentation)。以影象資料做分類任務為例,把影象水平翻轉,移動一定位置,旋轉一定角度,或做一點色彩變化等,這些操作通常都不會影響這幅影象對應的標記。並且你可以嘗試這些操作的組合,理論上講,你可以通過這些組合得到無窮多的訓練樣本。
在收集/生成資料過程中一個要注意的關鍵問題是:確保你的資料服從同一分佈。這比如說老師教了學生一學期的英語結果期末考試卻是考俄語,雖然英語和俄語在語言學上有一定的相似性,但是這給學習過程增加了很多困難。遷移學習(transfer learning)旨在研究資料分佈變化情況下的學習演算法的泛化能力,但如果你的目的不是做遷移學習方面的科學研究,建議你確保你的訓練和測試資料服從同一分佈,這會使問題簡單許多。
整合學習:以柔克剛
面對大多數的任務,整合學習應當是你的必備招式。整合學習的目的在於結合多個弱學習器的優點構成一個強學習器,“三個臭皮匠,頂個諸葛亮”講的就是這個道理。在各種機器學習/資料探勘競賽中,那些取得冠軍的隊伍通常會使用整合學習,有的甚至用成百上千個個體學習器來做整合。通常我們面對一個實際問題時會訓練得到多個學習器,然後使用模型選擇(model selection)方法來選擇一個最優的學習器。而整合學習則相當於把這些學習器都利用起來,因此,整合學習的實際計算開銷並不比使用單一學習器大很多。
目前的整合學習方法大致可以分為兩大類:
- 以Boosting 為代表的整合學習方法中每個個體學習器相互有強依賴關係,必須序列化生成;
- 以Bagging 為代表的整合學習方法中每個個體學習器不存在強依賴關係,可以並行化生成。
而從偏差-方差分解(bias-variancedecomposition)的角度看, Boosting 主要關注降低偏差,而Bagging 主要關注降低方差。欠擬合/過擬合這兩個敵人是不是又一次出現在你眼前了呢?
參考文獻
[1]. Domingos, Pedro. "A few useful things to know about machine learning."
Communications of the ACM 55.10 (2012): 78-87.
[2]. Glorot, Xavier, and Yoshua Bengio. "Understanding the difficulty of training
deep feedforward neural networks." Aistats. Vol. 9. 2010.
[3]. He, Kaiming, et al. "Delving deep into rectifiers: Surpassing human-level
performance on imagenet classification." Proceedings of the IEEE international
conference on computer vision. 2015.
[4]. Kingma, Diederik, and Jimmy Ba. "Adam: A method for stochastic
optimization." arXiv preprint arXiv:1412.6980 (2014).
[5]. Li, Fei-Fei, Andrej Karpathy, and Justin Johnson. CS231n: Convolutional
Neural Networks for Visual Recognition. Stanford. 2016.
[6]. Lin, Hsuan-Tien. Machine Learning Foundations. National Taiwan University.
[7]. Lin, Hsuan-Tien. Machine Learning Techniques. National Taiwan University.
[8]. Murphy, Kevin P. Machine learning: a probabilistic perspective. MIT press,
2012.
[9]. Ng, Andrew. Machine learning yearning. Draft, 2016.
[10]. Ng, Andrew. CS229: Machine Learning. Stanford.
[11]. Platt, John. "Sequential minimal optimization: A fast algorithm for training
support vector machines." (1998).
[12]. Tieleman, Tijmen, and Geoffrey Hinton. "Lecture 6.5-rmsprop: Divide the
gradient by a running average of its recent magnitude." COURSERA: Neural
networks for machine learning 4.2 (2012).
[13]. Wei, Xiu-Shen. Must Know Tips/Tricks in Deep Neural Networks.
http://lamda.nju.edu.cn/weixs/project/CNNTricks/CNNTricks.html.
[14]. Wolpert, David H. "The lack of a priori distinctions between learning
algorithms." Neural computation 8.7 (1996): 1341-1390.
[15]. Wolpert, David H., and William G. Macready. No free lunch theorems for
search. Vol. 10. Technical Report SFI-TR-95-02-010, Santa Fe Institute, 1995.
[16]. Zhou, Zhi-Hua. Ensemble methods: foundations and algorithms. CRC
press, 2012.
[17]. Zhou, Zhi-Hua. "Learnware: on the future of machine learning." Frontiers
of Computer Science 10.4 (2016): 589-590.
[18]. 周志華著. 機器學習, 北京: 清華大學出版社, 2016 年1 月.
作者github地址
https://github.com/HaoMood/