1. 程式人生 > >收藏 | Google 釋出關於機器學習工程的最佳實踐

收藏 | Google 釋出關於機器學習工程的最佳實踐

文章來自TensorFlow,作者Google,本文件旨在幫助已掌握機器學習基礎知識的人員從 Google 機器學習的最佳實踐中受益。它介紹了一種機器學習樣式,類似於 Google C++ 樣式指南和其他常用的實用程式設計指南。如果您學習過機器學習方面的課程,或者擁有機器學習模型的構建或開發經驗,則具備閱讀本文件所必需的背景知識。

術語

在我們討論有效的機器學習的過程中,會反覆提到下列術語:

  • 例項:要對其進行預測的事物。例如,例項可以是一個網頁,您希望將其分類為"與貓相關"或"與貓無關"。

  • 標籤:預測任務的答案,它可以是由機器學習系統生成的答案,也可以是訓練資料中提供的正確答案。例如,某個網頁的標籤可能是"與貓相關"。

  • 特徵:預測任務中使用的例項的屬性。例如,某個網頁可能具有"包含字詞'貓'"這一特徵。

  • 特徵列:一組相關特徵,例如使用者可能居住的所有國家/地區的集合。樣本的特徵列中可能包含一個或多個特徵。"特徵列"是 Google 專用的術語。特徵列在 Yahoo/Microsoft 使用的 VM 系統中被稱為"名稱空間"或場。

  • 樣本:一個例項(及其特徵)和一個標籤。

  • 模型:預測任務的統計表示法。您使用樣本訓練一個模型,然後使用該模型進行預測。

  • 指標:您關心的一個數值。也許(但不一定)可以直接得到優化。

  • 目標:演算法嘗試優化的一種指標。

  • 管道:機器學習演算法的基礎架構。管道包括從前端收集資料、將資料放入訓練資料檔案、訓練一個或多個模型以及將模型運用到生產環境。

  • 點選率:點選廣告中的連結的網頁訪問者所佔的百分比。

概覽

要打造優質的產品:

請把自己看成是一位出色的工程師,而不是一位機器學習專家。

實際上,您將面臨的大部分問題都是工程問題。即使在使用出色的機器學習專家掌握的所有資源的情況下,大多數收穫也是由合適的特徵(而非精確的機器學習演算法)帶來的。所以,進行機器學習的基本方法是:

  1. 確保管道從頭到尾都穩固可靠。

  2. 從制定合理的目標開始。

  3. 以簡單的方式新增常識性特徵。

  4. 確保管道始終穩固可靠。

上述方法將在長時間內取得很好的效果。只要您仍然可以通過某種簡單的技巧取得進展,就不應該偏離上述方法。增加複雜性會減緩未來版本的釋出。

當您充分利用了所有的簡單技巧,或許就到了探索機器學習最前沿技術的時候了。請參閱第三階段的"機器學習專案"部分。

本文件結構如下:

  1. 第一部分可幫助您瞭解構建機器學習系統的時機是否已經成熟。

  2. 第二部分介紹瞭如何部署第一個管道。

  3. 第三部分介紹了在向管道新增新特徵時如何進行釋出和迭代、如何評估模型,以及如何應對訓練-應用偏差。

  4. 最後一部分介紹了當您達到穩定階段時該怎麼做。

  5. 之後是相關資源列表和附錄,附錄針對多次作為示例在本文件中提及的系統,提供了一些背景資訊。

在進行機器學習之前

第 1 條規則:不要害怕釋出未採用機器學習技術的產品。

機器學習技術很酷,但它需要資料。從理論上講,您可以採用來自其他問題的資料,然後針對新產品調整模型,但其效果很可能不如基本的啟發式演算法。如果您認為機器學習技術能為您帶來 100% 的提升,那麼啟發式演算法可為您帶來 50% 的提升。

例如,如果您要對應用市場中的應用進行排名,則可以將安裝率或安裝次數作為啟發式演算法指標。如果您要檢測垃圾郵件,則可以濾除以前傳送過垃圾郵件的釋出商。此外,也不要害怕手動修改。如果您需要對聯絡人進行排名,可以按使用聯絡人的時間順序由近及遠對其排序(或按字母順序排序)。如果您的產品並非必須使用機器學習技術,則在獲得足夠的資料之前,請勿使用該技術。

第 2 條規則:首先設計並實現指標。

