原文作者:Martin Zinkevich
整理:張相於
作者介紹
Martin Zinkevich現(xiàn)在是谷歌大腦的高級科學家,負責和參與了YouTube、Google Play 以及Google Plus等產品中的機器學習項目,本文也是基于作者在這三個產品上面做機器學習項目的各種經驗和教訓提煉而成。在加入谷歌之前是雅虎的高級科學家,曾在2010年和2011年兩度獲得雅虎的最高榮譽Yahoo Team Superstar Awards,對雅虎的廣告系統(tǒng)做出過很多杰出貢獻。
梗概介紹
本文把在產品中應用機器學習的過程從淺到深分成了三個大的階段,又在這三個大的階段中細分出了一些方面,以此對43條規(guī)則進行邏輯分類。簡單來說,如果你是從頭開始做機器學習系統(tǒng),那么就可以在不同階段參考這里面對應的條目,來保證自己走在正確的道路上。
正文開始
To make great products:do machine learning like the great engineer you are, not like the great machine learning expert you aren’t.
這句話一定程度上是對整篇文章(叫手冊可能更合適)的一個高度概括,ML在實際工作確實更多是工程問題,而不是算法問題。優(yōu)先從工程效率中要效果,當把這部分榨干后,再考慮算法的升級。
Before Machine Learning
Rule #1: Don’t be afraid to launch a product without machine learning.
規(guī)則1:不要害怕上線沒有機器學習的產品。
中心思想一句話概括:If you think that machine learning will give you a 100% boost, then a heuristic will get you 50% of the way there.
Rule #2: First, design and implement metrics.
規(guī)則2:在動手之前先設計和實現(xiàn)評價指標。
在構建具體的機器學習系統(tǒng)之前,首先在當前系統(tǒng)中記錄盡量詳細的歷史信息,留好特征數(shù)據(jù)。這樣不僅能夠留好特征數(shù)據(jù),還能夠幫助我們隨時了解系統(tǒng)的狀態(tài),以及做各種改動時系統(tǒng)的變化。
Rule #3: Choose machine learning over a complex heuristic.
規(guī)則3:不要使用過于復雜的規(guī)則系統(tǒng),使用機器學習系統(tǒng)。
簡單來講,復雜的規(guī)則系統(tǒng)難以維護,不可擴展,而我們很簡單就可以轉為ML系統(tǒng),變得可維護可擴展。
ML Phase I: Your First Pipeline
構建第一個ML系統(tǒng)時,一定要更多關注系統(tǒng)架構的建設。雖然機器學習的算法令人激動,但是基礎架構不給力找不到問題時會令人抓狂。
Rule #4: Keep the first model simple and get the infrastructure right.
規(guī)則4:第一個模型要簡單,但是架構要正確。
第一版模型的核心思想是抓住主要特征、與應用盡量貼合以及快速上線。
Rule #5: Test the infrastructure independently from the machine learning.
規(guī)則5:獨立于機器學習來測試架構流程。
確保架構是可單獨測試的,將系統(tǒng)的訓練部分進行封裝,以確保其他部分都是可測試的。特別來講:
-
測試數(shù)據(jù)是否正確進入訓練算法。檢查具體的特征值是否符合預期。
-
測試實驗環(huán)境給出的預測結果與線上預測結果是否一致。
Rule #6: Be careful about dropped data when copying pipelines.
規(guī)則6:復制pipeline時要注意丟棄的數(shù)據(jù)。
從一個場景復制數(shù)據(jù)到另一個場景時,要注意兩邊對數(shù)據(jù)的要求是否一致,是否有數(shù)據(jù)丟失的情況。
Rule #7: Turn heuristics into features, or handle them externally.
規(guī)則7:將啟發(fā)規(guī)則轉化為特征,或者在外部處理它們。
機器學習系統(tǒng)解決的問題通常都不是新問題,而是對已有問題的進一步優(yōu)化。這意味著有很多已有的規(guī)則或者啟發(fā)式規(guī)則可供使用。這部分信息應該被充分利用(例如基于規(guī)則的推薦排序時用到的排序規(guī)則)。下面是幾種啟發(fā)式規(guī)則可以被使用的方式:
-
用啟發(fā)規(guī)則進行預處理。如果啟發(fā)式規(guī)則非常有用,可以這么用。例如在垃圾郵件識別中,如果有發(fā)件人已經被拉黑了,那么就不要再去學“拉黑”意味著什么,直接拉黑就好了。
-
制造特征。可以考慮從啟發(fā)式規(guī)則直接制造一個特征。例如,你使用啟發(fā)式規(guī)則來計算query的相關性,那么就可以把這個相關性得分作為特征使用。后面也可以考慮將計算相關性得分的原始數(shù)據(jù)作為特征,以期獲得更多的信息。
-
挖掘啟發(fā)式規(guī)則的原始輸入。如果有一個app的規(guī)則啟發(fā)式規(guī)則綜合了下載數(shù)、標題文字長度等信息,可以考慮將這些原始信息單獨作為特征使用。
-
修改label。當你覺得啟發(fā)式規(guī)則中包含了樣本中沒有包含的信息時可以這么用。例如,如果你想最大化下載數(shù),同時還想要追求下載內容的質量。一種可行的方法是將label乘以app的平均star數(shù)。在電商領域,也常常用類似的方法,例如在點擊率預估的項目中,可考慮對最終下單的商品或者高質量的商品對應的樣本增加權重。
已有的啟發(fā)式規(guī)則可以幫助機器學習系統(tǒng)更平滑的過渡,但是也要考慮是否有同等效果更簡單的實現(xiàn)方式。
Monitoring
概括來講,要保持好的監(jiān)控習慣,例如使報警是可應對的,以及建設一個Dashboard頁面。
Rule #8: Know the freshness requirements of your system.
規(guī)則8:了解你系統(tǒng)對新鮮度的要求。
如果模型延遲一天更新,你的系統(tǒng)會受到多大的效果影響?如果是一周的延遲呢?或者更久?這個信息可以讓我們排布監(jiān)控的優(yōu)先級。如果模型一天不更新收入就會下降10%,那么可以考慮讓一個工程師全天候監(jiān)控它。了解系統(tǒng)對新鮮度的要求是決定具體監(jiān)控方案的第一步。
Rule #9: Detect problems before exporting models.
規(guī)則9:在模型上線之前檢測問題。
模型上線前一定要做完整性、正確性檢查,例如AUC、Calibration、NE等指標的計算確認等。如果是模型上線前出了問題,可以郵件通知,如果是用戶正在使用的模型出了問題,就需要電話通知了。
Rule #10: Watch for silent failures.
規(guī)則10:關注靜默失敗。
這是一個非常重要,而又經常容易被忽略的問題。所謂的靜默失敗指的是全部流程都正常完成,但是背后依賴數(shù)據(jù)出了問題,導致模型效果逐步下降的問題。這種問題在其他系統(tǒng)中并不常出現(xiàn),但是在機器學習系統(tǒng)中出現(xiàn)幾率會比較高。例如訓練依賴的某張數(shù)據(jù)表很久沒有更新了,或者表中的數(shù)據(jù)含義發(fā)生了變化等,再或者數(shù)據(jù)的覆蓋度忽然變少,都會對效果產生很大的影響。解決方法是是對關鍵數(shù)據(jù)的統(tǒng)計信息進行監(jiān)控,并且周期性對關鍵數(shù)據(jù)進行人工檢查。
Rule #11: Give feature column owners and documentation.
規(guī)則11:給特征組分配負責人,并記錄文檔。
這里的feature column指的是一個特征組,例如用戶可能屬于的國家這組特征就是一個feature column。
如果系統(tǒng)龐大,數(shù)據(jù)繁多,那么知道每組數(shù)據(jù)由誰生成就變得非常重要。雖然數(shù)據(jù)都有簡單描述,但是關于特征的具體計算邏輯,數(shù)據(jù)來源等都需要更詳細的記錄。
Your Fist Objective
objective是模型試圖優(yōu)化的值,而metric指的是任何用來衡量系統(tǒng)的值。
Rule #12: Don’t overthink which objective you choose to directly optimize.
規(guī)則12:不要過于糾結該優(yōu)化哪個目標。
機器學習上線的初期,即使你只優(yōu)化一個目標,很多指標一般都會一起上漲的。所以不用太糾結究竟該優(yōu)化哪個。
雖然大佬這么說,但是在我自己的實踐經驗中,只優(yōu)化一個目標,系統(tǒng)的整體效果卻未必會上漲。典型的如推薦系統(tǒng)的CTR模型,上線之后CTR確實會提升,但是對應的CVR很有可能會下降,這時還需要一個CVR模型,兩個模型同時使用才能真正提升系統(tǒng)效果。究其原因,是因為每個目標只關注系統(tǒng)整個過程的一個子過程,貪心地去優(yōu)化這個子過程,不一定能夠得到全局的最優(yōu)解,通常需要把主要的幾個子過程都優(yōu)化之后,才能取得整體效果的提升。
Rule #13: Choose a simple, observable and attributable metric for your first objective.
規(guī)則13:為你的第一個objective選擇一個簡單可觀測可歸因的metric。
objective應該是簡單可衡量的,并且是metric的有效代理。最適合被建模的是可直接觀測并被歸因的行為,例如:
-
鏈接是否被點擊?
-
軟件是否被下載?
-
郵件是否被轉發(fā)?
……
盡量不要在第一次就建模非直接效果的行為,例如:
-
用戶第二天是否會訪問?
-
用戶在網(wǎng)站上停留了多久?
-
日活用戶有多少?
非直接指標是很好的metric,可以用ABTest來進行觀測,但不適合用作優(yōu)化指標。此外,千萬不要試圖學習以下目標:
-
用戶對產品是否滿意?
-
用戶對體驗是否滿意?
……
這些指標非常重要,但是非常難以學習。應該使用一些代理指標來學習,通過優(yōu)化代理指標來優(yōu)化這些非直接指標。為了公司的發(fā)展著想,最好有人工來連接機器學習的學習目標和產品業(yè)務。
Rule #14: Starting with an interpretable model makes debugging easier.
規(guī)則14:使用可解釋性強的模型可降低debug難度。
優(yōu)先選擇預測結果有概率含義、預測過程可解釋的模型,可以更容易的確認效果,debug問題。例如,如果使用LR做分類,那么預測過程不外乎一些相乘和相加,如果特征都做了離散化,就只有加法了,這樣很容易debug一條樣本的預測得分是如何被計算出來的。所以出了問題很容易debug。
Rule #15: Separate Spam Filtering and Quality Ranking in a Policy Layer.
規(guī)則15:將垃圾過濾和質量排序的工作分離,放到策略層(policy layer)。
排序系統(tǒng)工作的環(huán)境中數(shù)據(jù)分布是相對靜態(tài)的,大家為了得到更好的排序,會遵守系統(tǒng)制定的規(guī)則。但是垃圾過濾更多是個對抗性質的工作,數(shù)據(jù)分布會經常變動。所以不應該讓排序系統(tǒng)去處理垃圾信息的過濾,而是應該有單獨的一層去處理垃圾信息。這也是一種可以推廣的思想,那就是:排序層只做排序層的事情,職責盡量單一,其他工作讓架構上更合適的模塊去處理。此外,為了提升模型效果,應該把垃圾信息從訓練數(shù)據(jù)中去除。
ML Phase II: Feature Engineering
前面第一階段的重點是把數(shù)據(jù)喂到學習系統(tǒng)中,有了基礎的監(jiān)控指標,有了基礎的架構。等這一套系統(tǒng)建立起來后,第二階段就開始了。
整體來講,第二階段的核心工作是將盡量多的有效特征加入到第一版的系統(tǒng)中,一般都可以取得提升。
Rule #16: Plan to launch and iterate.
規(guī)則16:做好持續(xù)迭代上線的準備。
簡單來說,就是要深刻認識到,系統(tǒng)優(yōu)化永遠沒有終點,所以系統(tǒng)設計方面要對迭代非常友好。例如增加刪除特征是否足夠簡單,正確性驗證是否足夠簡單,模型迭代是否可以并行運行,等等。
這雖然不是一條具體可行動的(actionable)規(guī)則,但是這種思想上的準備對整個系統(tǒng)的開發(fā)很有幫助。只有真正深刻意識到了系統(tǒng)持續(xù)迭代上線的本質,才會在設計在線和離線架構時為持續(xù)迭代最好相應的設計,并做好相應的工具,而不是做一錘子系統(tǒng)。
Rule #17: Start with directly observed and reported features as opposed to learned features.
規(guī)則17:優(yōu)先使用直接觀測或收集到的特征,而不是學習出來的特征。
所謂學習出來的特征,指的是用另外的算法學習出來的特征,而非可以直接觀測或收集到的簡單特征。學習出來的特征由于存在外部依賴,或者計算邏輯復雜,不一定適用于你當前的模型,所以穩(wěn)定性和有效性會有風險。而直接可觀測的特征由于是相對比較客觀的,依賴較少的,所以比較穩(wěn)定。
Rule #18: Explore with features of content that generalize across contexts.
規(guī)則18:探索使用可以跨場景的內容特征。
中心思想是在說,要多利用可以在多個場景下使用的特征,例如全局的點擊率、瀏覽量這些特征,可以在多個場景下作為特征使用。這樣可以在一些冷啟動或者缺乏有效特征的場景下作為特征使用。
Rule #19: Use very specific features when you can.
規(guī)則19:盡量使用非常具體的特征。
如果數(shù)據(jù)量足夠大,那么相比少數(shù)復雜特征,使用海量簡單特征是更簡單有效的選擇。
所謂非常具體,指的是覆蓋樣本量比較少的特征,例如文檔的ID或者query的ID等。這樣的特征雖然每個只覆蓋很少一部分特征,但是只要這一組特征整體能夠覆蓋率比較高,例如90%,那就是OK的。而且還可以通過正則化來消除覆蓋率過低或者相關性差的特征。這也是大家都偏愛大規(guī)模ID特征的一個原因,現(xiàn)在很多大廠的排序模型特征都大量使用了大規(guī)模ID特征。
Rule #20: Combine and modify existing features to create new features in human--understandable ways.
規(guī)則20:用人類可理解的方式對已有特征進行組合、修改來得到新特征。
離散化和交叉是最常用的兩種特征使用方式。其本質都是用特征工程的方式,在不改變使用模型本身的情況下增加模型的非線性。這兩種方法本身沒什么好說的,值得一致的是,在大規(guī)模ID類特征的交叉時,例如一段是query里的關鍵詞,另一端是文檔里的關鍵詞,那就會產生很大量級的交叉特征,這時有兩種處理方法:
-
點積。其實計算query和文檔共同包含的關鍵詞數(shù)量。
-
交集。每一維特征的含義是某個詞同時出現(xiàn)在了query和文檔中,同時出現(xiàn)則該維特征為1,否則為0。
所謂“人類可理解的方式”,我的理解就是離散化和交叉要基于對業(yè)務邏輯的理解,不能亂交叉。
Rule #21: The number of feature weights you can learn in a linear model is roughly proportional to the amount of data you have.
規(guī)則21:線性模型中可學到的特征權重數(shù)量,與訓練數(shù)據(jù)的數(shù)量大體成正比。
這背后有復雜的統(tǒng)計原理做支撐,但你只需要知道結論就可以了。這個原則給我們的啟示,是要根據(jù)數(shù)據(jù)量來選擇特征的生成方式,例如:
-
如果你的系統(tǒng)是一個搜索系統(tǒng),query和文檔中有百萬級的詞,但是你只有千級別的標注樣本。那你就別用ID級關鍵詞特征了,而是要考慮點積類特征,把特征數(shù)量控制在幾十個這個級別。
-
如果你擁有百萬級樣本,那么可以將文檔和query的關鍵詞進行交叉特征,然后用正則化進行特征選擇。這樣你會得到百萬級特征,但是正則化之后會更少。所以說,千萬級樣本,十萬級特征。
-
如果你有十億級或者更高級別的樣本,那么你可以使用query和文檔的ID級特征,然后加上特征選擇和正則化。十億級樣本,千萬級特征。
總結起來就是,根據(jù)樣本決定特征使用方式,樣本不夠就對特征進行高層次抽象處理,指導和樣本量級相匹配。
Rule #22: Clean up features you are no longer using.
規(guī)則22:清理不再使用的特征。
如果某個特征已經沒有用,并且它與其他特征的交叉也已經沒有用,就應該將其清理掉,保持架構的整潔性。
在考慮添加或保留哪些特征時,需要統(tǒng)計一下特征的樣本覆蓋率,例如一些整體覆蓋率很低的個性化feature column,只有很少用戶能覆蓋到,那么大概率這組特征作用不大。但另一方面,如果某個特征覆蓋率很低,例如只有1%,但是其區(qū)分度非常大,例如90%取值為1的樣本都是正樣本,那么 這個特征就值得加入或保留。
Human Analysis of the System
在更進一步之前,我們需要了解一些機器學習課程上不會教你的內容:如何觀察分析模型,并改進它。用作者的話說,這更像是一門藝術 ,但仍然有一些規(guī)律可循。
Rule #23: You are not a typical end user.
規(guī)則23:你不是一個典型的終端用戶。
這條規(guī)則的中心思想是說,雖然吃自己的狗食是必要的,但也不要總是從工程師的角度來衡量模型的好壞。這不僅可能不值當,而且可能看不出問題。所謂不值當,是因為工程師的時間太貴了,這個大家都懂;而所謂看不出問題,是因為工程師自己看自己開發(fā)的模型,容易看不出問題,所謂“不識廬山真面目”。
所以作者認為合理的方法是讓真正的終端用戶來衡量模型或產品的好壞。要么通過線上ABTest,要么通過眾包的方式來做。
Rule #24: Measure the delta between models.
規(guī)則24:離線衡量模型之間的差異。
原文沒有說是離線,但我通過上下文理解他說的應該是離線。這一條規(guī)則說的是新模型在上線之前,需要先和老模型做差異對比。所謂差異對比,指的是對于同樣的輸入,新舊兩個模型給出的結果是否差異足夠大。例如對于同一個query,兩個排序模型給出的差異是否足夠大。如果離線計算發(fā)現(xiàn)差異很小,那也沒必要上線測試了,因為上線后差異肯定也大不了。如果差異比較大,那么還需要看差異是不是好的差異。通過觀察差異可以得知新模型究竟對數(shù)據(jù)產生了什么影響,這種影響是好是壞。
當然,這一切的前提是你需要有一個穩(wěn)定的對比系統(tǒng),起碼一個模型和他自己對比的話差異應該非常小,最好是零差異。
Rule #25: When choosing models, utilitarian performance trumps predictive power.
規(guī)則25:當選擇模型時,實用性指標比預測能力更重要。
這是一條很有用的經驗。雖然我們訓練模型時objective一般都是logloss,也就是說實在追求模型的預測能力。但是我們在上層應用中卻可能有多種用途,例如可能會用來排序,那么這時具體的預測能力就不如排序能力重要;如果用來劃定閾值然后跟根據(jù)閾值判斷垃圾郵件,那么準確率就更重要。當然大多數(shù)情況下這幾個指標是一致的。
除了作者說的這一點,還有一種情況是需要特別注意的,那就是我們在訓練時可能會對樣本做采樣,導致得到的預測值整體偏高或偏低。如果這個預測值是用來直接排序的,那么這個變化關系不大,但如果有其他用處,例如和另外的值相乘,典型的如廣告場景下的CTR*bid,或者電商推薦排序下的CTR*CVR,在這類場景下,預測值本身的準確性也很重要,就需要對其進行校準(calibrate),使其與采樣前的樣本點擊率對齊。
Rule #26: Look for patterns in the measured errors, and create new features.
規(guī)則26:在錯誤中發(fā)現(xiàn)模式,并創(chuàng)建新特征。
這算是一種用來提升模型效果的通用思路。具體來說,指的是觀察訓練數(shù)據(jù)中模型預測錯誤的樣本,看看是否能夠通過添加額外特征來使得這條樣本被模型預測正確。之所以使用訓練集中的數(shù)據(jù),是因為這部分數(shù)據(jù)是模型已經試圖優(yōu)化過的,這里面的錯誤,是模型知道自己搞錯了,目前學不出來的,所以如果你給它足夠好的其他特征,它或許就能把這條樣本學對了。
一旦發(fā)現(xiàn)錯誤的模式,就可以在當前系統(tǒng)之外尋找新的特征。例如,如果你發(fā)現(xiàn)當前系統(tǒng)傾向于錯誤地把長文章排到后面,那么就可以加入文章長度這一特征,讓系統(tǒng)去學習文章長度的相關性和重要性。
Rule #27: Try to quantify observed undesirable behavior.
規(guī)則27:盡量將觀測到的負面行為量化。
如果在系統(tǒng)中觀察到了模型沒有優(yōu)化到的問題,典型的例如推薦系統(tǒng)逼格不夠這種問題,這時應該努力將這種不滿意轉化為具體的數(shù)字,具體來講可以通過人工標注等方法標注出不滿意的物品,然后進行統(tǒng)計。如果問題可以被量化,后面就可以將其用作特征、objective或者metric。整體原則就是“先量化,再優(yōu)化”。
多說一句,這里的優(yōu)化,不一定是用模型來優(yōu)化,而是指的整體優(yōu)化。比如推薦系統(tǒng)逼格這種問題,模型可能很難優(yōu)化,但是只要能量化出來,就可以通過其他方法來盡量減少,例如單獨去學習有逼格物品的特征,或者在召回階段進行一定傾斜。
Rule #28: Be aware that identical short-term behavior does not imply identical long--term behavior.
規(guī)則28:要注意短期內觀察到的類似行為不一定會長期存在。
假設你搞了個系統(tǒng),通過學習每個具體的文檔ID和query ID,計算出了每個query下每個文檔的點擊率。通過離線對比和ABTest,你發(fā)現(xiàn)這個系統(tǒng)的行為和當前系統(tǒng)的行為一毛一樣,而這個系統(tǒng)又更簡單,所以你就把這個系統(tǒng)上線了。后面你會發(fā)現(xiàn)這個系統(tǒng)在任何query下都不會給出任何新的文檔。奇怪嗎?一點都不奇怪,因為你只讓它記住了之前的歷史數(shù)據(jù),它對新數(shù)據(jù)沒有任何信息。
所以唯一能夠衡量一個系統(tǒng)是否長期有效的方法,就是讓它使用該模型在線上時收集到的真實數(shù)據(jù)上進行訓練。當然這有難度。
往大了說,作者這條規(guī)則其實說的是個系統(tǒng)或者模型的泛化能力,如果一個系統(tǒng)或者模型不能對新數(shù)據(jù)做出很好的預測,那么無論他的離線表現(xiàn)如何,都不能代表它的真正能力。再換個角度來看,一個系統(tǒng)必須具有持續(xù)學習適應新數(shù)據(jù)的能力,才能是一個合格的機器學習系統(tǒng),否則就只是個學舌的鸚鵡。
Training-Serving Skew
訓練和服務之間的差異問題時一個大話題,主要原因包括訓練時與服務時數(shù)據(jù)獲取方式不同、訓練時與服務時數(shù)據(jù)分布不同以及模型和算法之間的反饋循環(huán)等。作者說這種差異在G家的多條產品線上出現(xiàn)過,都產生了負面影響。但要我說這絕對不僅僅是谷歌的問題,谷歌絕對是做的比較好的了,各種中小廠里面這種問題只多不少,所以這部分的經驗是非常寶貴的。解決這類問題的核心是對系統(tǒng)和數(shù)據(jù)的變化進行監(jiān)控,確保一切差異都在監(jiān)控之內,不會悄悄進入系統(tǒng)。
Rule #29: The best way to make sure that you train like you serve is to save the set of features used at serving time, and then pipe those features to a log to use them at training time.
規(guī)則29:保證服務與訓練一致性的最好方法是將服務時的特征保存下來,然后通過日志將特征喂到訓練過程中去。
這句話基本道出了保證差異最小化的核心套路。這種基于特征日志的方法可以極大提升效果,同時能夠減少代碼復雜度。谷歌的很多團隊也正在往這種做法上遷移。
Rule #30: Importance weight sampled data, don’t arbitrarily drop it!
規(guī)則30:對采樣樣本做重要性賦權,不要隨意丟棄!
這是作者唯一用了感嘆號的一條,可想而知背后的辛酸。當我們有太多訓練數(shù)據(jù)時,我們會只取其中的一部分。但這是錯誤的。正確的做法是,如果你給某條樣本30%的采樣權重,那么在訓練時就給它10/3的訓練權重。通過這樣的重要性賦權(importance weight),整個訓練結果的校準性(calibration)就還能夠保證。
多說一句,這個校準性非常的重要,尤其對于廣告系統(tǒng),或者多個預測值相加或相乘來得到最終結果的系統(tǒng)。如果單個值沒有校準,偏低或偏高,那么在相乘或相加之后其含義就會不正確。如果直接使用模型預測值進行排序,校準性就沒那么重要,因為校準性不會影響排序,只會影響具體的值。
Rule #31: Beware that if you join data from a table at training and serving time, the data in the table may change.
規(guī)則31:如果你在訓練時和服務時都在join一張表,那么要注意這張表的數(shù)據(jù)可能會發(fā)生變化。
比如說某張表里存著一些文檔的特征,你在離線訓練之前要去這個表里取這些特征用來訓練,但這里就有個風險,那就是這個表里的數(shù)據(jù)在你離線取的時候和在線服務的時候數(shù)據(jù)不一樣,發(fā)生了變化。最好的解決方式就是在服務端將特征記錄在日志中,這樣能保證數(shù)據(jù)的一致性。或者如果這張表的變化頻率比較低,也可以考慮對其做小時級或天級備份,以此來減少這種差異。但要記住這種方法并不能徹底解決這個問題。
Rule #32: Re-use code between your training pipeline and your serving pipeline whenever possible.
規(guī)則32:盡量在訓練pipeline和服務pipeline之間復用代碼。
訓練一般是離線批量進行的,而服務則是在線流式進行的,這兩者之間雖然在處理數(shù)據(jù)的方式上存在著較大差異,但仍然有很多代碼可以共享。這些代碼的共享可以從代碼層面介紹訓練和服務之間的差異。換句話說,日志記錄特征是從數(shù)據(jù)角度消除差異,那么代碼復用就是從代碼角度消除差異,雙管齊下,效果更好。
Rule #33: If you produce a model based on the data until January 5th, test the model on the data from January 6th and after.
規(guī)則33:如果訓練數(shù)據(jù)是1月5日之前的,那么測試數(shù)據(jù)要從1月6日開始。
這條規(guī)則的主要目的是讓測試結果與線上結果更加接近,因為我們在使用模型時就是在用服務當天之前的數(shù)據(jù)訓練,然后來預測當天的數(shù)據(jù)。這樣得到的測試結果雖然可能會偏低,但卻更加真實。
Rule #34: In binary classification for filtering (such as spam detection or determining interesting e-mails), make small short--term sacrifices in performance for very clean data.
規(guī)則34:在為過濾服務的二分類問題中(例如垃圾郵件過濾),可以為了干凈的數(shù)據(jù)犧牲一些短期效果。
在過濾類的任務中,被標記為負的樣本是不會展示給用戶的,例如可能會把75%標記為負的樣本阻攔住不展現(xiàn)給用戶。但如果你只從展示給用戶的結果中獲取下次訓練的樣本,顯然你的訓練樣本是有偏的。
更好的做法是使用一定比例的流量(例如1%)專門收集訓練數(shù)據(jù),在這部分流量中的用戶會看到所有的樣本。這樣顯然會影響線上的真實過濾效果,但是會收集到更好的數(shù)據(jù),更有利于系統(tǒng)的長遠發(fā)展。否則系統(tǒng)會越訓練越偏,慢慢就不可用了。同時還能保證至少過濾掉74%的負樣本,對系統(tǒng)的影響也不是很大。
但是如果你的系統(tǒng)會過濾掉95%或者更多的負樣本,這種做法就不那么可行了。即使如此,為了準確衡量模型的效果,你仍然可以通過構造一個更小的數(shù)據(jù)集(0.1%或者更小)來測試。十萬級別的樣本足夠給出準確的評價指標了。
Rule #35: Beware of the inherent skew in ranking problems.
規(guī)則35:注意排序問題中固有的數(shù)據(jù)偏置。
當新的排序算法對線上排序結果產生了重大改變時,你其實是改變了算法將來會看到的數(shù)據(jù)。這時這種偏置就會出現(xiàn)。這種問題有以下幾種方法來解決,核心思想都是更偏重模型已經看到過的數(shù)據(jù)。
-
對覆蓋更多query(或類似角色,根據(jù)業(yè)務不同)的特征給予更強的正則化。這樣模型會更偏重只覆蓋一部分樣本的特征,而不是泛化性特征。這樣會阻止爆品出現(xiàn)在不相關query的結果中。
-
只允許特征取正的權重值。這樣任何好特征都會比“未知”特征要好。
-
不要使用只和文檔相關的特征。這是第一條的極端情況,否則會導致類似哈利波特效應的情況出現(xiàn),也就是一條在任何query下都受歡迎的文檔不會到處都出現(xiàn)。去除掉只和文檔相關的特征會阻止這種情況發(fā)生。
Rule #36: Avoid feedback loops with positional features.
規(guī)則36:使用位置特征來避免反饋回路。
大家都知道排序位置本身就會影響用戶是否會對物品產生互動,例如點擊。所以如果模型中沒有位置特征,本來由于位置導致的影響會被算到其他特征頭上去,導致模型不夠準。可以用加入位置特征的方法來避免這種問題,具體來講,在訓練時加入位置特征,預測時去掉位置特征,或者給所有樣本一樣的位置特征。這樣會讓模型更正確地分配特征的權重。
需要注意的是,位置特征要保持相對獨立,不要與其他特征發(fā)生關聯(lián)。可以將位置相關的特征用一個函數(shù)表達,然后將其他特征用另外的函數(shù)表達,然后組合起來。具體應用中,可以通過位置特征不與任何其他特征交叉來實現(xiàn)這個目的。
Rule #37: Measure Training/Serving Skew.
規(guī)則37:衡量訓練和服務之間的差異。
整體來講有多種原因會導致這種差異,我們可以將其進行細分為以下幾部分:
-
訓練集和測試集之間的差異。這種差異會經常存在,而且不一定是壞事。
-
測試集和“第二天”數(shù)據(jù)間的差異。這種差異也會一直存在,而這個“第二天”數(shù)據(jù)上的表現(xiàn)是我們應該努力優(yōu)化的,例如通過正則化。這兩者之間差異如果過大,可能是因為用到了一些時間敏感的特征,導致模型效果變化明顯。
-
“第二天”數(shù)據(jù)和線上數(shù)據(jù)間的差異。如果同樣一條樣本,在訓練時給出的結果和線上服務時給出的結果不一致,那么這意味著工程實現(xiàn)中出現(xiàn)了bug。
ML Phase III: Slowed Growth, Optimization Refinement, and Complex Models
一般會有一些明確的信號來標識第二階段的尾聲。首先,每月的提升會逐步降低。你開始在不同指標之間做權衡,有的上升有的下降。嗯,游戲變得有趣了。既然收益不容易獲得了,機器學習就得變得更復雜了。
在前兩個階段,大部分團隊都可以過得很開心,但到了這個階段,每個團隊都需要找到適合自己的路。
Rule #38: Don’t waste time on new features if unaligned objectives have become the issue.
規(guī)則38:如果objective沒有達成一致,不要在新特征上浪費時間。
當系統(tǒng)整體達到一個穩(wěn)定期,大家會開始關注機器學習系統(tǒng)優(yōu)化目標以外的一些問題。這個時候,目標就不如之前那么清晰,那么如果目標沒有確定下來的話,先不要在特征上浪費時間。
Rule #39: Launch decisions are a proxy for long-term product goals.
規(guī)則39:上線決策是長期產品目標的代理。
這句話讀起來有點別扭,作者舉了幾個例子來說明,我覺得核心就是在講一件事情:系統(tǒng)、產品甚至公司的長遠發(fā)展需要通過多個指標來綜合衡量,而新模型是否上線要綜合考慮這些指標。所謂代理,指的就是優(yōu)化這些綜合指標就是在優(yōu)化產品、公司的長遠目標。
決策只有在所有指標都在變好的情況下才會變得簡單。但常常事情沒那么簡單,尤其是當不同指標之間無法換算的時候,例如A系統(tǒng)有一百萬日活和四百萬日收入,B系統(tǒng)有兩百萬日活和兩百萬日收入,你會從A切換到B嗎?或者反過來?答案是或許都不會,因為你不知道某個指標的提升是否會cover另外一個指標的下降。
關鍵是,沒有任何一個指標能回答:“五年后我的產品在哪里”?
而每個個體,尤其是工程師們,顯然更喜歡能夠直接優(yōu)化的目標,而這也是機器學習系統(tǒng)常見的場景 。現(xiàn)在也有一些多目標學習系統(tǒng)在試圖解決這種問題。但仍然有很多目標無法建模為機器學習問題,比如用戶為什么會來訪問你的網(wǎng)站等等。作者說這是個AI-complete問題,也常被稱為強AI問題,簡單來說就是不能用某個單一算法解決的問題。
Rule #40: Keep ensembles simple.
規(guī)則40:ensemble策略保持簡單。
什么叫簡單的ensemble?作者認為,只接受其他模型的輸出作為輸入,不附帶其他特征的ensemble,叫做簡單的ensemble。換句話說,你的模型要么是單純的ensemble模型,要么是普通的接收大量特征的基模型。
除了保持簡單,ensemble模型最好還能具有一些良好的性質。例如,某個基模型的性能提升不能降低組合模型的性能。以及,基模型最好都是可解釋的(例如是校準的),這樣基模型的變化對上層的組合模型來說也是可解釋的。同時,一個基模型預測概率值的提升不會降低組合模型的預測概率值。
Rule #41: When performance plateaus, look for qualitatively new sources of information to add rather than refining existing signals.
規(guī)則41:當效果進入穩(wěn)定期,尋找本質上新的信息源,而不是優(yōu)化已有的信號。
你加了一些用戶的人口統(tǒng)計學特征,你加了一些文檔的文字特征,等等,但是關鍵指標上的提升還不到1%。現(xiàn)在咋整?
這時就應該考慮加一些根本上不同的特征,例如用戶再過去一天、一周看過的文檔歷史,或者另外一個數(shù)據(jù)源的數(shù)據(jù)。總之,要加入完全不同的維度的特征。此外也可以嘗試使用深度學習,但同時也要調整你對ROI的預期,并且要評估增加的復雜度換來的收益是否值得。
Rule #42: Don’t expect diversity, personalization, or relevance to be as correlated with popularity as you think they are.
規(guī)則42:多樣性,個性化或者相關性與流行度的相關性關系可能要比你想的弱很多。
多樣性意味著內容或者來源的多樣性;個性化意味著每個用戶得到不一樣的東西;相關性意味著一個query的返回結果相比其他query與這個query更相關。所以這三個指標的含義都是與普通不一樣。
但問題在于普通的東西很難被打敗。
如果你的衡量指標是點擊、停留時長、觀看數(shù)、分享數(shù)等等,你本質上是在衡量東西的流行度。有的團隊有時會希望學到一個多樣化的個性化模型。為此,會加入個性化特征和多樣化特征,但是最后會發(fā)現(xiàn)這些特征并沒有得到預期的權重。
這并不能說明多樣性、個性化和相關性不重要。像前文指出,可以通過后續(xù)的處理來增加多樣性或相關性。如果這時看到長期目標提升了,你就可以確定多樣性/相關性是有用的。這時你就可以選擇繼續(xù)使用后續(xù)處理的方式,或者根據(jù)多樣性和相關性直接修改要優(yōu)化的objective。
Rule #43: Your friends tend to be the same across different products. Your interests tend not to be.
規(guī)則43:你在不同產品上的好友一般是一樣的,但你的興趣通常會不一樣。
谷歌經常在不同產品上使用同樣的好友關系預測模型,并且取得了很好的效果,這證明不同的產品上好友關系是可以遷移的,畢竟他們是固定的同一批人。但他們嘗試將一個產品上的個性化特征使用到另外一個產品上時卻常常得不到好結果。可行的做法是使用一個數(shù)據(jù)源上的原始數(shù)據(jù)來預測另外數(shù)據(jù)源上的行為,而不是使用加工后的特征。此外,用戶在另一個數(shù)據(jù)源上的行為歷史也會有用。
總結
從上面洋洋灑灑43條經驗之談中不難看出,大神作者認為,對于大多數(shù)機器學習應用場景來說,我們需要解決的問題大多數(shù)都是工程問題,解決這些工程問題需要的并不是復雜的理論,更多是對細節(jié)、架構、過程的仔細推敲和精致追求。而這些是我們非大神的普通人可以做到的,如果說大神做的是95分以上的系統(tǒng),那么我們只要對工程架構、過程和細節(jié)做好足夠的優(yōu)化,我們也可以做出至少80分的系統(tǒng)。
-
谷歌
+關注
關注
27文章
6194瀏覽量
106014 -
機器學習
+關注
關注
66文章
8438瀏覽量
133084
原文標題:良心整理 | 機器學習43條軍規(guī):解密谷歌機器學習工程最佳實踐
文章出處:【微信號:thejiangmen,微信公眾號:將門創(chuàng)投】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論