本文來源:《Rules of Machine Learning:Best Practices for ML Engineering》
作者:Martin Zinkevich ?google 研究科學(xué)家。
這是Martin Zinkevich在NIPS 2016 Workshop 分享的谷歌機(jī)器學(xué)習(xí)實(shí)踐的四十三條法則。
術(shù)語
實(shí)體(Instance):要對(duì)其進(jìn)行預(yù)測(cè)的事物
標(biāo)簽(Label):預(yù)測(cè)任務(wù)的結(jié)果
特征:在預(yù)測(cè)任務(wù)中用到的實(shí)體的一個(gè)屬性
特征集(feature Column):相關(guān)特征的一個(gè)集合
樣例(Example):實(shí)體(及它的特征)和標(biāo)簽的集合
模型(Model):關(guān)于一個(gè)預(yù)測(cè)任務(wù)的一個(gè)統(tǒng)計(jì)表示。在樣例中訓(xùn)練一個(gè)模型,然后用這個(gè)模型來預(yù)測(cè)
指標(biāo)(metric):你關(guān)心的一些東西。有可能直接優(yōu)化。
目標(biāo)(Objective):你的算法嘗試去優(yōu)化的一個(gè)指標(biāo)
工作流(pipeline):關(guān)于一個(gè)機(jī)器學(xué)習(xí)算法所有的基礎(chǔ)構(gòu)件。包括從前端收集數(shù)據(jù),將數(shù)據(jù)輸入訓(xùn)練數(shù)據(jù)文件,訓(xùn)練一個(gè)或者更多模型,以及將模型導(dǎo)出用于生產(chǎn)。?
概述
要想創(chuàng)造出優(yōu)秀的產(chǎn)品:
你需要以一位優(yōu)秀工程師的身份去運(yùn)用機(jī)器學(xué)習(xí),而不是作為一位偉大的機(jī)器學(xué)習(xí)專家(而事實(shí)上你并不是)。
事實(shí)上,你所面臨的大多數(shù)問題都是技術(shù)性問題。即便擁有足以媲美機(jī)器學(xué)習(xí)專家的理論知識(shí)。要想有所突破,大多數(shù)情況下都在依賴示例良好特征而非優(yōu)秀的機(jī)器學(xué)習(xí)算法。因此,基本方法如下:
1.確保你的 工作流 各連接端十分可靠
2. 樹立合理的目標(biāo)
3. 添加的常識(shí)性特征盡量簡單
4. 確保你的 工作流 始終可靠
這種方法能帶來相當(dāng)多的盈利,也能在較長時(shí)間里令許多人都滿意,甚至還可能實(shí)現(xiàn)雙贏。只有在簡單技巧不發(fā)揮任何作用的情況下,才考慮使用復(fù)雜的一些的方法。方法越復(fù)雜,產(chǎn)品最終輸出速度慢。
當(dāng)所有的簡單技巧用完后,很可能就要考慮最前沿機(jī)器學(xué)習(xí)術(shù)了。
本文檔主要由四部分組成:
第一部分:幫助你明白是否到了需要構(gòu)建一個(gè)機(jī)器學(xué)習(xí)系統(tǒng)
第二部分:部署你的第一個(gè)工作流
第三部分:往工作流增加新特征時(shí)的發(fā)布和迭代,以及如何評(píng)價(jià)模型和訓(xùn)練-服務(wù)傾斜(training-serving shew)
第四部分:達(dá)到穩(wěn)定階段后該繼續(xù)做什么。
在機(jī)器學(xué)習(xí)之前
法則1:不用害怕發(fā)布一款沒有用到機(jī)器學(xué)習(xí)的產(chǎn)品
機(jī)器學(xué)習(xí)很酷,但它需要數(shù)據(jù)。如果不是絕對(duì)需要機(jī)器學(xué)習(xí),那在沒有數(shù)據(jù)前,不要使用它。
法則2:將度量標(biāo)準(zhǔn)的設(shè)計(jì)和執(zhí)行置于首位
在定義你的機(jī)器學(xué)習(xí)系統(tǒng)將要做什么前,盡可能的記錄你當(dāng)前的系統(tǒng)“足跡”。原因:
1、在早期,獲得系統(tǒng)用戶的許可相對(duì)容易.
2、如果你認(rèn)為某些事在將來會(huì)重要,那么最好是從現(xiàn)在開始就收集歷史數(shù)據(jù)
3、如果你設(shè)計(jì)系統(tǒng)時(shí),就已經(jīng)在心里有度量指標(biāo),那么將來一切就會(huì)更加的順暢。特別是你肯定不想為了測(cè)量你的指標(biāo)而需要在日志中執(zhí)行g(shù)rep。
4、你能夠注意到什么改變了,什么沒有變。比如,假如你想要直接優(yōu)化每日活躍用戶。但是,在你早期對(duì)系統(tǒng)的管理中,你可能注意到對(duì)用戶體驗(yàn)的急劇改變,可能并不會(huì)明顯的改變這個(gè)指標(biāo)。
Google Plus團(tuán)隊(duì)測(cè)量“轉(zhuǎn)發(fā)數(shù)”(expands per read)、分享數(shù)(reshares per read)、點(diǎn)贊數(shù)(plus-ones per read)、評(píng)論/閱讀比(comments/read)、每個(gè)用戶的評(píng)論數(shù)、每個(gè)用戶的分享數(shù)等。這些用來在服務(wù)時(shí)間衡量一篇帖子的質(zhì)量。同樣,有一個(gè)能夠?qū)⒂脩艟鄢山M,并實(shí)驗(yàn)生成統(tǒng)計(jì)結(jié)果的實(shí)驗(yàn)框架很重要。見法則12
法則3:在機(jī)器學(xué)習(xí)和啟發(fā)式方法中優(yōu)先選擇機(jī)器學(xué)習(xí)。
機(jī)器學(xué)習(xí)模型更好更新和更容易管理
機(jī)器學(xué)習(xí)階段1:第一條工作流
認(rèn)真對(duì)待第一條工作流的基礎(chǔ)架構(gòu)建設(shè)。雖然發(fā)揮想象力構(gòu)思模型很有意思,但首先得確保你的工作流是可靠的,這樣出了問題才容易發(fā)現(xiàn)。
法則4:第一個(gè)模型要簡單,基礎(chǔ)架構(gòu)要正確。
第一個(gè)模型對(duì)你的產(chǎn)品提高最大,因此它不需要有多神奇。相反,你會(huì)碰到比你想象的多的基礎(chǔ)架構(gòu)方面的問題。在別人使用你的神奇的新機(jī)器學(xué)習(xí)系統(tǒng)前,你要決定:
1、如何為學(xué)習(xí)算法得到樣本
2、對(duì)于你的系統(tǒng),“好”、“壞”的定義是什么
3、如何在你的應(yīng)用中融入你的模型。你可以在線應(yīng)用你的模型,也可以在離線預(yù)先計(jì)算好模型,然后將結(jié)果保存到表中。比如,你可能想要預(yù)分類網(wǎng)頁并將結(jié)果存入表,也有可能你想直接在線上分類聊天信息。
選擇簡單的特征,以能夠更容易確保:
1、這些特征正確應(yīng)用于學(xué)習(xí)算法
2、模型能夠?qū)W習(xí)到合理的權(quán)重
3、這些特征正確應(yīng)用于服務(wù)器模型。
你的系統(tǒng)如果能夠可靠地遵守這三點(diǎn),你就完成了大多數(shù)工作。你的簡單模型能夠提供基準(zhǔn)指標(biāo)和基準(zhǔn)行為,你可以用來測(cè)量更加復(fù)雜的模型。
法則5:單獨(dú)測(cè)試基礎(chǔ)架構(gòu)。
確?;A(chǔ)架構(gòu)是可測(cè)試的。系統(tǒng)的學(xué)習(xí)部分獨(dú)立封裝,因此所有圍繞它的都能測(cè)試。
法則6:復(fù)制工作流時(shí)留意丟失的數(shù)據(jù)
我們有時(shí)候會(huì)通過復(fù)制已經(jīng)存在的工作流來創(chuàng)建一個(gè)新的工作流。在新的工作流中需要的數(shù)據(jù),很可能在舊的數(shù)據(jù)流就丟棄了。比如,僅僅記錄那些用戶看到過的帖子的數(shù)據(jù),那么,如果我們想要建?!盀槭裁匆黄囟ǖ奶記]有被用戶閱讀”時(shí),這些數(shù)據(jù)就沒用了。
法則7:要么把啟發(fā)式方法轉(zhuǎn)化為特征,要么在外部處理它們
機(jī)器學(xué)習(xí)嘗試解決的問題通常并不完全是新的。可以利用到很多已有的規(guī)則和啟發(fā)式方法。當(dāng)你調(diào)整機(jī)器學(xué)習(xí)時(shí),這些相同的啟發(fā)式方法能提供非常有用的幫助。
監(jiān)控
一般來說,實(shí)施良好的警報(bào)監(jiān)控,例如使警報(bào)可操作并具有報(bào)表頁面。
法則8:了解系統(tǒng)的新鮮度要求
如果系統(tǒng)是一天前的,性能會(huì)降低多少?如果是一個(gè)星期前,或者1個(gè)季度前的呢? 知道這些能夠幫助你理解監(jiān)控的優(yōu)先級(jí)。如果模型一天未更新,你的收入會(huì)下降10%,那最好是有個(gè)工程師持續(xù)不斷的關(guān)注。大多數(shù)廣告服務(wù)系統(tǒng)每天都有新廣告要處理,因此必須每日更新。有些需要頻繁更新,有些又不需要,這因不同的應(yīng)用和場(chǎng)景而定。此外,新鮮度也會(huì)因時(shí)間而異,特別是你的模型會(huì)增加或移除特征時(shí)。
法則9:導(dǎo)出(發(fā)布)你的模型前,務(wù)必檢查各種問題
將模型導(dǎo)出部署到線上服務(wù)。如果這個(gè)時(shí)候,你的模型出了問題,這就是一個(gè)用戶看到的問題。但如果是在之前出現(xiàn)問題,那就是一個(gè)訓(xùn)練問題,用戶并不會(huì)發(fā)現(xiàn)。
在導(dǎo)出模型前務(wù)必進(jìn)行完整性的檢查。特別是要確保對(duì)留存的數(shù)據(jù),你的模型能夠滿足性能。如果對(duì)數(shù)據(jù)感覺有問題,就不用導(dǎo)出模型!很多持續(xù)部署模型的團(tuán)隊(duì)都會(huì)在導(dǎo)出前檢測(cè)AUC。模型問題出現(xiàn)在導(dǎo)出前,會(huì)收到警告郵件,但如果模型問題讓用戶碰到,就可能需要一紙辭退信了。因此,在影響用戶前,最好先等一等,有確定把握后,在導(dǎo)出。
法則10:注意隱藏性失敗
相對(duì)其他類型的系統(tǒng),機(jī)器學(xué)習(xí)系統(tǒng)出現(xiàn)這種問題的可能性更高。比如關(guān)聯(lián)的某張表不再更新。雖然機(jī)器學(xué)習(xí)還是會(huì)照樣調(diào)整,行為還是表現(xiàn)的很合適,但已經(jīng)在逐漸衰落。有時(shí)候發(fā)現(xiàn)了那些已經(jīng)數(shù)月沒有更新的表,那這個(gè)時(shí)候,一個(gè)簡單的更新要比其他任何改變都能更好的提高性能。比如,由于實(shí)現(xiàn)的改變,一個(gè)特征的覆蓋率會(huì)變:比如,開始覆蓋90%的樣本,突然只能覆蓋60%了。google Play做過一個(gè)實(shí)驗(yàn),有張表6個(gè)月一直不變,僅僅是對(duì)這個(gè)表更新,就在安裝率方面提高了2%。跟蹤數(shù)據(jù)的統(tǒng)計(jì),并且在必要的時(shí)候人工檢查,你就可以減少這樣的錯(cuò)誤。
法則11:給特征指定作者和文檔
如果系統(tǒng)很大,有很多的特征,務(wù)必要知道每個(gè)特征的創(chuàng)建者或者管理者。如果理解特征的人要離職,務(wù)必確保有其他人理解這個(gè)特征。盡管很多的特征的名字已基本描述了特征的意義,但對(duì)特征有更新詳細(xì)的描述,比如,它的來源以及其他它能提供什么幫助等,那就更好了。
你的第一個(gè)目標(biāo)
對(duì)于你的系統(tǒng),你有很多關(guān)心的指標(biāo)。但對(duì)于你的機(jī)器學(xué)習(xí)算法,通常你需要一個(gè)單一目標(biāo)——你的算法“嘗試”去優(yōu)化的數(shù)字。指標(biāo)和目標(biāo)的區(qū)別是:指標(biāo)是你的系統(tǒng)報(bào)告的任何數(shù)字。這可能重要,也可能不重要。
法則12:不要過分思考你選擇直接優(yōu)化的目標(biāo)
你有成千上萬關(guān)心的指標(biāo),這些指標(biāo)也值得你去測(cè)試。但是,在機(jī)器學(xué)習(xí)過程的早期,你會(huì)發(fā)現(xiàn),即使你并沒有直接去優(yōu)化,他們也都會(huì)上升。比如,你關(guān)心點(diǎn)擊次數(shù),停留時(shí)間以及每日活躍用戶數(shù)。如果僅優(yōu)化了點(diǎn)擊次數(shù),通常也會(huì)看到停留時(shí)間增加了。
所以,當(dāng)提高所有的指標(biāo)都不難的時(shí)候,就沒必要花心思來如何權(quán)衡不同的指標(biāo)。不過過猶不及:不要混淆了你的目標(biāo)和系統(tǒng)的整體健康度。
法則13:為你的第一個(gè)目標(biāo)選擇一個(gè)簡單、可觀察以及可歸因的指標(biāo)
有時(shí)候你自以為你清楚真實(shí)的目標(biāo),但隨著你對(duì)數(shù)據(jù)的觀察,對(duì)老系統(tǒng)和新的機(jī)器學(xué)習(xí)系統(tǒng)的分析,你會(huì)發(fā)現(xiàn)你又想要調(diào)整。而且,不同的團(tuán)隊(duì)成員對(duì)于真實(shí)目標(biāo)并不能達(dá)成一致。機(jī)器學(xué)習(xí)的目標(biāo)必須是能很容易測(cè)量的,并且一定是“真實(shí)”目標(biāo)的代言。因此,在簡單的機(jī)器學(xué)習(xí)目標(biāo)上訓(xùn)練,并創(chuàng)建一個(gè)“決策層”,以允許你在上面增加額外的邏輯(這些邏輯,越簡單越好)來形成最后的排序。
最容易建模的是那些可以直接觀察并可歸屬到系統(tǒng)的某個(gè)動(dòng)作的用戶行為:
1.排序的鏈接被點(diǎn)擊了嗎?
2.排序的物品被下載了嗎?
3.排序的物品被轉(zhuǎn)發(fā)/回復(fù)/郵件訂閱了嗎?
4.排序的物品被評(píng)價(jià)了嗎?
5.展示的物品是否被標(biāo)注為垃圾/色情/暴力?
最開始要避免對(duì)間接效果建模:
1.用戶第2天會(huì)來訪嗎?
2.用戶訪問時(shí)間是多長?
3.每日活躍用戶是什么樣的?
間接效果是非常重要的指標(biāo),在A/B test和發(fā)布決定的時(shí)候可以使用。
最后,不要試圖讓機(jī)器學(xué)習(xí)來回答以下問題:
1.用戶使用你的產(chǎn)品是否開心
2.用戶是否有滿意的體驗(yàn)
3.產(chǎn)品是否提高了用戶的整體幸福感
4.這些是否影響了公司的整體健康度
這些都很重要,但太難評(píng)估了。與其如此,不如考慮其他代替的:比如,用戶如果高興,那停留時(shí)間就應(yīng)該更長。如果用戶滿意,他就會(huì)再次造訪。
法則14:從一個(gè)可解釋的模型開始,使調(diào)試更容易。
線性回歸,邏輯回歸和泊松回歸直接由概率模型激發(fā)。每個(gè)預(yù)測(cè)可解釋為概率或期望值。這使得他們比那些使用目標(biāo)來直接優(yōu)化分類準(zhǔn)確性和排序性能的模型要更容易調(diào)試。比如,如果訓(xùn)練時(shí)的概率和預(yù)測(cè)時(shí)的概率,或者生產(chǎn)系統(tǒng)上的查看到的概率有偏差,那說明存在某種問題。
比如在線性,邏輯或者泊松回歸中,存在數(shù)據(jù)子集,其中平均預(yù)測(cè)期望等于平均標(biāo)記(1-力矩校準(zhǔn)或剛剛校準(zhǔn))。如果有一個(gè)特征對(duì)于每個(gè)樣例,取值要么為1,有么為0,那為1的那些樣例就是校準(zhǔn)的。同樣,如如果都為1,那所有樣例都是校準(zhǔn)的。
通常我們會(huì)使用這些概率預(yù)測(cè)來做決策:比如,按期望值(比如,點(diǎn)擊/下載等的概率)對(duì)貼排序。但是,要記住,當(dāng)?shù)搅艘獩Q定選擇使用哪個(gè)模型的時(shí)候,決策就不僅僅是關(guān)于提供給模型的數(shù)據(jù)的概率性了。
法則15:在決策層區(qū)分垃圾過濾和質(zhì)量排名
質(zhì)量排名是一門藝術(shù),而垃圾過濾是一場(chǎng)戰(zhàn)爭。那些使用你系統(tǒng)的人非常清楚你采用什么來評(píng)價(jià)一篇帖子的質(zhì)量,所以他們會(huì)想盡辦法來使得他們的帖子具有這些屬性。因此,質(zhì)量排序應(yīng)該關(guān)注對(duì)哪些誠實(shí)發(fā)布的內(nèi)容進(jìn)行排序。如果將垃圾郵件排高名次,那質(zhì)量排序?qū)W習(xí)器就大打折扣。同理也要將粗俗的內(nèi)容從質(zhì)量排序中拿出分開處理。垃圾過濾就是另外一回事。你必須考慮到要生成的特征會(huì)經(jīng)常性的改變。你會(huì)輸入很多明顯的規(guī)則到系統(tǒng)中。至少要保證你的模型是每日更新的。同時(shí),要重點(diǎn)考慮內(nèi)容創(chuàng)建者的信譽(yù)問題。
機(jī)器學(xué)習(xí)階段二:特征工程
將訓(xùn)練數(shù)據(jù)導(dǎo)入學(xué)習(xí)系統(tǒng)、完成相關(guān)感興趣指標(biāo)的評(píng)估記錄以及搭建服務(wù)架構(gòu),這些都是機(jī)器學(xué)習(xí)系統(tǒng)生命周期的第一階段非常重要的任務(wù)。當(dāng)已經(jīng)具有一個(gè)可工作的端對(duì)端系統(tǒng),并且構(gòu)建了單元測(cè)試和系統(tǒng)測(cè)試,那么,就進(jìn)入階段二了。
在第二階段,有很多可以很容易就取得的成果。有很多明顯能加入系統(tǒng)的特征。因此,在機(jī)器學(xué)習(xí)的第二階段會(huì)涉及到導(dǎo)入盡可能多的特征,并且以最直觀地方式組合它們。在此階段,所有指標(biāo)應(yīng)該仍然在上升。將會(huì)經(jīng)常性的發(fā)版。這將是一個(gè)偉大的時(shí)刻,在這個(gè)階段能夠吸引很多的工程師來融合所有想要的數(shù)據(jù)來創(chuàng)建一個(gè)了不起的學(xué)習(xí)系統(tǒng)
法則16:做好發(fā)布和迭代的計(jì)劃
不要期望現(xiàn)在發(fā)布的這個(gè)模型是最后。因此,考慮你給當(dāng)前這個(gè)模型增加的復(fù)雜度會(huì)不會(huì)減慢后續(xù)的發(fā)布。很多團(tuán)隊(duì)一個(gè)季度,甚至很多年才發(fā)布一個(gè)模型。以下是應(yīng)該發(fā)布新模型的三個(gè)基本原因:
1.會(huì)不斷出現(xiàn)新的特征
2..您正在以新的方式調(diào)整規(guī)則化和組合舊特征,或者
3.你正在調(diào)整目標(biāo)。
無論如何,對(duì)一個(gè)模型多點(diǎn)投入總是好的:看看數(shù)據(jù)反饋示例可以幫助找到新的、舊的以及壞的信號(hào)。 因此,當(dāng)你構(gòu)建你的模型時(shí),想想添加,刪除或重組特征是不是很容易。 想想創(chuàng)建工作流的新副本并驗(yàn)證其正確性是不是很容易。 考慮是否可能有兩個(gè)或三個(gè)副本并行運(yùn)行。 最后,不要擔(dān)心35的特征16是否會(huì)進(jìn)入此版本的工作流(Finally,don't worry about whether feature 16 of 35 makes it into this version of the pipeline.)。 這些,你都會(huì)在下個(gè)季度得到。
法則17:優(yōu)先考慮哪些直接觀察到和可記錄的特征,而不是那些習(xí)得的特征。
首先,什么是習(xí)得特征?所謂習(xí)得特征,就是指外部系統(tǒng)(比如一個(gè)無監(jiān)督聚類系統(tǒng))生成的特征,或者是學(xué)習(xí)器自己生成的特征(比如,通過分解模型或者深度學(xué)習(xí))。這些特征都有用,但涉及到太多問題,因此不建議在第一個(gè)模型中使用。
如果你使用外部系統(tǒng)來創(chuàng)建一個(gè)特征,切記這個(gè)系統(tǒng)本身是有自己目標(biāo)的。而它的目標(biāo)很可能和你目前的目標(biāo)不相關(guān)。這個(gè)外部系統(tǒng)可能已經(jīng)過時(shí)了。如果你從外部 系統(tǒng)更新特征,很可能這個(gè)特征的含義已經(jīng)改變。使用外部系統(tǒng)提供的特征,一定要多加小心。
分解模型和深度學(xué)習(xí)模型最主要的問題是它們是非凸的。因此不能找到最優(yōu)解,每次迭代找到的局部最小都不同。這種不同讓人很難判斷一個(gè)對(duì)系統(tǒng)的影響到底是有意義的,還是只是隨機(jī)的。一個(gè)沒有深?yuàn)W特征的模型能夠帶來非常好的基準(zhǔn)性能。只有當(dāng)這個(gè)基準(zhǔn)實(shí)現(xiàn)后,才考慮更深?yuàn)W的方法。
法則18:從不同的上下文環(huán)境中提取特征
通常情況下,機(jī)器學(xué)習(xí)只占到一個(gè)大系統(tǒng)中的很小一部分,因此你必須要試著從不同角度審視一個(gè)用戶行為。比如熱門推薦這一場(chǎng)景,一般情況下論壇里“熱門推薦”里的帖子都會(huì)有許多評(píng)論、分享和閱讀量,如果利用這些統(tǒng)計(jì)數(shù)據(jù)對(duì)模型展開訓(xùn)練,然后對(duì)一個(gè)新帖子進(jìn)行優(yōu)化,就有可能使其成為熱門帖子。另一方面,YouTube上自動(dòng)播放的下一個(gè)視頻也有許多選擇,例如可以根據(jù)大部分用戶的觀看順序推薦,或者根據(jù)用戶評(píng)分推薦等。總之,如果你將一個(gè)用戶行為用作模型的標(biāo)記(label),那么在不同的上下文條件下審視這一行為,可能會(huì)得到更豐富的特征(feature),也就更利于模型的訓(xùn)練。需要注意的是這與個(gè)性化不同:個(gè)性化是確定用戶是否在特定的上下文環(huán)境中喜歡某一內(nèi)容,并發(fā)現(xiàn)哪些用戶喜歡,喜歡的程度如何。
法則19:盡量選擇更具體的特征
在海量數(shù)據(jù)的支持下,即使學(xué)習(xí)數(shù)百萬個(gè)簡單的特征也比僅僅學(xué)習(xí)幾個(gè)復(fù)雜的特征要容易實(shí)現(xiàn)。由于被檢索的文本標(biāo)識(shí)與規(guī)范化的查詢并不會(huì)提供太多的歸一化信息,只會(huì)調(diào)整頭部查詢中的標(biāo)記排序。因此你不必?fù)?dān)心雖然整體的數(shù)據(jù)覆蓋率高達(dá)90%以上,但針對(duì)每個(gè)特征組里的單一特征卻沒有多少訓(xùn)練數(shù)據(jù)可用的情況。另外,你也可以嘗試正則化的方法來增加每個(gè)特征所對(duì)應(yīng)的樣例數(shù)。
法則20:以合理的方式組合、修改現(xiàn)有的特征
有很多組合和修改特征的方式。類似TensorFlow的機(jī)器學(xué)習(xí)系統(tǒng)能夠通過‘transformations’(轉(zhuǎn)換)來預(yù)處理數(shù)據(jù)。最基本的兩種方式是:“離散化”(discretizations)和“交叉”(crosses)
離散化:將一個(gè)值為連續(xù)的特征拆分成很多獨(dú)立的特征。比如年齡,1~18作為1個(gè)特征,18~35作為1個(gè)特征等等。不要過分考慮邊界,通?;镜姆治稽c(diǎn)就能達(dá)到最好。
交叉:合并多個(gè)特征。在TensorFlow的術(shù)語中,特征欄是一組相似的特征,比如{男性,女性},{美國,加拿大,墨西哥}等。這里的交叉是指將兩個(gè)或多個(gè)特征欄合并,例如{男性,女性}×{美國,加拿大,墨西哥}的結(jié)果就是一個(gè)交叉(a cross),也就構(gòu)成了一個(gè)新的特征欄。假設(shè)你利用TensorFlow框架創(chuàng)建了這樣一個(gè)交叉,其中也就包含了{(lán)男性,加拿大}的特征,因此這一特征也就會(huì)出現(xiàn)在男性加拿大人的樣例中。需要注意的是,交叉方法中合并的特征欄越多,所需要的訓(xùn)練數(shù)據(jù)量就越大。
如果通過交叉法生成的特征欄特別龐大,那么就可能引起過擬合。
例如,假設(shè)你正在進(jìn)行某種搜索,并且在查詢請(qǐng)求和文檔中都具有一個(gè)包含關(guān)鍵字的特征欄。那么假如你選擇用交叉法組合這兩個(gè)特征欄,這樣得到的新特征欄就會(huì)非常龐大,它內(nèi)部包含了許多特征。當(dāng)這種情況發(fā)生在文本搜索場(chǎng)景時(shí),有兩種可行的應(yīng)對(duì)方法。最常用的是點(diǎn)乘法(dot product),點(diǎn)乘法最常見的處理方式就是統(tǒng)計(jì)查詢請(qǐng)求和文檔中共同的所有特征詞,然后對(duì)特征離散化。另一個(gè)方法是交集(intersection),比如當(dāng)且僅當(dāng)關(guān)鍵詞同時(shí)出現(xiàn)在文檔和查詢結(jié)果中時(shí),我們才能獲取所需的特征。
法則21:通過線性模型學(xué)到的特征權(quán)重的數(shù)目,大致與數(shù)據(jù)量成正比
許多人都認(rèn)為從一千個(gè)樣例中并不能得到什么可靠的訓(xùn)練結(jié)果,或者由于選擇了某種特定的模型,就必須獲取一百萬個(gè)樣例,否則就沒法展開模型訓(xùn)練。這里需要指出的是,數(shù)據(jù)量的大小是和需要訓(xùn)練的特征數(shù)正相關(guān)的:
1) 假如你在處理一個(gè)搜索排名問題,文檔和查詢請(qǐng)求中包含了數(shù)百萬個(gè)不同的關(guān)鍵詞,并且有一千個(gè)被標(biāo)記的樣例,那么你應(yīng)該用上文提到的點(diǎn)乘法處理這些特征。這樣就能得到一千個(gè)樣例,對(duì)應(yīng)了十幾個(gè)特征。
2) 如你有一百萬個(gè)樣例,那么通過正則化和特征選擇的方式就可以交叉處理文檔和查詢請(qǐng)求中的特征欄,這可能會(huì)產(chǎn)生數(shù)百萬的特征數(shù),但再次使用正則化可以大大減少冗余特征。這樣就可能得到一千萬個(gè)樣例,對(duì)應(yīng)了十萬個(gè)特征。
3) 如果你有數(shù)十億或數(shù)百億個(gè)樣例,那同樣可以通過特征選擇或正則化的方法交叉處理文檔和查詢請(qǐng)求中的特征欄。這樣就可能得到十億個(gè)樣例,對(duì)應(yīng)了一千萬個(gè)特征。
法則22:清理不再需要的特征
不再使用的特征,在技術(shù)上就是一個(gè)累贅。如果一個(gè)特征不再使用,并且也沒辦法和其他的特征組合,那就清理掉!你必須確保系統(tǒng)清潔,以滿足能盡可能快的嘗試最有希望得出結(jié)果的特征。對(duì)于那些清理掉的,如果有天需要,也可以再加回來。
至于保持和添加什么特征,權(quán)衡的一個(gè)重要指標(biāo)是覆蓋率。比如,如果某些特征只覆蓋了8%的用戶,那保留還是不保留都不會(huì)帶來什么影響。
另一方面,增刪特征時(shí)也要考慮其對(duì)應(yīng)的數(shù)據(jù)量。例如你有一個(gè)只覆蓋了1%數(shù)據(jù)的特征,但有90%的包含這一特征的樣例都通過了訓(xùn)練,那么這就是一個(gè)很好的特征,應(yīng)該添加。
對(duì)系統(tǒng)的人工分析
在進(jìn)入機(jī)器學(xué)習(xí)第三階段前,有一些在機(jī)器學(xué)習(xí)課程上學(xué)習(xí)不到的內(nèi)容也非常值得關(guān)注:如何檢測(cè)一個(gè)模型并改進(jìn)它。這與其說是門科學(xué),還不如說是一門藝術(shù)。這里再介紹幾種要避免的反模式(anti-patterns)
法則23:你并不是一個(gè)典型的終端用戶
這可能是讓一個(gè)團(tuán)隊(duì)陷入困境的最簡單的方法。雖然fishfooding(只在團(tuán)隊(duì)內(nèi)部使用原型)和dogfooding(只在公司內(nèi)部使用原型)都有許多優(yōu)點(diǎn),但無論哪一種,開發(fā)者都應(yīng)該首先確認(rèn)這種方式是否符合性能要求。要避免使用一個(gè)明顯不好的改變,同時(shí),任何看起來合理的產(chǎn)品策略也應(yīng)該進(jìn)一步的測(cè)試,不管是通過讓非專業(yè)人士來回答問題,還是通過一個(gè)隊(duì)真實(shí)用戶的線上實(shí)驗(yàn)。這樣做的原因主要有兩點(diǎn):
首先,你離實(shí)現(xiàn)的代碼太近了。你只會(huì)看到帖子的特定的一面,或者你很容易受到情感影響(比如,認(rèn)知性偏差)。
其次,作為開發(fā)工程師,時(shí)間太寶貴。并且有時(shí)候還沒什么效果。
如果你真的想要獲取用戶反饋,那么應(yīng)該采用用戶體驗(yàn)法(user experience methodologies)。在流程早期創(chuàng)建用戶角色(詳情見Bill Buxton的《Designing User ExperienCES》一書),然后進(jìn)行可用性測(cè)試(詳情見Steve Krug的《Do not Make Me Think》一書)。這里的用戶角色涉及創(chuàng)建假想用戶。例如,如果你的團(tuán)隊(duì)都是男性,那設(shè)計(jì)一個(gè)35歲的女性用戶角色所帶來的效果要比設(shè)計(jì)幾個(gè)25~40歲的男性用戶的效果強(qiáng)很多。當(dāng)然,讓用戶實(shí)測(cè)產(chǎn)品并觀察他們的反應(yīng)也是很不錯(cuò)的方法。
法則24:測(cè)量模型間的差異
在將你的模型發(fā)布上線前,一個(gè)最簡單,有時(shí)也是最有效的測(cè)試是比較你當(dāng)前的模型和已經(jīng)交付的模型生產(chǎn)的結(jié)果之間的差異。如果差異很小,那不再需要做實(shí)驗(yàn),你也知道你這個(gè)模型不會(huì)帶來什么改變。如果差異很大,那就要繼續(xù)確定這種改變是不是好的。檢查對(duì)等差分很大的查詢能幫助理解改變的性質(zhì)(是變好,還是變壞)。但是,前提是一定要確保你的系統(tǒng)是穩(wěn)定的。確保一個(gè)模型和它本身比較,這個(gè)差異很小(理想情況應(yīng)該是無任何差異)。
法則25:選擇模型的時(shí)候,實(shí)用的性能要比預(yù)測(cè)能力更重要
你可能會(huì)用你的模型來預(yù)測(cè)點(diǎn)擊率(CTR)。當(dāng)最終的關(guān)鍵問題是你要使用你的預(yù)測(cè)的場(chǎng)景。如果你用來對(duì)文本排序,那最終排序的質(zhì)量可不僅僅是預(yù)測(cè)本身。如果你用來排查垃圾文件,那預(yù)測(cè)的精度顯然更重要。大多數(shù)情況下,這兩類功能應(yīng)該是一致的,如果他們存在不一致,則意味著系統(tǒng)可能存在某種小增益。因此,假如一個(gè)改進(jìn)措施可以解決日志丟失的問題,但卻造成了系統(tǒng)性能的下降,那就不要采用它。當(dāng)這種情況頻繁發(fā)生時(shí),通常應(yīng)該重新審視你的建模目標(biāo)。
法則26:從誤差中查找新模式、創(chuàng)建新特征
假設(shè)你的模型在某個(gè)樣例中預(yù)測(cè)錯(cuò)誤。在分類任務(wù)中,這可能是誤報(bào)或漏報(bào)。在排名任務(wù)中,這可能是一個(gè)正向判斷弱于逆向判斷的組。但更重要的是,在這個(gè)樣例中機(jī)器學(xué)習(xí)系統(tǒng)知道它錯(cuò)了,需要修正。如果你此時(shí)給模型一個(gè)允許它修復(fù)的特征,那么模型將嘗試自行修復(fù)這個(gè)錯(cuò)誤。
另一方面,如果你嘗試基于未出錯(cuò)的樣例創(chuàng)建特征,那么該特征將很可能被系統(tǒng)忽略。例如,假設(shè)在谷歌Play商店的應(yīng)用搜索中,有人搜索“免費(fèi)游戲”,但其中一個(gè)排名靠前的搜索結(jié)果卻是一款其他App,所以你為其他App創(chuàng)建了一個(gè)特征。但如果你將其他App的安裝數(shù)最大化,即人們?cè)谒阉髅赓M(fèi)游戲時(shí)安裝了其他App,那么這個(gè)其他App的特征就不會(huì)產(chǎn)生其應(yīng)有的效果。
所以,正確的做法是一旦出現(xiàn)樣例錯(cuò)誤,那么應(yīng)該在當(dāng)前的特征集之外尋找解決方案。例如,如果你的系統(tǒng)降低了內(nèi)容較長的帖子的排名,那就應(yīng)該普遍增加帖子的長度。而且也不要拘泥于太具體的細(xì)節(jié)。例如你要增加帖子的長度,就不要猜測(cè)長度的具體含義,而應(yīng)該直接添加幾個(gè)相關(guān)的特征,交給模型自行處理,這才是最簡單有效的方法。
法則27:嘗試量化觀察到的異常行為
有時(shí)候團(tuán)隊(duì)成員會(huì)對(duì)一些沒有被現(xiàn)有的損失函數(shù)覆蓋的系統(tǒng)屬性感到無能為力,但這時(shí)抱怨是沒用的,而是應(yīng)該盡一切努力將抱怨轉(zhuǎn)換成實(shí)實(shí)在在的數(shù)字。比如,如果應(yīng)用檢索展示了太多的不好應(yīng)用,那就應(yīng)該考慮人工評(píng)審來識(shí)別這些應(yīng)用。如果問題可以量化,接下來就可以將其用作特征、目標(biāo)或者指標(biāo)??傊?,先量化,再優(yōu)化
法則28:注意短期行為和長期行為的差別
假設(shè)你有一個(gè)新系統(tǒng),它可以查看每個(gè)doc_id和exact_query,然后根據(jù)每個(gè)文檔的每次查詢行為計(jì)算其點(diǎn)擊率。你發(fā)現(xiàn)它的行為幾乎與當(dāng)前系統(tǒng)的并行和A/B測(cè)試結(jié)果完全相同,而且它很簡單,于是你啟動(dòng)了這個(gè)系統(tǒng)。卻沒有新的應(yīng)用顯示,為什么?由于你的系統(tǒng)只基于自己的歷史查詢記錄顯示文檔,所以不知道應(yīng)該顯示一個(gè)新的文檔。
要了解一個(gè)系統(tǒng)在長期行為中如何工作的唯一辦法,就是讓它只基于當(dāng)前的模型數(shù)據(jù)展開訓(xùn)練。這一點(diǎn)非常困難。
離線訓(xùn)練和實(shí)際線上服務(wù)間的偏差
引起這種偏差的原因有:
1)訓(xùn)練工作流和服務(wù)工作流處理數(shù)據(jù)的方式不一樣;
2)訓(xùn)練和服務(wù)使用的數(shù)據(jù)不同;
3)算法和模型間循的一個(gè)循環(huán)反饋。
法則29:確保訓(xùn)練和實(shí)際服務(wù)接近的最好方式是保存服務(wù)時(shí)間時(shí)使用到的那些特征,然后在后續(xù)的訓(xùn)練中采用這些特征
即使你不能對(duì)每個(gè)樣例都這樣做,做一小部分也比什么也不做好,這樣你就可以驗(yàn)證服務(wù)和訓(xùn)練之間的一致性(見規(guī)則37)。在谷歌采取了這項(xiàng)措施的團(tuán)隊(duì)有時(shí)候會(huì)對(duì)其效果感到驚訝。比如YouTube主頁在服務(wù)時(shí)會(huì)切換到日志記錄特征,這不僅大大提高了服務(wù)質(zhì)量,而且減少了代碼復(fù)雜度。目前有許多團(tuán)隊(duì)都已經(jīng)在其基礎(chǔ)設(shè)施上采用了這種策略。
法則30:給抽樣數(shù)據(jù)按重要性賦權(quán)重,不要隨意丟棄它們
當(dāng)數(shù)據(jù)太多的時(shí)候,總會(huì)忍不住想要丟棄一些,以減輕負(fù)擔(dān)。這絕對(duì)是個(gè)錯(cuò)誤。有好幾個(gè)團(tuán)隊(duì)就因?yàn)檫@樣,而引起了不少問題(見規(guī)則6)。盡管那些從來沒有展示給用戶的數(shù)據(jù)的確可以丟棄,但對(duì)于其他的數(shù)據(jù),最好還是對(duì)重要性賦權(quán)。比如如果你絕對(duì)以30%的概率對(duì)樣例X抽樣,那最后給它一個(gè)10/3的權(quán)重。使用重要性加權(quán)并不影響規(guī)則14中討論的校準(zhǔn)屬性。
法則31:注意在訓(xùn)練和服務(wù)時(shí)都會(huì)使用的表中的數(shù)據(jù)是可能變化的
因?yàn)楸碇械奶卣骺赡軙?huì)改變,在訓(xùn)練時(shí)和服務(wù)時(shí)的值不一樣,這會(huì)造成,哪怕對(duì)于相同的文章,你的模型在訓(xùn)練時(shí)預(yù)測(cè)的結(jié)果和服務(wù)時(shí)預(yù)測(cè)的結(jié)果都會(huì)不一樣。避免這類問題最簡單的方式是在服務(wù)時(shí)將特征寫入日志(參閱法則32)。如果表的數(shù)據(jù)變化的緩慢,你也可以通過每小時(shí)或者每天給表建快照的方式來保證盡可能接近的數(shù)據(jù)。但這也不能完全解決這種問題。
法則32:盡量在訓(xùn)練工作流和服務(wù)工作流間重用代碼
首先需要明確一點(diǎn):批處理和在線處理并不一樣。在線處理中,你必須及時(shí)處理每一個(gè)請(qǐng)求(比如,必須為每個(gè)查詢單獨(dú)查找),而批處理,你可以合并完成。服務(wù)時(shí),你要做的是在線處理,而訓(xùn)練是批處理任務(wù)。盡管如此,還是有很多可以重用代碼的地方。比如說,你可以創(chuàng)建特定于系統(tǒng)的對(duì)象,其中的所有聯(lián)結(jié)和查詢結(jié)果都以人類可讀的方式存儲(chǔ),錯(cuò)誤也可以被簡單地測(cè)試。然后,一旦在服務(wù)或訓(xùn)練期間收集了所有信息,你就可以通過一種通用方法在這個(gè)特定對(duì)象和機(jī)器學(xué)習(xí)系統(tǒng)需要的格式之間形成互通,訓(xùn)練和服務(wù)的偏差也得以消除。因此,盡量不要在訓(xùn)練時(shí)和服務(wù)時(shí)使用不同的變成語言,畢竟這樣會(huì)讓你沒法重用代碼。
法則33:訓(xùn)練采用的數(shù)據(jù)和測(cè)試采用的數(shù)據(jù)不同(比如,按時(shí)間上,如果你用1月5日前的所有的數(shù)據(jù)訓(xùn)練,那測(cè)試數(shù)據(jù)應(yīng)該用1月6日及之后的)
通常,在評(píng)測(cè)你的模型的時(shí)候,采用你訓(xùn)練時(shí)用的數(shù)據(jù)之后生成的數(shù)據(jù)能更好反映實(shí)際線上的結(jié)果。因?yàn)榭赡艽嬖诿咳招?yīng)(daily effects),你可能沒有預(yù)測(cè)實(shí)際的點(diǎn)擊率和轉(zhuǎn)化率。但AUC應(yīng)該是接近的。
法則34:在二進(jìn)制分類過濾的應(yīng)用場(chǎng)景中(例如垃圾郵件檢測(cè)),不要為了純凈的數(shù)據(jù)做太大的性能犧牲
一般在過濾應(yīng)用場(chǎng)景中,反面樣例并不會(huì)對(duì)用戶展示。不過假如你的過濾器在服務(wù)過程中阻止了75%的反面樣例,那么你可能需要從向用戶顯示的實(shí)例中提取額外的訓(xùn)練數(shù)據(jù)并展開訓(xùn)練。比如說,用戶將系統(tǒng)認(rèn)可的郵件標(biāo)記為垃圾郵件,那么你可能就需要從中學(xué)習(xí)。
但這種方法同時(shí)也引入了采樣偏差。如果改為在服務(wù)期間將所有流量的1%標(biāo)記為“暫?!?,并將所有這樣的樣例發(fā)送給用戶,那你就能收集更純凈的數(shù)據(jù)?,F(xiàn)在你的過濾器阻止了至少74%的反面樣例,這些樣例可以成為訓(xùn)練數(shù)據(jù)。
需要注意的是,如果你的過濾器阻止了95%或更多的反面樣例,那這種方法可能就不太適用。不過即使如此,如果你想衡量服務(wù)的性能,可以選擇做出更細(xì)致的采樣(例如0.1%或0.001%),一萬個(gè)例子足以準(zhǔn)確地估計(jì)性能。
法則35:注意排序問題的固有偏差
當(dāng)你徹底改變排序算法時(shí),一方面會(huì)引起完全不同的排序結(jié)果,另一方面也可能在很大程度上改變算法未來可能要處理的數(shù)據(jù)。這會(huì)引入一些固有偏差,因此你必須事先充分認(rèn)識(shí)到這一點(diǎn)。以下這些方法可以有效幫你優(yōu)化訓(xùn)練數(shù)據(jù)。
1.對(duì)涵蓋更多查詢的特征進(jìn)行更高的正則化,而不是那些只覆蓋單一查詢的特征。這種方式使得模型更偏好那些針對(duì)個(gè)別查詢的特征,而不是那些能夠泛化到全部查詢的特征。這種方式能夠幫助阻止非常流行的結(jié)果進(jìn)入不相關(guān)查詢。這點(diǎn)和更傳統(tǒng)的建議不一樣,傳統(tǒng)建議應(yīng)該對(duì)更獨(dú)特的特征集進(jìn)行更高的正則化。
2.只允許特征具有正向權(quán)重,這樣一來就能保證任何好特征都會(huì)比未知特征合適。
3.不要有那些僅僅偏文檔(document-only)的特征。這是法則1的極端版本。比如,不管搜索請(qǐng)求是什么,即使一個(gè)給定的應(yīng)用程序是當(dāng)前的熱門下載,你也不會(huì)想在所有地方都顯示它。沒有僅僅偏文檔類特征,這會(huì)很容易實(shí)現(xiàn)。
法則36:避免具有位置特征的反饋回路
內(nèi)容的位置會(huì)顯著影響用戶與它交互的可能性。很明顯,如果你把一個(gè)App置頂,那它一定會(huì)更頻繁地被點(diǎn)擊。處理這類問題的一個(gè)有效方法是加入位置特征,即關(guān)于頁面中的內(nèi)容的位置特征。假如你用位置類特征訓(xùn)練模型,那模型就會(huì)更偏向“1st-position”這類的特征。因而對(duì)于那些“1st-position”是True的樣例的其他因子(特征),你的模型會(huì)賦予更低的權(quán)重。而在服務(wù)的時(shí)候,你不會(huì)給任何實(shí)體位置特征,或者你會(huì)給他們所有相同的默認(rèn)特征。因?yàn)樵谀銢Q定按什么順序排序展示前,你已經(jīng)給定了候選集。
切記,將任何位置特征和模型的其他特征保持一定的分離是非常重要的。因?yàn)槲恢锰卣髟谟?xùn)練和測(cè)試時(shí)不一樣。理想的模型是位置特征函數(shù)和其他特征的函數(shù)的和。比如,不要將位置特征和文本特征交叉。
法則37:測(cè)量訓(xùn)練/服務(wù)偏差
很多情況會(huì)引起偏差。大致上分為一些幾種:
1.訓(xùn)練數(shù)據(jù)和測(cè)試數(shù)據(jù)的性能之間的差異。一般來說,這總是存在的,但并不總是壞事。
2.測(cè)試數(shù)據(jù)和新時(shí)間生成數(shù)據(jù)之間的性能差異。同樣,這也總是存在的。你應(yīng)該調(diào)整正則化來最大化新時(shí)間數(shù)據(jù)上的性能。但是,如果這種性能差異很大,那可能說明采用了一些時(shí)間敏感性的特征,且模型的性能下降了。
3.新時(shí)間數(shù)據(jù)和線上數(shù)據(jù)上的性能差異。如果你將模型應(yīng)用于訓(xùn)練數(shù)據(jù)的樣例,也應(yīng)用于相同的服務(wù)樣例,則它們應(yīng)該給出完全相同的結(jié)果(詳見規(guī)則5)。因此,如果出現(xiàn)這個(gè)差異可能意味著出現(xiàn)了工程上的異常。
機(jī)器學(xué)習(xí)第三階段
有一些信息暗示第二階段已經(jīng)結(jié)束。首先,月增長開始減弱。你開始要考慮在一些指標(biāo)間權(quán)衡:在某些測(cè)試中,一些指標(biāo)增長了,而有些卻下降了。這將會(huì)變得越來越有趣。增長越來越難實(shí)現(xiàn),必須要考慮更加復(fù)雜的機(jī)器學(xué)習(xí)。
警告:相對(duì)于前面兩個(gè)階段,這部分會(huì)有很多開放式的法則。第一階段和第二階段的機(jī)器學(xué)習(xí)總是快樂的。當(dāng)?shù)搅说谌A段,團(tuán)隊(duì)就不能不去找到他們自己的途徑了。
法則38:如果目標(biāo)不協(xié)調(diào),并成為問題,就不要在新特征上浪費(fèi)時(shí)間
當(dāng)達(dá)到度量瓶頸,你的團(tuán)隊(duì)開始關(guān)注 ML 系統(tǒng)目標(biāo)范圍之外的問題。如同之前提到的,如果產(chǎn)品目標(biāo)沒有包括在算法目標(biāo)之內(nèi),你就得修改其中一個(gè)。比如說,你也許優(yōu)化的是點(diǎn)擊數(shù)、點(diǎn)贊或者下載量,但發(fā)布決策還是依賴于人類評(píng)估者。
法則39:模型發(fā)布決策是長期產(chǎn)品目標(biāo)的代理
艾麗斯有一個(gè)降低安裝預(yù)測(cè)邏輯損失的想法。她增加了一個(gè)特征,然后邏輯損失下降了。當(dāng)線上測(cè)試的時(shí)候,她看到實(shí)際的安裝率增加了。但當(dāng)她召集發(fā)布復(fù)盤會(huì)議時(shí),有人指出每日活躍用戶數(shù)下降了5%。于是團(tuán)隊(duì)決定不發(fā)布該模型。艾麗斯很失望,但意識(shí)到發(fā)布決策依賴于多個(gè)指標(biāo),而僅僅只有一些是機(jī)器學(xué)習(xí)能夠直接優(yōu)化的。
真實(shí)的世界不是網(wǎng)絡(luò)游戲:這里沒有“攻擊值”和“血量”來衡量你的產(chǎn)品的健康狀況。團(tuán)隊(duì)只能靠收集統(tǒng)計(jì)數(shù)據(jù)來有效的預(yù)測(cè)系統(tǒng)在將來會(huì)如何。他們必須關(guān)心用戶粘性、1 DAU,30 DAU,收入以及廣告主的利益。這些 A/B 測(cè)試中的指標(biāo),實(shí)際上只是長期目標(biāo)的代理:讓用戶滿意、增加用戶、讓合作方滿意還有利潤;即便這時(shí)你還可以考慮高品質(zhì)、有使用價(jià)值的產(chǎn)品的代理,以及五年后一個(gè)繁榮的企業(yè)的代理。
做出發(fā)布決策唯一容易的是當(dāng)所有指標(biāo)都變好的時(shí)候(或者至少?zèng)]有變化)。當(dāng)團(tuán)隊(duì)在復(fù)雜 ML 算法和簡單啟發(fā)式算法之間有選擇時(shí);如果簡單的啟發(fā)式算法在這些指標(biāo)上做得更好;那么應(yīng)當(dāng)選擇啟發(fā)式。另外,所有指標(biāo)數(shù)值并沒有明確的孰重孰輕??紤]以下更具體的兩種情形:

