當前位置:
首頁 > 知識 > 為什麼你需要改進訓練數據,如何改進?

為什麼你需要改進訓練數據,如何改進?

本文為雷鋒字幕組編譯的技術博客,原標題 Why you need to improve your training data, and how to do it,作者為 Pete Warden 。

翻譯 | 孫宗堯、郭佳昌、石金紅、劉嬌、張韶華 整理 | 凡江

圖片來自 Lisha Li

Andrej Karpathy 在他的 Train AI 演講中展示了這張膠片,我非常喜歡。這張膠片完美地揭示了深度學習在研究與生產間的區別。通常來說,學術論文的主要精力是放在開發新的、先進的模型上面,在數據集方面一般都是從公開的數據集取一部分使用。而相反,那些我所知道的想用深度學習技術做實際應用的開發者們,他們絕大部分的精力都花在了擔心他們的訓練數據上面。

有許多好的原因可以解釋為什麼那些研究員會將精力放在模型架構上,而對於那些想要在實際生產過程中運用機器學習的人來說,相關的指導材料就比較少。為了解決這個問題,我在此次會議上的演講主題是「關於訓練數據上不可以思議的效果」,並且我想在這篇 blog 中進一步說明為什麼優化訓練數據是如此重要,並給出一些實用的建議。

在我的工作中經常與許多研究員與生產團隊有緊密的合作,而我之所以如此相信優化數據的魔力是因為我親眼目睹了它們在構建模型時所發揮的作用以及所帶來的巨大收益。對於大多數應用來說,能否使用深度學習的最大障礙是模型精度能否達到實際使用的要求,而據我所知,最快捷的提升精度的方式就是優化訓練集。並且如果在部署過程中你還受限於例如時延或存儲大小等因素,那麼你可能需要在一個滿足性能要求,經過折衷的較小模型架構上來提升模型精度。


語音控制

我不能分享我在所生產系統中觀察到的,但是我能從一個開源項目的例子中來證明這點。去年我通過 Tensorflow 框架搭建了一個簡單的語音識別系統,但在實現的過程中發現沒有現成的數據集可以讓我來訓練模型。在大量志願者的幫助下,我收集了 60000 個 1 秒鐘的語音片段,這裡要感謝 Open Speech 網站中的 AIY 團隊。通過這個數據集,最終訓練出來的模型是可用的,但是精度沒有達到我的預期。為了看看這是否是由於我所設計模型所導致的,我在 Kaggle 上用同樣的訓練集發起了一個競賽。在競賽中,許多競賽者設計的模型要比我的效果好,但即使是來自不同團隊不同方法,最終的精度也就只能達到 91%。對我來說這暗示著數據集中存在一些基本的錯誤,確實,有競賽者也向我指出了許多關於訓練集的錯誤,如:有些音頻標籤打錯了,有些音頻不完整。這促使我有了發布一個新數據集的動力,解決他們所指出的那些問題並且再補充更多的樣本。

我通過查看錯誤的度量標準去理解什麼樣的辭彙是模型難以識別的。結果顯示「其他」種類(當語音辨識系統識別語音時該單詞卻不在模型所訓練到的辭彙中)的是最容易識別錯誤的。為了解決這個問題,我們獲取了更多不同的單詞以確保訓練數據的多樣性。

自從 Kaggle 競賽者報告了標籤錯誤這一問題,我就請人做了額外的驗證環節,請人去聽每個語音片段然後確保它與預期的標籤相符。另外由於 Kaggle 數據集還被發現了又很多幾乎沒有聲音或者很短的聲音,因此我寫了能自動做一些音頻分析並且剔除這些不太好的數據的小程序。最終,雖然刪除了很多不太好的語音數據但還是將語音數據增加到了十萬,這多虧了志願者與一些受僱人員的努力。

為了幫助其他人更好地使用數據集(不要重蹈我的覆轍!)我將這一切相關的都寫在一篇 Arixiv 論文當中了,以及更新後的準確率。最重要的結論是,在不改變模型和測試集數據的情況下,top-one(第一次預測類)的準確率從 85.4% 提高到 89.7%,整整提高了超過 4%。這是一個令人驚嘆的提升,這樣的提升對於將模型部署在安卓或樹莓派小應用的人來說這是十分滿意的了。另外,我也很有自信在使用的模型架構落後於現有先進水平的情況下通過花費一定時間來調整模型獲得進一步的少量提高。

