乾貨 | 深度學習的實踐應用之路

雷鋒網按:本文由圖普科技編譯自《Applying Deep Learning to Real-world Problems》,雷鋒網獨家首發。

近年來,人工智能的崛起可以說是得益於深度學習的成功。驅動深度神經網絡突破的三個主要因素分別是:海量的訓練數據、強大的計算架構和學術領域的相關進展。因此,深度學習在圖像分類、面部識別等任務的表現上不僅超越了傳統方法,還超越了人類水平。這一切都為那些使用深度學習解決實際問題的新業務創造了巨大的發展潛力。

在位於柏林的Merantix總部,我們致力於研究這項新業務在不同行業下的應用。(目前,我們的研究對象是汽車業、醫療保障業、金融業和廣告業。)

學術理論與現實生活通常有很大不同(來源:mimiandeunice.com)

現在訓練一個神經網絡比以往任何時候都要簡單。然而,這並不意味着你可以將教程中的代碼直接應用到應用程序中。有趣的是,學術理論對這些至關重要的訓練技巧幾乎不予討論,而這些技巧恰恰是產品的關鍵所在。

將深度學習應用於現實問題可能會比較麻煩(來源:pinsdaddy.com)

因此,我想理解和掌握這些技巧,對於那些計劃在生意上應用深度學習的人來說將會大有裨益。

在本文中,我想分享三點關鍵的心得和經驗。當我們在Merantix用深度學習應對現實問題時,這些心得給了我們很大的幫助和啟發:

  • 心得I:預訓練的重要性

  • 心得II:實際標籤分佈的注意事項

  • 心得III:理解黑箱模型

聲明:

  •  本文介紹的內容不代表完整的方法,還有很多其他的方法和技巧本文沒有涉及。

  • · 本文分享的大部分心得體會不僅適用於深度學習,還適用於其他機器學習算法。

  • · 所有的心得都不是針對某一行業的。

  • · 本文中的大多內容都適用於有監督式學習的問題。

這篇文章是根據我在5月10日「柏林人工智能大會」上的演講修改而成的。

心得I:「預訓練」的重要性

在機器學習學術界,對獲取數據集的關注微乎其微。相反,為了將深度學習方法與其他方法作比較,並最終確定一個最優方法,標準做法是在一個標準數據集上,以相同的評估程序來評測不同方法的表現。然而在現實情境中,你的新算法性能比另一算法高出1%並不重要,重要的是建立一個強大穩健的,並且能夠準確地解決目標任務的系統。對所有機器學習系統來說,這需要一些算法能夠從中學習的標記訓練。

對許多現實問題來說,獲取標註的訓練數據的成本相當昂貴。為了詳細地闡述這個問題,我們來看兩個案例:

1. 醫學影像

如果我們想要建立一個在CT圖像中檢測人體淋巴結的系統,我們需要對CT圖像中的淋巴結進行標記。這是一項非常耗時的工作,因為這些圖像都是3D的,而且我們需要在3D圖像中識別出非常小的結構。假設,一個放射科醫生一小時能標記4張圖像,他的時薪是100美元;這就意味着標記一張CT圖像將花費我們25美元,而標記一萬張CT圖像,我們要花25萬美元。因此,我們需要幾個醫生來對同一張圖像進行標註,以確保接近100%的診斷準確性。這樣一來,一個醫學任務的數據集的成本很容易就會超過25萬美元。

2. 信用評分

如果我們想建立一個能夠對客戶信用等級進行評估的系統,我們就需要知道存在潛在違約風險的客戶,這樣我們才能讓一個機器學習系統提前識別出他們。不幸的是,只有當違約真正發生的時候我們才能確定違約的客戶。因此,一個比較天真的策略是給每個人發放貸款(假如是每人一萬美元)。但這就意味着每一個人違約我們就將損失一萬美元,這無形中就使得每一個標註數據點的價格都非常昂貴。

顯然我們可以通過一些方法來降低這些成本,但總體來說,獲取用於解決現實問題的標記數據的成本非常高。

那麼,我們究竟該如何解決這個問題呢?

 「預訓練」

預訓練能有效降低成本(來源:massivejoes.com)

