丁香五月天婷婷久久婷婷色综合91|国产传媒自偷自拍|久久影院亚洲精品|国产欧美VA天堂国产美女自慰视屏|免费黄色av网站|婷婷丁香五月激情四射|日韩AV一区二区中文字幕在线观看|亚洲欧美日本性爱|日日噜噜噜夜夜噜噜噜|中文Av日韩一区二区

您正在使用IE低版瀏覽器,為了您的雷峰網(wǎng)賬號(hào)安全和更好的產(chǎn)品體驗(yàn),強(qiáng)烈建議使用更快更安全的瀏覽器
此為臨時(shí)鏈接,僅用于文章預(yù)覽,將在時(shí)失效
人工智能學(xué)術(shù) 正文
發(fā)私信給這只萌萌
發(fā)送

1

機(jī)器學(xué)習(xí)中踩過(guò)的坑,如何讓你變得更專(zhuān)業(yè)?

本文作者: 這只萌萌 2020-06-06 16:38
導(dǎo)語(yǔ):數(shù)據(jù)科學(xué)家 Archy de Berker 在本文中詳述了他和周?chē)閭冊(cè)跈C(jī)器學(xué)習(xí)探索中踩過(guò)的坑,帶大家了解機(jī)器學(xué)習(xí)中一些有趣的錯(cuò)誤。

踩過(guò)坑才知道哪些路是不可行的,有時(shí)候犯錯(cuò)誤也能幫助我們變得更加專(zhuān)業(yè)。

數(shù)據(jù)科學(xué)家 Archy de Berker 在本文中詳述了他和周?chē)閭冊(cè)跈C(jī)器學(xué)習(xí)探索中踩過(guò)的坑,這也都是大家經(jīng)常性遇到的問(wèn)題。他希望通過(guò)這一篇文章,帶大家了解機(jī)器學(xué)習(xí)中一些有趣的錯(cuò)誤——一些只有你深入了這個(gè)領(lǐng)域才能接觸到的錯(cuò)誤。

這不是一篇入門(mén)級(jí)的文章,想要讀懂本文,最好先在 Pytorch 或 Tensorow 上多練習(xí)下毀壞模型。

機(jī)器學(xué)習(xí)中踩過(guò)的坑,如何讓你變得更專(zhuān)業(yè)?

本文主要集中在綠色分布的錯(cuò)誤,但紫色分布和黃色分布也會(huì)部分涉及

一、機(jī)器學(xué)習(xí)中的常見(jiàn)錯(cuò)誤

Berker 將機(jī)器學(xué)習(xí)中出現(xiàn)的各種錯(cuò)誤歸為三大類(lèi),嚴(yán)重程度由低到高。

1、這些錯(cuò)誤只會(huì)浪費(fèi)你的時(shí)間

機(jī)器學(xué)習(xí)中踩過(guò)的坑,如何讓你變得更專(zhuān)業(yè)?

計(jì)算科學(xué)中最難的兩件事是命名和緩存失效,圖中這條推文高度概括了此類(lèi)錯(cuò)誤。shape error 是最可怕又最常見(jiàn)的錯(cuò)誤,通常是由于大小不一致的矩陣相乘導(dǎo)致。

本文不會(huì)花太多時(shí)間來(lái)討論這類(lèi)錯(cuò)誤,因?yàn)殄e(cuò)得非常明顯。大家很容易找到錯(cuò)誤,然后進(jìn)行修復(fù),然后再犯錯(cuò),然后再修復(fù)。這是個(gè)不斷重復(fù)的過(guò)程。

2. 這些錯(cuò)誤會(huì)導(dǎo)致結(jié)果不準(zhǔn)確

這類(lèi)錯(cuò)誤會(huì)讓你付出很大代價(jià),因?yàn)樗鼤?huì)造成模型結(jié)果不準(zhǔn)確。

2015年,有一架從澳大利亞悉尼飛往馬來(lái)西亞吉隆坡的亞航航班因出現(xiàn)技術(shù)故障,在墨爾本機(jī)場(chǎng)緊急降落。如果模型的結(jié)果不準(zhǔn)確,就如同這架飛機(jī)的技術(shù)故障,最終會(huì)飛到錯(cuò)誤的目的地。

舉個(gè)例子,假如你在模型中新增了一個(gè)特征并同時(shí)增加了許多參數(shù),在未進(jìn)行超參數(shù)調(diào)優(yōu)的情況下對(duì)比之前的性能,發(fā)現(xiàn)增加特征后模型性能變差了,于是得出結(jié)論,增加的特征會(huì)讓模型性能變差。這是不對(duì)的,實(shí)際上你需要更加規(guī)范化的操作,以尋求更具表現(xiàn)力的模型。

