1. 程式人生 > >深度譯文:機器學習那些事 關於自己的理解

深度譯文:機器學習那些事 關於自己的理解

【譯題】機器學習的那些事

【譯者】劉知遠

【說明】譯文載於《中國計算機學會通訊》 第 8 卷 第 11 期 2012 年 11 月 ,本文譯自Communications of the ACM 2012年第10期的“A Few Useful Things to Know About Machine Learning”一文。

    機器學習系統自動地從資料中學習程式。與手工程式設計相比,這非常吸引人。在過去的20年中,機器學習已經迅速地在電腦科學等領域普及。機器學習被用於網路搜尋、垃圾郵件過濾、推薦系統、廣告投放、信用評價、欺詐檢測、股票交易和藥物設計等應用。

    麥肯錫全球研究院(the McKinsey Global Institute)最近一份報告指出,機器學習(又稱資料探勘或者預測分析)將驅動下一輪創新【15】。現在已經有幾本優秀的機器學習教材書可以供感興趣的研究者和實踐者使用(例如米切爾(Mitchell)和維滕(Witten)等人的教材【16,24】)。但是,成功使用機器學習所應掌握的大量“民間知識”並沒有出現在這些教材中。因此,很多機器學習專案浪費了大量時間,甚深入瞭解所需的“民間知識”可推進機器學習的應用。至最終也沒有得到理想的結果。其實這些“民間知識”非常容易理解。本文的目的就是介紹這些知識。

    機器學習有許多不同的型別,但為了展示方便,本文將主要介紹其中最常用的型別:分類。但是,本文所探討的問題適用於所有的機器學習型別。一個分類器(classifier)是一個系統,系統輸入是一個包括若干離散或連續的特徵值(feature values)的向量,系統輸出是一個離散值,代表分類的類別(class)。例如,一個垃圾郵件過濾器會將郵件資訊分類到“是垃圾郵件”和“不是垃圾郵件”兩個類別中。它的輸入可以是一個布林向量 x=(x1,…,xj,…,xd) ,其中如果詞典中的第 j 個詞出現在該郵件中,則 xj=1,否則 xj=0 。一個學習器將一個訓練集(trainingset)樣例 (xi,yi) 作為輸入,其中xi=(xi,1,…,xi,d) 是觀察到的輸入,yi 是相應的輸出,學習器的輸出是一個分類器。對學習器的檢驗就是判斷它輸出的分類器是否能夠對將來的輸入樣例 xt 輸出正確的 yt(例如,垃圾郵件過濾器是否能夠將訓練時沒有見過的郵件資訊正確分類)。

學習=表示 + 評價+ 優化

    假設有一個應用,你認為機器學習有可能在其中發揮作用。那麼,你面臨的第一個問題是各種機器學習演算法令人眼花繚亂。應挑選使用哪一個?現在有成千上萬的機器學習演算法,每年還有成百上千的新演算法發表出來。免迷失在這麼多演算法中的關鍵是,要認識到這些演算法都是由三個部分組成的,分別是:

表示(Representation) 

    一個分類器必須用計算機可以處理的某種形式語言來表示。反過來講,為學習器選擇一種表示,就意味選擇一個特定的分類器集合。學習器可能學出的分類器只能在這個集合中。這個集合被稱為學習器的假設空間(hypothesis space)。如果某個分類器不在該空間中,它就不可能被該學習器學到。與此相關的一個問題是如何表示輸入,即使用哪些特徵,本文稍後介紹。

評價(Evaluation)

    我們需要一個評價函式(亦稱為目標函式或打分函式)來判斷分類器的優劣。機器學習演算法內部使用的評價函式和我們希望分類器進行優化的外部評價函式有所不同。這是為了便於優化,接下來會討論。

優化(Optimization)

    最後,我們需要一個搜尋方法,能夠在假設空間中找到評價函式得分最高的那個分類器。優化技術的選擇對學習器效率至關重要;而當評價函式有多個最優結果時,優化技術也有助於從中選擇。初學者通常會採用現成的優化方法,之後再用定製專門的優化方法來替代。表 1 展示了三個組成部分常見的例子。例如,對一個測試樣例, k-近鄰方法會尋找它的 k 個最相似的訓練樣例,並將這些樣例中出現最多的類別作為該測試樣例的類別。超平面方法會為每一個類別構造一個特徵的線性組合,並將得分最高的組合所對應的類別作為預測結果。決策樹方法會在樹上的每個內部節點測試一個特徵,每個特徵值會對應一個分支,而不同的葉子節點會對應不同的類別。演算法 1 展示了一個極簡單的二分類決策樹學習器,其中使用了資訊增益(informationgain)和貪心搜尋(greedysearch)【20】。InfoGain(xj,y ) 表示特徵 xj 與類別 y 之間的互資訊(mutualinformation)。 MakeNode(x,c0,c1 ) 會返回一個測試特徵 x 的節點,該節點以 c0 作為 x= 0 時的孩子節點,以 c1 作為 x= 1 時的孩子節點。



    當然,並不是表 1 中從各列選出元素的相互組合都同樣有意義。例如,離散表示很自然地與組合優化相結合;而連續表示則與連續優化相結合。然而,很多學習器同時包含離散和連續的部分。實際上,所有可能的組合也都快被實現過了。

    大部分教科書是以表示為視角組織內容的。這通常會讓人忽略掉一個事實,即其他部分也同樣重要。雖然對如何在每個部分做出選擇並沒有簡單的祕訣,但本文將涉及其中幾個重要的問題。正如我們以後會看到的那樣,機器學習專案中的某些選擇甚至比學習器的選擇更加重要。

