天天看點

【深度神經網絡 One-shot Learning】孿生網絡少樣本精準分類

傳統觀點一般認為,深度神經網絡通常比較擅長從高維資料中學習,例如圖像或者語言,但這是建立在它們有大量标記的樣本來訓練的情況下。然而,人類卻擁有單樣本學習的能力——如果你找一個從來沒有見過小鏟刀的人,給他一張小鏟刀的圖檔,他應該就能很高效的将它從其他廚房用具裡面鑒别出來。

【深度神經網絡 One-shot Learning】孿生網絡少樣本精準分類

這是一種對人類來說很容易的任務,但是直到我們想寫一個算法讓它去做這件事……那就GG了 。很明顯,機器學習系統很希望擁有這種快速從少量樣本中去學習的能力,因為收集和标記資料是一個耗時費力的工作。而且,我認為這是通往通用人工智能的漫漫長路中很重要的一步。

最近湧現出來很多有趣的基于神經網絡的單樣本學習論文,它們已經得到了一些不錯的結果。這是一個讓我很激動的新領域,是以我想去對它做一個簡要介紹,來讓深度學習新手更好的認識它。

在這篇部落格中,我想:

介紹并定義單樣本學習問題

描述單樣本分類問題的基準,并給出一個其性能的baseline

給出一個少樣本學習的例子,并部分實作這篇論文中提到的模型

指出一些大家通常不會想到的小點子

在我們解決任何問題之前,我們應該精準的定義出這個問題到底是什麼,下面是單樣本分類問題的符号化表示: 我們的模型隻獲得了很少的标記的訓練樣本S,它有N個樣本,每個相同次元的向量

【深度神經網絡 One-shot Learning】孿生網絡少樣本精準分類

有一個對應的标簽 y

【深度神經網絡 One-shot Learning】孿生網絡少樣本精準分類
【深度神經網絡 One-shot Learning】孿生網絡少樣本精準分類

再給出一個待分類的測試樣例

【深度神經網絡 One-shot Learning】孿生網絡少樣本精準分類

。因為樣本集中每個樣本都有一個正确的類别 

【深度神經網絡 One-shot Learning】孿生網絡少樣本精準分類

,我們的目标是正确的預測 y∈S 中哪一個是的正确标簽。

這裡有很多種定義問題的方式,但上面是我們的定義,注意這裡有一些事項需要記錄一下:

現實生活中可能限制更少,可能一張圖檔并不見得隻有一個正确的類别

這個問題很容易泛化到 k-shot 學習,我們隻需要把每個類别 

【深度神經網絡 One-shot Learning】孿生網絡少樣本精準分類

僅有單個樣本換成 k 個樣本就可以了

當N很高時候,

【深度神經網絡 One-shot Learning】孿生網絡少樣本精準分類

 可能有更多可能的類别,是以正确預測類别更難

随機猜的正确率是 

【深度神經網絡 One-shot Learning】孿生網絡少樣本精準分類

這裡有一些在Omniglot資料集上單樣本學習的例子,我會在下一部分介紹它。圖示分别為9類,25類,36類的單樣本學習任務。

【深度神經網絡 One-shot Learning】孿生網絡少樣本精準分類

Omniglot資料集擁有50種文字,1623類手寫字元。對于每類字元僅有20個樣本,每個樣本分别由不同的人繪制而成,分辨率為105*105。

【深度神經網絡 One-shot Learning】孿生網絡少樣本精準分類

上面是Omniglot資料集的一些例子,如圖所示,這裡有很多種字元,如果你喜歡機器學習,你肯定聽說過 MNIST 資料集。Omniglot有時被成為 MNIST 的轉置,因為它有1623類字元,每類隻有20個樣本,相比 MNIST 的10個類别,每個類别都有上千樣本,正好相反。Omniglot 還有創作的筆畫資料,但是我們這裡用不到它。

通常,我們把樣本分為30類訓練樣本,剩下20類作為評估。所有這些不同的字元可以組成很多種單樣本學習任務,是以它确實是單樣本學習的一個很好的評估标準。

最簡單的分類方式是使用 k-近鄰方法,但是因為每個類别隻有一個樣本,是以我們需要用 1近鄰。這很簡單,隻需要計算測試樣本與訓練集中每個樣本的歐式距離,然後選擇最近的一個就可以了:

【深度神經網絡 One-shot Learning】孿生網絡少樣本精準分類

