1. 程式人生 > >多種型別的神經網路(孿生網路)

多種型別的神經網路(孿生網路)

目錄:

一、CPPN

二、孿生網路Siamese

三、改進的孿生網路

四、Triplet Network

一、CPPN(Compositional Pattern Producing Network)複合模式生成網路

CPPN是一種基於遺傳演算法演化神經網路結構的生成式模型。

1、前言:

一個圓的影象可以用函式表示:(x-x0)2+(y-y0)2 = 1

故影象可以表示為函式。而另一方面,神經網路可以逼近任何函式。因此,影象可以表示為神經網路。

2、CPPN接面構

以上圖中,網路輸入是畫素的座標值(x,y),r為(x,y)到原點的距離,即根號(x2+y2)。z是一個隨機的向量。輸入為是三個標量和一個向量。

網路中的引數隨機取值。

網路輸出是一個畫素的RGB值

把【0,0】-【100,100】座標逐個輸入,將輸出的RGB值組成完整影象,將會是什麼樣子?

 

二、孿生網路(Siamese)【2-branches networks】

孿生網路(Siamese network)是一種網路結構,通過一個NN將樣本的維度降低到某個較低的維度。

在低維空間,任意兩個樣本:

  • 如果它們是相同類別,空間距離儘量接近0
  • 如果它們是不同類別,空間距離大於某個間隔

1、孿生網路結構:

Siamese network就是“連體的神經網路”,神經網路的“連體”是通過共享權值來實現的,如下圖所示。

目的:比較兩幅圖片是否相似,或者說相似度是多少【匹配度】

輸入:兩幅圖片

輸出:一個相似度數值

Network1和Network2兩個神經網路的權重一樣,甚至可以兩者是同一個網路,不用實現另外一個,因為權值都一樣。對於siamese network,兩邊可以是lstm或者cnn,都可以。

2、偽孿生神經網路:

如果左右兩邊不共享權值,而是兩個不同的神經網路,則模型叫pseudo-siamese network,偽孿生神經網路,如下圖所示。對於pseudo-siamese network,兩邊可以是不同的神經網路(如一個是lstm,一個是cnn),也可以是相同型別的神經網路。

 

3、孿生神經網路的用途:衡量兩個輸入的相似程度。

孿生神經網路有兩個輸入(Input1 and Input2),將兩個輸入feed進入兩個神經網路(Network1 and Network2),這兩個神經網路分別將輸入對映到新的空間,形成輸入在新的空間中的表示。通過Loss的計算,評價兩個輸入的相似度。

用途:

  • 詞彙的語義相似度分析,QA中question和answer的匹配,簽名/人臉驗證。

  • 手寫體識別也可以用siamese network,網上已有github程式碼。

  • 還有kaggle上Quora的question pair的比賽,即判斷兩個提問是不是同一問題,冠軍隊伍用的就是n多特徵+Siamese network,知乎團隊也可以拿這個模型去把玩一下。

  • 在影象上,基於Siamese網路的視覺跟蹤演算法也已經成為熱點《Fully-convolutional siamese networks for object tracking》。

4、孿生神經網路和偽孿生神經網路分別適用於什麼場景呢?

先上結論:孿生神經網路用於處理兩個輸入"比較類似"的情況。偽孿生神經網路適用於處理兩個輸入"有一定差別"的情況。比如,我們要計算兩個句子或者詞彙的語義相似度,使用siamese network比較適合;如果驗證標題與正文的描述是否一致(標題和正文長度差別很大),或者文字是否描述了一幅圖片(一個是圖片,一個是文字),就應該使用pseudo-siamese network。也就是說,要根據具體的應用,判斷應該使用哪一種結構,哪一種Loss。

5、Siamese network 的損失函式:

Softmax當然是一種好的選擇,但不一定是最優選擇,即使是在分類問題中。【分類問題用交叉熵】

傳統的siamese network使用Contrastive Loss【對比損失函式】

對比損失函式如下:


  • 其中Dw被定義為姐妹孿生網路的輸出之間的歐氏距離。Dw歐式距離公式如下:

  • 其中Gw是其中一個姐妹網路的輸出。X1和X2是輸入資料對。
  • Y值為1或0。如果模型預測輸入是相似的,那麼Y的值為0,否則Y為1。
  • max()是表示0和m-Dw之間較大值的函式。
  • m是大於0的邊際價值(margin value)。有一個邊際價值表示超出該邊際價值的不同對不會造成損失。這是有道理的,因為你只希望基於實際不相似對來優化網路,但網路認為是相當相似的。