泛化(Generalization)很重要

    機器學習的基本目標是對訓練集合中樣例的泛化。這是因為,不管我們有多少訓練資料,在測試階段這些資料都不太可能會重複出現。(注意,如果在詞典中有 100000個詞,前述垃圾郵件過濾器將會有種 2100000 種可能的不同輸入)。

    在訓練集上表現出色其實很簡單(只要記住這些訓練樣例即可)。機器學習初學者最常犯的錯誤是在訓練資料上做測試,從而產生勝利的錯覺。如果這時將選中的分類器在新資料上測試,它往往還不如隨機猜測準確。因此,如果你僱人來訓練分類器,一定要自己儲存一些資料,來測試他們給你的分類器的效能。相反,如果你被人僱來訓練分類器,一開始就應該將一部分資料取出來,只用它們來測試你選擇的分類器效能,接下來再在整個資料上學習你最終的分類器。

    你的分類器可能會在不知不覺中受到測試資料的影響,例如你可能會使用測試資料來調節引數並做了很多調節(機器學習演算法有很多引數,演算法成功往往源自對這些引數的精細調節,因此這是非常值得關注的問題)。當然,保留一部分資料用於測試會減少訓練資料的數量。這個問題可以通過交叉驗證(cross – validation)來解決:將訓練資料隨機地等分為若干份(如 10份),其中的每一份均可用作測試,而剩下的資料用作訓練,然後將每個學習的分類器在它沒見過的樣例上進行測試,將測試結果取平均後,就可用來評價不同引數設定的效能。

僅有資料還不夠

    將泛化作為目標帶來的另外一個重要結果是,僅有資料還不夠,無論你有多少。考慮要從100萬樣例中學習一個包含 100個變數的布林函式。此時將有2100  – 10個樣例的類別是不知道的(注:這裡2100 表示 100個布林變數的所有可能情況的個數,而106表示已經看到的100萬樣例,因此有 2100 -106 個可能情況是沒有看到過的,因此也不知道它們的類別)。你如何確定那些樣例的類別呢?在沒有更進一步資訊的情況下,除了拋硬幣隨機猜之外將束手無策。哲學家大衛 ·休謨(David Hume)在 200多年前首次指出這一問題(以某種不同的形式),但直到今天機器學習中的很多錯誤仍是由於沒有意識到這一問題造成的。每個學習器都必須包含一些資料之外的知識或假設(assumption),才能夠將資料泛化。這一概念被沃爾伯特(Wolpert)形式化為“沒有免費的午餐”定理。根據該定理,沒有學習器能夠比在所有可能的布林函式中隨機猜測的結果更優【25】。

    這似乎是一個非常讓人失望的訊息。那我們還能指望能學到什麼東西嗎?幸運的是,在真實世界中,我們要學習的函式並非均勻地來自所有可能的函式!實際上,一些非常泛泛的假設——比如平滑(smoothness),相似的樣例有相似的類別,有限依賴,或者有限複雜度——通常足夠起很大作用,這也是機器學習能夠如此成功的重要原因。如同演繹(deduction)一樣,歸納(induction,正是學習器所做的) 起到知識槓桿的作用 —— 它將少量的輸入知識轉化成為大量的輸出知識。歸納是比演繹強大得多的槓桿,只要求很少的輸入知識就可以產生有用的結果,但是它終歸不能在沒有知識的情況下工作。而且就像任何槓桿一樣,輸入越多,我們得到的輸出就越多。

    從中可以得到的一個推論是,選擇表示的關鍵標準之一是,它比較易於表達什麼型別的知識。例如,如果我們擁有大量關於在我們的領域是什麼造成樣例相似的知識,基於例項的方法也許就是合適的選擇。如果我們擁有概率依賴的知識,圖模型則比較適合。如果我們擁有每個類別要求的先決條件的知識,“ If…Then…(如果…那麼…)”規則的表示也許是最好的選擇。在這一點上,最有用的學習器是那些並非將假設固化在其中,而是允許我們用顯式規定假設,在大範圍改變假設,並自動將其體現在學習中(例如採用一階邏輯 【21】或者語法 【6】)的學習器。

    說到這裡,學習需要知識,這並不讓人驚訝。機器學習不是魔術,它無法憑空變出東西。它所做的是由少變多。程式設計就像所有的工程技術那樣,意味著大量的工作,必須從頭開始建造一切。而機器學習更像是種田,它讓大自然做大部分工作。農夫將種子與肥料混合種出莊稼。學習器將知識和資料結合“種出”程式。

