大牛祕笈!谷歌工程師是如何改進訓練資料集的?

AI前線發表於2019-03-04

大牛祕笈!谷歌工程師是如何改進訓練資料集的?

策劃編輯 | Natalie
譯者 | 核子可樂,王強
編輯 | Debra
AI 前線導讀:近日,特斯拉 AI 總監 Andrej Karpathy 在某次會議上祭出了一張圖,展示了工業界和學術界在資料和模型上的時間花費對比。從這張圖中,我們可以看到業界在處理資料集上所花費的時間比學術研究多得多,幾乎佔據了 3/4 的時間。前幾日,谷歌 TensorFlow 團隊研究深度學習的工程師 Pete Warden 進一步撰文解釋了為什麼我們需要改進訓練資料,並提供了一系列改進訓練資料的實用技巧,AI 前線對這篇文章進行了編譯。

更多幹貨內容請關注微信公眾號“AI 前線”(ID:ai-front)

大牛祕笈!谷歌工程師是如何改進訓練資料集的?

工業屆和學術界在資料和模型上的時間花費對比

Andrej Karpathy 在 Train AI 演講當中展示的這張幻燈片,可謂深得我心!它完美地體現了深度學習研究與實際生產之間的差異。學術論文幾乎全部集中在新的改進模型身上,而資料集則通常選自一小部分公開歸檔。但在另一方面,我接觸過的每一位實際使用者都在努力將深度學習納入實際應用程式當中,並把大部分時間投入到處理訓練資料身上。

研究人員為什麼如此關注模型架構?能夠解釋這個問題的理由多種多樣,但其中最重要的一點在於,目前可用於幫助使用者在生產環境中部署機器學習技術的資源確實非常有限。為了解決這一切,我希望強調“訓練資料在有效性方面的不合理”問題。在今天的文章中,我將進一步闡述這個觀點,包括解釋資料為何如此重要以及對其加以改進的相關實用技巧。

作為日常工作中的重要組成部分,我與很多研究人員及產品團隊保持著密切合作,而且我個人也堅信實現資料改進的力量源自使用者在成功實現模型構建時所獲得的巨大收益。在大多數應用程式當中,深度學習技術的最大使用障礙在於如何立足現實場景獲得足夠高的準確率——在這方面,改進訓練資料集是我所知曉的,最快的準確率提升途徑。即使受到其它限制性條件的約束(例如延遲水平或儲存容量大小),你仍然能夠在較小的架構當中通過效能取捨確保特定模型迎來準確率增強。

一個語音識別的例子

受到篇幅所限,這裡我無法一一盡數自己在生產系統觀察當中看到的結論。但我們可以從開源示例出發,聊聊與之類似的生產模式。去年,我曾為 TensorFlow 建立一個簡單的語音識別示例。事實證明,當時我並沒有現成的資料集可以拿來即用於模型訓練。在眾多志願者的慷慨幫助之下,我收集了 6 萬條長度為 1 秒的短語語音音訊片段——這裡再次感謝 AIY 團隊幫助我發起的 Open Speech Recording 站點。利用這些資料,我構建了一套模型。遺憾的是,這個模型雖然具備一定功能,但準確率卻無法達到我的預期。為了瞭解自己身為模型設計師到底存在哪些侷限,我開始利用相同的資料集參加 Kaggle 競賽。競爭對手們的表現比我這套簡單的模型要好得多,而且在眾多不同方法當中,有數個團隊將準確度提升到了 91% 以上。對我而言,這意味著資料本身存在著根本性的錯誤。實際上,競爭對手們確實發現了其中的不少錯誤,例如不正確的標籤或者被截斷的音訊等等。這為我提供了動力,促使我專注於通過釋出新的資料集與更多樣本以解決他們面臨的各類實際問題。

我觀察了錯誤指標,希望瞭解模型最常遇到的問題,結果發現“其它”類別(即語音已經被識別完成,但相關詞彙並不存在於模型的有限詞彙範圍之內)出現頻率最高。為了解決這個難題,我增加了所捕捉詞彙的數量,旨在提供更多可用訓練資料。