這是在實際應用過程中一次又一次獲得過好結果的過程,然而如果你想做一樣的嘗試,那麼從哪開始對於你來說其實是比較困難的。你可以從我剛才對語音數據的處理中得到一些啟發,但是我這裡有一些更實用的方法。


首先,觀察你的數據

這個似乎是顯而易見的,但其實你首先需要做的是隨機觀察你的訓練數據。將其中一部分複製到你的本地機,並且花費幾個小時去預覽它們。如果你的數據是一些圖片,那麼使用一些類似 MacOs 系統的查看器非常快速的查看數千張縮略圖。對於音頻來說,可以播放它們的預覽,又或者對於文本來說,可以隨機的轉儲一些片段到終端設備。我沒有用足夠的時間在第一次語音中做這樣的工作,因此導致 Kaggle 參賽者發現非常多的問題。

我總是會感覺到這個觀察數據的過程有點傻,但是我從未後悔過。每次我這麼做之後都會發現很多關於數據集的一些很關鍵的問題,像是類別不均衡問題,無法讀入的數據(例如 PNG 格式的圖片被加上了 JPG 格式的後綴),錯誤的標籤或者令人奇怪的組合。Tom White 在預先觀察數據的過程中在 ImageNet 數據集中有一些奇特的發現,例如將一個用於放大太陽光的古老設備標記為「太陽鏡」,一張有魅力的圖片被標記為」垃圾車」,一個穿著紅斗篷的女人被標記為「斗篷」。Andrej 手工區分從 ImageNet 中的照片的工作也教會了我很多對於數據集的理解,包括即使對於一個人來說區分狗的種類也是很困難的事。

你所採取的行動取決於你的發現,但其實你應該堅持在做其他的數據清洗工作之前有這樣的對於數據預先觀察的過程,因為在這個過程中你會獲取一些直覺信息以幫助你在其他步驟里作出決策。


快速選擇模型

不要花太多時間在模型選擇上。如果你需要做圖像分類,可以看看 AutoML,TensorFlow 的 model repository,或者 Fast.AI 的 collection of examples,這些模型庫里一般可以找到一些解決類似於你產品的問題的模型。最重要的是儘快開始迭代你的模型,這樣你就可以儘早地讓真實用戶來測試你的模型。你總會有機會在後續的過程中來提高你的模型,也可能會得到更好的結果,但是首先你必須保證你的數據在一開始就是有效的。深度學習依然遵從最基本的計算定律,輸入無效數據,那麼就輸出無效的結果。因此,即使最好的模型也受限於訓練數據中的瑕疵。通過選擇一個模型並對其進行測試,你會找到訓練數據中存在的問題並對這些問題進行改進。

為了進一步提高你的迭代速度,可以從一個已經在大樣本數據上訓練過的模型開始,利用遷移學習在一個你所收集的可能小很多的數據集上來對模型參數進行微調。相比直接用你的小樣本數據來對模型進行訓練,這樣通常可以更快地得到更好的結果,你也可以由此找到一些感覺需要怎樣對你收據收集的方式做一些必要的調整。這樣做最重要的效果是你可以把你訓練得到的結果反饋到數據收集的過程中去,邊學習邊調整,而不是把數據採集作為一個獨立的在訓練之前的一個步驟。


創造之前先模擬

