Siamese network 孿生神經網路--一個簡單神奇的結構

  1. 名字的由來

Siamese和Chinese有點像。Siam是古時候泰國的稱呼,中文譯作暹羅。Siamese也就是「暹羅」人或「泰國」人。Siamese在英語中是「孿生」、「連體」的意思,這是為什麼呢?

十九世紀泰國出生了一對連體嬰兒,當時的醫學技術無法使兩人分離出來,於是兩人頑強地生活了一生,1829年被英國商人發現,進入馬戲團,在全世界各地表演,1839年他們訪問美國北卡羅萊那州後來成為「玲玲馬戲團」 的台柱,最後成為美國公民。1843年4月13日跟英國一對姐妹結婚,恩生了10個小孩,昌生了12個,姐妹吵架時,兄弟就要輪流到每個老婆家住三天。1874年恩因肺病去世,另一位不久也去世,兩人均於63歲離開人間。兩人的肝至今仍保存在費城的馬特博物館內。從此之後「暹羅雙胞胎」(Siamese twins)就成了連體人的代名詞,也因為這對雙胞胎讓全世界都重視到這項特殊疾病。

連體雙胞胎及其妻子們

至於連體雙胞胎是如何同英國姐妹分別生下了22個孩子的方法,就靠大家自己腦補了。

簡單來說,Siamese network就是「連體的神經網路」,神經網路的「連體」是通過共享權值來實現的,如下圖所示。

孿生神經網路

大家可能會有疑問:共享權值是什麼意思?左右兩個神經網路的權重一模一樣?

答:是的,在代碼實現的時候,甚至可以是同一個網路,不用實現另外一個,因為權值都一樣。對於siamese network,兩邊可以是lstm或者cnn,都可以。

大家可能還有疑問:如果左右兩邊不共享權值,而是兩個不同的神經網路,叫什麼呢?

答:pseudo-siamese network,偽孿生神經網路,如下圖所示。對於pseudo-siamese network,兩邊可以是不同的神經網路(如一個是lstm,一個是cnn),也可以是相同類型的神經網路。

偽孿生神經網路

2. 孿生神經網路的用途是什麼?

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

據我查到的資料,養樂村同志在NIPS 1993上發表了論文《Signature Verification using a 『Siamese』 Time Delay Neural Network》用於美國支票上的簽名驗證,即驗證支票上的簽名與銀行預留簽名是否一致。1993年,養樂村同志就在用兩個卷積神經網路做簽名驗證了,而我剛出生,作為一個出生沒幾年的新神經網路,在受我爸媽的訓練。

signature verification

隨著SVM等演算法的興起,neural network被人們遺忘,還好有一些執著的人們,堅守在了神經網路研究的陣地。2010年Hinton在ICML上發表了文章《Rectified Linear Units Improve Restricted Boltzmann Machines》,用來做人臉驗證,效果很好。其原理很簡單,將兩個人臉feed進卷積神經網路,輸出same or different。

啥?Siamese network只能做二分類?

不不不,它能做的事情還有很多很多,後面會繼續介紹。

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

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

4. Siamese network loss function一般用哪一種呢?

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

根據實驗分析,cosine更適用於辭彙級別的語義相似度度量,而exp更適用於句子級別、段落級別的文本相似性度量。其中的原因可能是cosine僅僅計算兩個向量的夾角,exp還能夠保存兩個向量的長度信息,而句子蘊含更多的信息。

我們在論文里使用了exp距離做多分類,解決Fakenewschallenge上標題與正文立場是否一致的問題。

5. Siamese network是雙胞胎連體,整一個三胞胎連體行不行?

不好意思,已經有人整過了,叫Triplet network,論文是《Deep metric learning using Triplet network》,輸入是三個,一個正例+兩個負例,或者一個負例+兩個正例,訓練的目標是讓相同類別間的距離儘可能的小,讓不同類別間的距離儘可能的大。Triplet在cifar, mnist的數據集上,效果都是很不錯的,超過了siamese network。四胞胎,五胞胎會不會更屌?。。。。。目前還沒見過。。。。

Triplet network

6. Siamese network的用途有哪些?

這個可以說太多了,nlp&cv領域都有很多應用。

  • 前面提到的辭彙的語義相似度分析,QA中question和answer的匹配,簽名/人臉驗證。
  • 手寫體識別也可以用siamese network,網上已有github代碼。
  • 還有kaggle上Quora的question pair的比賽,即判斷兩個提問是不是同一問題,冠軍隊伍用的就是n多特徵+Siamese network,知乎團隊也可以拿這個模型去把玩一下。
  • 在圖像上,基於Siamese網路的視覺跟蹤演算法也已經成為熱點《Fully-convolutional siamese networks for object tracking》。

推薦閱讀:

TAG:深度學習DeepLearning | 神經網路 | 機器學習 |