2021年的機器學(xué)習(xí)生命周期
您實際上是如何完成一個機器學(xué)習(xí)項目的?有哪些工具可以幫助完成每一步?
> Photo by Tolga Ulkan on Unsplash
在這個時代,每個人都在學(xué)習(xí)機器學(xué)習(xí)(ML)。似乎每個收集數(shù)據(jù)的公司都在嘗試找出某種方式來使用AI和ML分析其業(yè)務(wù)并提供自動化解決方案。
到2027年,機器學(xué)習(xí)的市值預(yù)計將達到1170億美元—《財富》雜志
ML的大量涌入導(dǎo)致許多新手沒有正式的背景。令人高興的是,更多的人開始興奮并學(xué)習(xí)了這一領(lǐng)域,這很高興,但很顯然,將ML項目整合到生產(chǎn)環(huán)境中并不是一件容易的事。

Image from the 2020 State of Enterprise ML by Algorithmia based on 750 businesses
55%的企業(yè)尚未將它們的ML模型投入生產(chǎn)— Algorithmia
如果您擁有訓(xùn)練模型所必需的數(shù)據(jù)和計算資源,那么很多人似乎都認為ML項目非常簡單。他們再犯錯了。如果不部署模型,這種假設(shè)似乎會導(dǎo)致大量的時間和金錢成本。

> Naive assumption of the ML lifecycle (Image by author)
在本文中,我們將討論ML項目的生命周期實際上是什么樣的,以及一些有助于解決該問題的工具。
機器學(xué)習(xí)生命周期
實際上,機器學(xué)習(xí)項目不是簡單明了的,它們是在改善數(shù)據(jù),模型和評估之間進行的一個循環(huán),從未真正完成。這個周期對于開發(fā)ML模型至關(guān)重要,因為它專注于使用模型結(jié)果和評估來完善數(shù)據(jù)集。高質(zhì)量數(shù)據(jù)集是訓(xùn)練高質(zhì)量模型的最可靠方法。如此反復(fù)循環(huán)的速度決定了您的成本,幸運的是,有些工具可以在不犧牲質(zhì)量的情況下幫助加快循環(huán)速度。

> A realistic example of ML lifecycle (Image by author)
與任何系統(tǒng)一樣,即使已部署的ML模型也需要監(jiān)視,維護和更新。您不能只是部署ML模型而忘了它,而是期望它在其余時間中能夠像在現(xiàn)實世界中的測試集上一樣工作。當(dāng)您發(fā)現(xiàn)模型中的偏差,添加新數(shù)據(jù)源,需要其他功能等時,部署在生產(chǎn)環(huán)境中的ML模型將需要更新。這使您重新回到數(shù)據(jù),模型和評估周期。
截至2021年,深度學(xué)習(xí)在十多年來一直很重要,并幫助使ML成為市場的領(lǐng)先和中心。機器學(xué)習(xí)行業(yè)蓬勃發(fā)展,開發(fā)了無數(shù)產(chǎn)品來協(xié)助機器學(xué)習(xí)模型的創(chuàng)建。ML生命周期的每一步都有一些工具,您可以使用它們來加快流程,而不會成為沒有ML項目的公司之一。
下一節(jié)將深入探討ML生命周期的每個階段,并重點介紹流行的工具。
階段1:數(shù)據(jù)