「預訓練」的基本操作是——首先,我們需要在一個相關領域的廉價大數據集上,或者是在同一領域的「非純凈訓練數據」上,對一個神經網絡(或另一個機器學習算法)進行訓練。儘管這樣做不能直接解決問題,但這能讓神經網絡對你需要解決的問題有初步的了解。接下來的第二步,我們要在一個更精細的、成本更高的小數據集上進一步優化神經網絡的參數。下圖是「預訓練」的操作示意圖:

 當訓練數據集很難獲取時,首先在相對廉價的大型數據集上對神經網絡進行「預訓練」;然後,在一個成本相對高的、相對精細的數據集上調整神經網絡。在對神經網絡進行微調時,類別的數目可能會發生改變。

人們通常會在有着1000個類別的ImageNet數據集上對神經網絡進行「預訓練」,然後根據他們實際需要解決的問題對神經網絡進行微調,而微調過程中的類別數與「預訓練」中的類別數很可能是不一樣的。這就意味着神經網絡的最後一層需要重新初始化。通常情況下,神經網絡中最後一層的學習效率要相對高一些,因為最後一層需要從頭開始學習,而前面的層的學習速率會低一些。對於像ImageNet這樣的數據集,這樣的特徵學習是通用的,因此它能直接用於解決其他的計算機視覺問題。

我們應該如何獲取「預訓練」的數據?

 「預訓練」數據的來源

1. 預訓練模型:網絡上有很多經過訓練的模型,其中最應該指出的就是Model Zoos。Model Zoos包含了一系列不同的訓練數據,這些數據經過了專家學者、公司企業和深度學習愛好者的訓練。

2. 公共數據集:網上有很多數據集,所以不要在收集數據集上浪費時間,花時間看看網上有沒有能夠解決你的問題的數據集。

3. 數據抓取:如果網上既沒有一個公共的「預訓練」模型,也沒有你需要的數據集,那麼你可以通過一個小門路來生成一個數據集。你可以建立一個所謂的「抓取器」,讓它自動從特定的網站上收集數據集。這樣你就能建立一個新的數據集了。

預訓練的數據來源

弱標記的數據

因為我們會在一個更精確的數據集上對神經網絡進行調整,所以在調整之前我們是可以在所謂的「弱標記」數據集上對其進行「預訓練」的。之所以稱之為「弱標記」數據集,是因為其中的數據標記並非是完全正確的(可能有90%的數據是正確的,10%是錯誤的)。「弱標記」數據的好處在於它能夠輕鬆獲取,不需要人工參與標記。這與那些人工參與標記的數據集相比成本要低很多。

舉個例子來說,在攻讀博士學位期間,我從維基百科和IMDb上獲取了一個數據集,這個數據集中包含了50萬張人臉圖像。將照片中每個人的出生日期和照片底部顯示的拍攝日期結合起來,這樣我們就能大致判斷出每張圖像的年齡。需要注意的是,在某些情況下,照片底部顯示的拍攝日期可能是錯的,或者一張照片中可能有多個人而面部檢測器在識別人臉時出現了差錯,因此,我們不能完全保證圖像年齡的判斷都是正確的。儘管如此,我們還是應該在這個「弱標記」數據集上進行「預訓練」,以提高神經網絡的性能,而僅在準確標記了的數據集上訓練是完全不夠的。

在前面提到的醫學影像問題上,我們同樣可以用這樣的邏輯來理解。為了使標記準確度儘可能接近100%,我們需要好幾個醫生單獨對同一張CT圖像進行標記。這就相當於我們用於進一步調整神經網絡的數據庫。另外,我們可以收集一個僅由一個人完成標記的「弱標記」大數據集,這樣我們不但能夠減低標記的成本,還能確保神經網絡經過了不同的圖像數據訓練過。

總之,提高神經網絡性能不一定要昂貴的人工標記或人工注釋,通過免費的,或是低成本的標記數據集,同樣可以提高性能。

心得II: 實際標籤分佈的注意事項

現實中的標籤分佈(來源:r4risk.com.au)

既然我們已經獲得了「預訓練」和調整的數據,接下來我們就能開始神經網絡的正式訓練了。在正式訓練中,出現了另一個學術界與現實世界之間的巨大分歧。

在學術界,數據集大多都是平衡的。也就是說,在有監督的分類問題上,每一類別通常有數目相同的樣本。下圖中有兩個學術界數據集的例子:MNIST是一個非常有名的手寫數字數據集,這個數據集中包含了與數字的數量大致相等的樣本。Food 101是學術界數據集的另一個典型,其中的每一類食物都有整整1000張圖像。

MNIST和Food101都是「平衡數據集」

