SiameseFC
- Siamese网络(孪生神经网络)
- 本文参考文章:
- Siamese背景
- Siamese网络解决的问题
- 要解决什么问题?
- 用了什么方法解决?
- 应用的场景:
- Siamese的创新
- Siamese的理论
- Siamese的损失函数——Contrastive Loss
- 损失函数的选择
- 论文中Contrastive Loss
- 目前的Contrastive Loss:
- Siamese的思考
- Siamese的思想总结
- Siamese network是双胞胎连体,整一个三胞胎连体行不行?
Siamese网络(孪生神经网络)
本文参考文章:
精读深度学习论文(25) Siamese Network
详解Siamese网络
孪生神经网络(Siamese Network)详解
孪生神经网络(Siamese neural network)
Siamese network 孪生神经网络–一个简单神奇的结构
Siamese背景
Siamese和Chinese有点像。Siam是古时候泰国的称呼,中文译作暹罗。Siamese也就是“暹罗”人或“泰国”人。Siamese在英语中是“孪生”、“连体”的意思,这是为什么呢?
十九世纪泰国出生了一对连体婴儿,当时的医学技术无法使两人分离出来,于是两人顽强地生活了一生,1829年被英国商人发现,进入马戏团,在全世界各地表演,1839年他们访问美国北卡罗莱那州后来成为“玲玲马戏团” 的台柱,最后成为美国公民。1843年4月13日跟英国一对姐妹结婚,恩生了10个小孩,昌生了12个,姐妹吵架时,兄弟就要轮流到每个老婆家住三天。1874年恩因肺病去世,另一位不久也去世,两人均于63岁离开人间。两人的肝至今仍保存在费城的马特博物馆内。从此之后“暹罗双胞胎”(Siamesetwins)就成了连体人的代名词,也因为这对双胞胎让全世界都重视到这项特殊疾病。
简单来说,Siamese network就是“连体的神经网络”
Siamese网络解决的问题
要解决什么问题?
第一类,分类数量较少,每一类的数据量较多,比如ImageNet、VOC等。这种分类问题可以使用神经网络或者SVM解决,只要事先知道了所有的类。
第二类,分类数量较多(或者说无法确认具体数量),每一类的数据量较少,比如人脸识别、人脸验证任务。
用了什么方法解决?
解决以上两个问题,本文提出了以下解决方法:
-
提出了一种思路:将输入映射为一个特征向量,使用两个向量之间的“距离”(L1 Norm)来表示输入之间的差异(图像语义上的差距)。
-
基于上述思路设计了Siamese Network。每次需要输入两个样本作为一个样本对计算损失函数。
1)用的softmax只需要输入一个样本。
2)FaceNet中的Triplet Loss需要输入三个样本。 -
提出了Contrastive Loss用于训练。
应用的场景:
孪生神经网络用于处理两个输入"比较类似"的情况。伪孪生神经网络适用于处理两个输入"有一定差别"的情况。比如,我们要计算两个句子或者词汇的语义相似度,使用siamese network比较适合;如果验证标题与正文的描述是否一致(标题和正文长度差别很大),或者文字是否描述了一幅图片(一个是图片,一个是文字),就应该使用pseudo-siamese network。也就是说,要根据具体的应用,判断应该使用哪一种结构,哪一种Loss。
Siamese的创新
这个网络主要的优点是淡化了标签,使得网络具有很好的扩展性,可以对那些没有训练过的类别进行分类,这点是优于很多算法的。而且这个算法对一些小数据量的数据集也适用,变相的增加了整个数据集的大小,使得数据量相对较小的数据集也能用深度网络训练出不错的效果。
Siamese的理论
不同输入X_1, X_2通过统一G_W得到两个向量G_W(X_1), G_W(X_2),计算两个向量之间的L1距离获得E_W。
其中,两个network是两个共享权值的网络,实际上就是两个完全相同的网络。孪生神经网络有两个输入(X1 and X2),将两个输入feed进入两个神经网络(Network1 and Network2),这两个神经网络分别将输入映射到新的空间,形成输入在新的空间中的表示。通过Loss的计算,评价两个输入的相似度。
如果左右两边不共享权值,而是两个不同的神经网络,叫做pseudo-siamese network,伪孪生神经网络。对于pseudo-siamese network,两边可以是不同的神经网络(如一个是lstm,一个是cnn),也可以是相同类型的神经网络。
Siamese的损失函数——Contrastive Loss
损失函数的选择
Softmax当然是一种好的选择,但不一定是最优选择,即使是在分类问题中。传统的siamese network使用Contrastive Loss。损失函数还有更多的选择,siamese network的初衷是计算两个输入的相似度,。左右两个神经网络分别将输入转换成一个"向量",在新的空间中,通过判断cosine距离就能得到相似度了。Cosine是一个选择,exp function也是一种选择,欧式距离什么的都可以,训练的目标是让两个相似的输入距离尽可能的小,两个不同类别的输入距离尽可能的大。
论文中Contrastive Loss
论文中的损失函数定义如下:
Y代表X_1, X_2是否属于同一类别。输入同一类别为0,不属于同一类别为1。
P代表输入数据数量。
i表示当前输入数据下标。
L_G代表两个输入数据属于同一类别时的损失函数(G,genuine)。
L_I代表两个输入数据不属于同一类别的损失函数(I,imposter)。
根据我们对两个向量间举例的定义,可以得到以下条件:
即不同类别向量间的距离比相同类别向量间距离大。
两个向量之间距离越小,属于同一类别的可能性就越大。
目前的Contrastive Loss:
其中:
代表两个样本特征X1和X2 的欧氏距离(二范数)P 表示样本的特征维数,Y 为两个样本是否匹配的标签,Y=1 代表两个样本相似或者匹配,Y=0 则代表不匹配,m 为设定的阈值,N 为样本个数。
观察上述的contrastive loss的表达式可以发现,这种损失函数可以很好的表达成对样本的匹配程度,也能够很好用于训练提取特征的模型。
当 Y=1(即样本相似时),损失函数只剩下
即当样本不相似时,其特征空间的欧式距离反而小的话,损失值会变大,这也正好符号我们的要求。
当 Y=0 (即样本不相似时),损失函数为
即当样本不相似时,其特征空间的欧式距离反而小的话,损失值会变大,这也正好符号我们的要求。
注意:
这里设置了一个阈值margin,表示我们只考虑不相似特征欧式距离在0~margin之间的,当距离超过margin的,则把其loss看做为0(即不相似的特征离的很远,其loss应该是很低的;而对于相似的特征反而离的很远,我们就需要增加其loss,从而不断更新成对样本的匹配程度)
Siamese的思考
Siamese的思想总结
其实讲了这么多,主要思想就是三点:
- 输入不再是单个样本,而是一对样本,不再给单个的样本确切的标签,而且给定一对样本是否来自同一个类的标签,是就是0,不是就是1
- 设计了两个一模一样的网络,网络共享权值W,对输出进行了距离度量,可以说l1、l2等。
- 针对输入的样本对是否来自同一个类别设计了损失函数,损失函数形式有点类似交叉熵损失:
最后使用获得的损失函数,使用梯度反传去更新两个网络共享的权值W。
Siamese network是双胞胎连体,整一个三胞胎连体行不行?
不好意思,已经有人整过了,叫Triplet network,论文是《Deep metric learning using Triplet network》,输入是三个,一个正例+两个负例,或者一个负例+两个正例,训练的目标是让相同类别间的距离尽可能的小,让不同类别间的距离尽可能的大。Triplet在cifar, mnist的数据集上,效果都是很不错的,超过了siamese network。四胞胎,五胞胎会不会更屌?。。。。。目前还没见过。。。