作者:Zongwei Zhou | 周縱葦
郵箱:zongweiz@asu.edu
微博:@MrGiovanni

下面要介紹的工作發(fā)表于CVPR2017,題為“Fine-tuning Convolutional Neural Networks for Biomedical Image Analysis: Actively and Incrementally”。它主要解決了一個深度學習中的重要問題:如何使用盡可能少的標簽數(shù)據(jù)來訓(xùn)練一個效果promising的分類器。根據(jù)我的判斷,當遇到兩種情況的時候,這篇論文的可以非常強大的指導(dǎo)意義:
- 一共手頭有100個未標記樣本,和僅僅夠標記10個樣本的錢,老板說,通過訓(xùn)練這十個標記的樣本,能接近甚至達到訓(xùn)練100個樣本的performance;
- 手頭有了一個已經(jīng)在100個樣本中訓(xùn)練完的分類器,現(xiàn)在又來了100個新標記的樣本,老板說,只給提供夠訓(xùn)練10個樣本的計算機;或者只給你提供夠訓(xùn)練10個樣本的時間,讓分類器盡快學習到新來樣本的特征;
這兩個情況發(fā)生的條件是完全不同的,Situation A發(fā)生在屌絲公司,沒有錢拿到精標記的數(shù)據(jù)集,卻也想做深度學習;Situation B一般發(fā)生在高富帥公司,有海量的精標記數(shù)據(jù),但是由于目前即使是最牛逼的計算機也不能用深度學習在短時間內(nèi)一次性地去處理完這些數(shù)據(jù)(e.g.,內(nèi)存溢出,或者算上個幾年都算不完)。Anyway,我想我已經(jīng)說清楚應(yīng)用背景了,讀者可以根據(jù)實際情況判斷是否往后讀下去。

感謝你選擇繼續(xù)往下閱讀,那么如果覺得下文所傳遞的思想和方法對你有幫助,請記得一定引用這篇CVPR2017的文章。Fine-tuning Convolutional Neural Networks for Biomedical Image Analysis: Actively and Incrementally.
@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. 為什么會想到去解決這個問題?
現(xiàn)在深度學習很火,做的人也越來越多,那么它的門檻可以說是很低的,Caffe,Keras,Torch等等框架的出現(xiàn),讓該領(lǐng)域的programming的門檻直接拆了。所以深度學習真正的門檻變成了很簡單概念——錢。這個錢有兩個很重要的流向,一是計算機的運算能力(GPU Power),二是標記數(shù)據(jù)的數(shù)量。這兒就引出一個很重要的問題:是不是訓(xùn)練數(shù)據(jù)集越多,深度學習的效果會越好呢?這個答案憑空想是想不出來的,能回答的人一定是已經(jīng)擁有了海量的數(shù)據(jù),如ImageNet,Place等等,他們可以做一系列的實驗來回答這個問題。需要呈現(xiàn)的結(jié)果很簡單,橫坐標是訓(xùn)練集的樣本數(shù),縱坐標是分類的performance,如下圖所示:

這里需要說明的一點是,訓(xùn)練樣本數(shù)的臨界點大小和這個分類問題的難度有關(guān),如果這個分類問題非常簡單,如黑白圖像分類(白色的是1,黑色的是0),那么這個臨界值就特別小,往往幾幅圖就可以訓(xùn)練一個精度很高的分類器;如果分類問題很復(fù)雜,如判斷一個腫瘤的良惡性(良性是0,惡性是1),那么這個臨界值會很大,因為腫瘤的形狀,大小,位置各異,分類器需要學習很多很多的樣本,才能達到一個比較穩(wěn)定的性能。
FIG.1對于很多從事深度學習的無論是研究員還是企業(yè)家都是一個十分有啟發(fā)性的認知改變。一般來講,人的慣性思維會引領(lǐng)一個默認的思路,就是訓(xùn)練樣本越多越好,如左圖所示,這將直接導(dǎo)致許多工作的停滯不前,理由永遠是“我們沒有足夠的數(shù)據(jù),怎么訓(xùn)練網(wǎng)絡(luò)!”進一步的思路是圖二的紅實線認知:要多少是多啊,先訓(xùn)著再說,慢慢的就會發(fā)現(xiàn)即便用自己有的一小部分數(shù)據(jù)集好像也能達到一個不錯的分類性能,這個時候就遇到一個問題:自己的數(shù)據(jù)集樣本數(shù)到底有沒有到達臨界值呢?這個問題也很關(guān)鍵,它決定了要不要繼續(xù)花錢去找人標注數(shù)據(jù)了。這個問題我會在第三部分去回答它,這里先假設(shè)我們知道了它的答案,接下來的問題就是如何讓這個臨界值變?。?/strong>
2. 如何讓臨界值變???
解決方案就是主動學習(Active Learning),去主動學習那些比較“難的”,“信息量大的”樣本(hard mining)。關(guān)鍵點是每次都挑當前分類器分類效果不理想的那些樣本(hard sample)給它訓(xùn)練,假設(shè)是訓(xùn)練這部分hard sample對于提升分類器效果最有效而快速。問題是在不知道真正標簽的情況下怎么去定義HARD sample?或者說怎么去描述當前分類器對于不同樣本的分類結(jié)果的好壞?
定義:由于深度學習的輸出是屬于某一類的概率(0~1),一個很直觀的方法就是用“熵(entropy)”來刻畫信息量,把那些預(yù)測值模棱兩可的樣本挑出來,對于二分類問題,就是預(yù)測值越靠近0.5,它們的信息量越大。還有一個比較直觀的方法是用“多樣性(diversity)”來刻畫labeled data和unlabeled data的相似性。這兩個方法都是在“Active batch selection via convex relaxations with guaranteed solution bounds”中被提出。是十分重要的兩個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,是比較靠譜了——實驗結(jié)果表明,這比隨機去選已經(jīng)能更快地達到臨界拐點了。

舉例來講,假設(shè)你是一個養(yǎng)狗的大戶,你現(xiàn)在想做一個非常偏的(專業(yè)化的)分類問題,如卷毛比雄犬和哈瓦那犬的分類問題,你手頭有這兩種狗各50條,你自己可以很輕松地區(qū)分這100條狗,現(xiàn)在需要做的是訓(xùn)練一個分類器,給那些不懂狗的人,他們拍了狗的照片然后把照片輸入到這個分類器就可以很好地判斷這是卷毛比雄犬還是哈瓦那犬。首先你可以給這100條狗拍照片,每條狗都有不同形態(tài)的10張照片,一共拍了1000張沒有標記的照片。對于這1000張照片,你所知道的是哪10張對應(yīng)的是一條狗,其他什么都不知道。
在這個實際分類問題中,你擁有絕對的數(shù)據(jù)優(yōu)勢,即便是Google Image也不能企及,當然一種選擇是你把1000張圖片從頭到尾看一遍,標注好,但是你更希望是把大多數(shù)簡單的分類工作交給分類器,自己盡可能少的做標記工作,并且主要是去標記那些分類器模棱兩可的那幾張照片來提高分類器的性能。
我們初步提供的解決方案是(參考Fig.2或者Fig.3):
- 把1000張圖放到在大量自然圖像中預(yù)訓(xùn)練的網(wǎng)絡(luò)(LeNet,AlexNet,GoogLeNet,VGG,ResNet等等)中測試一遍,得到預(yù)測值,然后挑出來那些“最難的”,“信息量最大的”樣本,你看一下,給出他們的標簽(卷毛比雄犬還是哈瓦那犬);
- 用這些剛剛給了標簽的樣本訓(xùn)練深度網(wǎng)絡(luò)N;
- 把剩下那些沒有標簽的圖像用N測試,得到預(yù)測值,還是挑出來那些“最難的”,“信息量最大的”樣本,你再給出他們的標簽(卷毛比雄犬還是哈瓦那犬);
- 剛剛給了標簽的樣本和原來有標簽的樣本組成新的訓(xùn)練集,繼續(xù)用它們來訓(xùn)練深度網(wǎng)絡(luò)N;
- 重復(fù)步驟3,4,直到 [?]
如FIG.2所示,每次循環(huán)都用不斷增加的標記數(shù)據(jù)集去提升分類器的性能,每次都挑對當前分類器比較難的樣本來人為標記。
3. 這個過程什么時候可以停?
- 錢用光了;
- 當前分類器對選出來的hard samples分類正確;
- 選出來的hard samples人類也無法標記;
以上三種情況都可以讓這個循環(huán)訓(xùn)練過程中斷,第一種就很無奈了,沒錢找人標記了...第二種情況和第三種情況的前提共識是如果難的樣本都分類正確了,那么我們認為簡單的樣本肯定也基本上分類正確了,即便不知道標簽。第三種情況,舉例來說就是黑白圖像分類,結(jié)果分類器模棱兩可的圖像是灰的...也就是說事實上的確分不了,并且當前的分類器居然能把分不了的樣本也找出來,這時我們認為這個分類器的性能已經(jīng)不錯的了,所以循環(huán)訓(xùn)練結(jié)束。
至此,主要講了傳統(tǒng)的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實習的時候,每次遇到新的數(shù)據(jù)集,都會想到用一用這個方法,來讓給數(shù)據(jù)標注的專家輕松一點...