過擬合(Overfitting)有多張面孔

    如果我們擁有的知識和資料並不足以學習出正確的分類器,將會怎樣呢?我們就得冒風險構建一個分類器(或者其中一部分),這個分類器並非建立在現實基礎上,而是將資料隨機表現加以解讀。這個問題稱為過擬合,它是機器學習中的棘手問題。當你的學習器輸出的分類器在訓練資料上準確率為 100%,而在測試資料上僅有 50% 的時候(而本來可以學到一個分類器能夠在兩個資料上均達到 75% 的準確率),說明這個分類器發生過擬合了。

    機器學習領域的每個人都瞭解過擬合,但過擬合會以多種並不明顯的形式出現。一種理解過擬合的方式是將泛化誤差(generalization error)分解為偏置(bias)和方差( variance)【9】。偏置度量了學習器傾向於一直學習相同錯誤的程度。方差則度量了學習器傾向於忽略真實訊號、學習隨機事物的程度。圖 1用朝板子扔飛鏢作為類比進行了直觀說明。

    一個線性學習器有較高的偏置,因為當兩個類別的交界不是超平面的時候,這個學習器就無法進行歸納(摘注:原文 A linear learner has high bias, because when the frontier between two classes is not a hyper-plane the learner is unable
to induce it)。決策樹就不會有這個問題,因為它可以表示任意的布林函式,但在另一方面,決策樹會面臨高方差的問題:在同一現象所產生的不同訓練資料上學習的決策樹往往差異巨大,而實際上它們應當是相同的。類似道理也適用於優化方法的選擇上:與貪心搜尋相比,柱搜尋的偏置較低,但方差較高,原因是柱搜尋會嘗試搜尋更多的假設。因此,與直覺相反,一個學習能力更強的學習器並不見得比學習能力弱的效果更好。

    圖 2 示例說明了這一點(注:訓練樣例含有 64 個布林型別特徵和 1 個根據一個集合的“如果…那麼…”的規則集合計算得到的布林型別的類別。圖中的曲線是對 100 次執行結果的平均,每次對應不同的隨機產生的規則集合。誤差條(error bar)代表兩個標準方差。具體細節請參考論文【10】)。即使真正的分類器是一個規則集合,但根據 1000個樣例學習的樸素貝葉斯學習器(摘注:原文 Naive Bayes)仍比一個規則學習器的準確率更高。甚至當樸素貝葉斯錯誤地假設分類面是線性的,也依然如此。這種情形在機器學習領域很常見:一個強錯誤假設比那些弱正確假設更好,這是因為後者需要更多的資料才能避免過擬合。

    交叉驗證可以幫助避免過擬合,例如通過交叉驗證來選擇決策樹的最佳大小。但這不能徹底解決問題,因為假如我們利用交叉驗證做太多的引數選擇,它本身就會開始過擬合【17】。

    除了交叉驗證以外,還有很多方法可以避免過擬合。最常用的方法是對評價函式增加一個正則項(regularization term)。這樣做可以懲罰那些包含更多結構的分類器,偏好更小的分類器,從而降低過擬合的可能性。另一個方案是在決定是否增加新的結構時進行諸如卡方測試(chi-squre)等統計顯著性檢驗(statistical significance test),用來決定類別分佈是否會因為增加這個結構而不同。當資料非常缺乏時,這些技術非常有用。然而,你應該對那些宣稱某項技術“解決”了過擬合問題的說法持懷疑態度。我們會很容易在避免過擬合(或者說“方差”)時,造成另外一個相反的錯誤—— 欠擬合( underfitting,或者說“偏置”)。要學習一個完美的分類器來同時避免過擬合和欠擬合,事先又沒有足夠知識,這種情形下沒有任何單一技術能夠總是表現最好(沒有免費的午餐)。

    對過擬合的一個常見誤解是認為它是由噪音造成的,例如有些訓練樣例的標註類別是錯誤的。這的確會加劇過擬合,因為分類器會調整分類面讓那些樣例保持在分類器認為正確的一側。但是即使沒有噪音依然會發生嚴重的過擬合。例如,假如我們學習一個布林型別分類器,它是訓練資料中所有標為“true”的樣例的析取(disjunction)。(換句話說,這個分類器是一個析取正規化(disjunctive normal form)的布林型別公式,其中每一項是某個特定訓練樣例的所有特徵值的合取(conjunction)。)這個分類器對所有的訓練樣例都分類正確,但對測試樣例中的每個正例都分類錯誤,不管訓練資料是否有噪音。

    多重檢驗(multiple testing)【13】問題與過擬合密切相關。標準的統計檢驗中只有一個假設被檢驗,而現代學習器在結束學習前會輕易地檢驗上百萬個假設。因此,那些看上去很顯著的結論實際並不如此。例如,一個連續十年跑贏市場的共同基金(mutual fund)看上去很引人注目。但當你發現,如果有1000家基金,每家都有50%的概率在某年跑贏市場,在這種情況下,極有可能會有一家基金能夠憑僥倖而連續10次都跑贏市場。這個問題可以通過在顯著性檢驗中將假設的個數考慮進去來解決,但這樣也會導致欠擬合。更好的途徑是控制錯誤接受的非零假設(non-null hypotheses)的比率,該方法通常被稱為錯誤發現率(false dis-covery rate)方法【3】。

