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