論文筆記:Matching Networks for One Shot Learning

今天寫點關於 "one-shot" learning(就是從一個(或極少個)樣本學習而非現在普遍的大量數據集,畢竟,一個小孩能通過一個圖片知道什麼是長頸鹿,而機器卻需要大量的樣本!) 的東西

Matching Networks for One Shot Learning這篇論文是來自谷歌DeepMind的一篇論文,主要在於解決:基於小樣本去學習歸類(或者別的任務),並且這個訓練好的模型不需要經過調整,也可以用在對訓練過程中未出現過的類別進行歸類(這裡可能有些繞,稍後會結合符號定義做詳細的解釋,其實個人覺得這個任務也頗有些「遷移學習」的感覺)。

PS. 本文的大部分內容參考自Andrej Karpathy關於這篇論文的讀文筆記。也許可以看做加了自己的理解和一些補充的筆記翻譯?然後,這篇論文的說話方式有點晦澀難懂,就連Andrej Karpathy也在筆記中多次提到作者的各種地方說的不太清楚,所以本人的理解也難免有錯,希望有意見不一致的地方大家可以多多交流。

PPS. 其實這篇論文是下周要講的paper reading,所以也可以說是對自己的屁屁踢做了個翻譯 []~( ̄▽ ̄)~*,雖然畢設是做對抗樣本,但是平時的一些進度還是要跟著組裡的方向來的。


核心思想:

訓練一個端到端的類似於nearest neighbor的分類器,之所以說類似,是因為雖然整體思想是很相像的,但對於NN而言,樣本是什麼輸入就是什麼,但是在這裡需要對樣本學習一個樣本的表示,把他們編碼一下。

模型結構:

Task:

訓練過程:給定一個有k個樣本的支撐集 S=left{(x_{i},y_{i})
ight}_{i=1}^{k} ,對測試樣本 hat{x} 分類(歸類,因為 hat{x} 的類別是和S中的某個或幾個樣本類別相同的),類別是 C_{S}(hat{x})

定義 S
ightarrow C_{S}(hat{x}) 這一映射為 P(hat{y}|hat{x},S),這裡的P的參數是通過神經網路學習到的,映射方式就是我們最後學到的模型。

因此,在測試過程中:給定一個新的支撐集 S^{} ,我們可以用之前學到的模型對每個測試樣本 hat{x} 得到他們可能的label hat{y}

比如,在訓練時給定一張暹羅貓的圖片和一張柯基的圖片作為S,對於一張新的哈士奇的圖片模型可以將其分類為狗;在測試時拿來一張熊二的圖片和一張兔八哥的圖片,又拿來一張小熊維尼的圖片問機器這個新圖片是屬於哪一類的,機器就會告訴你這個是熊(跟那個熊二是一個類的)

模型演算法:

給定一個測試樣本 hat{x} 計算 hat{y} 的過程和Nearest Neighbors很像:

這裡的a類似attention模型中的核函數,用來度量 hat{x} 和訓練樣本 x_{i} 的匹配度,之後通過 y_{i} 對於測試樣本label的計算就類似以加權求和:

在這裡,公式f定義了如何對測試樣本編碼成向量,公式g定義了如何對訓練樣本編碼。從c()是cos距離用來計算兩者之間的匹配度,之後將他們做了一個softmax歸一化。

對訓練集進行編碼(function g)

g的結構是一個雙向LSTM,這個雙向LSTM的輸入序列是S中的各個樣本 (x_{0},x_{1},x_{2}...)g^{}(x_{i}) 是首先對 x_{i} 輸入到神經網路(如VGG、Inception model)進行的一個編碼。

定義基於支撐集S,對樣本 x_{i} 的編碼為:

這裡:

h_{i}c_{i} 都為LSTM的輸出,不太了解的可以去看一下LSTM的演算法。此外,原文沒有提及如何將無序的參考集樣本排序,但參考作者的另一篇文章文章:Order Matters: Sequence to Sequence for Sets. 發現,這裡將原本無序的支撐集樣本集進行了排序。

有人可能會疑惑為什麼要用LSTM,像LSTM、RNN這種模型都要記住一些東西,可是這些樣本的類別又不同,所以是想要記住什麼?我的理解是將各個類別的樣本作為序列輸入到LSTM中,是為了模型縱觀所有的樣本去自動選擇合適的特徵去度量,例如如果我們的目標是識別人臉,那麼就需要構建一個距離函數去強化合適的特徵(如發色,臉型等);而如果我們的目標是識別姿勢,那麼就需要構建一個捕獲姿勢相似度的距離函數,這裡需要參考一下度量學習(Metric Learning)。

對測試集進行編碼(function f)

f是一個迭代了K步(注意這裡的k是k steps,上文中的k是k個樣本)的 LSTM,並且在對測試集編碼的過程中考慮了所有訓練樣本( g(x_{i}) ),最後f的編碼結果為最後一步LSTM輸出的隱狀態。

*在公式(5)中可能作者有個筆誤:r的下標應該是k而不是k-1。

在LSTM的每一步中,輸入 f^{}(hat{x}) 都是固定的,是對測試樣本自身的一個編碼(參考上文的 g^{} )。在這裡的LSTM相當於不斷地對測試樣本自身進行k次迭代編碼,如果是RNN的話我想可以理解成對自己的輸出進行編碼,拉長了看就是個neural network,但是用LSTM會遺忘一些東西,為什麼要遺忘一些東西呢?這裡想的不是很透徹。有兩種猜測是:1.為了和對訓練樣本的的編碼結構一致。2.也許遺忘一些東西會相當於dropout?希望有明白的大佬能幫忙解釋一下,不勝感激。

實驗:

Task: N-way k-shot learning task. 即,對N個類別,每個類別給定k(1或5)個樣本,並且這些樣本以及類別都是之前在訓練的過程中沒有見過的,判斷一個新的樣本的類別。

作者還選擇了幾個對比模型(不是那麼重要就不翻譯了):

  • Baselines: an "obvious" strategy of using a pretrained ConvNet and doing nearest neighbor based on the codes. An option of finetuning the network on the new examples as well (requires training and careful and strong regularization!).
  • MANN of Santoro et al. : Also a DeepMind paper, a fun NTM-like Meta-Learning approach that is fed a sequence of examples and asked to predict their labels.
  • Siamese network of Koch et al. : A siamese network that takes two examples and predicts whether they are from the same class or not with logistic regression. A test example is labeled with a nearest neighbor: with the class it matches best according to the siamese net (requires iteration over all training examples one by one). Also, this approach is less end-to-end than the one here because it requires the ad-hoc nearest neighbor matching, while here the exact end task is optimized for.

在Omniglot上的實驗:

Omniglot 是一個類似 MNIST 的數據集,一共有1623個characters,每個裡面有20個樣本。

在ImageNet 上的實驗:

  • In the rand setup:在訓練集中隨機去除了118個label的樣本,並將這118個標籤的樣本用於之後的測試。
  • For the dogs setup:移除了所有屬於狗這一大類的樣本(一共118個子類),之後用這118個狗的子類樣本做測試。

  • 作者還新定義了一個數據集 miniImageNet —— 一共有100個類別,每個類有600個樣本。其中80個類用於訓練20個類用於測試。

作者還在One-Shot Language Modeling上做了實驗,但是對於這個實驗的結果論文中只是粗略的說了一下,所以在這裡就不展開了。


推薦閱讀:

TAG:機器學習 | 論文 | DeepMind |