鏈接:https://www.zhihu.com/question/57523080/answer/236301363
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
今天我給大家介紹一下 CVPR 2017 關於醫學圖像處理的一篇比較有意思的文章,用的是 active learning 和 incremental learning 的方法。
今天分享的主要內容是,首先介紹一下這篇文章的 motivation,就是他為什么要做這個工作;然后介紹一下他是怎么去做的,以及在兩種數據集上的應用;最后做一下簡單的總結,說一下它的特點以及還有哪些需要改進的地方。
其實在機器學習,特別是深度學習方面,有一個很重要的前提是需要有足夠量的標注數據。但是這種標注數據一般是需要人工去標注,有時候標注的成本還是挺高的,特別是在醫學圖像處理上面。因為醫學圖像處理需要一些 domain knowledge,就是說醫生對這些病比較熟悉他才能標,我們一般人是很難標的。不像在自然圖像上面,比如ImageNet上面的圖片,就是一些人臉、場景還有實物,我們每個人都可以去標,這種成本低一點。醫學圖像的成本就會比較高,比如我右邊舉的例子,醫學圖像常見的兩種方式就是X光和CT。X光其實一個人一般拍出來一張,標注成本大概在20到30塊錢人民幣一張;CT是橫斷面,拍完一個人大概有幾百張圖片,標注完的成本就會高一點,標注的時間也會比較長。
舉個例子,比如標1000張,這個數據對 deep learning 來說數據量不算太大,X光需要2到3萬人民幣、3到4天才能標完;CT成本就會更長,而且時間成本也是一個很重要的問題。那要怎么解決深度學習在醫學方面、特別是醫學圖像方面的這個難題呢?就要用盡量少的標注數據去訓練一個 promising 的分類器,就是說一個比較好的分類器。
那我們就要考慮要多少訓練數據才夠訓練一個 promising 的分類器呢?這里有個例子,比如左邊這個圖,這個模型的 performance 隨着數據的增加是一個線性增長的過程,就是說數據越多,它的 performance 就越高。但在實際中,這種情況很少出現,一般情況下都是數據量達到一定程度,它的 performance就會達到一個瓶頸,就不會隨着訓練數據的增加而增加了。但是我們有時候想的是把這個臨界點提前一點,讓它發生在更小數據量的時候。比如右邊這個圖的紅色虛線部分,用更小的數據達到了相同的 performance。這篇論文里就是介紹主動學習 active learning 的手段,找到一個小數據集達到大數據集一樣的效果。
怎么樣通過 active learning 的方式降低剛才右圖里的臨界點呢?就是要主動學習那些比較難的、容易分錯的、信息量大的樣本,然后把這樣的樣本標記起來。因為這些是比較難分的,容易分的可能幾個樣本就訓練出來了,難分的就需要大量的數據,模型才能學出來。所以模型要先去學這些難的。
怎么去定義這個“難”呢?就是“難的”、“容易分錯”、“信息量大”,其實說的是一個意思。這個“信息量大”用兩個指標去衡量,entropy大和diversity高。entropy就是信息學中的“熵”,diversity就是多樣性。這個數據里的多樣性就代表了模型學出來的東西具有比較高的泛化能力。舉個例子,對於二分類問題,如果預測值是在0.5附近,就說明entropy比較高,因為模型比較難分出來它是哪一類的,所以給了它一個0.5的概率。
用 active learning 去找那些比較難的樣本去學習有這5個步驟
- 首先,把所有的未標注圖片數據在大量自然圖像中訓練的網絡,大家知道現在有很多常用的網絡,從最初的LeNet、AlexNet、GoogLeNet、VGG、ResNet這樣的網絡中去測試一遍,得到預測值。 然后挑出來那些最難的、信息量大的樣本去標注
- 用這些剛剛標注了的樣本去訓練深度學習網絡,得到一個網絡N
- 把剩下沒有標簽的圖像用N過一遍,得到預測值,挑一遍那些最難的,用人工去給它標注
- 把剛剛標注了的樣本和原來已經標好的樣本一起,也就是整個標注集拿來繼續訓練這個網絡
- 重復3到4這個步驟,直到當前的分類器可以對選出來的比較難的圖像很好的分類了。
剛才的文字講解可能不是很直觀,我們用一個圖來看一下。這個圖從左到右看,一開始灰蒙蒙的意思是都還沒有標注,然后用一個pre-trained model去預測一遍都是哪個類。這樣每個數據上都有一個概率,可以根據這個概率去選擇它是不是難分的那個數據,就得到了中間這個圖,上面那一段是比較難的,然后我們把它標注出來。然后用一個 continuous fine-tune 的 CNN,就是在原來的模型上再做一次 fine-tune,因為有了一些標注數據了嘛,就可以繼續 fine-tune了。 fine-tune后的模型對未標注的數據又有了一個預測的值,再根據這些預測值與找哪些是難標的,把它們標上。然后把這些標注的數據和之前就標注好的數據一起,再做一次 continuous fine-tune,就得到 CNN2了。然后依次類推,直到把所有的數據都標完了,或者是在沒有標完的時候模型的效果就已經很好了,因為把其中難的數據都已經標完了。
剛才提到了兩個指標來判定一個數據是不是難分的數據。entropy比較直觀,預測結果在0.5左右就認為它是比較難分的;但diversity這個值不是很好刻畫,就通過 data augmentation數據增強的方式來設計指標,就是說從一個圖像設計出一系列它的變形。這些變形就可以是靠翻轉、旋轉、平移操作等等,一個變成了好幾個甚至十幾個,增加了它的多樣性。然后對這些所有的變形去預測它們的分類結果,如果結果不統一的話,就說明這副圖像的diversity比較強,那么這張圖像就是比較難分的,是hard sample;反之就是比較好分的,那么就不去做它的增強了。然后對所有增強以后的數據的預測值應當是一致的,因為它們代表的是同一個東西,但是也有一些例外,如果是像我剛才說的那樣的簡單的數據增強。
這就會產生一個問題,原始的圖像,比如左邊這只小貓,經過平移、旋轉、縮放等一些操作以后得到9張圖,每張圖都是它的變形。然后我們用CNN對這9張圖求是一只貓的概率,可以看到上面三個圖的概率比較低,就是判斷不出來是一只貓,我們直觀的去看,像老鼠、狗、兔子都有可能。本來這是一個簡單的例子,很容易識別出來這是一只貓,但是增強了以后反而讓模型不確定了。這種情況是需要避免的。
所以這種時候做一個 majority selection,就是一個少數服從多數的方式,因為多數都識別出來它是一只貓了。這就是看它的傾向性,用里面的6個預測值為0.9的數據,上面三個預測值為0.1的就不作為增強后的結果了。這樣網絡預測的大方向就是統一的了。
這篇文章的創新點除了active learning之外,它在學習的時候也不是從batch開始,而是sequential learning。它在開始的時候效果就不會特別好,因為完全沒有標注數據,它是從一個ImageNet數據庫訓練出的模型直接拿到medical的應用里來預測,效果應該不會太好。然后隨着標注數據的增加,active learning的效果就會慢慢體現出來。這里是在每一次fine-tune的時候,都是在當前的模型基礎上的進一步fine-tune,而不是都從原始的pre-train的model做fine-tune,這樣就對上一次的模型參數有一點記憶性,是連續的學習。這種思路就跟學術上常見的sequntial learning和online learning是類似的。但是有一個缺點就是,fine-tune的參數不太好控制,有一些超參數,比如learning rate還有一些其它的,其實是需要隨着模型的變化而變化的,而且比較容易一開始就掉入local minimal,因為一開始的時候標注數據不是很多,模型有可能學到一個不好的結果。那么這就是一個open的問題,可以從好幾個方面去解決,不過解決方法這篇文章中並沒有提。
這個方法在機器學習方面是比較通用的,就是找那些難分的數據去做sequntial的fine-tune。這篇論文里主要是用在了醫學圖像上面,用兩個例子實驗了結果,一個是結腸鏡的視頻幀分類,看看有沒有病變、瘤之類的。結論是只用了5%的樣本就達到了最好的效果,因為其實因為是連續的視頻幀,通常都是差不多的,前后的幀都是類似的,不需要每一幀都去標注。另一個例子也是類似的,肺栓塞檢測,檢測+分類的問題,只用1000個樣本就可以做到用2200個隨機樣本一樣的效果。
這個作者我也了解一些,他是在 ASU 的PhD學生,然后現在在梅奧,美國一個非常著名的私立醫院梅奧醫院做實習,就跟需要做標注的醫生打交道比較多。這相當於就是一個從現實需求得出來的一個研究課題。
總結下來,這篇文章有幾個比較好的亮點。
- 從標注數據來說,從一個完全未標注的數據集開始,剛開始的時候不需要標注數據,最終以比較少量的數據達到很好的效果;
- 然后,從sequntial fine-tune的方式,而不是重新訓練;
- 選擇樣本的時候,是通過候選樣本的一致性,選擇有哪些樣本是值得標注的;
- 自動處理噪音,就是剛才舉的貓的那個例子,數據增強的時候帶來的噪音,通過少數服從多數的方式把那些噪音去掉了;
- 在每個候選集只選少量的patches計算熵和KL距離,KL距離就是描述diversity的指標,這樣減少了計算量。傳統的深度學習的時候會需要在訓練之前就做數據增強,每個樣本都是同等的;這篇文章里面有一些數據增強不僅沒有起到好的作用,反而帶來了噪音,就需要做一些處理;而且還有一些數據根本不需要增強,這樣就減少了噪音,而且節省了計算。
Q&A
Q:為什么開始的時候 active learning 沒有比random selection好?
A:其實不一定,有時候是沒有辦法保證誰好。active learning在一開始的時候是沒有標注數據的,相當於這時候它不知道哪些數據是hard的,在這個醫學數據集上並沒有受到過訓練。這時候跟 random selection 就一樣了,正在遷移原來 ImageNet 圖像的學習效果。random selection 則有可能直接選出來 hard的那些結果,所以有可能比剛開始的active selecting要好一點,但這不是每次都是 random selection 好。就是不能保證到底是哪一個更好。
