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

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

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

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

核心思想:

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

模型結構:

論文筆記:Matching Networks for One Shot Learning

Task:

訓練過程:

給定一個有k個樣本的支撐集

S=\left\{(x_{i},y_{i})\right\}_{i=1}^{k}

,對測試樣本

\hat{x}

分類(歸類,因為

\hat{x}

的類別是和S中的某個或幾個樣本類別相同的),類別是

C_{S}(\hat{x})

定義

S\rightarrow C_{S}(\hat{x})

這一對映為

P(\hat{y}|\hat{x},S)

,這裡的P的引數是透過神經網路學習到的,對映方式就是我們最後學到的模型。

因此,在測試過程中:

給定一個新的支撐集

S^{

,我們可以用之前學到的模型對每個測試樣本

\hat{x}

得到他們可能的label

\hat{y}

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

模型演算法:

給定一個測試樣本

\hat{x}

計算

\hat{y}

的過程和Nearest Neighbors很像:

論文筆記:Matching Networks for One Shot Learning

這裡的a類似attention模型中的核函式,用來度量

\hat{x}

和訓練樣本

x_{i}

的匹配度,之後透過

y_{i}

對於測試樣本label的計算就類似於加權求和:

論文筆記:Matching Networks for One Shot Learning

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

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

g的結構是一個雙向LSTM,這個雙向LSTM的輸入序列是S中的各個樣本

(x_{0},x_{1},x_{2}...)

g^{

是首先對

x_{i}

輸入到神經網路(如VGG、Inception model)進行的一個編碼。

定義基於支撐集S,對樣本

x_{i}

的編碼為:

論文筆記:Matching Networks for One Shot Learning

這裡:

論文筆記:Matching Networks for One Shot Learning

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輸出的隱狀態。

論文筆記:Matching Networks for One Shot Learning

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

在LSTM的每一步中,輸入

f^{

都是固定的,是對測試樣本自身的一個編碼(參考上文的

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上的實驗:

論文筆記:Matching Networks for One Shot Learning

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

論文筆記:Matching Networks for One Shot Learning

在ImageNet 上的實驗:

In the

rand

setup:在訓練集中隨機去除了118個label的樣本,並將這118個標籤的樣本用於之後的測試。

For the

dogs

setup:移除了所有屬於狗這一大類的樣本(一共118個子類),之後用這118個狗的子類樣本做測試。

論文筆記:Matching Networks for One Shot Learning

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

論文筆記:Matching Networks for One Shot Learning

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