4. 發(fā)現(xiàn)新問題
貌似前面講的算法沒留下什么問題啊,也就是說,只要學術(shù)視野夠開闊,這個Active Learning的技術(shù)完全可以直接用啦。但是實際上并不是這樣的,上面說的熵(Entropy)的確沒有什么嚴重的問題,但是多樣性(Diversity),在很多現(xiàn)實應(yīng)用中問題就會出現(xiàn)。
根據(jù)“Active batch selection via convex relaxations with guaranteed solution bounds”的描述,Diversity是計算labeled data和unlabeled data之間的相似度,把和labeled data比較相似的作為簡單樣本,每次active select難樣本,也就是挑出來和labeled data不太像的出來。體現(xiàn)在矩陣上就是行是labeled data,列是unlabeled data,在它們組成的大矩陣中找出最優(yōu)的子矩陣。這個方法在理論上是可行的,但是實際應(yīng)用中,數(shù)據(jù)量(labeled和unlabeled)會非常大,這個矩陣會特別的大,導(dǎo)致求最優(yōu)解會很慢,或者根本得不出來最優(yōu)解。因此,我們并不在image-level上算diversity。
由于標記的醫(yī)學影像訓(xùn)練數(shù)據(jù)量和自然圖像的沒法比,Data Augmentation是必須的環(huán)節(jié),我們就抓住了這個點來設(shè)計Diversity這個指標。這里的假設(shè)是:經(jīng)過data augmentation后的patches,從CNN出來的預(yù)測值應(yīng)該相對是一致的,因為它們的truth應(yīng)該還是一致的。比如一張貓的圖像,經(jīng)過數(shù)據(jù)擴充,得到的那些個patch所對應(yīng)的truth也應(yīng)該都是貓。
定義:對于來自同一幅image的patch集,如果它們的分類結(jié)果高度不統(tǒng)一了,那么這個image就是Important的,或者hard sample。
需要展開解釋的兩點:
- 由于在annotation之前不知道label,所以我們不能知道網(wǎng)絡(luò)的預(yù)測正確還是錯誤,但是我們可以知道預(yù)測統(tǒng)一還是不統(tǒng)一。所以比如一幅貓的圖,如果網(wǎng)絡(luò)的預(yù)測很統(tǒng)一都是狗,那么我們也認為這是一個easy sample,不去active select它的。
- 結(jié)合data augmentation的優(yōu)點是我們可以知道哪些patch對應(yīng)什么image,比較容易控制。這樣就可以在一個image內(nèi)算diversity了,每個image對應(yīng)一個矩陣,大小是一樣的,非常的簡潔,也容易控制計算量。
這樣的diversity就完美了嗎?并沒有... 讀者可以先猜猜哪兒又出問題啦,我在第五部分會指出來。

5. 這次是Data Augmentation的鍋
問題出在上面的假設(shè):經(jīng)過data augmentation后的patches,從CNN出來的預(yù)測值應(yīng)該相對是一致的,因為它們的truth應(yīng)該還是一致的。
我們知道有幾種經(jīng)典的數(shù)據(jù)擴充方法:平移,旋轉(zhuǎn),縮放,形變,加噪聲等等。但是很有可能發(fā)生的是,經(jīng)過這些變化以后,得到的patch是無法分類的。舉例來講,Augmentation Lecture講到的平移crop,如果我們將它應(yīng)用到貓的分類問題中,很有可能得到這樣的訓(xùn)練樣本:

可以看出,在這個實例中,對于一個candidate,網(wǎng)絡(luò)預(yù)測的一致性很低,套用Diversity的公式,Diversity的值很大,也就是說,應(yīng)該被認為是hard sample挑出來。但是仔細觀察一下這九個patches就不難看出,即便是很好的分類器,對于中間圖中的1,2,3,也是很難分出這個是貓... could be rat, rabbit, etc. 我們把像這三個patch的例子叫做從data augmentation帶來的noisy label issue。 而對于4~6的patches,網(wǎng)絡(luò)很好地做出了分類,這很合情合理。所以我們把這種像1,2,3的patches,由于隨機的數(shù)據(jù)擴充(Random Data Augmentation)帶來的干擾樣本稱為noisy labels。Fig.4只是一個很直觀的例子,其實在實際的數(shù)據(jù)集中會有很多這樣的案例。
我們給出的解決方法是:先計算majority的預(yù)測,然后在majority上面算diversity,只要網(wǎng)絡(luò)的預(yù)測大方向是統(tǒng)一的,就是統(tǒng)一的。意思就是想個辦法把Fig.4中的三個非主流0.1扔掉。只抓住大方向,也就是0.9——我們不希望Fig.4這種情況被當作important sample挑出來,因為當前的分類器實際上已經(jīng)可以分出來這幅圖的類別啦。
這個改進的數(shù)學表達也非常直觀,以Fig.4為例,為了知道大方向,我們計算它們的平均值,如果大于0.5,大方向就是label 1,反之大方向是label 0,如果是前者,那么就從大到小取前25%的預(yù)測,其他的不要啦,如果是后者,就從小到大取前25%,其他的不要啦。這樣Fig.4就只剩下三個0.9,它們的diversity就非常小,也就不會被當作important sample挑出來啦。成功解決了data augmentation帶來的noisy label issue。
整體的算法流程可參見Fig.5

至此,主要講了這篇論文是怎樣成功的將Diversity這個重要的指標引入到Active Learning中來,所有的Active Selection部分結(jié)束。
6. 如何訓(xùn)練?
既然用了遷移學習,那么一開始的CNN測試的效果肯定是一團糟,因為這個CNN是從自然圖像中學過來的,沒有學習過CT這種醫(yī)學影像,所以這個loop的啟動階段,Active Learning的效果會沒有random selecting好。不過很快,隨著CNN慢慢地在labeled的CT上訓(xùn)練,Active Learning的效果會一下子超過random selecting。
接下來討論Continuous fine-tuning的細節(jié),隨著labeled data集變大,CNN需要一次次地被訓(xùn)練,有兩種選擇,一是每次都從ImageNet pretrained來的model來遷移,二是每次用當前的model上面遷移(Continuous Fine-tuning)。方法一的優(yōu)點是模型的參數(shù)比較好控制,因為每次都是從頭開始fine-tuning,但是缺點是隨著labeled數(shù)據(jù)量大增加,GPU的消耗很大,相當于每次有新的標注數(shù)據(jù)來的時候,就把原來的model扔了不管,在實際應(yīng)用中的代價還是很大的。第二種方法是從當前的model基礎(chǔ)上做finetune,在某種意義上knowledge是有記憶的,而且是連續(xù)漸進式的學習。問題在于參數(shù)不好控制,例如learning rate,需要適當?shù)臏p小,而且比較容易在一開始掉入local minimum。關(guān)于Continuous Finetuning的前期論文也是有的,需要更進一步的研究。
另外,如何能夠真正意義上去體現(xiàn)出increamentally learning,只是這樣一個網(wǎng)絡(luò)結(jié)構(gòu)去不斷的學習嗎,還是隨著數(shù)據(jù)集的增加去讓網(wǎng)絡(luò)自適應(yīng)的變深,便復(fù)雜,都是我比較關(guān)心的問題。
乍一看,Active Learning的工具很直觀,思想也很簡潔,但隨著博客討論的技術(shù)細節(jié)越來越深入,會出現(xiàn)很多的open question有待研究,因此,只能說我們的論文是active learning的一個引子。
本文只是從思想的角度來闡述這篇論文,至于后續(xù)的分析,結(jié)果和結(jié)論都在論文中詳細的report了。反正一句話來總結(jié),hin好...
- 論文:http://openaccess.thecvf.com/content_cvpr_2017/papers/Zhou_Fine-Tuning_Convolutional_Neural_CVPR_2017_paper.pdf
- 海報:https://docs.wixstatic.com/ugd/deaea1_c21a4361487244efba9da9d84feddc72.pdf.
- 代碼:https://github.com/MrGiovanni/Active-Learning-CVPR2017
- 周邊應(yīng)用:Integrating Active Learning and Transfer Learning for Carotid Intima-Media Thickness Video Interpretation
- 作者:zongweiz.com
祝好,