直覺不適用於高維空間

    機器學習中緊接過擬合之後的最大問題就是維度災難(curse of dimensionality)。這一概念是由貝爾曼(Bellman)在1961年首先提出的,用來描述以下事實:許多在低維空間表現很好的演算法,當輸入是高維度的時候,就變得計算不可行(intractable)了。但在機器學習領域,這有更多的意義。隨著樣例維度(即特徵數目)的增長,正確泛化的難度會以指數級增加,原因是同等規模的訓練集只能覆蓋越來越少的輸入空間比例。即使對於中等大小的 100維布林空間,一個包含 1 萬億樣例的大型資料集合也只能覆蓋輸入空間的 10-18 左右(譯註:這裡作者指的是輸入為布林量時的情形)。這體現了機器學習存在的必要性,也是它的難點所在。

    更嚴格地講,機器學習演算法所(顯式或隱式)依賴的基於相似度的推理在高維空間不再有效。現在考慮一個採用漢明距離(hamming distance)作為相似度度量的最近鄰分類器,並設定樣例的分類類別是 x1∧x2 。如果沒有其他特徵,這是一個很容易的問題。但是當增加 98 個不相關的特徵 x3,…,x100 的時候,來自這些特徵的噪音會淹沒來自 x1 和 x2 的訊號,導致所找到的最近鄰相當於做出隨機預測。

    更多的困擾是,即使所有的100個特徵都是相關的,最近鄰方法依然會有問題。這是因為在高維空間所有的樣例都變得很相似。例如,假設所有樣例分佈在規則的網格上,現在考慮一個測試樣例 xt。如果網格是 d-維的,會有個 2d 個 xt 最近鄰樣例與 xt 的距離相等。因此,隨著維數的增加,越來越多的樣例會變成 xt 的最近鄰,以致最後最近鄰的選擇實際上變成隨機的(類別選擇也因此變成隨機的)。

    這只是高維空間上更廣泛問題的一個例項。我們的來自三維世界的直覺在高維空間通常並不奏效(摘注:原文our intuitions, which come from a three dimensional world, often do not apply in high-dimensional ones.)。在高維空間,多元高斯分佈(multivariate Gaussian distribution)的大部分質量(mass)並不分佈在均值附近,而是在逐漸遠離均值的一層“殼”上;打個比方,一個高維的橘子的大部分質量不在瓤上,而是在皮上。如果數量一定的樣例均勻分佈在一個(維數不斷增加的)高維的超立方體中,那麼超出某個維數後,大部分樣例與超立方體的某一面的距離要小於與它們最近鄰的距離。如果我們在超立方體中內接一個超球面,那麼超立方體的幾乎所有質量都會分佈在超球面之外。這對機器學習是一個壞訊息,因為機器學習常常用一種型別的形狀來近似另一種型別的形狀。

    在二維或三維空間構建分類器很簡單,我們可以僅通過肉眼觀察發現不同類別樣例的分界線(甚至可以說,假如人們有在高維空間中觀察的能力,機器學習就沒有存在的必要了)。但是在高維空間中很難理解正在發生什麼。因此也就很難設計一個好的分類器。人們也許會天真地認為收集更多的特徵永遠不會有什麼壞處,因為最壞的情況也不過是沒有提供關於類別的新資訊而已。但實際上這樣做的好處可能要遠小於維度災難帶來的問題。

    幸運的是,有一個效應可以在一定程度上抵消維度災難,那就是所謂的“非均勻性的祝福”(blessing of nonuniformity)。在大多數應用中,樣例在空間中並非均勻分佈,而是集中在一個低維流形(manifold)上面或附近。例如在手寫體數字識別任務中,即使數字圖片的每個畫素都單獨作為一個特徵,近鄰方法在該任務上表現依然良好,這是因為數字圖片的空間要遠小於整個可能的空間。學習器可以隱式地充分利用這個有效的更低維空間,也可以顯式地進行降維(例如特南鮑姆(Tenenbaum)的工作【22】)。