錯(cuò)誤對(duì)于模型的影響會(huì)隨著時(shí)間而加重,導(dǎo)致更加不準(zhǔn)確的實(shí)驗(yàn)結(jié)果。因此,盡早發(fā)現(xiàn)錯(cuò)誤是非常有價(jià)值的。

3、這些錯(cuò)誤會(huì)讓你誤認(rèn)為自己的模型已經(jīng)「完美」

這是很?chē)?yán)重的錯(cuò)誤,會(huì)讓你高估模型的性能。這種錯(cuò)誤通常很難發(fā)現(xiàn),因?yàn)槲覀儚男牡桌锊辉赋姓J(rèn)看似”完美“的模型可能是假象。

當(dāng)模型表現(xiàn)得出奇差時(shí),我們傾向于不相信然后再測(cè)試一遍,但當(dāng)模型表現(xiàn)得出奇好時(shí),我們通常會(huì)相信并開(kāi)始沾沾自喜。這就是所謂的確認(rèn)偏差(Confirmation Bias),即個(gè)人無(wú)論合乎事實(shí)與否,都傾向于偏好支持自己的見(jiàn)解、猜想。

模型性能看似「完美」,通常是因?yàn)檫^(guò)擬合的原因,導(dǎo)致訓(xùn)練數(shù)據(jù)已經(jīng)不再有代表性,或者是因?yàn)檫x錯(cuò)了評(píng)價(jià)指標(biāo),這兩點(diǎn)后文都會(huì)詳細(xì)解釋。

如果你只能從本文帶走一點(diǎn),希望你記?。簺](méi)有什么比你發(fā)現(xiàn)模型的真正結(jié)果實(shí)際上很糟糕這件事更令人尷尬和沮喪的了。

二、機(jī)器學(xué)習(xí)的生命周期

機(jī)器學(xué)習(xí)中踩過(guò)的坑,如何讓你變得更專(zhuān)業(yè)?

機(jī)器學(xué)習(xí)就如同上圖香腸機(jī)的三個(gè)階段一樣:獲取數(shù)據(jù),將數(shù)據(jù)輸入到模型中,然后通過(guò)一些指標(biāo)來(lái)量化輸出。

接下來(lái)我們會(huì)討論到每個(gè)階段中一些看似愚蠢的錯(cuò)誤。

1、輸出什么:評(píng)價(jià)指標(biāo)

機(jī)器學(xué)習(xí)可以歸結(jié)為不斷減少損失函數(shù)值的過(guò)程。

機(jī)器學(xué)習(xí)中踩過(guò)的坑,如何讓你變得更專(zhuān)業(yè)?

但是,損失函數(shù)絕不是最終的優(yōu)化目標(biāo),它只是一個(gè)近似值。例如訓(xùn)練分類(lèi)任務(wù)時(shí),通過(guò)交叉熵?fù)p失函數(shù)來(lái)優(yōu)化訓(xùn)練集或者驗(yàn)證集,但實(shí)際上我們更加信任在測(cè)試集上的結(jié)果或者說(shuō) F1、AUC 評(píng)價(jià)指標(biāo)。在實(shí)際優(yōu)化目標(biāo)的數(shù)據(jù)差異非常小的情況下,在模型評(píng)價(jià)上采用低置信度來(lái)加速評(píng)價(jià)過(guò)程會(huì)導(dǎo)致問(wèn)題更加嚴(yán)重。

無(wú)論在哪種環(huán)境下,如果損失函數(shù)已經(jīng)不能代表模型的真實(shí)表現(xiàn),那么麻煩就大了。

此外還有一些讓模型更糟糕的做法:

1)混合訓(xùn)練集和測(cè)試集

機(jī)器學(xué)習(xí)中踩過(guò)的坑,如何讓你變得更專(zhuān)業(yè)?

混合訓(xùn)練集和測(cè)試集是很容易的,而且通常會(huì)訓(xùn)練出來(lái)很不錯(cuò)的性能,但這樣的模型在復(fù)雜的真實(shí)環(huán)境中會(huì)表現(xiàn)非常糟糕。

所以,訓(xùn)練集、驗(yàn)證集、測(cè)試集數(shù)據(jù)是不能相交的,各自需要包含不同的樣本數(shù)據(jù)。我們要思考模型需要怎樣的泛化能力,這最終會(huì)通過(guò)測(cè)試集的性能來(lái)量化。