由於 Kaggle 參賽者們上報了標籤錯誤,我還擠出了額外的時間進行標籤驗證,包括邀請志願者聆聽每段音訊以確保其與標籤相符。此外,Kaggle 參賽者們還發現了一些幾乎無聲或者被截斷的檔案,因此我編寫了一款實用工具以實現簡單的音訊分析,同時自動清除質量特別差的樣本。最後,在更多志願者與付費採集人群的共同支援之下,儘管刪除了不少錯誤檔案,我的這套資料集仍然順利擴充套件至擁有超過 10 萬條音訊。

為了幫助其他使用者使用這套資料集(並從我的錯誤當中吸取教訓),我將所有相關內容編撰為一篇 Arxiv 論文,並對準確率結果加以更新。其中最重要的結論是,在不改變模型或測試資料的前提下,最高準確率提升了 4% 以上——由 85.4% 增長至 89.7%。這無疑是一種顯著改進,人們在 Android 或 Raspberry Pi 上的演示應用程式中使用此模型時,反饋的滿意度也確實更高。在我看來,相較於投入更多時間進行模型調整,提升資料集質量帶來的效果改善無疑更為明顯。

我在實際生產過程當中,見到過人們不斷調整自己的生產設定以逐步提升成果水準。但如果大家也希望採取類似的方式,往往很難找到確切的實施途徑。大家當然可以從之前提到的語音資料使用技術中得到一些啟發,但要更明確地闡述這個議題,我們無疑應當進入下一階段——實用方法。

首先,審視你的資料

這看似是句廢話,但大家的第一步應該是以隨機方式瀏覽自己的訓練資料。將一部分檔案複製到本地計算機當中,並花上幾個小時檢視其內容。如果你打算處理圖片,請使用 MacOS 的 finder 滾動瀏覽各類縮圖,從而快速瀏覽數千幅圖片。對於音訊,你可以使用 finder 的播放預覽功能,或者將隨機片段以文字的形式顯示在終端當中。我當初就沒能投入足夠的時間對語音資料集進行預覽,因此 Kaggle 參賽者們才在處理資料時發現大量問題。

我確實覺得這個過程很愚蠢,但我倒不會為此而後悔。畢竟在完成工作時,我總會發現一些對於資料而言非常重要的結論——包括不同類別示例數量不平衡、資料損壞(被標記為 JPG 副檔名的 PNG 檔案)、錯誤標籤甚至是令人驚訝的關聯組合。Tom White 在對 ImageNet 進行檢測時就獲得了一些驚人的發現,他意識到其中的“太陽鏡”標籤指的其實是“聚光鏡”——一種用於匯聚陽光的古老裝置 ; “垃圾車”代表著主頁圖片 ; 而“斗篷”則對應著女性不死族形象。Andrej 以手動方式對 ImageNet 中的圖片進行了分類,這同樣給我帶來非常重要的啟示,包括如何分辨不同型別的犬隻——即使對人來講,這仍然不是件容易的事。

大牛祕笈!谷歌工程師是如何改進訓練資料集的?

你要採取的具體行動,取決於你究竟發現了什麼 ; 但作為資料清理工作的第一步,你應該首先完成上述檢查,這種直觀瞭解當前資料集中內容的方法有助於我們對接下來的步驟作出正確判斷。

快速選擇模型

不要在選擇模型方面投入太多時間。如果大家正在進行影像分類,請優先選擇 AutoML;如果不然,則請優先選擇 TensorFlow 的模型庫或者 Fast.AI 的示例集合,它們都能提供切實解決你類似問題的模型。換言之,最重要的是儘快開始迭代,即儘早且頻繁地由實際使用者試用你的模型。你隨時可以對模型加以改進,也能夠因此獲取更好的結果,但獲取資料才是工作的第一步。深度學習仍然遵循著“垃圾進,垃圾出”的基本計算原則,因此即使是質量最高的模型,也將受到訓練資料集質量的直接影響。通過選擇模型並對其進行測試,你將能夠理解這些缺陷的存在並加以改進。

為了加快迭代速度,你可以嘗試首先使用已經通過現有大型資料集訓練完成的模型,並利用遷移學習使用你收集到的(可能規模較小)一組資料對其進行微調。這通常能夠帶來超越小資料集直接訓練的結果,而且執行速度更快,因此大家將能夠快速瞭解如何調整資料收集策略。更重要的是,你可以將結果反饋納入你的收集流程,從而在學習過程中對流程進行同步調整——而非在訓練之前將收集作為孤立的事務處理。

行動之前先思考

