Active Learning: 一個降低深度學習時間,空間,經濟成本的解決方案

大資料文摘發表於2017-09-18

Active Learning: 一個降低深度學習時間,空間,經濟成本的解決方案


在深度學習研究應用中,有這樣兩個常見的場景:

  • 一共手頭有100個未標記樣本,和僅僅夠標記10個樣本的錢,老闆說,通過訓練這十個標記的樣本,能接近甚至達到訓練100個樣本的performance;
  • 手頭有了一個已經在100個樣本中訓練完的分類器,現在又來了100個新標記的樣本,老闆說,只給提供夠訓練10個樣本的計算機;或者只給你提供夠訓練10個樣本的時間,讓分類器儘快學習到新來樣本的特徵;


這兩個情況發生的條件是完全不同的。


Situation A發生在屌絲公司,沒有錢拿到精標記的資料集,卻也想做深度學習;

Situation B一般發生在高富帥公司,有海量的精標記資料,但是由於目前即使是最牛逼的計算機也不能用深度學習在短時間內一次性地去處理完這些資料(e.g.,記憶體溢位,或者算上個幾年都算不完)。

根據我的判斷,當遇到兩種情況的時候,這篇論文的可以非常強大的指導意義:它發表於CVPR2017(http://cvpr2017.thecvf.com),題為“Fine-tuning Convolutional Neural Networks for Biomedical Image Analysis: Actively and Incrementally”。它主要解決了一個深度學習中的重要問題:如何使用盡可能少的標籤資料來訓練一個效果promising的分類器。


Active Learning: 一個降低深度學習時間,空間,經濟成本的解決方案


感謝你選擇繼續往下閱讀,那麼如果覺得下文所傳遞的思想和方法對你有幫助,請記得一定引用這篇CVPR2017的文章。Fine-tuning Convolutional Neural Networks for Biomedical Image Analysis: Actively and Incrementally.


(下載:http://openaccess.thecvf.com/content_cvpr_2017/papers/Zhou_Fine-Tuning_Convolutional_Neural_CVPR_2017_paper.pdf)


@InProceedings{Zhou_2017_CVPR,author = {Zhou, Zongwei and Shin, Jae and Zhang, Lei and Gurudu, Suryakanth and Gotway, Michael and Liang, Jianming},title = {Fine-Tuning Convolutional Neural Networks for Biomedical Image Analysis: Actively and Incrementally},booktitle = {The IEEE Conference on Computer Vision and Pattern Recognition (CVPR)},month = {July},year = {2017}}


1. 為什麼會想到去解決這個問題?


現在深度學習很火,做的人也越來越多,那麼它的門檻可以說是很低的,Caffe,Keras,Torch等等框架的出現,讓該領域的programming的門檻直接拆了。所以深度學習真正的門檻變成了很簡單概念——錢。這個錢有兩個很重要的流向,一是計算機的運算能力(GPU Power),二是標記資料的數量。這兒就引出一個很重要的問題:是不是訓練資料集越多,深度學習的效果會越好呢?這個答案憑空想是想不出來的,能回答的人一定是已經擁有了海量的資料,如ImageNet,Place等等,他們可以做一系列的實驗來回答這個問題。需要呈現的結果很簡單,橫座標是訓練集的樣本數,縱座標是分類的performance,如下圖所示:


Active Learning: 一個降低深度學習時間,空間,經濟成本的解決方案


Fig.1 如果答案是左圖,那麼就沒什麼可以說的了,去想辦法弄到儘可能多的訓練資料集就ok,但是現實結果是右圖的紅實線,一開始,訓練集的樣本數增加,分類器的效能快速地在上升,當訓練集的樣本數達到某一個臨界值的時候,就基本不變了,也就是說,當達到了這個臨界的數目時,再去標註資料的ground truth就是在浪費時間和金錢。有了這個認知,接下來就是想辦法讓這個臨界值變小,也就是用更小的訓練集來更快地達到最理想的效能,如右圖的紅虛線所示。紅實線我們認為是在隨機地增加訓練集,那麼紅虛線就是用主動學習(Active Learning)的手段來增加訓練集,從而找到一個更小的子集來達到最理想的效能。

這裡需要說明的一點是,訓練樣本數的臨界點大小和這個分類問題的難度有關,如果這個分類問題非常簡單,如黑白影象分類(白色的是1,黑色的是0),那麼這個臨界值就特別小,往往幾幅圖就可以訓練一個精度很高的分類器;如果分類問題很複雜,如判斷一個腫瘤的良惡性(良性是0,惡性是1),那麼這個臨界值會很大,因為腫瘤的形狀,大小,位置各異,分類器需要學習很多很多的樣本,才能達到一個比較穩定的效能。


FIG.1對於很多從事深度學習的無論是研究員還是企業家都是一個十分有啟發性的認知改變。一般來講,人的慣性思維會引領一個預設的思路,就是訓練樣本越多越好,如左圖所示,這將直接導致許多工作的停滯不前,理由永遠是“我們沒有足夠的資料,怎麼訓練網路!”進一步的思路是圖二的紅實線認知:要多少是多啊,先訓著再說,慢慢的就會發現即便用自己有的一小部分資料集好像也能達到一個不錯的分類效能,這個時候就遇到一個問題:自己的資料集樣本數到底有沒有到達臨界值呢?這個問題也很關鍵,它決定了要不要繼續花錢去找人標註資料了。這個問題我會在第三部分去回答它,這裡先假設我們知道了它的答案,接下來的問題就是如何讓這個臨界值變小?


2. 如何讓臨界值變小?


解決方案就是主動學習(Active Learning),去主動學習那些比較“難的”,“資訊量大的”樣本(hard mining)。關鍵點是每次都挑當前分類器分類效果不理想的那些樣本(hard sample)給它訓練,假設是訓練這部分hard sample對於提升分類器效果最有效而快速。問題是在不知道真正標籤的情況下怎麼去定義HARD sample?或者說怎麼去描述當前分類器對於不同樣本的分類結果的好壞?


定義:由於深度學習的輸出是屬於某一類的概率(0~1),一個很直觀的方法就是用“熵(entropy)”來刻畫資訊量,把那些預測值模稜兩可的樣本挑出來,對於二分類問題,就是預測值越靠近0.5,它們的資訊量越大。還有一個比較直觀的方法是用“多樣性(diversity)”來刻畫labeled data和unlabeled data的相似性。這兩個方法都是在“Active batch selection via convex relaxations with guaranteed solution bounds”(http://ieeexplore.ieee.org/abstract/document/7006697/)中被提出。是十分重要的兩個Active Learning的選擇指標。


Important Observation: To boost the performance of CNNs in biomedical imaging, multiple patches are usually generated automatically for each candidate through data augmentation; these patches generated from the same candidate share the same label, and are naturally expected to have similar predictions by the current CNN before they are expanded into the training dataset.


有了這兩個指標來選hard sample,是比較靠譜了——實驗結果表明,這比隨機去選已經能更快地達到臨界拐點了。


Active Learning: 一個降低深度學習時間,空間,經濟成本的解決方案


FIG.2 Active Learning的結構示意圖。利用深度學習所帶來的優勢在於,一開始你可以不需要有標記的資料集。


舉例來講,假設你是一個養狗的大戶,你現在想做一個非常偏的(專業化的)分類問題,如捲毛比雄犬和哈瓦那犬的分類問題,你手頭有這兩種狗各50條,你自己可以很輕鬆地區分這100條狗,現在需要做的是訓練一個分類器,給那些不懂狗的人,他們拍了狗的照片然後把照片輸入到這個分類器就可以很好地判斷這是捲毛比雄犬還是哈瓦那犬。首先你可以給這100條狗拍照片,每條狗都有不同形態的10張照片,一共拍了1000張沒有標記的照片。對於這1000張照片,你所知道的是哪10張對應的是一條狗,其他什麼都不知道。


在這個實際分類問題中,你擁有絕對的資料優勢,即便是Google Image也不能企及,當然一種選擇是你把1000張圖片從頭到尾看一遍,標註好,但是你更希望是把大多數簡單的分類工作交給分類器,自己儘可能少的做標記工作,並且主要是去標記那些分類器模稜兩可的那幾張照片來提高分類器的效能。我們初步提供的解決方案是(參考Fig.2或者Fig.3):


  • 把1000張圖放到在大量自然影象中預訓練的網路(LeNet,AlexNet,GoogLeNet,VGG,ResNet等等)中測試一遍,得到預測值,然後挑出來那些“最難的”,“資訊量最大的”樣本,你看一下,給出他們的標籤(捲毛比雄犬還是哈瓦那犬);
  • 用這些剛剛給了標籤的樣本訓練深度網路N;
  • 把剩下那些沒有標籤的影象用N測試,得到預測值,還是挑出來那些“最難的”,“資訊量最大的”樣本,你再給出他們的標籤(捲毛比雄犬還是哈瓦那犬);
  • 剛剛給了標籤的樣本和原來有標籤的樣本組成新的訓練集,繼續用它們來訓練深度網路N;
  • 重複步驟3,4,直到 [?]

如FIG.2所示,每次迴圈都用不斷增加的標記資料集去提升分類器的效能,每次都挑對當前分類器比較難的樣本來人為標記。


3. 這個過程什麼時候可以停?

  • 錢用光了;
  • 當前分類器對選出來的hard samples分類正確;
  • 選出來的hard samples人類也無法標記;

以上三種情況都可以讓這個迴圈訓練過程中斷,第一種就很無奈了,沒錢找人標記了...第二種情況和第三種情況的前提共識是如果難的樣本都分類正確了,那麼我們認為簡單的樣本肯定也基本上分類正確了,即便不知道標籤。第三種情況,舉例來說就是黑白影象分類,結果分類器模稜兩可的影象是灰的...也就是說事實上的確分不了,並且當前的分類器居然能把分不了的樣本也找出來,這時我們認為這個分類器的效能已經不錯的了,所以迴圈訓練結束。


至此,主要講了傳統的Active Learning的思想,接下來會講講這篇CVPR2017論文的幾個工作點。

 

The way to create something beautiful is often to make subtle tweaks to something that already exists, or to combine existing ideas in a slightly new way.-- "Hackers & Painters"

上面我講到了Active Learning的大概思路,如Fig. 3所示,是一個很有意思的概念,說實話很實用,我在Mayo Clinic實習的時候,每次遇到新的資料集,都會想到用一用這個方法,來讓給資料標註的專家輕鬆一點...


Active Learning: 一個降低深度學習時間,空間,經濟成本的解決方案

Fig.3 暗的表示unlabeled的資料,高亮的表示labeled的資料,CNN的結構可以隨便挑SO他的無所謂,CNN0是拍 retrained from ImageNet,得到的第二列表示每個image對應的importance指標,越紅的說明entropy越大,或者diversity越大,每次挑這些important的sample給專家標註,這樣labeled的資料就變多了,用labeled的資料訓練CNN,得到新的更強的分類器了,再在unlabeled data上測試,挑出entropy/diversity大的樣本,交給專家去標註,如此迴圈...


4. 發現新問題


貌似前面講的演算法沒留下什麼問題啊,也就是說,只要學術視野夠開闊,這個Active Learning的技術完全可以直接用啦。但是實際上並不是這樣的,上面說的熵(Entropy)的確沒有什麼嚴重的問題,但是多樣性(Diversity),在很多現實應用中問題就會出現。


根據“Active batch selection via convex relaxations with guaranteed solution bounds”的描述,Diversity是計算labeled data和unlabeled data之間的相似度,把和labeled data比較相似的作為簡單樣本,每次active select難樣本,也就是挑出來和labeled data不太像的出來。體現在矩陣上就是行是labeled data,列是unlabeled data,在它們組成的大矩陣中找出最優的子矩陣。這個方法在理論上是可行的,但是實際應用中,資料量(labeled和unlabeled)會非常大,這個矩陣會特別的大,導致求最優解會很慢,或者根本得不出來最優解。因此,我們並不在image-level上算diversity。


由於標記的醫學影像訓練資料量和自然影象的沒法比,Data Augmentation是必須的環節,我們就抓住了這個點來設計Diversity這個指標。這裡的假設是:經過data augmentation後的patches,從CNN出來的預測值應該相對是一致的,因為它們的truth應該還是一致的。比如一張貓的影象,經過資料擴充,得到的那些個patch所對應的truth也應該都是貓。


定義:對於來自同一幅image的patch集,如果它們的分類結果高度不統一了,那麼這個image就是Important的,或者hard sample。


需要展開解釋的兩點:

  • 由於在annotation之前不知道label,所以我們不能知道網路的預測正確還是錯誤,但是我們可以知道預測統一還是不統一。所以比如一幅貓的圖,如果網路的預測很統一都是狗,那麼我們也認為這是一個easy sample,不去active select它的。
  • 結合data augmentation的優點是我們可以知道哪些patch對應什麼image,比較容易控制。這樣就可以在一個image內算diversity了,每個image對應一個矩陣,大小是一樣的,非常的簡潔,也容易控制計算量。

這樣的diversity就完美了嗎?並沒有... 讀者可以先猜猜哪兒又出問題啦,我在第五部分會指出來。

Active Learning: 一個降低深度學習時間,空間,經濟成本的解決方案


5. 這次是Data Augmentation的鍋


問題出在上面的假設:經過data augmentation後的patches,從CNN出來的預測值應該相對是一致的,因為它們的truth應該還是一致的。


我們知道有幾種經典的資料擴充方法:平移,旋轉,縮放,形變,加噪聲等等。但是很有可能發生的是,經過這些變化以後,得到的patch是無法分類的。舉例來講,Augmentation Lecture講到的平移crop,如果我們將它應用到貓的分類問題中,很有可能得到這樣的訓練樣本:

Active Learning: 一個降低深度學習時間,空間,經濟成本的解決方案

Fig.4 左圖是原始的影象,中間的9個patches是根據平移變化的擴充得到的,restrictions: region must contain objects or part of the object 詳見(http://imatge-upc.github.io/telecombcn-2016-dlcv/slides/D2L2-augmentation.pdf),右圖是網路得到的對應patch的預測值。


可以看出,在這個例項中,對於一個candidate,網路預測的一致性很低,套用Diversity的公式,Diversity的值很大,也就是說,應該被認為是hard sample挑出來。但是仔細觀察一下這九個patches就不難看出,即便是很好的分類器,對於中間圖中的1,2,3,也是很難分出這個是貓... could be rat, rabbit, etc. 我們把像這三個patch的例子叫做從data augmentation帶來的noisy label issue。 而對於4~6的patches,網路很好地做出了分類,這很合情合理。所以我們把這種像1,2,3的patches,由於隨機的資料擴充(Random Data Augmentation)帶來的干擾樣本稱為noisy labels。Fig.4只是一個很直觀的例子,其實在實際的資料集中會有很多這樣的案例。


我們給出的解決方法是:先計算majority的預測,然後在majority上面算diversity,只要網路的預測大方向是統一的,就是統一的。意思就是想個辦法把Fig.4中的三個非主流0.1扔掉。只抓住大方向,也就是0.9——我們不希望Fig.4這種情況被當作important sample挑出來,因為當前的分類器實際上已經可以分出來這幅圖的類別啦。


這個改進的數學表達也非常直觀,以Fig.4為例,為了知道大方向,我們計算它們的平均值,如果大於0.5,大方向就是label 1,反之大方向是label 0,如果是前者,那麼就從大到小取前25%的預測,其他的不要啦,如果是後者,就從小到大取前25%,其他的不要啦。這樣Fig.4就只剩下三個0.9,它們的diversity就非常小,也就不會被當作important sample挑出來啦。成功解決了data augmentation帶來的noisy label issue。


整體的演算法流程可參見Fig.5


Active Learning: 一個降低深度學習時間,空間,經濟成本的解決方案

Fig.5 Active Learning Algorithm

至此,主要講了這篇論文是怎樣成功的將Diversity這個重要的指標引入到Active Learning中來,所有的Active Selection部分結束。 


6. 如何訓練?


既然用了遷移學習,那麼一開始的CNN測試的效果肯定是一團糟,因為這個CNN是從自然影象中學過來的,沒有學習過CT這種醫學影像,所以這個loop的啟動階段,Active Learning的效果會沒有random selecting好。不過很快,隨著CNN慢慢地在labeled的CT上訓練,Active Learning的效果會一下子超過random selecting。


接下來討論Continuous fine-tuning的細節,隨著labeled data集變大,CNN需要一次次地被訓練,有兩種選擇,一是每次都從ImageNet pretrained來的model來遷移,二是每次用當前的model上面遷移(Continuous Fine-tuning)。方法一的優點是模型的引數比較好控制,因為每次都是從頭開始fine-tuning,但是缺點是隨著labeled資料量大增加,GPU的消耗很大,相當於每次有新的標註資料來的時候,就把原來的model扔了不管,在實際應用中的代價還是很大的。第二種方法是從當前的model基礎上做finetune,在某種意義上knowledge是有記憶的,而且是連續漸進式的學習。問題在於引數不好控制,例如learning rate,需要適當的減小,而且比較容易在一開始掉入local minimum。關於Continuous Finetuning的前期論文也是有的,需要更進一步的研究。


另外,如何能夠真正意義上去體現出increamentally learning,只是這樣一個網路結構去不斷的學習嗎,還是隨著資料集的增加去讓網路自適應的變深,便複雜,都是我比較關心的問題。

乍一看,Active Learning的工具很直觀,思想也很簡潔,但隨著部落格討論的技術細節越來越深入,會出現很多的open question有待研究,因此,只能說我們的論文是active learning的一個引子。


本文只是從思想的角度來闡述這篇論文,至於後續的分析,結果和結論都在論文中詳細的report了。反正一句話來總結,hin好...

  • Find paper here. (http://openaccess.thecvf.com/content_cvpr_2017/papers/Zhou_Fine-Tuning_Convolutional_Neural_CVPR_2017_paper.pdf)
  • Find poster here. (https://docs.wixstatic.com/ugd/deaea1_c21a4361487244efba9da9d84feddc72.pdf)
  • Find author here.  (http://weibo.com/ZongweiZhou)

祝好!


本文系作者投稿作品

作者 | Zongwei Zhou(周縱葦)



相關文章