以商店收據(jù)的數(shù)據(jù)為例,使用商店的收據(jù)進(jìn)行分析預(yù)測(cè),那么測(cè)試集顯然需要包含以前沒(méi)見(jiàn)過(guò)的新數(shù)據(jù),但是測(cè)試集是否也需包含以前沒(méi)見(jiàn)過(guò)的新商品以保證模型不會(huì)對(duì)特定商店過(guò)度測(cè)試呢 (過(guò)擬合)?

最好的方式是一次性將數(shù)據(jù)分為訓(xùn)練集、驗(yàn)證集和測(cè)試集,然后放在不同的文件夾下,且命名都應(yīng)該非常明確,例如 TrainDataLoader 和 TestDataLoader。

2)錯(cuò)誤使用損失函數(shù)

錯(cuò)誤使用損失函數(shù)其實(shí)是很少出現(xiàn)的,因?yàn)橐呀?jīng)有無(wú)數(shù)的材料教會(huì)大家如何使用損失函數(shù)。最常見(jiàn)的兩種錯(cuò)誤使用損失函數(shù)的情況,一個(gè)是搞不清楚損失函數(shù)要使用概率分布還是對(duì)數(shù)(即是否需要添加 softmax),另一個(gè)就是混淆了回歸函數(shù)和分類(lèi)函數(shù)。

即使在學(xué)術(shù)界,混淆回歸函數(shù)和分類(lèi)函數(shù)也是很普遍的。例如亞馬遜用戶的評(píng)價(jià)和評(píng)星數(shù)據(jù) Amazon Reviews 數(shù)據(jù)集,經(jīng)常被頂級(jí)實(shí)驗(yàn)室用于分類(lèi)任務(wù),但這其實(shí)是不太對(duì)的,因?yàn)榕c 1 星評(píng)價(jià)相比,5 星評(píng)價(jià)顯然更類(lèi)似于 4 星評(píng)價(jià),應(yīng)該采用有序回歸。

2、選錯(cuò)評(píng)價(jià)指標(biāo)

不同的任務(wù)使用的損失函數(shù)不一樣,而在模型性能的驗(yàn)證上,我們也經(jīng)常組合多個(gè)側(cè)重點(diǎn)不一樣的評(píng)價(jià)指標(biāo)來(lái)評(píng)估模型性能。例如,機(jī)器翻譯首選 BLEU 作為評(píng)價(jià)指標(biāo),自動(dòng)文摘采用 ROUGE 來(lái)驗(yàn)證性能,而對(duì)于其他任務(wù),可以選用準(zhǔn)確性,精確度或召回率作為評(píng)價(jià)指標(biāo)。

通常,評(píng)價(jià)指標(biāo)比損失函數(shù)容易讓人理解。一個(gè)好的思路是盡可能多地記錄日志。

認(rèn)真思考如何劃分不相交的訓(xùn)練集、測(cè)試集和驗(yàn)證集,讓模型具有優(yōu)異而不過(guò)度的泛化能力。在訓(xùn)練過(guò)程中可以使用評(píng)價(jià)指標(biāo)來(lái)測(cè)試模型性能,而不必等到最后才開(kāi)始使用測(cè)試集來(lái)測(cè)試。這樣有助于更好地理解模型當(dāng)前的訓(xùn)練結(jié)果,防止問(wèn)題到最后才暴露。

評(píng)價(jià)指標(biāo)的選擇上要多注意。舉個(gè)例子,你不能用簡(jiǎn)單使用準(zhǔn)確性來(lái)評(píng)估序列模型的性能,因?yàn)樾蛄虚g的非對(duì)齊情況會(huì)導(dǎo)致準(zhǔn)確率為 0。因此對(duì)于序列數(shù)據(jù)要采用距離來(lái)評(píng)估。選錯(cuò)評(píng)價(jià)指標(biāo)是非常痛苦的事情。

還是以序列模型為例,請(qǐng)確保排除了所有特殊字符,特殊字符通常是序列的開(kāi)頭、結(jié)尾和填充。如果忘記了排除特殊字符,可能會(huì)得到看起來(lái)不錯(cuò)的模型性能,但這樣的模型實(shí)際上只能預(yù)測(cè)充滿填充字符的長(zhǎng)序列。

有一個(gè)讓作者印象非常深刻的錯(cuò)誤,其曾經(jīng)做過(guò)一些語(yǔ)義解析工作,目的是將自然語(yǔ)言語(yǔ)句轉(zhuǎn)換為數(shù)據(jù)庫(kù)查詢,回答諸如「明天從蒙特利爾到亞特蘭大有多少趟航班?」這樣的典型 SQL 問(wèn)題。為了評(píng)價(jià)模型的準(zhǔn)確性,他們將模型轉(zhuǎn)義的 SQL 查詢發(fā)送到數(shù)據(jù)庫(kù),檢查返回的內(nèi)容是否與真實(shí)查詢的內(nèi)容匹配。他設(shè)置了一種情況,如果向數(shù)據(jù)庫(kù)發(fā)送毫無(wú)意義的查詢,數(shù)據(jù)庫(kù)返回「error」。然后,他發(fā)送了已經(jīng)被損壞的預(yù)測(cè) SQL 和真實(shí) SQL 到數(shù)據(jù)庫(kù)查詢,兩者都返回「error」,模型將這種情況計(jì)算為: 100%準(zhǔn)確。