> Data in the ML lifecycle (Image by author)
雖然最終目標(biāo)是建立高質(zhì)量的模型,但是訓(xùn)練一個好的模型的生命線在于傳遞的數(shù)據(jù)的數(shù)量,更重要的是質(zhì)量。
ML生命周期中與數(shù)據(jù)相關(guān)的主要步驟是:
數(shù)據(jù)收集-無論質(zhì)量如何,都收集盡可能多的原始數(shù)據(jù)最后,無論如何,僅注釋其中的一小部分,這是大部分成本的來源。當(dāng)模型性能出現(xiàn)問題時,可以根據(jù)需要添加大量數(shù)據(jù),這很有用。
- 公開數(shù)據(jù)集列表
定義注釋模式-這是生命周期數(shù)據(jù)階段最重要的部分之一,通常會被忽略。構(gòu)造不佳的注釋架構(gòu)將導(dǎo)致類和邊緣情況的模棱兩可,從而使訓(xùn)練模型更加困難。
例如,對象檢測模型的性能在很大程度上取決于大小,位置,方向和截斷等屬性。因此,在注釋期間包括對象大小,密度和遮擋之類的屬性可以提供創(chuàng)建模型可以學(xué)習(xí)的高質(zhì)量訓(xùn)練數(shù)據(jù)集所需的關(guān)鍵元數(shù)據(jù)。
- Matplotlib,Plotly —繪制數(shù)據(jù)的屬性
- Tableau-更好地了解您的數(shù)據(jù)的分析平臺
數(shù)據(jù)注釋-注釋是一次又一次地執(zhí)行幾個小時的相同任務(wù)的乏味過程,這就是為什么注釋服務(wù)是一項蓬勃發(fā)展的業(yè)務(wù)的原因。結(jié)果是注釋者可能會犯許多錯誤。盡管大多數(shù)注釋公司保證最大錯誤百分比(例如最大錯誤為2%),但更大的問題是注釋架構(gòu)定義不正確,導(dǎo)致注釋者決定以不同的方式標(biāo)記樣本。注釋公司的質(zhì)量檢查團隊很難發(fā)現(xiàn)這一點,這是您需要檢查的事情。
- Scale, Labelbox, Prodigy—流行的注釋服務(wù)
- Mechanical Turk —眾包注釋平臺
- CVAT — DIY計算機視覺注釋
- Doccano — NLP特定注釋工具
- Centaur Labs —醫(yī)療數(shù)據(jù)標(biāo)記服務(wù)
改善數(shù)據(jù)集和注釋-嘗試改善模型性能時,您可能會在這里花費大部分時間。如果您的模型正在學(xué)習(xí)但表現(xiàn)不佳,那么罪魁禍首幾乎總是一個訓(xùn)練數(shù)據(jù)集,其中包含偏見和錯誤,這些偏見和錯誤正在為模型創(chuàng)建性能上限。改善模型通常涉及諸如硬樣本挖掘(添加與模型失敗的其他樣本相似的新訓(xùn)練數(shù)據(jù)),基于模型學(xué)習(xí)到的偏差重新平衡數(shù)據(jù)集,更新注釋和模式以添加新標(biāo)簽并優(yōu)化現(xiàn)有標(biāo)簽的方案。。
- DAGsHub —數(shù)據(jù)集版本控制
- FiftyOne —可視化數(shù)據(jù)集并發(fā)現(xiàn)錯誤
階段2:模型

> Models in the ML lifecycle (Image by author)
即使此過程的輸出是模型,理想情況下,您仍將在此循環(huán)中花費最少的時間。