研究建模和產品建模之間最大的區別在於前者通常在一開始就有一個非常明確的問題描述,而後者對於模型的許多要求一開始並不明確,而是存在於用戶的腦中,需要一步一步挖掘出來。例如,我們希望 Jetpac 能提供好的照片給自動化的城市旅遊指南。開始的時候,我們讓打分的人來給照片貼標籤,如果他們覺得照片「好」,就給照片做標記。但是,我們最後得到了很多帶有微笑的人像的照片,因為打分者認為這些是「好」照片。我們把這些標記了的照片用到我們的產品模型中,看看測試用戶的反應。可想而知,他們並不滿意最後的結果。為了解決這個問題,我們把標記照片時的問題改成了:「這張照片會吸引你去這個地方旅遊嗎?」這使得我們得到的標記照片質量提高很多,但是,我們還是得到了一些這樣的標記照片,一些東南亞尋找工作的人認為在大酒店裡有很多西裝革履拿著酒杯的會議照片非常吸引人。這些被不正確標記的照片提醒我們當下生活的泡沫時代,但是這是個實際的問題,因為我們的目標人群是美國人,他們會覺得會議照片非常的乏味又無趣。最終,我們 Jetpac 組的六個人手動標記了超過 200 萬的照片,因為我們比任何其他人更清楚打分的標準是什麼。

這是一個比較極端的例子,但是它說明了數據標記過程很大程度上取決於你應用的要求。對於大部分產品應用的案例,開發人員需要花很長的時間來搞清楚我們到底需要模型回答一個什麼樣的問題,而搞清楚這個問題是非常關鍵的。如果你的模型在回答一個錯誤的問題,那麼在這個基礎上,你將永遠不能創造一個好的用戶體驗。

圖片來自 Thomas Hawk

我認為唯一能夠確認你是否在問正確的問題的方法是模擬你的應用,但是不是用機器學習模型而是用人的反饋。這個方法有時被稱為「Wizard-of-Oz-ing」,因為幕後有人在操作。在 Jetpac 這個案例上,我們請人手動從一些旅遊指南的樣本中選擇一些照片,並用測試用戶的反饋來調整我們選擇照片的標準,而不是訓練一個模型來做這件事。一旦我們的測試反饋都是肯定的,我們就把最後的照片選擇標準作為標記的準則來對訓練集里數百萬的照片進行打分做標記。這些照片之後訓練的模型有能力對數以億計的照片進行高精度的預測,但是這個模型的核心起源於我們手動標記確定出來的打分標準。


用同源數據做訓練

在 Jetpac 這個項目上,我們用於訓練模型的圖片(主要來源於 Facebook 和 Instagram)和我們最終使用模型的圖片是同源的。但是,一個普遍的問題在於,用於訓練的數據常常和最終要應用模型處理的數據在一些很重要的特徵上不一致。例如,我常常遇到有些團隊在 ImageNet 上訓練他們的模型,但是最終他們的模型卻是要用於解決無人機或者機器人圖片的問題。這樣做也是有道理的,因為 ImageNet 上有很多人拍攝的照片,而這些照片和無人機或者機器人得到的照片有很多共性。ImageNet 上的照片很多是手機或者相機,使用中性鏡頭,在大概一人的高度,自然光或者人工打光下,並保證被標記的對象處於前景中心位置這些條件下拍攝的。機器人和無人機使用攝像照相機,通常用視角鏡頭,從地面或者高空在光線較弱,也不會使用智能定位的情況下拍攝照片,所以這些照片中的對象常常是不完整的。這些圖片特性的差異最終會導致在 ImageNet 上訓練的模型,當應用於這些器械得到的圖片上時,精度是很低的。

還有一些更巧妙的方法可以讓你的訓練數據偏離最終的應用顯示出來。想像一下,你正在建造一個相機來識別野生動物,並利用世界各地的動物數據集進行訓練。如果你只用 Borneo 叢林中的數據來部署模型,那麼分類標籤為企鵝的概率會非常低。但假如訓練集中加入南極的照片,那很有可能其他的動物會被誤認為企鵝,所以比起訓練集沒有這些南極照片的時候,模型的整體錯誤率可能會更高。

有時候可以通過先驗知識來校正模型的結果(比如在叢林環境中大量降低企鵝的概率),但是更簡單而有效的方法是使用可以反映真實的產品環境的訓練集。所以我認為最好的方法還是始終使用從實際應用中直接獲取的數據,這與我上面建議的「Wizard-of-Oz-ing」可以聯繫起來。人工干預可以是對初始數據集進行標記,即使收集到的標籤數量非常少,它們也可以反映實際使用情況,並有望進行一些遷移學習的初步實驗。


聯繫數據分析指標