對於面向研究與生產場景的模型構建工作,二者之間的本質區別在於研究通常會在起步時就對問題陳述作出明確定義 ; 但在另一方面,實際應用的需求則僅存在於使用者的頭腦當中,並隨時間推移逐漸顯現在開發者面前。舉例來說,對於 Jetpac,我們希望能夠在每座城市的自動旅行指南中儘量展示一些好照片。於是,我們開始要求評分者上傳一些他們認為“好”的照片。然而,最終我們得到了很多面帶笑容的人像照片,而這就是他們對於“好”的理解。我們將這些內容放入產品模型當中,並測試使用者的反應如何——結果表明,他們沒能留下任何深刻的印象,對此也沒有什麼共鳴。為了解決這個問題,我們將問題調整為“這張照片是否令人想要前往其中展示的地方?”這讓我們的內容質量變得更好,但不同的群體對此的理解還是存在巨大差異。東南亞的工作人員們明顯更喜愛一些會議型別的照片——人們身處大型酒店當中,穿著正裝手持酒杯。這顯然是一種可以理解的誤解,而且美國的目標受眾在看到這些圖片後只會感到壓抑且不想前往。最後,Jetpac 團隊中的六位成員手動為超過 200 萬張圖片進行了評分,因為我們比任何人都更清楚其中的標準所在。

沒錯,這是個有點極端的例子,但卻表明標記過程在很大程度上依賴於應用的具體需求。對於大多數生產用例而言,我們需要投入相當長的一段時間用於幫助模型找到正確問題的正確答案——這將直接決定模型解決問題的能力。如果我們使用模型來回答錯誤的問題,那麼將永遠無法在這樣糟糕的基礎之上建立可靠的使用者體驗。

我發現,保障問題正確性的惟一方法就是對應用程式進行模擬——而不可能單靠機器學習模型進行自我迴圈。有時候,我們會將這種方法稱為“奧茲精靈”,因為幕後還存在著指導者。仍然以 Jetpac 為例,我們讓人們為旅行指南手動選擇照片(而非訓練模型),並通過使用者測試反饋來調整我們用於挑選圖片的標準。一旦我們能夠以可靠方式從測試當中獲得正面反饋,即可將由此制定出的照片選擇規則轉換為標籤指令碼,進而處理數百萬張來自訓練集的影像。在此之後,這些素材又訓練出能夠預測數十億張照片質量的模型——但歸根結底,這套最終模型的 DNA 早在我們開發初始手動規則時就已經確立。

利用真實資料進行訓練

在 Jetpac 當中,我們用於訓練模型的影像與我們在模型中應用的影像擁有相同的來源(大部分來自 Facebook 與 Instagram),但我發現的一大常見問題在於,訓練資料集在很大程度上與生產場景下的實際輸入資料集存在差異。舉例來說,我經常看到那些希望利用 ImageNet 影像進行模型訓練的團隊,最終發現自己的模型成果根本無法解決無人機或機器人在實際場景中遇到的問題。之所以發生這種情況,是因為 ImageNet 中大多是人類拍攝的照片,而這些照片往往具有很多共通特性。舉例來說,人們使用手機或照相機進行拍攝、使用中景鏡頭、取景位置大致在頭部高度、一般在白天或人為照明環境下拍攝,且指向的物體居中並位於前景之內。相比之下,機器人與無人機則使用視訊攝像機進行取景,其通常採用高視野鏡頭,拍攝位置可能是地面或者空中,照明條件一般較差,無法智慧地框選任何物體等等。這些差異意味著,如果只是利用來自 ImageNet 的圖片對模型進行訓練,再將成果部署到無人機或者機器人當中,那麼其帶來的分析準確率絕對不可能達到你的預期水平。

訓練資料還可能在一些細微的方面與實際應用所看到的內容存在差異。比如說,你正在設計識別野生動物的相機,並使用世界各地的動物資料集進行訓練;如果你只打算在婆羅洲的叢林使用相機,那麼資料集中的企鵝類圖片基本沒機會和現實影像對應;那麼如果訓練資料中包括南極的照片,模型就可能將其他動物誤認為企鵝。要想降低這類錯誤的機率,就要提前從資料集中刪掉這類圖片。