這就引出了指導(dǎo)原則,你犯的任何錯(cuò)誤只會(huì)使性能變差。要堅(jiān)持檢查模型實(shí)際做出的預(yù)測(cè),而不僅僅是關(guān)注評(píng)價(jià)指標(biāo)的結(jié)果。

3、避免評(píng)價(jià)指標(biāo)的錯(cuò)誤

1) 首先跑一遍所有評(píng)價(jià)指標(biāo)

在沒(méi)有任何訓(xùn)練的情況下如果模型表現(xiàn)很好,那一定是有問(wèn)題的。

2) 所有過(guò)程都記錄日志

機(jī)器學(xué)習(xí)是一門(mén)定量學(xué)科,但數(shù)字有時(shí)候也可能會(huì)騙人,所有可以想到的數(shù)字都記錄日志,但要以容易理解的方式記錄。

在 NLP 中,這通常意味著你需要顛倒標(biāo)記,這過(guò)程很復(fù)雜,但百分百是值得的,日志提供了模型訓(xùn)練過(guò)程中的定性解釋。例如,語(yǔ)言模型通常從學(xué)習(xí)輸出類(lèi)似 eeeeeeeeee <PAD> <PAD> <PAD>字符串開(kāi)始,因?yàn)檫@些都是數(shù)據(jù)中最常見(jiàn)的字符。

如果是處理圖像任務(wù),那么日志就更加麻煩了,因?yàn)槟悴荒軐D片以文本的形式存為日志??梢酝ㄟ^(guò)使用 ASCII 解決這一問(wèn)題,即在 OCR 的訓(xùn)練過(guò)程中使用 ASCII 保存日志,從而能可視化輸入的圖像數(shù)據(jù):

機(jī)器學(xué)習(xí)中踩過(guò)的坑,如何讓你變得更專(zhuān)業(yè)?

3)研究驗(yàn)證集

使用測(cè)試評(píng)價(jià)指標(biāo)來(lái)確定集合中性能最佳和最差的樣本。了解樣本情況,使用一些量化置信度的方法(如 softmax),了解模型可能在哪些分布上表現(xiàn)良好、哪些分布上會(huì)表現(xiàn)糟糕,在回歸任務(wù)中殘差分析是很有用的。

但是請(qǐng)記住,正如 Anscombe Quartet 指出的那樣,平均值可能會(huì)誤導(dǎo)你。

Anscombe Quartet:所有 4 個(gè)模型的均值和方差均相同,而且它們都擬合了同一條回歸線 t。因此,不用過(guò)分依賴統(tǒng)計(jì)結(jié)果,要理解數(shù)據(jù)本身。

機(jī)器學(xué)習(xí)中踩過(guò)的坑,如何讓你變得更專(zhuān)業(yè)?

如果遇到多維問(wèn)題,嘗試?yán)L制錯(cuò)誤與單個(gè)特征的關(guān)系圖來(lái)找出原因。是否存在模型表現(xiàn)非常差的輸入空間區(qū)域?如果是這樣,你可能需要在該數(shù)據(jù)區(qū)域補(bǔ)充更多數(shù)據(jù)或進(jìn)行數(shù)據(jù)增強(qiáng)。

考慮消融和干擾在模型性能中的影響。諸如 LIME 和 Eli5 之類(lèi)的工具可以讓模型變簡(jiǎn)單。下面這篇文章很好地描述了擾動(dòng)分析,揭示了用于 X 射線分類(lèi)的 CNN 模型使用 X 射線機(jī)本身引入的標(biāo)簽來(lái)確定患者是否患有肺炎,而不是 X 射線機(jī)的使用本身可能和患病率之間存在的相關(guān)性:

https://medium.com/@jrzech/what-are-radiological-deep-learning-models-actually-learning-f97a546c5b98

三、模型

現(xiàn)在很多課程和文章都將重點(diǎn)放在建模方面。但實(shí)際上,作為機(jī)器學(xué)習(xí)從業(yè)者,大部分時(shí)間都是在處理數(shù)據(jù)和指標(biāo),而不是研究創(chuàng)新的算法。    