當我在處理語音命令示例時,最頻繁出現的報告之一就是訓練過程中的混淆矩陣。下面是控制台中顯示的例子:

這可能看起來很嚇人,但實際上它只是一張表格,顯示了神經網路出錯的細節。這裡有一個更漂亮一些的標籤版本:

該表中的每一行表示某個標籤下的語音被預測為所有類別標籤的具體數量,每一列顯示了被預測為某個具體的標籤的原型的分布。例如,突出顯示的這行表示這些音頻樣本實際上都屬於 Slience,從左到右可以看到每一個樣本都在 Slience 這一列中, 表示預測的這些標籤都是正確的。這說明此模型非常善於預測 Slience 類,沒有錯誤的否定任何一個 Slience 樣本。如果我們查看 Slience 這一整列,可以看到有多少其他樣本被預測為 Slience 標籤,我們可以看到有很多單詞片段被誤認為是 Slience 類,假陽性數量相當多。事實證明這是有幫助的,因為它讓我更仔細地觀察那些被錯誤地歸類為 Slience 的片段,這其中很多錄音都出現了異常低音的情況。這幫助我通過刪除低音量的剪輯來提高數據的質量,如果沒有混亂矩陣,我不會知道應該這樣做。

幾乎任何一種總結都有助於改進實驗結果,但是我發現混淆矩陣是一個很好的折衷方案,它給出的信息比一個精確的數字要多,但不會因為細節太多而使我困惑。在訓練期間觀察數字變化也很有用,因為它可以告訴您模型正在努力學習的類別,這樣就可以給你提供需要清理和擴展的數據集區域。


物以類聚

我最喜歡的理解方式之一是讓網路來解釋我的訓練數據----可視化聚類。TensorBoard 非常支持這樣的探究方法,雖然它經常被用於查看詞嵌入向量,但我發現它幾乎適用於任何類似於嵌入的層。例如,圖像分類網路通常把最後的全連接層或 softmax 單元之前的倒數第二層當作一個嵌入層 (像 Tensorflow for poets 的簡單遷移學習的示例一樣)。這些並不是嚴格意義上的嵌入,因為在訓練過程中沒有採取任何手段來確保它們會在一個真實的嵌入層中有理想的空間屬性,但是對它們的向量進行聚類確實會產生有趣的結果。

有一個真實的事例是,我工作的其中一個團隊難以理解為什麼某些動物在圖像分類模型中有很高錯誤率。所以他們使用聚類可視化來查看他們的訓練數據在不同類別下的分布情況,當他們看到「Jaguar」時,他們清楚地看到數據被分成兩個不同的組,彼此之間有一定的距離。

圖片來自 djblock99 and Dave Adams

這是他們看到的圖。圖中每個照片都映射成了兩個數據集中的點,很明顯,許多捷豹品牌的汽車被錯誤地貼上了美洲虎的標籤。一旦他們知道這個方法,他們就能看到標記過程,這樣就可以意識到他們的研究方向混淆了用戶使用界面。有了這些信息,他們就能夠改進標記人員的培訓過程並修復這個工具,即只要將所有的汽車圖像從 Jaguar 類別中刪除,就可以使模型中這個類別獲得更高的準確率。

聚類讓你對訓練集有了深入的了解,並且像直接查看數據一樣非常便利,但是網路實際上只是通過它自己的學習理解將輸入數據分組來指導你進行探究。作為人類,我們很擅長在視覺上發現異常,所以結合我們的直覺和計算機處理大量輸入的能力,可以為追蹤數據質量的問題提供了一個非常好的可擴展解決方案。關於使用 TensorBoard 進行此操作的完整教程超出了本文的範圍 (我很感激您還在閱讀本文),但是如果你真的想提高實驗結果,我強烈建議你熟悉這個工具。


經常收集數據

我從來沒有見過收集更多的數據而不能提高模型的準確性的情況,事實證明有很多研究支持我這一看法。

這張圖來自於「重新審視數據的不合理有效性」,展示了當訓練數據集的規模增長到數億時,圖像分類的模型精度是如何不斷提高的。Facebook 最近更深入地進行了這方面的研究,使用數十億張有標籤的 Instagram 圖片,刷新了 ImageNet 分類精度的記錄。這表明,即使很難獲得大型、高質量數據集,增加訓練集的大小仍然會提高模型結果。