非平衡標籤分佈

我想再一次用兩個現實中的案例來說明這個問題:

1. 醫學影像:醫學影像的訓練數據是很不平衡的。病患中的大多數其實都是健康的,只有一小部分人患某種疾病。

2. 信用評分:實際上,大多數客戶都歸還了貸款,違約的人只佔大約1-2%。

不平衡的現實生活的標籤分佈

正如上面所說的,在這兩個案例中,標籤分佈是非常不平衡的。這在現實生活中其實是很常見的。實際上,每一類都有相同多的樣本量是很少見的。

不平衡的錯誤分類成本

不幸的是,這種情況變得越來越糟糕。在學術界,數據集中每一類別的分類錯誤的成本通常是一樣的。但是在現實生活中就大不相同了。

1. 醫學影像:將一個健康的人誤診為病人還不是最糟糕的,只要醫生在反覆檢查后發現這個人實際上是健康的就沒有問題。但是講一個患病的人錯誤地判斷為健康的人,讓病人沒能得到及時的治療,這就非常危險了。

2. 信用評分:拒絕向那些會歸還貸款的人提供貸款還不算最糟糕的,這最多讓你損失一些貸款利率。但是給違約的人提供貸款的代價就很高了,你需要承擔借出的所有貸款。

下面是這兩個案例的示意圖:

現實應用中不平衡的錯誤分類成本

如何解決這一問題?

既然類別和錯誤分類的成本都是不平衡的,那麼我們就必須要想個方法來應對這個不平衡的問題。針對這一問題的文獻十分有限,我們找到了一些與之相關的博客文章和Stack Overflow問題。

值得注意的是,不平衡的類別和不平衡的錯誤分類成本都是高度相關的,因為這意味着對於部分樣本,我們幾乎沒有訓練數據;而且出現錯誤的成本相當高。

我將那些有助於模型分類的方法大致分成了四種:

1. 更多訓練數據

最突出的方法就是從少量的類別中收集盡量多的數據。以醫學影像為例,這就意味着我們要盡量收集患有某種疾病的病人的圖像。如果收集這些圖像的成本過高,那麼就用前面所討論的其他方法來獲取訓練數據。注意,在調整訓練標籤分佈的時候你需要非常小心,因為這對於模型的預測判斷有很大的影響:如果你在訓練數據集中增加了患病病人的數量,那麼模型就更傾向於將對象預測為患病病人。

收集更多稀缺類別的數據。當訓練過程中的標籤分佈與預測結果不匹配時你就要非常注意了。

2.改變標記

如果你不能收集到更多稀缺類別的數據,那就考慮換一種分類方法。在實際的應用中,你可能不需要區分A疾病與B疾病,只要能識別出這兩者中的其一就夠了。在這種情況下,你可以將這兩個類別合併。這樣一來,訓練期間的訓練流程將會被簡化;而且在模型推斷階段,即使A疾病和B疾病混淆了也沒有太大關係。

在訓練期間,或在模型評估階段將兩個或多個類別合併能使問題簡單化

3. 採樣

如果你既不能得到更多數據,也無法改變標記,那就意味着你需要研究原始數據了。那麼究竟該如何確保我們的模型善於處理稀缺類別呢?你只需要在訓練過程中改變算法處理案例的方式。通常情況下,樣本都是經過統一採樣得來的,這也就意味着算法在訓練期間處理每個案例的方式都是一樣的。

我們可以採取一些不同的、有助於提高稀缺類別標記的性能的採樣方法。

  • 忽略樣本:忽略高頻類別的部分樣本可以說是最簡單的方法了。我們可以在每一類樣本數目大致相同的情況下採用這種方法。

  • 過採樣/欠採樣:「過採樣」指的是將稀缺類別的樣本以更高的頻率展示給算法;而「欠採樣」的意思則相反。從算法的角度來看,這兩種方法的結果是一樣的。這兩種方法相對於前面的方法好處在於沒有樣本是被忽略的。

  • 消極樣本挖掘:第三組採樣方法稍微複雜一些,但卻是最有效的方法。跟之前的「過採樣」和「欠採樣」不同,我們這一步的採樣是有意識的。儘管我們有很多高頻類別的樣本,但是我們最關心的還是其中最複雜、最困難的樣本,比如那些被誤分類概率最高的樣本。因此,我們可以在訓練過程中有規律地對模型進行評估,同時調查樣本,以識別出其中很可能被誤分類的部分。這樣一來,我們能夠輕易地選擇出算法最常學習的樣本了。