如果現(xiàn)有系統(tǒng)是 A ,團(tuán)隊(duì)不會(huì)想要轉(zhuǎn)移到 B。如果現(xiàn)有系統(tǒng)是 B,團(tuán)隊(duì)也不會(huì)想要轉(zhuǎn)到 A。這看起來與理性決策相抵觸:但是,對(duì)指標(biāo)變化的預(yù)期情形或許會(huì)發(fā)生,或許不會(huì)。因此任意一種改變都有相當(dāng)大的風(fēng)險(xiǎn)。每一個(gè)指標(biāo)覆蓋了一些團(tuán)隊(duì)所關(guān)注的風(fēng)險(xiǎn)。但沒有指標(biāo)能覆蓋團(tuán)隊(duì)的首要關(guān)切——“我的產(chǎn)品在五年后會(huì)怎樣?”
另一方面,個(gè)體更傾向于那些他們能夠直接優(yōu)化的單一目標(biāo)。大多數(shù)機(jī)器學(xué)習(xí)工具也如此。在這樣的環(huán)境下,一個(gè)能夠創(chuàng)造新特征的工程師總能夠穩(wěn)定的輸出產(chǎn)品發(fā)布。有一種叫做多目標(biāo)學(xué)習(xí)的機(jī)器學(xué)習(xí)類型開始處理這類問題。比如,給每個(gè)目標(biāo)設(shè)定最低界限,然后優(yōu)化指標(biāo)的線性組合。但即便如此,也不是所有指標(biāo)都能輕易表達(dá)為 ML 目標(biāo):如果一篇文章被點(diǎn)擊了,或者一個(gè)app被安裝了,這可能是只是因?yàn)檫@個(gè)內(nèi)容被展示了。但要想搞清楚為什么一個(gè)用戶訪問你的網(wǎng)站就更難了。如何完整預(yù)測(cè)一個(gè)網(wǎng)站將來是否能成功是一個(gè)AI完全(AI-complete)問題。就和計(jì)算機(jī)視覺或者自然語言處理一樣難。
法則40:保證集成模型(ensemble)的簡潔
接收原始特征、直接對(duì)內(nèi)容排序的統(tǒng)一模型,是最容易理解、最容易修補(bǔ)漏洞的模型。但是,一個(gè)集成模型(一個(gè)把其他模型得分組合在一起的“模型”)的效果會(huì)更好。為保持簡潔,每個(gè)模型應(yīng)該要么是一個(gè)只接收其他模型的輸入的集成模型,要么是一個(gè)有多種特征的基礎(chǔ)模型,但不能兩者皆是。如果你有單獨(dú)訓(xùn)練、基于其它模型的模型,把它們組合到一起會(huì)導(dǎo)致不好的行為。
只使用簡單模型來集成那些僅僅把你的基礎(chǔ)模型輸出當(dāng)做輸入。你同樣想要給這些集成模型加上屬性。比如,基礎(chǔ)模型生成得分的提高,不應(yīng)該降低集成模型的分?jǐn)?shù)。另外,如果連入模型在語義上可解釋(比如校準(zhǔn)了的)就最好了,這樣其下層模型的改變不會(huì)影響集成模型。此外,強(qiáng)行讓下層分類器預(yù)測(cè)的概率升高,不會(huì)降低集成模型的預(yù)測(cè)概率。
法則41:當(dāng)碰到性能瓶頸,與其精煉已有的信息,不如尋找有質(zhì)量的新信息源
你已經(jīng)給用戶增加了人工統(tǒng)計(jì)屬性信息,給文本中的詞增加了一些信息,經(jīng)歷了模板探索并且實(shí)施了正則化。然后,幾乎有好幾個(gè)季度你的關(guān)鍵指標(biāo)都沒有過提高超過1%了?,F(xiàn)在該怎么辦?
現(xiàn)在是到了為完全不同的特征(比如,用戶昨天,上周或者去年訪問過的文檔,或者來自不同屬性的數(shù)據(jù))構(gòu)建基礎(chǔ)架構(gòu)的時(shí)候了。為你的公司使用維基數(shù)據(jù)(wikidata)實(shí)體或者一些內(nèi)部的東西(比如谷歌的知識(shí)圖,Google’s knowledge graph)。你或許需要使用深度學(xué)習(xí)。開始調(diào)整你對(duì)投資回報(bào)的期望,并作出相應(yīng)努力。如同所有工程項(xiàng)目,你需要平衡新增加的特征與提高的復(fù)雜度。
法則42:不要期望多樣性、個(gè)性化、相關(guān)性和受歡迎程度之間有緊密聯(lián)系
一系列內(nèi)容的多樣性能意味著許多東西,內(nèi)容來源的多樣性最為普遍。個(gè)性化意味著每個(gè)用戶都能獲得它自己感興趣的結(jié)果。相關(guān)性意味著一個(gè)特定的查詢對(duì)于某個(gè)查詢總比其他更合適。顯然,這三個(gè)屬性的定義和標(biāo)準(zhǔn)都不相同。
問題是標(biāo)準(zhǔn)很難打破。
注意:如果你的系統(tǒng)在統(tǒng)計(jì)點(diǎn)擊量、耗費(fèi)時(shí)間、瀏覽數(shù)、點(diǎn)贊數(shù)、分享數(shù)等等,你事實(shí)上在衡量內(nèi)容的受歡迎程度。有團(tuán)隊(duì)試圖學(xué)習(xí)具備多樣性的個(gè)性化模型。為個(gè)性化,他們加入允許系統(tǒng)進(jìn)行個(gè)性化的特征(有的特征代表用戶興趣),或者加入多樣性(表示該文檔與其它返回文檔有相同特征的特征,比如作者和內(nèi)容),然后發(fā)現(xiàn)這些特征比他們預(yù)想的得到更低的權(quán)重(有時(shí)是不同的信號(hào))。
這不意味著多樣性、個(gè)性化和相關(guān)性就不重要。就像之前的規(guī)則指出的,你可以通過后處理來增加多樣性或者相關(guān)性。如果你看到更長遠(yuǎn)的目標(biāo)增長了,那至少你可以聲稱,除了受歡迎度,多樣性/相關(guān)性是有價(jià)值的。你可以繼續(xù)使用后處理,或者你也可以基于多樣性或相關(guān)性直接修改你的目標(biāo)。
法則43:不同產(chǎn)品中,你的朋友總是同一個(gè),你的興趣不會(huì)如此
谷歌的 ML 團(tuán)隊(duì)? 常常把一個(gè)預(yù)測(cè)某產(chǎn)品聯(lián)系緊密程度(the closeness of a connection in one product)的模型,應(yīng)用在另一個(gè)產(chǎn)品上,然后發(fā)現(xiàn)效果很好。另一方面,我見過好幾個(gè)在產(chǎn)品線的個(gè)性化特征上苦苦掙扎的團(tuán)隊(duì)。是的,之前看起來它應(yīng)該能奏效。但現(xiàn)在看來它不會(huì)了。有時(shí)候起作用的是——用某屬性的原始數(shù)據(jù)來預(yù)測(cè)另一個(gè)屬性的行為。即便知道某用戶存在另一個(gè)屬性能湊效的歷史,也要記住這一點(diǎn)。比如說,兩個(gè)產(chǎn)品上用戶活動(dòng)的存在或許就自身說明了問題。
備注:翻譯過程有多處參考http://tech.163.com/17/0126/09/CBMPFGTL00098GJ5.html。在此表達(dá)謝意~
。