理論保證(Theoretical Guarantees)與看上去的不一樣

    機器學習論文充滿了理論保證。最常見的型別是能保證泛化所需樣例數目的邊界(bound)。你應當如何理解這些保證呢?首先,需要注意的是它們是否可行。歸納與演繹相反:在演繹中你可以保證結論是對的;在歸納中就難說了。這是很多世紀以來的普遍共識。最近幾十年的一個重要進展是我們認識到可以有歸納結果正確性的保證,特別是如果我們願意接受概率保證(摘注:原文One
of the major developments of recent decades has been the realization that in fact we can have guarantees on the results of induction, particularly if we’re willing to settle for probabilistic guarantees.)。

    基本論證非常簡單【5】。如果一個分類器的真實錯誤率(true error rate)大於 ϵ ,我們稱該分類器是壞的。那麼一個壞分類器在 n 個隨機獨立訓練樣例上都保持正確的概率小於(1−ϵ)n 。設 b 是學習器的假設空間 H 中壞分類器的個數,其中至少有一個分類器能保持正確的概率小於 b(1−ϵ)n ,即所謂“一致限(union bound)”。假設學習器返回的都是保持正確的分類器,那麼這個分類器是壞的概率小於 |H|(1−ϵ)n ,這裡我們利用了 b≤|H| 這個事實。所以,如果我們希望這個概率小於 δ的充分條件是使 n>1/ϵ(ln|H|+ln1/δ)≥ln(δ/|H|)/ln(1−ϵ) (摘注:原文該公式為 n>ln(δ/|H|)/ln(1−ϵ)≥1ϵ(ln|H|+ln1δ) ,修改原文公式的譯註為—— 原文公式有誤,根據參考文獻【5】應為該公式 )。

    不幸的是,對這類保證得十分小心。這是因為通過這種方式獲得的邊界往往非常鬆散(loose)。這種邊界的突出優點是所要求的樣例數目只隨 |H| 和 1/delta呈對數增長。但遺憾的是,大多數假設空間是隨著特徵數目呈雙指數級增長的,這就要求我們提供的樣例數目 d 也隨著呈指數增長。例如,考慮包含 d 個布林變數的布林型別函式空間。如果有 e 個可能不同的樣例,就會有 2e 個可能不同的函式。因此,由於有 2d 個可能的樣例,函式總數達到個 22d 。即使對“僅僅”為指數級的假設空間,這個邊界仍然很鬆,因為一致限非常保守。例如,如果有 100 個布林特徵,假設空間是層數最多為 10 的決策樹,為了保證 δ=ϵ=1 ,我們需要 50 萬個樣例。但實際上,只需要其中的一小部分資料就足以精確學習了。

    而且,我們必須留意邊界所包含的意義。例如,邊界並不意味著,假如你的學習器返回了一個在某個特定訓練集上保持正確的假設,這個假設就可能實現了泛化。邊界的意思是,給定一個足夠大的訓練集,告訴你在很大的概率上你的學習器會返回一個成功泛化的假設,還是無法找到一個保持正確的假設。這個邊界也無法告訴我們如何選擇好的假設空間。它只能告訴我們,如果這個假設空間包含真實分類器,那麼學習器輸出一個壞分類器的概率隨著訓練資料規模的增長而降低(摘注:原文 It only tells us that, if the hypothesis space contains the true classifier, then the probability that the learner outputs a bad classifier decreases with training set size.)。如果我們縮小假設空間,邊界就會得到改善,但是空間包含真實分類器的機率也降低了(在真實分類器不在假設空間中的情況下也會有邊界,以上討論同樣適用)。

    另一類常用理論保證是漸進(asymptotic):給定無窮資料,學習器將保證輸出正確的分類器。這個保證讓人欣慰,但如果只是因為有漸進保證而選擇一個分類器則是非常草率的。在實踐中,我們很少處於漸進狀態(或稱為漸進態(asymptopia))。而且,由於我們前面探討過的偏置-方差的權衡(trade-off),如果對無窮資料,學習器 A 比學習器B好,那麼在有限資料的情況下 B 通常比 A 好。

    機器學習中理論保證的主要作用並不是在實踐中作為決策的標準,而是在演算法設計中作為理解和驅動的來源。在這方面,它們作用巨大;實際上,理論與實踐的緊密結合是機器學習在過去幾年中取得重大進展的重要原因。但是使用者需要謹慎:學習是一個複雜現象,因為一個學習器既有理論證明又有實際應用,而前者並未成為後者的依據(摘注:本段原文 The main role of theoretical guarantees in machine learning is not as a criterion for practical decisions,but as a source of understanding and driving force for algorithm design. In this capacity, they are quite useful; indeed, the close interplay of theory and practice is one of the main reasons machine learning has made so much progress over the years. But caveatemptor: learning is a complex phenomenon, and just because a learner has a theoretical justification and works in practice doesn’t mean the former is the reason for the latter. )。

特徵工程(Feature Engineering)是關鍵

    在考慮所有情況之後,有的機器學習專案成功了而有的則失敗了。這是什麼原因造成的呢?無疑最重要的因素是所利用的特徵。如果你有很多與類別非常相關的獨立特徵,學習起來很容易。但另一方面,如果特徵與類別的關係非常複雜,你就不一定能夠學到它了。通常原始資料不能直接拿來學習,你需要從中構建特徵。這是機器學習專案的主要工作。這通常也是最有趣的部分,在這裡直覺、創造性和魔法與技術一樣都很重要。

    初學者往往驚訝於機器學習專案中真正用於機器學習的時間是如此之少。但假如你考慮到對資料的收集、整合、清理和預處理是多麼費時,以及特徵設計需要經歷多少試驗和錯誤,就會理解這個過程了。還有,機器學習無法做到一次性就能完成構建資料集合和執行學習器,它是一個反覆迭代的過程,包括執行學習器,分析結果,修改資料和/或學習器等,不斷重複。學習往往是這其中最快完成的部分,原因在於我們已經非常精通它了!特徵工程更加困難,原因是它是領域相關(domain-specific)的,而學習器則很大程度是通用的。不過,兩者並沒有明確界限,這也是最有用的學習器往往是那些有助於融入領域知識的學習器的原因之一。

    當然,機器學習的一個終極目標就是將特徵工程過程越來越多地自動化(摘注:原文one of the holy grails of machine learning is to automate more and more of the feature engineering process )。現在經常採用的一種方式是先自動產生大量的候選特徵,然後根據它們與分類類別的資訊增益等方法來選取最好的特徵。但需要牢記在心的是,特徵獨立地看也許與分類無關,但組合起來也許就相關了。例如,如果分類類別是取 k 個輸入特徵的“XOR(異或)”,那麼每個特徵單獨看都與分類沒有關係(如果你想給機器學習找點亂子,就祭出 XOR 來吧)。但是,執行包含大量特徵的學習器來尋找有用的特徵組合太耗時,也容易導致過擬合。因此,歸根到底你仍需責無旁貸地介入特徵工程的工作。

