孪生神经网络专题
孿生網絡專題
孿生神經網絡(Siamese Network)
可以解決的問題?
- 孿生神經網絡可解決以下兩種分類問題:
- 第一類,分類數量較少,每一類的數據量較多,比如ImageNet、VOC等。這種分類問題可以使用神經網絡或者SVM解決,只要事先知道了所有的類。
- 第二類,分類數量較多(或者說無法確認具體數量),每一類的數據量較少,比如人臉識別、人臉驗證任務。
何為“孿生”?
-
Siamese:”連體“,”孿生“,來源于泰國(暹羅)的連體雙胞胎(Siamese Twins)
-
Siamese Network 具有兩個結構相同,且權值共享的子網絡。分別接收兩個輸入 X1X_{1}X1? 與 X2X_{2}X2? ,將其轉換為向量 GW(X1)G_{W}(X_{1})GW?(X1?) 與 GW(X2)G_{W}(X_{2})GW?(X2?) ,再通過某種距離度量的方式計算兩個輸出向量的距離EWE_{W}EW?。
在低維空間,任意兩個樣本:
- 如果它們是相同類別,空間距離盡量接近0
- 如果它們是不同類別,空間距離大于某個間隔
-
訓練樣本:
訓練樣本的形式應該表示成為一個三元組,即 tuple(X1,X2,Y)tuple (X_{1},X_{2},Y)tuple(X1?,X2?,Y) 將其轉化為向量 GW(X1)G_W(X_{1})GW?(X1?) 和 GW(X2)G_{W}(X_{2})GW?(X2?),再通過某種距離度量的方式計算出兩個輸出向量的距離EWE_{W}EW?。
-
孿生方法:
尋找一個映射函數,能夠將輸入圖像轉換到一個特征空間,每個語句對應一個特征向量,通過一些簡單的“距離度量”(比如歐式距離)來表示向量之間的差異,最后通過這個距離來擬合輸入圖像的相似度差異(語義差異)。
采用什么方法解決?
-
Siamese Network 思路:
孿生神經網絡提出了一種思路,將輸入映射成以惡特征向量,采用L1正則化指標衡量兩個向量之間的距離,定量表示輸入向量之間的差異。孿生神經網絡每次需要輸入兩個樣本作為一個樣本對來計算損失函數,提出了用于訓練的Contrastive Loss用于孿生神經網絡的訓練。
孿生神經網絡結構
Siamese Network 結構:—— 類似于差分放大器
評價指標 之 損失函數
LOSS函數設計的基本準則應該是
L(W)=∑i=1PL(W,(Y,X1,X2)i)L(W,(Y,X1,X2)i)=(1?Y)LG(EW(X1,X2)i)+YLI(EW(X1,X2)i)\begin{aligned} \mathcal{L}(W) &=\sum_{i=1}^{P} L\left(W,\left(Y, X_{1}, X_{2}\right)^{i}\right) \\ L\left(W,\left(Y, X_{1}, X_{2}\right)^{i}\right) &=(1-Y) L_{G}\left(E_{W}\left(X_{1}, X_{2}\right)^{i}\right) +Y L_{I}\left(E_{W}\left(X_{1}, X_{2}\right)^{i}\right) \end{aligned} L(W)L(W,(Y,X1?,X2?)i)?=i=1∑P?L(W,(Y,X1?,X2?)i)=(1?Y)LG?(EW?(X1?,X2?)i)+YLI?(EW?(X1?,X2?)i)?
其中,數學符號表示
- YYY 表示 X1,X2X_{1}, X_{2}X1?,X2? 是否屬于同一類:
- 若為同類,則為0;
- 若為不同類,則為1。
- PPP 表示輸入的總樣本數, iii 表示當前樣本的下標。
- LGL_{G}LG? 表示兩個樣本為同類時的損失函數, LIL_{I}LI? 表示兩個樣本未不同類時的損失函數。
- 使用Contrastive Loss的任務主要是設計合適的 LGL_{G}LG? 和 LIL_{I}LI? 損失函數, 當為同類時,使得 LGL_{G}LG? 盡可能 小; 當不同類時,使得 LIL_{I}LI? 盡可能大。文中給出的函數如下圖, 現在也不常用了,推導步驟略。
在Caffe框架下,損失函數定義為
L=12N∑n=1NyDW2+(1?y)max?(margin??DW,0)2L=\frac{1}{2 N} \sum_{n=1}^{N} y D_{W}^{2}+(1-y) \max (\operatorname{margin}-D_{W}, 0)^{2} L=2N1?n=1∑N?yDW2?+(1?y)max(margin?DW?,0)2
其中,
DW(X1,X2)=∥X1?X2∥2=(∑i=1P(X1i?X2i)2)12D_{W}\left(X_{1}, X_{2}\right)=\left\|X_{1}-X_{2}\right\|_{2}=\left(\sum_{i=1}^{P}\left(X_{1}^{i}-X_{2}^{i}\right)^{2}\right)^{\frac{1}{2}} DW?(X1?,X2?)=∥X1??X2?∥2?=(i=1∑P?(X1i??X2i?)2)21?
-
DWD_{W}DW? 代表兩個樣本特征 X1X_{1}X1? 和 X2X_{2}X2? 的歐式距離(向量差的二范數)
-
PPP 表示樣本的特征維數
-
YYY 為兩個樣本是否匹配的標簽
- Y=1Y=1Y=1 代表兩個樣本相似或者匹配
- Y=0Y=0Y=0 代表兩個樣本不匹配
-
marginmarginmargin 為設定的閾值,也可以成為邊際價值。有一個邊際價值表示超出該邊際價值的不同對不會造成損失。這是有道理的,因為你只希望基于實際不相似對來優化網絡,但網絡認為是相當相似的。
- 當 Y=1Y=1Y=1 時,如果 X1X_{1}X1? 與 X2X_{2}X2? 之間距離大于 mmm,則不做優化——省時省力
- 當 Y=0Y=0Y=0 時,如果 X1X_{1}X1? 與 X2X_{2}X2? 之間的距離小于 mmm,則調整參數使其距離增大到 mmm
-
NNN 為樣本個數
詳談損失函數
-
損失函數還有更多的選擇
Siamese network的初衷是計算兩個輸入的相似度,。左右兩個神經網絡分別將輸入轉換成一個"向量",在新的空間中,通過判斷cosine距離就能得到相似度了。cosine是一個選擇,exp function也是一種選擇,歐式距離什么的都可以,訓練的目標是讓兩個相似的輸入距離盡可能的小,兩個不同類別的輸入距離盡可能的大。其他的距離度量沒有太多經驗,這里簡單說一下cosine和exp在NLP中的區別。
-
根據實驗分析,cosine更適用于詞匯級別的語義相似度度量,而exp更適用于句子級別、段落級別的文本相似性度量。其中的原因可能是cosine僅僅計算兩個向量的夾角,exp還能夠保存兩個向量的長度信息,而句子蘊含更多的信息。
損失函數 Python 實現
import torch import numpy as np import torch.nn.functional as Fclass ContrastiveLoss(torch.nn.Module):"Contrastive loss function"def __init__(self, m=2.0):super(ContrastiveLoss, self).__init__()self.m = mdef forward(self, output1, output2, label):d_w = F.pairwise_distance(output1, output2)contrastive_loss = torch.mean((1-label) * 0.5 * torch.pow(d_w, 2) +(label) * 0.5 * torch.pow(torch.clamp(self.m - d_w, min=0.0), 2))return contrastive_loss其中,F.pairwise_distance(x1, x2, p=2)
pairwise_distance(x1, x2, p) Computes the batchwise pairwise distance between vectors x1,x2x_{1},x_{2}x1?,x2? using the p-norm.
(∑i=1n(∣x1?x2∣p))1px1,x2∈Rb×n\begin{array}{c} \left(\sum_{i=1}^{n}\left(\left|x_{1}-x_{2}\right|^{p}\right)\right)^{\frac{1}{p}} \\ x_{1}, x_{2} \in \mathbb{R}^{b \times n} \end{array} (∑i=1n?(∣x1??x2?∣p))p1?x1?,x2?∈Rb×n?
小結
孿生神經網絡的直接用途就是衡量兩個輸入之間的差異/相似程度。
孿生神經網絡的用途:
- 詞匯語義相似度分析
- 問答機制中 question 和 answer的匹配
- 手寫體識別
- 問題匹配
- Kaggle上Quora的Question Pair比賽,即判斷兩個提問是否為同一個問題
改進的Siamese網絡 (2-channel networks)
Siamese 網絡(2-branches networks)的大體思路:
paper所提出的算法(2-channel networks) 的大體思路:
這樣,跳過了分支的顯式的特征提取過程,而是直接學習相似度評價函數。最后一層直接是全連接層,輸出神經元個數直接為1,直接表示兩張圖片的相似度。當然CNN,如果輸入的是雙通道圖片,也就是相當于網絡的輸入的是2個feature map,經過第一層的卷積后網,兩張圖片的像素就進行了相關的加權組合并映射,這也就是說,用2-channel的方法,經過了第一次的卷積后,兩張輸入圖片就不分你我了。而Siamese網絡是到了最后全連接的時候,兩張圖片的相關神經元才聯系在一起。
偽孿生網絡 (Pseudo-Siamese Network)
“偽”字含義:
對于偽孿生網絡來說,兩邊可以是不同的神經網絡(例如,一個是LSTM,另一個是CNN),并且如果兩邊是相同的神經網絡,是不共享參數的
偽孿生神經網絡結構
偽孿生圣經網絡結構如下圖所示:
可以解決的問題?
- 孿生網絡適用于處理兩個輸入比較類似的情況
- 偽孿生網絡設用于處理啷個輸入有一定差別的情況
例如,計算兩個句子或者詞匯的語義相似度,使用Siamese Network比較合適;驗證標題與正文的描述是否一致(標題和正文長度差別很大),或者文字是否描述了一幅圖片(一個是圖片,一個是文字)就應該使用Pseudo-Siamese Network
三胞胎網絡(Triplet Network)
論文:《Deep metric learning using Triplet network》
三個輸入:一個正例+兩個負例 或者 兩個正例+一個負例
訓練的目的是讓相同類別間的距離盡可能的小,讓不同類別間的距離盡可能的大。
訓練效果:Triplet在cifar, mnist的數據集上,效果都是很不錯的,超過了siamese network。
三胞胎網絡結構
輸入:x?x^{-}x?與xxx是負樣本,x+x^{+}x+與xxx是相似正樣本。
三胞胎網絡的損失函數
損失函數定義如下:
L=max?(d(a,p)?d(a,n)+margin?,0)\mathcal{L}=\max (d(a, p)-d(a, n)+\operatorname{margin}, 0) L=max(d(a,p)?d(a,n)+margin,0)
- aaa 表示anchor圖像
- ppp 表示positive圖像
- nnn 表示negative圖像
我們希望 aaa 與 ppp 的距離應該小于 aaa 與 nnn 的距離。marginmarginmargin 是個超參數,它表示 d(a,p)d(a,p)d(a,p) 與 d(a,n)d(a,n)d(a,n) 之間應該相差多少,例如,假設 margin=0margin=0margin=0,并且 d(a,p)=0.5d(a,p)=0.5d(a,p)=0.5 ,那么d(a,n)d(a,n)d(a,n) 應該大于等于0.70.70.7
Appendix:Andrew NG 三重損失函數
-
代價函數是訓練集的所有個體的三重損失的和:
Cost?function:?J=∑i=1nL(A(i),P(i),N(i))\text { Cost function: } J=\sum_{i=1}^{n} L\left(A^{(i)}, P^{(i)}, N^{(i)}\right) ?Cost?function:?J=i=1∑n?L(A(i),P(i),N(i)) -
三重損失函數:
L(A,P,N)=max?(∥f(A)?f(P)∥2?∥f(A)?f(N)∥2+α,0)L(A, P, N)=\max \left(\|f(A)-f(P)\|^{2}-\|f(A)-f(N)\|^{2}+\alpha, 0\right) L(A,P,N)=max(∥f(A)?f(P)∥2?∥f(A)?f(N)∥2+α,0) -
解釋:
這里的最大化處理意味著只要 d(A,P)—d(A,N)+αd(A, P)—d(A, N)+ αd(A,P)—d(A,N)+α 小于等于 000,那么 lossL(A,P,N)loss L(A, P, N)lossL(A,P,N) 就會是 000,但是一旦它大于 000,那么損失值就是正的,這個函數就會將它最小化成 000 或者小于 000。
這里的問題是,模型可能學習給不同的圖片做出相同的編碼,這意味著距離會成為 000,不幸的是,這仍然滿足三重損失函數。因為這個原因,我們加入了邊際ααα(一個超參數)來避免這種情況的發生。讓 d(A,P)d(A,P)d(A,P) 與 d(N,P)d(N,P)d(N,P) 之間總存在一個差距。
-
為了比較圖片 x(1)x(1)x(1) 和 x(2)x(2)x(2) ,我們計算了編碼 結果 f(x1)f(x_{1})f(x1?) 和 f(x2)f(x_{2})f(x2?) 之間的距離。
d(x(1),x(2))=∥f(x(1))?f(x(2))∥22d\left(x^{(1)}, x^{(2)}\right)=\left\|f\left(x^{(1)}\right)-f\left(x^{(2)}\right)\right\|_{2}^{2} d(x(1),x(2))=∥∥∥?f(x(1))?f(x(2))∥∥∥?22?
上式是 x1x_{1}x1? 和 x2x_{2}x2? 的編碼距離。如果它比某個閾值(一個超參數)小,則意味著兩張圖片是同一個人,否則,兩張圖片中不是同一個人。
-
適用于任何兩張圖片【存在正負樣本】
If x(i),x(j)x^{(i)}, x^{(j)}x(i),x(j) are the same person, ∥f(x(i))?f(x(j))∥2\left\|f\left(x^{(i)}\right)-f\left(x^{(j)}\right)\right\|^{2}∥∥?f(x(i))?f(x(j))∥∥?2 is small.
If x(i),x(j)x^{(i)}, x^{(j)}x(i),x(j) are different persons, ∥f(x(i))?f(x(j))∥2\left\|f\left(x^{(i)}\right)-f\left(x^{(j)}\right)\right\|^{2}∥∥?f(x(i))?f(x(j))∥∥?2 is large.
-
應用:
- Image ranking
- face verification
- metric learning
參考資料:
總結
- 上一篇: Excel——多个Sheet页合并成一个
- 下一篇: 【图像标注】使用vue3实现图像标注功能