不談理論,只談實戰。
當我們需要用深度學習處理現實問題時,除了相關的技術和資料,你還需要掌握一系列的小訣竅,並將這些技巧用在級聯模型、智慧增強、合理的評價標準、建立可重用的訓練管道、有效推斷與減小模型大小等等方面。
本文由深度學習的實踐者,位於柏林的創業公司Merantix所著,五個案例,三大心得,帶你在深度學習的應用之路上快速打怪升級。
作者 | Rasmus Rothe
編譯 | AI100(rgznai100)
近年來,人工智慧正迅速崛起,這主要歸功於深度學習的成功。
深度神經網路的突破來自三大因素的驅動:海量的訓練資料、效能強勁的計算架構,以及學術研究上的相關進展。
正是因為這三大因素,深度學習系統在影象分類、面部識別等任務上,不僅表現開始優於各類經典方法,而且超過人類的水平。這一切,為那些用深度學習來解決實際問題的顛覆性新業務創造了無限可能。
位於柏林的Merantix,致力於研究這樣的新型商業案例,目前這些案例是來自汽車、醫療、金融業和廣告等行業。
學術世界往往不同於現實
如今,神經網路的訓練正變得前所未有地容易。但這並不是說,把指導教程的程式碼拿出來就能直接服務於應用。值得注意的是,許多最為重要的使用訣竅極少在學術文獻中被討論,但它們對產品的成功至關重要。
把深度學習用到實際問題中時會遇到很多麻煩(via:pinsdaddy.com)
因此,我認為領會這方面的技巧和訣竅,對於那些打算在實際業務中應用深度學習以的人會有所幫助。
在本文中,我想分享的是三個比較關鍵的心得,它們在我們Merantix用深度學習解決實際問題的過程中起到了很大的作用:
心得 I:預訓練的重要價值
心得 II:實際標註分配的注意事項
心得 III:理解黑箱模型
一點宣告:
本文中的方法並不代表全部,還有很多其他的重要訣竅。
一般來說,這裡的心得不僅適用於深度學習,而且適用於其他的機器學習演算法。
所有這些心得都不特別針對對某一行業。
本文所涉及的問題大多都適用於監督式學習。
本文基於我5月10日在柏林人工智慧大會Berlin.AI上的演講修改而成。
演講PPT
https://www.slideshare.net/RasmusRothe/3-learnings-from-applying-deep-learning-to-real-world-problems
心得 I:預訓練的重要價值
在機器學習學術領域,人們並不關注資料集的獲取。恰恰相反,為了比較深度學習與其他方法,並確保其中之一能夠優於別的方法,標準做法是在某一標準資料集上,用相同的評價程式來衡量不同演算法的效能。
然而,在真實情境中,重要的不在於證明新演算法在效能上超過老演算法1%,而在於構建出能準確解決目標任務的高效能系統。對所有機器學習系統來說,這一點就需要演算法能夠從中進行有效學習的標記訓練。
不幸的是,就許多實際問題而言,獲取到標註完備的訓練資料成本十分高昂。為詳盡說明這裡的問題,我們來看兩個案例:
案例一、醫學影像檢測:
如果要打造一個能在CT影象中檢測人體淋巴結的系統,我們就需要有那些已經標註淋巴結的CT影象來進行訓練。
而這是一項相當耗時的任務,因為CT影象是3D的,而需要從中標記出來的淋巴結結構又非常之小。
假定一位放射科醫生的時薪是100美元,他每小時能認真標註好4張圖,這就意味著標註一張圖的成本是25美元,或說標註10000張圖的成本是25萬美元。
考慮到接近百分之百的更高診斷準確度,是需要有更多的醫生來標註相同的影象才能確保的,針對該特定醫學任務的訓練資料獲取成本,很容易就能超過25萬美元。
案例二、信用評分:
如果要打造一個能對信用行為進行評分的系統,我們就需要知道哪些客戶更有可能違約,這樣我們才能對機器學習系統進行訓練,以提前識別出這樣的客戶。問題在於,只有當違約發生時我們才能確定客戶是不是真的違約。一個樸素的策略是給每個人發放貸款,比如說1萬美元。但這意味著,每有一個人違約,我們都將損失1萬美元。這就使得每個標註資料點的獲取成本都非常昂貴。
顯然,我們可以用一些竅門來降低這裡的成本,但是總體來看,針對現實問題的註記資料獲取成本都很昂貴。
我們該如何來解決這一問題呢?
預訓練
預訓練幫助(via:massivejoes.com)
預訓練的基本原理,是先用某相關領域的廉價大資料集或相同領域的噪聲資料(noisy data)訓練神經網路(或其他機器學習演算法)。儘管這種方法不能直接解決原始問題,但它能使神經網路對於要預測的問題形成一個模糊的印象。第二步,針對要解決的問題獲取一個更小、更昂貴的資料集,並利用它來進一步優化神經網路的引數。
其流程如下圖所示:
當資料集很難獲取時:先在某相關領域的廉價大資料集上對神經網路進行預訓練;而後,在標註準確的高價值資料集上對神經網路進行優化調整。同小資料集訓練相比,該方法能使演算法的效能得到很大的提升。
在優化調整時,類別數可能會發生改變:人們通常在類別數為1000的資料集(如ImageNet)上預訓練神經網路,然後根據所要解決的特定問題來對神經網路進行優化調整,這些問題的類別數可能不同。
這就意味著必須重新初始化最後一層網路。最後一層網路的學習速率通常會設定得高一點,因為它需要從零開始學習,而前面幾層的學習速率設定則較低。對於像ImageNet這樣的資料集來說,(最後全連線層的)特徵學習非常通用,可直接用來處理其他計算機視覺問題。
如何來獲取預訓練所需的資料?
預訓練資料來源
1、預訓練模型:網上有很多經過訓練的模型。首先要推薦的就是Model Zoos。
Model Zoos網站上釋出有一系列不同的已訓練模型,它們都已經過專家學者、公司機構與深度學習愛好者的訓練。
可檢視
https://github.com/BVLC/caffe/wiki/Model-Zoo
https://github.com/fchollet/deep-learning-models
http://mxnet.io/model_zoo/
2、公共資料集:網上還有很多資料集。所以在自己動手採集資料前,要先檢查網上是否已存在能夠解決你手上問題的那些資料集。
可檢視:
http://www.cvpapers.com/datasets.html
https://github.com/caesar0301/awesome-public-datasets
https://archive.ics.uci.edu/ml/datasets.html
3、資料抓取:如果找不到公開的預訓練模型或資料集,你可以用一種懶辦法來生成資料集,無需你手動標記:做一個能自動從特定網站抓取標註資料的爬蟲。這樣你就能自動生成一個新的資料集。
預訓練資料來源
弱標註資料(Weakly labeled data)
我們是在標註準確的資料上優化調整神經網路,因而在所謂的弱標註資料上進行預訓練是可行的。
弱標記資料是指標註不完全準確的資料(比如,90%的標註是正確的,剩下的10%是錯誤的)。這種資料的優勢是可以自動獲取,無需人類手動進行標註。這與那些由人類手動標註每張影象的資料相比,在成本上較為低廉。
舉例來說:讀博期間,我從維基百科和IMDB抓取了500張面部影象。結合個人檔案的出生日期與照片標題所暗示的拍攝日期,我們就能為每張影象估算一個大致的年齡。注意,某些情況下,影象標題中的年份可能是錯誤的;或是照片顯示有多人,但面部檢測器所選擇的人臉卻是另一個人的。這樣一來,我們就不能確保年齡標註在所有情況下都正確。但結果說明,相比只在準確標註的小型資料集上訓練,在弱標註的大型資料集上進行預訓練更有助於提升演算法的效能。
同樣的邏輯可以用在醫學影像檢測的問題上,該問題要求,多位醫生必須獨立標註相同的影象,以確保百分之百的準確率。這樣的資料集可用作優化調整。此外,採用僅由一人來做的弱標註,我們就能採集到一個更大的資料集。由此,我們不僅降低了標註的總成本,同時還仍能確保神經網路訓練影象的多樣性。
總之,提升效能並不總是意味著你要進行非常昂貴的手工標註,你還是能以免費或極低的成本來獲取到一個標註資料集。
心得 II:實際標註分配的注意事項
實際分配(via:r4risk.com.au)
獲得預訓練和優化調整所需的資料後,我們就能進行下一步了——開始訓練神經網路。這一環節上,學術研究與現實世界之間又大不相同。
在學術研究中,資料集通常是平衡的。這就意味著,對於監督分類問題,每個類別的樣本數大抵相同。
下面是兩個例項:
MNIST 是一個非常有名的手寫數字資料集,其中每個數字的樣本數大致相等。
Food 101是學術資料集的另一典型,其中每種食物類別(共101個)都準確包含1000張影象。
MNIST
不平衡的標註分配
我再一次用這兩個現實案例來說明問題:
醫學影像檢測:醫學影像訓練的資料非常不平衡。大部分人都是健康的,只有一小部分的人患有某種疾病。
信用評分:事實上,大部分客戶都會償還貸款,只有1–2%的客戶會違約。
不平衡的實際標註分配
如上圖所示,這兩個例項中的標註分配很不平衡。這在絕大部分現實應用中都很典型。事實上,每個類別都是相同數量的樣本才很罕見。
誤分類的不均衡成本
不幸的是,這種情況會變得更糟:在學術資料集中,各類別的誤分類成本通常相同。但在現實應用中,情況卻大為不同:
醫學影像檢測:把健康的人誤診為病人還不是最糟的情況,只要醫生能對診斷結果進行復查,並把健康的這個人找出來就可以了。但反過來,未能診斷出真正的病人而不提供給他任何治療,則就非常危險了。
信用評分:拒絕向有能力償還的客戶發放貸款,意味著你只是損失一點利息。但如果向違約的客戶發放貸款,你就要對全部的貸款損失負責了。
我們用下面的圖表來說明問題:
現實應用中誤分類的不均衡成本
如何解決這一問題?
意識到通常情況的類別與誤分類成本的不均衡後,我們就必須想辦法來解決問題。研究過這一課題的學術文獻相當有限,但某些部落格與Stack Overflow的社群問答往往能給我們一些啟發。
注意,類別與誤分類成本的不均衡是兩個高度相關的問題,這就意味著,一部分樣本幾乎沒有訓練資料,從而使出錯的機率更高、成本更昂貴。
我把有助於改進我們模型的稀有樣本分類能力的方法分為四類:
1.更多數據:針對稀有類別,顯而易見的辦法是收集更多資料。
對於醫學影像檢測案例,這就意味著要著重於收集患有某種目標疾病的病人的影象。
如果這種方法因成本過高而無法實現,我們還可以藉助其他辦法來獲取訓練資料,如前所述。注意,調整訓練標註的分配必須要小心,因為這將影響模型預測推斷結果的方式:如果增加訓練資料集的病人數量,模型預測患病的頻率也會更高。
收集稀有類別的更多資料。當訓練期間的標註分配與推斷結果不匹配時要當心。
2.更改標註
如果無法獲得稀有類別的更多資料,另一種方法是重新考慮分類方法。在實際應用中,可能並不需要區分疾病A與疾病B,只要能識別出是這兩者一就夠了。這樣的話,你就可以合併這兩個類別。這在訓練期間能夠簡化程式,即便搞混疾病A和疾病B,也不會懲罰推斷結果。
在訓練獲評價期間合併兩個或更多類別能夠簡化問題
3.取樣
如果既無法獲得更多資料也不能更改標註,那你就必須從原始資料下手了。如何能使該模型特別善於處理稀有類別?你只需要改變演算法在訓練過程中觀察樣本的方式。通常,樣本的取樣十分均勻。這就意味著訓練過程中演算法對每個樣本的觀察頻率是相同的。
以下是幾種不同的取樣方法,可有助於改進模型對某些稀有類別的標註能力。
忽略
忽略常見類別的部分樣本可能是最簡單的方法。當每個類別的樣本數大體相近時,可使用這種方法。
過度取樣或欠取樣
過度取樣是指演算法學習稀有類別樣本的頻率較高,而欠取樣則是相反的情況。從演算法角度看,這兩種方法產生的都是相同的結果。相比前一種方法,這種方法的優勢是不忽略任何樣本。
消極取樣
第三種取樣方法有些複雜,但也最為有效。既不過度取樣也非欠取樣,我們有目的地選擇樣本。雖說常見類別的樣本數更多,但我們最關心的還是最困難的那些樣本,比如最有可能被錯誤分類的樣本。這樣,我們就可以在訓練期間定期評價模型並研究樣本,以識別出那些最有可能被錯誤分類的樣本。這讓我們可以明智地選出演算法更常學習的樣本。
4.給損失加權
通過應用這部分所闡述的1–3類方法,我們從資料角度考慮了能夠改善類別分配的所有可能。因而,我們現在就可以把注意力轉移到演算法本身。幸運的是,通過一些方法,我們可以在訓練期間讓演算法的注意力更多關注那些稀有的類別。一個非常直接的辦法,是增加稀有類別樣本的損失權重。
稀有類別的損失權重更大
心得 III:理解黑箱模型
黑箱模型(來源:《辛普森一家》)
正如前文對預訓練的描述,學術研究最重要的目的是達到或超越當前最先進的效能,無論採用哪種模型。但處理現實問題時,僅僅去設計效能最好的模型往往是不夠的。
相反,更重要的是,能做到以下幾點:
能夠理解模型為什麼以及如何會作出錯誤的預測;
能直觀解釋為什麼當前模型的效能會比先前的更好;
確保模型不被欺騙。
在深度神經網路出現前,大多數模型解釋起來都較為容易。舉例來說:
線性模型:線性模型或迴歸模型可以給出各特徵和預測之間的直接關係,這使該模型的決策機制解釋起來較為直白。
決策樹:決策樹的魅力在於,只要順著邏輯樹就能理解決策的形成過程。通常,根節點代表最為重要的特徵。雖說隨機決策樹解釋起來更為困難,但樹形結構總體還是相對易懂的。
不幸的是,深度神經網路的決策機制就很難理解了。它們是高度非線性的,引數的數量輕輕鬆鬆就能上億。讓人很難用簡單的方式能解釋清深度神經網路的決策細節。
對比圖:經典機器學習 vs. 深度學習
隨著深度學習迅速進入我們生活的方方面面——自動駕駛、醫學診斷、制定金融決策等,如何解釋這個黑箱就成為實際應用中一個很重要的挑戰。大部分應用的直接成果能顯著影響我們生命、財產與敏感資訊。因此,演算法的錯誤決策往往會傷財害命。
特斯拉汽車交通事故與一篇關於AI種族歧視的文章
不幸的是,這些失敗可能並不僅僅是因為意外事故,還能由襲擊者引發。為證實其中的相關性,研究者發現,只需在普通影象中新增簡單的隨機噪點,就能改變深度神經網路的分類結果,但人眼卻並未看出影象的變化。同樣,使用完全由人工生成的影象,深度神經網路仍能給出非常自信的預測結果。
在影象中加入少許隨機噪點(左)或使用完全由人工生成的影象(右)都可以輕鬆騙過神經網路。
通常在現實中,你就想去弄清楚,為什麼系統會無法作出它本應該作出的行為。
在Merantix,我們在非常嚴肅地對待這些問題,並相信它們在未來會變得更加重要,因為越來越多的深度神經網路肯定會被用在至關重要的實際應用上。
最近,我們開源了一個名為Picasso深度學習視覺化工具。由於經常要跟各種神經網路架構打交道,我們開發Picasso的目的,就是為了讓人能夠更容易看到我們所有模型的視覺效果,因為這些模型早已被整合進我們的汽車產品——當遇到道路分叉或目標檢測失敗時能夠解釋具體的原因,廣告產品——可以解釋為什麼某些創意能獲得更高的點選率,醫學成像產品——用以分析CT或X光照片的哪些區域出現異常。
https://medium.com/merantix/picasso-a-free-open-source-visualizer-for-cnns-d8ed3a35cfc5
https://github.com/merantix/picasso
下圖是開源視覺化工具Picasso的一個預覽
Picasso 視覺化工具預覽
總結
我在本文中分享了Merantix應用深度學習解決實際問題過程中的三項很重要的心得。我希望這些想法能為那些打算在實際業務中使用深度學習的人帶來幫助。
正如本文開篇所描述的,用深度學習處理現實問題時,除了相關的技術和資料,你還需要很多其他的技巧、訣竅與心得(級聯模型、智慧增強、合理的評價標準、建立可重用的訓練管道、有效推斷與減小模型大小,等等)。
原文連結
https://medium.com/merantix/applying-deep-learning-to-real-world-problems-ba2d86ac5837