根據Koch等人的論文,在Omniglot資料集中的20類上,單樣本分類,1-nn可以得到大約28%的精度,28%看起來很差,但是它已經是随機猜測(5%)的 6 倍了。這是一個單樣本學習算法最好的baseline 或者“合理性測試”了。

Lake等人的 Hierarchical Bayesian Program Learning,層次貝葉斯程式學習(以下簡稱 HBPL)得到了大約 95.2%的精度,非常不錯。我隻看懂了30%,但它非常有趣,它與深度學習直接從原始像素上訓練相比,是風馬牛不相及的,因為:

HBPL使用筆畫資料,而不是僅僅用原始像素;

HBPL在Omniglot資料集上學習一個筆畫的生成模型,這個算法需要更加複雜的标注,是以不像深度學習能直接從狗、卡車、大腦掃描圖以及小鏟子等圖檔的原始像素上去做單樣本學習,這種圖檔也不是由筆畫構成的。

Lake等人也指出,人類可以在Omniglot 資料集 20類樣本上達到 95.5%的精度,僅僅比 HBPL高一點。在鑽牛角尖思想的引導下,我親自試驗了一下20類任務,達到了97.2%的精度。我并不是做的真正的單樣本學習,因為很多符号我本來就認識,因為我熟悉希臘字母、平假名和片假名,我把這些我本來就認識的移除,我還是得到了96.7%的精度。我認為是我從自己吓人的字迹中練就了超人般的字元識别能力。

如果我們單純的訓練一個用交叉熵損失的softmax分類器神經網絡來做單樣本學習,很明顯,網絡會嚴重過拟合。即便是每類給出上百個樣本,現代的神經網絡依然會過拟合。深度網絡有百萬級别的參數來拟合訓練資料,是以它們可以學習到一個巨大的函數空間(正式來說,是因為它們有一個很高的VC維,這就是為什麼它們可以很好的從複雜的高維資料中學習的部分原因)。

很不幸的是,神經網絡這個優勢又成為了它們做單樣本學習的一大障礙。當有百萬級的參數需要做梯度下降,有這麼多可能學習到的映射關系,我們怎麼能設計一個網絡,讓他可以從單個樣本去學習呢?

人類很容易從單個樣本就能學會小鏟刀或者字母Θ的意思,因為我們一輩子一直都在從相似對象中觀察和學習。把一個随機初始化的神經網絡與人類這種花了一輩子時間去識别物體和符号相比,的确不太公平,因為随機初始化的神經網絡對資料的映射結構缺乏先驗。這也是為什麼我看到的單樣本學習論文都是采用的從其他任務上的知識遷移方法。

神經網絡非常擅長從結構化的複雜/高維資料中(例如圖像)提取特征。如果給神經網絡與單樣本學習任務相似的訓練資料,它或許能夠從這些資料中學習到有用的特征,這些特征可能不需要調整就能用到單樣本學習。這樣,我們仍舊能叫他單樣本學習,因為輔助的訓練資料與單樣本測試的資料不是相同的類别。(注意:這裡的特征指的是“被用來訓練的資料的映射資料”——譯者注:例如經過CNN提取到的特征)。

接下來以一個有趣的問題就是,我們如何設計一個神經網絡讓它來學習特征?最顯而易見的方法就是用遷移學習(如果有标記資料的話)——在訓練資料上訓練一個softmax分類器,然後在單樣本學習任務的資料集上微調最後一層的權重。實際上,神經網絡分類器在Omniglot資料集上不會有什麼良好的表現,因為每類的樣本僅有幾個,即使是微調最後一層的權重,網絡也會在訓練集上過拟合。但這種方法也比使用L2距離的 k-近鄰方法要好很多了(參考Matching Networks for One shot learning 中對各種單樣本學習方法的效果的比較)。

這裡還是有一種方法來做單樣本學習的!忘了1近鄰方法?這個簡單的,非參的單樣本學習器,計算測試集中的樣本與訓練集中每個樣本的L2距離,并選擇最近的作為它的類别。這種方法是ok的,但是L2距離會陷入嚴重的次元災難問題,是以它在成千維的資料上(像Omniglot)上表現不太好。

另外,如果你有兩個接近相同的圖檔,如果你把其中一張圖檔的像素向右移動一點,那麼兩張圖檔的L2距離會從0一下子變得非常高。L2距離在這種任務上是一個非常糟糕的度量。深度學習能奏效嗎?我們可以使用深度卷積神經網絡來學習一種非參的近鄰分類器可以使用的相似性函數。