在正式確定機器學習系統的功能之前,儘可能在當前系統中跟蹤指標的值。這樣做的原因如下:

  1. 提前行動有助於更輕鬆地從系統的使用者獲得授權。

  2. 如果您認為將來可能需要考慮某個方面,最好立即開始收集相關歷史資料。

  3. 如果您在設計系統時考慮到指標測量,將來會省下很多力氣。具體而言,您不希望自己以後在日誌中苦苦查詢字串以測量指標!

  4. 您將發現哪些內容發生了變化以及哪些內容始終未變。例如,假設您希望直接優化單日活躍使用者數。但是,在早期操縱系統的過程中,您可能會發現使用者體驗的顯著改變並沒有使該指標發生明顯變化。

Google+ 團隊會衡量每次閱讀的展開次數、 轉發次數、+1 次數、評論次數,以及每位使用者的評論次數、轉發次數等,然後在應用模型時利用這些資料來衡量帖子的質量。另請注意,實驗框架非常重要,您必須在實驗框架中將使用者分組為多個分桶,並按實驗彙總統計資訊。 請參閱第 12 條規則。

通過以更加自由的方式收集指標,您可以更加全面地瞭解您的系統。發現問題了?新增指標對其進行跟蹤!對上個版本中發生的一些量變激動不已?新增指標對其進行跟蹤!

第 3 條規則:選擇機器學習技術而非複雜的啟發式演算法。

簡單的啟發式演算法有利於推出產品。但複雜的啟發式演算法難以維護。當您獲得足夠的資料並基本確定自己要嘗試實現的目標後,請考慮使用機器學習技術。與大多數軟體工程任務一樣,您需要不斷更新方法(無論是啟發式演算法還是機器學習模型),而且您會發現機器學習模型更易於更新和維護(請參閱第 16 條規則)。

機器學習第一階段:您的第一個管道

重點關注第一個管道的系統基礎架構。雖然展望您將要進行的創新性機器學習的方方面面是一件很有趣的事,但如果您不先確認管道的可靠性,則很難弄清楚所發生的情況。

第 4 條規則:確保第一個模型簡單易用,並正確實施基礎架構。

第一個模型可以最有效地提升您的產品質量,因此不需要花哨,簡單易用即可。但是,您會遇到很多預料之外的基礎架構問題。在公開推出您精心構建的新機器學習系統之前,您必須確定以下幾點:

  • 如何為您的學習演算法獲取樣本。

  • 初步確定對於您的系統來說,"好"和"壞"的定義是什麼。

  • 如何將模型整合到應用中。您可以線上應用模型,也可以離線使用樣本對模型進行預計算,並將結果儲存在表格中。例如,您可能需要對網頁進行預分類並將結果儲存在表格中,但也可能需要線上對聊天訊息進行分類。

選擇簡單的特徵可以更輕鬆地確保:

  • 將這些特徵正確應用於您的學習演算法。

  • 模型學習出合理的權重。

  • 將這些特徵正確應用於伺服器端。

當您有了能可靠做到上述三點的系統時,則表示您已完成大部分工作。簡單的模型可為您提供基準指標和基準行為,您可以利用這些指標和行為測試更復雜的模型。某些團隊以"中性"作為首次釋出的目標 - 在首次釋出時明確淡化機器學習成果,以避免分心。

第 5 條規則:撇開機器學習,單獨測試基礎架構。

確保基礎架構可測試,且對系統的學習部分進行封裝,以便測試這些部分之外的方方面面。具體而言:

  1. 測試資料匯入演算法的效果。檢查應填充的特徵列是否已填充。在隱私權許可的情況下,手動檢查輸入到訓練演算法的資料。如果可能的話,檢視管道中的統計資訊,並與在其他地方處理的相同資料的統計資訊進行比較。

  2. 測試從訓練演算法得出模型的效果。確保訓練環境中的模型與應用環境中的模型給出的分數相同(請參閱第 37 條規則)。

機器學習具有不可預測性,因此要有用於訓練環境和應用環境中建立樣本的程式碼的測試;並確保您可以在應用期間載入和使用固定模型。此外,瞭解您的資料至關重要:請參閱分析大型複雜資料集的實用建議。

第 6 條規則:複製管道時注意丟棄的資料。