深度學(xué)習(xí)錯(cuò)誤中的絕大多數(shù)都是形狀錯(cuò)誤( shape error),從而導(dǎo)致很多淺顯的錯(cuò)誤發(fā)生。

1、模型錯(cuò)誤類(lèi)型

模型錯(cuò)誤類(lèi)型很多,如下:

1) 包含不可微分運(yùn)算操作的模型

在深度學(xué)習(xí)模型中,一切都必須是端到端可微分的,以支持反向計(jì)算。因此,你可能希望不可微分操作能夠在 TensorFlow 等深度學(xué)習(xí)框架中被明確標(biāo)識(shí)出來(lái)。這是不對(duì)的,正如 Berker 曾經(jīng)對(duì) Keras Lambda 層感到特別困惑,因?yàn)樗梢云茐姆聪蛴?jì)算。一個(gè)解決辦法是使用 model.summary() 進(jìn)行檢查,以驗(yàn)證大多數(shù)參數(shù)是可訓(xùn)練的,如果發(fā)現(xiàn)有不可訓(xùn)練參數(shù)的 layer,則可能是破壞了自動(dòng)微分能力。

2)在測(cè)試時(shí)沒(méi)有成功關(guān)閉 dropout

我們都知道,在測(cè)試數(shù)據(jù)時(shí)需要關(guān)閉 dropout,否則可能獲得的是隨機(jī)結(jié)果。這可能非常令人困惑,尤其是對(duì)于正在部署模型并開(kāi)始跑測(cè)試集的人而言。

這一問(wèn)題可以通過(guò) eval() 來(lái)解決。另外需要注意的是,在訓(xùn)練模型時(shí) dropout 可能會(huì)導(dǎo)致一個(gè)奇怪現(xiàn)象——模型在驗(yàn)證集上的準(zhǔn)確性高過(guò)比訓(xùn)練集上的準(zhǔn)確性。這是因?yàn)樵隍?yàn)證集上用到了 dropout,這看起來(lái)可能是欠擬合了,而且可以會(huì)造成一些讓你頭疼的問(wèn)題。

3)維度參數(shù)錯(cuò)誤

不同框架在樣本數(shù) (batch size),序列長(zhǎng)度 (sequence length) 和通道數(shù) (channels) 上有不一樣的約定,有些框架提供了在這三者上的修改空間,但其他的框架是不允許任意修改的,修改就會(huì)出錯(cuò)。

維度參數(shù)錯(cuò)誤可能會(huì)產(chǎn)生奇怪現(xiàn)象。例如,如果你弄錯(cuò)了樣本數(shù)和序列長(zhǎng)度,那么最終可能會(huì)忽略部分樣本的信息,并且無(wú)法隨著時(shí)間保存信息。

2、避免模型的錯(cuò)誤

1)模塊化,可測(cè)試

 如果發(fā)現(xiàn)有不可訓(xùn)練參數(shù)的層,則可能是破壞了自動(dòng)微分能力。

 編寫(xiě)結(jié)構(gòu)合理的代碼并進(jìn)行單元測(cè)試是有助于避免模型錯(cuò)誤的。

 將模型分為幾個(gè)離散的代碼塊,每個(gè)代碼塊有明確的功能定義,就可以對(duì)其進(jìn)行有效的測(cè)試。測(cè)試的重點(diǎn),在于驗(yàn)證變化樣本數(shù)和輸入數(shù)據(jù)量的情況下,模型是否與預(yù)期一致?Berker 推薦了 Chase Roberts 的一篇帖子,詳細(xì)介紹了 ML 代碼的單元測(cè)試:

https://medium.com/@keeper6928/how-to-unit-test-machine-learning-code-57cf6fd81765

2)維度論斷

Berker 傾向于將維度論斷加入到 ML 代碼中,讓讀者可以清楚地知道哪些維度應(yīng)該更改,哪些不應(yīng)該更改。當(dāng)然,如果發(fā)生意外,它會(huì)引發(fā)錯(cuò)誤。

機(jī)器學(xué)習(xí)中踩過(guò)的坑,如何讓你變得更專(zhuān)業(yè)?

富有表達(dá)力的 Tensorflow 代碼,由 Keith Ito 提供。注意模塊化和注釋。

至少要養(yǎng)成在代碼中添加維度注釋的習(xí)慣,讓讀者可以直接閱讀而不需要記憶大量信息。請(qǐng)前往以下地址查看 Keith Ito 實(shí)現(xiàn) beautifulTacotron 的代碼,這是一個(gè)注釋的優(yōu)秀范例:

https://github.com/keithito/tacotron/blob/master/models/tacotron.py