有許多方法可以根據已有的的先驗標準(例如,在叢林環境中大幅降低企鵝出現的概率)來校準結果,但更方便有效的方法是使用反映產品實際遇到的情況的訓練集。我發現最好的方法是始終使用從現實應用中直接捕獲的資料,與我上面提到的“綠野仙蹤”方法可以很好地匹配。應該讓專案參與者為初始資料集設計標籤,即使一開始的標籤數量不多,它們也起碼會反映現實狀況,一般來說也足夠進行初始實驗的遷移學習了。

遵循指標

當我研究語音指令的案例時,我看的最多的報告就是訓練中產生的混淆矩陣。它們在控制檯中是這樣顯示的:

大牛祕笈!谷歌工程師是如何改進訓練資料集的?

這可能看起來很嚇人,但它實際上只是一個顯示網路錯誤的詳細資訊的表格。下圖則是標籤化的版本,看起來更美觀:

大牛祕笈!谷歌工程師是如何改進訓練資料集的?

此表中的每一行代表一組實際真實標籤都相同的樣本,每列顯示預測標籤的編號。例如,高亮顯示的行代表所有無聲的音訊樣本,從左向右看,則可以看到預測的標籤都是正確的,每個標籤都落在無聲這個預測列中。由此可知,該模型非常適合判斷真正的無聲狀態,不會出現錯誤的反例。如果我們看整欄,顯示有多少樣本被預測為無聲,可以發現一些實際上是語句的樣本被誤認為是無聲的,並且誤報很多。這些結果是很有用的,它們會讓我仔細研究被誤報為無聲的樣本,然後發現這些樣本大都是音量很低的錄音。於是我就可以排除掉音量較低的樣本來提升資料質量,這都要歸功於混淆矩陣提供的線索。

幾乎所有的結果分析都可能是有用的,但是我發現混淆矩陣是一個很好的折衷方案,它提供的資訊比單個精確的數字更多,但不會產生太多難以分析的細節內容。在訓練過程中觀察數字變化也很有用,從中可以得知模型正在學習哪些類別,並在清理、擴充套件資料集時告訴你該專注於哪個層面。

巧用聚類

用視覺化聚類來觀察網路如何分析訓練資料是我最喜歡的方式之一。 TensorBoard 為這種分析方法提供了很好的支援;雖然視覺化聚類經常用於檢視單詞嵌入,但我發現它幾乎適用於任何嵌入式運作的層級。例如,影像分類網路通常在最後的完全連線或 softmax 單元之前有一個倒數第二層,可用作嵌入(像是 TensorFlow For Poets 這樣的簡單遷移學習案例就是這樣工作的)。這些並不是嚴格的嵌入,因為在訓練過程中沒有流程來確保產生真正的嵌入層中可預期的理想空間屬性,但對它們的向量進行聚類確實會產生有趣的結果。

一個實際案例中,與我合作的一個團隊對影像分類模型中某些動物的高錯誤率感到困惑。他們使用聚類視覺化來檢視訓練資料是如何分佈到各種類別的。當看到“獵豹”時,他們清楚地看到資料被分成兩個不同的組,組之間相距一定距離。

大牛祕笈!谷歌工程師是如何改進訓練資料集的?

上圖就是他們發現的情況示意。看到各個叢集中的照片後就能一目瞭然:很多捷豹牌汽車被錯誤地標記為動物獵豹。於是,團隊就可以檢查標籤註釋流程,並意識到相關人員的工作方向和工作介面存在問題。有了這些資訊,他們就能夠改善標籤標記人員的訓練流程並修復相應的工具,從而將所有汽車影像從獵豹類別中剔除,使這一類別的精確度顯著提升。

聚類可以讓你深入瞭解訓練集中的內容,從而提供與單純檢視資料類似的好處。但神經網路實際上是根據自己的學習理解將輸入資料歸類,以此來引導你探索分析。作為人類來說,我們非常善於用肉眼發現異常情況,所以我們的直覺和計算機處理大量輸入的能力相結合,為發現資料集的質量問題提供了一個可擴充套件性良好的解決方案。這裡塞不下使用 Tensorboard 完成此類任務的完整教程了(本文已經夠長了,感謝堅持到現在的讀者!),但如果你真心想要改善輸出指標,我強烈建議你熟悉這個工具。

資料收集是持久戰

我還沒聽說過收集更多資料卻沒有提升模型精度的情況,事實上有很多研究支援我的經驗判斷。

大牛祕笈!谷歌工程師是如何改進訓練資料集的?