通常,我們通過複製現有管道來建立新管道(即貨物崇拜程式設計),且舊管道會丟棄一些新管道需要的資料。例如,Google+ 熱門資訊的管道會丟棄時間較早的帖子(因為它會不斷嘗試對最新的帖子進行排名)。此管道被複制用於 Google+ 資訊流,在資訊流中,時間較早的帖子仍然有意義,但舊管道仍會丟棄它們。另一種常見模式是僅記錄使用者看到的資料。因此,如果我們想要對使用者看不到特定帖子的原因進行建模,此類資料就毫無用處,因為管道已丟棄所有負分類樣本。Play 中也曾出現過類似的問題。在處理 Play 應用首頁時,建立了一個新管道,其中還包含來自 Play 遊戲著陸頁的樣本,但無任何特徵可區分各個樣本的來源。

第 7 條規則:將啟發式演算法轉變為特徵或在外部處理它們。

通常,機器學習嘗試解決的問題並不是全新的問題。有一個現有的系統,它可用於排名、分類,或解決您正嘗試解決的任何問題。這意味著有多種規則和啟發式演算法。使用機器學習進行調整後,此類啟發式演算法可為您提供便利。 您應該挖掘自己的啟發式演算法,瞭解它們所包含的任何資訊,原因有以下兩點。首先,向機器學習系統的過渡會更平穩。其次,這些規則通常包含大量您不願意丟棄的關於系統的直覺資訊。您可以通過以下四種方法使用現有啟發式演算法:

  • 使用啟發式演算法進行預處理。如果特徵非常好,則可以選擇執行此操作。例如,在垃圾郵件過濾器中,如果發件人已被列入黑名單,則不要試圖重新學習"已列入黑名單"的含義。遮蔽該郵件即可。這種方法最適合在二元分類任務中使用。

  • 建立特徵。直接通過啟發式演算法建立特徵是一種很好的做法。例如,如果您使用啟發式演算法來計算查詢結果的相關性分數,則可以將此分數納為一個特徵的值。您日後可能想要使用機器學習技術調整該值(例如,將該值轉換為一個有限離散值組中的一個,或與其他特徵相組合),但是首先請使用啟發式演算法生成的原始值。

  • 挖掘啟發式演算法的原始輸入。如果某個應用啟發式演算法結合了安裝次數、文字中的字元數以及星期值,考慮將這些內容拆分開來,並作為輸入單獨提供給學習演算法。部分適用於整合學習的技巧也適用於此(請參閱第 40 條規則)。

  • 修改標籤。當您感覺啟發式演算法會獲取當前標籤中未包含的資訊時,可以選擇進行此操作。例如,如果您正在嘗試最大程度地增加下載次數,但同時也想要優質的內容,則可能的解決方案是用標籤乘以應用獲得的平均星數。您可以非常靈活地修改標籤。請參閱"您的第一個目標"。

在機器學習系統中使用啟發式演算法時,請務必留意是否會帶來額外的複雜性。在新的機器學習演算法中使用舊啟發式演算法有助於實現平穩過渡,但思考下是否有可以達到相同效果的更簡單的方法。

掃碼備註“技術交流”,或新增微信x123z123xy,加入技術圈子一起學習進步!

監控

在一般情況下,請實行良好的警報安全機制,例如設計解決警報的步驟以及提供"資訊中心"頁面。

第 8 條規則:瞭解您的系統對新鮮程度的要求。

如果您使用一天前的模型,效果會降低多少?一週前的模型呢?一個季度前的模型呢?此類訊息有助於您瞭解需要優先監控哪些方面。如果一天不更新模型會對您的產品質量產生嚴重影響,則最好讓工程師持續觀察相關情況。大多數廣告投放系統每天都有新廣告要處理,並且必須每天更新。例如,如果不更新 Google Play 搜尋的機器學習模型,則不到一個月便會產生負面影響。Google+ 熱門資訊的某些模型中沒有帖子識別符號,因此無需經常匯出這些模型。其他具有帖子識別符號的模型的更新頻率要高得多。另請注意,新鮮程度會隨著時間而改變,尤其是在向模型中新增特徵列或從中移除特徵列時。

第 9 條規則:先檢測問題,然後再匯出模型。

很多機器學習系統都會經歷匯出模型以應用模型的階段。如果匯出的模型存在問題,則是面向使用者的問題。

