編者按:Insight Data Science AI負責人Emmanuel Ameisen和前百度硅谷人工智能實驗室主管Adam Coates分享了快速交付機器學習項目的經驗。
由于機器學習(ML)日益成為每個產業的重要組成部分,對機器學習工程師的需求增長迅猛。機器學習工程師結合機器學習技術與軟件工程知識,為給定的應用尋求表現優異的模型,同時處理隨之而來的實現的挑戰——從創建訓練基礎設施到為部署模型做準備。雖然網上不斷出現訓練工程師創建ML模型并解決遇到的各種軟件挑戰的資源,而新ML團隊最常遇到的一個障礙卻是保持和傳統軟件工程同等水準的進度。
這一挑戰最關鍵的原因是開發新ML模型的過程從一開始就是高度不確定的。畢竟,在最后的訓練完成之前,很難知曉模型表現有多好,更別說大量的調參和采用不同的建模假定對模型表現有什么影響了。
多種職業人士面臨類似的情況:軟件和商業開發者,尋求產品-市場契合的初創企業,處于信息有限的演習之中的飛行員。每種職業人士采用一種常見框架以幫助團隊在不確定的情況下高效作業:軟件開發的敏捷原則,精益創業,美國空軍的OODA循環。機器學習工程師可以遵循類似的框架,應對不確定性,迅速交付偉大的產品。
ML工程循環
本文將介紹機器學習的OODA循環:ML工程循環,其中ML工程師不斷進行以下四個步驟:
分析
選型
實現
測量
從而快速、高效地發現最佳模型,并適應未知數據。此外,我們也為每個階段提供了具體的竅門,并將介紹如何優化整個過程。
ML團隊的成功常常意味著交付滿足給定限制的表現優異的模型——例如,在滿足內存占用、推理時間、公平性等限制的前提下,達到較高的預測精確度。表現是由和最終產品最相關的測度定義的,不管它是精確度,速度,還是輸出的多樣性。出于簡單性,下文的表現測度我們選擇了最小化“誤差率”。
剛開始著手一個新項目時,你應該精確地定義成功標準,之后將其轉換為模型測度。用產品術語來說,服務需要具備什么級別的表現才有用?例如,如果新聞平臺向用戶分別推薦5篇文章,其中需要多少篇用戶相關的文章,我們又如何定義相關性?給定表現標準和現有數據,你可以創建的最簡單的模型是什么?
ML工程循環的目的是提供一個開發過程中牢記的心智模型,簡化決策過程,以集中精力處理下一個重要步驟。隨著從業者經驗的積累,這一過程變為從業者的第二本能,可以快速果斷地在分析和實現間切換。話是這么說,不過,當不確定性增加時,即使是最有經驗的工程師也會發現這一框架價值非凡——例如,模型出乎意料地沒能滿足需求,團隊目標突然調整(例如,為了體現產品需求的變動,測試集做了改動),團隊進程因缺乏目標而停滯。
開始
為了啟動這一循環,你應該先從一個基本不涉及不確定性的最小實現開始。通常我們想要盡可能快地“得到一個數字”——創建一個足以評估表現并開始迭代的系統。這通常意味著:
開始設置訓練、驗證、測試集。
實現一個可以工作的簡單模型。
例如,如果我們需要創建一個樹檢測器以調查某一區域的樹木,我們也許可以使用相關Kaggle競賽中現成的數據作為訓練集,并使用我們自行收集的一組目標區域的照片作為驗證集和測試集。我們接著可以在原始像素上運行邏輯回歸,或者在訓練圖像上運行預訓練好的網絡(比如ResNet)。這里的目標不是一下子完結這個項目,而是開啟我們的迭代循環。下面是一些有助于你達成這一點的竅門:
竅門
關于良好的測試集:
由于團隊的目標是在測試集上取得較優表現,測試集實質上描述了團隊的目標。因此,測試集應當反映產品或業務的需求。例如,如果你正創建一個基于自拍檢測皮膚狀況的應用,你可以在任意圖像上訓練,但需確保測試集包含光照和畫質不佳的圖像,因為一些自拍很可能出現這類情況。
改變測試集意味著調整團隊的目標,所以最好及早固定測試集,僅當項目、產品、業務目標發生變動時才改動測試集。
盡量使測試集和驗證集足夠大,這樣才能得到足夠精確的表現測度,從而很好地區分不同的模型。如果測試集太小,你最終將基于噪聲數據得出結論。
類似地,你應該在實際情況允許的情況下,盡可能確保測試集和驗證集的標簽和標注足夠精確。錯誤標注的測試集差不多等于沒有正確說明的產品需求。
了解人類或現存/競爭系統在測試集上的表現很有幫助。這給出了最優誤差率的界限,也就是你可能取得的最佳表現。
對許多任務而言,達到和人類相當的水平經常是一個很好的長期目標。在任何情況下,最終目標都是使測試表現盡可能接近我們猜測的最佳表現。
關于驗證集和訓練集:
驗證集是測試表現的代理,可用于調整超參數。因此,驗證集的分布應當和測試集一致。不過,理想情形下,驗證集和測試集應該來自不同組別的用戶/輸入,這可以避免數據泄露。確保這一點的一個好辦法是首先積累大量樣本,然后打亂順序,之后將其分割為驗證集和測試集。
如果在你的設想中,產品數據會有很多噪聲,確保訓練集考慮到了噪聲問題(比如使用數據增強或數據劣化)。你不能期望完全在銳利圖像上訓練的模型能很好地推廣到模糊圖像。
實現了初始原型之后,你應該在訓練集、驗證集、測試集上測試它的表現。這標志著你度過了循環的第一個(退化的)周期。評估測試表現和有用的產品所需表現之間的差距。現在到了開啟迭代的時刻了!
分析
識別表現瓶頸
在實踐中,可能有許多交叉的問題導致了當前的結果,但你的目標是首先找出最明顯的問題,這樣你就可以快速解決它。不要拘泥于試圖完全理解所有缺陷——轉而理解最關鍵的因素,因為在你改進模型之后,許多小問題會改變,甚至消失。
我們下面列出了一些常見的診斷。選擇從哪方面開始多多少少是門手藝,但隨著ML工程循環的進行,你將逐漸獲得嘗試哪個的直覺。
對所有分析而言,一個很好的起點是查看訓練集、驗證集、測試集上的表現。我們建議你寫代碼在每次試驗后自動進行這一比較,養成習慣。平均來說,我們有:訓練集誤差 <= 驗證集誤差 <= 測試集誤差?(如果三個數據集中的數據遵循同一分布)。基于上一次試驗的訓練、驗證、測試誤差率,你可以快速地獲知哪個因素是當前最大的限制。例如,如果訓練誤差和驗證誤差存在一定差距,那么訓練誤差是提升表現的瓶頸。
診斷
如果訓練集誤差是當前的限制因素,那么可能的問題有:
優化算法(例如,深度神經網絡的梯度下降)沒有調整準確。看看學習曲線,損失有沒有下降。檢查下是否能夠過擬合一個小很多的數據集(例如,在單個minibatch甚至單個樣本上訓練)。你可以可視化神經元反應的直方圖,看看它們有沒有飽和(這可能會導致梯度消失)。
訓練集可能有標注錯誤或毀壞的數據。在傳給訓練算法前,手工檢查一些訓練樣本。
模型可能過小、過于簡單。例如,如果你在高度非線性的問題上應用線性回歸,你的模型無法很好地擬合數據。我們稱為高偏差或欠擬合。
如果驗證集誤差是當前的限制因素,那么可能的問題有:
模型可能過大、過于復雜,或者正則化不夠。我們稱為高方差或過擬合。
訓練數據不足。
訓練數據的分布和驗證集、測試集分布不同。
模型的超參數設得不好。如果你搜索最佳超參數(比如特征集、正則項),那可能是搜索方法難以找到較好的選擇。
模型編碼的“歸納先驗”和模型匹配不好。例如,如果數據集用一個線性函數表示更自然,使用最近鄰方法也許很難推廣,除非你有海量訓練數據。
如果測試集誤差是當前的限制因素,這常常是因為驗證集太小,或者團隊在多次嘗試的過程中過擬合驗證集了。
不管是上面哪種情況,你都可以通過手工檢查一組模型出錯的隨機樣本,理解模型的缺陷(一般情況下你不應該在測試集上這么做,以避免在測試樣本上“訓練”系統)。
通過可視化數據嘗試識別常見類型的誤差。然后檢查樣本,記錄每種類型的誤差出現的頻率。分類問題可以看下混淆矩陣,找出表現最差的分類。接著你就可以集中精力解決導致最多錯誤的那類誤差。
有些樣本可能錯誤標注了,或者有多種合理的標簽。
有些樣本可能比其他樣本更難判斷,或者缺乏做出判斷需要的上下文。在若干種誤差同樣常見的時候,將一些樣本標記為“很難”也許有助于你將精力花在容易得到改進的地方。類似地,將一些樣本標記為“很容易”也許有助于你找出系統中細小的錯誤,導致模型在容易的情形上犯錯。這有點像在數據的不同子集上估計“最優誤差率”,接著深入進展空間最大的子集。
注意,上面的許多診斷有著直接、明顯的解決方案。例如,如果訓練數據太少了,那就獲取更多訓練數據!我們發現在心智上分隔分析階段和(下面的)選型階段是有幫助的,因為我們很容易陷入隨機嘗試各種方法,而沒有真正分析背后問題的狀況。另外,保持開闊的思路,勤于返回誤差分析階段,經常能夠揭示有用的洞見,有助于改善你的決策。
例子
眾所周知,衛星數據噪聲很多,常常需要仔細檢查
例如,Insight Data Science的Jack Kwok在創建一個幫助災后重建的分割系統時,注意到盡管分割模型在衛星圖像訓練集上表現良好,在驗證集上的表現卻很差。這是因為驗證集包含受到颶風襲擊的城市,這些颶風圖像的畫質比訓練數據差,更加模糊。通過在訓練階段增加一個額外的數據增強步驟,在圖像上應用模糊濾鏡,有助于降低訓練集和驗證集的表現差異。
在語音識別系統上,對驗證集的深入誤差分析可能揭示具有和大多數用戶很不一樣的濃重口音的說話人貢獻了不成比例的誤差數量。那么接著就可以檢查下訓練集,看看是否具備足夠比例的類似口音樣本,這些樣本是否正確標注,訓練算法能否成功擬合這些樣本。部分用戶類別代表性不夠或者錯誤標注是一個機器學習偏見的例子。Google的語音系統采取的一種解決方案是主動向口音很重的用戶請求更多訓練數據。
選型
找出處理瓶頸的最簡單方式
完成分析之后,你對模型造成了哪些類型的誤差和影響表現的是哪些因素已經心中有數。就給定的診斷而言,也許有若干潛在的解決方案,下一步就是把它們列舉出來,并制定優先級。
有些診斷直接導向潛在的解決方案。例如,如果你的優化器看起來沒有調好,你可以嘗試不同的學習率,或者考慮干脆換一種優化算法。如果訓練數據集過小,收集更多的訓練數據可能是合理、快速、容易的解決方案。
我們建議ML工程師及其團隊列出盡可能多的也許有效的想法,接著采用簡單、快速的解決方案。如果現有的解決方案可能有效(例如,使用你的工具箱中已經實現的另一種優化算法),就從現有方案開始。盡管更復雜的方法也許看起來能在一次巨大的轉變中解決更多問題,我們常常發現多次快速迭代帶來的改進超過了摸索當前最先進技術帶來的收益。如果你可以在標注1000個數據點和研究最前沿的無監督學習方法中做選擇,我們覺得你應該選擇收集和標注數據。如果你可以從一些簡單的啟發式算法開始,就這么干。
竅門
取決于你的瓶頸,這里是一些常見的解決方案。
如果你需要調整優化器,以更好地擬合數據:
對數值優化器而言,嘗試調整學習率或動量設定。從一個小動量(0.5)開始通常是最容易奏效的方法。
嘗試不同的初始化策略,或者從預訓練模型開始。
嘗試一種容易調參的模型。在深度學習中,殘差網絡和帶批歸一化的網絡可能訓練起來要容易一點。
如果模型不能很好地擬合訓練數據:
使用更大、更有表達力的那類模型。例如,使用決策樹時,你可以配置更深的決策樹。
檢查訓練集中模型出錯的樣本,看看有沒有錯誤標注或缺失項。花時間清洗訓練數據可以顯著改善結果。
如果模型難以推廣至驗證集:
增加更多訓練數據。注意,也許需要集中添加和驗證集中所見誤差類別類似的訓練樣本。
基于真實訓練樣本,生成新樣本,以增強數據。例如,如果你注意到樹檢測器在有霧的圖像上一貫表現糟糕,那么可以加上增強步驟,使用OpenCV讓圖像看起來霧蒙蒙的。
擴大搜索超參數的范圍,或者進行更細致的搜索,確保找到在驗證集上表現最佳的模型。
嘗試不同的正則化方式(例如神經網絡的權重衰減、dropout,決策樹的剪枝)。
嘗試不同類型的模型。不同類型的模型可以改變擬合和推廣的表現,所以很難知道什么時候這個方法有用。深度學習的一大優勢在于,有范圍很廣的神經網絡構件可供嘗試。如果你使用傳統的模型(例如決策樹或高斯混合模型),切換不同類型的模型需要花費更多精力。如果新模型內含的假定更正確,那么這一改變也許會有幫助——但最好先從容易的模型開始嘗試。
實現
只創建需要創建的,快速創建
你知道應該嘗試什么,并且已經簡化了問題,現在只不過是實現而已……“只不過”。這一階段的目標是快速創建原型,這樣你就可以測量結果,并從中學習,然后快速開啟下一輪循環。因此,我們建議你集中精力創建當前試驗需要的東西。注意,盡管這一階段的目標是快速學習,而不是打磨一切,你的實現仍然需要是正確的,這樣你就可以頻繁地檢驗代碼是否能如期望一般工作。
竅門
在收集和標注數據時:
經常查看數據。查看原始數據,查看預處理后的數據,查看標簽。這些再強調也不為過!僅僅是在收集、標注數據的流程中留心一點,就能捕捉許多誤差。在Insight Data Science,我們經常碰到和數據清洗、包圍盒坐標、分割掩碼相關的bug。
標注、清洗數據是日常任務。大多數人高估了收集、標注數據的代價,卻低估了在數據匱乏的環境下解決問題的難度。如果方法得到,很容易就在一分鐘內標注用于分類問題的20張圖像。你是愿意花一小時標注圖像,得到一個包含1200張圖像的數據集,再花一小時解決一個簡單的分類問題,還是花3周時間嘗試讓一個模型基于5個樣本學習?
當你為新模型寫代碼時,從一個類似的現有實現開始。許多論文現在都公布代碼——所以在重新實現論文中的一個想法前,先獲取配套的代碼,因為論文常常漏掉一些細節。這會為你節省幾小時乃至幾天。如果可能的話,不管是什么問題,我們都建議遵循以下步驟:
尋找一個解決類似問題的模型實現。
在本地重現現有模型的實現(同樣的數據集和超參數)
慢慢調整模型實現和數據工作流以匹配你的需求
重寫需要重寫的部分
編寫測試以檢查梯度、張量值、輸入數據、標簽的格式對不對。剛開始設置模型的時候就寫測試,這樣,如果捕捉到了錯誤,就不會再犯。
測量
打印測試結果和決定是否可以發布需要考慮的其他測度(例如,生產環境限制)。
如果表現某種程度上在提高,那么你也許處于正確的方向上。這種情況下,現在也許是完善你知道工作良好的那些部件的時機。另外,確保團隊里的其他成員能夠重現你的試驗結果。
另一方面,如果表現在下降,或者沒怎么提高,你需要決定是再試一下(重返分析階段)還是放棄當前想法。如果ML循環的每一步都相對廉價,那就更容易做出決策:你不必花費過多精力讓你的代碼趨于完美,再嘗試一次也不會花費太多時間——所以你可以根據想法的風險和收益做出決策,而不會受到沉沒成本的干擾。
竅門
有用的表現測度包括ML方面的精確度和損失,以及商業價值測度。記住商業價值測度是最終的測度,因為正是它們決定了你創建的產品的有用程度。如果測試測度(ML代碼優化的目標)偏離了商業測度,那么測量階段結束之后,應該停下來考慮修改優化標準或測試集。
既然每個開發循環的末尾總是需要打印測度,同時計算分析階段所需的其他測度會比較方便。
經常情況是,你最終創建了一個類似“控制面板”的東西,其中包含測試測度和商業測度,還有其他有用的數據。這在團隊協作中特別有用。
優化循環
盡管機器學習任務具有內在的不確定性,上面的ML工程循環將幫助你有條不紊地邁向一個更好的模型。不幸的是,它一點也不神奇——你需要發展在每個階段做出良好決策的能力,例如識別表現瓶頸,決定嘗試哪種解決方案,如何正確地實現它們,以及如何測量應用的表現。你也需要習慣快速迭代的節奏。因此,你也應該花時間思考如何提高迭代的質量和速度,這樣可以在每次循環中最大化進展,并且可以快速地完成多次迭代。
竅門
如果分析階段拖慢了你的進度,那就創建一個腳本,總結每次試驗結果,從訓練集和驗證集搜集誤差,并以良好的格式打印出來。這種包含常用診斷信息的“控制面板”可以幫助你戰勝“啊!我又得手工運行這些分析了……不如試試這個隨機解決方案吧”這樣的想法。
如果你覺得自己對到底嘗試什么毫無頭緒,那就隨便選一樣。一下子嘗試做太多事情會拖慢你的進度。有時候你可以在運行試驗的時候回過頭來嘗試另一個想法!
收集數據是取得更好表現的常用方式。如果獲取更多數據聽起來很痛苦,但是確實可以改變結果,那么也許應該投資讓數據更容易收集、清洗、標注的工具。
如果你覺得自己陷入了困境,診斷不出瓶頸,或者選不出接下來試驗的模型,考慮向專家咨詢。領域專家經常能夠就誤差分析提供寶貴的洞見(例如,指出導致某些情形困難或容易的微妙差別),而研究論文或有經驗的ML從業者也許可以為你提供值得嘗試的創造性解決方案(如果你可以和他們分享詳細的分析,他們可以更好地幫助你)。
良好的實現技能很重要,代碼規范可以防止bug產生。話是這么說,由于相當大比例的想法會失敗,因此在迭代過程中,在試驗代碼中使用一些臨時性的不規范做法也沒什么大不了的,畢竟失敗的代碼最終會被丟棄。一旦你確信自己取得了有用的進展,你可以在下一次循環之前根據規范清理代碼。
如果試驗時間過長,考慮花點時間看看能不能優化代碼。或者和系統專家討論下如何讓訓練更快。拿不定主意的時候,考慮升級GPU,或者并行運行更多試驗,這些是ML試驗“時忙時閑”問題久負盛名的解決方案。
和其他決策一樣,僅當可以解決當前痛點的時候才致力于這些事項。有些團隊花了太多時間創建“完美”的框架,最后發現真正的問題在別的地方。
結語
ML項目內在地具有不確定性,我們上面推薦的方法可以作為引導你前進的扶手。由于試驗的命運不確定,你很難為達成特定的精確度目標而負責,但你至少可以負責完成誤差分析,列出想法列表,編碼實現,看看它們表現如何。就我們的經驗而言,拒絕那些閃閃發光的模型的召喚,果斷地集中精力于取得遞增的進展,可以在研究和應用中導向杰出的成果。這曾經轉變了很多團隊,讓無數Insight Data Science的工程師得以交付前沿項目。
如果你有什么要問的,歡迎留言,或通過Twitter聯系兩位作者(EmmanuelAmeisen和adampaulcoates)。
感謝Lacey Cope和Adam Coates對本文草稿給出的反饋。
-
圖像
+關注
關注
2文章
1094瀏覽量
41274 -
機器學習
+關注
關注
66文章
8503瀏覽量
134635
原文標題:快速交付機器學習項目:ML工程循環指南
文章出處:【微信號:jqr_AI,微信公眾號:論智】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
如何快速部署邊緣就緒的機器學習應用

請問如何快速具有項目經驗?
【瑞芯微RK1808計算棒試用申請】基于機器學習的視覺機械臂研究與設計
【快包故事簡訊】服務商競標+交付經驗分享,三個成功秘訣和四大誤區!
Airbnb機器學習和數據科學團隊經驗分享
機器學習的12大經驗總結
Everyday Robot項目啟動 意在開發通用學習機器人
突破交付瓶頸:FPGA項目加速交付的“致勝密碼”

評論