Google發布了關于機器學習(ML)工程的最佳實踐文檔,旨在幫助已掌握ML基礎知識的人員從谷歌機器學習的最佳實踐中受益。它介紹了一種ML樣式,類似于 Google C++ 樣式指南和其他常用的實用編程指南。
本文檔旨在幫助已掌握ML基礎知識的人員從谷歌機器學習的最佳實踐中受益。它介紹了一種ML樣式,類似于 Google C++ 樣式指南和其他常用的實用編程指南。如果您學習過ML方面的課程,或者擁有ML模型的構建或開發經驗,則具備閱讀本文檔所必需的背景知識。
術語
在我們討論有效的ML的過程中,會反復提到下列術語:
實例:要對其進行預測的事物。例如,實例可以是一個網頁,您希望將其分類為 "與貓相關" 或 "與貓無關"。
標簽:預測任務的答案,它可以是由ML系統生成的答案,也可以是訓練數據中提供的正確答案。例如,某個網頁的標簽可能是 "與貓相關"。
特征:預測任務中使用的實例的屬性。例如,某個網頁可能具有 "包含字詞'貓'" 這一特征。
特征列:一組相關特征,例如用戶可能居住的所有國家/地區的集合。樣本的特征列中可能包含一個或多個特征。"特征列" 是 Google 專用的術語。特征列在 Yahoo/Microsoft 使用的 VM 系統中被稱為 "命名空間" 或場。
樣本:一個實例(及其特征)和一個標簽。
模型:預測任務的統計表示法。您使用樣本訓練一個模型,然后使用該模型進行預測。
指標:您關心的一個數值。也許(但不一定)可以直接得到優化。
目標:算法嘗試優化的一種指標。
管道:ML算法的基礎架構。管道包括從前端收集數據、將數據放入訓練數據文件、訓練一個或多個模型以及將模型運用到生產環境。
點擊率:點擊廣告中的鏈接的網頁訪問者所占的百分比。
概覽
要打造優質的產品:
請把自己看成是一位出色的工程師,而不是一位ML專家。
實際上,您將面臨的大部分問題都是工程問題。即使在使用出色的ML專家掌握的所有資源的情況下,大多數收獲也是由合適的特征(而非精確的機器學習算法)帶來的。所以,進行ML的基本方法是:
確保管道從頭到尾都穩固可靠。
從制定合理的目標開始。
以簡單的方式添加常識性特征。
確保管道始終穩固可靠。
上述方法將在長時間內取得很好的效果。只要您仍然可以通過某種簡單的技巧取得進展,就不應該偏離上述方法。增加復雜性會減緩未來版本的發布。
當您充分利用了所有的簡單技巧,或許就到了探索ML最前沿技術的時候了。請參閱第三階段的 "ML項目" 部分。
本文檔結構如下:
第一部分可幫助您了解構建ML系統的時機是否已經成熟。
第二部分介紹了如何部署第一個管道。
第三部分介紹了在向管道添加新特征時如何進行發布和迭代、如何評估模型,以及如何應對訓練 - 應用偏差。
最后一部分介紹了當您達到穩定階段時該怎么做。
之后是相關資源列表和附錄,附錄針對多次作為示例在本文檔中提及的系統,提供了一些背景信息。
在進行ML之前
第 1 條規則:不要害怕發布未采用ML技術的產品。
ML技術很酷,但它需要數據。從理論上講,您可以采用來自其他問題的數據,然后針對新產品調整模型,但其效果很可能不如基本的啟發式算法。如果您認為ML技術能為您帶來 100% 的提升,那么啟發式算法可為您帶來 50% 的提升。
例如,如果您要對應用市場中的應用進行排名,則可以將安裝率或安裝次數作為啟發式算法指標。如果您要檢測垃圾郵件,則可以濾除以前發送過垃圾郵件的發布商。此外,也不要害怕手動修改。如果您需要對聯系人進行排名,可以按使用聯系人的時間順序由近及遠對其排序(或按字母順序排序)。如果您的產品并非必須使用ML技術,則在獲得足夠的數據之前,請勿使用該技術。
第 2 條規則:首先設計并實現指標。
在正式確定ML系統的功能之前,盡可能在當前系統中跟蹤指標的值。這樣做的原因如下:
提前行動有助于更輕松地從系統的用戶獲得授權。
如果您認為將來可能需要考慮某個方面,最好立即開始收集相關歷史數據。
如果您在設計系統時考慮到指標測量,將來會省下很多力氣。具體而言,您不希望自己以后在日志中苦苦查找字符串以測量指標!
您將發現哪些內容發生了變化以及哪些內容始終未變。例如,假設您希望直接優化單日活躍用戶數。但是,在早期操縱系統的過程中,您可能會發現用戶體驗的顯著改變并沒有使該指標發生明顯變化。
Google+ 團隊會衡量每次閱讀的展開、轉發次數、+1次數、評論次數,以及每位用戶的評論轉發次數等,然后在應用模型時利用這些數據來衡量帖子的質量。另請注意,實驗框架非常重要,您必須在實驗框架中將用戶分組為多個分桶,并按實驗匯總統計信息。請參閱第 12 條規則。
通過以更加自由的方式收集指標,您可以更加全面地了解您的系統。發現問題了?添加指標對其進行跟蹤!對上個版本中發生的一些量變激動不已?添加指標對其進行跟蹤!
第 3 條規則:選擇ML技術而非復雜的啟發式算法。
簡單的啟發式算法有利于推出產品。但復雜的啟發式算法難以維護。當您獲得足夠的數據并基本確定自己要嘗試實現的目標后,請考慮使用ML技術。與大多數軟件工程任務一樣,您需要不斷更新方法(無論是啟發式算法還是ML模型),而且您會發現ML模型更易于更新和維護(請參閱第 16 條規則)。
ML第一階段:您的第一個管道
重點關注第一個管道的系統基礎架構。雖然展望您將要進行的創新性ML的方方面面是一件很有趣的事,但如果您不先確認管道的可靠性,則很難弄清楚所發生的情況。
第 4 條規則:確保第一個模型簡單易用,并正確實施基礎架構。
第一個模型可以最有效地提升您的產品質量,因此不需要花哨,簡單易用即可。但是,您會遇到很多預料之外的基礎架構問題。在公開推出您精心構建的新ML系統之前,您必須確定以下幾點:
如何為您的學習算法獲取樣本。
初步確定對于您的系統來說,"好" 和 "壞" 的定義是什么。
如何將模型整合到應用中。您可以在線應用模型,也可以離線使用樣本對模型進行預計算,并將結果存儲在表格中。例如,您可能需要對網頁進行預分類并將結果存儲在表格中,但也可能需要在線對聊天消息進行分類。
選擇簡單的特征可以更輕松地確保:
將這些特征正確應用于您的學習算法。
模型學習出合理的權重。
將這些特征正確應用于服務器端。
當您有了能可靠做到上述三點的系統時,則表示您已完成大部分工作。簡單的模型可為您提供基準指標和基準行為,您可以利用這些指標和行為測試更復雜的模型。某些團隊以 "中性" 作為首次發布的目標 - 在首次發布時明確淡化機器學習成果,以避免分心。
第 5 條規則:撇開機器學習,單獨測試基礎架構。
確保基礎架構可測試,且對系統的學習部分進行封裝,以便測試這些部分之外的方方面面。具體而言:
測試數據導入算法的效果。檢查應填充的特征列是否已填充。在隱私權許可的情況下,手動檢查輸入到訓練算法的數據。如果可能的話,查看管道中的統計信息,并與在其他地方處理的相同數據的統計信息進行比較。
測試從訓練算法得出模型的效果。確保訓練環境中的模型與應用環境中的模型給出的分數相同(請參閱第 37 條規則)。
ML具有不可預測性,因此要有用于訓練環境和應用環境中創建樣本的代碼的測試;并確保您可以在應用期間加載和使用固定模型。此外,了解您的數據至關重要:請參閱分析大型復雜數據集的實用建議。
第 6 條規則:復制管道時注意丟棄的數據。
通常,我們通過復制現有管道來創建新管道(即貨物崇拜編程),且舊管道會丟棄一些新管道需要的數據。例如,Google+ 熱門信息的管道會丟棄時間較早的帖子(因為它會不斷嘗試對最新的帖子進行排名)。此管道被復制用于 Google+ 信息流,在信息流中,時間較早的帖子仍然有意義,但舊管道仍會丟棄它們。另一種常見模式是僅記錄用戶看到的數據。因此,如果我們想要對用戶看不到特定帖子的原因進行建模,此類數據就毫無用處,因為管道已丟棄所有負分類樣本。Play 中也曾出現過類似的問題。在處理 Play 應用首頁時,創建了一個新管道,其中還包含來自 Play 游戲著陸頁的樣本,但無任何特征可區分各個樣本的來源。
第 7 條規則:將啟發式算法轉變為特征或在外部處理它們。
通常,ML嘗試解決的問題并不是全新的問題。有一個現有的系統,它可用于排名、分類,或解決您正嘗試解決的任何問題。這意味著有多種規則和啟發式算法。使用ML進行調整后,此類啟發式算法可為您提供便利。您應該挖掘自己的啟發式算法,了解它們所包含的任何信息,原因有以下兩點。首先,向ML系統的過渡會更平穩。其次,這些規則通常包含大量您不愿意丟棄的關于系統的直覺信息。
您可以通過以下四種方法使用現有啟發式算法:
使用啟發式算法進行預處理。如果特征非常好,則可以選擇執行此操作。例如,在垃圾郵件過濾器中,如果發件人已被列入黑名單,則不要試圖重新學習 "已列入黑名單" 的含義。屏蔽該郵件即可。這種方法最適合在二元分類任務中使用。
創建特征。直接通過啟發式算法創建特征是一種很好的做法。例如,如果您使用啟發式算法來計算查詢結果的相關性分數,則可以將此分數納為一個特征的值。您日后可能想要使用ML技術調整該值(例如,將該值轉換為一個有限離散值組中的一個,或與其他特征相組合),但是首先請使用啟發式算法生成的原始值。
挖掘啟發式算法的原始輸入。如果某個應用啟發式算法結合了安裝次數、文本中的字符數以及星期值,考慮將這些內容拆分開來,并作為輸入單獨提供給學習算法。部分適用于集成學習的技巧也適用于此(請參閱第 40 條規則)。
修改標簽。當您感覺啟發式算法會獲取當前標簽中未包含的信息時,可以選擇進行此操作。例如,如果您正在嘗試最大程度地增加下載次數,但同時也想要優質的內容,則可能的解決方案是用標簽乘以應用獲得的平均星數。您可以非常靈活地修改標簽。請參閱 "您的第一個目標"。
在ML系統中使用啟發式算法時,請務必留意是否會帶來額外的復雜性。在新的ML算法中使用舊啟發式算法有助于實現平穩過渡,但思考下是否有可以達到相同效果的更簡單的方法。
監控
在一般情況下,請實行良好的警報安全機制,例如設計解決警報的步驟以及提供 "信息中心" 頁面。
第 8 條規則:了解您的系統對新鮮程度的要求。
如果您使用一天前的模型,效果會降低多少?一周前的模型呢?一個季度前的模型呢?此類消息有助于您了解需要優先監控哪些方面。如果一天不更新模型會對您的產品質量產生嚴重影響,則最好讓工程師持續觀察相關情況。大多數廣告投放系統每天都有新廣告要處理,并且必須每天更新。例如,如果不更新 Google Play 搜索的ML模型,則不到一個月便會產生負面影響。Google+ 熱門信息的某些模型中沒有帖子標識符,因此無需經常導出這些模型。其他具有帖子標識符的模型的更新頻率要高得多。另請注意,新鮮程度會隨著時間而改變,尤其是在向模型中添加特征列或從中移除特征列時。
第 9 條規則:先檢測問題,然后再導出模型。
很多ML系統都會經歷導出模型以應用模型的階段。如果導出的模型存在問題,則是面向用戶的問題。
在導出模型之前,請進行健全性檢查。具體而言,確保模型在處理預留數據方面表現合理。或者說,如果您一直認為數據存在問題,請不要導出模型。很多經常部署模型的團隊在導出模型之前,會先檢查 ROC 曲線下面積(簡稱 AUC)。尚未導出的模型存在問題時,需要發送電子郵件提醒;但面向用戶的模型出現問題時,可能需要通過一個頁面進行宣布。因此,最好先等待檢查完畢并確保萬無一失后再導出模型,以免對用戶造成影響。
第 10 條規則:注意隱藏的問題。
相比其他類型的系統,這種問題更常見于ML系統。假設關聯的特定表格不再更新,那么,ML系統會進行相應調整,其行為仍然會相當好,但會逐漸變糟。有時,您會發現有些表格已有幾個月未更新,只需刷新一下,就可以獲得比相應季度做出的所有其他改進都更有效的效果提升!特征的覆蓋率可能會因實現變化而發生改變:例如,某個特征列可能在 90% 的樣本中得到填充,但該比率突然下降到 60%。Google Play 曾有一個過時 6 個月的表格,但僅刷新了一下該表格,安裝率就提升了 2%。如果您對數據的統計信息進行跟蹤,并不時地手動檢查數據,就可以減少此類失敗。
第 11 條規則:提供特征列的所有者及相關文檔。
如果系統很大,且有很多特征列,則需要知道每個特征列的創建者或維護者。如果您發現了解某個特征列的人要離職,請確保有人知道相關信息。盡管很多特征列都有說明性名稱,但針對特征的含義、來源以及預計提供幫助的方式提供更詳細的說明,是一種不錯的做法。
您的第一個目標
您會關注很多有關系統的指標或測量結果,但通常只能為您的ML算法指定一個目標,即您的算法 "嘗試" 優化的數值。 在這里,我介紹一下目標和指標有何區別:指標是指您的系統報告的任意數字,可能重要,也可能不重要。另請參閱第 2 條規則。
第 12 條規則:選擇直接優化哪個目標時,不要想太多。
您想賺錢,想讓用戶滿意,想讓世界變得更美好。您關注的指標有很多,而且您應該對所有這些指標進行測量(請參閱第 2 條規則)。不過,在早期的ML過程中,您會發現這些指標都呈上升趨勢,甚至那些您沒有選擇直接優化的指標也是如此。例如,假設您關注點擊次數和用戶在網站上停留的時間。如果您優化點擊次數,則用戶在網站上停留的時間很可能也會增加。
所以,當您仍然可以輕松增加所有指標時,保持簡單,不要過多考慮如何在不同的指標間實現平衡。但不要過度使用此規則:不要將您的目標與系統最終的運行狀況相混淆(請參閱第 39 條規則)。此外,如果您發現自己增大了直接優化的指標,但決定不發布系統,則可能需要修改某些目標。
第 13 條規則:為您的第一個目標選擇一個可觀察且可歸因的簡單指標。
您往往并不知道真正的目標是什么。您以為自己知道,但當您盯著數據,對舊系統和新的ML系統進行對比分析時,您發現自己想調整目標。此外,團隊的不同成員通常無法就什么是真正的目標達成一致意見。ML目標應是滿足以下條件的某種目標:易于測量且是 "真正的" 目標的代理。實際上,通常沒有 "真正的" 目標(請參閱第 39 條規則)。因此,請對簡單的ML目標進行訓練,并考慮在頂部添加一個 "策略層",以便您能夠添加其他邏輯(最好是非常簡單的邏輯)來進行最終排名。
要進行建模,最簡單的指標是可直接觀察到且可歸因到系統操作的用戶行為:
用戶是否點擊了此已排名鏈接?
用戶是否下載了此已排名對象?
用戶是否轉發/回復/使用電子郵件發送了此已排名對象?
用戶是否評價了此已排名對象?
用戶是否將此顯示的對象標記為了垃圾郵件/色情內容/攻擊性內容?
避免一開始對間接影響進行建模:
用戶第二天訪問網站了嗎?
用戶在網站上停留了多長時間?
每日活躍用戶數有多少?
其實,間接影響可成為出色的指標,可以在 A/B 測試和發布決策期間使用。
最后,不要試圖讓ML系統弄清楚以下問題:
用戶在使用產品時是否感到滿意?
用戶是否對使用體驗感到滿意?
產品是否提升了用戶的整體滿意度?
這會對公司的整體運行狀況產生什么樣的影響?
所有這些都很重要,但也極難衡量。請改為使用代理指標:如果用戶感到滿意,他們會在網站上停留更長時間。如果用戶感到滿意,他們明天會再次訪問網站。就滿意度和公司運行狀況而言,需要進行人為判斷,以便將任意ML目標與您銷售的產品的性質和業務計劃關聯起來。
第 14 條規則:從可解釋的模型著手可更輕松地進行調試。
線性回歸、邏輯回歸和泊松回歸均由概率模型直接推動。每個預測都可看作是一個概率或預期值。這樣一來,相較于使用目標(0-1 損失、各種合頁損失函數等)以嘗試直接優化分類準確度或對效果進行排名的模型,這種模型更易于進行調試。例如,如果在訓練中得出的概率與采用并排分析方式或通過檢查生產系統的方式預測的概率之間存在偏差,則表明存在問題。
例如,在線性回歸、邏輯回歸或泊松回歸中,有一部分平均預測期望值等于平均標簽值(一階矩校準,或只是校準)的數據。假設您沒有正則化且算法已收斂,那么理論上即是如此,實際上也是差不多這種情形。如果您有一個特征,對于每個樣本來說,其值要么是0,要么是1,則會校準3個特征值為 1 的樣本集。此外,如果您有一個特征,對于每個樣本來說,其值均為 1,則會校準所有樣本集。
借助簡單的模型,您可以更輕松地處理反饋環(請參閱第 36 條規則)。通常情況下,我們會根據這些概率預測來做出決策;例如,以期望值(點擊概率/下載概率等)為標準,按降序對帖子進行排名。但是,請注意,當選擇要使用的模型時,您的決定比模型給出的數據概率更為重要(請參閱第 27 條規則)。
第 15 條規則:在策略層中區分垃圾內容過濾和質量排名。
質量排名是一門藝術,但垃圾內容過濾就像一場戰爭。對于使用您系統的用戶來說,您使用哪些信號來確定高質量帖子將變得顯而易見,而且這些用戶會調整自己的帖子,使其具有高質量帖子的屬性。因此,您的質量排名應側重于對誠實發布的內容進行排名。您不應該因為質量排名學習器將垃圾內容排在前列而對其應用折扣。同樣,"少兒不宜" 的內容也不應該在質量排名中進行處理。垃圾內容過濾則另當別論。您必須明白,需要生成的特征會不斷變化。通常情況下,您會在系統中設置一些明顯的規則(如果一個帖子收到三次以上的垃圾內容舉報,請勿檢索該帖子等等)。所有學習模型都必須至少每天更新。內容創作者的聲譽會發揮很大作用。
在某個層級,必須將這兩個系統的輸出整合在一起。請注意,與過濾電子郵件中的垃圾郵件相比,在過濾搜索結果中的垃圾內容時,可能應該更加主動。這種說法的前提是您沒有正則化且算法已收斂。一般來說大致是這樣。此外,從質量分類器的訓練數據中移除垃圾內容是一種標準做法。
ML第二階段:特征工程
在ML系統生命周期的第一階段,重要的問題涉及以下三個方面:將訓練數據導入學習系統、對任何感興趣的指標進行測量,以及構建應用基礎架構。當您構建了一個端到端的可穩定運行的系統,并且制定了系統測試和單元測試后,就可以進入第二階段了。
第二階段的很多目標很容易實現,且有很多明顯的特征可導入系統。因此,ML的第二階段涉及導入盡可能多的特征,并以直觀的方式將它們組合起來。在這一階段,所有的指標應該仍然呈上升趨勢,您將會多次發布系統,并且非常適合安排多名工程師,以便整合創建真正出色的學習系統所需的所有數據。
第 16 條規則:制定發布和迭代模型計劃。
不要指望您現在正在構建的模型會是您將要發布的最后一個模型,也不要指望您會停止發布模型。因此,請考慮此次發布中增加的復雜性是否會減緩未來版本的發布。很多團隊多年來每季度都會發布一個或多個模型。發布新模型的三個基本原因如下所示:
您將要添加新特征。
您將要調整正則化并以新方式組合舊特征。
您將要調整目標。
無論如何,構建模型時多考慮考慮并沒有什么壞處:查看提供到樣本中的數據有助于發現新信號、舊信號以及損壞的信號。因此,在構建模型時,請考慮添加、移除或重新組合特征的難易程度。考慮創建管道的全新副本以及驗證其正確性的難易程度。考慮是否可以同時運行兩個或三個副本。最后,不必擔心此版本的管道有沒有納入第 16 個特征(共 35 個),下個季度會將其納入。
第 17 條規則:從可直接觀察和報告的特征(而不是經過學習的特征)著手。
這一點可能存在爭議,但可以避免許多問題。首先,我們來介紹一下什么是學習的特征。學習的特征是由外部系統(例如非監督式集群系統)或學習器本身(例如通過因子模型或深度學習)生成的特征。這兩種方式生成的特征都非常有用,但會導致很多問題,因此不應在第一個模型中使用。
如果您使用外部系統創建特征,請注意,外部系統有其自己的目標。外部系統的目標與您當前的目標之間可能僅存在一點點關聯。如果您獲取外部系統的某個瞬間狀態,它可能就會過期。如果您從外部系統更新特征,則特征的含義可能會發生變化。如果您使用外部系統提供特征,請注意,采用這種方法需要非常小心。
因子模型和深度模型的主要問題是,它們是非凸模型。因此,無法保證能夠模擬或找到最優解決方案,且每次迭代時找到的局部最小值可能不同。這種變化導致難以判斷系統發生的某次變化的影響是有意義的還是隨機的。通過創建沒有深度特征的模型,您可以獲得出色的基準效果。達到此基準后,您可以嘗試更深奧的方法。
第 18 條規則:探索可跨情境泛化的內容的特征。
ML系統通常只是更大系統中的一小部分。例如,想象熱門信息中可能會使用的帖子,在其顯示到熱門信息之前,很多用戶已經對其進行 +1、轉發或評論了。如果您將這些統計信息提供給學習器,它就會對在正在優化的情景中沒有數據的新帖子進行推廣。 YouTube 的 "接下來觀看" 可以使用來自 YouTube 搜索的觀看次數或連看次數(觀看完一個視頻后觀看另一個視頻的次數)或明確的用戶評分來推薦內容。最后,如果您將一個用戶操作用作標簽,在其他情境中看到用戶對文檔執行該操作可以是很好的特征。借助所有這些特征,您可以向該情境中引入新內容。請注意,這與個性化無關:先弄清楚是否有人喜歡此情境中的內容,然后再弄清楚喜歡程度。
第 19 條規則:盡可能使用非常具體的特征。
對于海量數據,學習數百萬個簡單的特征比學習幾個復雜的特征更簡單。正在被檢索的文檔的標識符以及規范化的查詢不會提供很多泛化作用,但可以讓您的排名與頻率靠前的查詢的標簽保持一致。因此,請不要害怕具有以下特點的特征組:每個特征適用于您的一小部分數據但總體覆蓋率在 90% 以上。您可以使用正則化來消除適用樣本過少的特征。
第 20 條規則:組合和修改現有特征,以便以簡單易懂的方式創建新特征。
有多種方式可以組合和修改特征。借助 TensorFlow 等ML系統,您可以通過轉換對數據進行預處理。最標準的兩種方法是 "離散化" 和 "組合"。
"離散化" 是指提取一個連續特征,并從中創建許多離散特征。以年齡這一連續特征為例。您可以創建一個年齡不滿 18 周歲時其值為 1 的特征,并創建年齡在 18-35 周歲之間時其值為 1 的另一個特征,等等。不要過多考慮這些直方圖的邊界:基本分位數給您帶來的影響最大。
"組合" 方法是指組合兩個或更多特征列。在 TensorFlow 中,特征列指的是同類特征集(例如,{男性, 女性}、{美國, 加拿大, 墨西哥} 等等)。組合指的是其中包含特征的新特征列,例如,{男性, 女性} × {美國, 加拿大, 墨西哥}。此新特征列將包含特征(男性, 加拿大)。如果您使用的是 TensorFlow,并讓 TensorFlow 為您創建此組合,則此(男性, 加拿大)特征將存在于表示加拿大男性的樣本中。請注意,您需要擁有大量數據,才能使用具有三個、四個或更多基準特征列的組合學習模型。
生成非常大的特征列的組合可能會過擬合。例如,假設您正在執行某種搜索,您的某個特征列包含查詢中的字詞,另一個特征列包含文檔中的字詞。這時,您可以使用 "組合" 方法將這些特征列組合起來,但最終會得到很多特征(請參閱第二十一條規則)。
處理文本時,有兩種備用方法。最嚴苛的方法是點積。點積方法采用最簡單的形式時,僅會計算查詢和文檔間共有字詞的數量。然后將此特征離散化。另一種方法是交集:如果使用交集方法,當且僅當文檔和查詢中都包含 "pony" 一詞時,才會出現一個特征;當且僅當文檔和查詢中都包含 "the" 一詞時,才會出現另一個特征。
第二十一條規則:您可以在線性模型中學習的特征權重數目與您擁有的數據量大致成正比。
關于模型的合適復雜度方面,有各種出色的統計學習理論成果,但您基本上只需要了解這條規則。在某次談話中,曾有人表達過這樣的疑慮:從一千個樣本中是否能夠學到任何東西,或者是否需要超過一百萬個樣本,他們之所以有這樣的疑慮,是因為局限在了一種特定學習方式中。關鍵在于根據數據規模調整您的學習模型:
如果您正在構建搜索排名系統,文檔和查詢中有數百萬個不同的字詞,且您有 1000 個有標簽樣本,那么您應該在文檔和查詢特征、TF-IDF 和多個其他高度手動工程化的特征之間得出點積。您會有 1000 個樣本,十多個特征。
如果您有一百萬個樣本,則使用正則化和特征選擇(可能)使文檔特征列和查詢特征列相交。這樣一來,您將獲得數百萬個特征;但如果使用正則化,則您獲得的特征會有所減少。您會有千萬個樣本,可能會產生十萬個特征。
如果您有數十億或數千億個樣本,您可以使用特征選擇和正則化,通過文檔和查詢標記組合特征列。您會有十億個樣本,一千萬個特征。統計學習理論很少設定嚴格的限制,但能夠提供很好的起點引導。
最后,請根據第 28 條規則決定要使用哪些特征。
第 22 條規則:清理不再使用的特征。
未使用的特征會產生技術負債。如果您發現自己沒有使用某個特征,而且將其與其他特征組合在一起不起作用,則將其從您的基礎架構中刪除。您需要讓自己的基礎架構保持簡潔,以便盡可能快地嘗試最有可能帶來良好效果的特征。如有必要,他人可以隨時將您的特征添加回來。
在決定要添加或保留哪些特征時,要考慮到覆蓋率。即相應特征覆蓋了多少個樣本?例如,如果您有一些個性化特征,但只有 8% 的用戶有個性化特征,那效果就不會很好。
同時,有些特征可能會超出其權重。例如,如果您的某個特征只覆蓋 1% 的數據,但 90% 具有該特征的樣本都是正分類樣本,那么這是一個可以添加的好特征。
對系統的人工分析
在繼續探討ML的第三階段之前,請務必重點了解一下在任何ML課程中都無法學到的內容:如何檢查現有模型并加以改善。這更像是一門藝術而非科學,但是有幾個有必要避免的反模式。
第 23 條規則:您不是典型的最終用戶。
這也許是讓團隊陷入困境的最簡單的方法。雖然 fishfood(在團隊內部使用原型)和 dogfood(在公司內部使用原型)有許多優點,但員工應該看看是否符合性能要求。雖然應避免應用明顯比較糟糕的更改,但在臨近生產時,應對任何看起來比較合理的更改進行進一步測試,具體方法有兩種:請非專業人員在眾包平臺上回答有償問題,或對真實用戶進行在線實驗。
這樣做的原因有如下兩點。首先,您與代碼的關系太密切了。您關注的可能是帖子的某個特定方面,或者您只是投入了太多感情(例如確認偏差)。其次,您的時間很寶貴。考慮一下九名工程師開一個小時會議所花的費用可以在眾包平臺上購買多少簽約的人工標簽。
如果您確實想獲得用戶反饋,請使用用戶體驗方法。在流程的早期階段創建用戶角色(請參閱比爾 - 布克斯頓的 Sketching User Experiences 一書中的描述),然后進行可用性測試(請參閱史蒂夫 - 克魯格的 Don't Make Me Think 一書中的描述)。用戶角色是指創建假想用戶。例如,如果您的團隊成員都是男性,則有必要設計一個 35 歲的女性用戶角色(使用用戶特征完成),并查看其生成的結果,而不是只查看 10 位 25-40 歲男性的結果。在可用性測試中請真實用戶體驗您的網站(通過本地或遠程方式)并觀察他們的反應也可以讓您以全新的視角看待問題。
第 24 條規則:衡量模型間的差異。
在向任何用戶展示您的新模型之前,您可以進行的最簡單(有時也是最有用)的一項衡量是,評估新模型的結果與生產有多大差別。例如,如果您有一項排名任務,則在整個系統中針對一批示例查詢運行這兩個模型,并查看結果的對稱差分有多大(按排名位置加權)。如果差分非常小,那么您無需運行實驗,就可以判斷不會出現很大變化。如果差分很大,那么您需要確保這種更改可以帶來好的結果。查看對稱差分較大的查詢有助于您了解更改的性質。不過,請確保您的系統是穩定的。確保模型與自身之間的對稱差分較低(理想情況下為零)。
第 25 條規則:選擇模型時,實用效果比預測能力更重要。
您的模型可能會嘗試預測點擊率。但歸根到底,關鍵問題在于您用這種預測做什么。如果您使用該預測對文檔進行排名,那么最終排名的質量比預測本身更重要。如果您要預測一個文檔是垃圾內容的概率,然后選擇一個取舍點來確定要阻斷的內容,那么允許的內容的精確率更為重要。大多數情況下,這兩項應該是一致的:當它們不一致時,帶來的優勢可能會非常小。因此,如果某種更改可以改善對數損失,但會降低系統的性能,則查找其他特征。當這種情況開始頻繁發生時,說明您該重新審視模型的目標了。
第 26 條規則:在衡量的錯誤中尋找規律,并創建新特征。
假設您看到模型 "弄錯" 了一個訓練樣本。在分類任務中,這種錯誤可能是假正例,也可能是假負例。在排名任務中,這種錯誤可能是假正例和假負例,其中正例的排名比負例的排名低。最重要的是,ML系統知道自己弄錯了該樣本,如果有機會,它會修復該錯誤。如果您向該模型提供一個允許其修正錯誤的特征,該模型會嘗試使用它。
另一方面,如果您嘗試根據系統不會視為錯誤的樣本創建一個特征,該特征將會被系統忽略。例如,假設用戶在 Play 應用搜索中搜索 "免費游戲"。假設排名靠前的搜索結果中有一個是相關性較低的搞笑應用。因此,您為 "搞笑應用" 創建了一個特征。但是,如果您要最大限度地增加安裝次數,并且用戶在搜索免費游戲時安裝了搞笑應用,那么 "搞笑應用" 特征不會達到您想要的效果。
如果模型弄錯了您的某些樣本,請在當前特征集之外尋找規律。例如,如果系統似乎在降低內容較長的帖子的排名,那么添加帖子長度。不要添加過于具體的特征。如果您要添加帖子長度,請不要試圖猜測長度的具體含義,只需添加十多個特征,然后讓模型自行處理(請參閱第二十一條規則)。這是實現目標最簡單的方式。
第 27 條規則:嘗試量化觀察到的異常行為。
當現有的損失函數沒有捕獲您團隊中的部分成員不喜歡的某些系統屬性時,他們會開始有挫敗感。此時,他們應該竭盡所能將抱怨轉換成具體的數字。例如,如果他們認為 Play 搜索中顯示的 "搞笑應用" 過多,則可以通過人工評分識別搞笑應用。(在這種情況下,您可以使用人工標記的數據,因為相對較少的一部分查詢占了很大一部分流量。)如果您的問題是可衡量的,那么您可以開始將它們用作特征、目標或指標。一般規則是 "先量化,再優化"。
第 28 條規則:請注意,短期行為相同并不意味著長期行為也相同。
假設您的新系統會查看每個 doc_id 和 exact_query,然后計算每個查詢的每個文檔的點擊概率。您發現在并排分析和 A/B 測試中,其行為與您當前系統的行為幾乎完全相同,考慮到它的簡單性,您發布了它。不過,您發現它沒有顯示任何新應用。為什么?那是因為您的系統僅根據自己的查詢歷史記錄顯示文檔,所以不知道應該顯示新文檔。
了解這種系統長期行為的唯一方法是,僅使用模型在線時獲得的數據對其進行訓練。這一點非常難。
訓練 - 應用偏差
訓練 - 應用偏差是指訓練效果與應用效果之間的差異。出現這種偏差的原因可能是:
訓練管道和應用管道中數據的處理方式有差異。
訓練時和應用時所用數據有變化。
模型和算法之間有反饋環。
我們注意到 Google 的生產ML系統也存在訓練 - 應用偏差,這種偏差對性能產生了負面影響。最好的解決方案是明確進行監控,以避免在系統和數據改變時引入容易被忽視的偏差。
第 29 條規則:確保訓練效果和應用效果一樣的最佳方法是,保存在應用時使用的特征集,然后將這些特征通過管道傳輸到日志,以便在訓練時使用。
即使您不能對每個樣本都這樣做,也對一小部分樣本這樣做,以便驗證應用和訓練之間的一致性(請參閱第 37 條規則)。采取了這項措施的 Google 團隊有時會對結果感到驚訝。 YouTube 首頁改用這種在應用時記錄特征的做法后,不僅大大提高了質量,而且減少了代碼復雜度。目前有許多團隊都已經在其基礎設施上采用了這種方法。
第 30 條規則:按重要性對采樣數據加權,不要隨意丟棄它們!
數據過多時,總會忍不住采用前面的文件而忽略后面的文件。這是錯誤的做法。盡管可以丟棄從未向用戶展示過的數據,但對于其他數據來說,按重要性加權是最佳選擇。按重要性加權意味著,如果您決定以 30% 的概率對樣本 X 進行抽樣,那么向其賦予 10/3 的權重。按重要性加權時,您仍然可以使用第 14 條規則中討論的所有校準屬性。
第 31 條規則:如果您在訓練和應用期間關聯表格中的數據,請注意,表格中的數據可能會變化。
假設您將文檔 ID 與包含這些文檔的特征(例如評論次數或點擊次數)的表格相關聯。表格中的特征在訓練時和應用時可能有所不同。那么,您的模型在訓練時和應用時對同一文檔的預測就可能會不同。要避免這類問題,最簡單的方法是在應用時記錄特征(請參閱第 32 條規則)。如果表格只是緩慢發生變化,那么您還可以每小時或每天創建表格快照,以獲得非常接近的數據。請注意,這仍不能完全解決問題。
第 32 條規則:盡可能在訓練管道和應用管道間重復使用代碼。
批處理不同于在線處理。進行在線處理時,您必須在每個請求到達時對其進行處理(例如,您必須為每個查詢單獨進行查找),而進行批處理時,您可以組合任務(例如進行關聯)。應用時,您進行的是在線處理,而訓練時,您進行的是批處理。不過,您可以通過一些方法來重復使用代碼。例如,您可以專門為自己的系統創建一個對象,其中所有查詢結果和關聯都能以非常易于人類讀取的方式進行存儲,且錯誤也可以輕松進行測試。然后,收集了所有信息后,您可以在應用和訓練期間使用一種共同的方法,在人類可讀對象(特定于您的系統)和ML需要的任何格式之間架起一座橋梁。這樣可以消除訓練 - 應用偏差的一個根源。由此推知,在訓練和應用時,盡量不要使用兩種不同的編程語言。如果這樣做,就幾乎不可能共享代碼了。
第 33 條規則:如果您根據 1 月 5 日之前的數據生成模型,則根據 1 月 6 日及之后的數據測試模型。
一般來說,要衡量模型的效果,應使用在訓練模型所有數據對應的日期之后的日期收集的數據,因為這樣能更好地反映系統應用到生產時的行為。如果您根據 1 月 5 日之前的數據生成模型,則根據 1 月 6 日及之后的數據測試模型。您一般會發現,使用新數據時模型的效果不如原來好,但應該不會太糟。由于可能存在的一些日常影響,您可能沒有預測到平均點擊率或轉化率,但曲線下面積(表示正分類樣本的分數高于負分類樣本的概率)應該非常接近。
第 34 條規則:在有關過濾的二元分類(例如,垃圾郵件檢測或確定有趣的電子郵件)中,在短期內小小犧牲一下效果,以獲得非常純凈的數據。
在過濾任務中,標記為負分類的樣本不會向用戶顯示。假設您的過濾器在應用時可屏蔽 75% 的負分類樣本。您可能會希望從向用戶顯示的實例中提取額外的訓練數據。例如,如果用戶將您的過濾器未屏蔽的電子郵件標記為垃圾郵件,那么您可能想要從中學習規律。
但這種方法會引入采樣偏差。如果您改為在應用期間將所有流量的 1% 標記為 "預留",并向用戶發送所有預留樣本,則您可以收集更純凈的數據。現在,過濾器屏蔽了至少 74% 的負分類樣本。這些預留樣本可以成為訓練數據。
請注意,如果過濾器屏蔽了 95% 或以上的負分類樣本,則此方法的可行性會降低。即便如此,如果您希望衡量應用效果,可以進行更低比例的采樣(比如 0.1% 或 0.001%)。一萬個樣本足以非常準確地評估效果。
第 35 條規則:注意排名問題中存在的固有偏差。
當您徹底改變排名算法,導致出現不同的排名結果時,實際上改變了您的算法以后會處理的數據。這時,就會出現固有偏差,您應該圍繞這種偏差來設計模型。具體方法有多種。以下是讓您的模型青睞已見過的數據的方法。
對覆蓋更多查詢的特征(而不是僅覆蓋一個查詢的特征)進行更高的正則化。通過這種方式,模型將青睞專門針對一個或幾個查詢的特征,而不是泛化到所有查詢的特征。這種方法有助于防止十分熱門的查詢結果顯示到不相關的查詢中。請注意,這與以下更為傳統的建議相左:對具有更多唯一值的特征列進行更高的正則化。
僅允許特征具有正權重。這樣一來,就可確保任何好特征都比 "未知" 特征合適。
不選擇只處理文檔數據的特征。這是第一條規則的極端版本。例如,即使指定應用是熱門下載應用(無論查詢是什么),您也不想在所有地方都展示它。如果不選擇只處理文檔數據的特征,這一點很容易做到。您之所以不想在所有地方展示某個特定的熱門應用,是因為讓用戶可以找到所有所需應用至關重要。例如,如果一位用戶搜索 "賞鳥應用",他/她可能會下載 "憤怒的小鳥",但那絕對不是他/她想要的應用。展示此類應用可能會提高下載率,但最終卻未能滿足用戶的需求。
第 36 條規則:通過位置特征避免出現反饋環。
內容的位置會極大地影響用戶與其互動的可能性。如果您將應用放在首位,則應用獲得的點擊率更高,導致您認為用戶更有可能點擊該應用。處理此類問題的一種方法是添加位置特征,即關于內容在網頁中的位置的特征。您可以使用位置特征訓練模型,使模型學習(例如)對特征 "1st-position" 賦予較高的權重。因此,對于具有 "1st-position=true" 特征的樣本的其他因素,模型會賦予較低的權重。然后,在應用時,您不向任何實例提供位置特征,或為所有實例提供相同的默認特征,因為在決定以怎樣的順序顯示候選實例之前,您就對其進行了打分。
請注意,因為訓練和測試之間的這種不對稱性,請務必在位置特征與模型的其余特征之間保持一定的分離性。讓模型成為位置特征函數和其余特征函數之和是理想的狀態。例如,不要將位置特征與任何文檔特征組合在一起。
第 37 條規則:測量訓練 / 應用偏差。
一般來說,很多情況都會引起偏差。此外,您可以將其分為以下幾個部分:
訓練數據和預留數據的效果之間的差異。一般來說,這種情況始終存在,而且并非總是壞事。
預留數據和 "次日" 數據的效果之間的差異。同樣,這種情況始終存在。您應該調整正則化,以最大程度地提升次日數據的效果。不過,如果與預留數據相比,次日數據效果下降明顯,則可能表明某些特征具有時效性,而且可能會降低模型的效果。
"次日" 數據和實時數據的效果之間的差異。如果您將模型應用于訓練數據中的某個樣本,并在應用時使用同一樣本,那么您得到的結果應該完全相同(請參閱第 5 條規則)。因此,此處的差異很可能表示出現了工程錯誤。
ML第三階段:緩慢增長、優化細化和復雜模型
第二階段即將結束時會出現一些信號。首先,月增長開始減弱。您將開始在指標之間做出取舍:在部分試驗中,您會看到一些指標上升了,而另一些指標下降了。情況變得有趣起來。由于越來越難實現增長,因此ML系統必須變得更加復雜。注意:相比之前兩個部分,本部分中會有較多的純理論性規則。我們見過許多團隊在ML的第一階段和第二階段非常滿意。但到了第三階段后,他們必須找到自己的道路。
第 38 條規則:如果目標不協調,并成為問題,就不要在新特征上浪費時間。
當您的衡量結果穩定時,您的團隊會開始關注當前ML系統的目標范圍之外的問題。如前所述,如果現有算法目標未涵蓋產品目標,則您需要修改算法目標或產品目標。例如,您可以優化點擊次數、+1次數或下載次數,但讓發布決策部分依賴于人工評分者。
第 39 條規則:發布決策代表的是長期產品目標。
Alice 有一個關于減少預測安裝次數的邏輯損失的想法。她添加了一個特征。邏輯損失降低了。當她運行在線實驗時,看到安裝率增加了。但是,在發布評審會上,有人指出,每日活躍用戶數減少了 5%。于是,團隊決定不發布該模型。Alice 很失望,但現在她意識到發布決策取決于多個條件,只有一部分條件可以通過ML直接得到優化。
事實上,現實世界并不是網游世界:沒有 "生命值" 來確定產品的運行狀況。團隊必須使用自己收集的統計信息來嘗試有效地預測系統未來的表現會如何。他們需要關注互動度、日活躍用戶數 (DAU)、30 日 DAU、收入以及廣告主的投資回報率。這些可在 A/B 測試中衡量的指標本身僅代表了以下更長期目標:讓用戶滿意、增加用戶數量、讓合作伙伴滿意以及實現盈利,進一步,您還可以認為它們代表了發布優質且實用的產品,以及五年后公司繁榮發展。
唯一可以輕松做出發布決策的情況是,所有指標都在變好(或至少沒有變差)。如果團隊能夠在復雜的ML算法和簡單的啟發式算法之間做出選擇,而對所有這些指標來說,簡單的啟發式算法可以提供更好的效果,那么應該選擇啟發式算法。此外,并未對所有可能的指標值進行明確排名。具體而言,請考慮以下兩種情形:
實驗 | 每日活躍用戶數 | 收入 / 日 |
---|---|---|
A | 100 萬 | 400 萬美元 |
B | 200 萬 | 200 萬美元 |
如果當前系統是 A,那么團隊不太可能會改用 B。如果當前系統是 B,那么團隊不太可能會改用 A。這似乎與理性行為背道而馳;但是,對更改指標的預測可能會成功也可能不會,因此這兩種改變都蘊含著巨大的風險。每個指標都涵蓋了團隊所擔心的一些風險。
此外,沒有一個指標涵蓋團隊最關心的問題,即 "五年后我的產品將何去何從"?
另一方面,個人更傾向于選擇可以直接優化的目標。大多數ML工具也都青睞這樣的環境。在這樣的環境下,快速創建新特征的工程師能穩定地進行一系列發布。一種稱為 "多目標學習" 的ML已開始解決此問題。例如,您可以提出約束滿足問題,對每個指標設定下限,并優化指標的一些線性組合。不過,即使如此,也并不是所有指標都可以輕松框定為ML目標:如果用戶點擊了文檔或安裝了應用,那是因為相應內容展示出來了。但要弄清楚用戶為什么訪問您的網站就難得多。如何預測整個網站未來的成功狀況屬于AI完備問題:與計算機視覺或自然語言處理一樣難。
第 40 條規則:保證集成學習簡單化。
采用原始特征并直接對內容進行排名的統一模型是最易于進行調試和理解的模型。但是,集成學習模型(將其他模型的分數結合到一起的模型)可以實現更好的效果。為了簡單起見,每個模型應該要么是僅接受其他模型的輸入的集成學習模型,要么是接受多個特征的基本模型,但不能兩者皆是。如果在單獨訓練的模型之上還有其他模型,則組合它們會導致不良行為。
使用簡單的模型進行集成學習(僅將 "基本" 模型的輸出作為輸入)。此外,您還需要將屬性強加到這些集成學習模型上。例如,基本模型生成的分數的升高不應使集成學習模型的分數有所降低。另外,如果傳入的模型在語義上可解釋(例如,經過校準),則最理想,因為這樣一來,即使基本模型發生改變,也不會擾亂集成學習模型。另外,強制要求:如果基本分類器的預測概率增大,不會使集成學習模型的預測概率降低。
第 41 條規則:效果達到平穩后,尋找與現有信號有質的差別的新信息源并添加進來,而不是優化現有信號。
您添加了一些有關用戶的受眾特征信息,也添加了一些有關文檔中字詞的信息。您探索了模板,并調整了正則化。但在幾個季度的發布中,關鍵指標的提升幅度從來沒有超過 1%。現在該怎么辦?
是時候開始為截然不同的特征(例如,用戶在過去一天內、一周內或一年內訪問的文檔的歷史記錄,或者其他屬性的數據)構建基礎架構了。您可以使用維基數據條目或公司內部信息(例如,Google 的知識圖譜)。利用深度學習。開始調整您對投資回報的預期,并付出相應的努力。與在任何工程項目中一樣,您必須對添加新特征的好處與增加復雜性的成本進行一番權衡。
第 42 條規則:不要期望多樣性、個性化或相關性與熱門程度之間的聯系有您認為的那樣密切。
一組內容中的多樣性可以有多種含義,其中內容來源的多樣性是最常見的一種。個性化意味著每個用戶獲得貼合其個人需求的結果。相關性意味著某個特定查詢的結果更適合該查詢,而非其他任何查詢。因此,這三個屬性均具有不同于常態的定義。
但常態往往很難被打敗。
請注意,如果您的系統在測量點擊次數、訪問時間、觀看次數、+1 次數、轉發次數等數據,那么您測量的是內容的熱門程度。團隊有時會嘗試學習具備多樣性的個性化模型。為實現個性化,他們會添加支持系統進行個性化(代表用戶興趣的部分特征)或多樣化(表明相應文檔是否與其他返回的文檔有任何相同特征的特征,例如作者或內容)的特征,然后發現這些特征的權重比預期低(或者有時是不同的信號)。
這并不意味著多樣性、個性化或相關性不重要。正如上一條規則中所指出的那樣,您可以進行后期處理來增加多樣性或相關性。如果您看到更長期的目標有所增長,您可以聲明除了熱門程度外,多樣性/相關性也很有價值。然后,您可以繼續采用后期處理方法,也可以根據多樣性或相關性直接修改目標。
第 43 條規則:在不同的產品中,您的好友基本保持不變,但您的興趣并非如此。
Google 的團隊通過以下做法取得了大量進展:采用一個預測產品中某種聯系的緊密程度的模型,并使用該模型對其他產品進行準確預測。您的好友保持不變。另一方面,我曾見過幾個團隊在應對多個產品間的個性化特征時捉襟見肘。是的,當時看起來應該可以奏效的。但現在看來并沒有。有時可以奏效的方法是,使用一個屬性的原始數據來預測另一個屬性的行為。此外,請注意,僅僅是知道用戶有其他屬性的歷史記錄也會有幫助。例如,兩個產品上出現了用戶活動或許本身就可以說明該問題。
-
ML
+關注
關注
0文章
143瀏覽量
34437 -
機器學習
+關注
關注
66文章
8306瀏覽量
131846
原文標題:機器學習43條軍規:解密谷歌機器學習工程最佳實踐
文章出處:【微信號:AI_era,微信公眾號:新智元】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論