4. 對損失進行加權

採用上述的三個方法以後,我們在改善類別分佈方面做的就已經夠多了。因此,我們現在可以轉移注意力至算法本身。幸運的是,還有一些方法是能夠用於讓算法更多地關注稀缺類別的。其中一個直接的方法就是增加稀缺類別樣本的損失權重。

稀缺類別的損失權重增加了

心得III:理解黑箱模型

一個黑箱(來源:辛普森一家)

正如我們在前面提到的「預訓練」,學術界最重要的目標就是不論採用的模型是怎樣的,都要達到或超越當今最先進的性能。而在考慮現實生活應用時,僅建立一個性能良好的模型是不夠的。

我們還需要:

  • 理解模型為什麼及如何出現預估錯誤的,

  • 給出直觀的事實說明為什麼我們的模型性能要優於之前的任何方法,

  • 確保模型不會被欺騙。

在深度神經網絡興起之前,大部分模型都是相對容易理解的。看以下幾點:

  • 線性模型:線性分類器或回歸模型提供了每一特徵和預測結果之間的直接關係。這就使我們能夠直接、輕易地理解模型預估決策機制。

  • 決策樹:「決策樹」的優勢在於我們可以沿着樹來理解決策是如何形成的。總體上來說,最頂端的枝節涵蓋了最重要的特徵。談到任意決策森林時,情況就變得稍微複雜一些了,但樹的結構還是能讓我們很好地理解其中的原理的。

不幸的是,理解深度神經網絡的決策機制要困難得多。因為深度神經網絡是高度非線性的,而且其中的變量數量基本都是上億的。所以要解釋其決策的方式是很困難的。

傳統機器學習方法VS深度學習

如今,如何解釋決策程序已經成為了現實生活應用中的一個巨大挑戰,因為深度神經網絡正迅速融入我們生活的各個領域——汽車自動駕駛、醫療診斷、金融決策等等。大部分的實際應用對我們的生活、財產和一些敏感信息都會產生巨大的影響。因此,算法作出的錯誤決策很可能會謀財害命。

「特斯拉汽車事故」(左圖)和關於人工智能轉變為種族主義者的報道文章(右圖)

不幸的是,這些失誤的發生不全是偶然的,攻擊者的有意而為也會引發這些失誤。為了強調這個話題的相關性,研究專家已經發現,只要在一張普通圖像上增加簡單任意的噪聲,就能改變深度神經網絡的分類結果,而人眼幾乎察覺不出圖像的變化。同樣,在與純人工圖像相適應的同時,仍能得到一個非常自信的預測結果。

在一張圖像或人工圖像上加上少量的任意噪聲(左圖)能輕易地騙過神經網絡

在現實生活中,你通常會非常想弄清楚為什麼你的系統不能發揮它本身的效能。

在Merantix,我們對這些問題非常重視,我們相信這些問題在未來將會變得更加重要,因為深度學習系統在現實生活中將會有更多的實際應用。

最近,我們開發了一個名為Picasso(Medium Post,Github)的深度學習可視化工具箱。由於要研究各種各樣的神經網絡架構,所以我們開發了Picasso來幫助我們在不同的領域查看標準的模型。比如,在汽車駕駛中理解道路分叉或道路對象識別失誤;廣告業中理解為什麼某種創意能獲得更高的點擊率;在醫學影像領域分析CT圖像或X光圖中出現的不明對象。下圖是我們的開源Picasso視覺化檢視器的演示圖:

 

總結

在本文中,我分享了在Merantix用深度學習解決現實問題時總結出的三個非常重要的心得體會,希望這些心得對那些計劃在生意中使用深度學習的人有所幫助。正如我在文章開頭說的,在將深度學習應用於實際生活中時,我們有許多非常有用的技巧,也有很多需要注意的事項。

Rasmus Rothe是歐洲最重要的深度學習專家之一,也是Merantix的聯合創始人之一。他曾在蘇黎世大學、牛津大學和普林斯頓大學學習計算機科學,並專攻深度學習。他曾開發了howhot.io,並將其作為他博士研究的一部分;創辦了歐洲最大的Hackathon HackZurich,並為谷歌和BCG工作。


想在手機閱讀更多博客及網站收入資訊?下載【香港矽谷】Android應用
分享到Facebook
技術平台: Nasthon Systems