1. 程式人生 > >小樣本學習 few-shot learning

小樣本學習 few-shot learning

 

few-shot learning是什麼

另一篇參考:https://blog.csdn.net/mao_feng/article/details/78939864

小樣本學習

來源:我們人類是具有快速從少量(單)樣本中快速學習能力的,其實在我們學習的過程中,人類的大腦將物件和類別組成有用的資訊將之分類。

首先需要宣告的是,小樣本學習屬於遷移學習。接著,舉個例子詳細闡述。

人類從未見到過“澳大利亞的鴨嘴獸”,給我們一張鴨嘴獸的照片後,人類就認識了!

有的朋友可能會想,為什麼我們人類總是能快速的學習到未知的事物?簡單的說,是因為人類生活中各種知識的積累以及人類天生的思考能力(如:類比能力)。知識的積累意味著我們是存在各種知識的先驗的,天生的思考能力意味著我們擁有強大的類比能力、強大的大腦算力。

以“人類從未見到過“澳大利亞的鴨嘴獸”,給我們一張鴨嘴獸的照片後,人類就認識了!”這句話為例。鴨嘴獸就代表未知的事物(new class),而我們生活中已經見到過的鴨子、狸貓、魚等動物就代表知識的先驗,我們把這種知識的先驗稱為 元知識 (Meta Knowledge),我們大腦的能快速的把從未見過的鴨嘴獸與這些元知識快速的類比(可能還存在一些其他腦力活動,如視覺提取物體的特徵),得出結論:這個長得像鴨子嘴,還能像魚一樣游泳、身形扁扁的新動物就是鴨嘴獸。

這裡有的朋友可能會疑問了,如果你是一個剛學會走路的孩子,什麼都沒見過,是否還存在這種快速的樣本學習能力呢?可以這麼想,人生來都是初始化的,裝備全靠打,IQ 高的元知識積累的就快,IQ 低的元知識積累的就慢。吐舌頭

機器學習目前都是類比人類的智慧來做的,那麼對應我們的機器模型,few-shot learning 又是怎麼樣的呢?

對應我們的機器模型,few-shot learning 的核心任務可以當成識別新的類。例如:我們已經通過些許動物(狗除外)的樣本訓練出來了模型,我們想讓模型識別新的類-----狗。顯然,這就是要把源知識(source)遷移到包含狗的知識領域來(target)。顯然這正是遷移學習的範疇。這時候我們需要識別新的類------狗,比較簡單的解決方案是什麼呢?絕大部分同學會想到,把源模型當做預訓練模型,修改全連線層,進行 fine-tune。需要注意的是:

  1. 源模型是需要大量帶 label 的樣本訓練的,一般的如 Imagenet上預訓練模型
  2. fine-tune 也是需要樣本量的支援的,不然 retrain 全連線層時很容易過擬合。

fine-tune 本質還是依賴深度學習 big data 喂餐的策略,彷彿與我們的小樣本學習背道而馳。

我們來看看真正的 few shot 吧~

為了完成識別新類(狗)的問題,於是需要新來一張標好 label 的樣本(如 :有 label,樣本是田園土狗, 稱作 sample set 或 support set)用來泛化模型,那麼再來 test 樣本時候(如:無 label,樣本是哈士奇,稱作 query set 或者 test set),我們就可以把這個 哈士奇的樣本 label 標出來,達到分類的目的。這種學習叫做 one-shot learning,即單樣本學習。

注意:我這裡舉得例子,各品種狗的 label 都是 dog,不單獨區分細粒度。

同樣的,如果剛才來的是一堆標好 label 的樣本(除了田園土狗,可能還有京巴、吉娃娃、泰迪等做 support set),這種學習叫做 few-shot learning,即小樣本學習,一般 few 不會大於 20。

經過我上邊的介紹,可以對小樣本學習做個定義:

自己的話解釋一下就是: 模型只有少量的有 label 的訓練樣本 S ,S 中包括 N 個樣本,yi 代表各樣本的 label。因為測試樣本集中每個樣本都有一個正確的類別,我們希望,再來新的待分類的測試樣本 x’ 時候,正確預測出 x' 標籤是 y'。

注: 把每個類別 yi 的單個樣本換成 k個樣本就 變成了k-shot learning , few-shot 一般指的是 k 不超過 20。

解決小樣本問題的一種模型(孿生網路)

結構意思就是:輸入兩張圖片到兩個 CNN, 來比較兩種相同類別的概率。具體可檢視 https://sorenbouma.github.io/blog/oneshot/

如下圖簡單理解一下小樣本的訓練方式:

Training(訓練模型)                   Sample Set                  Query Set
Testing(測試模型)                   Support Set                  Test Set (無label) 

訓練和測試過程是相似的,拿 Omniglot 資料集為例。

  • 此資料集可以認為是小樣本學習的一個基準資料集。
  • 它一共包含1623 類手寫體,每一類中包含20 個樣本。其中這 1623 個手寫體類來自 50 個不同地區(或文明)的 alphabets,如:Latin 文明包含 26 個alphabets,Greek 包含 24 個alphabets。
    一般用於訓練的是 964 類(30個地區的字母),用於測試的是 659 類 (20個地區的字母)。

    訓練的目的就是,用 964 個類來訓練模型,識別 659 個新的類。
     
  • 如下圖的 24個 希臘字母,代表 Greek 文明下的 24 個類,每個字母只有 20 個樣本。
     

Training:

  • 每次 iteration 從 964 個類中隨機的選擇 20 個類,從每個類中的 20 個樣本取樣 5 個作為 support set,5 個 作為 query set。(選擇的這個數目可以自行改變)。
    以孿生網路為例,就是 query set 中的圖片不斷的於 support set 的圖片成對組合,訓練模型,確定模型引數。

Testing:

  • 測試過程,對 659 個類中隨機選擇 m 個類,每個類提供 k 個樣本作為 Support Set 來泛化模型。稱為 m-way k-shot。
    以孿生網路為例,在 m 個類中,若 Support Set 每類都為單樣本(即 m 個樣本),送進來的 Query Set ( 同樣的是 m 個類 )不斷的與 Support Set 成對相似度量,若相似,則歸於該類。

關於其他的論文一些方法,如 Prototypical Networks 可以參照該大神部落格

https://blog.csdn.net/mao_feng/article/details/78939864

最後,說明一點是,Omniglot 資料集的 分類 baseline 都在 99%+了,但是對如 miniImageNet 這種資料集上分類效果還是比較差的。博主以後還會繼續關注,該領域的一些論文,及時的整理 最新的 paper。