In industry, more time is spent on datasets than models. Credit to Andrej Karpathy
探索現(xiàn)有的預(yù)訓(xùn)練模型-這里的目標(biāo)是盡可能多地重用可用資源,以使自己最好地開始建模生產(chǎn)。如今,轉(zhuǎn)移學(xué)習(xí)是深度學(xué)習(xí)的核心租戶。您可能不會從頭開始創(chuàng)建模型,而是對在相關(guān)任務(wù)上預(yù)先訓(xùn)練的現(xiàn)有模型進行微調(diào)。例如,如果要創(chuàng)建遮罩檢測模型,則可能會從GitHub下載預(yù)訓(xùn)練的面部檢測模型,因為這是更受歡迎的話題,需要做更多的工作。
- FiftyOne 模型動物園—只需一行代碼即可下載并運行模型
- TensorFlow Hub —訓(xùn)練有素的機器學(xué)習(xí)模型的存儲庫
- modelzoo.co —針對各種任務(wù)和庫的預(yù)訓(xùn)練深度學(xué)習(xí)模型
構(gòu)建訓(xùn)練循環(huán)-您的數(shù)據(jù)可能會與用于預(yù)訓(xùn)練模型的數(shù)據(jù)有所不同。對于圖像數(shù)據(jù)集,在為模型設(shè)置訓(xùn)練管道時需要考慮輸入分辨率和對象大小之類的東西。您還需要修改模型的輸出結(jié)構(gòu),以匹配標(biāo)簽的類和結(jié)構(gòu)。PyTorch閃電提供了一種簡單的方法,可以用有限的代碼擴大模型訓(xùn)練的規(guī)模。
- Scikit Learn —構(gòu)建和可視化經(jīng)典ML系統(tǒng)
- PyTorch,PyTorch Lightning,TensorFlow,TRAX —流行的深度學(xué)習(xí)Python庫
- Sagemaker —在Sagemaker IDE中構(gòu)建和訓(xùn)練ML系統(tǒng)
實驗跟蹤-這整個周期可能需要多次迭代。您最終將訓(xùn)練許多不同的模型,因此在跟蹤模型的不同版本以及對其進行訓(xùn)練的超參數(shù)和數(shù)據(jù)時要一絲不茍,將大大有助于保持事物的組織性。
階段3:評估

> Evaluation in the ML lifecycle (Image by author)
設(shè)法獲得學(xué)習(xí)了訓(xùn)練數(shù)據(jù)的模型后,就該開始挖掘并查看其在新數(shù)據(jù)上的表現(xiàn)如何。
評估ML模型的關(guān)鍵步驟:
可視化模型輸出-擁有訓(xùn)練有素的模型后,您需要立即在幾個樣本上運行它并查看輸出。這是在對整個測試集進行評估之前,找出培訓(xùn)/評估管道中是否存在任何錯誤的最佳方法。它還將顯示是否存在任何明顯的錯誤,例如您的兩個類的標(biāo)簽錯誤。
- OpenCV,Numpy,Matplotlib —編寫自定義可視化腳本
- FiftyOne —在圖像和視頻上可視化計算機視覺任務(wù)的輸出
選擇正確的指標(biāo)-提出一個或幾個指標(biāo)可以幫助比較模型的整體性能。為了確保您選擇適合您任務(wù)的最佳模型,應(yīng)開發(fā)符合最終目標(biāo)的指標(biāo)。當(dāng)您發(fā)現(xiàn)要跟蹤的其他重要品質(zhì)時,還應(yīng)該更新指標(biāo)。例如,如果要開始跟蹤對象檢測模型在小對象上的性能,請對包圍盒<0.05作為對象之一的對象使用mAP。
盡管這些總體數(shù)據(jù)集指標(biāo)可用于比較多個模型的性能,但它們很少有助于理解如何提高模型的性能。
- Scikit學(xué)習(xí)-提供通用指標(biāo)
- Python,Numpy-開發(fā)自定義指標(biāo)
查看故障案例-模型所做的一切都基于對其進行訓(xùn)練的數(shù)據(jù)。因此,假設(shè)它能夠?qū)W習(xí)某些東西,如果它的性能比您預(yù)期的要差,則需要查看數(shù)據(jù)。查看模型運行良好的情況可能很有用,但是查看模型正確預(yù)測的假陽性和假陰性至關(guān)重要。在仔細研究了這些樣本之后,您將開始看到模型中的故障模式。
例如,下圖顯示了來自“打開圖像”數(shù)據(jù)集的樣本,一個假陽性顯示為后輪。事實證明,這種誤報是缺少注釋。驗證數(shù)據(jù)集中的所有車輪注釋并修復(fù)其他類似的錯誤可以幫助改善模型在車輪上的性能。

> Image credit to Tyler Ganter (source)
- FiftyOne, Aquarium, Scale Nucleus—調(diào)試數(shù)據(jù)集以發(fā)現(xiàn)錯誤
制定解決方案-確定故障案例是找出解決方法的第一步,以提高模型性能。在大多數(shù)情況下,它可以回溯到添加訓(xùn)練數(shù)據(jù),類似于模型失敗的地方,但是它還可以包括更改管道中的預(yù)處理或后處理步驟或修復(fù)注釋之類的事情。無論解決方案是什么,您都只能通過了解模型失敗的地方來解決問題。
階段4:生產(chǎn)

