0
本文作者: AI研習社-譯站 | 2018-07-02 16:05 |
雷鋒網(wǎng)按:本文為雷鋒字幕組編譯的技術(shù)博客,原標題 Why you need to improve your training data, and how to do it,作者為 Pete Warden 。
翻譯 | 孫宗堯、郭佳昌、石金紅、劉嬌、張韶華 整理 | 凡江
圖片來自 Lisha Li
Andrej Karpathy 在他的 Train AI 演講中展示了這張膠片,我非常喜歡。這張膠片完美地揭示了深度學習在研究與生產(chǎn)間的區(qū)別。通常來說,學術(shù)論文的主要精力是放在開發(fā)新的、先進的模型上面,在數(shù)據(jù)集方面一般都是從公開的數(shù)據(jù)集取一部分使用。而相反,那些我所知道的想用深度學習技術(shù)做實際應(yīng)用的開發(fā)者們,他們絕大部分的精力都花在了擔心他們的訓(xùn)練數(shù)據(jù)上面。
有許多好的原因可以解釋為什么那些研究員會將精力放在模型架構(gòu)上,而對于那些想要在實際生產(chǎn)過程中運用機器學習的人來說,相關(guān)的指導(dǎo)材料就比較少。為了解決這個問題,我在此次會議上的演講主題是「關(guān)于訓(xùn)練數(shù)據(jù)上不可以思議的效果」,并且我想在這篇 blog 中進一步說明為什么優(yōu)化訓(xùn)練數(shù)據(jù)是如此重要,并給出一些實用的建議。
在我的工作中經(jīng)常與許多研究員與生產(chǎn)團隊有緊密的合作,而我之所以如此相信優(yōu)化數(shù)據(jù)的魔力是因為我親眼目睹了它們在構(gòu)建模型時所發(fā)揮的作用以及所帶來的巨大收益。對于大多數(shù)應(yīng)用來說,能否使用深度學習的最大障礙是模型精度能否達到實際使用的要求,而據(jù)我所知,最快捷的提升精度的方式就是優(yōu)化訓(xùn)練集。并且如果在部署過程中你還受限于例如時延或存儲大小等因素,那么你可能需要在一個滿足性能要求,經(jīng)過折衷的較小模型架構(gòu)上來提升模型精度。
語音控制
我不能分享我在所生產(chǎn)系統(tǒng)中觀察到的,但是我能從一個開源項目的例子中來證明這點。去年我通過 Tensorflow 框架搭建了一個簡單的語音識別系統(tǒng),但在實現(xiàn)的過程中發(fā)現(xiàn)沒有現(xiàn)成的數(shù)據(jù)集可以讓我來訓(xùn)練模型。在大量志愿者的幫助下,我收集了 60000 個 1 秒鐘的語音片段,這里要感謝 Open Speech 網(wǎng)站中的 AIY 團隊。通過這個數(shù)據(jù)集,最終訓(xùn)練出來的模型是可用的,但是精度沒有達到我的預(yù)期。為了看看這是否是由于我所設(shè)計模型所導(dǎo)致的,我在 Kaggle 上用同樣的訓(xùn)練集發(fā)起了一個競賽。在競賽中,許多競賽者設(shè)計的模型要比我的效果好,但即使是來自不同團隊不同方法,最終的精度也就只能達到 91%。對我來說這暗示著數(shù)據(jù)集中存在一些基本的錯誤,確實,有競賽者也向我指出了許多關(guān)于訓(xùn)練集的錯誤,如:有些音頻標簽打錯了,有些音頻不完整。這促使我有了發(fā)布一個新數(shù)據(jù)集的動力,解決他們所指出的那些問題并且再補充更多的樣本。
我通過查看錯誤的度量標準去理解什么樣的詞匯是模型難以識別的。結(jié)果顯示「其他」種類(當語音辨識系統(tǒng)識別語音時該單詞卻不在模型所訓(xùn)練到的詞匯中)的是最容易識別錯誤的。為了解決這個問題,我們獲取了更多不同的單詞以確保訓(xùn)練數(shù)據(jù)的多樣性。
自從 Kaggle 競賽者報告了標簽錯誤這一問題,我就請人做了額外的驗證環(huán)節(jié),請人去聽每個語音片段然后確保它與預(yù)期的標簽相符。另外由于 Kaggle 數(shù)據(jù)集還被發(fā)現(xiàn)了又很多幾乎沒有聲音或者很短的聲音,因此我寫了能自動做一些音頻分析并且剔除這些不太好的數(shù)據(jù)的小程序。最終,雖然刪除了很多不太好的語音數(shù)據(jù)但還是將語音數(shù)據(jù)增加到了十萬,這多虧了志愿者與一些受雇人員的努力。
為了幫助其他人更好地使用數(shù)據(jù)集(不要重蹈我的覆轍?。┪覍⑦@一切相關(guān)的都寫在一篇 Arixiv 論文當中了,以及更新后的準確率。最重要的結(jié)論是,在不改變模型和測試集數(shù)據(jù)的情況下,top-one(第一次預(yù)測類)的準確率從 85.4% 提高到 89.7%,整整提高了超過 4%。這是一個令人驚嘆的提升,這樣的提升對于將模型部署在安卓或樹莓派小應(yīng)用的人來說這是十分滿意的了。另外,我也很有自信在使用的模型架構(gòu)落后于現(xiàn)有先進水平的情況下通過花費一定時間來調(diào)整模型獲得進一步的少量提高。
這是在實際應(yīng)用過程中一次又一次獲得過好結(jié)果的過程,然而如果你想做一樣的嘗試,那么從哪開始對于你來說其實是比較困難的。你可以從我剛才對語音數(shù)據(jù)的處理中得到一些啟發(fā),但是我這里有一些更實用的方法。
首先,觀察你的數(shù)據(jù)
這個似乎是顯而易見的,但其實你首先需要做的是隨機觀察你的訓(xùn)練數(shù)據(jù)。將其中一部分復(fù)制到你的本地機,并且花費幾個小時去預(yù)覽它們。如果你的數(shù)據(jù)是一些圖片,那么使用一些類似 MacOs 系統(tǒng)的查看器非??焖俚牟榭磾?shù)千張縮略圖。對于音頻來說,可以播放它們的預(yù)覽,又或者對于文本來說,可以隨機的轉(zhuǎn)儲一些片段到終端設(shè)備。我沒有用足夠的時間在第一次語音中做這樣的工作,因此導(dǎo)致 Kaggle 參賽者發(fā)現(xiàn)非常多的問題。
我總是會感覺到這個觀察數(shù)據(jù)的過程有點傻,但是我從未后悔過。每次我這么做之后都會發(fā)現(xiàn)很多關(guān)于數(shù)據(jù)集的一些很關(guān)鍵的問題,像是類別不均衡問題,無法讀入的數(shù)據(jù)(例如 PNG 格式的圖片被加上了 JPG 格式的后綴),錯誤的標簽亦或者令人奇怪的組合。Tom White 在預(yù)先觀察數(shù)據(jù)的過程中在 ImageNet 數(shù)據(jù)集中有一些奇特的發(fā)現(xiàn),例如將一個用于放大太陽光的古老設(shè)備標記為「太陽鏡」,一張有魅力的圖片被標記為」垃圾車」,一個穿著紅斗篷的女人被標記為「斗篷」。Andrej 手工區(qū)分從 ImageNet 中的照片的工作也教會了我很多對于數(shù)據(jù)集的理解,包括即使對于一個人來說區(qū)分狗的種類也是很困難的事。
你所采取的行動取決于你的發(fā)現(xiàn),但其實你應(yīng)該堅持在做其他的數(shù)據(jù)清洗工作之前有這樣的對于數(shù)據(jù)預(yù)先觀察的過程,因為在這個過程中你會獲取一些直覺信息以幫助你在其他步驟里作出決策。
快速選擇模型
不要花太多時間在模型選擇上。如果你需要做圖像分類,可以看看 AutoML,TensorFlow 的 model repository,或者 Fast.AI 的 collection of examples,這些模型庫里一般可以找到一些解決類似于你產(chǎn)品的問題的模型。最重要的是盡快開始迭代你的模型,這樣你就可以盡早地讓真實用戶來測試你的模型。你總會有機會在后續(xù)的過程中來提高你的模型,也可能會得到更好的結(jié)果,但是首先你必須保證你的數(shù)據(jù)在一開始就是有效的。深度學習依然遵從最基本的計算定律,輸入無效數(shù)據(jù),那么就輸出無效的結(jié)果。因此,即使最好的模型也受限于訓(xùn)練數(shù)據(jù)中的瑕疵。通過選擇一個模型并對其進行測試,你會找到訓(xùn)練數(shù)據(jù)中存在的問題并對這些問題進行改進。
為了進一步提高你的迭代速度,可以從一個已經(jīng)在大樣本數(shù)據(jù)上訓(xùn)練過的模型開始,利用遷移學習在一個你所收集的可能小很多的數(shù)據(jù)集上來對模型參數(shù)進行微調(diào)。相比直接用你的小樣本數(shù)據(jù)來對模型進行訓(xùn)練,這樣通??梢愿斓氐玫礁玫慕Y(jié)果,你也可以由此找到一些感覺需要怎樣對你收據(jù)收集的方式做一些必要的調(diào)整。這樣做最重要的效果是你可以把你訓(xùn)練得到的結(jié)果反饋到數(shù)據(jù)收集的過程中去,邊學習邊調(diào)整,而不是把數(shù)據(jù)采集作為一個獨立的在訓(xùn)練之前的一個步驟。
創(chuàng)造之前先模擬
研究建模和產(chǎn)品建模之間最大的區(qū)別在于前者通常在一開始就有一個非常明確的問題描述,而后者對于模型的許多要求一開始并不明確,而是存在于用戶的腦中,需要一步一步挖掘出來。例如,我們希望 Jetpac 能提供好的照片給自動化的城市旅游指南。開始的時候,我們讓打分的人來給照片貼標簽,如果他們覺得照片「好」,就給照片做標記。但是,我們最后得到了很多帶有微笑的人像的照片,因為打分者認為這些是「好」照片。我們把這些標記了的照片用到我們的產(chǎn)品模型中,看看測試用戶的反應(yīng)??上攵?,他們并不滿意最后的結(jié)果。為了解決這個問題,我們把標記照片時的問題改成了:「這張照片會吸引你去這個地方旅游嗎?」這使得我們得到的標記照片質(zhì)量提高很多,但是,我們還是得到了一些這樣的標記照片,一些東南亞尋找工作的人認為在大酒店里有很多西裝革履拿著酒杯的會議照片非常吸引人。這些被不正確標記的照片提醒我們當下生活的泡沫時代,但是這是個實際的問題,因為我們的目標人群是美國人,他們會覺得會議照片非常的乏味又無趣。最終,我們 Jetpac 組的六個人手動標記了超過 200 萬的照片,因為我們比任何其他人更清楚打分的標準是什么。
這是一個比較極端的例子,但是它說明了數(shù)據(jù)標記過程很大程度上取決于你應(yīng)用的要求。對于大部分產(chǎn)品應(yīng)用的案例,開發(fā)人員需要花很長的時間來搞清楚我們到底需要模型回答一個什么樣的問題,而搞清楚這個問題是非常關(guān)鍵的。如果你的模型在回答一個錯誤的問題,那么在這個基礎(chǔ)上,你將永遠不能創(chuàng)造一個好的用戶體驗。
圖片來自 Thomas Hawk
我認為唯一能夠確認你是否在問正確的問題的方法是模擬你的應(yīng)用,但是不是用機器學習模型而是用人的反饋。這個方法有時被稱為「Wizard-of-Oz-ing」,因為幕后有人在操作。在 Jetpac 這個案例上,我們請人手動從一些旅游指南的樣本中選擇一些照片,并用測試用戶的反饋來調(diào)整我們選擇照片的標準,而不是訓(xùn)練一個模型來做這件事。一旦我們的測試反饋都是肯定的,我們就把最后的照片選擇標準作為標記的準則來對訓(xùn)練集里數(shù)百萬的照片進行打分做標記。這些照片之后訓(xùn)練的模型有能力對數(shù)以億計的照片進行高精度的預(yù)測,但是這個模型的核心起源于我們手動標記確定出來的打分標準。
用同源數(shù)據(jù)做訓(xùn)練
在 Jetpac 這個項目上,我們用于訓(xùn)練模型的圖片(主要來源于 Facebook 和 Instagram)和我們最終使用模型的圖片是同源的。但是,一個普遍的問題在于,用于訓(xùn)練的數(shù)據(jù)常常和最終要應(yīng)用模型處理的數(shù)據(jù)在一些很重要的特征上不一致。例如,我常常遇到有些團隊在 ImageNet 上訓(xùn)練他們的模型,但是最終他們的模型卻是要用于解決無人機或者機器人圖片的問題。這樣做也是有道理的,因為 ImageNet 上有很多人拍攝的照片,而這些照片和無人機或者機器人得到的照片有很多共性。ImageNet 上的照片很多是手機或者相機,使用中性鏡頭,在大概一人的高度,自然光或者人工打光下,并保證被標記的對象處于前景中心位置這些條件下拍攝的。機器人和無人機使用攝像照相機,通常用視角鏡頭,從地面或者高空在光線較弱,也不會使用智能定位的情況下拍攝照片,所以這些照片中的對象常常是不完整的。這些圖片特性的差異最終會導(dǎo)致在 ImageNet 上訓(xùn)練的模型,當應(yīng)用于這些器械得到的圖片上時,精度是很低的。
還有一些更巧妙的方法可以讓你的訓(xùn)練數(shù)據(jù)偏離最終的應(yīng)用顯示出來。想象一下,你正在建造一個相機來識別野生動物,并利用世界各地的動物數(shù)據(jù)集進行訓(xùn)練。如果你只用 Borneo 叢林中的數(shù)據(jù)來部署模型,那么分類標簽為企鵝的概率會非常低。但假如訓(xùn)練集中加入南極的照片,那很有可能其他的動物會被誤認為企鵝,所以比起訓(xùn)練集沒有這些南極照片的時候,模型的整體錯誤率可能會更高。
有時候可以通過先驗知識來校正模型的結(jié)果(比如在叢林環(huán)境中大量降低企鵝的概率),但是更簡單而有效的方法是使用可以反映真實的產(chǎn)品環(huán)境的訓(xùn)練集。所以我認為最好的方法還是始終使用從實際應(yīng)用中直接獲取的數(shù)據(jù),這與我上面建議的「Wizard-of-Oz-ing」可以聯(lián)系起來。人工干預(yù)可以是對初始數(shù)據(jù)集進行標記,即使收集到的標簽數(shù)量非常少,它們也可以反映實際使用情況,并有望進行一些遷移學習的初步實驗。
聯(lián)系數(shù)據(jù)分析指標
當我在處理語音命令示例時,最頻繁出現(xiàn)的報告之一就是訓(xùn)練過程中的混淆矩陣。下面是控制臺中顯示的例子:
這可能看起來很嚇人,但實際上它只是一張表格,顯示了神經(jīng)網(wǎng)絡(luò)出錯的細節(jié)。這里有一個更漂亮一些的標簽版本:
該表中的每一行表示某個標簽下的語音被預(yù)測為所有類別標簽的具體數(shù)量,每一列顯示了被預(yù)測為某個具體的標簽的原型的分布。例如,突出顯示的這行表示這些音頻樣本實際上都屬于 Slience,從左到右可以看到每一個樣本都在 Slience 這一列中, 表示預(yù)測的這些標簽都是正確的。這說明此模型非常善于預(yù)測 Slience 類,沒有錯誤的否定任何一個 Slience 樣本。如果我們查看 Slience 這一整列,可以看到有多少其他樣本被預(yù)測為 Slience 標簽,我們可以看到有很多單詞片段被誤認為是 Slience 類,假陽性數(shù)量相當多。事實證明這是有幫助的,因為它讓我更仔細地觀察那些被錯誤地歸類為 Slience 的片段,這其中很多錄音都出現(xiàn)了異常低音的情況。這幫助我通過刪除低音量的剪輯來提高數(shù)據(jù)的質(zhì)量,如果沒有混亂矩陣,我不會知道應(yīng)該這樣做。
幾乎任何一種總結(jié)都有助于改進實驗結(jié)果,但是我發(fā)現(xiàn)混淆矩陣是一個很好的折衷方案,它給出的信息比一個精確的數(shù)字要多,但不會因為細節(jié)太多而使我困惑。在訓(xùn)練期間觀察數(shù)字變化也很有用,因為它可以告訴您模型正在努力學習的類別,這樣就可以給你提供需要清理和擴展的數(shù)據(jù)集區(qū)域。
物以類聚
我最喜歡的理解方式之一是讓網(wǎng)絡(luò)來解釋我的訓(xùn)練數(shù)據(jù)----可視化聚類。TensorBoard 非常支持這樣的探究方法,雖然它經(jīng)常被用于查看詞嵌入向量,但我發(fā)現(xiàn)它幾乎適用于任何類似于嵌入的層。例如,圖像分類網(wǎng)絡(luò)通常把最后的全連接層或 softmax 單元之前的倒數(shù)第二層當作一個嵌入層 (像 Tensorflow for poets 的簡單遷移學習的示例一樣)。這些并不是嚴格意義上的嵌入,因為在訓(xùn)練過程中沒有采取任何手段來確保它們會在一個真實的嵌入層中有理想的空間屬性,但是對它們的向量進行聚類確實會產(chǎn)生有趣的結(jié)果。
有一個真實的事例是,我工作的其中一個團隊難以理解為什么某些動物在圖像分類模型中有很高錯誤率。所以他們使用聚類可視化來查看他們的訓(xùn)練數(shù)據(jù)在不同類別下的分布情況,當他們看到「Jaguar」時,他們清楚地看到數(shù)據(jù)被分成兩個不同的組,彼此之間有一定的距離。
圖片來自 djblock99 and Dave Adams
這是他們看到的圖。圖中每個照片都映射成了兩個數(shù)據(jù)集中的點,很明顯,許多捷豹品牌的汽車被錯誤地貼上了美洲虎的標簽。一旦他們知道這個方法,他們就能看到標記過程,這樣就可以意識到他們的研究方向混淆了用戶使用界面。有了這些信息,他們就能夠改進標記人員的培訓(xùn)過程并修復(fù)這個工具,即只要將所有的汽車圖像從 Jaguar 類別中刪除,就可以使模型中這個類別獲得更高的準確率。
聚類讓你對訓(xùn)練集有了深入的了解,并且像直接查看數(shù)據(jù)一樣非常便利,但是網(wǎng)絡(luò)實際上只是通過它自己的學習理解將輸入數(shù)據(jù)分組來指導(dǎo)你進行探究。作為人類,我們很擅長在視覺上發(fā)現(xiàn)異常,所以結(jié)合我們的直覺和計算機處理大量輸入的能力,可以為追蹤數(shù)據(jù)質(zhì)量的問題提供了一個非常好的可擴展解決方案。關(guān)于使用 TensorBoard 進行此操作的完整教程超出了本文的范圍 (我很感激您還在閱讀本文),但是如果你真的想提高實驗結(jié)果,我強烈建議你熟悉這個工具。
經(jīng)常收集數(shù)據(jù)
我從來沒有見過收集更多的數(shù)據(jù)而不能提高模型的準確性的情況,事實證明有很多研究支持我這一看法。
這張圖來自于「重新審視數(shù)據(jù)的不合理有效性」,展示了當訓(xùn)練數(shù)據(jù)集的規(guī)模增長到數(shù)億時,圖像分類的模型精度是如何不斷提高的。Facebook 最近更深入地進行了這方面的研究,使用數(shù)十億張有標簽的 Instagram 圖片,刷新了 ImageNet 分類精度的記錄。這表明,即使很難獲得大型、高質(zhì)量數(shù)據(jù)集,增加訓(xùn)練集的大小仍然會提高模型結(jié)果。
這意味著,只要有任何更好的模型精度使用戶受益,就需要一個持續(xù)更新數(shù)據(jù)集的策略。如果可以,尋找一個創(chuàng)造性的方法去利用微弱的信號,以此訪問更大的數(shù)據(jù)集。對此,F(xiàn)acebook 采用 Instagram 標簽就是一個很好的案例。另一種途徑是提高標記流水線的智能化,比如利用模型的初始版本預(yù)測標簽,通過增強工具使貼標者做出更快的決定。這樣會有初始偏差復(fù)現(xiàn)的風險,但在實踐中,收益往往高于這種風險。在這個問題上投入大量資金去聘請更多的人為新的訓(xùn)練輸入做標記,通常是一個有價值的投資。盡管傳統(tǒng)上這類沒有預(yù)算支出的項目組織可能會有困難。如果你是一個非盈利者,讓你的支持者更容易通過一些開源工具提供數(shù)據(jù),這是一種增加你數(shù)據(jù)規(guī)模且不會導(dǎo)致破產(chǎn)的好方法。
當然,對任何組織來說一個自然地生成更多標記數(shù)據(jù)的產(chǎn)品就是圣杯。我不會太在意這種觀念,但這不適合現(xiàn)實世界的多數(shù)案例,人們只想免除復(fù)雜的標記問題而盡快得到答案。對于一家初創(chuàng)公司來說這是一個好的投資熱點,因為它就像一個用于模型改善的永動機,但幾乎總是會有一些單位成本用于清理或增加你將收到的數(shù)據(jù),因此經(jīng)濟學往往最終將它看做一個比真正免費的商業(yè)眾包更便宜的版本。
通往風險區(qū)的高速公路
對于應(yīng)用程序的用戶來說,模型誤差幾乎比損失函數(shù)捕獲有更大的影響。你需要提前考慮最差的可能結(jié)果,并試圖給模型設(shè)置一個反饋抑制來避免這些結(jié)果的發(fā)生。這可能只是一個你永遠不想預(yù)測的類別的黑名單,因為錯誤的代價非常高,或者你可能有一個簡單的算法規(guī)則來保證所做行為不會超出你所考慮到的一些邊界參數(shù)。例如,你可能會保留一個永遠不希望文本編輯器輸出的誓言表,即使是訓(xùn)練集中也不行,因為它不適合你的產(chǎn)品。
不好的結(jié)果可能會被考慮到,但事先不總是如此明顯,所以從現(xiàn)實錯誤中汲取教訓(xùn)是至關(guān)重要的。一旦你有一半的產(chǎn)品/市場是體面的,一個最簡單的方法是運用有缺陷的報告。當人們使用你的系統(tǒng)應(yīng)用,并從模型中得到一個不想要的結(jié)果,讓他們?nèi)菀赘嬖V你。如果可能的話,獲得模型的完整輸入,但如果是敏感數(shù)據(jù),只要知道不良輸出是什么,這樣可幫助指導(dǎo)你的調(diào)查。這些類別可以幫助你選擇收集更多數(shù)據(jù)的位置和了解當前標簽質(zhì)量屬于哪些級別。一旦你的模型有一個新的版本,除了正常的測試集外,利用先前產(chǎn)生不良結(jié)果的輸入,并對這部分輸入的測試結(jié)果進行單獨評估。這種改進方法有點像回歸測試,并給你提供一種方法來跟蹤你改善用戶體驗的效果,因為單個模型精度指標將永遠無法完全捕捉到人們所關(guān)心的所有信息。通過查看一小部分過去引發(fā)強烈反應(yīng)的例子,你可以獲得一些獨立的證據(jù)來表明你確實正在為用戶提供更好的服務(wù)。如果因為過于敏感以至于你無法給模型獲得這些輸入數(shù)據(jù),可采用自我測試或內(nèi)部實驗的方式來確定哪些輸入會產(chǎn)生這些錯誤,然后用回歸集來替換它們。
故事是什么,牽?;??
我希望我已成功說服你在數(shù)據(jù)上花費更多的時間,并且給了你一些如何投資改善它的觀點。我對這個有價值的領(lǐng)域沒有關(guān)注太多,僅在這里給了一些膚淺的建議,所以我感謝每一個與我分享他們策略的人,并且我希望我將會聽到更多關(guān)于你已取得成功的方法。我認為將會有越來越多的專業(yè)工程師團隊組織專注于數(shù)據(jù)集的優(yōu)化改善,而不是留給 Ml 研究人員來推動進展,我期待看到整個領(lǐng)域因為這些而得到發(fā)展。我總是驚嘆即使針對嚴重缺陷的訓(xùn)練數(shù)據(jù),模型一樣會運作良好,因此我迫不及待的想看到我們的數(shù)據(jù)集模型改進以后還能做些什么。
原文鏈接:https://petewarden.com/2018/05/28/why-you-need-to-improve-your-training-data-and-how-to-do-it/
雷鋒網(wǎng)雷鋒網(wǎng)
雷峰網(wǎng)原創(chuàng)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。