3)小數(shù)據(jù)簡(jiǎn)單模型的過(guò)擬合問(wèn)題

機(jī)器學(xué)習(xí)中踩過(guò)的坑,如何讓你變得更專(zhuān)業(yè)?

技巧:先確保模型在非常小的一部分?jǐn)?shù)據(jù)集上進(jìn)行過(guò)擬合訓(xùn)練,短時(shí)間內(nèi)排除明顯的錯(cuò)誤。

盡量讓模型能輕松通過(guò)配置文件進(jìn)行配置,并指定參數(shù)最少的測(cè)試配置。然后在 CI/CD 中添加一個(gè)步驟,檢查非常小的數(shù)據(jù)集的過(guò)擬合,并自動(dòng)運(yùn)行它。這將有助于捕獲破壞模型和訓(xùn)練 管道的代碼改動(dòng)。

四、數(shù)據(jù)

1、首先,要了解數(shù)據(jù)

在開(kāi)始建模之前,你應(yīng)該就已經(jīng)厭倦了數(shù)據(jù)探查吧。

大多數(shù)機(jī)器學(xué)習(xí)模型都在嘗試復(fù)制人腦的某些模式識(shí)別能力。在開(kāi)始編寫(xiě)代碼之前需要熟悉數(shù)據(jù),鍛煉模式識(shí)別能力,讓你的代碼寫(xiě)的更輕松!了解數(shù)據(jù)集有助于整體架構(gòu)的考慮和指標(biāo)的選擇,而且能夠迅速識(shí)別可能會(huì)出現(xiàn)性能問(wèn)題的地方。

一般來(lái)說(shuō),數(shù)據(jù)本身就可以識(shí)別一些問(wèn)題:數(shù)據(jù)不平衡,文件類(lèi)型問(wèn)題或者數(shù)據(jù)偏見(jiàn)。數(shù)據(jù)偏見(jiàn)很難通過(guò)算法進(jìn)行評(píng)估,除非你有一個(gè)非?!嘎斆鳌沟哪P湍茏R(shí)別這些問(wèn)題。例如,這個(gè)「聰明」的模型能自己意識(shí)到偏見(jiàn),「所有貓的照片都是在室內(nèi)拍攝的,所有狗的圖片都是在室外拍攝的,所以也許我正在訓(xùn)練室內(nèi)/室外分類(lèi)器,而不是識(shí)別貓和狗的分類(lèi)器?」。

機(jī)器學(xué)習(xí)中踩過(guò)的坑,如何讓你變得更專(zhuān)業(yè)?

Karpathy 為 ImageNet 建立了一個(gè)標(biāo)注平臺(tái),以評(píng)估他自己的表現(xiàn)并加深他對(duì)數(shù)據(jù)集的理解。

正如 Karpathy 所說(shuō)的那樣,數(shù)據(jù)探查的系統(tǒng)能夠完成數(shù)據(jù)查看、數(shù)據(jù)切塊和切片。2018 年在倫敦舉辦的 KDD 上,他在演講中強(qiáng)調(diào),Uber 的許多 ML 工程師并不是在編寫(xiě)代碼來(lái)優(yōu)化模型,而是編寫(xiě)代碼優(yōu)化數(shù)據(jù)標(biāo)簽。

要了解數(shù)據(jù),首先需要明白以下三種數(shù)據(jù)分布:

  • 輸入數(shù)據(jù)的分布情況,例如平均序列長(zhǎng)度,平均像素值,音頻時(shí)長(zhǎng)

  • 輸出數(shù)據(jù)的分布情況,分類(lèi)失衡是一個(gè)大問(wèn)題

  • 輸出/輸入的分布情況,這通常就是你要建模的內(nèi)容

2、 選擇如何加載數(shù)據(jù)

有效地加載和預(yù)處理數(shù)據(jù)是機(jī)器學(xué)習(xí)工程中比較痛苦的環(huán)節(jié)之一,往往要在效率和透明度之間權(quán)衡取舍。

像 Tensorow Records 這樣的專(zhuān)用數(shù)據(jù)結(jié)構(gòu)可以將數(shù)據(jù)序列轉(zhuǎn)為大數(shù)據(jù)包,減少對(duì)磁盤(pán)的頻繁讀取/寫(xiě)入,但是這樣的作法卻有損透明度:這些結(jié)構(gòu)很難再進(jìn)一步研究或者分解數(shù)據(jù),如果你想要添加或者刪除一些數(shù)據(jù),則必須重新序列化。