在匯出模型之前,請進行健全性檢查。具體而言,確保模型在處理預留資料方面表現合理。或者說,如果您一直認為資料存在問題,請不要匯出模型。很多經常部署模型的團隊在匯出模型之前,會先檢查 ROC 曲線下面積(簡稱 AUC)。尚未匯出的模型存在問題時,需要傳送電子郵件提醒;但面向使用者的模型出現問題時,可能需要通過一個頁面進行宣佈。 因此,最好先等待檢查完畢並確保萬無一失後再匯出模型,以免對使用者造成影響。

第 10 條規則:注意隱藏的問題。

相比其他型別的系統,這種問題更常見於機器學習系統。假設關聯的特定表格不再更新,那麼,機器學習系統會進行相應調整,其行為仍然會相當好,但會逐漸變糟。有時,您會發現有些表格已有幾個月未更新,只需重新整理一下,就可以獲得比相應季度做出的所有其他改進都更有效的效果提升!特徵的覆蓋率可能會因實現變化而發生改變:例如,某個特徵列可能在 90% 的樣本中得到填充,但該比率突然下降到 60%。Google Play 曾有一個過時 6 個月的表格,但僅重新整理了一下該表格,安裝率就提升了 2%。如果您對資料的統計資訊進行跟蹤,並不時地手動檢查資料,就可以減少此類失敗。

第 11 條規則:提供特徵列的所有者及相關文件。

如果系統很大,且有很多特徵列,則需要知道每個特徵列的建立者或維護者。如果您發現瞭解某個特徵列的人要離職,請確保有人知道相關資訊。儘管很多特徵列都有說明性名稱,但針對特徵的含義、來源以及預計提供幫助的方式提供更詳細的說明,是一種不錯的做法。

您的第一個目標

您會關注很多有關係統的指標或測量結果,但通常只能為您的機器學習演算法指定一個目標,即您的演算法"嘗試"優化的數值。 在這裡,我介紹一下目標和指標有何區別:指標是指您的系統報告的任意數字,可能重要,也可能不重要。另請參閱第 2 條規則。

第 12 條規則:選擇直接優化哪個目標時,不要想太多。

您想賺錢,想讓使用者滿意,想讓世界變得更美好。您關注的指標有很多,而且您應該對所有這些指標進行測量(請參閱第 2 條規則)。不過,在早期的機器學習過程中,您會發現這些指標都呈上升趨勢,甚至那些您沒有選擇直接優化的指標也是如此。例如,假設您關注點選次數和使用者在網站上停留的時間。如果您優化點選次數,則使用者在網站上停留的時間很可能也會增加。

所以,當您仍然可以輕鬆增加所有指標時,保持簡單,不要過多考慮如何在不同的指標間實現平衡。但不要過度使用此規則:不要將您的目標與系統最終的執行狀況相混淆(請參閱第 39 條規則)。此外,如果您發現自己增大了直接優化的指標,但決定不釋出系統,則可能需要修改某些目標

第 13 條規則:為您的第一個目標選擇一個可觀察且可歸因的簡單指標。

您往往並不知道真正的目標是什麼。您以為自己知道,但當您盯著資料,對舊系統和新的機器學習系統進行對比分析時,您發現自己想調整目標。此外,團隊的不同成員通常無法就什麼是真正的目標達成一致意見。機器學習目標應是滿足以下條件的某種目標:易於測量且是"真正的"目標的代理。實際上,通常沒有"真正的"目標(請參閱第 39 條規則)。因此,請對簡單的機器學習目標進行訓練,並考慮在頂部新增一個"策略層",以便您能夠新增其他邏輯(最好是非常簡單的邏輯)來進行最終排名。

要進行建模,最簡單的指標是可直接觀察到且可歸因到系統操作的使用者行為:

  • 使用者是否點選了此已排名連結?

  • 使用者是否下載了此已排名物件?

  • 使用者是否轉發/回覆/使用電子郵件傳送了此已排名物件?

  • 使用者是否評價了此已排名物件?

  • 使用者是否將此顯示的物件標記為了垃圾郵件/色情內容/攻擊性內容?

避免一開始對間接影響進行建模:

  • 使用者第二天訪問網站了嗎?

  • 使用者在網站上停留了多長時間?

  • 每日活躍使用者數有多少?

其實,間接影響可成為出色的指標,可以在 A/B 測試和釋出決策期間使用。

最後,不要試圖讓機器學習系統弄清楚以下問題:

  • 使用者在使用產品時是否感到滿意?

  • 使用者是否對使用體驗感到滿意?

  • 產品是否提升了使用者的整體滿意度?

  • 這會對公司的整體執行狀況產生什麼樣的影響?

