1. 程式人生 > >Siamese Network理解(附程式碼)

Siamese Network理解(附程式碼)

author:DivinerShi

提起siamese network一般都會引用這兩篇文章:
《Learning a similarity metric discriminatively, with application to face verification》和《 Hamming Distance Metric Learning》。

本文主要通過論文《Learning a Similarity Metric Discriminatively, with Application to Face Verification》來理解siamese網路。

介紹

Siamese網路是一種相似性度量方法,當類別數多,但每個類別的樣本數量少的情況下可用於類別的識別、分類等。傳統的用於區分的分類方法是需要確切的知道每個樣本屬於哪個類,需要針對每個樣本有確切的標籤。而且相對來說標籤的數量是不會太多的。當類別數量過多,每個類別的樣本數量又相對較少的情況下,這些方法就不那麼適用了。其實也很好理解,對於整個資料集來說,我們的資料量是有的,但是對於每個類別來說,可以只有幾個樣本,那麼用分類演算法去做的話,由於每個類別的樣本太少,我們根本訓練不出什麼好的結果,所以只能去找個新的方法來對這種資料集進行訓練,從而提出了siamese網路。siamese網路從資料中去學習一個相似性度量,用這個學習出來的度量去比較和匹配新的未知類別的樣本。這個方法能被應用於那些類別數多或者整個訓練樣本無法用於之前方法訓練的分類問題。

主要思想

主要思想是通過一個函式將輸入對映到目標空間,在目標空間使用簡單的距離(歐式距離等)進行對比相似度。在訓練階段去最小化來自相同類別的一對樣本的損失函式值,最大化來自不同類別的一堆樣本的損失函式值。給定一組對映函式這裡寫圖片描述,其中引數為W,我們的目的就是去找一組引數W。使得當這裡寫圖片描述這裡寫圖片描述屬於同一個類別的時候,相似性度量這裡寫圖片描述是一個較小的值,當這裡寫圖片描述這裡寫圖片描述屬於不同的類別的時候,相似性度量這裡寫圖片描述較大。這個系統是用訓練集中的成對樣本進行訓練。當這裡寫圖片描述這裡寫圖片描述來自相同類別的時候,最小化損失函式這裡寫圖片描述,當這裡寫圖片描述這裡寫圖片描述來自不同類別的時候,最大化這裡寫圖片描述。這裡的這裡寫圖片描述除了需要可微外不需要任何的前提假設,因為針對成對樣本輸入,這裡兩個相同的函式G,擁有一份相同的引數W,即這個結構是對稱的,我們將它叫做siamese architecture。
在這篇論文中,作者用這個網路去做面部識別,比較兩幅圖片是不是同一個人,而且這個網路的一個優勢是可以去區分那些新的沒有經過訓練的類別的樣本。

Siamese也算是降維方法的一種。常見的降維方法有PCA、LDA、Kernel-PCA、MDS、LLE、LB、ISOmap、FA等不做具體介紹。

網路結構

這裡寫圖片描述
上圖是論文中的網路結構圖,左右兩邊兩個網路是完全相同的網路結構,它們共享相同的權值W,輸入資料為一對圖片(X1,X2,Y),其中Y=0表示X1和X2屬於同一個人的臉,Y=1則表示不為同一個人。即相同對為(X1,X2,0),欺騙對為(X1,X2’,1)針對兩個不同的輸入X1和X2,分別輸出低維空間結果為這裡寫圖片描述這裡寫圖片描述,它們是由這裡寫圖片描述這裡寫圖片描述經過網路對映得到的。然後將得到的這兩個輸出結果使用能量函式這裡寫圖片描述進行比較。
這裡寫圖片描述

損失函式定義

我們假設損失函式只和輸入和引數有關,那麼我們損失函式的形式為:
這裡寫圖片描述


其中這裡寫圖片描述是第i個樣本,是由一對圖片和一個標籤組成的,其中LG是隻計算相同類別對圖片的損失函式,LI是隻計算不相同類別對圖片的損失函式。P是訓練的樣本數。通過這樣分開設計,可以達到當我們要最小化損失函式的時候,可以減少相同類別對的能量,增加不相同對的能量。很簡單直觀的方法是實現這個的話,我們只要將LG設計成單調增加,讓LI單調遞減就可以了,但是我們要保證一個前提就是,不相同的圖片對距離肯定要比相同圖片對的距離小,那麼就是要滿足:
這裡寫圖片描述
所以論文中用了一個
這裡寫圖片描述
作為總的損失函式,可以滿足這個condition1。論文中進行了各種假設的證明已經單調性的證明,這裡不再重複。
最後給出一個精確的對單個樣本的損失函式:
這裡寫圖片描述
其中
這裡寫圖片描述
,Q是一個常量。
這裡寫圖片描述
上圖說明了收斂性。

總結思想

其實講了這麼多,主要思想就是三點:
1、輸入不再是單個樣本,而是一對樣本,不再給單個的樣本確切的標籤,而且給定一對樣本是否來自同一個類的標籤,是就是0,不是就是1
2、設計了兩個一模一樣的網路,網路共享權值W,對輸出進行了距離度量,可以說l1、l2等。
3、針對輸入的樣本對是否來自同一個類別設計了損失函式,損失函式形式有點類似交叉熵損失:
這裡寫圖片描述
最後使用獲得的損失函式,使用梯度反傳去更新兩個網路共享的權值W。

優點

這個網路主要的優點是淡化了標籤,使得網路具有很好的擴充套件性,可以對那些沒有訓練過的類別進行分類,這點是優於很多演算法的。而且這個演算法對一些小資料量的資料集也適用,變相的增加了整個資料集的大小,使得資料量相對較小的資料集也能用深度網路訓練出不錯的效果。

實驗設計

實驗的時候要注意,輸入資料最好打亂,由於這樣去設計資料集後,相同類的樣本對肯定比不相同的樣本對數量少,在進行訓練的時候最後將兩者的資料量設定成相同數量。

總結

本文解釋的只是最早提出的siamese網路結構,提出的是一種網路結構思想,具體的使用的網路形式完全可以自己定義。包括損失函式,相似度距離的定義等。比如將損失函式的這裡寫圖片描述用hige loss代替等。
《Hamming Distance Metric Learning》這篇論文對siamese進一步改進,提出了一個triple net,主要貢獻是將成對樣本改成了三個樣本,輸入由(X1,X2,Y)變成了(X1,X2,X1’),表示X1和X1’是相同類別的樣本,X1和x2是不同樣本的類別。
《Learning to Compare Image Patches via Convolutional Neural Networks》這篇論文寫得也很好,將兩個網路進行合併,輸入的成對標籤直接同時輸入同一個網路。

程式碼

參考文獻