現在,機器學習變得十分誘人,它已在網頁搜索、商品推薦、垃圾郵件檢測、語音識別、圖像識別以及天然語言處理等諸多領域發揮重要做用。和以往咱們顯式地經過編程告訴計算機如何進行計算不一樣,機器學習是一種數據驅動方法(data-driven approach)。然而,有時候機器學習像是一種"魔術",即便是給定相同的數據,一位機器學習領域專家和一位新手訓練獲得的結果可能相去甚遠。html
本文簡要討論了實際應用機器學習時九個須要注意的重要方面。git
做者 | 張皓github
整理 | AI科技大本營(微信ID:rgznai100)算法
這多是你面對一個具體應用場景想到的第一個問題。編程
你可能會想"機器學習裏面這麼多算法,究竟哪一個算法最好"。很"不幸"的是,沒有免費午飯定理(No Free LunchTheorem)告訴咱們對於任意兩個學習算法,若是其中一個在某些問題上比另外一個好,那麼必定存在一些問題另外一個學習算法(表現會)更好。所以若是考慮全部可能問題,全部算法都同樣好。微信
"好吧",你可能會接着想, "沒有免費午飯定理假定全部問題都有相同機會發生,但我只關心對我如今面對的問題,哪一個算法更好"。又很"不幸"的是,有可能你把機器學習裏面所謂"十大算法"都試了一遍,而後感受機器學習"這東西根本沒用,這些算法我都試了,沒一個效果好的"。前一段時間"約戰比武"的話題很熱,其實機器學習和練武術有點像,把太極二十四式朝對方打一遍結果對方應聲倒下這是不可能的。網絡
機器學習算法是有限的,而現實應用問題是無限的,以有限的套路應對無限的變化,必定是會存在有的問題你沒法用現有的算法解決的,豈有不敗之理?app
所以,該選什麼學習算法要和你要解決的具體問題相結合。不一樣的學習算法有不一樣的概括偏好(inductive bias),你使用的算法的概括偏好是否適應要解決的具體問題直接決定了學得模型的性能,有時你可能須要改造現有算法以應對你要解決的現實問題。框架
目標函數用於刻畫什麼樣的模型是好的,和選擇學習算法同樣,選什麼目標函數也要和具體問題相結合。大部分的教材和文獻重點在呈現算法,對目標函數和優化方法的選擇一般使用缺省值。以分類問題爲例,咱們缺省地優化分類均等代價(cost)下的錯誤率。可是在你所要解決的問題中,問問本身這些問題:機器學習
除此以外還有其餘的一些問題。這些問題存不存在,要不要考慮,該怎麼考慮都是和你要處理的實際問題有關,最終體如今你的目標函數之中。
「我是誰?我從哪裏來?我往哪裏去?」是哲學裏避不開的三個問題,而「選什麼算法?選什麼目標函數? 選什麼優化方法?」是機器學習裏常常遇到的三個問題,這三者的組合就構成了一個機器學習解決方案基本框架。一般,咱們使用現有的數值優化方法對目標函數進行優化,好比梯度降低(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/