【深度神經網絡 One-shot Learning】孿生網絡少樣本精準分類

我原本打算放一張連顱雙胎作為這一節的介紹圖檔呢,但是我最終認為孿生的小貓的圖檔可能更好一點。

我在這篇教程中會實作一篇極好的論文中的方法(Siamese Neural Networks for One-shot lmage Recognition)。Koch 等人的單樣本學習方法是同時給神經網絡兩張圖檔以讓他來猜測兩張圖檔是否是同一個類别。當我們做上面提到的單樣本分類任務的時候,網絡可以比較測試集與訓練集中的每張圖檔,然後挑選出哪一張與它最可能是同樣類别。是以我們想讓神經網絡架構同時輸入兩張圖檔,輸出它們屬于同一個類别的機率。

假設

【深度神經網絡 One-shot Learning】孿生網絡少樣本精準分類

【深度神經網絡 One-shot Learning】孿生網絡少樣本精準分類

是資料集中的2個類别,我們讓

【深度神經網絡 One-shot Learning】孿生網絡少樣本精準分類

表示 

【深度神經網絡 One-shot Learning】孿生網絡少樣本精準分類

和 

【深度神經網絡 One-shot Learning】孿生網絡少樣本精準分類

是同一個類别。注意,

【深度神經網絡 One-shot Learning】孿生網絡少樣本精準分類

與 

【深度神經網絡 One-shot Learning】孿生網絡少樣本精準分類

是等價的——這意味這如果我們颠倒輸入圖檔的順序,輸出的機率是完成相同的,

【深度神經網絡 One-shot Learning】孿生網絡少樣本精準分類
【深度神經網絡 One-shot Learning】孿生網絡少樣本精準分類

相等。這被稱為對稱性,孿生網絡就是依賴它設計的。

對稱性是非常重要的,因為它要學習一個距離度量——

【深度神經網絡 One-shot Learning】孿生網絡少樣本精準分類

【深度神經網絡 One-shot Learning】孿生網絡少樣本精準分類

的距離應該等于

【深度神經網絡 One-shot Learning】孿生網絡少樣本精準分類
【深度神經網絡 One-shot Learning】孿生網絡少樣本精準分類

的距離。

如果我們僅僅把兩個樣本拼接起來,把它作為神經網絡的單一的輸入,每個樣本将會是與一個不同權重集合的矩陣相乘(或纏繞),這會打破對稱性。沒問題,這樣子網絡依然能成功的為每個輸入學習到完全相同的權重,但是對兩個輸入學習相同的權重會更容易一些。是以我們可以讓兩個輸入通過完全相同,共享參數的網絡,然後使用絕對差分作為線性分類器的輸入--這是孿生網絡必須的結構。兩個完全相同的雙胞胎,共用一個頭顱,這就是孿生網絡的由來。

不幸的是,如果我們想介紹清楚為什麼卷積神經網絡可以工作,那這篇部落格就會長了去了。如果你想了解卷積神經網絡,我建議你去學習CS231然後去colah。對于沒有深度學習經驗的讀者,我隻能這樣概況CNN:

一張圖像是3D像素矩陣,一個卷積層是一個神經元連接配接到前面一層神經元的一小部分(譯者注:局部連接配接性,比如用3*3的卷積核),然後使用與這個神經元相同的連接配接權重在一張圖檔或者特征塊上滑動一遍,生成另外一個3d的神經元。一個最大池化層是在空間上縮小特征圖用的。很多這樣的層按照順序堆疊到一起就可以用梯度下降來訓練了,它們在圖像任務上表現良好。

我僅對CNN做一個精簡介紹,因為這不是本文的重點。Koch等人使用卷積孿生網絡去分類成對的Omniglot圖像,是以這兩個孿生網絡都是卷積神經網絡。這兩個孿生網絡每個的架構如下:64通道的10×10卷積核,relu->max pool->128 通道的 7×7卷積核,relu->max pool->128通道的4×4卷積核,relu->max pool->256 通道的 4×4卷積核。

孿生網絡把輸入降低到越來越小的 3d 張量上,最終它們經過一個4096神經元的全連接配接層。兩個向量的絕對差作為線性分類器的輸入。這個網絡一共有38,951,745個參數——96%的參數屬于全連接配接層。這個參數量很大,是以網絡有很高的過拟合風險,但是成對的訓練意味着資料集是很大的,是以過拟合問題不會出現。