所有這些都很重要,但也極難衡量。請改為使用代理指標:如果使用者感到滿意,他們會在網站上停留更長時間。如果使用者感到滿意,他們明天會再次訪問網站。就滿意度和公司執行狀況而言,需要進行人為判斷,以便將任意機器學習目標與您銷售的產品的性質和業務計劃關聯起來。

第 14 條規則:從可解釋的模型著手可更輕鬆地進行除錯。

線性迴歸、邏輯迴歸和泊松迴歸均由概率模型直接推動。每個預測都可看作是一個概率或預期值。這樣一來,相較於使用目標(0-1 損失、各種合頁損失函式等)以嘗試直接優化分類準確度或對效果進行排名的模型,這種模型更易於進行除錯。例如,如果在訓練中得出的概率與採用並排分析方式或通過檢查生產系統的方式預測的概率之間存在偏差,則表明存在問題。

例如,線上性迴歸、邏輯迴歸或泊松迴歸中,有一部分平均預測期望值等於平均標籤值(一階矩校準,或只是校準)的資料。假設您沒有正則化且演算法已收斂,那麼理論上即是如此,實際上也是差不多這種情形。如果您有一個特徵,對於每個樣本來說,其值要麼是 0,要麼是 1,則會校準 3 個特徵值為 1 的樣本集。此外,如果您有一個特徵,對於每個樣本來說,其值均為 1,則會校準所有樣本集。

藉助簡單的模型,您可以更輕鬆地處理反饋環(請參閱第 36 條規則)。通常情況下,我們會根據這些概率預測來做出決策;例如,以期望值(點選概率/下載概率等)為標準,按降序對帖子進行排名。 但是,請注意,當選擇要使用的模型時,您的決定比模型給出的資料概率更為重要(請參閱第 27 條規則)。

掃碼備註“技術交流”,或新增微信x123z123xy,加入技術圈子一起學習進步!

第 15 條規則:在策略層中區分垃圾內容過濾和質量排名。

質量排名是一門藝術,但垃圾內容過濾就像一場戰爭。對於使用您系統的使用者來說,您使用哪些訊號來確定高質量帖子將變得顯而易見,而且這些使用者會調整自己的帖子,使其具有高質量帖子的屬性。因此,您的質量排名應側重於對誠實發布的內容進行排名。您不應該因為質量排名學習器將垃圾內容排在前列而對其應用折扣。同樣,"少兒不宜"的內容也不應該在質量排名中進行處理。 垃圾內容過濾則另當別論。您必須明白,需要生成的特徵會不斷變化。通常情況下,您會在系統中設定一些明顯的規則(如果一個帖子收到三次以上的垃圾內容舉報,請勿檢索該帖子等等)。所有學習模型都必須至少每天更新。內容創作者的聲譽會發揮很大作用。

在某個層級,必須將這兩個系統的輸出整合在一起。請注意,與過濾電子郵件中的垃圾郵件相比,在過濾搜尋結果中的垃圾內容時,可能應該更加主動。這種說法的前提是您沒有正則化且演算法已收斂。一般來說大致是這樣。此外,從質量分類器的訓練資料中移除垃圾內容是一種標準做法。

機器學習第二階段:特徵工程

在機器學習系統生命週期的第一階段,重要的問題涉及以下三個方面:將訓練資料匯入學習系統、對任何感興趣的指標進行測量,以及構建應用基礎架構。當您構建了一個端到端的可穩定執行的系統,並且制定了系統測試和單元測試後,就可以進入第二階段了。

第二階段的很多目標很容易實現,且有很多明顯的特徵可匯入系統。因此,機器學習的第二階段涉及匯入儘可能多的特徵,並以直觀的方式將它們組合起來。在這一階段,所有的指標應該仍然呈上升趨勢,您將會多次釋出系統,並且非常適合安排多名工程師,以便整合建立真正出色的學習系統所需的所有資料。

第 16 條規則:制定釋出和迭代模型計劃。

不要指望您現在正在構建的模型會是您將要釋出的最後一個模型,也不要指望您會停止釋出模型。因此,請考慮此次釋出中增加的複雜性是否會減緩未來版本的釋出。很多團隊多年來每季度都會發佈一個或多個模型。釋出新模型的三個基本原因如下所示:

  • 您將要新增新特徵。

  • 您將要調整正則化並以新方式組合舊特徵。

  • 您將要調整目標。