Siamese Network

Siamese Network
foresta.yangSiamese网络
问题背景
分类问题:
-
分类数量较少,每一类的数据量较多,比如ImageNet、VOC等。这种分类问题可以使用神经网络或者SVM解决,只要事先知道了所有的类。
-
分类数量较多(或者说无法确认具体数量),每一类的数据量较少,比如人脸识别、人脸验证任务。
解决方法:
- 提出一种思路:将输入映射为一个特征向量,使用两个向量之间的距离来表示输入之间的差异,如图像语义上的差异。
- Siamese网络,每次需要输入两个样本作为一个sample对计算损失函数。
- 提出Contrastive Loss用于训练。
应用场景
孪生神经网络用于处理两个输入"比较类似"的情况。伪孪生神经网络适用于处理两个输入"有一定差别"的情况。比如,我们要计算两个句子或者词汇的语义相似度,使用siamese network比较适合;如果验证标题与正文的描述是否一致(标题和正文长度差别很大),或者文字是否描述了一幅图片(一个是图片,一个是文字),就应该使用pseudo-siamese network。也就是说,要根据具体的应用,判断应该使用哪一种结构,哪一种Loss。
Siamese创新点
网络的创新点是淡化了标签,是的网络具有很好的扩展性,可以对那些没有训练过的类别进行分类,这一点优于很多算法。
该算法对一些小数据量的数据集也适用,变相地增加了整个数据集的大小,使得数据量相对较小的数据集也能用深度神经网络训练出不错的效果。
不同输入
其中,两个network是两个共享权值的网络,实际上就是两个完全相同的网络。孪生神经网络有两个输入
如果左右两边不共享权值,而是两个不同的神经网络,叫做
Siamese的损失函数
Contrastive Loss
损失函数的选择
Softmax当然是一种好的选择,但不一定是最优选择,即使是在分类问题中。传统的siamese network使用Contrastive Loss。损失函数还有更多的选择,siamese network的初衷是计算两个输入的相似度,。左右两个神经网络分别将输入转换成一个"向量",在新的空间中,通过判断cosine距离就能得到相似度了。exp function
也是一种选择,欧式距离什么的都可以,训练的目标是让两个相似的输入距离尽可能的小,两个不同类别的输入距离尽可能的大。
论文中Contrastive Loss
论文中的损失函数定义如下:
Y代表
P代表输入数据数量。
i表示当前输入数据下标。
根据我们对两个向量间举例的定义,可以得到以下条件:
即不同类别向量间的距离比相同类别向量间距离大。
两个向量之间距离越小,属于同一类别的可能性就越大。
目前的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的思想总结
其实讲了这么多,主要思想就是三点:
- 输入不再是单个样本,而是一对样本,不再给单个的样本确切的标签,而且给定一对样本是否来自同一个类的标签,是就是0,不是就是1
- 设计了两个一模一样的网络,网络共享权值W,对输出进行了距离度量,可以说l1、l2等。
- 针对输入的样本对是否来自同一个类别设计了损失函数,损失函数形式有点类似交叉熵损失:
最后使用获得的损失函数,使用反向传播梯度下降去更新两个网络共享的权值W。