近期在googlesearch blog上發(fā)布了一篇題為《Lessons learned developing a practical large scale machine learning system》的博客,作者應該是google機器學習團隊的成員,列舉了他們在開發(fā)一個可伸縮的大型機器學習系統(tǒng)Seti時所積累的一些經驗教訓。雖然所列出的三點教訓看起來都很簡單,似乎顯而易見,但在現實操作中我們往往會受到種種的“誘惑”而走向另一個極端。特別典型的情景是,這些道理對于工作在一線的有過一定的項目經驗積累的工程師來說,是有一定的直觀感受的,但由于沒有很好地概括描述或通過一個有權威性的嘴巴說出來,而可能被一些只存在于設計紙上的美妙構想而引向錯誤的方向,導致勞民傷財,積重難返。最簡單的道理,卻最容易被人們一遍又一遍地觸犯著,所以想把它們寫下來,一方面提醒自己以后少受這樣的誘惑而犯錯,另一方面也希望給類似應用場景與想法的朋友有一個權威性的歸納與佐證。
以下大都屬于充分尊重原博客基礎上的意譯,穿插部分自己的看法。
這里說的機器學習系統(tǒng)其實是指一個分類系統(tǒng)(或者說模式識別系統(tǒng)),大部分情況下,這兩者可以等同而視之,但在回復里也有人指出機器學習的范疇應該比較模式識別更大,這里不再執(zhí)著于誰大誰小的問題,只需要知道,下面提到的機器學習系統(tǒng)或Seti主要是一個分類器,它具有如下的一些特點:
對于一個預測或分類問題,如果你沒有足夠的數據量,你得關注于如何在少量的數據樣本下充分利用統(tǒng)計知識構建一個精巧的分類器,反之,如果你的數據量爆棚,你就得關注你的系統(tǒng)如何才能適應如此龐大的樣本量,并從中挖掘中有用的信息來。Seti所解決的問題規(guī)模大體上是像下表所描述的那樣的:
Training set size Unique features
Mean 100 Billion 1 Billion
Median 1 Billion 10 Million
通常來說,一個好的機器學習系統(tǒng)需要更多地強調精度,但面對一個大型的系統(tǒng)時作這樣的片面強調容易犯下很多錯誤,以下是我們在開發(fā)Seti過程中積累的幾個經驗教訓,當然有一些是事后我們才總結出來的,當時我們并沒有意識到。(注:作者應該是想說,有些因素跟精度一樣不能忽視,甚至更重要)
1、保持系統(tǒng)的簡單,即使這意味著會損失一定的精度。(Keep it simple, even at the expense of a little accuracy)
誘惑:讓你的分類器在不同領域的應用中都具有高精度是非常重要的,所以我們應該專注于算法的精度上。
但是,實際中的算法有其它幾個方面具有同等重要的地位:
容易使用:如果這個系統(tǒng)還有其它人或其它團隊在使用,他們必定希望這個系統(tǒng)在配置與使用上都是簡單的,他們可能不是機器學習的專家,所以他們也不希望把時間浪費在系統(tǒng)的啟動與運作上。
系統(tǒng)的可靠性:大家更注重在實際環(huán)境中部署一個可靠的機器學習系統(tǒng),它必需是穩(wěn)定的并且不需要總是去關注它是否崩潰的。早期的Seti雖然在精度上更好,但它的復雜性、對網絡與GFS文件系統(tǒng)的壓力、需要持續(xù)關注等缺點導致了很多人都不愿意去部署它。
(很多情況下,我們都可以認為以上兩點是等價的,即:系統(tǒng)的簡單易用約等于穩(wěn)定可靠)
Seti通常應用于對原有系統(tǒng)有極大提升效果的場景(參看教訓3),因此大家都不太會關注Seti所使用的不同算法所造成的在精度上的細微差別。另一方面,這些精度上的小差別經??梢酝ㄟ^其它的手段來抹平,比如更好的數據過濾、添加其它更合適的特征、調整參數等等,如果這個系統(tǒng)是穩(wěn)定的、可擴展的、簡單易用的,以上的這些額外的步驟也更容易實現,而這些系統(tǒng)特點往往決定了它會被團隊接受或拋棄。
對于學術界來說,設計一個精度稍差但更穩(wěn)定與簡單易用的算法并不是一個有吸引力的事情,但依據我們的經驗,這個在實際當中具有非凡的價值。
2、從當前的一些具體的應用開始。(Start with a few specific applications in mind)
誘惑:構建一個不限定于任何特定應用的系統(tǒng),不單能囊括當前的各類應用,還能適用于未來的各種分類任務。
但是,我們決定聚焦于一小撮的初始的應用上,這個決定基于如下幾個原因:
3、知道什么時候說“不”。(Know when to say “no”)
誘惑:我們有了錘子,所以我們眼中什么都是釘子,任何的問題都可以用機器學習系統(tǒng)來解決。
很早以前我們就發(fā)現,雖然機器學習系統(tǒng)帶來了明顯的收益,但它同時也給整個系統(tǒng)帶來了復雜性、不透明性與不可預測性。有些情況下,簡單的技術已經足以解決手頭的問題,從長遠來看,與其把努力花在整合、維護與診斷在線機器學習系統(tǒng)上,還不如花在其它的一些提升系統(tǒng)性能的方法上。
Seti適用的前提是對現在的系統(tǒng)上有明顯的預測效果上的提升,我們也常常建議大家避免把它應用于效果提升不明顯的場景。
補充1:看到Seti所應用的數據規(guī)模時,我的第一反應是怎么可能得到這么大量的標記數據,因為訓練分類器是需要標記好的數據集的,同樣文中屢次提到分類器的精度,而計算分類器的精度同樣不能缺少標記數據。我的理解是:一種情況下,這些標記數據是來自于google用戶無意識的點擊貢獻,另一種情況是,他們使用的是半監(jiān)督學習的方法,從一個小型的人工標記的數據集開始訓練,然后覆蓋到數據的全集。
補充2:文中的一個主要的觀點是:商用的系統(tǒng)與學術界追求的系統(tǒng)其目標是不一樣的。學術界會傾向于探尋即使是數據量不足的情況下,怎么得到有統(tǒng)計意義的結果,而精度永遠都是最重要的。商業(yè)界在不缺乏數據的情況下需要關注于如何從帶噪聲的數據中過濾出有價值的信息,同時系統(tǒng)必須具有可擴展性,此時,精度并不是一個唯一重要的因素。
評論