目前 Pytorch Dataset 和 DatasetLoader 是平衡透明度和效率比較好的辦法,專(zhuān)用的程序包 torchtext 處理文本數(shù)據(jù)集,torchvision 處理圖像數(shù)據(jù)集,這些程序包提供了相對(duì)有效的加載方式,填充并批處理每個(gè)域中的數(shù)據(jù)。

3、 加快數(shù)據(jù)加載的方法

以下是 Berker 在加快數(shù)據(jù)加載的嘗試過(guò)程中所得到的經(jīng)驗(yàn)教訓(xùn):

 1)不要加載目前正在加載的數(shù)據(jù)

這是因?yàn)槟阕罱K會(huì)發(fā)現(xiàn),這樣做可能會(huì)丟失數(shù)據(jù)或者加載了重復(fù)數(shù)據(jù)。Berker 曾踩過(guò)的坑:

  • 編寫(xiě)正則表達(dá)式從文件夾中加載某些文件,但是在添加新文件時(shí)沒(méi)有更新正則文件,這意味著新文件無(wú)法成功加載

  • 錯(cuò)誤計(jì)算一個(gè)Epoch中的步數(shù)導(dǎo)致跳過(guò)了一些數(shù)據(jù)集

  • 文件夾中有遞歸符號(hào),導(dǎo)致多次加載相同的數(shù)據(jù)(在 Python 中,遞歸限制為 1000)

  • 無(wú)法完全遍歷文件層次結(jié)構(gòu),因而無(wú)法將數(shù)據(jù)加載到子文件夾中

2) 錯(cuò)誤存放數(shù)據(jù)

不要把所有數(shù)據(jù)放在一個(gè)目錄中。

如果你有上百萬(wàn)個(gè)文本文件全部放在一個(gè)文件夾中,那么任何操作都會(huì)非常非常慢。有時(shí)候哪怕僅僅查看或計(jì)算的動(dòng)作,都需要等待大量的文件夾加載,從而大大降低了工作效率。如果數(shù)據(jù)不在本地,而是遠(yuǎn)程存儲(chǔ)在數(shù)據(jù)中心,使用 sshfs 掛載目錄,情況會(huì)更加糟糕。

第二個(gè)錯(cuò)誤陷阱就是在預(yù)處理時(shí)沒(méi)有備份數(shù)據(jù)。正確的做法是將耗時(shí)的預(yù)處理結(jié)果保存到磁盤(pán)中,這樣就不必在每次運(yùn)行模型時(shí)都要重來(lái)一遍,不過(guò)要確保不覆蓋原數(shù)據(jù),并需要一直跟蹤在哪些數(shù)據(jù)上運(yùn)行了哪些預(yù)處理代碼。

下圖是很好的一個(gè)示例:

機(jī)器學(xué)習(xí)中踩過(guò)的坑,如何讓你變得更專(zhuān)業(yè)?

3)不恰當(dāng)?shù)念A(yù)處理

在預(yù)處理中出現(xiàn)數(shù)據(jù)濫用的情況是常見(jiàn)的,尤其是在 NLP 任務(wù)中。

非 ASCII 字符的錯(cuò)誤處理是一個(gè)很大的痛點(diǎn),這種情況不常出現(xiàn),因此很難發(fā)現(xiàn)。

分詞也會(huì)導(dǎo)致很多錯(cuò)誤發(fā)生。如果使用的是基于詞的分詞,很容易基于一個(gè)數(shù)據(jù)集形成詞匯表,結(jié)果在另一個(gè)數(shù)據(jù)集上使用的時(shí)候發(fā)現(xiàn),大量的詞匯在詞匯表上找不到。這種情況模型并不報(bào)錯(cuò),它只是在別的數(shù)據(jù)集上表現(xiàn)不好。

訓(xùn)練集和測(cè)試集之間的詞匯差異同樣是問(wèn)題,因?yàn)槟切┲怀霈F(xiàn)在測(cè)試集的詞匯是沒(méi)有被訓(xùn)練的。

因此,了解數(shù)據(jù)并盡早發(fā)現(xiàn)這些問(wèn)題是非常有價(jià)值的。

4、避免數(shù)據(jù)處理的錯(cuò)誤

1)盡可能多記錄日志

確保每次數(shù)據(jù)處理時(shí)都有樣本數(shù)據(jù)的日志,不應(yīng)該只記錄模型結(jié)果日志,還應(yīng)該記錄過(guò)程日志。

2) 熟記模型超參數(shù)

你需要非常熟悉模型超參數(shù):

  • 有多少樣本數(shù)?

  • 一次訓(xùn)練所選取的樣本數(shù)有多大?

  • 一個(gè)Epoch有多少批處理?

這些同樣要記錄日志,或者可以添加一些論斷來(lái)確保所有內(nèi)容都沒(méi)有拉下。