> Deploying a model (Image by author)
最后!您已經(jīng)建立了一個模型,該模型可以很好地執(zhí)行您的評估指標(biāo),并且在各種極端情況下都不會出現(xiàn)重大錯誤。
現(xiàn)在,您需要:
監(jiān)控模型-測試您的部署,以確保您的模型相對于評估指標(biāo)和推理速度之類的測試數(shù)據(jù)仍能按預(yù)期運行。
- Pachyderm,Algorithmia,Datarobot,Kubeflow,MLFlow —部署和監(jiān)視模型和管道
- Amazon Web Services,Google AutoML,Microsoft Azure — ML模型的基于云的解決方案
評估新數(shù)據(jù)-在生產(chǎn)中使用模型意味著您將經(jīng)常通過從未經(jīng)過測試的模型傳遞全新數(shù)據(jù)。進行評估并挖掘特定的樣本,以查看模型如何處理遇到的任何新數(shù)據(jù),這一點很重要。
繼續(xù)理解模型-模型中的某些錯誤和偏見可能很根深蒂固,需要很長時間才能發(fā)現(xiàn)。您需要針對各種可能導(dǎo)致問題的邊緣情況和趨勢不斷測試和探查模型,如果這些情況可能會被客戶發(fā)現(xiàn),則會引起問題。
擴展功能-即使一切運行正常,該模型也可能無法實現(xiàn)您期望的利潤增長。從添加新類,開發(fā)新數(shù)據(jù)流到使模型更高效,有無數(shù)種方法可以擴展當(dāng)前模型的功能以使其變得更好。每當(dāng)您要改善系統(tǒng)時,都需要重新啟動ML生命周期以更新數(shù)據(jù),建模和評估所有內(nèi)容,以確保新功能能夠按預(yù)期工作。
FiftyOne
上面的內(nèi)容很籠統(tǒng),沒有偏見,但是我想向您介紹我一直在使用的工具。
在ML生命周期的各個部分都有許多工具。但是,非常缺乏工具可以幫助我在本文中強調(diào)的一些關(guān)鍵點??梢暬瘡?fù)雜數(shù)據(jù)(例如圖像或視頻)和標(biāo)簽,或編寫查詢以查找模型效果不佳的特定情況等操作通常是通過手動腳本完成的。
我一直在Voxel51上開發(fā)FiftyOne,這是一種開源數(shù)據(jù)可視化工具,旨在幫助調(diào)試數(shù)據(jù)集和模型并填補這一空白。FiftyOne使您可以在本地或遠程可視化GUI中的圖像和視頻數(shù)據(jù)集以及模型預(yù)測。它還提供了強大的功能,可以評估模型并針對數(shù)據(jù)集或模型輸出的任何方面編寫高級查詢。
FiftyOne可以在筆記本電腦上運行,因此請使用此Colab筆記本電腦在瀏覽器中進行嘗試?;蛘撸梢允褂胮ip輕松安裝它。
pip install fiftyone

> Sample from object detection model and dataset in FiftyOne (Image by author)
概要
試圖將機器學(xué)習(xí)(ML)納入其業(yè)務(wù)的所有公司中只有一小部分設(shè)法將模型實際部署到生產(chǎn)中。ML模型的生命周期不是直截了當(dāng)?shù)?,而是需要在?shù)據(jù)和注釋改進,模型和訓(xùn)練流水線構(gòu)建以及樣本級別評估之間進行連續(xù)迭代。如果您知道自己要干什么,那么這個周期最終可能會產(chǎn)生可用于生產(chǎn)的模型,但是還需要隨著時間的推移進行維護和更新。幸運的是,開發(fā)了無數(shù)工具來幫助完成此過程的每個步驟。