本文作者表示,希望這篇論文能夠為在生產(chǎn)環(huán)境中采用機器學(xué)習(xí)系統(tǒng)的開發(fā)者與維護者提供一些實用建議。作者警告稱,雖然從零搭建機器學(xué)習(xí)系統(tǒng)還算輕松,但隨后的改進卻可能存在出乎意料的困難。在閱讀本文時,讀者會清晰感受到其中的經(jīng)驗源自作者在谷歌公司任職期間來之不易的艱辛積累。
AI 前線將帶大家一起重溫這篇經(jīng)典文章,文章部分經(jīng)驗強調(diào)“與機器學(xué)習(xí)相關(guān),并不代表著能夠徹底放棄良好軟件工程實踐”,也有部分內(nèi)容屬于特定于機器學(xué)習(xí)的常見陷阱。考慮到所有希望建立“X+AI”業(yè)務(wù)的初創(chuàng)企業(yè)都面臨著這類潛在挑戰(zhàn),因此文中提出的建議非常值得大家認真考量。
本文提到的機器學(xué)習(xí)系統(tǒng)帶來的主要技術(shù)債類別包括:信息隱藏以及變化封閉帶來的挑戰(zhàn) ; 膠水代碼與配置;以及不斷變化的外部世界以及分析模型結(jié)論對這一世界的理解偏差。
本文中最重要的見解之一,在于技術(shù)債務(wù)應(yīng)當成為工程師與研究人員們需要注意的問題。以大規(guī)模增加系統(tǒng)復(fù)雜性為代價進行解決方案研究顯然不是什么明智的作法。即使僅僅增加一到兩種看似無害的數(shù)據(jù)依賴關(guān)系,也有可能減緩進一步發(fā)展速度。雖然減少技術(shù)債務(wù)并不像證明新定理那樣令人振奮,但其仍然是保持強勁創(chuàng)新能力的重要動力。事實上,為復(fù)雜的機器學(xué)習(xí)系統(tǒng)開發(fā)出全面且優(yōu)雅的解決方案是一項極具現(xiàn)實意義的工作。
信息隱藏與變化封裝
……機器學(xué)習(xí)模型是一種創(chuàng)造復(fù)雜糾纏狀態(tài)的機器,且不可能有效地對其改進工作進行隔離分配。作為證明,假設(shè)犈在一套模型當中使用特征 x1,……Xn,那么如果我們改變 x1 中的值輸入分布,那么其重要性、權(quán)重或者剩余特征可能全部發(fā)生改變——無論模型是以批處理形式進行完全重新訓(xùn)練,還是以在線方式進行逐步適應(yīng),情況都是如此。而添加新特征 xn+1 或者刪除任何特征 xj,也都可能導(dǎo)致類似的變化。沒有任何輸入內(nèi)容是真正獨立存在的。牧羊這將其稱為 CACE 原則:即任何改變都將改變一切。
如果我們了解到先驗的重要性,就不需要利用機器學(xué)習(xí)進行重復(fù)證明!因此,模型有點像一臺巨大的攪拌機器,我們向其中投入大量信息并獲取結(jié)果,但對輸入內(nèi)容中的各類變化的敏感度卻難以預(yù)測,且?guī)缀鯚o法進行影響隔離。面對這樣的難題,我們該怎么辦?雖然不存在百試百靈的方案,但作者給出了三種可能有所幫助的策略。
你可以隔離模型,轉(zhuǎn)而提供總體結(jié)論。不過,糾纏問題仍然存在于每一個模型當中。此外,“在規(guī)模化情況下,這種策略可能很難長期維持”。
制定方法以深入理解模型預(yù)測的行為。你需要通過投資令模型不再像黑匣子般難以捉摸——例如為其配備更多可視化工具。此外,我還和多家企業(yè)進行過交流,其中一部分公司表示其能夠解釋機器學(xué)習(xí)模型作出的決定——甚至包括監(jiān)管要求,而這種能力亦是其商業(yè)模式中的重要組成部分。因此,請大家認真考慮這方面需求與實現(xiàn)途徑。
使用更為復(fù)雜的正則化方法,以便在訓(xùn)練當中使用的目標函數(shù)能夠反映出任何效能預(yù)測成本的上升跡象。“這種方法可能有用,但也只是可能。此外,其也許會增加系統(tǒng)復(fù)雜性進而帶來更多債務(wù),這反而背離了我們減少糾纏度的初衷。”
另一種尋找偶然耦合的方式在于建立隱藏反饋回路,這一點在未申報消費方當中體現(xiàn)得尤為明顯。通過未申報消費方,系統(tǒng)只是在單純消費建模產(chǎn)出的輸出結(jié)果,而我們幾乎意識不到這些過程的存在。如果其根據(jù)影響模型的輸入?yún)?shù)信息采取了某些行動,則這種隱藏的反饋回路很容易引發(fā)以下問題:
想象一下,在我們的新聞標題點擊率預(yù)測系統(tǒng)當中,系統(tǒng)中的某一組件負責以“智能化方式”確定用于標題的字體大小。如果此字體大小模塊開始將點擊率作為輸入信號使用,且字體大小確實會影響用戶的點擊傾向,那么字體大小當中將會包含一個由點擊率添加的新的隱藏反饋回路??梢韵胂螅@樣一套系統(tǒng)會逐漸無休止地增加所有標題字號情況。
數(shù)據(jù)依賴性問題
……盡管代碼依賴性可以通過靜態(tài)分析以及鏈接圖等方法相對輕松地進行識別,但具備數(shù)據(jù)依賴性處理功能的分析工具卻很少見。因此,我們可以難以構(gòu)建起能夠解決大型數(shù)據(jù)依賴鏈的方案。
舉例來說,某些輸入信號會隨著時間推移而改變行為。遵循 CACE 原則,即使將這些變化作為改進方向,也很難對后果作出預(yù)測。另一種數(shù)據(jù)依賴性則是模型中的特征集合,其中一些能夠在準確性方面提供非常有限的增量。我們可以通過多種方式利用原本未充分利用的依賴性——包括一部分已遭棄用的早期遺留特征,一次性添加的多項特征組合(而非僅僅挑出那些真正有作用的特征),或者那些為了追求準確率而添加、且無法證明自身對復(fù)雜性的影響的特征。定期對特征進行清除將非常重要。
舉例來說,假設(shè)在團隊合并之后,為了簡化而進行了一輪由舊產(chǎn)品編號到新產(chǎn)品編號的轉(zhuǎn)換,那么兩套方案都將在系統(tǒng)中作為特征。其中新產(chǎn)品只能獲得一個新編號,但舊產(chǎn)品可能同時擁有兩個編號。機器學(xué)習(xí)算法當然也會將舊編號納入依賴關(guān)系當中。一年之后,有管理人員清理了使用舊編號填充的數(shù)據(jù)庫代碼。這種變化不會被回歸測試所檢測到,因為清理之后舊編號直接不再使用。這對機器學(xué)習(xí)系統(tǒng)的維護者而言顯然不是什么好消息……
有能力理解數(shù)據(jù)依賴性的工具,將幫助我們順利搞定特征清理工作。谷歌公司的一支團隊就構(gòu)建出一款自動化特征管理工具:
自從采用以來,該方案幫助谷歌團隊每個季度安全刪除數(shù)千行與特征相關(guān)的代碼,同時自動驗證其中的版本及其它問題。該系統(tǒng)還能夠有效防止意外使用新模型中不推薦或已經(jīng)損壞的特征。
最后一種數(shù)據(jù)依賴性管理方法,在于建立“校正”機制以重新利用現(xiàn)有模型。通過這種方式,你能夠快速獲得初步成果 ; 但在另一方面,你未來對該模型的分析與改進將面臨更高的成本。
其它 95%(膠水代碼與配置)
令人驚訝的是,學(xué)術(shù)界意識到在大多數(shù)機器學(xué)習(xí)系統(tǒng)當中,只有很小一部分代碼在實際進行“機器學(xué)習(xí)”。事實上,一套成熟的系統(tǒng)最終可能最多只有 5% 的代碼負責機器學(xué)習(xí),而其余 95% 甚至更多代碼只是起到粘合作用,從而通過重新實現(xiàn)(而非重新使用)改善原本笨拙的 API……
這里需要解決的問題在于,很多機器學(xué)習(xí)庫都被封裝成了獨立的工件,這無疑會引入大量膠水代碼(例如從 Java 轉(zhuǎn)換至 R 或者 matlab)。如果大家無法在更為廣泛的系統(tǒng)架構(gòu)內(nèi)找到適合自己的資源選項,那么重新實現(xiàn)算法(5% 部分的代碼)可能更有意義,且能夠有效減少膠水代碼的數(shù)量。
一大相關(guān)問題在于管道叢林——即過于復(fù)雜的數(shù)據(jù)準備管道。
管道叢林問題只能通過全面審視數(shù)據(jù)收集與特征提取的方式來避免。清除管道叢林并從頭開始設(shè)計清理方法,確實是工程設(shè)計層面的一項重大投資,但這同時也能夠顯著降低持續(xù)成本并加速進一步創(chuàng)新活動。
一旦系統(tǒng)因膠水代碼與管道叢林問題而變得僵化,很多朋友會忍不住調(diào)整生產(chǎn)代碼中的實驗代碼路徑以執(zhí)行額外實驗。這樣做當然比較方便,但一旦頻率過高,其只會引發(fā)更大的混亂。
作為典型實例,谷歌公司最近在對一套重要的機器學(xué)習(xí)系統(tǒng)進行清理時,發(fā)現(xiàn)其中存在著數(shù)以萬計的未使用實驗性代碼行。在利用更緊密的 API 進行重寫之后,這部分“遺產(chǎn)”能夠大幅降低工作量、生產(chǎn)風險并控制系統(tǒng)復(fù)雜性,從而為新算法的實驗鋪平道路。
在本節(jié)的最后,“配置往往是現(xiàn)實世界的混亂對美麗算法造成干擾的載體:”
請考慮以下例子。特征 A 在 9 月 14 日到 9 月 17 日之間發(fā)生了記錄錯誤。特征 B 直到 10 月 7 日才正式上線。由于記錄格式發(fā)生了變化,用于計算特征 C 的代碼必須對 11 月 1 日之前及之后的數(shù)據(jù)進行更改。特征 D 并未用于生產(chǎn),因此在現(xiàn)場調(diào)協(xié)中進行模型查詢時,必須使用替代性的 D’與 D”。如果特征 Z 被使用,那么所有訓(xùn)練相關(guān)任務(wù)必須獲得額外的內(nèi)存配額,否則其訓(xùn)練效率將顯著降低。最后,由于延遲限制,特征 Q 排除掉了特征 R。所有這些混亂的條件使得配置難以正確修改且難以推理。此外,配置錯誤還可能引發(fā)高昂的代價——包括嚴重的時間浪費、計算資源損耗或者生產(chǎn)問題。
配置變更應(yīng)該與代碼變更一樣得到謹慎處理,并交由同行進行評審。
世界還將帶來怎樣的變化?
經(jīng)驗表明,外部世界很少保持穩(wěn)定。事實上,真實世界的性質(zhì)變化正是機器學(xué)習(xí)當中技術(shù)債務(wù)的一大重要來源。
請不要手動設(shè)置決策閾值(例如顯示或不顯示廣告),而應(yīng)考慮通過評估現(xiàn)有驗證數(shù)據(jù)以發(fā)現(xiàn)閾值此外,因果不明的相關(guān)特征也可能引發(fā)問題:
這似乎并不是什么主要問題:如果兩個特征總是相關(guān),但只有其中一個特征屬于真正的因果關(guān)系,那么似乎仍可以將信用歸于兩者并通過觀察其共同現(xiàn)象得出結(jié)論。然而,如果外部世界中這兩種特征的共生性突然消失,那么預(yù)測行為可能發(fā)生顯著變化。用于區(qū)分相關(guān)效應(yīng)的全面機器學(xué)習(xí)策略也將超出我們的討論范圍 ;[Bottou 2013] 就此給出了一些極好的建議與參考。結(jié)合本文的關(guān)注點,我們注意到非因果關(guān)系屬于隱藏債務(wù)的另一種來源。
最后,實時監(jiān)控系統(tǒng)至關(guān)重要。論文建議大家測量預(yù)測偏差,并在系統(tǒng)采取的行動數(shù)量超過某個閾值時發(fā)布警報。
在一套按預(yù)期方式運作的系統(tǒng)中,預(yù)測標簽的分布通常應(yīng)該等同于觀察標簽的發(fā)布。這不需要進行全面測試,因為其可以通過單一空模型滿足——即直接預(yù)測標簽出現(xiàn)平均值,而不必考慮輸入要素。然而,這種簡單的方法卻帶來了令人驚訝的良好效果,而此類度量指標的變化通常反映出需要注意的關(guān)鍵問題……