3)預(yù)處理過(guò)程中記錄所有狀態(tài)

某些預(yù)處理步驟需要使用或創(chuàng)建工件 ,因此需要記得將其保存下來(lái)。例如,使用訓(xùn)練集的平均數(shù)和變量正則化數(shù)值數(shù)據(jù),并保存平均數(shù)和變量,以便可以在測(cè)試時(shí)應(yīng)用相同的變換。

同樣,在NLP中,如果不保存訓(xùn)練集的詞匯表,就無(wú)法在測(cè)試時(shí)以相同的方式進(jìn)行分詞。如果在測(cè)試中形成新的詞匯表并重新分詞就會(huì)產(chǎn)生無(wú)意義的結(jié)果,因?yàn)槊總€(gè)單詞都將得到一個(gè)完全不同的標(biāo)記。

4) 降采樣

當(dāng)數(shù)據(jù)集非常大(例如圖像和音頻)時(shí),將數(shù)據(jù)輸入到神經(jīng)網(wǎng)絡(luò)中,期望模型能夠?qū)W習(xí)到最有效的預(yù)處理方法。如果有無(wú)限的時(shí)間和計(jì)算能力,那么這可能是個(gè)好方法,但是在實(shí)際情況中,降采樣是比較合適的選擇。

我們不需要全高清圖像來(lái)訓(xùn)練狗/貓分類(lèi)器,可以使用擴(kuò)張卷積 來(lái)學(xué)習(xí)降采樣器,或者傳統(tǒng)的梯度下降完成降采樣。

降采樣可以更快地完成模型擬合和評(píng)估,是較好的節(jié)約時(shí)間的做法。

五、結(jié)論

總結(jié)一下在機(jī)器學(xué)習(xí)應(yīng)遵循的 5 條指導(dǎo)原則:

  • 從小處著手,實(shí)驗(yàn)會(huì)進(jìn)行的很快。減少循環(huán)時(shí)間能夠及早發(fā)現(xiàn)問(wèn)題并更快地驗(yàn)證假設(shè)。

  • 了解數(shù)據(jù)。不了解數(shù)據(jù)就無(wú)法做好建模的工作。不要浪費(fèi)時(shí)間在花哨的模型上,要沉心靜氣地完成數(shù)據(jù)探查工作。

  • 盡量多地記錄日志。訓(xùn)練過(guò)程的信息越多,就容易識(shí)別異常并進(jìn)行改進(jìn)。

  • 注重簡(jiǎn)單性和透明性而不僅僅是效率。不要為了節(jié)省少量時(shí)間而犧牲了代碼的透明性。理解不透明代碼所浪費(fèi)的時(shí)間要比低效算法的運(yùn)行時(shí)間多得多。

  • 如果模型表現(xiàn)優(yōu)異令人難以置信,那可能就是有問(wèn)題。機(jī)器學(xué)習(xí)中存在很多錯(cuò)誤可能會(huì)「愚弄」你,成為一名優(yōu)秀的科學(xué)家意味著要理性的發(fā)現(xiàn)并消除這些錯(cuò)誤。

推薦閱讀:

Andrej Karpathy 也寫(xiě)了一篇非常出色的博客《A Recipe for Training Neural Networks》,同樣是講機(jī)器學(xué)習(xí)的常見(jiàn)錯(cuò)誤,但 Karpathy 更加專(zhuān)注于技術(shù)細(xì)節(jié)和深度學(xué)習(xí),閱讀地址如下:

http://karpathy.github.io/2019/04/25/recipe/

via https://towardsdatascience.com/rookie-errors-in-machine-learning-bc1c627f2789  雷鋒網(wǎng)雷鋒網(wǎng)雷鋒網(wǎng)

雷峰網(wǎng)原創(chuàng)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見(jiàn)轉(zhuǎn)載須知。

機(jī)器學(xué)習(xí)中踩過(guò)的坑,如何讓你變得更專(zhuān)業(yè)?

分享:
相關(guān)文章
當(dāng)月熱門(mén)文章
最新文章
請(qǐng)?zhí)顚?xiě)申請(qǐng)人資料
姓名
電話
郵箱
微信號(hào)
作品鏈接
個(gè)人簡(jiǎn)介
為了您的賬戶安全,請(qǐng)驗(yàn)證郵箱
您的郵箱還未驗(yàn)證,完成可獲20積分喲!
請(qǐng)驗(yàn)證您的郵箱
立即驗(yàn)證
完善賬號(hào)信息
您的賬號(hào)已經(jīng)綁定,現(xiàn)在您可以設(shè)置密碼以方便用郵箱登錄
立即設(shè)置 以后再說(shuō)