更多的資料勝過更聰明的演算法

    假設你已經盡你所能構建了最好的特徵集合,但分類器的效果仍不夠好,這時候應該怎麼辦呢?有兩個主要選擇:設計更好的學習演算法,或者收集更多資料(包括更多的樣例和不致造成維度災難的更多可能的原始特徵)。機器學習研究者更關注前者,但從實用角度來看,最快捷的方法是收集更多資料。作為一條經驗,有大量資料的笨演算法要勝過資料量較少的聰明演算法。(畢竟,機器學習就是研究如何讓資料發揮作用的。)

    然而這帶來了另外一個問題:可擴充套件性(scalability)。在絕大多數電腦科學問題中,兩個主要資源是有限的——時間和記憶體。而在機器學習中,還有第三個:訓練資料(摘注:原文training data )。其中哪一個資源會成為瓶頸是隨著時間變化而不斷變化的。在20世紀80年代,瓶頸是資料。現在的瓶頸則是時間。我們有海量資料,但沒有足夠的時間處理它們,只能棄之不用。這就造成一個悖論:即使理論上說,更多資料意味著我們可以學習更復雜的分類器,但在實踐中由於複雜分類器需要更多的學習時間,我們只能選用更簡單的分類器。一個解決方案是對複雜分類器提出快速學習演算法,在這個方向上已經有了一些引人注目的進展(例如赫爾滕(Hulten)和多明戈斯(Domingos)的工作【11】)。

    採用更聰明的演算法得到的回報比預期要少,一部分原因是,機器學習的工作機制基本上是相同的。這個論斷也許讓你吃驚,特別是當你想到諸如規則集與神經網路之間差異巨大的表示方法的時候。但實際上,命題規則的確可以輕易地表示成神經網路,其他表示之間也有類似的關係。本質上所有的學習器都是將臨近的樣例歸類到同一個類別中;關鍵的不同之處在於“臨近”的意義。對於非均勻分佈的資料,不同的學習器可以產生迥乎不同的分類邊界,同時仍能在關心的領域(即那些有大量訓練樣例、測試樣例也會有很大概率出現的領域)保證得到相的預測結果。這也有助於解釋為什麼能力強的學習器雖然不穩定卻仍然很精確。圖 3在二維空間展示了這一點,在高維空間這個效應會更強。

    作為一條規則,首先嚐試最簡單的學習器總是有好處的(例如應該在邏輯斯蒂迴歸之前先嚐試樸素貝葉斯,在支援向量機之前先嚐試近鄰 [ 摘注:原文, naïve Bayes before logistic regression, k-nearest neighbor before support vector machines)])。更復雜的分類器固然誘人,但它們通常比較難駕馭,原因包括我們需要調節更多的引數才能得到好的結果,以及它們的內部機制更不透明。

    學習器可以分為兩大類:一類的表示是大小不變的,比如線性分類器(摘注:原文 linear classifiers);另一類的表示會隨著資料而增長,比如決策樹(摘注:原文 decisiontrees)。(後者有時候會被稱為非引數化學習器(nonparametric learners),但不幸的是,它們通常需要比引數化學習器學習更多的引數。)資料超過一定數量後,大小不變的學習器就不能再從中獲益。(注意圖 2 中樸素貝葉斯的準確率是如何逼近大約 70%的。)而如果有足夠的資料,大小可變的學習器理論上可以學習任何函式,但實際上卻無法做到。這主要是受到演算法(例如貪心搜尋會陷入區域性最優)和計算複雜度的限制。而且,由於維度災難,再多的資料也不會夠。正是由於這些原因,只要你努力,聰明的演算法——那些充分利用已有資料和計算資源的演算法——最後總能取得成功。在設計學習器和學習分類器之間並沒有明顯的界限;因為任何知識要麼可以被編碼進學習器,要麼可以從資料中學到。所以,機器學習專案通常會有學習器設計這一重要部分,機器學習實踐者應當在這方面積累一些專門知識【12】。

    終極而言,最大的瓶頸既不是資料,也不是 CPU速度,而是人力。在研究論文中,學習器一般都在準確率和計算複雜度方面進行比較。但更重要的是節省的人力和得到的知識,雖然這些更難度量。這使那些產生人類可理解的輸出的學習器(比如規則集合)更為受到青睞。機器學習成果最豐碩的,是那些建立了機器學習的基本條件,能夠便捷地在多個學習器、資料來源和學習問題上方便有效地開展實驗,並實現機器學習專家與領域專家的密切合作的組織。