該圖來自“重新審視資料的不合理有效性”,證明即使訓練資料集的規模增長到數億之巨,影像分類的模型精度仍然在隨之提升。 Facebook 最近更進一步,使用幾十億張帶標籤的 Instagram 影像做訓練,從而在 ImagNet 測試中創下了新的精度紀錄。這表明,即使任務使用大型、高質量的資料集,增加訓練集的大小仍可以提高模型精度。

這意味著,只要更高的模型精度可以改善使用者體驗,你就需要策略來持續擴充資料集。你可以嘗試用創新手段來利用相對微弱的訊號來獲取更大的資料集,Facebook 使用 Instagram 標籤就是一個很好的例子。另一種方法是提高標籤流程的效率,例如用模型早期版本生成的預測標籤進行輔助判斷,以提升貼標人員的效率。這會帶來先入為主印象的風險,但在實踐中,收益往往超過這種風險。聘請更多人力來標記更多訓練資料也往往是有意義的投資,雖說有些組織並沒有為此類投入安排預算。對於非營利性組織而言,可以設法提供一些公開的工具,讓支持者方便地自發貢獻資料,這是低成本提升資料規模的一個很好的方法。

當然,所有組織的終極夢想都是獲得一種在使用過程中自然生成更多標記資料的產品。我個人對這種想法沒那麼大興趣,實際上它也不是萬能的解決方案,因為現實有很多情況是人們就想盡快解決問題,不想費時費力去標記資料。對初創公司來說這是一個很好的投資熱點,因為它就像是一個用於模型改進的永動機;但是在清理或聚合收集到的資料時總會產生一些單位成本,所以往往一個便宜的商業眾包方案會比完全免費的方案更經濟一些。向險峰一路前行

總有一些模型錯誤給使用者帶來的影響超過損失函式的計算結果。你應該提前考慮最糟糕的後果,並設計一個模型後盾來避免此類事故。後盾可以是一個黑名單,裡面是預測錯誤代價太高的那些分類;或者是一套簡單的演算法規則集,以確保行動不會超過某些預設的邊界引數。例如,你可以製作一個罵人詞彙表,以防文字輸出應用通過學習訓練集中的資料產生這些詞彙,因為這類輸出對你的產品會有負面影響。

在事前預測所有的負面輸出結果往往很困難,所以從現實世界中的錯誤中吸取教訓非常重要。最簡單的方法之一就是在產品剛進入市場時使用錯誤報告。人們使用你的應用,感到模型輸出的結果不甚滿意時,要讓他們很容易向你反饋意見。可以的話獲取模型的完整輸入資料,但如果涉及敏感資料,只要知道低質量的輸出是哪些就可以幫助你做調查。這些類別可以用來確定收集更多資料的位置,並定位用來研究現有標籤質量的類。一旦對模型做了新的調整,跑正常資料集之外還要跑一遍之前產生低質量輸出的資料集,並對後者的輸出結果進行單獨分析。這個流程有點像迴歸測試,並提供了一種方法來評估使用者體驗改善的程度,因為單個模型精度指標並不能完全覆蓋人們所關心的所有層面。在檢查以往產生強烈反響的一小部分案例時你就能獲得一些獨立的證據,證明你的確是在改善使用者體驗。如果輸入模型的一些資料過於敏感,無法收集過來進行分析,就要使用 dogfood 測試或內部實驗來確定手頭的哪些資料可以產生這類錯誤結果,並在迴歸測試集中使用這些資料取代使用者輸入。

未來會更好嗎?

我希望本文成功說服你花更多時間來研究資料,關於如何改善資料我也提供了一些建議。這個領域得到的關注是遠遠不夠的,我為了找到一點幫助和建議都要大費周章。所以我感謝所有與我分享過自己的方法的從業者,並希望能從更多的人那裡聽取你們獲得成功的方法。我認為會有越來越多的組織安排工程師團隊專門用於資料集的改進,而不是讓 ML 研究人員來推動進展。我希望能看到整個領域的發展。我時常驚歎於模型在質量非常糟糕的資料集訓練後還能產生優質的輸出結果,所以我迫不及待地想看看當資料集改進後,我們的模型能帶來怎樣的驚喜!

原文連結:

Why you need to improve your training data, and how to do it

更多幹貨內容請關注微信公眾號“AI 前線”(ID:ai-front)

相關文章