【深度神經網絡 One-shot Learning】孿生網絡少樣本精準分類

架構的草圖

輸出被歸一化到[0,1]之間,使用sigmoid函數讓它成為一個機率。當兩個圖像是相同類别的時候,我們使目标 t=1,類别不相同的時候使 t=0。它使用邏輯斯特回歸來訓練。這意味着損失函數應該是預測和目标之間的二分類交叉熵。損失函數中還有一個L2權重衰減項,以讓網絡可以學習更小的或更平滑的權重,進而提高泛化能力:

【深度神經網絡 One-shot Learning】孿生網絡少樣本精準分類

當網絡做單樣本學習的時候,孿生網絡簡單的分類一下測試圖像與訓練集的圖像中哪個最相似就可以了:

【深度神經網絡 One-shot Learning】孿生網絡少樣本精準分類

這裡使用argmax而不是近鄰方法中的argmin,因為類别越不同,L2度量的值越高,但是這個模型的輸出

【深度神經網絡 One-shot Learning】孿生網絡少樣本精準分類

,是以我們要這個值最大。這個方法有一個明顯的缺陷:對于訓練集中的任何一個

【深度神經網絡 One-shot Learning】孿生網絡少樣本精準分類

,機率

【深度神經網絡 One-shot Learning】孿生網絡少樣本精準分類

與訓練集中每個樣本都是獨立的!這意味着機率值的和不為 1。言歸正傳,測試圖像與訓練圖像應該是相同類型的……

經過與UoA大學的博士讨論後發現,我認為這個是過分誇大的,或者就是錯的。憑經驗來說,我的實作沒有過拟合,即使它沒有在每個可能的成對圖像上充分訓練,這與該節是沖突的。在有錯就說思想的指引下,我會保留這個問題。(這是原作者的自言自語吧~)

我注意到,采用逐對訓練的話,将會有平方級别對的圖像對來訓練模型,這讓模型很難過拟合,好酷。假設我們有E類,每類有C個樣本。一共有 C⋅ E 張圖檔,總共可能的配方數量可以這樣計算:

【深度神經網絡 One-shot Learning】孿生網絡少樣本精準分類

對于Omniglot中的964類(每類20個樣本),這會有185,849,560個可能的配對,這是巨大的!然而,孿生網絡需要相同類的和不同類的配對都有。每類E個訓練樣本,是以每個類别有

【深度神經網絡 One-shot Learning】孿生網絡少樣本精準分類

對,這意味着這裡有

【深度神經網絡 One-shot Learning】孿生網絡少樣本精準分類
【深度神經網絡 One-shot Learning】孿生網絡少樣本精準分類

個相同類别的配對。

對于Omniglot有183,160對。即使 183,160對已經很大了,但隻是所有可能配對的千分之一,因為相同類别的配對數量随着E平方級的增大,但是随着C是線性增加。這個問題非常重要,因為孿生網絡訓練的時候,同類别和不同類别的比例應該是1:1。或許,它表明逐對訓練在那種每個類别有更多樣本的資料集上更容易訓練。

下面是模型定義,如果你見過keras,那很容易了解。我隻用Sequential()來定義一次孿生網絡,然後使用兩個輸入層來調用它,這樣兩個輸入使用相同的參數。然後我們把它們使用絕對距離合并起來,添加一個輸出層,使用二分類交叉熵損失來編譯這個模型。

原論文中每個層的學習率和沖量都不相同--我跳過了這個步驟,因為使用keras來實作這個太麻煩了,并且超參數不是該論文的重點。Koch等人增加向訓練集中增加失真的圖像,使用150,000對樣本訓練模型。因為這個太大了,我的記憶體放不下,是以我決定使用随機采樣的方法。載入圖像對或許是這個模型最難實作的部分。因為這裡每個類别有 20個樣本,我把資料重新調整為 N_classes×20×105×105的數組,這樣可以很友善的來索引。

下面是訓練過程了。沒什麼特别的,除了我監測的是驗證機精度來測試性能,而不是驗證集上的損失。

一旦學習曲線變平整了,我使用在 20 類驗證集合上表現最好的模型來測試。我的網絡在驗證集上得到了大約 83%的精度,原論文精度是93%。或許這個差别是因為我沒有實作原論文中的很多增強性能的技巧,像逐層的學習率/沖量,使用資料失真的資料增強方法,貝葉斯超參數優化,并且我疊代的次數也不夠。我并不擔心這個,因為這個教程側重于簡要介紹單樣本學習,而不是在那百分之幾的分類性能上鑽牛角夾。這裡不缺乏這方面的資源。