要學習很多模型,而不僅僅是一個

    在機器學習早期,每個人都有一個最喜歡的學習器,並由於一些先入為主的原因堅信它的優越性。人們花費大部分精力來嘗試它的各種變種,從中選擇最好的那個。後來,系統的實驗比較表明在不同應用上的最佳學習器並不相同,因此開始出現包含多種學習器的系統。這時,人們嘗試不同學習器的各種變種,仍然只是找出其中表現最好的那個。後來研究者注意到,如果不是隻選最好的那個,而是將多個學習器結合,結果會更好——通常是好得多——而這隻需要花費人們很少的精力。

    現在建立模型整合(model ensembles)已經實現標準化【1】。最簡單的整合技術是 bagging(裝袋)方法,該方法通過重取樣(resampling)隨機產生若干個不同的訓練集,在每個集合上訓練一個分類器,然後用投票(voting)的方式將結果合併。該方法比較有效,原因是它在輕度增加偏置的同時,極大地降低了方差。在boosting(強化提升)方法中,每個訓練樣例都有權重,權重會不斷變化,每次訓練新分類器的時候都集中在那些分類器之前傾向於分錯的樣例上。在stacking(堆疊)方法中,每個單獨分類器的輸出會作為更高層分類器的輸入,更高層分類器可以判斷如何更好地合併這些來自低層的輸出。

    此外,還有很多其他技術,現在的趨勢是越來越大型的整合。在Netflix大獎賽中,來自世界各地的團隊競爭建立最好的視訊推薦系統( http://netflixprize.com)。隨著競賽的開展,團隊們開始發現與其他團隊合併學習器會取得最好的結果,因此團隊開始合併,越來越大。競賽的第一名和第二名團隊都合併了超過100個學習器,將這兩者整合後又進一步提升了效果。毫無疑問,未來我們會看到更大的整合學習器。

    模型整合不應與貝葉斯模型平均(bayesian model averaging,BMA)混淆,後者是學習的一種理論最優化方法【4】。在貝葉斯模型平均方法中,對新樣例的預測是對假設空間中的所有分類器的預測取平均得到的,每個分類器會根據它解釋訓練資料的能力和我們對它的先驗信任度而有不同的權重。雖然模型整合與貝葉斯模型平均方法表面上很相似,它們其實非常不同。整合方法改變了假設空間(例如從單獨的決策樹變成了決策樹的線性組合),而且可以採用多種多樣的形式。貝葉斯模型平均方法只是根據某個準則對原始空間的假設賦予不同的權重。貝葉斯模型平均方法的權重與bagging或者boosting等整合方法產生的權重非常不同。後者很平均,而前者波動很大,甚至出現某個權重最大的分類器佔據統治地位的情況,導致貝葉斯模型平均方法實際上等同於直接選擇這個權重最大的分類器【8】。一個實際的後果是,模型整合已經成為機器學習工具的重要組成部分,而貝葉斯模型平均方法則少有人問津。

簡單並不意味著準確

    著名的奧坎姆剃刀(occam’s razor)原理稱:若無必要,勿增實體(entities should not be multi-plied beyond necessity)。在機器學習中,這經常被用來表示成:對於有相同訓練誤差的兩個分類器,比較簡單的那個更可能有較低的測試誤差。關於這個斷言的證明經常出現在文獻中,但實際上對此有很多反例,而且“沒有免費的午餐”定理也暗示了這個斷言並不正確。

    我們前面已經看到了一個反例:模型整合。整合模型的泛化誤差會一直隨著增加新的分類器而改進,甚至可以優於訓練誤差。另一個反例是支援向量機,它實際上可以有無限個引數而不至於過擬合。而與之相反,函式可以將軸上任意數量、任意分類的資料點劃分開,即使它只有1個引數【23】。因此,與直覺相反,在模型引數的數量和過擬合之間並無直接聯絡。

    一個更成熟的認識是將複雜度等同於假設空間的大小。這是基於以下事實:更小的假設空間允許用更短的程式碼表示假設。那麼“理論保證”一節中的邊界就暗示了,更短的假設可以泛化得更好。這還可以進一步改善為,為有先驗偏好的空間中的假設分配更短的程式碼。但如果將此看作是準確(accuracy)和簡單(simplicity)之間權衡的“證明”,那就變成迴圈論證了—— 我們將所偏好的假設設計得更加簡單,而如果結果是準確的是因為我們的偏好是準確的,而不是因為這些假設在我們選擇的表示方法中是“簡單的”(摘注:該段原文 A more sophisticated view instead equates complexity with the size of the hypothesis space, on the basis that smaller spaces allow hypotheses to be represented by shorter codes. Bounds like the one in the section on theoretical guarantees above might then be viewed as implying that shorter hypotheses generalize better. This can be further refined by assigning shorter codes to the hypothesis in the space that we have some a priori preference for. But viewing this as “proof” of a tradeoff between accuracy and simplicity is circularreasoning: we made the hypotheses we prefer simpler by design, and if they are accurate it’s because our preferences are accurate, not because the hypotheses are “simple” in the representation we chose.)。

    問題的複雜性還來自這樣一個因素:幾乎沒有學習器能窮盡搜尋整個假設空間。一個在較大的假設空間搜尋較少假設的學習器,比一個在較小空間中搜索較多假設的學習器更不容易過擬合(摘注:原文 A learner with a larger hypothesis space that tries fewer hypotheses from it is less likely to over fit than one that tries more hypotheses from a smaller space.)。正如珀爾(Pearl)【18】指出的,假設空間的大小隻是對對確定影響訓練誤差和測試誤差的關鍵因素有初步的指導意義。

    多明戈斯 【7】調研了機器學習中奧坎姆剃刀原理問題的主要論證和論據。結論是,應當先選擇簡單假設,這是因為簡單本身就是一個優點,而不是因為所假設的與準確率有什麼聯絡。這也許正是奧坎姆最初想表達的意思。

可表示並不意味著可學習

    從本質上講,用於大小可變的學習器的所有表示都有其形式為“每個函式都可以表達為或以無限接近的方式近似表達為××表示”的定理與之伴隨。正因為如此,某種表示方法的擁躉往往會忽略其他方法。但是,僅僅因為一個函式可以被表示,並不意味著它是可被學習的。例如,標準的決策樹學習器無法學習出比訓練樣例更多的葉子節點。在連續空間中,用一個固定的基元(primitives)族來表示哪怕很簡單的函式,也常常要由無限多項組成。更進一步,如果假設空間有許多評價函式的區域性最優點,正如經常發生的那樣,學習器可能根本無法找到這個真正的函式,即使它是可表示的。給定有限資料、時間和記憶體,標準學習器只能學到所有可能函式中很有限的子集。這個子集會隨著表示方法的不同而不同。因此,關鍵問題不是“它是否可表示?”(這個問題的答案通常無關緊要),而是“它是否可以被學習?”這值得我們嘗試不同的學習器(或者它們的組合)來尋找答案。

    對某些函式來講,一些表示方法會比其他方法更加精簡,從而只需要更少的資料來學習那些函式。很多學習器的工作機制是將簡單的基函式(basis function)進行線性組合。例如,支援向量機就形成了集中在某些訓練樣例(也就是那些支援向量)上的核(kernels)的組合。如果用這種組合方法來表示 n 個位元的奇偶性(parity),將需要 2n 個基函式。但如果採用多層表示(也就是說在輸入和輸出之間存在多步),奇偶性就可以用一個線性規模的分類器表示。探索這種深層表示的學習方法是機器學習的主要研究前沿之一 【2】。

相關並不意味著因果

    相關不意味著因果,這一點經常被提起,好像在這兒已經不值得再加贅述了。但是,即使我們討論的這些學習器只能學習到相關性,它們的結果也經常被作為因果關係來對待。這樣做錯了麼?如果是錯的,為什麼人們還這樣做呢?

    更多時候,人們學習預測模型的目標是作為行動指南。如果我們發現超市裡的啤酒和尿布經常被一起購買,那將啤酒放在尿布旁邊將會提高銷售量。(這是資料探勘領域的著名例子。)但除非真的做實驗,不然很難發現這一點。機器學習通常應用於觀測(observational)資料,在觀測資料中預測變數並不在學習器的控制之下,這與實驗(experimental)資料相反,後者的預測變數在控制範圍內。一些學習演算法其實有潛力做到從觀測資料發現因果資訊,但它們的可用性比較差 【19】。而另一方面,相關性是因果關係的標誌,我們可以將其作為進一步考察的指南(例如試圖理解因果鏈可能是什麼樣)。

    很多研究者相信因果只是一種為了方便而杜撰的概念。例如,在物理定律中並沒有因果的概念。因果是否真的存在是一個深奧的哲學問題,現在並沒有一個確定的答案。但對於機器學習有兩個實用的要點。首先,無論我們是否稱它們為“因果關係”,我們都希望能預測我們行動的效果,而不僅僅是觀測變數之間的相關性;其次,如果你能夠獲取到實驗資料(例如能夠隨機分配訪問者到一個網站的不同版本),那麼務必儘量獲取 【14】。

結論

    就像其他任何一個學科那樣,機器學習擁有的很多“民間智慧”並不是那麼容易就能瞭解到,但這些知識對於成功運用機器學習至關重要。這篇文章總結了其中最主要的幾條知識。當然這只是對機器學習的傳統學習內容的補充。讀者可以參加一個有完整內容的機器學習線上課程,其中融合了正式和非正式的知識,網站是http://www.cs.washington.edu/homes/pedrod/。此外,在http://videolectures.net/上還有大量寶貴的與機器學習相關的學術報告。 Weka【24】是一款優秀的機器學習開源工具包。