0
本文作者: skura | 2019-11-05 16:45 |
在傳統(tǒng)的軟件開(kāi)發(fā)中,一個(gè) bug 通常會(huì)導(dǎo)致程序崩潰。這對(duì)用戶來(lái)說(shuō)是很煩人的,因此解決這些問(wèn)題對(duì)開(kāi)發(fā)人員來(lái)說(shuō)很重要——當(dāng)程序失敗時(shí),開(kāi)發(fā)人員可以檢查錯(cuò)誤以了解原因。
在機(jī)器學(xué)習(xí)模型中,開(kāi)發(fā)人員有時(shí)會(huì)遇到錯(cuò)誤,但經(jīng)常會(huì)在沒(méi)有明確原因的情況下導(dǎo)致程序崩潰。雖然這些問(wèn)題可以手動(dòng)調(diào)試,但機(jī)器學(xué)習(xí)模型通常由于輸出預(yù)測(cè)不佳而失敗。更糟糕的是,當(dāng)模型失敗時(shí),通常沒(méi)有信號(hào)顯示模型失敗的原因或時(shí)間。而使情況更為復(fù)雜的是,這可能是由于一些因素造成的,包括糟糕的訓(xùn)練數(shù)據(jù)、高損失誤差或缺乏收斂速度。
在這篇博客文章中,我們將討論如何調(diào)試這些無(wú)聲故障,以便它們不會(huì)影響我們機(jī)器學(xué)習(xí)算法的性能。以下是我們將要介紹的內(nèi)容的簡(jiǎn)要概述:
如何發(fā)現(xiàn)輸入數(shù)據(jù)中的缺陷。
如何使模型從較少的數(shù)據(jù)中學(xué)到更多。
如何為訓(xùn)練準(zhǔn)備數(shù)據(jù),避免常見(jiàn)陷阱。
如何尋找最優(yōu)模型超參數(shù)。
如何安排學(xué)習(xí)速率以減少過(guò)擬合。
如何用權(quán)重和偏差監(jiān)測(cè)訓(xùn)練進(jìn)度。
值得注意的是,作為一名數(shù)據(jù)科學(xué)/機(jī)器學(xué)習(xí)實(shí)踐者,你需要認(rèn)識(shí)到機(jī)器學(xué)習(xí)項(xiàng)目失敗的原因有很多。大多數(shù)與工程師和數(shù)據(jù)科學(xué)家的技能無(wú)關(guān)(僅僅因?yàn)樗黄鹱饔貌⒉灰馕吨阌腥毕荩?。我們的收獲是,如果我們能夠盡早發(fā)現(xiàn)常見(jiàn)的陷阱或漏洞,我們可以節(jié)省時(shí)間和金錢(qián)。在金融、政府和醫(yī)療等高風(fēng)險(xiǎn)應(yīng)用領(lǐng)域,這將是至關(guān)重要的。
1.如何發(fā)現(xiàn)輸入數(shù)據(jù)中的缺陷
在想知道我們的數(shù)據(jù)是否能夠勝任訓(xùn)練一個(gè)好模型的任務(wù),可以考慮兩個(gè)方面:
數(shù)據(jù)能預(yù)測(cè)我們想要預(yù)測(cè)的結(jié)果嗎?
有足夠的數(shù)據(jù)嗎?
為了弄清楚我們的模型是否包含預(yù)測(cè)信息,我們可以捫心自問(wèn):給定這些數(shù)據(jù),人類能做出預(yù)測(cè)嗎?
如果一個(gè)人不能理解一幅圖像或一段文字,那么我們的模型也不會(huì)預(yù)測(cè)出有意義的結(jié)果。如果沒(méi)有足夠的預(yù)測(cè)信息,給我們的模型增加更多的輸入并不會(huì)使它變得更好;相反,模型會(huì)過(guò)擬合,變得不太準(zhǔn)確。
一旦我們的數(shù)據(jù)有足夠的預(yù)測(cè)信息,我們就需要弄清楚我們是否有足夠的數(shù)據(jù)來(lái)訓(xùn)練一個(gè)模型來(lái)提取信號(hào)。有幾個(gè)經(jīng)驗(yàn)法則可以遵循:
對(duì)于分類,我們每類至少應(yīng)有 30 個(gè)獨(dú)立樣本。
對(duì)于任何特征,特別是結(jié)構(gòu)化數(shù)據(jù)問(wèn)題,我們至少應(yīng)該有 10 個(gè)樣本。
數(shù)據(jù)集的大小與模型中參數(shù)的數(shù)量成正比。這些規(guī)則可能需要根據(jù)你的特定應(yīng)用程序進(jìn)行調(diào)整。如果你能利用遷移學(xué)習(xí),那么你可以大大減少所需樣本的數(shù)量。
2.如何使模型從較少的數(shù)據(jù)中學(xué)習(xí)更多
在許多情況下,我們只是沒(méi)有足夠的數(shù)據(jù)。在這種情況下,最好的選擇之一是擴(kuò)充數(shù)據(jù)。再進(jìn)一步,我們可以用自動(dòng)編碼器和生成對(duì)抗網(wǎng)絡(luò)等生成模型生成自己的數(shù)據(jù)。
同樣,我們可以找到外部公共數(shù)據(jù),這些數(shù)據(jù)可以在互聯(lián)網(wǎng)上找到。即使數(shù)據(jù)最初不是為我們的目的而收集的,我們也可以潛在地重新標(biāo)記它或?qū)⑵溆糜谶w移學(xué)習(xí)。我們可以在一個(gè)大數(shù)據(jù)集上為不同的任務(wù)訓(xùn)練一個(gè)模型,然后使用該模型作為任務(wù)的基礎(chǔ)。同樣,我們可以找到一個(gè)別人為不同任務(wù)訓(xùn)練過(guò)的模型,并將其重新用于我們的任務(wù)。
重要的是,要記住,在大多數(shù)情況下,數(shù)據(jù)的質(zhì)量勝過(guò)數(shù)據(jù)的數(shù)量。擁有一個(gè)小的、高質(zhì)量的數(shù)據(jù)集并訓(xùn)練一個(gè)簡(jiǎn)單的模型是在訓(xùn)練過(guò)程早期發(fā)現(xiàn)數(shù)據(jù)中問(wèn)題的最佳實(shí)踐。許多數(shù)據(jù)科學(xué)家犯的一個(gè)錯(cuò)誤是,他們花時(shí)間和金錢(qián)獲取一個(gè)大數(shù)據(jù)集,但后來(lái)發(fā)現(xiàn)他們的項(xiàng)目有錯(cuò)誤的數(shù)據(jù)類型。
3.如何準(zhǔn)備訓(xùn)練數(shù)據(jù)并避免常見(jiàn)的陷阱
有三種常用方法可以預(yù)處理訓(xùn)練過(guò)程的數(shù)據(jù)特征:
標(biāo)準(zhǔn)化確保所有數(shù)據(jù)的平均值為 0,標(biāo)準(zhǔn)偏差為 1。這是減少特征的最常見(jiàn)方式。如果你懷疑數(shù)據(jù)中包含異常值,那么它甚至更有用。
最小—最大重縮放通過(guò)減去最小值,然后除以值的范圍,將所有數(shù)據(jù)的值縮放到 0 和 1 之間。
平均值規(guī)范化確保數(shù)據(jù)的值介于(-1)和 1 之間,平均值為 0。我們減去平均值,除以數(shù)據(jù)的范圍。
然而,我們?cè)跍?zhǔn)備特征時(shí),只測(cè)量測(cè)試集上的度量因子、平均值和標(biāo)準(zhǔn)差是很重要的。如果我們?cè)谡麄€(gè)數(shù)據(jù)集上測(cè)量這些因素,由于信息暴露,算法在測(cè)試集上的性能可能會(huì)比在實(shí)際生產(chǎn)中更好。
4.如何找到最優(yōu)模型超參數(shù)
手動(dòng)調(diào)整神經(jīng)網(wǎng)絡(luò)模型的超參數(shù)可能非常繁瑣。這是因?yàn)楫?dāng)涉及到超參數(shù)調(diào)整時(shí),沒(méi)有科學(xué)的規(guī)則可供使用。這就是為什么許多數(shù)據(jù)科學(xué)家已經(jīng)轉(zhuǎn)向自動(dòng)超參數(shù)搜索,使用某種基于非梯度的優(yōu)化算法。
為了了解如何在權(quán)重和偏差的情況下找到模型的最優(yōu)超參數(shù),讓我們看看 mask r-cnn 計(jì)算機(jī)視覺(jué)模型的這個(gè)例子。為了實(shí)現(xiàn)語(yǔ)義分割任務(wù)的 mask r-cnn,connor 和 trent 調(diào)整了控制模型運(yùn)行方式的不同超參數(shù):學(xué)習(xí)速率、梯度剪輯歸一化、權(quán)重衰減、比例、各種損失函數(shù)的權(quán)重……他們想知道圖像的語(yǔ)義分割是如何進(jìn)行的。由于模型使用不同的超參數(shù)進(jìn)行訓(xùn)練,因此他們集成了一個(gè) imagecallback()類來(lái)同步到 wandb。此外,他們還寫(xiě)了一個(gè)腳本,用于運(yùn)行參數(shù)掃描,這些掃描可以適應(yīng)不同的超參數(shù)或同一超參數(shù)的不同值。
他們的結(jié)果可以在 Wandb Run 頁(yè)面上找到。高梯度裁剪集和高學(xué)習(xí)速率可以提高模型精度,在迭代次數(shù)增加的情況下,驗(yàn)證損失分?jǐn)?shù)會(huì)迅速下降。
5.如何安排學(xué)習(xí)率以減少過(guò)度適應(yīng)
其中最重要的超參數(shù)之一是學(xué)習(xí)速率,這是很難優(yōu)化的。學(xué)習(xí)速率小導(dǎo)致訓(xùn)練速度慢,學(xué)習(xí)速率大導(dǎo)致模型過(guò)度擬合。
在尋找學(xué)習(xí)速率方面,標(biāo)準(zhǔn)的超參數(shù)搜索技術(shù)不是最佳選擇。對(duì)于學(xué)習(xí)速率,最好執(zhí)行一個(gè)行搜索并可視化不同學(xué)習(xí)速率的損失,因?yàn)檫@將使你了解損失函數(shù)的行為方式。在進(jìn)行直線搜索時(shí),最好以指數(shù)方式提高學(xué)習(xí)率。你更可能關(guān)心學(xué)習(xí)速率較小的區(qū)域。
一開(kāi)始,我們的模型可能離最優(yōu)解很遠(yuǎn),因此,我們希望盡可能快地移動(dòng)。然而,當(dāng)我們接近最小損失時(shí),我們希望移動(dòng)得更慢以避免超調(diào)。因此,我們應(yīng)該定義一個(gè)學(xué)習(xí)速率表,以便在訓(xùn)練期間根據(jù)指定的規(guī)則更新速率。
6.如何用權(quán)重和偏差監(jiān)控訓(xùn)練進(jìn)度
調(diào)試模型的一個(gè)重要部分是,在投入大量時(shí)間訓(xùn)練模型之前,先搞清楚什么時(shí)候會(huì)出問(wèn)題。wandb 提供了一種無(wú)縫的方式來(lái)可視化和跟蹤機(jī)器學(xué)習(xí)實(shí)驗(yàn)。你可以搜索/比較/可視化訓(xùn)練運(yùn)行,分析運(yùn)行時(shí)的系統(tǒng)使用指標(biāo),復(fù)制歷史結(jié)果,等等。
安裝完 wandb 之后,我們要做的就是在我們的訓(xùn)練腳本中包含這段代碼:
import wandb
# Your custom arguments defined here
args = …
wandb.init(config=args, project=”my-project”)
wandb.config[“more”] = “custom”
def training_loop():
while True:
# Do some machine learning
epoch, loss, val_loss = …
# Framework agnostic / custom metrics
wandb.log({“epoch”: epoch, “l(fā)oss”: loss, “val_loss”: val_loss})
或者,我們可以將 tensorboard 集成在一行中:
wandb.init(sync_tensorboard=True)
TensorBoard 是 TensorFlow 擴(kuò)展,它允許我們?cè)跒g覽器中輕松監(jiān)視模型。為了提供一個(gè)接口,我們可以從中觀察模型的進(jìn)程,tensorboard 還提供了一些對(duì)調(diào)試有用的選項(xiàng)。例如,我們可以在訓(xùn)練過(guò)程中觀察模型的權(quán)重和梯度的分布。如果我們真的想深入研究這個(gè)模型,tensorboard 提供了一個(gè)可視化的調(diào)試器。在這個(gè)調(diào)試器中,我們可以逐步執(zhí)行 tensorflow 模型并檢查其中的每個(gè)值。如果我們正在研究復(fù)雜的模型,比如變分自動(dòng)編碼器,并且試圖理解復(fù)雜事物為什么會(huì)崩潰,這一點(diǎn)尤其有用。
結(jié)論
我們現(xiàn)在有大量的工具可以幫助我們運(yùn)行實(shí)際的機(jī)器學(xué)習(xí)項(xiàng)目。確保模型在部署之前能夠正常工作是至關(guān)重要的,如果不這樣做,我們會(huì)損失很多錢(qián)。希望這篇博客文章能為你提供實(shí)用的技術(shù),使模型具有通用性,易于調(diào)試。
via:https://mc.ai/six-ways-to-debug-a-machine-learning-model/
雷鋒網(wǎng)雷鋒網(wǎng)雷鋒網(wǎng)
雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見(jiàn)轉(zhuǎn)載須知。