我很好奇,模型的精度是怎麼随樣本的類别數目N變化的,是以我把它畫了出來,與1近鄰,随機猜測以及模型在訓練集上的精度的比較。

【深度神經網絡 One-shot Learning】孿生網絡少樣本精準分類

如圖所示,驗證集上的精度要比訓練集上差一些,尤其是當N的數量很多的時候,這裡面肯定有過拟合的問題。我們也想測試一下傳統的正則化方法(像dropout)在驗證集與訓練集完全不同的時候的表現。對于較大的N,它比我期待中的要好,在50-60種類别上,仍舊有65%的平均精度。

現在我們隻是訓練了一個來做鑒别相同還是不同的二分類網絡。更重要的是,我們展現了模型能夠在沒有見過的字母表上的20類單樣本學習的性能。當然,這不是使用深度學習來做單樣本學習的唯一方式。

正如我前面提到的,我認為這個孿生網絡的最大缺陷是它要拿測試圖像與訓練集中圖像逐個比較。當這個網絡将測試圖像與任何圖像x1相比,不管訓練集是什麼,

【深度神經網絡 One-shot Learning】孿生網絡少樣本精準分類

都是相同的。這很愚蠢,假如你在做單樣本學習任務,你看到一張圖檔與測試圖像非常類似。然而,當你看到訓練集中另外一張圖檔也與測試集非常相似,你就會對它的類别沒那麼自信了。訓練目标與測試目标是不同的,如果有一個模型可以很好的比較測試圖檔與訓練集,并且使用僅僅有一個訓練圖檔與之擁有相同類别的限制,那模型會表現的更好。

Matching Networks for One Shot learning 這篇論文就是做這個的。它們使用深度模型來端到端的學習一個完整的近鄰分類器,而不是學習相似度函數,直接在單樣本任務上訓練,而不是在一個圖像對上。Andrej Karpathy’s notes 很好的解釋了這個問題。因為你正在學習機器分類,是以你可以把他視為元學習(meta learning)。

One-shot Learning with Memory-Augmented Neural Networks 這篇論文解釋了單樣本學習與元學習的關系,它在Omniglot資料集上訓練了一個記憶增強網絡,然而,我承認我看不懂這篇論文。

Omniglot 資料集是2015年的了,現在已經有了可拓展機器學習算法,在特定的單樣本學習上達到了人類的水準。希望未來有一天,Omniglo t資料集會像 MNIST 之于監督學習那樣,成為單樣本學習的标準檢測資料集。

圖像分類挺酷的,但我并不認為它是機器學習界最有趣的問題。現在我們知道了深度單樣本學習有了不錯的效果,我想如果嘗試把單樣本學習應用到更有挑戰性的任務上,那樣才是真酷。

單樣本學習的想法可以被用到樣本效率更高的增強學習上面,尤其是像OpenAI's Universe這樣的問題,這些問題有很多馬爾科夫決策過程或者環境,它們擁有類似的視覺和動态資訊。如果有一個增強學習機制能以類似馬爾科夫決策過程學習後可以有效的探索新環境,那樣簡直酷斃了。

OpenAI 的比特世界

【深度神經網絡 One-shot Learning】孿生網絡少樣本精準分類

《單樣本模仿學習》是我最喜歡的單樣本學習論文。它的目标是建立一個可以學習魯棒的政策的機制,它在人類展示一次任務後就能解決這個任務。它是這樣做的:

建立一個神經網絡,它可以映射目前狀态和一個序列狀态(人類示範)到一個動作;

把這個模型在人類示範動作和微小的變動任務對上訓練,目标是讓模型可以基于第一個示範來複現第二個示範動作。

這真是震驚我了,這提供了一種通往制造可以廣泛應用的,可以學習的機器人的康莊大道啊。

把單樣本學習引入到NLP也是一個很酷的idea。Matching Networks在單樣本語言模型上進行了嘗試,僅給出很小的訓練集,在測試集上填充缺失單詞,這看起來工作的不錯。棒!

原文釋出時間為:2017-09-13

本文作者:Soren Bouma

本文來自雲栖社群合作夥伴極市網,了解相關資訊可以關注極市網。

繼續閱讀