吳恩達老師視訊中的三重損失函式:

代價函式是訓練集的所有個體的三重損失的和:

三重損失函式:

解釋:

這裡的最大化處理意味著只要 d(A, P)—d(A, N)+ α小於等於 0,那麼 loss L(A, P, N) 就會是 0,但是一旦它大於 0,那麼損失值就是正的,這個函式就會將它最小化成 0 或者小於 0。

這裡的問題是,模型可能學習給不同的圖片做出相同的編碼,這意味著距離會成為 0,不幸的是,這仍然滿足三重損失函式。因為這個原因,我們加入了邊際α(一個超引數)來避免這種情況的發生。讓 d(A,P) 與 d(N,P) 之間總存在一個差距。

 

為了比較圖片 x(1) 和 x(2),我們計算了編碼結果 f(x1) 和 f(x2) 之間的距離。如果它比某個閾值(一個超引數)小,則意味著兩張圖片是同一個人,否則,兩張圖片中不是同一個人。
上式是 x1 和 x2 的編碼之間的距離。

這適用於任何兩張圖片。【存在正負樣本】
     

      那麼,為了得到對輸入圖片的良好編碼,我們如何學習相應的引數呢?梯度下降

【損失函式還有更多的選擇,siamese network的初衷是計算兩個輸入的相似度,。左右兩個神經網路分別將輸入轉換成一個"向量",在新的空間中,通過判斷cosine距離就能得到相似度了。Cosine是一個選擇,exp function也是一種選擇,歐式距離什麼的都可以,訓練的目標是讓兩個相似的輸入距離儘可能的小,兩個不同類別的輸入距離儘可能的大。其他的距離度量沒有太多經驗,這裡簡單說一下cosine和exp在NLP中的區別。

根據實驗分析,cosine更適用於詞彙級別的語義相似度度量,而exp更適用於句子級別、段落級別的文字相似性度量。其中的原因可能是cosine僅僅計算兩個向量的夾角,exp還能夠儲存兩個向量的長度資訊,而句子蘊含更多的資訊(當然,沒有做實驗驗證這個事情)。】

 

三、改進的Siamese網路(2-channel networks):

 

Siamese 網路(2-branches networks)的大體思路:
1. 讓patch1、patch2分別經過網路,進行提取特徵向量(Siamese 對於兩張圖片patch1、patch2的特徵提取過程是相互獨立的)
2. 然後在最後一層對兩個兩個特徵向量做一個相似度損失函式,進行網路訓練。 paper所提出的演算法(2-channel networks) 的大體思路:
1. 把patch1、patch2合在一起,把這兩張圖片,看成是一張雙通道的影象。也就是把兩個(1,64,64)單通道的資料,放在一起,成為了(2,64,64)的雙通道矩陣,
2. 然後把這個矩陣資料作為網路的輸入,這就是所謂的:2-channel。   這樣,跳過了分支的顯式的特徵提取過程,而是直接學習相似度評價函式。最後一層直接是全連線層,輸出神經元個數直接為1,直接表示兩張圖片的相似度。當然CNN,如果輸入的是雙通道圖片,也就是相當於網路的輸入的是2個feature map,經過第一層的卷積後網,兩張圖片的畫素就進行了相關的加權組合並對映,這也就是說,用2-channel的方法,經過了第一次的卷積後,兩張輸入圖片就不分你我了。而Siamese網路是到了最後全連線的時候,兩張圖片的相關神經元才聯絡在一起。
 

四、Triplet Network

Siamese network是雙胞胎連體,Triplet network是三胞胎連體

 論文是《Deep metric learning using Triplet network》,輸入是三個,一個正例+兩個負例,或者一個負例+兩個正例,訓練的目標是讓相同類別間的距離儘可能的小,讓不同類別間的距離儘可能的大。Triplet在cifar, mnist的資料集上,效果都是很不錯的,超過了siamese network。

輸入:x-與x是負樣本,x+與x是相似正樣本。

 

應用:

  • Image ranking
  • face verification
  • metric learning

 

 

參考:

https://blog.csdn.net/qq_15192373/article/details/78404761

https://blog.csdn.net/Suan2014/article/details/80599595

pytorch人臉識別:http://www.techweb.com.cn/news/2017-07-21/2561327.shtml