孪生神经网络

孪生神经网络(Siamese network)主要用途是比较两图片的相似程度,其核心思想就是权值共享

卷积神将网络是通过卷积运算提取图像的特征进行训练的,如果想比较两个图像的相似程度,也要对两个图像分别进行特征提取,只判断特征的相似度就可以了。然而不同的卷积核运算后得到的特征很有可能不在一个域中,所以要使用同一个网络进行特征提取。

孪生神经网络-LMLPHP

孪生神经网络的优点:对于类别不平衡问题鲁棒性更强,更易于做集成学习,可以从语义相似性上学习来估测两个输入的距离。

孪生神经网络的缺点,由于有两个输入,两个子网,其训练相对于常规网络运算量更大,需要的时间更长。输出的结果是两个类间的距离而不是概率

训练过程

训练集

孪生神经网络不需要每一类都有很多图片,其训练集叫做support set,数据集的类别可以很多,每个类别只需几张图片即可。

孪生神经网络-LMLPHP

首先选择一个神经网络f,对输入图像进行特征提取,提取结果为h1和h2,z表示两个向量之间的区别,再加上全连接层处理z向量,最后用sigmoid函数输出为一个标量(如果两个图片是同一类,则输出应该接近1,如果不是同一类则应该接近0)。

孪生神经网络-LMLPHP

损失函数

`Triplet Loss

Triplet Loss三元组损失函数,其应用见谷歌2015年发表在CVPR上的做人脸验证的论文facenet。该损失函数定义一个三元组作为输入,分别是 ( X a n c h o r , X p o s i t i v e , X n e g a t i v e ) (X_{anchor},X_{positive},X_{negative}) (Xanchor,Xpositive,Xnegative)
这三个输入的通过如下方式构成,先从训练数据集中随机选一个样本作为Anchor,再随机选取一个和Anchor属于同一类的样本作为正样本 X p o s i t i v e X_{positive} Xpositive,和一个不同类的样本作为负样本 X n e g a t i v e X_{negative} Xnegative ,通过这种方式定义一个输入的三元组 X a n c h o r , X p o s i t i v e , X n e g a t i v e X_{anchor},X_{positive},X_{negative} Xanchor,Xpositive,Xnegative,将其输入到网络可以得到对应的特征向量 [ f ( X a n c h o r ) , f ( X p o s i t i v e ) , f ( X n e g a t i v e ) ] [f(X_{anchor}),f(X_{positive}),f(X_{negative})] [f(Xanchor),f(Xpositive),f(Xnegative)]

Triplet Loss的目的是通过训练,使得同种类别的距离更近,不通类别的距离更大,即拉近anchor与positive;推远anchor和negative。

通过这种相似度比较式的学习,模型不仅与同类别更像,还学会了与不同类别增大区分度的信息。通常定义一个 α \alpha α,使得Anchor距离Negative的距离比距离Positive大 α \alpha α, 公式化表示为:

∣ f ( X a n c h o r ) − f ( X n e g a t i v e ) ∣ ∣ − ∣ ∣ f ( X a n c h o r ) − f ( X p o s i t i v e ) ∣ ∣ > α |f(X_{anchor}) - f(X_{negative})|| - ||f(X_{anchor}) - f(X_{positive})|| \gt \alpha f(Xanchor)f(Xnegative)f(Xanchor)f(Xpositive)>α

定义为:

L ( X a n c h o r , X p o s i t i v e , X n e g a t i v e ) = m a x ( ∣ ∣ f ( X a n c h o r ) − f ( X p o s i t i v e ) ∣ ∣ − ∣ ∣ f ( X a n c h o r ) − f ( X n e g a t i v e ) ∣ ∣ + α , 0 ) L(X_{anchor}, X_{positive}, X_{negative}) = max(||f(X_{anchor}) - f(X_{positive})|| - ||f(X_{anchor}) - f(X_{negative})|| + \alpha, 0) L(Xanchor,Xpositive,Xnegative)=max(f(Xanchor)f(Xpositive)f(Xanchor)f(Xnegative)+α,0)

Contrastive Loss

Contrastive Loss的输入是一对样本,基于相似的一对对象特征距离应该更小,不相似的一对对象特征距离应该较大来计算。从数据中选一对样本 ( X a , X b ) (X_a, X_b) (Xa,Xb),这两个样本的欧式距离表示为$d=||X_a-X_b||_2=\sqrt{({X_a-X_b})^2}d=∣∣X $

则Contrastive Loss可表示为:
L ( X a , X b ) = ( 1 − Y ) 1 2 d 2 + Y 1 2 { m a x ( 0 , m − d ) } 2 L(X_a,X_b) = (1-Y)\frac{1}{2}d^2 + Y\frac{1}{2}\{max(0, m-d)\}^2 L(Xa,Xb)=(1Y)21d2+Y21{max(0,md)}2

Y表示 X a , X b ) X_a,X_b) Xa,Xb)是否匹配,匹配为1不匹配为0

m是设置的安全距离,当 ( X a , X b ) (X_a, X_b) (Xa,Xb)的距离小于m 时,Contrasive Loss将变成0,这使得 X a X_a Xa

X b X_b Xb 相似而不是相同,能保证算法的泛化能力

有了损失函数就可以通过反向传播进行参数更新了

12-05 07:17