在看Hand Pose Estimation(5)那篇论文的时候,了解到Siamese Network,觉得是一个很值得学习的网络,所以这里单独写一篇文章,总结一下相关知识。
Background
首先关于Siamese这个名字,我最开始以为是暹罗,翻译里面只有这个意思,之后谷歌才发现原来泰国有一个很著名的双胞胎,最后这个词也代指双胞胎了,而这里可以翻译成孪生神经网络,或者说连体的神经网络。而这里的连体就是指共享权值,如下图:
这里的共享权值就是指左右两个神经网络的权值一致,在实际训练的时候,甚至都可以是同一个网络,不用是实现另一个(比如都是LSTM或CNN)。
另外也有变种,比如当不共享权值的时候,网络就变成伪孪生神经网络(Pseudo-Siamese Network)了,两边的网络可以不一样(一个LSTM,一个CNN)。
The Usage of Siamese Network
在最开始,孪生神经网络被用于衡量两个输入的相似程度,具体情况下,两个神经网络将输入映射到新的空间,通过计算新空间下生成的两个特征的距离,就可以得到Loss,就可以得到两个输入的相似度。具体可用来计算两个句子或者词汇的语义相似度(输入比较类似)。
The Usage of Pseudo-Siamese Network
相比孪生神经网路,伪孪生神经网络则用来处理两个输入”有一定差别”的情况,比如验证标题与正文的描述是否一致(标题和正文长度差别很大),或者文字是否描述了一幅图片(图片和文字差别也较大)。
Loss
计算距离的时候,有很多种选择,传统的使用Contrastive Loss,而实际情况下,Cosine、Exp Function、欧式距离什么的都可以,但各自的使用场景不太一致,比如Cosine更适用于词汇级别的语义相似度度量,而Exp Function更适用于句子级别、段落级别的文本相似性度量。
Extend of Siamese Network
也有用三连体网络的,输入是三个,一个正例+两个负例,或者一个负例+两个正例,训练的目标是让相同类别间的距离尽可能的小,让不同类别间的距离尽可能的大,其结果挺好的。