假設我們有 [公式] 與對應的多分類標籤 [公式] 屬於 [公式] 。即共有 [公式] 個樣本,屬於 [公式] 類。

問題1:一個簡化的假設就是我們有100個數據,每5個屬於1類。在多分類與小樣本的情況下,什麼樣的機器學習可以做到更好的分類呢?

最簡單的就是把每一類單獨拿出來做 1 vs rest,但極端的樣本不平衡(5 vs 95)會很難學到有效的分類規則。

問題的進階版可能是:

  • 問題2:假設每個類別是非平均的,比如第一類有80個樣本,而剩下四類只各有5個樣本。
  • 問題3:假設類之間有一定的關係,比如 [公式] 可能更接近 [公式] (相較於 [公式] ),也就是說類之間並非完全獨立的假設。這種假設可能更適合metric learning,或者把問題轉化為一個回歸問題(如果能度量類別間的相似度的話)

如果用深度學習的話,可能few shot learning或者 meta learning都有用。但對於較小的數據集,有什麼傳統或者創新的非深度學習方法可以來處理這類問題呢?

謝謝


這個就是典型的few shot classification的問題,經常被包裝成玄學的meta learning。

目前市面上效果最好的模型反而是最簡單的模型,簡單來說就是一個pre-trained feature encoder + 一個distance metric就可以直接比較樣本來做分類了。

如果一個類里有多個圖怎麼辦?

1.可以fuse一下同類里不同圖片的feature,作為此類的prototype,然後用distance metric。

2.也可以直接取nearest neighbour

3.也可以和這一類里的每個數據都求一個distance,然後平均一下,作為和這一類的distance。

4.當你每個類的數據都很多的時候,你其實就可以考慮訓練一個classifier了,你可以固定住feature encoder不動,去學習每個類的prototype。 當然,如果每個類數據數量差別太大,可以考慮long tail的問題。

具體來說feature encoder怎麼來呢? 很簡單,把你能有的數據全部用上,訓練一個CNN,然後把fc layer扔掉,你就得到一個feature encoder了。

那distance metric呢? 可以是 歐氏距離 (prototypical network), cosine distance (matching network),還有EMD距離 (DeepEMD)。基於此原理,一個data encoder+ 一個EMD metric 在miniimagenet數據集 1shot5way的task已經可以達到68%+的正確率了,而且是不用額外數據來訓練和測試的結果 (semi-supervised setting or transductive setting),為目前最好的結果。

再補充兩句關於feature encoder的淵源。最開始matching network提出了一種訓練模式,叫做episode learning,就是每次sample一個classification task,比如5張訓練圖片,10張測試圖片,然後去做分類,cross entropy 作為loss來訓練。這樣做的目的就是想通過這種方式學習到那些比較general的feature,希望可以在unseen class上也能用到的feature。但是這種方法顯然很低效,因為每次訓練的圖片太少。後來一眾fancy的meta learning演算法都是基於這種訓練方式來學習,編出了各種美麗的故事。

後來有人發現直接把所有training class拿來訓個分類器,再把fc layer扔了,用來提取feature,效果巨好,吊打各種meta learning演算法。最早期的paper,prototypical network 和matching network就遠比SOA的方法好很多。所以現在最好的訓練方法一般是一個feature pre-training的環節(訓練一個普通分類cnn),再扔掉fc layer,然後用episode training。這個時候episode training的角色就變了,從學習feature變成了調整feature,效率就高很多了。

推薦一個小樣本分類的leaderboard網站:https://few-shot.yyliu.net/miniimagenet.html

更新:

我最近看到了不少 」a baseline for few shot classification「的文章,他們的形式和核心思想都離不開我上面列舉的幾點。小樣本學習本質是prototype的獲得,可以是通過優化學到的,也可以是直接對少數的樣本進行融合得到的。

最近更新了deepemd的開源代碼,效果很好,歡迎使用。 https://git.io/DeepEMD


不同的問題進階版對應不同的問題:

包括但不限於(few-shot classification, low-shot classification, long-tail classification, transfer learning)

市面上最近的工作太多,各種fancy,各種meta,但是經過實驗發現最有效的方法往往不是各種fancy的方法,而是一些經典操作:

問題1:各類都是小樣本,目標分出20類,當成 few-shot classification

解法:選一個類似domain的包含大量數據的數據集(越多越好),train一個feature extractor。在這些小類別上,直接抽feature,之後 可以average成一個class centroid,用來直接跟要測試的圖片比較(non-parametric),或者作為要學習的分類器的initialization(parametric-based),亦或者學一個 metric function來度量。效果是比各種fancy的idea差不到哪裡去。(最近的各種baseline for few-shot classification)

問題2: 類似於long-tail 的問題

解法: 先全部數據拉進來train一遍,然後fix feature extractor,只train head layer, 同時使用resampling策略,或者 cosine normalization做分類器。參考(Decouple/BBN)

問題3:如果考慮類別的relation,這個問題可以從不同的角度去解決了,比如transfer leaning,class relation。

解法:這類方法不是很熟,沒有跑過很多實驗,class relationship可以用最近fancy的GNN來message passing一波。

做了一段時間的few-shot/long-tail之後,發現最大的問題是story和performance之間的矛盾,以及implementation detail的各種坑。


對於較小的數據集,核心idea就是similarity learning (i.e., metric learning) (所以另一個答案也有提到siamese net),而且效果不見得會比各種fancy得meta learning差。詳見吊打一眾 few-shot learning models的ICLR 2019 paper: A CLOSER LOOK AT FEW-SHOT CLASSIFICATION

https://arxiv.org/pdf/1904.04232.pdf?

arxiv.org

一個簡單的cosine distance超越各種baseline,估摸著小數據應該也能用上,而且也避免了meta-learning 難訓練的問題。

祝你順利~


這種情況用siamese network可以嗎?我記得kaggle上之前有一個鯨魚識別的數據集,一千多個類,而且有的類只有十幾個樣本,有的有上千個樣本,但是好像用這個做的還不錯…


其實最好的方式還是學一個好的representation,然後直接linear classifier效果就基本可以吊打很多meta learning方法了。詳看我們最近的一個paper https://arxiv.org/abs/2003.11539


推薦閱讀:
相关文章