這意味著,只要有任何更好的模型精度使用戶受益,就需要一個持續更新數據集的策略。如果可以,尋找一個創造性的方法去利用微弱的信號,以此訪問更大的數據集。對此,Facebook 採用 Instagram 標籤就是一個很好的案例。另一種途徑是提高標記流水線的智能化,比如利用模型的初始版本預測標籤,通過增強工具使貼標者做出更快的決定。這樣會有初始偏差復現的風險,但在實踐中,收益往往高於這種風險。在這個問題上投入大量資金去聘請更多的人為新的訓練輸入做標記,通常是一個有價值的投資。儘管傳統上這類沒有預算支出的項目組織可能會有困難。如果你是一個非盈利者,讓你的支持者更容易通過一些開源工具提供數據,這是一種增加你數據規模且不會導致破產的好方法。

當然,對任何組織來說一個自然地生成更多標記數據的產品就是聖杯。我不會太在意這種觀念,但這不適合現實世界的多數案例,人們只想免除複雜的標記問題而儘快得到答案。對於一家初創公司來說這是一個好的投資熱點,因為它就像一個用於模型改善的永動機,但幾乎總是會有一些單位成本用於清理或增加你將收到的數據,因此經濟學往往最終將它看做一個比真正免費的商業眾包更便宜的版本。


通往風險區的高速公路

對於應用程序的用戶來說,模型誤差幾乎比損失函數捕獲有更大的影響。你需要提前考慮最差的可能結果,並試圖給模型設置一個反饋抑制來避免這些結果的發生。這可能只是一個你永遠不想預測的類別的黑名單,因為錯誤的代價非常高,或者你可能有一個簡單的演算法規則來保證所做行為不會超出你所考慮到的一些邊界參數。例如,你可能會保留一個永遠不希望文本編輯器輸出的誓言表,即使是訓練集中也不行,因為它不適合你的產品。

不好的結果可能會被考慮到,但事先不總是如此明顯,所以從現實錯誤中汲取教訓是至關重要的。一旦你有一半的產品/市場是體面的,一個最簡單的方法是運用有缺陷的報告。當人們使用你的系統應用,並從模型中得到一個不想要的結果,讓他們容易告訴你。如果可能的話,獲得模型的完整輸入,但如果是敏感數據,只要知道不良輸出是什麼,這樣可幫助指導你的調查。這些類別可以幫助你選擇收集更多數據的位置和了解當前標籤質量屬於哪些級別。一旦你的模型有一個新的版本,除了正常的測試集外,利用先前產生不良結果的輸入,並對這部分輸入的測試結果進行單獨評估。這種改進方法有點像回歸測試,並給你提供一種方法來跟蹤你改善用戶體驗的效果,因為單個模型精度指標將永遠無法完全捕捉到人們所關心的所有信息。通過查看一小部分過去引發強烈反應的例子,你可以獲得一些獨立的證據來表明你確實正在為用戶提供更好的服務。如果因為過於敏感以至於你無法給模型獲得這些輸入數據,可採用自我測試或內部實驗的方式來確定哪些輸入會產生這些錯誤,然後用回歸集來替換它們。


故事是什麼,牽牛花?

我希望我已成功說服你在數據上花費更多的時間,並且給了你一些如何投資改善它的觀點。我對這個有價值的領域沒有關注太多,僅在這裡給了一些膚淺的建議,所以我感謝每一個與我分享他們策略的人,並且我希望我將會聽到更多關於你已取得成功的方法。我認為將會有越來越多的專業工程師團隊組織專註於數據集的優化改善,而不是留給 Ml 研究人員來推動進展,我期待看到整個領域因為這些而得到發展。我總是驚嘆即使針對嚴重缺陷的訓練數據,模型一樣會運作良好,因此我迫不及待的想看到我們的數據集模型改進以後還能做些什麼。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 AI研習社 的精彩文章:

如何在 Scratch 中用 Python 構建神經網路
談談複雜多分類問題上的一些個人理解

TAG:AI研習社 |